☰
分子模拟三件套二次开发教程(04):第一个程序——三个 Hello World(LAMMPS 输入脚本 / Gaussian 单点 / MaterialsScript)
2026/9/25 22:30:46 网站建设 项目流程

分子模拟三件套二次开发教程(04):第一个程序——三个 Hello World(LAMMPS 输入脚本 / Gaussian 单点 / MaterialsScript)

版本声明块

  • 工具/软件:LAMMPS 2Sep2026(特性版)/ 22Jul2025(稳定版);Gaussian 16 Rev. C.01 / Rev. C.02;BIOVIA Materials Studio 2026(Materials Scripting Editor)
  • 语言/环境:LAMMPS 输入脚本语法、Gaussian.gjf语法、Perl(MS 2026 内置 5.40.2)与 Python(MS 2026 起原生支持)、bash
  • 本文目标:读完能独立写出并跑通三个最小算例,且能用客观判据判断"跑对了"而不是"跑完了"

一句话结论:三个 Hello World 的共同骨架是"定义系统 → 定义交互 → 推进 → 用客观判据验收":LAMMPS 侧是units lj+lattice/region/create_box/create_atoms+pair_style lj/cut/pair_coeff+velocity/fix nve+run(units lj下时间步默认 0.005、邻区 skin 默认 0.3,thermo的广延量默认按原子数归一化);Gaussian 侧是五段输入 +g16 job(读job.gjf写job.log)或g16 < in > out,验收判据是日志中的Normal termination;MS 侧没有"命令行 Hello World",正确入口是 Materials Scripting Editor 配合 CopyScript 生成官方可用的脚本骨架。

〇、本篇要解决的认知问题

  • Q1:三个 Hello World 有没有共同的"骨架"?如果有,这个骨架是哪四步?
  • Q2:LAMMPS 的最小输入脚本里,哪些命令是必须的,顺序上有什么硬约束(尤其是units)?
  • Q3:units lj下有哪几个反直觉的默认值,不写就会踩?
  • Q4:Gaussian 单点作业"跑对了"的判据是什么,g16的两种命令行形态有什么区别?
  • Q5:为什么 Materials Studio 的"最小脚本"不能是一个print hello world,而要在 Scripting Editor 里起步?

一、机制解析

1.1 三个 Hello World 的共同骨架

把它们并排看,会发现都是同一个四步结构:

① 定义系统 ② 定义交互 ③ 推进 ④ 客观判据 LAMMPS units/atom_style/lattice pair_style+pair_coeff velocity+fix nve 能量漂移 / dump 帧数 region/create_box/create_atoms +run Gaussian Link 0 与 Route Route 里的方法/基组 g16 进程 Normal termination Molecule specification + .chk 生成 MS 打开/新建结构文档 模块里设参数 模块运行 结果表里的数值

为什么这个骨架值得单独记住:二次开发时,你的脚本就是在自动化这四步中的某一环。谁在第 ②步"定义交互"上偷懒(例如用错截断、漏设质量),第 ④ 步的判据就会以"结果看起来合理但物理错了"的方式惩罚你——这是计算材料工作里最难查的一类错误。

1.2 LAMMPS 最小闭环:命令顺序与两条硬约束

一个完整的 LJ 熔体输入脚本,命令按序如下(每一条都在官方手册里有自己的页面):

顺序命令作用硬约束
1units设定单位制,决定所有量的单位与两个默认值不能在盒子定义之后使用(官方 Restrictions 明确)
2atom_style声明原子携带哪些属性(atomic只有类型与坐标)必须与 data/dump 的列语义一致
3lattice+region+create_box+create_atoms生成规则晶格、定义盒子、真正创建原子create_box一旦执行,盒子就"锁定"
4mass+pair_style+pair_coeff给类型赋质量与相互作用参数质量必须在动理学之前设定
5velocity按温度分布赋初速度用固定的随机种子才能复现
6fix nve时间积分(微正则系综)没有 fix 就不会发生任何运动
7thermo+run输出频率与推进步数步数 × 时间步长 = 物理时长

