pymatgen专题

pymatgen:光学谱的插值、归一化与展宽

对实际Si介电虚部使用通用激发谱对象,区分原始幅度、峰值归一化和离散求和归一化。

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

已有能量–强度数据后,经常还需要插值、归一化和展宽。本例复用鸢算科技集群实际Si DFT介电函数,将三方向平均ε₂作为光学谱形,实际调用ExcitationSpectrum。

这个类是通用谱数据容器,不会自动计算激发态,也不会把光学介电数据变成X射线吸收谱。能量/强度的物理含义由输入决定。

下载实际输入、完整数据、分析与绘图脚本。

unzip pymatgen-spectra-tools-wave719-*.zip
cd pymatgen-spectra-tools
module load pymatgen/2026.9.24
bash results.sh
bash plot.sh

环境为pymatgen2026.9.24、Python3.11、NumPy/SciPy和Matplotlib。run.sh重新后处理到新建的analysis,不会运行DFT或FEFF;参考数据在reference-data,绘图输出到figures。已有分析目录时,保留它并在另一份解压目录操作。

实际Si平均介电虚部的展宽及两种明确区分的归一化

1. 查看原始光学数据#

head -n 5 inputs/Si-optical.csv

这是实际介电光学教程的结果,第一列光子能量eV,第三列为三方向平均ε₂。ε₂无量纲;这里没有将其误写成吸收系数或振子强度。

2. 建立均匀网格谱对象#

python - <<'PY'
import numpy as np
from pymatgen.analysis.excitation import ExcitationSpectrum
data = np.genfromtxt('inputs/Si-optical.csv', delimiter=',', names=True)
source_x = data[data.dtype.names[0]]
source_y = data[data.dtype.names[2]]
x = np.linspace(source_x[0], source_x[-1], len(source_x))
y = np.interp(x, source_x, source_y)
spectrum = ExcitationSpectrum(x, y)
print('2 eV处插值:', spectrum.get_interpolated_value(2.0))
broadened = ExcitationSpectrum(x, y)
broadened.smear(sigma=0.15)
np.savetxt('my-excitation.csv', np.column_stack([x, y, broadened.y]),
    delimiter=',', header='energy_eV,epsilon2,Gaussian_sigma_0p15eV', comments='')
PY

先插值到明确的均匀网格再展宽;这里σ=0.15eV是人为选定的显示展宽,不是新算的材料寿命。原始曲线和展宽曲线都保留。

3. 两种归一化代表什么#

python - <<'PY'
import numpy as np
from pymatgen.analysis.excitation import ExcitationSpectrum
d = np.genfromtxt('reference-data/Si-epsilon2-excitation-spectrum.csv',
                  delimiter=',', names=True)
x, y = d[d.dtype.names[0]], d[d.dtype.names[1]]
peak = ExcitationSpectrum(x, y)
peak.normalize(mode='max')
summed = ExcitationSpectrum(x, y)
summed.normalize(mode='sum')
print('峰值:', peak.y.max())
print('离散求和:', summed.y.sum())
print('梯形积分:', np.trapezoid(summed.y, summed.x))
PY

max使最大强度为1,便于比较谱形;sum使离散数组之和为1,并不保证对eV坐标积分后面积为1。对均匀网格,离散求和与面积相差网格步长;对非均匀网格则更不能混用。

归一化后曲线只用于相应比较,原始ε₂的绝对幅度含义应从未归一化列读取。本例检查了原生高斯展宽前后离散求和保持一致。

4. 保存结果和换自己的谱#

cat reference-data/Si-epsilon2-excitation-spectrum.csv | head -n 8
bash plot.sh

输入自己的数据时,先保证能量严格递增、单位一致、没有重复点或未处理的NaN,明确强度含义,再选择适用的插值和展宽。不同原始能量网格的谱不能只按数组行号直接相加。

接口见pymatgen激发谱容器。需要XANES/EXAFS拼接则见XAS操作实例。

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

查看配图

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

100%查看原图 ↗