4. 原子模型构建与data文件工程化

在LAMMPS中,原子模型并不是“画”出来的,而是由晶格、取向、区域和原子类型四类信息共同定义出来的。真正进入计算之前,模型必须被写成一份结构完整、拓扑自洽的data文件。本节围绕这条主线展开:先确定晶格常数与取向,再用region与lattice联合建模,最后解析data文件格式、定义原子类型与质量,并生成和检查topology信息。

晶格常数与取向:模型的几何基准

晶格常数决定了原子间距和盒子尺寸的换算关系。以面心立方金属为例,若实验晶格常数为 a = 3.615 Å(示例值,铜的常见参考值),在LAMMPS中通常写成:

units           metal
lattice         fcc 3.615

这里的 3.615 是晶格常数,单位与 units metal 一致,为Å。取向则由晶格基矢决定。默认情况下,LAMMPS的fcc晶格以 [100]、[010]、[001] 为三个基矢方向。若需要 [110] 取向,可通过 orient 关键字指定:

lattice         fcc 3.615 orient x 1 1 0 orient y 1 -1 0 orient z 0 0 1

取向改变后,晶格基矢不再与全局坐标轴对齐,但原子间相对位置关系保持不变。这一点在后续用region切割时非常关键:region定义的是全局坐标空间中的几何区域,而lattice定义的是原子在空间中的排布方式,两者必须配合使用。

region与lattice联合建模

region用于定义模拟盒子的几何边界或切割区域。常见写法如下:

region          box block 0 20 0 20 0 20 units lattice
create_box      1 box
create_atoms    1 box

其中 units lattice 表示region的尺寸以晶格常数为单位。若晶格常数为3.615 Å,则 0 20 对应实际长度约72.3 Å。这种写法在需要精确控制原子层数时非常方便。若改用 units box,则region尺寸直接以长度单位给出,此时原子填充数量会随晶格常数变化而变化。

联合建模时,一个常见需求是构建带真空层的表面模型。例如:

region          slab block 0 10 0 10 0 6 units lattice
region          vacuum block 0 10 0 10 6 20 units lattice
create_box      1 slab
create_atoms    1 slab

这里先创建slab区域作为盒子,再在slab内填充原子,真空层通过盒子边界之外的空间自然形成。若需要更复杂的几何,比如纳米压痕的半球形压头区域,可以先用 region sphere 定义球形区域,再配合 create_atoms 的 region 参数将原子限制在特定区域内。

data文件格式解析

LAMMPS的data文件采用分节结构,每一节以标题行开始,后跟若干数据行。一个最小可用的data文件通常包含以下节:

节标题作用是否必需
header原子数、原子类型数、盒子边界必需
Masses每种原子类型的质量必需
Atoms原子坐标、类型、电荷等必需
Velocities原子速度可选
Bonds/Angles/Dihedrals/Impropers拓扑连接信息视力场而定

header节中,atoms 行给出原子总数,atom types 行给出原子类型数,xlo xhi、ylo yhi、zlo zhi 给出盒子边界。Atoms节的每一行格式取决于 atom_style。以 atomic 为例,每行依次为:原子ID、原子类型、x坐标、y坐标、z坐标。若使用 charge 样式,则还需在类型后插入电荷值。

原子类型与质量定义

原子类型是LAMMPS区分不同元素或不同化学环境的标识。在data文件中,Masses节必须为每一种原子类型指定质量:

Masses

1 63.546
2 26.982

这里类型1为铜,类型2为铝(示例值)。质量单位与 units 设置一致,metal 单位下为g/mol。若质量缺失或类型编号不连续,LAMMPS会在读取时直接报错。因此,在生成data文件后,应首先检查Masses节是否覆盖了所有原子类型。

topology信息生成与检查

对于分子体系或需要键合作用的力场,data文件还必须包含Bonds、Angles、Dihedrals、Impropers等拓扑节。这些节的结构通常为:第一行给出总数,后续每行给出拓扑ID、拓扑类型、参与原子ID列表。例如:

Bonds

1 1 1 2
2 1 2 3

表示第1个键类型为1,连接原子1和2;第2个键类型为1,连接原子2和3。拓扑信息必须与Atoms节中的原子ID严格对应,且不能出现重复键或悬空键。检查时可以从三个角度入手:一是原子ID是否连续且唯一;二是每条拓扑记录的原子ID是否都存在于Atoms节中;三是拓扑类型编号是否在对应的类型总数范围内。

一个实用的检查流程是:先用 read_data 读入文件,观察LAMMPS是否报错;再用 write_data 将当前系统重新写出,对比原子数和拓扑数是否一致。若两次输出的原子数不同,通常说明初始data文件存在重复原子或坐标越界问题。

data文件工程化:从晶格到拓扑的完整链路 晶格与取向 lattice fcc 3.615 orient x 1 1 0 orient y 1 -1 0 orient z 0 0 1 region与create region box block 0 20 0 20 0 20 units lattice create_box / create_atoms data文件结构 header → Masses → Atoms → Velocities → Bonds/Angles → Dihedrals/Impropers (按atom_style决定列格式) data文件检查与验证路径 原子ID检查 连续、唯一、无重复 质量覆盖检查 Masses覆盖所有类型 拓扑一致性 键/角/二面角ID有效 read/write回读 原子数、拓扑数一致 通过:模型可被LAMMPS正确读入并进入计算 失败:定位到具体节,修正后重新生成

在实际工程中,建议把晶格常数、取向、region尺寸和原子类型定义集中写在一个输入脚本中,先运行 create_atoms 生成初始构型,再用 write_data 输出data文件。这样得到的data文件天然满足LAMMPS的格式要求,也便于后续用脚本批量修改参数。若需要手动编辑data文件,务必保持各节之间的原子ID和类型编号一致,否则会在读取阶段直接失败。

对于纯金属体系,通常只需header、Masses和Atoms三节即可完成建模;对于有机分子或聚合物,则必须完整生成Bonds、Angles、Dihedrals和Impropers节,并确保拓扑类型数与力场文件中的定义一致。