反直觉默认值(units lj相关,全部取自官方units命令页):

  1. 时间步与 skin 是"跟着单位制走的":units lj下默认dt = 0.005 τ、邻区skin = 0.3 σ;换成metal就变成dt = 0.001 ps、skin = 2.0 Å。所以"我的温度和能量为什么震荡得这么厉害"的第一诊断,就是确认单位制与时间步的搭配。
  2. thermo的广延量默认按原子数归一化:官方说明,在units lj下,thermo_style的默认行为是把所有广延量按原子数归一化输出(势能按"每原子"给出),可用thermo_modify norm改变。这意味着你看到的pe数值可能不是体系总势能,而是人均值。做总量统计时这是必须处理的一步。
  3. units只能出现在盒子定义之前:官方 Restrictions 明确"本命令不能在read_data或create_box定义模拟盒子之后使用"。把units写在脚本中段是新手高频错误,而且报错信息往往不直观。

经验法则:任何 LAMMPS 脚本的第 1、2 行永远固定是units与atom_style。让这两行成为肌肉记忆,能省掉后面 80% 的"单位/属性错配"类问题。

1.3 Gaussian 单点:五段输入 + 两种运行形态

水分子单点是最经典的第一个 Gaussian 作业。它的 Route 段只写方法与基组(如HF/6-31G(d)),不加任务关键字,因此只做一次能量计算。运行形态官方登记了两种:

形态 A(作业名): g16 water → 读 water.gjf,写 water.log 形态 B(重定向): g16 < water.gjf > water.log

两者等价,但工程含义不同:形态 A 依赖文件命名约定(输入必须叫water.gjf),适合批处理流水线(第 08 篇会用它);形态 B 允许输入来自管道,适合在脚本里用 heredoc 内联输入(第 02 篇的冒烟作业就是这么写的)。

"跑对了"的判据只有一条是可靠的:日志里出现Normal termination。配套的三个"副产品"则决定后续能不能继续做多步作业:.chk(是否在 Link 0 里写了%Chk)、日志首部的版本行(用于溯源)、以及能量值本身是否合理(例如水的 HF/6-31G(d) 单点能应在负几十 Hartree 量级——具体数值必须与你方的实际计算比对,本文不给出臆造的参考值,铁律 9)。

1.4 MaterialsScript:为什么"最小脚本"要在 Scripting Editor 里起步

MS 的"Hello World"和另外两件有本质差别:MS 没有公开的命令行接口,也没有公开发布的脚本 API 文档。可核验的事实只有两类:官方发行说明与数据表(例如 MS 2026 起 MaterialsScript 原生支持 Perl 与 Python、内置 Perl 5.40.2),以及客户端内的功能(Materials Scripting Editor、CopyScript)。

因此学习路径只有一条是正确的:

  1. 打开 Materials Scripting Editor,它自带脚本编写与调试能力;
  2. 在任意计算对话框里用 CopyScript 把当前设置导出成脚本——这是官方给出的"从 GUI 设置到脚本"的正规捷径,导出的脚本里就包含该版本可用的写法;
  3. 以导出的写法为模板改造成批处理脚本;
  4. 遇到不确定的对象名与方法签名,查 MS 安装后的内置在线帮助(MaterialsScript 文档),而不是靠搜索或猜。

最佳实践:把"CopyScript 导出的原始脚本"当成项目的第一个版本提交进仓库(例如scripts/_reference/),后续所有自写脚本都从它派生。这样当 MS 升级到下一个年份发行版时,你能立刻用 diff 看出 API 是否变化。

1.5 三者运行方式对照

维度LAMMPSGaussian 16Materials Studio 2026
交互式运行命令行:lmp -in in.lj(可执行名随构建而异)不推荐交互式;用g16 job不适用(作业从客户端发起)
批处理运行shell/队列脚本包一层,多份 input 批量提交NQSsubg16,或用 PBS/Slurm 包装g16经 Gateway 派发到计算服务器
输入形态input 脚本 + data 文件.gjf(可@include内联外部文件)文档对象 + 模块参数(脚本化设置)
脚本层入口lammpsPython 模块、python命令shell + 输入生成器 +formchkMaterialsScript(Perl / Python)
成功判据正常结束且观测量守恒Normal termination结果表出现目标数值且无误标

