HOOMD Blue文档笔记
基于hoomd 1.0.2 userdoc
3. 快速开始
例程:
from hoomd_script import *
# create 100 random particles of name A
init.create_random(N=100, phi_p=0.01, name=’A’)
# specify Lennard-Jones interactions between particle pairs
lj = pair.lj(r_cut=3.0)
lj.pair_coeff.set(’A’, ’A’, epsilon=1.0, sigma=1.0)
# integrate at constant temperature
all = group.all();
integrate.mode_standard(dt=0.005)
integrate.nvt(group=all, T=1.2, tau=0.5)
# run 10,000 time steps
run(10e3)
输出:
(版权信息)
-----
(运行到的每一行代码)
starting run **
Time 00:00:00 | Step 10000 / 10000 | TPS 35417.9 | ETA 00:00:00 --每过10秒时间统计。已运行时间(时:分:秒),运行步长,平均每秒多少步,预计剩余时间。
Average TPS: 35405
---------
-- Neighborlist stats: --统计信息,此处只有neighbor list输出统计信息。不同脚本输出的统计信息不同。
370 normal updates / 100 forced updates / 0 dangerous updates
n_neigh_min: 0 / n_neigh_max: 10 / n_neigh_avg: 2.41
bins_min: 0 / bins_max: 6 / bins_avg: 1.5625
run complete **
每行代码的分析:
1. 每个hoomd脚本的第一行都需以
from hoomd_script import *
开头,导入hoomd库。例如init.creat_random()这样的过程都是在此库中定义的。
2. hoomd_script导入后,系统必须先初始化,此处为
init.create_random(N=100, phi_p=0.01, name=’A’)
表示创建了一个系统,包含100个名为’A’的粒子。phi_p表示填充率(Packing fraction)。
3. lj = pair.lj(r_cut=3.0) 表示创建一个截断半径为3.0的LJ力,变量lj为pair.lj的实例。
4. lj.pair_coeff.set(’A’, ’A’, epsilon=1.0, sigma=1.0)添加LJ力的参数:A与A之间有ε=1.0,σ=3.0的LJ力。
5. all = group.all();
integrate.mode_standard(dt=0.005)
integrate.nvt(group=all, T=1.2, tau=0.5)
选择对力积分的模式,在一个步长下只能有一种积分模式。此处选择标准模式,步长设为0.005;为分组all指定使用恒温条件下的动力学方法(Nosé-Hoover thermostat),对所有粒子使用。温度T设为1.2,τ参数(Nosé-Hoover thermostat中的耦合常数)设为0.5。
6. run(10e3) 用run命令启动模拟。在此示例中仅跑10000步,实际研究中的计算通常需消耗数天。一个脚本中不限制使用数个run命令,可在一个run完成后修改参数运行下一个run。
Python中函数变量的传递通过键值对指定:name=value,实参的顺序是任意的。例如,源码中的表示:
init.create_random
( N,
phi_p,
name = "A",
min_dist = 1.0
)
N:创建的粒子数
phi_p:填充率(Packing fraction)
name:为粒子类型指定名称
min_dist:初始化排布的粒子间最小距离
文档中国有=号的说明此参数有默认值,使用时可以省略;没有默认值的则不能省略。
4. 命令行参数
Ø 没有参数的情况下自动检测速度最快的GPU,没有GPU则以CPU运行。
Ø -h , --help
显示所有命令行选项的帮助信息
Ø -mode={gpu|cpu}以GPU或GPU模式运行。PS:注意,命令行参数可能需要加两个横线,比如以CPU运行test.hoomd的命令为 hoomd test.hoomd –mode=cpu
Ø -gpu=# 指定以哪块GPU运行,此参数的存在意味着以GPU运行。
Ø -ignore-display-gpu 不适用为屏幕显示工作的GPU做计算
Ø -minimize-cpu-usage 在GPU上运行时减小CPU的占用率—默认情况下CPU会占100%使用率,用此选项CPU占用率可显著减小至10%,但将有10%的效率下降。
Ø -gpu_error_checking 打开每次调用GPU核的错误开关
Ø -notice-level=# 指定通知等级
Ø -msg-file=filename 将通知信息覆写至指定文件
Ø -user 用户选项,在脚本中可通过option.get_user()获取用户选项。
Ø MPI专用选项
-nx –ny –nz x,y,z方向上的分块
-linear 强制进行沿z方向的板坯(1D)分解
-nrank每个分块的行列数
-shared-msg-file=prefix 指定各部分输出消息的文件名的前缀
使用MPI选项运行程序,例如
mpirun -n 8 hoomd script.py # 2x2x2 domain
分解为2x2x2的小块
mpirun -n 4 hoomd script.py --linear# 1x1x4 domain
--linear选项作一维空间分解,在单个节点上运行时效率比三维空间分解高。
mpirun -n 12 hoomd script.py --nrank=3 #将体系分解为12块,在3个GPU上运行
6 基本概念(Concepts)
6.1 单位量-units. 三个基本单位量:距离、能量、质量,其它物理量皆从此三个量导出。
“温度”T=kBT(实际),玻尔兹曼常数kB的具体数值取决于长度、能量与质量单位的量值。
6.2 周期性边界条件(Periodic boundary conditions) HOOMD模拟都在具周期性边界条件的三维盒子中进行。三斜的盒子有一些形状参数Lx,Ly,Lz,xy,yz,xz,参数可在xml文件中指定。也可以在脚本中指定,例如:
init.create_random_polymers(box=data.boxdim(L=18, xy=0.1, xz=0.2, yz=0.3),
polymeres=[polymer2],
separation=dict(A=0.35, B=0.35));
当然也可以使用二维盒子:
init.create_random(N=1000, box=data.boxdim(xy=1.0, volume=2000, dimensions=2), min_dist=1.0)
盒子大小在运行过程中也可以逐渐改变,使用update.box_resize方法。
integrate.npt与integrate.nph分别表示恒粒子数恒压恒温,及?
6.3 XML文件格式
体系的搭建通过xml文件指定。主要是 init.read_xml(初始化的输入文件) 与 dump.xml(输出结果的文件) 。基本格式:
<?xml version="1.0" encoding="UTF-8"?>
<hoomd_xml version="1.5">
<!-- this is a comment, you can put as many of these in the file
wherever you wish to. -->
<configuration time_step="0" dimensions="3" vizsigma="1.5">
<!-- data nodes go here -->
</configuration>
</hoomd_xml>
诸如 time_step="0" 为configuration标记的一个属性。
time_step : 初始时的步长记数?
dimension : 指定维度,但并不会改变任何东西,例如速度和位置的信息仍然有三个元素。
vizsigma : 与VMD相关的一个参数。在init_read.xml中此项会被忽略。配置标记可包含如下属性,指定这些属性的顺序是任意的。
• box (盒子的形状参数)
dump.xml写此信息;init_read.xml需要有此信息。
Ex:<box lx="5.1" ly="9.6" lz="15.8" xy="1" yz="0" lz="0">
• position (粒子的位置)
dump.xml可选地写此信息;init_read.xml需要有此信息。
Ex:指定每个粒子的xyz坐标。粒子的坐标必须在盒子之内。
<position>
-1.45 2.21 1.56
8.76 1.02 5.60
5.67 8.30 4.67
</position>
属性:(可选)num – 粒子的个数。
• image (Particle images)
dump.xml可选地写此信息;init_read.xml非必须。
周期性边界条件下的粒子坐标校正矢量。与position结合,格式与position相同。若有image属性,则粒子实际坐标按此换算:
x0 = x + ix * Lx + xy * iy * Ly + xz * iz * Lz
y0 = x + iy * Ly + yz * iz * Lz
z0 = z + iz * Lz
x,y,z为position属性,ix,iy,iz为image属性。
• velocity (Particle velocities)
dump.xml可选地写此信息;init_read.xml非必须。
粒子速度属性。格式与position同。
• acceleration (粒子加速度)
dump.xml可选地写此信息;init_read.xml忽略此信息——因加速度是定量计算出来的。
表示粒子的瞬时加速度。
• mass (粒子质量)
dump.xml可选地写此信息;init_read.xml非必须(默认为1.0)。
Ex:
<mass>
1.0
2.0
1.0
</mass>
• diameter ( 粒子直径 )
dump.xml可选地写此信息;init_read.xml非必须(默认为1.0)
格式同masses
• charge (粒子电荷)
dump.xml可选地写此信息;init_read.xml非必须(默认为0.0)
格式同masses
• type (粒子类型)
dump.xml可选地写此信息;init_read.xml需要有此信息
指定每个粒子的类型,格式同masses,Ex:
<type>
A
long_type_name
A
</type>
• body (刚体)
dump.xml可选地写此信息;init_read.xml非必须
指定每个粒子所属的刚体(如果存在),格式同masses,Ex:
<body>
-1
0
0
</body>
-1表示粒子不属于任何刚体。刚体编号从0到刚体数目减一。
• orientation (粒子方向)
dump.xml可选地写此信息;init_read.xml非必须
用四元数指定粒子的方向。Ex:
<orientation>
1 0 0 0
0.0333 -0.0667 0.1000 0.1333
</orientation>
• moment_inertia (粒子的转动惯量)
dump.xml可选地写此信息;init_read.xml非必须
指定粒子的转动惯量,格式与position类似,对每个粒子由6个标量依次表示Ixx Ixy Ixz Iyy Iyz Izz. Ex:
<moment_inertia>
1 0 0 2 0 3
1 2 3 4 5 6
</moment_inertia>
• bond (粒子间的键)
dump.xml可选地写此信息;init_read.xml非必须
Ex:以下标记表示在粒子0和1间连接类型为“polymer”的键;在1和2间连接类型为“backbone”的键。键的类型是任意非空字符串。
<bond>
polymer 0 1
backbone 1 2
</bond>
单纯地指定键不会导致任何变化,需要在脚本中使用bond模块为各种类型的键指定键张力完成键的构建。
• angle (粒子间键角)
dump.xml可选地写此信息;init_read.xml非必须
Ex:以下标记表示在粒子0,1,2间添加类型为“A-B-A”的键角,在1,2,3间添加类型为B-A-A的键角。
<angle>
A-B-A 0 1 2
B-A-A 1 2 3
</angle>
与bond一样,单纯添加键角不会引入角张力,需要在脚本中使用angle模块为各种类型的键角指定角张力。
• dihedral (四个粒子之间的二面角)
dump.xml可选地写此信息;init_read.xml非必须
与angle类似,需要另外使用dihedral模块添加扭转张力。Ex:
<dihedral>
A-B-A-A 0 1 2 3
B-A-A-C 1 2 3 4
</dihedral>
• improper (Improper Dihedral Angles between four particles)
dump.xml可选地写此信息;init_read.xml非必须
与dihedral类似,需要另外使用improper模块添加improper二面角张力。Ex:
<improper>
A-B-A-A 0 1 2 3
B-A-A-C 1 2 3 4
</improper>
• wall (在盒子中添加壁板)
dump.xml可选地写此信息;init_read.xml非必须
同样地,在未使用wall.lj指定壁板的行为前,添加的wall不起任何作用。
格式Ex:
<wall>
<coord ox="1.0" oy="2.0" oz="3.0" nx="4.0" ny="5.0" nz="6.0"/>
<coord ox="7.0" oy="8.0" oz="9.0" nx="10.0" ny="11.0" nz="-12.0"/>
</wall>
ox,oy,oz为平面上的一点的坐标;nx,ny,nz为平面的法向量。
6.4 基于MPI的空间分解
HOOMD-BLUE支持多GPU/CPU计算,使用MPI实现。
此章节有使用MPI时常见问题的解答。
6.5 Auto-runner
HOOMD在运行时自动进行优化,前若干步明显慢于后续步长的原因在此。
autorunner的可选参数:
period:重新调整优化策略的周期。默认为100,000
enabled:是否采用autorunner。如果在自适应阶段后关闭此开关,将不再重新调整优化策略,但此前的策略继续采用。默认为True。
7 脚本命令索引
• Run
• Option
• Initialize
• Integrate
• Update
• Compute
• Analyze
• Dump
• Potentials
– Pair potentials
– Many-body potentials
– Bond potentials
– Angle potentials
– Dihedral potentials
– Improper potentials
– Electrostatic potentials
– Wall potentials
– Constraint forces
– External forces
– Other forces
• Helpers
– Group
– Variants
• Miscellaneous
– Tune
– Benchmark
– Communication helpers