一 介绍长久以来,lammps的数据文件构建就是一个大问题(对我来说)。一方面,LAMMPS的数据格式比较特殊,很多软件不能直接导出; 另一方面小分子到大分子的变换,大分子在系统中的排布和大分子中的拓扑结构都需要牵扯很多的精力。经过长时间的试错,我算是终于找到一个比较合理且简约的技术栈,可以直接生成lammps所需的in文件和data文件。
如图所示,整个技术栈分为:基本绘图:绘制基本的单元,如高分子结构单元,单个水分子或者甲烷分子等; 数据文件:导出成常见格式的数据文件,如PDB,XYZ; [空间排布]:packmol可以自动地根据所设置的限制向系统中填放单元。比如想向C60笼中填放原子,只需要一行命令将允许范围限制在球内即可; 生成工具:moltemplate可以操作已有的数据文件,在系统中复制,变换和随机,同时根据已有的拓扑结构补充生成键角二面角等信息,最后生成lammps所需的in文件和data文件。由此,得到的所有文件都可以直接使用lammps运行。此套技术栈的好处是,可以接受各种格式的数据文件并且可以轻松地操纵它们,而且都是开源的,安装方便快捷占地小。开发moltemplate的人同样也是lammps的主程,在手册中他成这款软件是lammps的前端(front-end)唯一的缺点是,moltemplate(包括packmol)手册有如16年以前的lammps手册,比较 ……随意洒脱。
二 文件结构moltemplate本身具有导入(import)和继承(inherit)功能,因此我们可以尽量地把文件区分按照功能区分开。当然文件名都是可以自定义的,这里只是介绍一个思路,告诉各位应该怎样上手。第一部分是forcefield.lt 这个文件中储存着lammps的系统和力场参数。# – ForceField – #
ForceField{
write_once("In Init"){
units lj
boundary p p p
atom_style full
pair_style lj/cut 10.5
bond_style hybrid fene harmonic
angle_style harmonic
}
write_once("Data Boundary") {
0 100.0 xlo xhi
0 100.0 ylo yhi
0 100.0 zlo zhi
}
write_once("Data Masses"){
@atom:M 1
@atom:G 1
@atom:R 1
}
write_once("In Settings"){
pair_coeff @atom:M @atom:M 1 1 2.5
pair_coeff @atom:M @atom:G 1 1 2.5
pair_coeff @atom:M @atom:R 1 1 2.5
pair_coeff @atom:G @atom:G 1 1 2.5
pair_coeff @atom:G @atom:R 1 1 2.5
pair_coeff @atom:R @atom:R 1 1 2.5
}
write_once("In Settings"){
bond_coeff @bond:MM fene 30 1.5
bond_coeff @bond:GR fene 30 1.5
bond_coeff @bond:RR harmonic 1000 0.66
}
write_once("In Settings"){
angle_coeff @angle:RRR 200 180
}
# write_once("Data Dihedrals By Type"){
# @dihedral: @atom:
# }
# write_once("Data Angles By Type"){
# @angle: @atom:
# }
}
第二部分是基本单元数据 这里面存储这一个片段的信息# – file matrix.lt –
import “forcefield.lt”
Matrix inherits ForceField{
write("Data Atoms"){
$atom:1 $mol:. @atom:M 0 1 1 1
$atom:2 $mol:. @atom:M 0 2 1 1
$atom:3 $mol:. @atom:M 0 3 1 1
$atom:4 $mol:. @atom:M 0 4 1 1
$atom:5 $mol:. @atom:M 0 5 1 1
}
write("Data Bonds"){
$bond:1 @bond:MM $atom:1 $atom:2
$bond:2 @bond:MM $atom:2 $atom:3
$bond:3 @bond:MM $atom:3 $atom:4
$bond:4 @bond:MM $atom:4 $atom:5
}
第三部分是操作部分 在这个文件中我们可以对基本单元进行操作,同时也是程序执行的入口# – file system.lt – #
import “forcefield.lt”
import “matrix.lt”
m1 = new Matrix [3].move(0,0,3)
在最简单的情况下,我们仅需要这三个文件就可以描述一个系统的初始化状态,然后执行命令行使用moltemplate生成实际文件:
moltemplate.sh system.lt
得到:
system.data
system.in
system.in.init
system