二、完整代码与逐行剖析

代码 2-1:in.lj——LAMMPS 的 LJ 熔体最小闭环

# in.lj —— 3d Lennard-Jones 熔体(教学最小闭环) # 适用版本:LAMMPS 2Sep2026 / 22Jul2025 # 说明:晶格常数与温度是本文为“能跑通且物理自洽”而设定的教学值,不是官方推荐参数(铁律 9) units lj # 单位制必须最先设定,且不得晚于盒子定义(官方 Restrictions) atom_style atomic # 原子只带类型与坐标:与代码 03-2-1 生成的 data 文件语义一致 # ---- ① 定义系统 ---- lattice fcc 1.71 # fcc 晶格常数 a=1.71σ → 数密度约 4/a^3 ≈ 0.80(液态量级) region box block 0 6 0 6 0 6 # 盒子 = 6×6×6 个晶格单元 create_box 1 box # 1 种原子类型;执行后盒子尺寸被锁定 create_atoms 1 box # 在盒子内按 lattice 填满原子(本例 4×6^3 = 864 个) # ---- ② 定义交互 ---- mass 1 1.0 # 质量必须早于任何动理学量计算 pair_style lj/cut 2.5 # LJ 截断 2.5σ;势文件/表势亦可,此处用解析式 pair_coeff 1 1 1.0 1.0 2.5 # ε=1.0、σ=1.0、截断 2.5(lj 单位下均为无量纲) # ---- ③ 推进 ---- velocity all create 1.0 87287 loop geom # T*=1.0 的初速度,固定种子 87287 保证可复现 neighbor 0.3 bin # 与 units lj 的默认 skin 0.3 一致(官方 units 页所列默认值) neigh_modify delay 0 every 20 check no # 每 20 步重建邻区表,关闭每次重建时的检查以提速 fix 1 all nve # 微正则(NVE)积分;没有 fix 原子不会运动 timestep 0.005 # 显式写出,等于 units lj 的默认值(把隐含默认变成可见输入) thermo 100 # 每 100 步输出一行热力学数据 thermo_style custom step temp pe ke etotal press # 注意:units lj 下 thermo 的广延量默认按原子数归一化(官方 units 页), # 因此上面的 pe/ke/etotal 是“每原子”值;需要总量时用 thermo_modify norm no dump 1 all custom 200 dump.lj id type x y z # 每 200 步写一帧 dump_modify 1 sort id # 显式按 id 排序:否则多帧之间原子顺序不确定(官方 dump 页警告) # ---- ④ 客观判据 ---- run 2000 # 2000 × 0.005 τ = 10 τ 的物理时长

逐段剖析:

  • lattice fcc 1.71与region box block 0 6 0 6 0 6的组合,给出 864 个原子、盒长 6×1.71 = 10.26σ、数密度约 0.80。这个数字是算出来的,不是抄来的——你应当能自己复述这条换算:fcc 每晶格单元 4 个原子。
  • create_box 1 box之后再改盒子尺寸是做不到的:这就是官方read_data页提到的"若干系统参数在第一次定义后被锁定"的同一机制。理解这一点,就理解了为什么"先决定盒子再填原子"是唯一合理的顺序。
  • neighbor 0.3 bin与units lj的默认 skin 0.3 一致:写出来是为了让默认值可见。当你把单位制换成metal时,这个数字必须跟着改(skin = 2.0 Å),显式书写能提醒你这一点。
  • dump_modify 1 sort id是硬要求而非优化:官方dump页明确警告,若 dump 不含原子 ID 又不排序,可视化与分析工具无法在不同帧之间一致地分配数据。这也是第 03 篇的纪律在代码里的落地。
  • timestep 0.005与thermo的归一化注释,是本文特意留的两处"反直觉默认值"提示。

