pymatgen:吸收谱到SLME模型效率
用实际Si光学数据运行SLME,明确吸收系数单位、膜厚、温度、跃迁阈值和百分数输出。
阅读本篇目录
已有光学吸收谱后,可以用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。

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官方太阳能模块。