ASE 缓存、检查点与计算记录
区分属性请求和底层求值,用Cu4实际演示缓存失效、检查点复用和短优化日志。
阅读本篇目录
本篇使用鸢算科技集群实际运行的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计算器通常保留当前状态的结果。本例在自定义CountingEMT中对底层calculate()计数,而不是把用户每次调用get_potential_energy()都算成新计算。
from ase.calculators.emt import EMT
class CountingEMT(EMT):
def __init__(self):
super().__init__()
self.actual_calls = 0
def calculate(self, *args, **kwargs):
self.actual_calls += 1
return super().calculate(*args, **kwargs)
calc = CountingEMT()
atoms.calc = calc
print(atoms.get_potential_energy(), calc.actual_calls)
print(atoms.get_potential_energy(), calc.actual_calls)
atoms.positions[1,0] += .01
print(atoms.get_potential_energy(), calc.actual_calls)
这里atoms使用资料包畸变Cu4。实际底层累计调用为 1、1、2:同一状态的第二次请求复用缓存,移动原子后重新求值。不要只看终端打印两次相同能量就误认为两个独立计算。
2. CheckpointCalculator:相同流程的持久化复用#
from ase.calculators.checkpoint import CheckpointCalculator
# atoms为相同的畸变Cu4;数据库路径属于当前个人工作目录
inner = CountingEMT()
atoms.calc = CheckpointCalculator(inner, db='checkpoints.db')
e = atoms.get_potential_energy()
资料包先用新数据库执行一次,再在同一结构和相同属性查询顺序下创建新包装器读取。实际底层调用分别为 1和0,能量均为 0.001709084603 eV。

检查点是有顺序和状态前提的流程记录,不是可以随意更改模型后继续使用的万能缓存。改结构、计算参数、底层程序或查询顺序时,先确认记录仍匹配;最直接的做法是为新条件另建工作目录和数据库,不覆盖旧资料。下载包的参考资料不含数据库,重算时由你自己生成。
3. LoggingCalculator记录的是请求历史#
from ase.calculators.loggingcalc import LoggingCalculator
from ase.optimize import BFGS
atoms.calc = LoggingCalculator(EMT())
atoms.calc.set_label('cu4')
opt = BFGS(atoms, logfile='opt.log', trajectory='opt.traj')
opt.run(fmax=.02, steps=60)
atoms.calc.write_json('calculator-log.json')
本例同一畸变Cu4在固定晶胞下完成 4步 BFGS优化,能量从 0.001709084603 eV降到 −0.008910882084 eV,最大原子受力降至 0.014920061710 eV/Å。它是小流程参考,不是晶胞已充分弛豫的证明。
cat work/opt.log
cat work/calculator-log.json

日志包装器的能量/受力请求计数与真实底层计算次数并不总相同,特别是优化器请求free_energy、缓存复用或一次计算返回多个性质时。要统计实际求值成本,就像本例那样另计底层调用。
4. 轨迹中不一定保存了你想读的所有性质#
本例opt.traj五帧只保存了优化器实际请求的free_energy字段,没有每帧完整forces。坐标可以读取,但不能直接对这些帧调用普通能量/受力提取并假定字段存在。图中能量和fmax读取实际opt.log,保留日志的6位小数显示精度,并与完整起终点数值核对;没有为画图额外计算或补造数据。
如需完整性质轨迹,应在自己的生产流程中明确请求和保存所需能量/力。数据库与格式操作继续看ASE数据管理;来源:ASE Checkpointing。