代码 2-2:water.gjf——Gaussian 水分子单点

%Chk=water.chk %Mem=1GB %NProcShared=2 # HF/6-31G(d) water single point - first hello world 0 1 O 0.000000 0.000000 0.117300 H 0.000000 0.757000 -0.469200 H 0.000000 -0.757000 -0.469200

逐段剖析:

  • 第 1~4 行是 Link 0 Commands(以%开头):%Chk保留检查点、%Mem申请 1 GB(官方默认 800 MB)、%NProcShared指定共享内存并行核数。注意 Link 0 段不以空行结尾,紧接着就是 Route 行。
  • 第 5 行是以#开头的 Route section:HF/6-31G(d)只声明方法与基组,因此这是一个单点能量计算。方法/基组的选择要结合体系与许可,本文不做推荐。
  • 第 7 行是 Title:自由文本,唯一要求是与后面的段之间留空行。
  • 第 9 行0 1是电荷与多重度:中性单重态水。这一行写错(例如电荷不是 0)会直接导致Error termination,是新手最常见的一处。
  • 第 10~12 行是笛卡尔坐标:本文用的是水的实验平衡几何(O–H 0.9572 Å、H–O–H 104.52°)换算得到的坐标,你应当在纸上复核出至少一个 O–H 距离,以确认自己会读这段。
  • 文件末尾的空行是官方示例的通行写法,不要省。

代码 2-3:run_three_hello.sh——跑前两个闭环并做客观验收

#!/usr/bin/env bash# 适用版本:LAMMPS 2Sep2026/22Jul2025;Gaussian 16 Rev. C.01/C.02# 用途:跑通 LAMMPS 与 Gaussian 两个 Hello World,并用客观判据验收;MS 侧只能人工在客户端完成set-euopipefailROOT="$PWD/hello_$(date+%Y%m%d-%H%M%S)"mkdir-p"$ROOT/lammps""$ROOT/g16"echo"================ 第一部分:LAMMPS ================"cd"$ROOT/lammps"cp"${IN_LJ:?请用 IN_LJ 指向你的 in.lj}"./in.lj# 可执行文件名随构建而异(常见 lmp / lmp_mpi / lmp_serial),以本机安装名为准LMP_BIN="${LMP_BIN:-lmp}"command-v"$LMP_BIN">/dev/null||{echo"[FAIL] 未找到$LMP_BIN,请用 LMP_BIN=可执行文件路径 指定";exit1;}"$LMP_BIN"-inin.lj-loglog.lj-screennone# 屏幕输出关闭,只看日志test-flog.lj||{echo"[FAIL] 未生成 log.lj";exit1;}echo"[PASS] LAMMPS 已完成运行,log.lj$(wc-l<log.lj)行"# 判据 1:dump 帧数(每帧由“ITEM:”开头的若干段组成,见官方 dump 页)FRAMES=$(grep-c'^ITEM: TIMESTEP'dump.lj)echo"[INFO] dump 帧数 =$FRAMES(期望$((2000/200+1))= 11)"# 判据 2:能量漂移。取 thermo 表中的 etotal 列(units lj 下为每原子值)python3 -<<'PY' import re rows = [] for ln in open("log.lj", encoding="utf-8", errors="ignore"): p = ln.split() # thermo 表的数据行特征:首列是整数步数,且共 7 列(与 thermo_style custom 的字段数对应) if len(p) == 7 and p[0].isdigit(): rows.append([float(v) for v in p]) if len(rows) < 3: raise SystemExit("[FAIL] log.lj 中的 thermo 数据行不足,检查 run/thermo 设置") et = [r[6] for r in rows] # step temp pe ke etotal press → 下标 6 为 etotal drift = max(et) - min(et) print(f"[INFO] etotal 采样 {len(rows)} 行;首值 {et[0]:.6f} 末值 {et[-1]:.6f} 漂移 {drift:.6g}") print("[PASS] NVE 能量漂移 < 1e-3(每原子)" if drift < 1e-3 else "[WARN] 漂移偏大,请缩小 timestep 复核") PYechoecho"================ 第二部分:Gaussian ================"cd"$ROOT/g16"cp"${WATER_GJF:?请用 WATER_GJF 指向你的 water.gjf}"./water.gjfecho"-- 形态 A:g16 job(读 job.gjf 写 job.log)--"g16 water||true# 成败由日志判定,不依赖退出码grep-q"Normal termination"water.log&&echo"[PASS] 形态 A:Normal termination"\||{echo"[FAIL] 形态 A 未正常终止";tail-n20water.log;}test-fwater.chk&&echo"[PASS] 生成 water.chk(%Chk 生效)"||echo"[WARN] 未生成 water.chk"echo"-- 形态 B:g16 < in > out --"g16<water.gjf>water_stdin.log||truegrep-q"Normal termination"water_stdin.log&&echo"[PASS] 形态 B:Normal termination"\||echo"[FAIL] 形态 B 未正常终止"echoecho"================ 第三部分:Materials Studio(人工) ================"cat<<'TXT' MS 侧无命令行入口,请在客户端完成: 1) 打开 Materials Scripting Editor; 2) 在任一计算对话框用 CopyScript 导出当前设置 → 得到该版本可用的脚本写法; 3) 以导出脚本为模板,补全“打开结构文档 → 设置模块参数 → 运行 → 读取结果”四步。 脚本对象名与方法签名以 MS 内置的 MaterialsScript 文档为准(铁律 3)。 TXT

