“Given for one instant an intelligence which could comprehend all the forces by which nature is animated and the respective positions of the beings which compose it, if moreover this intelligence were vast enough to submit these data to analysis, it would embrace in the same formula both the movements of the largest bodies in the universe and those of the lightest atom; to it nothing would be uncertain, and the future as the past would be present to its eye.” – 拉普拉斯(Pierre-Simon Laplace)
eMD用户手册–参数配置
概要
eMD有两种使用方式:可执行文件emdrun调用和python3 emd包调用。
eMD的配置参数为JSON格式,emdrun使用JSON文件输入,而Python emd使用jsoncpp库的Value值输入。在Tcl扩展使用时直接使用{}定义的JSON字符串内容。
JSON参数中可以包含其他子文件,include关键字导入JSON子文件;而import关键字导入非JSON格式文件,如PDB、XYZ、PSF和Lammps data文件。配置参数需要符合JSON语法(变量替换之后),最好使用带JSON语法高亮的编辑器,如Code编辑器。也可以使用在线编辑器:https://jsoneditoronline.org 或者 https://www.jsonformatter.io 。我们推荐使用eMD配置专用JSON编辑器。
eMD配置参数分七大模块:
- comm 并行通讯
- context 上下文
- particles 粒子体系
- force_field 力场参数
- mechanics 力学模型
- sample 数值统计和轨迹抽样
- variable 变量替换
其中comm、context和variable模块为依据应用的可选模块。
comm 通讯配置
配置空间区域划分并行计算和副本交换模拟(REMD)。基本的调用格式为
comm模块主要在REMD模拟中。-
partition参数用在REMD模拟中,需要进行MPI通讯域的再次划分,一个副本(replica)对应一个world。默认每个world有一部分rank组成,且按顺序指派factor列表中的一个参数。如在常见的温度副本交换时,factor给出交换的温度列表。 -
world参数给出具体的MPI通讯划分方式,wxn**格式参数表示添加w个world,每个world中的rank进程数为n。单一的**n**格式表示添加一个world,其rank进程数为**n。world参数中指定的world数目应该和factor指定的因子数一致。 -
cutghost参数和REMD模拟不相关,它是用来指定空间划分并行计算时,获取ghost原子的边距大小,eMD一般自动计算这个值,如果这个值较小,就需要用户指定一个边距。该参数对应LAMMPS的comm_modify cutoff命令。参考chain/chain_ext.json例子。
context 上下文配置
配置log输出和GPU设备调用。基本的调用格式为
logfile支持特殊字符的格式化,以实现不同的模拟参数生成不同的配置文件名。
当前支持的格式化字符有:
- %p : 进程号 pid
- %w : MPI通讯域iworld,默认为只有一个通讯域,编号为0。在REMD模拟时会有多个通讯域。
- %W : MPI通讯域个数nworlds,默认为1,在REMD模拟时会有多个通讯域。
- %n : MPI通讯域中的计算节点数(不同名称节点的数)
- %r : MPI通讯域中的rank编号 rank in iworld
- %R : MPI通讯域中的rank总数 ranks in iworld
- %u : MPI全局通讯域中的rank编号 rank in universe
- %U : MPI全局通讯域中的rank总数 ranks in universe
非REMD模拟时,iworld=0的通讯域即为universe。
举例:"logfile" : "emd_gpu_w%wr%r_${beta}.log"
使用iworld和rank值来格式化log文件名,同时使用了变量${beta}的替换值。关于变量替换可阅读**variable 变量替换**这节的说明。
-
logrank选择MPI rank中那些进行log输出,默认为rank=0的MPI 进程输出log,当有多个ranks并行计算模拟时,可选择多个rank输出log信息,编号从0开始。每个rank输出的log信息表示该rank本身的信息。各个rank执行有差异会在log输出中查找。 举例:”logrank”:[0,4] 指定MPI rank=0和rank=4的进程输出log信息。默认输出到标志输出,因此在多个rank输出log时,建议设置logfile关键字输出的文件中,并且使用格式化字符区分不同的文件名。 -
loglevel表示log的警告输出级别,支持三种级别:silent,summary和verbose,分别对于1、2和3级。默认为2级。数值越高,级别越高,log中输出警告信息可能性越大。 在loglevel参数未设置的情况下,也可以在环境变量EMD_LOG_LEVEL中设置默认的警告输出级别。 如export EMD_LOG_LEVEL=2 loglevel主要控制代码中log_warning(level, …)宏函数的警告信息是否输出。 -
use_gpu在GPU加速模拟中,设置每个计算节点中,选择哪几块GPU卡来进行加速。编号从0开始,代表第一块GPU卡,最大值为n-1,其中n为计算节点中所配置的GPU卡总数。 在GPU模式时,eMD的log会显示该块GPU的配置信息。只有给出了该字段,才能进入GPU加速模式。默认不给出为CPU模式。eMD的GPU模式中,多个MPI rank可以使用同一块GPU卡来加速,但每个rank最多只能使用一块GPU卡来加速。因此需要根据MPI的并行度,来合理选择加速的GPU卡。 举例::”logrank”:[0,1] 每个计算节点选择GPU编号为0和1的设备来进行eMD加速计算。
particles 粒子体系配置
配置模拟体系的粒子属性,包括坐标,拓扑结构和初始速度等信息。可以从子文件导入或者通过region/lattice自动生成晶格体系。基本的调用格式为
"particles" : {
"position" : {
"dim" : 3,
"boundary" : ["p","p","p" ],
"region" : {
"id" : "r1",
"type" : "block",
"args" : [0,3, 0,3, 0,3] ,
"lattice" : {
"units" : "lj",
"type" : "fcc",
"scale" : 0.8442 }
}
,
"basis_types" : [1, 1, 1, 1] }
,
"topology" : {
"atom_type" : [
{
"type" : "Kr",
"mass" : 1.0 }
] }
,
"velocity" : {
"type" : "create",
"rndseed" : 87287,
"temp" : 0.6,
"dist" : "uniform",
"loop" : "geom" }
}
boundary属性为边界条件设置,为3元素数组形式,单个字母
- p: periodic,表示周期性边界
- f: fixed,表示固定边界(原子跑出该边界程序将报错)
- s: shrink-wrapping, 表示伸缩边界,根据体系该侧面的自然宽度,自动伸缩该侧边界。
3个元素分别对应x、y和z维、若元素为单个字母表示两侧面都取同样的边界形式;若元素为双字母,则第一个字母表示下侧面,第二字母为上侧面。
velocity属性用于设置初始速度,初始速度可以通过”type”:”create”来产生满足目标温度的速度分布,也可以通过其list数组给定。另外”type”:”zero_momentum”可以用来清除质心点速度和角动量,属性选项linear表示线动量,angular表示角动量,两者相互独立,可同时设置。
- linear 选择清除线动量,bool类型,true为启用,默认为false;也可以指定清零的维度,取值为”x”, “y”和”z”组成的列表类型。
- angular,选择清除角动量,bool类型,true为启用,默认为false。
velocity中的zero_momentum设置只设置初始构象,如果需要在运行时清除质心点速度和角动量,需要在mechanics添加zero_momentum modifer。
eMD也支持从LAMMPS data文件中直接读入particles模块,包括poistion,topology和velocity三个字段(如果存在)。如
也支持从NAMD体系文件pdb、psf文件中分别读入position和topology信息。
"particles" : {
"position" : {
"boundary" : ["p","p","p" ],
"import" : "ubq_ws.pdb",
"type" : "pdb" }
,
"topology" : {
"import" : "ubq_ws.psf",
"type" : "psf" }
,
"velocity" : {
"type" : "create",
"rndseed" : 87287,
"temp" : 310,
"dist" : "uniform",
"loop" : "geom" }
}
reset属性用于初始化阶段原子属性的修改。常用在对data文件输入原子属性的修改。
过程分两步:首先选择需要修改的原子,其次对已选择的原子赋予新值。
存在五种select类型,分别为
- sel_atomtag str | [id-list] 通过原子的tag(或id)来选择,输入字符串通配或做id列表。
- sel_atomtype: str | [id-list] 通过原子的类型来选择,输入字符串通配或做id列表。
- sel_moltag: str | [id-list] 通过原子所属的分子tag(或id)来选择,输入字符串通配或做id列表。
- sel_mass: float | [float tolerance] 通过原子的质量来选择,可以指定质量误差范围,默认为0.01。
- sel_group: id 通过原子所属的group来选择,输入字符串id。
- sel_region: id 通过原子处在的region来选择,输入字符串id。
以上五种方式至少指定一个,可以多种组合,默认为集合”交”的选择方式,可以通过
union设置为true改为“并”选择。
通配符使用*表示,给定数值的上下界,最下界为1,存在5种可能的形式:
i= i 到 i,即单选i。*= nmin 到 nmax,即选择所有可能的。i*= i 到 nmax,*j= nmin 到 ji*j= i 到 j
赋值给原子的属性有:
- atom_type: int 原子类型值
- mass: float 原子质量值,注意:所选择的原子的所有类型对应的质量都将修改。
- charge: float 原子电荷值
- x: float 原子坐标x值
- y: float 原子坐标y值
- z: float 原子坐标z值
- vx: float 原子速度x值
- vy: float 原子速度y值
- vz: float 原子速度z值
- image: [nx, ny, nz] 原子镜像三个维度的周期数
- atom_type_fraction: [type fraction seed] 按fraction比例随机设置原子新类型为type,随机数种子为seed
- mol_tag: int 原子所在的分子id
- type_name: str 原子的类型名称,注意:所选择的原子的所有类型对应的类型名都将修改。
对应full类型的原子体系,还可以设置以下值
- atom_name: str原子名称
- res_id: int 原子残基id
- res_name: str 原子残基名
- seg_id: int 原子所在片段id
- seg_name: str 原子所在片段名
- chain_id: int 原子所在链id
- chain_name: str 原子所在链名
对应选择的原子,可以同时赋值多个属性值。reset可以是单个Object或者Object的数组列表形式。
举例
"particles" : {
"reset":[
{
"union":true,
"sel_group":"solvent",
"sel_region":"edge",
"atom_type":2,
"charge": 0.5
},
{
"sel_atomtype":"1*3",
"atom_type":2,
"vx": 0.5,
"vz": 0.5
},
{
"sel_group":"solvent",
"atom_type_fraction":[2, 0.5, 1239]
}
]
}
include属性用于包括JSON子文件,可以字符串类型或者字符串列表形式,表示包含的JSON配置文件的路径。
举例
{}包围内容。子文件中不再支持include指令。include首先搜索当前目录,指定的文件是否存在,如果不存在会在$EMD_SHARE变量指定的目录下搜索,EMD_SHARE变量可以通过环境变量设置,默认为安装目录下的share目录。include进来的Json会合并到原有的Json对象上,即插入新的值,如果子对象有重名的Object对象继续递归合并,保留重名的子对象为非Object对象,即上层有修改include中变量值的效果。include进来的内容为符合JSON格式的文本,会用原对象中的variable替换include中的变量。
include指令常用在引入共享的力场配置文件。
另外在particles和force_field对象中也定义了include,也支持变量替换,而且支持局部variable定义。
force_field 力场配置
配置力场参数,包括pair、neighbor、speical-pair、bond、angle、dihedral和improper等基于类型的力场参数设置。基本的调用格式为
"force_field" : {
"units" : "lj",
"type" : "lammps",
"pair" : {
"type" : "lj_cut",
"cutoff" : 2.5,
"shift" : 1,
"tail" : 0,
"coeff" : [
{
"itype" : 1,
"jtype" : 1,
"epsilon" : 1,
"sigma" : 1 }
]
} ,
"newton" : true,
"ghost_vel" : false,
"neighbor" : {
"every_step" : 6,
"skin" : 0.3,
"pair_search" : "nsq" }
}
mechanics 力学作用配置
配置模拟的力学方式,如速度Verlet的分子动力学模拟(mdvv)、副本交换的MDVV(remdvv)和最小化计算(min)等。可以通过相应的slots进行模拟的“修饰”和“调控”。基本的调用格式为
"mechanics" : {
"run_steps" : 1000000,
"init_steps" : 0,
"timestep" : 0.004,
"type" : "mdvv",
"thermo": "base",
"slots" : [
{
"type" : "temp_langevin",
"tstart" : 0.6,
"tstop" : 0.6,
"damp" : 10,
"seed" : 3434 } ,
{
"type" : "gce",
"scope" : "full",
"group" : "all",
"thermostat" : "temp_langevin",
"barostat" : null,
"bias_beta" : "$[beta]",
"bias_alpha" : 0.2,
"bias_he" : -5.6,
"normal" : true }
] }
1. 分子动力学 mdvv
在mdvv类型的Mechanics配置时,如果不包含如何slots设置,则为默认的NVE微正则系综模拟方式。 其他的系综实现是通过添加slot来实现的。如果添加温度耦合,压强耦合,采用GPU加速模式,当前支持的slot清单为
按功能分类
- 温度耦合器
temp_langevin朗之万动力学温度耦合方式temp_berendsenBerendsen温度耦合方式temp_velscale速度标度温度耦合方式- 压强耦合器
press_berendsenBerendsen压强耦合方式- 模拟体系控制
zero_momentum运行时线动量和角动量清除shake原子键长的SHAKE位置约束rattle原子键长的SHAKE位置约束同时施加位置与速度的正交约束。set_force原子group的力运行时设置gce广义正则系综模拟方式- 计算加速
gpuGPU加速模式
详细说明
press_berendsenBerendsen压强耦合方式
属性说明:
+ couple 压强耦合的方向,字符串类型,可选择”xyz”, “xy”, “yz”, “xz”, “none”。
+ x|y|z:[pstart,pstop,period] 各方向上的压强变化范围设置。
+ iso 各向相同耦合,等效设置’x’,’y’,’z’和couple:”xyz”。
+ aniso 各向相同耦合,且不耦合,等效设置’x’,’y’,’z’和couple:”none”
+ modulus 块模系数,实数,表示压强耦合强度。
+ dilate 选择进行要求耦合的原子组,默认为’all’,或者给定group id,只在该原子组上进行压强耦合。
配置例子:
{
"type" : "press_berendsen",
"iso" : [0.4,0.5,100]
},
{
"type" : "press_berendsen",
"y" : [0.4,0.5,100],
"z" : [0.4,0.5,100],
"couple" : "xy",
"modulus": 10.0,
"dilate": "all"
}
gce广义正则系综模拟方式 通过力标度的方式实现广义正则系综模拟。在势能\(E\)的偏置关系为 在定体积的模拟(如NVT)中mechanics->thermo: “base”, 在体积变动时(如NPT)需要设置thermo为pscale,以将哈密顿量反馈给维里(压强),同时需要设置关联的barostat。
属性说明:
scope施加偏置势能的类别,当前仅支持full类型,表示所有势能项(Pair,Bond、Angle、Dihedral、Improper等)all施加偏置的原子组,当前仅支持all组,表示所有原子对象。thermostat关联的温度耦合器(slot)barostat关联的压强耦合器(slot),默认为null。bias_betaGCE的\(\beta_0\)bias_alphaGCE的\(\alpha\)bias_he在仅有温度耦合时,对应势能偏置\(U\);同时具有压强耦合时,对应焓偏置\(H\)。start_step输出GCE log的开始步every_step每隔every_step输出一次GCE log。
配置例子:
"mechanics" : {
"run_steps" : 100000,
"timestep" : 0.004,
"type" : "mdvv",
"slots" : [
{
"type" : "temp_langevin",
"tstart" : 0.6,
"tstop" : 0.6,
"damp" : 10,
"seed" : 3434 }
,
{
"type" : "gce",
"scope" : "full",
"group" : "all",
"thermostat" : "temp_langevin",
"bias_beta" : 1.2,
"bias_alpha" : 0.2,
"bias_he" : -5.6,
"every_step": 10,
"normal" : true }
]
}
"mechanics" : {
"run_steps" : 100000,
"timestep" : 0.004,
"type" : "mdvv",
"thermo": "pscale",
"slots" : [
{
"type" : "temp_langevin",
"tstart" : 0.6,
"tstop" : 0.6,
"damp" : 10,
"seed" : 3434 }
,
{
"type" : "press_berendsen",
"iso" : [-0.2,-0.2,100.0] }
,
{
"type" : "gce",
"scope" : "full",
"group" : "all",
"thermostat" : "temp_langevin",
"barostat" : "press_berendsen",
"bias_beta" : 1.2,
"bias_alpha" : 0.2,
"bias_he" : -5.6,
"start_step": 1000,
"every_step": 20,
"normal" : true }
]
}
gce的log输出可以使用安装路径中bin/emdlog.py工具提取,如
python3 emdlog.py out.log -s gce:E/N,GCETemp
python3 emdlog.py out.log -s gce:H/N,GCETemp
python3 emdlog.py out.log -s gce:H,GCEBeta
zero_momentum运行时线动量和角动量清除 用于清除体系整体漂移(drift)或旋转(rotate),可能时由随机扰动造成的(如使用了temp_langevin slot)。 而particles->velocity配置中,仅可在初始化时对线动量和角动量清零。 默认在初始化时会做整个体系的线动量清零,因此对于非随机扰动的模拟,整个体系的线动量始终为零,如使用temp_berendsen代替temp_langevin(不考虑其他随机成分),在zero_momentum中无需做整个线动量的清零,即”momentum”属性中”linear”看不出效果。
属性说明:
linear选择清除线动量,bool类型,true为启用,默认为false;也可以指定清零的维度,取值为”x”, “y”和”z”组成的列表类型。angular选择清除角动量,bool类型,true为启用,默认为false。rescale动量清除后是否标度速度以保持前后总动能不变,bool类型。every_step每隔every_step进行一次动量清除。
配置例子:
{
"type":"zero_momentum",
"angular": true,
"linear":["x","y","z"],
"rescale":false,
"every_step":100
}
shake 键长和rattle 键长-键角约束
属性说明:
type指定约束类型:shake为键长距离约束,rattle为键长距离约束和键长-速度正交约束group约束的原子集合group id,默认为”all”。toleranceSHAKE求解的控制精度。iter_maxSHAKE求解的最大迭代次数。bond_types指定约束bond类型列表,可选。angle_types指定约束angle类型列表,可选。atom_types指定约束atom类型列表,可选。mass_types指定约束质量值列表(0.1误差内),可选。every_steplog输出的频率,0为不输出。
注意所有约束条件中只有成键的两个原子都处在group中才执行约束。计算温度和压强是去除了SHAKE的自由度。 eMD使用velocity verlet积分方法,推荐使用Rattle的约束方式。 配置例子:
{
"type" : "shake",
"group" : "all",
"tolerance" : 0.0001,
"iter_max" : 5,
"bond_types":[1],
"angle_types":[1,2],
"atom_types":[232],
"mass_types":[1.0],
"every_step" : 10
}
set_force原子力重置
属性说明:
group重置力的原子group id,默认为”all”。region只在指定的region区域中group内原子有效。force:[xvalue,yvalue,zvalue] 各方向上的给定的力大小值,null值为不重置对应力分量。action重置力的方式,”set”:直接重置,”add”:加到原值上,”scale”:乘到原值上,”ave_add”:设置为平均值再加上外部值,默认为”set”。reset_vel是否重置对应原子的速度为零,默认为false。
注意当前没有实现set_force因添加了外力而产生能量变化的计算。
配置例子:
{
"type" : "set_force",
"force" : [0.0,null,0.0]
},
{
"type" : "set_force",
"force" : [0.1,0.1,0.1],
"action" : "add"
}
gpuGPU加速模式
属性说明:
neigh_device表示控制neighbor构建是否在GPU设备上实现。force_reset表示清除GPU上force数据的方法,默认调用memset函数。gpu_mix_cpu标志控制GPU计算后返回的force如何与CPU端的force合并,true为累加到CPU的force,false为直接拷贝到CPU端force。 如果CPU端force有在CPU端计算的结果,则需要设置为ture,结果才正确。CPU端计算的部分类,包括为被加速Molecule bond/angle等,还有部分KSpace的结果,如lj_cut_coul_long这个Pair时,虽然只有一个Pair,但它包含两部分:GPU的实空间计算部分和CPU倒易空间计算部分。当前倒易空间涉及全局GPU通讯,只在CPU端计算。 配置例子:
2. 最小化计算 min
基本格式为
"mechanics" : {
"type" : "min_sd",
"run_steps" : 200,
"line_search" : "backtrack",
"dist_max" : 0.01,
"eval_max" : 200,
"eng_tol" : 1e-4,
"frc_tol" : 1e-6,
"frc_norm" : "max"
}
type选择最小化方法类型,当前支持两种线性搜索方法:最速下降方法min_sd和共轭梯度方法min_cg。- dist_max 线性搜索最大距离步长
- run_steps 迭代次数
- line_search 线性搜索算法,默认quadratic接近局部最小时推荐使用,比能量判据backtrack收敛快,forcezero类似quadratic。
- eval_max 计算force或energy次数 (alpha线性搜索时)
- eng_tol 用于终止的能量误差
- frc_tol 用于终止的力误差
- frc_norm 计算迭代前后力变换的向量“距离”方法。默认two二阶矩,max取所有原子3-vector力的2阶矩的最大值。inf取所有原子力的最大分量。
3. 副本交换 remd
sample 抽样配置
配置模拟的抽样输出,包括热力学等统计信息输出(statis)和轨迹文件的输出(trajectory)。基本的调用格式为
"sample" : {
"statis" : [
{
"type" : "force",
"every_step" : 100,
"fields" : [
"temp",
"epot",
"ekin",
"etotal",
"press"
] }
],
"trajectory" : [
{
"every_step" : 5,
"sort_tag" : 1,
"file" : "traj_out.pdb" }
,
{
"every_step" : 6,
"sort_tag" : 1,
"file" : "traj_out.dcd" }
]
}
statis->force类可输出字域(关键字)有:
- temp 温度
- press 压强
- epot 总势能
- ekin 总动能
- enth 焓(epot+press*vol)
- enthalpy 动能+焓 (ekin+enth)
- evdwl 范德华作用势能
- ecoul 库仑势能
- elong 长程作用势能(除截断部分的Kspace计算能)
- etail 尾部作用能
- epair 非键作用势能(evdwl+ecoul+elong+etail)
- ebond 键作用势能
- eangle 角作用势能
- ehihed 二面角(dihedral)作用势能
- eimp 非正常二面角(improper)作用势能
- emol 分子作用能(ebond+eangle+edihed+eimp)
statis->domain类可输出字域(关键字)有:
- vol 当前体系的体积
- density 质量密度
- lx x维的box长度
- ly y维的box长度
- lz z维的box长度
- xlo x维box的下边界
- xhi x维box的上边界
- ylo y维box的下边界
- yhi y维box的上边界
- zlo z维box的下边界
- zhi z维box的上边界
variable 变量替换配置
eMD当前支持两种变量的定义
- arg: 命令行参数默认值,可由命令行-x变量覆盖;
- env: 环境变量值。
以上变量都会在配置文件MD执行之前替换为对应值。基本的调用格式为
$name或${name}的配置变量替换为value值,这种替换方式是基于字符串替换,没有JSON语法意义。在保证符合JSON格式正确的情况下,为了数值型变量,引入了"$[name]"的替换,它将替换为name的内容,并且会去除包含其的外层双引号。 如 {"temp":"$[value1]"}, 当value1=1.0,替换后的值为{"temp":1.0}。
eMD的arg参数对应LAMMPS的index属性变量。env参数对应LAMMPS的getenv variable。 对配置文件支持命令行动态改变参数,便于应用/测试场景的参数调整。
最后修改: 2024年9月7日,