Tutorial | LAMMPS 1.0
LAMMPS 入门
LAMMPS为理论与计算化学常用软件代表,类似的还有VASP, Gaussian,CASTEP, Gromacs等等,这里仅以LAMMPS作为入门举例。由于科研内容的复杂度高、计算量大,这类软件有几个特点:1)一般都需要在linux系统下的服务器上多核运行 2)有输入文件和输出文件,中间为黑箱,基本结构和语法相似。其中产生输入文件和阅读输出文件都需要其他软件或程序,需要一起学习。3)主要学习手段为软件官方用户手册,里面对所有命令有使用方法、相关物理原理、引用文献。这是和其他training中自编软件的主要区别:自己写程序只需要基本物理原理,其他自己都是清楚的、自定义的;而程序需要你熟悉他人程序语言框架,但后期更省时间
step 0 : linux环境熟悉+分子动力学基础
安装winscp后, 安装putty,地址114.214.200.31 ,登录学习账号xue, 密码找我要(后期会给你开单独账号),此软件使用与window文件管理类似。自建属于你的文件夹,之后操作都在自己文件夹下,不要用别人的。点击putty图标,再次登录,此为shell会话。在shell会话下,熟悉新建文件夹、复制、删除文件、浏览文件和修改文件内容相关命令;
ref: https://blog.csdn.net/…./129345242 第(二)部分。需要记住3-7,其他只要跟着尝试一下即可,即用即查
也可以随便B站CSDN搜Linux入门
分子动力学基本原理组LAMMPS。分子动力学基本原理和方法可以参考training-活性部分。或学习以下视频:
ref: B站的lammps入门介绍
学习完成后回答:
- 什么是周期性边界?
- 什么是NVT, NPT, NVE系综?
- 分子动力学的牛顿方程怎么写,每一项在LAMMPS中存储在哪里?
step 1 : 体验第一个lammps程序
目标: 看到一个10条链的动图。以我个人理解,
- /test/01下有个简单的程序,打开shell 会话,进入该目录,提交命令为 qsub sub.pbs 提交后用qstat查看状态,有个R就是在运行了,c就是运行结束(也可能是程序死了)。
- 为了防止误删,建议养成习惯,每次跑新任务先复制新建文件夹,做好编号。每次提交任务,都要新建一个文件夹并编号,以免报错忘了自己改过什么;及时清理dump出来的巨大文件,可以保留输入文件,即使程序报错了,以便后面参考, 误删了也可以重跑。类似于做实验写实验记录, 所有成功失败都要可以参考。
- 如果跑成功了会生成 .xyz文件,导入OVITO软件即可查看动图,可保存为gif;运行过程随时可打开. log 或log.lammps文件查看进度,如果程序死了也是在这两个文件结尾看报错。如果都没有报错再看err
- 保持良好习惯,做实验记录:计算机实验也需要记录,以文件夹标号,简单记录跑了什么体系,有哪些参数,看到了什么。可用word,text或markdown(极力推荐,科研利器)
- 学习完成后回答:
- 成功提交一个LAMMPS任务需要哪些文件?分别包含哪些部分?
- in文件中的每一行是干什么的?(step 0课程中有部分答案)
- 注意 pair_style lj/cut的参数, 1.0 1.0 1.12代表什么?
(ref: https://docs.lammps.org/atom_style.html),其他命令也可在手册中搜索达到
- 新建文件夹后,1) 修改为周期性边界2) 将链内珠子的相互作用从纯排斥改为吸引(提示只需要修改一个参数),再次运行,查看结果、记录实验。
step 2: 跑两条真实无序蛋白的粗粒化链
目标: 参考test用c++或者python等,写个小程序,能够通过读入一个序列输出datafile 中原子坐标, 和连键的信息,能够运行
编程是重要的科研工具,无论你做哪个方向都是绕不开的,此处只需要针对问题进行熟悉代码(遇到什么不会查什么),不必从头学某个语言。注意,这个练习只是为了让你适应一点编程思维,不是为了让你写出多好用多高效的程序。一共就几十行即可完成,不要查网络上实现这个功能的完整代码,自己拿空文本写然后遇到问题问我或者查那个问题就行
从数据库下载某个感兴趣的无序蛋白的序列保存至txt文件(如 uniprot.org是常用蛋白数据库)。
写一个生成datafile的小程序,在程序中实现将序列读入数组、并判断每个氨基酸的带电。datafile基本产生思路:
(0)开二维数组,保证能存储所有粒子的坐标
(1)每条链的第一个原子用随机数确定坐标
(2)后面的每个原子生成一个随机数确定它和上一个原子的矢量(如果两个原子相切,三维距离应该是二者半径之和)
(3)需要判断是否已经生成的原子中有和新原子距离过近的(可以相互接触,不要距离是0.0几这种就行,容易导致程序发散),要重新生成
(4)最后对于生成原子超出盒子边界的,需要根据周期性边界的原理把它约化到盒子内
(5)仅在输出时用到粒子类型、电荷的数组,根据氨基酸的电荷区分粒子类型 1-不带电 2-正电 3-负电
一些减少你工作量的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <fstream>
#include <iostream>
fp2 = fopen(datafile_name, "w");
fprintf(fp2,"LAMMPS data file for HSF. generated by c++\n\n");
fprintf(fp2, " %d atoms\n", totalp*bead+ totalcation);
fprintf(fp2, " %d bonds\n\n", totalp * (bead - 1));
fprintf(fp2, " 21 atom types\n");
fprintf(fp2, " 1 bond types\n");
fprintf(fp2, " %f %f xlo xhi\n", 0.0f, box_len);
fprintf(fp2, " %f %f ylo yhi\n", 0.0f, box_len);
fprintf(fp2, " %f %f zlo zhi\n\n", 0.0f, box_len);
fclose(fp2);
fscanf(fp1, "%c", &atomtype[i]);
double rn()
{
int x, y;
double z;
x = rand();
y = x % 1000;
z = y / 1000.0;
return(z);
}
data文件还需要(1)bond模块 (2)mass模块, 参考step1 的举例完成
注意到我们需要让datafile包含电荷信息,这在step1里的datafile中是没有的。因此需要把in文件的atom_style 改成real, 并修改相应的datafile格式
ref :https://docs.lammps.org/atom_style.html (有点复杂,不如百度)
此处我们将采用residue-based 粗粒化模型,每个氨基酸用一个球模拟。每种氨基酸球有独立的电荷(参与电荷相互作用)、疏水参数lambda(参与LJ短程势)。
因此需要将in文件pair style 改为lj/cut/coul/debye. 思考怎么改参数。可百度lammps in文件每一列的用途,和我给的test唯一区别是原来只有一种粒子“1”,现在有三种“1,2,3”。了解命令dielectric。
一定会报错,这很正常,尝试自己分析原因,然后问我
学习完成后回答:
- 蛋白在生理盐水中。溶剂/离子体现在哪里?
- 了解lj/cut/coul/long 和lj/cut/coul/debye. 注意到我之前用的是long, 但我计划让你用debye, 思考下为什么我们选用debye(包括科学性和可行性)
- 电荷作用/lj的截断应该设在半径的多少倍多少?为什么是截断?
- 体系为什么需要warm up? 有哪些warm方法?(如果你遇到了lost atom、bond/atom 报错,那就很可能是因为没有warm up,思考为什么lost atoms)
2条成功后,可以尝试跑个100条的。成功后,恭喜你,此后为输入输出省下大量时间。
step 3 : 蛋白的相分离与统计分析
目标: 熟悉lammps其他in文命令(重点熟悉fix),熟悉一些统计内容和方法(是的,又要写统计的程序了)。
- 程序将变得复杂。相对于step2 里的in文件,你需要学习的内容(可以查手册了解详情):
- variable 命令是什么,怎么替换变量的($符号是linux系统中的变量替换符号);loop命令实现循环的方法(类似于for循环)
- lammps的运行顺序是按in文件逐行读取,因此可以出现多个run, 执行某个run时后面的命令不会被读到。观察理解为什么需要多个run
- 再次熟悉dump命令, 里面有控制跑多少步次输出一次的, 设置大一些,要保证你run完整个xyz文件不要超过500帧, 一开始甚至100帧就足够了。包含所有原子坐标的文件极大,不能浪费空间。
- 真正要跑相分离,需要更多的步数,可以考虑再加一两个0
如果你理解了以上,则能看懂下面的命令,并添加:
1 |
|
尝试让它跑完,观察输出。
理解direct coexistence 方法和slab构型的意义。
ref: 主要参考文献还是上面Mittal的那篇,第二章疏水不用看,主要是第三章的slab method。大佬写的教学版, 非常通俗易懂,里面包括lammps里怎么构建slab模型, 和后面跑完之后怎么数据处理。
接下来,lammps中实现slab。 基本思路是: 原来的datafile即可, minimize→平衡→压缩xy→拉长z→平衡→进入升温循环。升温循环已写,改变盒子的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#1. 让蛋白聚集
fix 1 all nvt temp $t $t 100.0
run 1000
unfix 1
#2. 将盒子沿着zy方向压缩
fix 3 all nvt temp $t $t 100.0
fix 4 all deform 10 x final 0.0 150.0 y final 0.0 150.0
run 1000
unfix 3
unfix 4
#3.拉长时间
【手动打码】和2的压缩写法一模一样,沿着z拉伸。
run 6000
unfix 7
unfix 8请添加至in文件合适的部分
如果运行成功,你已经实现了模拟的全部步骤。行百里路___90%了,加油!
最后,统计最大cluster, 得到相图。理论上,只要有dump文件里的粒子信息(以及速度信息,这里只是没有输出),我们就知道了体系的全部微观信息,从这里可以统计任何宏观力学量。这显然并不容易,你要写很多代码,好在lammps内置了很多统计程序,可以省很多麻烦。你需要学习:
compute chunk/atom, 理解chunk,
fix命令下有很多子命令,是改变体系性质,或者改变输出内容,了解这里新出现的fix ave/time。
1 |
|
输出文件.cluster,.density分别是液滴尺寸和密度分布了解其统计原理、输出文件的结构,得到1)最大cluster尺寸随时间变化的图 2)密度分布图。
ref: 我们自己啊
用density文件得到相图。 从参考文献里可以看出,你需要根据每次温度结束时候的构象,对它进行切片处理,得到密度分布统计图,计算得到高低相的密度,用于做相图。如何切片统计密度,就需要写程序了。
- 读取density文件(每一帧有多少行,每一行代表什么)
- 得到沿着z方向的每个切片的密度图(粒子数目),类似参考文献fig 3D. 做一个差分,判断高密度相和低密度相的边界。
- 计算高低密度相密度。这里单位不重要。
- 不同帧的平均
- Ising拟合相图
完成后回答问题:
- 为什么要得到相图?它与实验结果会有哪些差别?
- slab方法有哪几个优势?使用条件是什么?拉长和压缩为什么要慢?
- density统计时候需要判断每个原子判断所处位置切片(chunk),切片需要至少多少个?
- 什么是系综平均?这里我们用什么来代替得到系综平均?
- 步长选大选小有什么影响?