逐行剖析:

  • -screen none把屏幕输出关掉、只留-log log.lj:批处理里必须这样做,否则日志会分散在两个地方,事后排查时容易只看到一半。
  • 判据 1 用dump 帧数(grep -c '^ITEM: TIMESTEP'):这是"时间真的推进了"的硬证据。期望值2000/200 + 1 = 11是可以事先算出来的,这就是"可验证的客观标准"。
  • 判据 2 用thermo 表的 etotal 漂移:NVE 系综下总能量应当守恒,漂移越小越好。脚本里阈值取1e-3(每原子)只是教学量级,真实体系应按你的物理要求与采样长度设定阈值,不要照抄。
  • p[0].isdigit()这个过滤条件很关键:log.lj里既有 thermo 表,也有大量提示文字。用"首列是整数且列数匹配"来锁定数据行,比按行号取更稳(跨度不同的运行会输出不同的提示行数)。
  • Gaussian 两段都写|| true再查日志:成败判据是Normal termination,不是退出码。同时跑形态 A 与形态 B,是为了让你亲眼确认两者等价。
  • 第三部分用cat <<'TXT'直接打印人工步骤:把"无法自动化的部分"显式写进脚本,比留一句注释更不容易被后来的自己忽略。

代码 2-4:MaterialsScript 骨架(Perl 与 Python 两版)

