AMSET基于 形变势理论 和 极化光学声子散射 的全自动 VASP 后处理工具,能够从第一性原理计算出发,直接给出材料在任意掺杂与温度下的:
电子/空穴迁移率
电导率
热导率
功率因子
散射率与弛豫时间
在终端输入 amset plot -h,你会看到以下六个子命令,
band 插值能带图 高密度 k 点的能带结构
convergence 收敛性测试图 输运性质随 k 点密度的变化
lineshape 能带 + 电子线形展宽 带有散射强度信息的“彩色”能带
mobility 迁移率细节分解 各散射机制对迁移率的贡献
rates 散射率/弛豫时间 散射率 vs 能量曲线
transport 综合输运性质 电导、Seebeck、功率因子等随温度/掺杂的变化
详细使用请查看
AMSET计算材料形变势迁移率以及数据处理
对于rates和lineshapes,amset默认只选择一个doping和一个温度值,本文分享一个快速脚本,可以一次性绘制所有doping和所有温度下的rates和lineshapes的pdf并自动重命名分类。
rates绘制效果如下
图片
不同温度/掺杂浓度下 lineshapes
图片
快速绘制所有rates,请详细查看选项
#!/bin/bash
set -euo pipefail
# ======================== 默认参数 ========================
HDF5_FILE=""
PLOT_TYPES=("rate") # 默认画散射率
SEPARATE_RATES="" # 若需要分机制,可传 --separate-rates
EXTRA_ARGS="" # 其他 amset plot rates 参数
# ==========================================================
usage() {
cat </dev/null)
if [[ ${#mesh_files[@]} -eq 0 ]]; then
echo "错误: 当前目录未找到 mesh_*.h5 文件"
exit1
elif [[ ${#mesh_files[@]} -eq 1 ]]; then
HDF5_FILE="${mesh_files[0]}"
echo "自动选择文件: $HDF5_FILE"
else
echo "发现多个 mesh 文件:"
for i in "${!mesh_files[@]}"; do
printf"%d) %s\n""$((i+1))""${mesh_files[$i]}"
done
read -rp "请选择编号 (1-${#mesh_files[@]}): " choice
if [[ ! "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#mesh_files[@]} )); then
echo "无效选择"
exit1
fi
HDF5_FILE="${mesh_files[$((choice-1))]}"
echo "已选择: $HDF5_FILE"
fi
fi
# ---------- 读取 doping 和 temperatures 数量 ----------
DOPING_LINE=$(grep -E "^doping:" settings.yaml)
TEMP_LINE=$(grep -E "^temperatures:" settings.yaml)
count_elements() {
# 统计方括号内逗号个数 + 1
local line="$1"
local count
count=$(echo "$line" | grep -o ',' | wc -l)
echo $(( count + 1 ))
}
N_DOP=$(count_elements "$DOPING_LINE")
N_TEMP=$(count_elements "$TEMP_LINE")
echo "-------------------------------------------"
echo "HDF5 文件 : $HDF5_FILE"
echo "绘图类型 : ${PLOT_TYPES[*]}"
echo "掺杂浓度个数 : $N_DOP"
echo "温度个数 : $N_TEMP"
echo "额外参数 : $EXTRA_ARGS"
echo "-------------------------------------------"
# ---------- 主循环 ----------
for ptype in "${PLOT_TYPES[@]}"; do
echo ">>> 绘图类型: $ptype"
for ((d=0; d/dev/null)
if [[ ${#mesh_files[@]} -eq 0 ]]; then
echo "错误: 当前目录未找到 mesh_*.h5 文件"
exit1
elif [[ ${#mesh_files[@]} -eq 1 ]]; then
HDF5_FILE="${mesh_files[0]}"
echo "自动选择文件: $HDF5_FILE"
else
echo "发现多个 mesh 文件:"
for i in "${!mesh_files[@]}"; do
printf"%d) %s\n""$((i+1))""${mesh_files[$i]}"
done
read -rp "请选择编号 (1-${#mesh_files[@]}): " choice
if [[ ! "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#mesh_files[@]} )); then
echo "无效选择"
exit1
fi
HDF5_FILE="${mesh_files[$((choice-1))]}"
echo "已选择: $HDF5_FILE"
fi
fi
# ---------- 读取 doping 和 temperature 数量 ----------
if [[ ! -f settings.yaml ]]; then
echo "错误: 未找到 settings.yaml"
exit1
fi
DOPING_LINE=$(grep -E "^doping:" settings.yaml)
TEMP_LINE=$(grep -E "^temperatures:" settings.yaml)
count_elements() {
local line="$1"
local count
count=$(echo "$line" | tr -cd ',' | wc -c)
echo $(( count + 1 ))
}
N_DOP=$(count_elements "$DOPING_LINE")
N_TEMP=$(count_elements "$TEMP_LINE")
echo "-------------------------------------------"
echo "HDF5 文件 : $HDF5_FILE"
echo "掺杂浓度个数 : $N_DOP"
echo "温度个数 : $N_TEMP"
echo "额外参数 : $EXTRA_ARGS"
echo "-------------------------------------------"
# ---------- 新增函数:提取列表中的数值 ----------
parse_list() {
# 输入: 一行如 "doping: [-3.00e+13, -1.99e+14, ...]"
# 输出: 以空格分隔的数值字符串
echo "$1" | sed 's/.*\[//;s/\].*//;s/,/ /g'
}
# ---------- 读取 doping 和 temperature 数量及数值 ----------
DOPING_LINE=$(grep -E "^doping:" settings.yaml)
TEMP_LINE=$(grep -E "^temperatures:" settings.yaml)
N_DOP=$(count_elements "$DOPING_LINE")
N_TEMP=$(count_elements "$TEMP_LINE")
# 提取数值列表为数组
DOPING_VALS_STR=$(parse_list "$DOPING_LINE")
TEMP_VALS_STR=$(parse_list "$TEMP_LINE")
read -ra DOPING_VALS <<< "$DOPING_VALS_STR"
read -ra TEMP_VALS <<< "$TEMP_VALS_STR"
# 主循环
for ((d=0; d -3.00e13),不影响阅读
doping_str_clean="${doping_str//+/}"
output="lineshape_n_${doping_str_clean}_T_${temp_str}.pdf"
if [[ -f lineshape.pdf ]]; then
mv lineshape.pdf "$output"
echo " -> 保存为 $output"
else
echo " !Warning: lineshape.pdf 未生成"
fi
done
done
echo "全部完成。