pymatgen专题

pymatgen:吸收谱到SLME模型效率

用实际Si光学数据运行SLME,明确吸收系数单位、膜厚、温度、跃迁阈值和百分数输出。

更新于 2026-11-12约 6 分钟阅读按任务与环境选择适用配置
阅读本篇目录

已有光学吸收谱后,可以用SLME模型练习从光谱到理想化太阳能转换效率的流程。本例复用鸢算科技集群实际Si₈的VASP6.6.1光学数据和WAVEDER,运行pymatgen原生slme。

本例展示模型操作与参数影响,不是Si器件效率预测。PBE带隙、有限k网格、光谱展宽以及“允许跃迁”输入的选择,都限制了数值的材料解释。

下载实际吸收谱、参数、8组结果、6组阈值比较与绘图脚本。POTCAR和WAVEDER不随包。

unzip pymatgen-solar-SLME-wave726-*.zip
cd pymatgen-solar-SLME
module load pymatgen/2026.9.24
bash results.sh
bash plot.sh

后处理环境为pymatgen2026.9.24、Python3.11、NumPy/SciPy和Matplotlib。run.sh对已有吸收数据重新运行8组SLME数学模型,生成analysis,不会启动DFT;参考图输出到figures。

实际Si光学输入、SLME厚度温度比较、I-V模型与跃迁阈值敏感性

1. 三个输入量先分清#

输入 本例含义 单位
光子能量 实际介电函数的能量网格 eV
吸收系数α 由实际介电函数转换 cm⁻¹,或明确换成m⁻¹
膜厚L SLME模型参数 m

吸收系数α不是无量纲吸收率。原生模型采用A(E)=1−exp[−2α(E)L],系数2对应其双程光程假定,不是新建真实多层器件的光学模拟。

head -n 6 reference-data/Si-actual-absorption.csv
cat inputs/solar-settings.json

读取自己的VASP光学结果时,可这样生成吸收系数:

python - <<'PY'
import numpy as np
from pymatgen.io.vasp.outputs import Vasprun
from pymatgen.analysis.solar.slme import absorption_coefficient
v = Vasprun('vasprun.xml',parse_projected_eigen=False,parse_potcar_file=False)
energy, alpha_cm = absorption_coefficient(v.dielectric)
np.savetxt('absorption.csv',np.column_stack([energy,alpha_cm]),
    delimiter=',',header='energy_eV,absorption_cm_inverse',comments='')
PY

这个辅助函数返回cm⁻¹;而slme默认按m⁻¹接收。因此要么显式设absorbance_in_inverse_centimeters=True,要么先把α乘100再用默认单位。本例实际核对了两种方式相同。

2. 直接带隙不一定是光学允许跃迁起点#

实际Si₈这套采样得到基本间隙0.6177eV、最小同k能量间隙0.7408eV。两者可用原生辅助函数读取:

python - <<'PY'
from pymatgen.analysis.solar.slme import get_dir_indir_gap
direct, indirect = get_dir_indir_gap('vasprun.xml')
print('同k能量间隙:',direct,'基本采样间隙:',indirect)
PY

Si₈常规胞还涉及能带折叠;仅有能量差,并没有证明相应跃迁有足够光学强度。

本例另外读取同一计算的WAVEDER,对占据–空带的三方向矩阵元平方和做操作性强度筛选。取阈值0.01Ų时,首个超过阈值的跃迁为2.5452eV,并把它作为本次SLME输入的示例代理值。

这一强度阈值不是普适、严格的允许/禁戒判据。 本例保留不同阈值的结果,用来说明参数选择会影响结论,不能只挑效率较高的一列。

矩阵元平方和阈值/Ų 首个满足条件的跃迁/eV 1μm、300K模型效率/%
10⁻⁶ 0.7408 14.358868
10⁻⁴ 0.7456 14.312545
10⁻³ 2.5452 1.113366
10⁻² 2.5452 1.113366
10⁻¹ 2.5452 1.113366

不同输入带来的巨大变化,是本例必须保留的使用边界。真实材料应结合跃迁矩阵、对称性、光谱质量及合适的能带方法,确定有物理依据的参数。

3. 运行单组SLME#

python - <<'PY'
import numpy as np
from pymatgen.analysis.solar.slme import slme
d = np.genfromtxt('reference-data/Si-actual-absorption.csv',
                  delimiter=',',names=True)
efficiency = slme(d['energy_eV'],d['absorption_cm_inverse'],
    material_direct_allowed_gap=2.5452,
    material_indirect_gap=0.6177,
    thickness=1e-6, temperature=300,
    absorbance_in_inverse_centimeters=True)
print('模型效率/%:',efficiency)
PY

本地函数返回值已经是百分数,约1.113366,不要再次乘100。thickness=1e-6是1μm,temperature单位K。

模型默认切除指定直接允许间隙以下的吸收,以处理光谱展宽尾部;这个开关和所用阈值应与结果一起记录。库使用附带的AM1.5G谱,不是实时太阳辐照条件。

4. 扫描厚度和温度#

bash run.sh
cat analysis/SLME-results.csv
cat reference-data/Si-SLME-thickness-temperature.csv
温度/K 厚度/μm 本例原生SLME/%
300 0.1 1.112317
300 1 1.113366
300 10 1.113366
300 50 1.113366
350 0.1 0.768917
350 1 0.768250

这里保持同一套光学输入,只改变SLME模型的厚度/工作温度参数,没有重新计算材料在350K的能带、声子或吸收谱。曲线饱和只是这套固定输入与模型的结果。

5. I-V曲线和电流单位#

模型使用J(V)=Jsc−J₀[exp(eV/kBT)−1]。本例独立重建理想二极管曲线并求连续最大功率点,再与原生1mV电压步长的最大效率核对。

1μm、300K时,Jsc约56.9177A/m²,即5.69177mA/cm²,Voc约0.27707V。A/m²换成mA/cm²要乘0.1;W/m²换成mW/cm²同样乘0.1。不要只改图上单位名。

head -n 8 reference-data/Si-SLME-current-voltage.csv
cat reference-data/Si-SLME-transition-thresholds.csv

图中I-V与功率轴已分别换算单位。SLME不是含串联/并联电阻、界面复合、接触和实际器件结构的完整电池模型。

6. 换自己的材料#

先准备同一方法和结构的光谱、基本间隙及有依据的光学跃迁参数,确认α单位,再设膜厚与温度。保留参数敏感性与适用范围,避免把PBE小体系的模型数值直接当作实验转换效率。

前置光学数据处理见介电光学实操,接口说明见pymatgen官方太阳能模块。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