#!/usr/bin/env perl# 适用版本:BIOVIA Materials Studio 2026(内置 Perl 5.40.2)# 重要声明(铁律 3):本段是“骨架 + 注释”。MS 的脚本 API 未公开发布,# 所有对象族与方法的实际名字、参数、返回结构,必须以 MS 内置的# MaterialsScript 文档(Materials Scripting Editor 的帮助)为准。# 请勿把下列注释里的功能描述当作可用 API 直接调用。usestrict;usewarnings;# 第 1 步:导入 MaterialsScript 相关的模块。# —— 具体模块名与导入形式,请照抄 Materials Scripting Editor 中# CopyScript 导出的脚本首行(不同发行版可能不同)。# use MaterialsScript qw(:all); # ← 本行仅为位置示意,须以官方文档核对后启用# 第 2 步:取到当前结构文档对象(功能描述:结构/集合文档族)。# —— “如何取当前文档”“结构对象有哪些属性”,以官方 MaterialsScript 文档为准。# 第 3 步:把计算模块封装成对象并设置参数(功能描述:模块封装族,如 Forcite)。# —— 参数名与取值集合,请从 CopyScript 导出的脚本中对照。# 第 4 步:运行模块并读取结果(功能描述:结果表族)。# —— 结果表的字段名与读取方式,以官方文档为准。print"[skeleton] 请在 Materials Scripting Editor 中按 CopyScript 导出的写法补全本脚本。\n";exit0;
#!/usr/bin/env python3# -*- coding: utf-8 -*-# 适用版本:BIOVIA Materials Studio 2026(2026 起 MaterialsScript 原生支持 Python)# 重要声明(铁律 3):以下为骨架。MS 脚本 API 未公开发布,对象名/方法签名一律# 以 MS 内置的 MaterialsScript 文档为准;在 2026 之前的发行版上本骨架的# Python 前提并不成立(那时只有 Perl)。defmain()->int:# 第 1 步:导入 MS 脚本模块(模块名以官方文档与 CopyScript 导出内容为准)# import <官方模块名> as ms# 第 2 步:获取结构文档对象(结构/集合文档族)# doc = <取得当前结构文档的官方写法># 第 3 步:配置并运行计算模块(模块封装族)# module = <取得模块对象的官方写法># <按官方文档设置模块参数># 第 4 步:读取结果表(结果表族)# for row in <遍历结果表的官方写法>:# print(<按官方字段名取值>)print("[skeleton] 请以 Materials Scripting Editor 的 CopyScript 导出内容为准补全。")return0if__name__=="__main__":raiseSystemExit(main())

逐段剖析:

  • 两版骨架都把"官方文档边界"写在文件最前面,且把导入行注释掉并标注"须以官方文档核对后启用":这不是偷懒,而是把铁律 3 变成代码里的可见约束——任何人拿到这份骨架,都不会误以为里面的写法可以直接运行。
  • 骨架的四步(导入 → 取文档 → 配模块 → 读结果)与 §1.1 的四步骨架严格对应,也与第 06 篇将要展开的 MaterialsScript 对象模型(Documents / Modules / StudyTable 三个对象族)一致。
  • 为什么还是坚持给骨架:因为它定义了"你必须向官方文档提什么问题"。有骨架的人会去查四个具体问题;没有骨架的人会在编辑器里瞎试。

三、常见报错与排查

报错 3-1:LAMMPS 报Unknown command或不认识的命令。
现象:脚本第 N 行命令无法识别。根因:三类——排版问题(同一行写了多条命令而没有用&续行)、拼写与官方命令名不一致、或该命令来自你未启用的包(如用了只有特定包才有的pair_style)。解法:一行只写一条命令;命令名以官方手册页为准(铁律 2);涉及可选包时先确认构建时启用了它(第 02 篇的包选择)。

报错 3-2:LAMMPS 报units相关错误(命令位置不合法)。
现象:把units写在脚本中段后报错。根因:官方 Restrictions 明确units不能在read_data或create_box定义盒子之后使用。解法:把units与atom_style提到脚本最前两行;如果脚本是模板生成的,就在生成器里强制这两行置顶(第 08 篇的模板会这么做)。

报错 3-3:LAMMPS 报Lost atoms。
现象:运行若干步后提示丢原子。根因:体系能量/力异常导致原子跑飞——常见于初速度与时间步不匹配(units lj下dt默认 0.005,若你按其他单位制的直觉给温度,就会严重超速)、原子初始位置重叠、或盒子过小导致周期镜像自相互作用。解法:先确认单位制与timestep的搭配;再检查盒子尺寸是否给非键截断留了足够空间(第 03 篇代码 2-1 的margin就是为此);必要时用velocity重新赋一个更温和的初速度。

报错 3-4:Gaussian 报Error termination,日志指向电荷/多重度或 Link 0。
现象:作业未正常终止。根因:0 1这一行与体系不符(电子数为奇数却写单重态等)、Link 0 行写进了 Route 段、或%Mem申请超限。解法:核对电荷与多重度的奇偶性一致性;确认%开头的行全部在 Route 行之前;%Mem从官方默认 800 MB 起逐步上调并观察节点内存。判据始终是Normal termination。

