字数 2005,阅读大约需 11 分钟
《Extending and Modifying LAMMPS》前八章总结
这本书是Lammps的核心开发者之一写的源码级阅读和修改,对于学习Lammps的使用和修改大有裨益。
本书核心目标:零基础教会读者修改/编写LAMMPS源码,实现自定义分子动力学模拟功能,面向有LAMMPS使用基础、无/少源码修改经验的研究者与学生。
第1章 MD理论与模拟实践
核心内容
1. 分子动力学(MD)基础理论 • 基于牛顿经典力学,模拟原子/粒子轨迹演化,核心公式:、(力为势能负梯度)。 • 粒子运动:平动+刚体转动,转动通过力矩→角动量→角速度迭代更新。 • 温度与麦克斯韦-玻尔兹曼分布:粒子速度服从高斯分布,温度决定分布形态。 2. 核心迭代算法 • Velocity Verlet算法:分两步更新位置与速度,小时间步(飞秒级)保证能量守恒,是LAMMPS默认积分器。 3. MD模拟关键技术 • 势能截断:超过截断半径的原子相互作用设为0,减少计算量。 • 周期性边界条件:模拟盒无限复制,消除边界效应,需满足最小镜像约定。 • 邻域列表:仅计算截断半径内原子,皮肤宽度优化列表重建频率。 • 并行通信:空间分解+幽灵原子(ghost atoms),实现多核并行计算。
本章价值
建立MD物理基础,理解LAMMPS源码实现的底层物理逻辑。
第2章 LAMMPS语法与源码层级
核心内容
1. LAMMPS输入脚本结构 • 四大模块:初始化设置→系统定义→模拟设置→模拟执行,逐行解析执行。 • 核心命令: units/boundary(初始化)、create_box/create_atoms(建模)、pair_style/fix(相互作用/控场)、run(执行)。2. 源码仓库与文件结构 • 源码存于 src文件夹,以.cpp/.h成对文件实现功能,大写文件夹为可选包。• 编译后可执行文件,调用源码解析脚本、执行模拟。 3. 源码层级与顶级类 • 顶层类: lammps.cpp(启动LAMMPS)、main.cpp(主入口)。• 核心功能类: • memory.cpp:内存管理;error.cpp:报错/警告;• input.cpp:解析输入命令;atom.cpp:存储原子属性;• neighbor.cpp:构建邻域列表;force.cpp:计算相互作用力。4. 三大核心Style(父类) • Pair(对势)、Compute(计算量)、Fix(控场/修正),子类继承实现具体功能。
本章价值
理清LAMMPS“脚本→源码”的调用关系,掌握源码核心目录与顶级类作用。
第3章 源码结构与执行阶段
核心内容
1. 父类与子类继承 • fix.cpp/h:所有Fix的父类,解析fix ID/组/类型,子类继承实现自定义修正。• pair.cpp/h:所有对势的父类,处理系数混合、截断、邻域列表请求。• compute.cpp/h:所有Compute的父类,解析compute ID/组/类型。2. 模拟执行阶段(单时间步) • 以Verlet积分器为核心,按固定顺序执行方法: initial_integrate→pre_exchange→neighbor build→compute→post_force→final_integrate→end_of_step。• 最小化(min.cpp):非时间步迭代,调用专属方法。 3. 关键工具类 • pointers.h:指针类,实现全代码数据共享(原子、力、邻域列表等)。• input.cpp:解析输入命令首词,匹配源码方法,无匹配则报错。
本章价值
掌握LAMMPS源码执行流程与继承机制,明确自定义功能的代码插入位置。
第4章 变量、数组与方法的信息访问
核心内容
1. 原子属性访问 • 通过 atom->x/v/f访问原子位置、速度、力(二维数组);atom->type/mass访问原子类型/质量。• 全局索引vs局部索引:并行计算中,局部索引为当前核心的原子编号,需通过 atom->map()转换。2. 邻域列表调用 • 用 neighbor->request()请求列表,通过list->inum/ilist/firstneigh遍历邻居原子。3. 物理常数与输入参数读取 • 物理常数(玻尔兹曼常数、单位转换): force->boltz/mvv2e自动匹配单位。• 输入参数解析: force->numeric()(浮点数)、force->inumeric()(整数)、force->bounds()(原子类型范围)。4. 自定义数据类型 • lmptype.h定义tagint/bigint,适配超大模拟体系的原子数/时间步。
本章价值
学会直接读取/修改LAMMPS核心数据,是自定义源码的基础操作。
第5章 理解对势(Pair Styles)
核心内容
1. 对势通用结构 • 核心方法: • allocate():分配数组内存;• settings():读取全局参数(pair_style后参数);• coeff():读取原子对参数(pair_coeff后参数);• init_one():初始化势参数;• compute():计算原子对作用力与势能;• single():返回单对原子势能。2. 典型对势解析 • Morse势:共价键作用,实现势能公式、力梯度计算,支持偏移修正。 • 表格势:从文件读取势/力数据,插值计算,适配复杂自定义势。 • DPD势:耗散粒子动力学,包含保守力+耗散力+随机力,兼容热浴。
本章价值
掌握自定义对势的完整流程,可修改/编写专属原子相互作用势。
第6章 理解计算量(Computes)
核心内容
1. Compute通用结构 • 核心方法: init()初始化、compute_scalar()(标量输出)、compute_vector()(矢量输出)、compute_array()(数组输出)。• 功能:计算模拟中无法直接获取的物理量,不修改原子状态。 2. 典型Compute解析 • compute ke:计算原子组动能,遍历原子速度求和,MPI多核心汇总。• compute group/group:计算两组原子间相互作用能/力。• compute rdf:计算径向分布函数,分箱统计原子分布、归一化处理。• compute heat/flux:计算热流,调用其他compute获取动能/势能/应力。
本章价值
学会自定义物理量计算,满足科研中特殊物理量的输出需求。
第7章 理解修正(Fixes)
核心内容
1. Fix通用结构 • 核心: setmask()指定执行阶段(决定Fix在时间步中何时运行),是自定义Fix的关键。• 功能:修改原子状态、控温/控压、施加外力、输出信息等。 2. 典型Fix解析 • fix addforce:施加自定义外力,支持常量/变量力,执行于post_force阶段。• fix nve:NVE系综,实现Velocity Verlet积分,分两步更新位置/速度。• fix nh:Nose-Hoover热浴/压浴,控温/控压,继承NVE实现NVT/NPT。• fix print:定时输出信息,执行于end_of_step阶段。• fix wall:壁面作用,实现LJ/ Morse壁面,垂直壁面施加作用力。• fix rigid:刚体模拟,计算质心运动+转动,更新刚体内部原子位置/速度。
本章价值
掌握自定义Fix的核心方法,实现控场、外力、刚体等自定义模拟控制。
第8章 探索辅助类
核心内容
1. Group类(group.cpp) • 按类型/区域/逻辑(并集/交集)分组原子,位运算标记原子,支持计数、边界计算。 2. Variable类(variable.cpp) • 定义变量:常量、公式、组/原子属性调用,分 equal(标量)、atom(原子级)样式。3. Error类(error.cpp) • 报错: all()(全局终止)、one()(单核心报错)、warning()(警告)。4. Memory类(memory.cpp) • 内存管理:创建/销毁多维数组,避免内存泄漏。 5. Angle/angle/harmonic类 • 键角势父类与谐波子类,计算键角相互作用力,与对势逻辑一致。
本章价值
理解LAMMPS辅助功能类,完善自定义源码的配套功能(分组、变量、报错、内存)。
前八章整体总结
前八章完成从MD理论→LAMMPS语法→源码结构→三大核心Style(Pair/Compute/Fix)→辅助类的全覆盖,形成完整知识链:
1. 底层:MD物理原理+并行计算逻辑; 2. 中层:LAMMPS源码架构、数据访问、执行流程; 3. 上层:自定义对势、计算量、修正的实操方法+辅助类支持。
最终目标:读者可独立编写/修改LAMMPS源码,实现完全自定义的分子动力学模拟。
夜雨聆风