资讯详情

LAMMPS lattice 命令完全指南:晶格定义、坐标变换与原子建模实战

📅 2026/10/16 3:12:15 | 华诺云谱 👁 阅读
LAMMPS lattice 命令完全指南:晶格定义、坐标变换与原子建模实战
科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载lattice是 LAMMPS 中用于定义晶格lattice的核心命令它描述一组由单胞unit cell和基原子basis atoms构成、在空间中无限复制的点阵并决定这些点在模拟盒子simulation box中的位置。本指南以 doc/src/lattice.rst 为骨架结合 src/lattice.cpp 源码与仓库中的真实示例系统讲解内置晶格样式、scale/origin/orient/spacing/a1/a2/a3/basis 全部参数、LJ 归约密度换算、一般三斜晶格triclinic/general以及单位晶格间距units lattice的底层机制。读完本文你将能自如地构造 fcc/bcc/hcp/diamond 等标准晶格用 custom 样式还原任意晶体结构如 Wurtzite CdSe并正确地把晶格原子填充进模拟盒子。命令语法与参数总览lattice命令的完整语法为lattice style scale keyword values ...stylenone、sc、bcc、fcc、hcp、diamond、sq、sq2、hex、custom之一scale晶格与模拟盒子之间的缩放因子其后可追加零个或多个 keyword/value 对支持的 keyword 包括keyword取值含义originx y z晶格在盒子内的平移量为单胞边长的小数0 x,y,z 1orientdim i j k将晶格某个晶向对齐到盒子坐标轴dim x/y/zi,j,k 为整数晶向spacingdx dy dz直接指定盒子 x,y,z 方向上的晶格间距a1、a2、a3x y z定义单胞的三个边矢量仅custom样式可用basisx y z添加一个基原子坐标为分数坐标0 x,y,z 1仅custom样式可用triclinic/general无取值声明该晶格用于一般三斜模拟盒子典型示例lattice fcc 3.52 lattice hex 0.85 lattice sq 0.8 origin 0.0 0.5 0.0 orient x 1 1 0 orient y -1 1 0 lattice custom 3.52 a1 1.0 0.0 0.0 a2 0.5 1.0 0.0 a3 0.0 0.0 0.5 basis 0.0 0.0 0.0 basis 0.5 0.5 0.5 triclinic/general lattice none 2.0LAMMPS 中晶格的定义非常朴素它就是一个点集由带基原子的单胞沿各方向无限复制而成。晶格在两条路径上发挥作用create_atoms 命令把原子放到模拟盒子内部的晶格点上且允许把不同的原子类型分配给不同的基原子通过basis子选项由晶格隐含的 x,y,z 方向晶格间距可以被其他命令当作距离单位使用例如 create_box、region、velocity当问题几何本质上是原子坐落在晶格上时非常方便。晶格样式必须与模拟维度一致见 dimension 命令sc、bcc、fcc、hcp、diamond用于三维问题sq、sq2、hex用于二维问题custom二维、三维均可。lattice命令可以在输入脚本中多次使用每次调用都会重新定义晶格属性并影响之后所有使用晶格属性的命令。典型应用是重复执行lattice→region→create_atoms序列在不同几何区域内用不同晶格取向填充原子从而构建多晶poly-crystalline模型。内置晶格样式单胞结构与基原子摆放除none和custom外其余样式在 src/lattice.cpp 中通过add_basis()直接写入预定义的基原子分数坐标样式维度单胞边矢量基原子数基原子位置分数坐标sc3d立方体边长 1.01(0,0,0)bcc3d立方体边长 1.02(0,0,0)、(0.5,0.5,0.5)fcc3d立方体边长 1.04(0,0,0)、(0.5,0.5,0)、(0.5,0,0.5)、(0,0.5,0.5)hcp3da1(1,0,0)、a2(0,√3,0)、a3(0,0,√(8/3))4z0 平面两个、z0.5 平面两个diamond3d立方体边长 1.08角点 三个面心 四个 (0.25,0.25,0.25) 类偏移位sq2d正方形边长 1.01(0,0)sq22d正方形边长 1.02(0,0)、(0.5,0.5)hex2d矩形a1(1,0,0)、a2(0,√3,0)2(0,0)、(0.5,0.5)其中sc、bcc、fcc、diamond使用单位立方单胞a1 1 0 0、a2 0 1 0、a3 0 0 1hcp的 a2、a3 分量在 src/lattice.cpp 中由sqrt(3.0)与sqrt(8.0/3.0)直接设置。注意 LAMMPS 里单胞unit cell沿用了固态物理中primitive vectors的命名但并不要求它是体积最小的primitive cell。维度不匹配会被直接拒绝在二维模拟中使用sc/bcc/fcc/hcp/diamond或三维模拟中使用sq/sq2/hex都会触发Lattice style incompatible with simulation dimension错误src/lattice.cpp。none样式只定义间距不定义原子none样式不定义单胞和基原子集合因此不能与 create_atoms 一起使用但它通过 scale 参数定义晶格间距可供其他命令作为距离单位。none样式不能附带任何其他 keyword/value。系统默认即lattice none 1.0表示晶格间距等于 1 个距离单位由 units 命令定义。源码中none样式强制要求恰好两个参数并把xlattice ylattice zlattice scalesrc/lattice.cpp。scale 参数绝对距离与 LJ 归约密度scale决定单胞映射进模拟盒子时的放大倍数即施加到单胞上的乘法因子。其含义取决于当前 units除lj外的所有单位制scale直接以该单位制的距离单位给出。例如real或metal单位下单位立方单胞配scale 3.52得到间距为 3.52 Å 的立方晶格cgs单位下则为 3.52 cm。lj单位制scale是 Lennard-Jones 归约密度 ρ*。LAMMPS 通过公式factor^dim ρ/ρ*反推出乘法因子其中 ρ N/VV 是晶格单胞体积N 是单胞内基原子数dim 是模拟维度2 或 3。效果上若模拟中 LJ 粒子的尺寸 σ 1.0那么该晶格下的粒子就落在目标归约密度上。源码中 LJ 单位下的换算发生在 src/lattice.cppif (strcmp(update-unit_style,lj) 0) { double vec[3]; MathExtra::cross3(a2,a3,vec); double volume fabs(MathExtra::dot3(a1,vec)); scale pow(nbasis/volume/scale,1.0/dimension); }即先由 a1、a2、a3 叉乘点积算出单胞体积再按(N/(V·ρ*))^(1/dim)计算真正的缩放因子——这正是examples/melt/in.melt中lattice fcc 0.8442的来由对应 ρ* ≈ 0.8442 的 fcc 熔体。origin / orient / spacing把理想单胞搬进模拟盒子origin平移origin x y z指定单胞映射进盒子时的平移量取值为各方向晶格间距的小数0 x,y,z 1。二维模拟中origin的 z 值必须为 0.0源码在 src/lattice.cpp 校验。例如examples/PACKAGES/cnp/in.cnp中origin 0.01 0.01 0.01把 fcc 晶格整体微移以消除位错计算中的对称性。orient旋转orient dim i j k把晶格的某个晶向crystallographic direction整数三元组对齐到模拟盒子的某个坐标轴。例如orient x 2 1 0表示盒子 x 轴沿晶格 [210] 方向y、z 依此类推。三个晶向不必是单位矢量但必须相互正交且满足右手定则X×Y 指向 Z。二维模拟要求orientx、y 的第三分量为 0orientz 的第一、第二分量为 0src/lattice.cpp。需要特别留意上述晶向对齐的描述只对正交立方单胞二维即正方形严格成立。对于hcp、hex或 a1/a2/a3 非正交的custom晶格更正确的理解是把三个 orient 矢量当作一个 3×3 旋转矩阵作用在 a1、a2、a3 上将原单胞旋转到盒子中的新朝向。spacing直接设定晶格间距spacing dx dy dz直接设定三个方向的晶格间距三个值都必须非零二维模拟中 dz 用 1.0。这些值会被 scale 因子再乘一次因此spacing 1.0表示一个单胞边长与 scale 无关。当 LAMMPS 自动计算的间距在后续命令中不好用时典型如非正交或旋转晶格可以用它手工覆盖。custom 样式用 a1/a2/a3/basis 构造任意晶体custom是功能最强大的样式允许通过a1、a2、a3指定任意长度、可非正交倾斜平行六面体的单胞边矢量并用basis逐次向单胞添加基原子。basis的参数是分数坐标0.0 x,y,z 1.0二维模拟中任何基原子的 z 分数坐标必须为 0.0。基原子的位置矢量 x 是三个边矢量的线性组合x bx·a1 by·a2 bz·a3其中 bx、by、bz 就是basis关键字给出的三个值。默认情况下 a1、a2、a3 是三个正交单位矢量单位立方体的边。a1/a2/a3/basis关键字只能用于custom样式对其他样式使用会在 src/lattice.cpp 中被拒绝Invalid a1/a2/a3/basis option in lattice command for non-custom style。此外基原子坐标越界 0 或 1也会被逐项校验并报错。实战构造 Wurtzite纤锌矿CdSe 晶体文档给出了一个完整的 Wurtzite 晶体构造示例晶格常数近似 CdSe采用 √3×1 正交超胞x、y、z 方向分别沿 [1̄2̄30]、[10̄10]、[0001]variable a equal 4.34 variable b equal $a*sqrt(3.0) variable c equal $a*sqrt(8.0/3.0) variable third equal 1.0/3.0 variable five6 equal 5.0/6.0 lattice custom 1.0 a1 $b 0.0 0.0 a2 0.0 $a 0.0 a3 0.0 0.0 $c basis 0.0 0.0 0.0 basis 0.5 0.5 0.0 basis ${third} 0.0 0.5 basis ${five6} 0.5 0.5 basis 0.0 0.0 0.625 basis 0.5 0.5 0.625 basis ${third} 0.0 0.125 basis ${five6} 0.5 0.125 region myreg block 0 1 0 1 0 1 create_box 2 myreg create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2注意这里用了 8 个基原子4 个阳离子位 4 个阴离子位并在create_atoms中用basis 5 2等子选项把第 5~8 号基原子指定为类型 2从而在一个晶格上生成两种原子——这正是 create_atoms 支持不同基原子配不同原子类型能力的体现对应 src/create_atoms.cpp 中basistype[]数组的按基原子类型映射逻辑。类似的custom用法还可见于 examples/ASPHERE/flat_membrane/in.flat_membrane它用custom加两个基原子构造椭圆体薄膜的斜方单胞以及 examples/ELASTIC_T/BORN_MATRIX/Silicon/init.in用custom加 8 个基原子构造金刚石硅。triclinic/general一般三斜晶格支持triclinic/general选项声明晶格用于一般三斜general triclinic模拟盒子区别于正交盒或受限三斜盒restricted triclinic三类盒子的完整说明见 Howto_triclinic。使用约束如下src/lattice.cpp必须配合custom样式使用a1、a2、a3 必须是某个单胞的边矢量可任意但须非零、互不平行、不共面且构成右手系a1×a2 指向 a3 方向。左手系可以通过交换任意一对 a 矢量的顺序转为右手系二维模拟中 a3 必须为 (0.0, 0.0, 1.0)即默认值origin与orient必须保持默认值origin (0,0,0)orient 分别为 (100)、(010)、(001)。该选项的用途用户可能从固态晶体学表示或 DFT 代码导入数据LAMMPS 为此提供了直接按 a1/a2/a3 定义一般三斜晶格的便利。但正如 Howto_triclinic 所说明的LAMMPS 内部只使用受限三斜模拟盒子当create_box与create_atoms被调用时盒子和逐原子信息坐标、速度等都会从一般三斜形式转换到受限三斜形式源码中通过domain-general_to_restricted_rotation()完成见 src/lattice.cpp其他任何使用本命令晶格间距的命令如region也都作用于受限三斜盒子。create_box可用带triclinic/general的晶格生成各方向按 a1/a2/a3 单胞复制、三个盒子边矢量任意的一般三斜盒create_atoms同样要求带该选项的晶格才能把原子或分子放到 a1/a2/a3 与基原子定义的格点上。晶格间距的自动计算与 units lattice多个 LAMMPS 命令支持units lattice选项即把 x,y,z 方向的晶格间距当作距离单位。例如region命令可以创建 10x20x20 的块其中 10 表示 x 方向的 10 个晶格间距。值得注意的是尽管名叫晶格间距所有带units lattice选项的命令其实只是把这三个值当作 units 定义的距离单位的缩放因子——因此如果你不喜欢 LAMMPS 算出的间距例如非正交或旋转单胞完全可以用spacing选项改成你想要的值。不指定spacing时间距的自动计算流程对应 src/lattice.cpp 的bbox()遍历把单胞映射进模拟盒子缩放 旋转得到可能改变大小与朝向的单胞取变换后单胞 8 个角点二维为 4 个x 坐标的 min/max 之差作为 X 方向晶格间距Y、Z 同理。如果指定了triclinic/general单胞先被转换到受限三斜朝向一次旋转操作再按上述流程求 8 角点的 min/max 范围确定间距——因为其他命令使用的间距总是针对受限三斜盒。若单胞正交且边与坐标轴对齐未通过orient旋转各方向间距就是 scale 乘以对应 a1/a2/a3 的长度。例如 scale 3.0 Å 的hex晶格x 方向间距为 3.0y 方向为 3·√3。需要警惕的坑对非正交单胞或施加了orient旋转的情况LAMMPS 算出的间距通常不那么直观且不保证某个方向的间距是该方向晶格周期的整数倍。因此如果你在某个维度上创建一个边长是晶格间距整数倍的正交周期盒再用create_atoms填满原子得到的不一定是周期系统——盒子面处的原子可能错误重叠。每次使用lattice命令LAMMPS 都会把计算出的间距打印到日志中Lattice spacing in x,y,z ...见 src/lattice.cpp便于你在后续命令中核对间距的实际数值。坐标系变换的底层原理lattice命令内部维护了晶格坐标与盒子坐标之间的双向变换矩阵全部由 src/lattice.cpp 实现setup_transform()构造 3×3 的primitive矩阵a1/a2/a3 按列排布及其逆矩阵priminv再把归一化的 orient 矢量分别按行rotaterow和按列rotatecol排成旋转矩阵lattice2box()完成晶格坐标 → 盒子坐标xyz_box Rotate_row · scale · P · xyz_lattice offset其中 offset (xlattice·origin[0], ylattice·origin[1], zlattice·origin[2])box2lattice()完成逆向变换P_inv · 1/scale · Rotate_col · (xyz_box − offset)。create_atoms在把原子放到格点上时正是调用这套变换src/create_atoms.cpp 用xlattice/ylattice/zlattice缩放units lattice尺寸。此外构造阶段还有一系列几何合法性校验src/lattice.cpp无基原子No basis atoms in lattice、orient 矢量不正交、不满足右手定则、primitive 矢量共线Lattice primitive vectors are collinear都会直接报错终止。多晶与旋转晶格实战部分位错 Cu 晶体的构造examples/PACKAGES/cnp/in.cnp 是 fcc 铜中部分位错partial dislocation生成的经典示例展示了lattice三个变换参数的联合使用units metal boundary p p p atom_style atomic lattice fcc 3.615 origin 0.01 0.01 0.01 orient x -1 -1 2 orient y 1 1 1 orient z -1 1 0 region mdbox block 0 3 0.0 14.0 0 84 units lattice region system block 0 3 1.1 13.1 0 84 units lattice create_box 2 mdbox create_atoms 1 region system mass * 63.54 pair_style eam/alloy pair_coeff * * Cu_mishin1.eam.alloy Cu Cu这里的orient把晶格 [2̄11]、[111]、[1̄10] 方向分别旋转到盒子 x、y、z 轴三者满足右手定则region使用units lattice让盒子尺寸直接以晶格间距为单位表达最终在一个倾斜取向的 fcc 铜单胞中造出含位错的模拟体系。与之形成对照的是 examples/PACKAGES/basal/in.basal它用custom样式加 4 个基原子、再配三组orient构造了六方密排基面取向的晶体。限制、相关命令与默认值限制a1/a2/a3/basis关键字只能用于custom样式triclinic/general也必须配custom使用。相关命令dimension、create_atoms、region以及配套的 create_box、units、velocity 与 Howto_triclinic。默认值系统默认lattice none 1.0。其他样式的选项默认值为origin 0.0 0.0 0.0orient x 1 0 0、y 0 1 0、z 0 0 1a1 1 0 0、a2 0 1 0、a3 0 0 1对应 src/lattice.cpp 中的初始化代码。小结lattice命令是 LAMMPS 一切按晶格造原子工作流的起点内置样式覆盖了常见晶体结构custom加a1/a2/a3/basis覆盖了任意晶体学单胞scale/origin/orient/spacing控制单胞到盒子的缩放、平移、旋转与间距覆盖triclinic/general打通了与 DFT/晶体学数据的一般三斜对接。理解其单胞-盒子坐标变换src/lattice.cpp与units lattice间距语义能让你在构建多晶、位错、薄膜、超胞等体系时少走弯路并规避非正交/旋转晶格下非周期填充的隐患。赞分享科研科学计算高性能计算【免费下载链接】lammpsPublic development project of the LAMMPS MD software package项目地址https://gitcode.com/gh_mirrors/la/lammps点击查看免费下载相关推荐MKS Monster8 8轴主板完整配置实战30分钟搞定接线、固件刷写与调优MKS Monster8 8轴主板完整配置实战30分钟搞定接线、固件刷写与调优 主板明明通了电电机却像没睡醒一样狂抖驱动也装好了屏幕上却永远显示高温警科研科学计算高性能计算LAMMPS 多副本模拟Multi-Replica完全指南原理、命令与实战LAMMPS 多副本模拟Multi Replica完全指南原理、命令与实战 多副本模拟Multi replica simulation是 LAMMPS科研科学计算高性能计算LAMMPS compute property/grid 命令完全指南分布式网格的 ID、索引与坐标输出LAMMPS compute property/grid 命令完全指南分布式网格的 ID、索引与坐标输出 导读 compute property/grid科研科学计算高性能计算上一篇Redoc错误处理机制详解提升文档可靠性的策略下一篇CANN/ge LLM-DataDist初始化接口创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