ASE全局优化实操:Minima hopping
Cu13真实短MD逃逸和局部淬火,阅读温度调整、重复盆地、完整轨迹以及最后状态与最低能的差别。
阅读本篇目录
Minima hopping用短MD尝试离开当前盆地,再局部优化,并根据是否找到新盆地调整下一次搜索。本篇沿用Basin hopping教程的相同Cu13初态与EMT势,展示实际日志、四次局部淬火与保存结果的方法。
1. 先重画已有结果#
python3 -m zipfile -e ase-Cu13-global-optimization-wave308-*.zip .
cd ase-Cu13-global-optimization-wave308
bash run.sh
cat results/quenches.csv
这一步只做后处理,不运行新的MD。参考保留三分支全部431个实际保存帧的完整坐标、力和能量,而不是只保存最漂亮的一帧。

2. 实际搜索代码#
完整calculate.py使用同一初态复制,关键部分为:
import numpy as np
from ase.calculators.emt import EMT
from ase.optimize.minimahopping import MinimaHopping
trial = atoms.copy()
trial.calc = EMT()
search = MinimaHopping(
trial,
T0=600.0,
mdmin=1,
timestep=1.0,
fmax=0.02,
rng=np.random.default_rng(20261108),
logfile='hop.log',
minima_traj='minima.traj',
)
search(totalsteps=4)
T0单位为K,timestep为fs,fmax为eV/Å。与Basin hopping中的eV温度参数不同,不要交换两套单位。这里的600 K用于搜索逃逸,不是平衡铜团簇的热力学温度实验。
mdmin=1参与判断短MD逃逸何时停止,不是只跑一个MD时间步。totalsteps=4包括初始局部优化,本次实际为初始淬火加三次MD逃逸后的淬火。 它不是四个完全独立的随机样本。
3. 新计算怎样提交#
sbatch run.slurm
squeue -u "$USER"
与上一篇共用一份脚本,依次运行普通FIRE、Basin hopping、Minima hopping。新数据写native/,已有目录时停止。模板使用分配节点上的1个CPU核运行EMT,申请的GPU不代表这个CPU算法有GPU加速。
cat native/minima-hopping/hop.log
ls native/minima-hopping/md*.traj
ls native/minima-hopping/qn*.traj
md*.traj是逃逸过程中的热运动,qn*.traj是局部优化过程;minima.traj记录算法按自己的相似性规则认为需要保留的极小。它们回答不同问题,不必具有相同帧数。
4. 读实际日志中的温度调整#
本次首先记录初始极小,然后找到一个更低的盆地。后两次逃逸又回到相近盆地,日志中出现Re-found last minimum,搜索温度随之调整。实际打印过600、545.4545、600、660 K等搜索参数。
这些调整用于搜索算法,不是本篇提供了一条按这些温度平衡采样的物理轨迹。没有找到新盆地也不是程序没有做计算;应结合MD轨迹、局部优化和相似性判断阅读。
5. 最低能从哪里取#
遍历每条局部优化轨迹的最后一个、已完成淬火的状态:
from pathlib import Path
from ase.io import read, write
states = [read(p, -1) for p in sorted(
Path('native/minima-hopping').glob('qn*.traj')
)]
best = min(states, key=lambda a: a.get_potential_energy())
print(best.get_potential_energy())
write('best-minima-Cu13.extxyz', best)
本次四条淬火记录的最低值为9.361375314 eV/Cu13;最后当前状态为9.361481780 eV/Cu13。算法按几何相似性将某些状态视为同一盆地,因此minima.traj只记录两个代表,而不是四条淬火记录都另存成一个新极小。
原子力停止阈值为0.02 eV/Å,近似同一盆地的残余能量仍可有约10⁻⁴ eV量级差异。不要将Basin和Minima本次最低值约0.000115 eV的差别直接解释成哪种算法对真实铜更准确。
6. 把自己的原生ASE数据读出来#
module purge
module load ase/3.29.0
python read_ase_frames.py native --output my-fields
ls my-fields
得到native-fields.npz和FRAMES.json,逐帧保留原子坐标、原子力、势能以及该帧属于哪一个原生轨迹。热MD中的瞬时能量、尚未完成优化的中间帧与已淬火极小不能混成一列,再据此比较优化效果。
7. 换体系前需要改什么#
选择适合目标材料的计算器、初始构型与边界,再设置扰动/逃逸尺度和局部优化阈值。保持能量、力来自同一个相容势,增加搜索长度和多个独立起点,检查是否仍不断找到新的低能盆地。对有固定原子、对称性或成键限制的体系,要明确约束是否在搜索和局部优化阶段都正确应用。
本篇只是少量步骤的教学搜索,没有证明Cu13全局最低能,也未计算自由能或不同温度下的稳定相分布。