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 "全部完成。