ASE专题

ASE调用CP2K:水分子与网格检查

真实调用计算程序,保存输入输出并用位移能量差分检查力的单位和符号,附终端命令、结构图与完整程序。

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

ASE用统一的Atoms对象保存结构,把能量和力的计算交给calculator。本篇使用真实程序计算三个邻近构型,再把返回的力与能量差分相互核对。下载本组输入、实际结果及绘图程序,解压进入资料包目录。

1. 准备环境和运行#

本例ASE3.29.0调用CP2K2026.2的CPU构建,通过CP2K shell模式交互,不是只写出一个input文件。水分子在12 Å盒中,三个方向均不周期,采用PBE、DZVP-MOLOPT-SR-GTH和GTH-PBE。

module load ase/3.29.0 cp2k/2026.2-8173m
bash run.sh cp2k

脚本使用2个MPI进程×2个OpenMP线程,并设置足够的栈空间。它调用cp2k.psmp -s,在上下文退出时关闭shell。label="water"保持简短,并切到各案例目录;不要把很长的绝对路径作为CP2K项目名。

原始坐标/Å:

O 6.000 6.000 6.000
H 6.000 6.757 6.587
H 6.000 5.243 6.587

将第2原子沿y先偏移0.03 Å,再取−0.005、0、+0.005 Å。基础网格CUTOFF=400 Ry、REL_CUTOFF=50 Ry,SCF=1E-7。ASE的cutoff参数单位是eV,所以代码写400*Rydberg,不能写成裸的400后声称是400 Ry。

2. 本例完整计算程序#

run.sh负责加载环境和复制输入,实际计算逻辑如下。ASE返回能量单位eV、力单位eV/Å,应力通常为eV/ų。

展开完整Python程序
from pathlib import Path
import json,os,numpy as np
from ase.io import write
from ase.build import bulk
from ase import Atoms
B=Path(__file__).resolve().parent
rows=[]
from ase.calculators.cp2k import CP2K
from ase.units import Rydberg
extra="""&FORCE_EVAL
 &DFT
  &MGRID
   REL_CUTOFF 50
  &END MGRID
  &SCF
   EPS_SCF 1.0E-7
   SCF_GUESS ATOMIC
   &OT
    MINIMIZER DIIS
    PRECONDITIONER FULL_SINGLE_INVERSE
   &END OT
  &END SCF
  &POISSON
   PERIODIC NONE
   POISSON_SOLVER MT
  &END POISSON
 &END DFT
&END FORCE_EVAL"""
for label,delta in [('minus',-.005),('center',0),('plus',.005)]:
 d=B/label;d.mkdir();a=Atoms('OHH',positions=[[6,6,6],[6,6.757,6.587],[6,5.243,6.587]],cell=[12]*3,pbc=False);a.positions[1,1]+=.03+delta
 os.chdir(d)
 with CP2K(label='water',command='mpirun -np 2 cp2k.psmp -s',basis_set='DZVP-MOLOPT-SR-GTH',basis_set_file='BASIS_MOLOPT',potential_file='GTH_POTENTIALS',pseudo_potential='GTH-PBE',xc='PBE',cutoff=400*Rydberg,max_scf=100,poisson_solver=None,stress_tensor=False,inp=extra,print_level='MEDIUM') as calc:
  a.calc=calc;e=a.get_potential_energy();f=a.get_forces();write(d/'result.xyz',a);rows.append(dict(label=label,delta_A=delta,energy_eV=e,forces_eV_A=f.tolist()))
(B/'RESULTS.json').write_text(json.dumps(rows,indent=2)+'\n')

生成三个目录:minus、center、plus。程序保存RESULTS.json与每个构型的result.xyz;DFT案例还保留引擎原始输入输出。要继续结构优化时,可将已配置的calculator交给ASE优化器,但本例没有把三个单点误称为优化轨迹。

3. 实际结果和独立检查#

位移增量/Å 总能量/eV
-0.005 -468.569708638
+0.000 -468.567411173
+0.005 -468.564297909

用中心差分检查第2原子的y方向力:

F ≈ −[E(+δ) − E(−δ)] / (2δ),δ = 0.005 Å
程序返回:-0.541643009 eV/Å
能量差分:-0.541072912 eV/Å
绝对差异:0.00057 eV/Å

实际结构与三个位移构型的相对能量

运行python check_results.py reference检查附件参考;复算后执行python check_results.py work检查自己的输出。程序分别核对原始输出和ASE结果;有限差分有截断误差,SCF和积分网格也有误差,不能要求两者逐位相同。相互吻合说明本例接口的主要单位与符号一致,不能证明材料精度已经收敛。

4. 为什么还要看总力与网格#

400 Ry中心构型的总力矢量模约0.00623 eV/Å;孤立分子的整体平移不应有真实恢复力,这个残差提示有限积分网格的影响。提高网格进行一个中心点对照:

bash run.sh cp2k-grid800
网格CUTOFF/REL_CUTOFF,Ry 总力矢量模/eV·Å⁻¹
400/50 0.006232
800/80 0.002171

提高网格后残差降低约2.87倍,但仍未达到0.001 eV/Å。中心构型总能量改变0.005951 eV,说明不能忽略数值设置。

本例没有证明800 Ry已充分收敛。正式计算应根据目标精度继续检查CUTOFF、REL_CUTOFF、SCF以及盒尺寸;不要把三个能量差分点当成网格收敛测试。CP2K原始能量是Hartree,接口返回eV,本例按CP2K日志打印的换算常数27.2113838565563 eV/Hartree独立核对;shell已返回eV,不要再乘一次。不同程序内置的物理常数版本可能略有差异,逐位比较时应使用对应程序的常数。

参考:ASE CP2K接口。其他联用:VASP、ABACUS、CP2K、NEP。

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

查看配图

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

100%查看原图 ↗