- 科研
- 科学计算
- 高性能计算
【免费下载链接】lammps
Public development project of the LAMMPS MD software package
导读
fix lb/viscous是 LAMMPS LATBOLTZ 包中与fix lb/fluid配套的核心命令:当系统中存在显式格子玻尔兹曼(Lattice-Boltzmann,LB)流体时,它负责把流体对粒子的水动力反作用力施加到 MD 粒子上,使粒子"随流体漂移",等效于一个流体被显式建模的 Langevin 恒温器。本文结合 fix_lb_viscous 官方文档、fix_lb_fluid 文档 与 源码实现,讲解其语法、底层力计算、与积分器/热噪声的配合方式,并通过 LATBOLTZ 包自带的微流变、拖曳、聚合物易位等示例给出可直接运行的实战配置。
命令定位:LATBOLTZ 包与显式 LB 流体
LATBOLTZ 包在 LAMMPS 中实现了一个覆盖整个模拟域的背景格子玻尔兹曼流体,用于模拟受水动力影响的 MD 粒子。该包位于 src/LATBOLTZ,共提供三个 fix(见 src/LATBOLTZ/README):
| 文件 | 命令 | 职责 |
|---|---|---|
| fix_lb_fluid.cpp | fix lb/fluid | 在网格上创建并演化 LB 流体,接收粒子对流体施加的力 |
| fix_lb_viscous.cpp | fix lb/viscous | 把流体的水动力反作用力施加到粒子上 |
| fix_lb_momentum.cpp | fix lb/momentum | 周期性清零系统(粒子+流体)总动量 |
根据 Packages_details.rst,LATBOLTZ 包由 University of Western Ontario 的 Frances Mackay 与 Colin Denniston 开发,要求 LAMMPS 以 MPI 并行模式构建——fix_lb_fluid.h中通过#error "The LATBOLTZ package cannot be compiled in serial with MPI STUBS"强制了这一约束,因此不能使用串行 Makefile 编译。
关键的一点是:fix lb/fluid只计算粒子施加给流体的力,本身并不把流体对粒子的水动力反作用力加回粒子(详见 fix_lb_fluid 文档 中的 note)。如果只使用fix lb/fluid而不搭配fix lb/viscous,物理上等价于"一个质量无穷大的粒子穿过流体"——因为粒子与流体的碰撞不会改变粒子速度。fix lb/viscous正是唯一负责把水动力(hydrodynamic)力写入粒子总受力的途径。
语法与示例
fix lb/viscous的语法极为简洁,没有任何额外参数:
fix ID group-ID lb/viscousID、group-ID的语义与所有 fix 命令 一致;lb/viscous是该 fix 的风格名。
官方示例:
fix 1 flow lb/viscous由于 LATBOLTZ 包的多个实例脚本都直接沿用了这一写法,例如 microrheology/in.microrheology、translocation/in.translocation、dragforce/in.dragtest,实际使用中最常见的形态是:
fix 2 FluidAtoms lb/viscous即把 fix 施加到"与流体相互作用的粒子组"(例如胶体颗粒表面的壳层原子FluidAtoms)上。
工作原理:拖曳力与质量因子
与 fix viscous 的关系
官方文档明确指出,fix lb/viscous与 fix viscous 类似,但只能在通过fix lb/fluid创建了 LB 流体的系统中使用,并替代fix viscous。fix viscous施加的阻尼力是F_i = -γ·v_i(γ 由用户直接给定,量纲为力/速度),而fix lb/viscous无需用户指定任何阻尼系数——流体速度场、局部流体质量和力耦合常数全部由fix lb/fluid在内部计算完成。
底层力计算(源码视角)
从 fix_lb_viscous.cpp 的post_force()可以看出核心逻辑:
double **f = atom->f; double *massp = fix_lb_fluid->massp; double **hydroF = fix_lb_fluid->hydroF; if (rmass) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { massfactor = rmass[i] / (rmass[i] + massp[i]); f[i][0] = hydroF[i][0] + massfactor * f[i][0]; f[i][1] = hydroF[i][1] + massfactor * f[i][1]; f[i][2] = hydroF[i][2] + massfactor * f[i][2]; } }即每个原子的最终受力为:
F_total = F_hydrodynamic + (m_particle / (m_particle + m_fluid_local)) · F_other其中:
hydroF[i]是fix lb/fluid内部计算并保存的水动力力(源自在 fix_lb_fluid.cpp 中由F_jα = γ(v_n - u_f)ζ反演得到的粒子所受流体作用力,单位为 LAMMPS 单位);massp[i]是该粒子所耦合的代表性流体质量m_u(在 fix_lb_fluid.cpp 中由mnode * dm_lb换算得到);massfactor用于把粒子原有的其他受力(如成键、硬球排斥)按质量比拆分,一部分留给粒子、一部分传给流体,保证"粒子+所耦合流体"系统的动量守恒。
这一设计的物理含义是:fix lb/fluid内部按公式
γ = (2·m_u·m_v) / (m_u + m_v) · (1/Δt)计算力耦合常数(见 fix_lb_fluid 文档),使粒子与其周围流体在时间步末速度一致——类似约束(如 SHAKE)会扣除部分自由度,这些自由度在算法内部被自动计入。fix lb/viscous在POST_FORCE阶段把流体反力合入粒子总力,随后由任何内置积分器完成粒子运动积分。
力方向的直观理解
官方文档将该 fix 的作用概括为:"对每个原子施加粘性力,使其随流体以相同速度运动"——流体对粒子的拖曳力方向与粒-流相对速度相反(v_n - u_f),这正是"无滑移 Stokes 拖曳"的离散实现;而等大反向的力通过fix lb/fluid施加到流体的对应网格点上(源码中以Ffull[k]通过插值权重TfP[isten]分布回流体网格,见 fix_lb_fluid.cpp),从而构成粒子-流体的双向动量交换。
与 fix lb/fluid 的配合:显式流体的"Langevin 等效"
fix lb/viscous必须与fix lb/fluid成对使用。当fix lb/fluid指定了noise选项(热 LB 算法,基于 Adhikari 等人的 fluctuating lattice Boltzmann 方法)时,流体自带涨落,粒子在受到拖曳力的同时还会感受到随机碰撞力,从而被热化到与流体相同的温度。官方文档给出的等价关系是:
fix lb/viscous+fix lb/fluid+ 内置积分器(如fix nve或fix rigid)≈fix langevin(但此处流体是显式的)
差异在于:普通fix langevin中的随机力与阻尼项全部来自隐式溶剂模型;而 LATBOLTZ 方案中,能量注入与耗散均来自真实演化的流体场,因此可以自然再现布朗运动、流体力学相互作用(HI)与流动场耦合等效应。
粒子的温度可以通过fix lb/fluid输出的全局标量监测(f_ID可被thermo_style等输出命令访问)。该标量是"粒子组 + 与之约束共同运动的流体"的当前温度,由动能和内部计算的总自由度得出。若粒子还受额外约束(例如用fix rigid刚性积分),被约束扣除的自由度不会自动计入,此时需通过fix lb/fluid的dof关键字手动指定自由度总数。此外fix lb/fluid还输出一个含 5 项的全局数组:第 1 项为流体温度,第 2 项为流体+粒子总质量,第 3~5 项为总动量三分量,均可用于输出与守恒量监控。
实战配置:基于官方示例的完整用法
LATBOLTZ 包在 examples/PACKAGES/latboltz 下提供了 9 组示例(microrheology、translocation、polymer、diffusingsphere、confined_colloid、dragforce、pit_geometry、planewall、toycar),全部以fix lb/viscous作为水动力反馈环节。以下提炼三种典型模式。
模式一:微流变学——刚性胶体在热流体中布朗运动
microrheology/in.microrheology 模拟两个胶体颗粒在水中的布朗运动,其核心配置为:
units nano dimension 3 boundary p p p atom_style molecular neighbor 0.3 bin neigh_modify delay 0 every 1 comm_modify cutoff 2.5 # 通信截断至少为 2 dx pair_style lj/cut 5.88 pair_coeff * * 0.0 0.0 5.88 pair_coeff 1 1 100.0 5.238484463 5.88 pair_modify shift yes mass * 0.0002398 timestep 0.00025 group ForceAtoms type 1 # 胶体中心:不直接与流体作用,负责硬球势 group FluidAtoms type 2 # 胶体表面壳层:与流体作用 fix 1 FluidAtoms lb/fluid 1 1.0 0.0009982071 dx 1.2 stencil 2 noise 300.0 2762 fix 2 FluidAtoms lb/viscous fix 3 all rigid molecule fix 4 all lb/momentum 50000 linear 1 1 1 run 2000要点:
- 注释中明确说明
fix lb/fluid只计算"粒子对流体"的力,反作用力必须由fix lb/viscous完成(脚本注释原文:"this is accomplished through the use of the lb/viscous fix"); - 水的参数取
viscosity=1.0、density=0.0009982071、dx=1.2; stencil 2使用三线性插值模板(支撑 8 个格点,默认选项,适合贴近壁面/其他物体的场景);noise 300.0 2762启用 300 K 热 LB 流体,使粒子获得布朗运动;- 胶体作为刚性分子整体运动(
fix 3 all rigid molecule),每 50000 步用fix lb/momentum清零系统总动量以防止数值误差积累; - 邻居列表须满足
delay 0 every 1且 bin 尺寸小于 LB 网格间距,保证粒子始终处于其所属处理器的 LB 网格内(否则报错终止)。
模式二:拖曳测试——外力驱动下测量水动力阻力
dragforce/in.dragtest 以恒定外力拖拽胶体粒子穿过 LB 流体,用于拖曳系数(drag)测试:
fix drag all addforce ${node_force} v_oscillateY v_oscillateZ # 外力须在 lb/fluid、lb/viscous 之前定义 fix FL all lb/fluid 1 1.0 0.0009982071 stencil ${stpts} dx 1.2 fix 2 all lb/viscous fix 3 all nve # 单节点粒子用 NVE;多节点复合粒子用 rigid脚本通过变量stpts(2/3/4)可切换三线性、3 点浸没边界(IBM,支撑 27 格点)与 4 点 Keys' 插值(支撑 64 格点)模板,目录下的多个log.*文件即对应不同插值模板的对照输出。值得注意的是脚本注释强调:外部驱动力(addforce)必须定义在lb/fluid与lb/viscous之前,以保证力施加顺序符合 LATBOLTZ 的内部约定。
模式三:易位/受限流动——scaleGamma 设定"无限质量"粒子
translocation/in.translocation 模拟粗粒化聚合物在压差驱动流中穿过固态纳米孔:
fix 1 FluidAtoms lb/fluid 1 0.1 0.00009982071 dx 1.0 scaleGamma 3 -1 stencil 2 pressurebcx 1200 noise 300.0 5252 fix 2 FluidAtoms lb/viscous fix 3 Polymer rigid/small molecule fix freeze WallAtoms setforce 0 0 0这里scaleGamma 3 -1将第 3 类原子(孔壁原子,被setforce冻结)的力耦合常数 γ 置为 -1,从而在 fix_lb_fluid.cpp 中走Gamma[type[i]] < 0分支——进入"粒子静止/指定运动、质量趋向无穷"的极限:流体仍感受到来自壁面的阻力,但粒子的hydroF被置零(hydroF[i][k] = 0.0),这正是官方文档所述"无限质量粒子"极限的显式实现。同时pressurebcx 1200在 x 方向施加压力跳变驱动流动,noise提供温度涨落。
模式四:流体驱动刚体("玩具车"演示)
toycar/in.toycar 以 cgs 单位构建一辆由圆柱、棱柱拼装而成的"玩具车",在fix FL all lb/fluid ... zwall_velocity 0 0创建的流体中行驶:
fix FL all lb/fluid 1 0.0002 ${density} stencil 2 dx ${dx} zwall_velocity 0 0 fix 2 all lb/viscous fix 4 not_wheels nve fix 3 wheels rigid group 4 gcylinder1 gcylinder2 gcylinder3 gcylinder4 ...zwall_velocity 0 0给 z 方向上下壁面指定 y 向速度(需boundary p p f固定壁面边界);lb/viscous施加于全部原子(all),轮子按刚性组积分、其余部件 NVE 积分,是"流动场驱动复杂形状刚体"的直观展示。
重启、输出与能量最小化行为
fix lb/viscous本身不产生任何重启或输出量,其行为与fix viscous完全一致(见 fix_viscous 文档 的对应小节):
- 重启:不向二进制重启文件写入任何信息(
fix lb/fluid的流体数据可经其write_restart/read_restart关键字独立保存,但与主 LAMMPS 重启文件互不关联); - fix_modify:所有选项均不适用;
- 输出:不存储全局或每原子量;温度监测请使用
fix lb/fluid的标量输出; - run start/stop:不支持;
- 能量最小化:
min_post_force()会调用post_force()(见 fix_lb_viscous.cpp),即最小化时该 fix 的力依然生效,但只能配合允许非保守力的阻尼动力学最小化器使用(如 damped dynamics 类的min_style),详见 min_style 文档。
从源码看,该 fix 通过setmask()注册了POST_FORCE、POST_FORCE_RESPA与MIN_POST_FORCE三个钩子(fix_lb_viscous.cpp),因此同时支持 Verlet 积分、r-RESPA 多时间步积分(post_force_respa仅在最外层 level 生效,见 fix_lb_viscous.cpp)与最小化流程。
使用限制与构建前提
- 包依赖:属于 LATBOLTZ 包,必须启用该包并完成 MPI 构建(
-D PKG_LATBOLTZ=on,或make yes-latboltz),详见 Build package 文档 与 Packages_details.rst; - 顺序约束:必须在
fix lb/fluid之后定义(构造时即通过modify->get_fix_by_style("lb/fluid")查找 LB 流体,找不到则直接报错,见 fix_lb_viscous.cpp); - 组约束:
lb/viscous组内的原子必须同时属于fix lb/fluid的组,否则构造时报错"Atoms must be in the fix lb/fluid group to apply a fluid force to them"(fix_lb_viscous.cpp)——这也是各示例中两个 fix 使用同一组名(如FluidAtoms)的原因; - 区域约束:
fix lb/fluid只能用于正交模拟域,边界条件仅支持p p p、p p f、p f f三种一致组合,shrunk-wrapped 边界不允许(见 fix_lb_fluid 文档); - 积分器:必须搭配内置积分器(
fix nve或fix rigid等)使用,lb/viscous本身不积分粒子运动。
相关命令与引用文献
- 相关命令:fix lb/fluid、fix lb/momentum、fix viscous、fix langevin、fix nve、fix rigid;
- 源码:LATBOLTZ 包实现见 src/LATBOLTZ,包级说明见 src/LATBOLTZ/README;
- 示例:完整可运行脚本见 examples/PACKAGES/latboltz,各目录附带对应 log 输出可供对照验证;
- 算法细节与测试结果请参阅官方文档引用的文献:Denniston, C., Afrasiabian, N., Cole-Andre, M.G., Mackay, F. E., Ollila, S.T.T., and Whitehead, T., "LAMMPS lb/fluid fix version 2: Improved Hydrodynamic Forces Implemented into LAMMPS through a lattice-Boltzmann fluid", Computer Physics Communications 275 (2022) 108318(若在发表的研究工作中使用该 fix,请按此引用);流体-粒子保守力耦合细节可参见 Mackay, F. E., and Denniston, C., J. Comput. Phys. 237 (2013) 289-298;热(fluctuating)LB 算法参见 Adhikari, R., Stratford, K., Cates, M. E., and Wagner, A. J., Europhys. Lett. 71 (2005) 473-479。
- 科研
- 科学计算
- 高性能计算
【免费下载链接】lammps
Public development project of the LAMMPS MD software package
相关推荐
LAMMPS 中的 fix lb/momentum:消除含格子玻尔兹曼流体体系的系统线性动量漂移
LAMMPS 中的 fix lb/momentum:消除含格子玻尔兹曼流体体系的系统线性动量漂移 导读 fix lb/momentum 是 LAMMPS LAT
科研科学计算高性能计算Jellyfin Media Player:强大的跨平台媒体播放解决方案
Jellyfin Media Player:强大的跨平台媒体播放解决方案 Jellyfin Media Player 是一款基于 Jellyfin web 界面
高性能计算科学计算LAMMPS `fix nvt/body` 命令详解:体粒子(body particle)的 Nose/Hoover 恒温 NVT 集成
LAMMPS fix nvt/body 命令详解:体粒子(body particle)的 Nose/Hoover 恒温 NVT 集成 本文基于 LAMMPS 官
科研科学计算高性能计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考