ASE 计算器加权、求和与平均
用Ar3实际输入和受力核对理解四种计算器组合,区分线性包装与分区耦合。
阅读本篇目录
本篇使用鸢算科技集群实际运行的ASE3.29.0小例子,全部为单线程CPU。Ar3用两套Lennard–Jones参数说明接口;Cu4用EMT经验势,不是DFT或GPU性能测试。
下载完整Python脚本、实际结构、数据与绘图包,在新目录:
unzip ase-calculator-wrappers-practical*.zip -d ase-example
cd ase-example
module load ase/3.29.0
bash run.sh
默认读取随附实算数值生成4图和analysis/RESULTS.json,不重算势能。要自己重算,在已分配的CPU资源中执行:
bash run.sh compute
cat work/RESULTS.json
输出包括自己的work/、27项数值核对和4图。脚本不会覆盖已有work;第二次重算请另解压一份。其他电脑已安装ASE3.29、NumPy与Matplotlib时,可用PYTHON=python3 bash run.sh。已有work需要重画时用bash run.sh analyze。
1. 同一体系上组合计算器#
ASE的计算器包装器能把多个计算器返回的同一性质按权重组合。这里所有计算器都看到同一份完整Ar3结构;这不会自动把体系划成QM区/MM区,也不会自动排除重复计算的相互作用。
3
非周期Ar3;坐标单位Å
Ar 0.0 0.0 0.0
Ar 4.1 0.0 0.0
Ar 2.0 3.3 0.2
两套参数故意不同,用来观察组合的数值。它们不是本教程新拟合的“更好氩势”。基本Python写法:
from ase import Atoms
from ase.calculators.lj import LennardJones
from ase.calculators.mixing import LinearCombinationCalculator
atoms = Atoms('Ar3', positions=[[0,0,0],[4.1,0,0],[2,3.3,.2]],
cell=[14,14,14], pbc=False)
a = LennardJones(epsilon=.0103, sigma=3.4, rc=10, ro=8, smooth=True)
b = LennardJones(epsilon=.0120, sigma=3.55, rc=10, ro=8, smooth=True)
atoms.calc = LinearCombinationCalculator([a,b], [.3,.7])
print(atoms.get_potential_energy())
print(atoms.get_forces())
epsilon单位eV,sigma/rc/ro单位Å;这里平滑区间从8到10Å,三原子间距均在其内侧。参数与截断属于势模型,不能只换一组权重就赋予真实混合材料含义。
2. 四种包装器怎么选#
from ase.calculators.mixing import (
MixedCalculator, SumCalculator, AverageCalculator)
def make_pair():
return [
LennardJones(epsilon=.0103, sigma=3.4, rc=10, ro=8, smooth=True),
LennardJones(epsilon=.0120, sigma=3.55, rc=10, ro=8, smooth=True)]
a, b = make_pair()
mixed = MixedCalculator(a, b, .3, .7)
summed = SumCalculator(make_pair())
averaged = AverageCalculator(make_pair())
| 类 | 本例组合规则 |
|---|---|
| LinearCombinationCalculator | 任意给定权重;本例0.3A+0.7B |
| MixedCalculator | 两个计算器和各自权重;本例同上 |
| SumCalculator | A+B,不自动除以2 |
| AverageCalculator | (A+B)/2 |
两端计算器须支持所请求的性质。例如一端不提供stress,不能据另一端有stress就期待包装器自动补出来。每个条件保持独立对象,避免混用状态与缓存。
3. 本例的实际结果#
| 项目 | 总能量 / eV |
|---|---|
| A | -0.029374655886 |
| B | -0.035066832552 |
| 0.3A+0.7B | -0.033359179552 |
| A+B | -0.064441488437 |
| (A+B)/2 | -0.032220744219 |

能量、每个原子的力分量都按同一权重组合。脚本还独立对9个坐标作±0.0001Å位移,用混合能量的中心差分核对负梯度;这一步能帮助发现能量和受力采用不同权重的错误。
4. 查看自己的数值#
python - <<'PYDATA'
import json
x=json.load(open('work/RESULTS.json'))['mixing']
for name,row in x['wrappers'].items():
print(name,row['energy_eV'])
PYDATA
用自己的模型时先说明组合的物理定义、是否重复计入相互作用和单位,再选择合适计算器。涉及真正QM/MM或差分学习时还需相应模型与训练/耦合流程,本页的线性包装器不是通用替代。