报错 3-5:MS 脚本在 Scripting Editor 中报"对象或方法不存在"。
现象:脚本无法运行。根因:三类——对象名/方法名与当前发行版不一致(API 未公开发布,只能以内置帮助为准)、脚本语言栈不对(把 Python 脚本用在只有 Perl 支持、即 2026 之前的发行版上)、或作业需要 Gateway 而当前未连接。解法:先跑 CopyScript 导出的原始脚本,确认环境可用;再从该模板派生;API 细节一律查内置 MaterialsScript 文档(铁律 3)。

四、动手练习

  • 练习 1(LAMMPS 最小闭环):跑通代码 2-1。判定:dump.lj中ITEM: TIMESTEP出现 11 次(2000/200 + 1);thermo 表中temp在 1.0 附近波动;etotal(每原子)漂移小于你在脚本里设定的阈值;用上面两条判据自动给出 PASS。
  • 练习 2(自己算一遍参数):把lattice fcc 1.71改成两个不同值,各跑run 0,从输出反推数密度。判定:能写出"数密度 = 4/a³"并验证改后的体系在run 0下势能有限;能解释"盒子大小为什么受截断 2.5σ 约束"。
  • 练习 3(Gaussian 两种形态):用代码 2-3 分别以形态 A、形态 B 运行水分子单点。判定:两份日志都出现Normal termination;water.chk存在;能写出"形态 A 依赖job.gjf命名约定,形态 B 允许输入来自管道因此可用于 heredoc 内联"这一区别。

五、小结与下一篇预告

三个 Hello World 的意义不在"跑通",而在四步骨架 + 客观判据:定义系统、定义交互、推进、验收。LAMMPS 侧请记住三条反直觉默认值(units lj下dt=0.005、skin=0.3、thermo广延量按原子数归一化)与units的位置约束;Gaussian 侧请记住唯一可靠的判据是Normal termination、以及 Link 0 段不以空行结尾;MS 侧请记住"从 Scripting Editor 的 CopyScript 起步"是唯一正路,API 细节一律查内置帮助。

第 05 篇《LAMMPS Python 接口》把第 04 篇的输入脚本升级成程序:用lammps.lammps构造实例、用command/file/commands_list/commands_string/expand驱动计算、用extract_global/extract_atom/extract_compute边跑边取数、用numpy包装对象直接拿到数组,并把整条链路写成一份可落盘的 CSV 结果。

本篇认知问题回显(FAQ)

Q1:三个 Hello World 的共同骨架是哪四步?
A:四步为定义系统、定义交互、推进、客观判据:LAMMPS 用 units 与 create_atoms、pair_coeff、fix nve 与 run、能量漂移与 dump 帧数;Gaussian 用 Link 0 与 Route、分子规范、g16、Normal termination。

Q2:LAMMPS 最小输入脚本中哪些命令必须有,有什么顺序硬约束?
A:主线命令是 units、atom_style、lattice/region/create_box/create_atoms(或 read_data)、mass、pair_style 与 pair_coeff、velocity、fix nve、thermo 与 run;硬约束是 units 不得晚于盒子定义,create_box 后盒子与类型上限即锁定。

Q3:units lj 有哪几个反直觉默认值?
A:一是时间步与 skin 随单位制变化,units lj 下默认 dt=0.005 τ、skin=0.3 σ;二是 thermo 的广延量默认按原子数归一化,pe 是每原子值;三是 units 不能在盒子定义之后使用。

Q4:Gaussian 单点作业的成败判据是什么,g16 的两种命令行形态有什么区别?
A:唯一可靠判据是日志中的 Normal termination 而非退出码;g16 job 读 job.gjf 写 job.log,适合批处理,g16 < in > out 从标准输入读,适合脚本内 heredoc 内联输入,两者等价。

Q5:为什么 Materials Studio 的最小脚本不能是简单的打印语句,要在 Scripting Editor 里起步?
A:因为 MS 无公开命令行入口、脚本 API 未在发行说明中定义,完整类名与方法签名只在安装后的内置帮助中;正确路径是在 Materials Scripting Editor 中用 CopyScript 导出可用脚本作模板再派生。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询