pymatgen专题

pymatgen:实验热化学数据与单位

把有来源的NaCl/MgO标准生成焓、熵保存为ThermoData和ExpEntry,区分单位、相态和温度标签。

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

pymatgen的ThermoData保存实验热化学数据,ExpEntry可从生成焓条目建立能量型对象。这些接口不会替用户查证数据、自动换单位或计算任意温度下的焓。

本例在鸢算科技集群实际运行数据整理与转换;输入取自NIST Chemistry WebBook的已发表参考值,不是本次新算的DFT能量。

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

unzip pymatgen-piezo-thermodata-wave722-*.zip
cd pymatgen-piezo-thermodata
module load pymatgen/2026.9.24
bash results.sh
bash plot.sh

后处理环境为pymatgen2026.9.24、Python3.11、NumPy/SciPy与Matplotlib。run.sh在新建的analysis重新读取已有数据,不提交DFT;原数据在reference-data,绘图输出到figures。

NaCl/MgO的参考生成焓单位转换与独立保留的摩尔熵

1. 准备有来源、有相态的数据#

cat inputs/NIST-reference-thermodata.json
固体,298.15K 标准生成焓/kJ·mol⁻¹ 标准摩尔熵/J·mol⁻¹·K⁻¹ 选用来源
NaCl −411.12 72.11 Chase1998,NIST收录
MgO −601.60±0.30 26.95±0.15 CODATA评审,NIST收录

NIST还列有不同评审或不同相态的数据,不能看到相同化学式就混为一个条目。本例明确选择表内来源;NaCl该条目未列不确定度,不把它伪造为0。

来源:NIST NaCl、NIST MgO。输入JSON保留链接、访问日期、相态、温度和单位。

2. 生成焓先换成eV/化学式#

与通常能量条目一起处理时,本例把生成焓换为eV/化学式,而不是把kJ/mol数字直接当成eV。1eV/化学式约为96.485332kJ/mol。

python - <<'PY'
from scipy import constants as C
from pymatgen.analysis.thermochemistry import ThermoData
from pymatgen.entries.exp_entries import ExpEntry
conversion = C.e*C.Avogadro/1000
data = ThermoData('fH','sodium chloride','solid','NaCl',
    -411.12/conversion,
    ref='NIST/Chase1998; converted from kJ/mol to eV/formula',
    temp_range=(298.15,298.15),uncertainty=None)
entry = ExpEntry('NaCl',[data],temperature=298.15)
print('生成焓/eV化学式:', entry.energy)
print('生成焓/eV每原子:', entry.energy_per_atom)
print('还原/kJ mol^-1:', entry.energy*conversion)
PY

NaCl一个化学式有2个原子,所以每原子值是每化学式值的一半。这里的entry.energy是选定实验生成焓的数值,并非包含离子/电子任意参考的VASP晶胞总能量。

3. 熵和不确定度各自保留#

python - <<'PY'
import json
from pymatgen.analysis.thermochemistry import ThermoData
with open('reference-data/Experimental-ThermoData-objects.json') as f:
    saved = json.load(f)
entropy = ThermoData.from_dict(saved['MgO']['entropy'])
enthalpy = ThermoData.from_dict(saved['MgO']['enthalpy'])
print('熵/J mol^-1 K^-1:', entropy.value,entropy.uncertainty)
print('生成焓/eV化学式:', enthalpy.value,enthalpy.uncertainty)
print(enthalpy.ref)
PY

ThermoData本身没有替每个数值强制指定单位,本例把单位写进字段说明和引用。MgO的焓不确定度也随同焓换算到eV/化学式;熵和其不确定度继续用J/mol/K。

4. 不能把temperature参数当温度修正#

ExpEntry当前实现从输入中选取适用类型的非气/液相生成焓数值;多个条目同时给入时,并不会替用户按文献可靠性加权。应先自行选定相态、温区、来源和单位,再建条目。

把temperature=298.15改成400,并不会自动积分热容得到400K的焓。 本例实际检查了这一对象行为,避免把元数据标签当作新的热力学计算。

若要算不同温度,应按适用温区使用热容/热化学模型,正确积分并保持参考态。形成自由能还需要相应反应的熵变;不能简单把化合物的绝对摩尔熵乘T,就当成生成自由能的全部熵项。

5. 查看整理结果#

cat reference-data/Experimental-ThermoData-entries.csv
bash run.sh

CSV同时保留原参考kJ/mol、转换后eV/化学式、eV/atom和独立熵字段。实验生成焓与未对齐参考的DFT总能不能直接混进同一凸包;相容的数据来源和修正规则必须另外确定。

气相分子热化学见RRHO与准RRHO,固体近似热力学见Debye热力学。接口见pymatgen热化学容器。

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

查看配图

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

100%查看原图 ↗