0.背景

0.1 软件及版本
  PyCharm,Python3.10
  ovito3.0
  VMD1.9.3(WIN32)
0.2 文件夹
  按照下图建立3个文件夹,其中hyd文件夹中存放需要处理的文本文件,hyd-formation存放建模需要的代码,result文件夹存放建模输出的结果。

文件夹

0.3 CO2水合物data文件文本
  可以从网上下载CO2水合物的data文件,一个晶胞由8个CO2分子和46个H2O分子构成,也就是8个笼子,其中6个是由12个5边形和2个6边形构成的大笼,省下2个是由12个5边形构成的小笼。可以使用ovito进行扩胞,根据需求获得2x2x2等各种大小(扩胞时应注意周期性边界的问题)。
  本文以3x3x3的模型为例进行介绍。
  下面提供两个data文件,分别为3x3x3的SI型CO2水合物文件和3x3x3的SI型CH4水合物文件,都是处理过边界周期性的,为了处理方便把边界分子都进行补全,不会因为左下方二氧化碳分子的O跑到右上角。

3x3x3的SI型CO2水合物文件
3x3x3的SI型CH4水合物文件

1.data文件处理

1.1 data文件的构成
  以下截取了CO2水合物文件的前32行进行说明。
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
27
28
29
30
31
32
LAMMPS data file. CGCMM style. atom_style full generated by VMD/TopoTools v1.7 on Thu Mar 16 13:55:55 +0800 2023
4374 atoms
2916 bonds
1458 angles
0 dihedrals
0 impropers
6 atom types
3 bond types
3 angle types
0 dihedral types
0 improper types
-12.590733 23.499267 xlo xhi
-12.478819 23.611181 ylo yhi
-12.399492 23.690508 zlo zhi

Masses

1 15.999000 # 1
2 1.008000 # 2
3 12.011000 # 3
4 15.999000 # 4
5 12.011000 # 5
6 15.999000 # 6

Atoms # full

1 1 1 0.000000 -9.821051 -9.821051 -9.821051 # 1
2 1 2 0.000000 -10.665317 -9.424357 -10.035716 # 2
3 1 2 0.000000 -10.045447 -10.661015 -9.420628 # 2
4 1 1 0.000000 -12.030000 -8.335587 -10.608174 # 1
5 1 2 0.000000 -12.028532 -7.540823 -10.074713 # 2
6 1 2 0.000000 -12.027662 -8.018431 -11.511301 # 2
  第1行是生成文件的一些信息。
  第2-4行分别为原子数、键数、键角数。
  第5、6行为两种不同类型的二面角数目。
  第7-9行分别为原子类型数目、键类型数目、键角类型数目。
  第10-11行为两种不同类型的二面角类型数目。
  第12-14行为盒子大小的xyz起始坐标和截止坐标。
  第16-24行为不同类型原子对应的原子相对质量,第1列为原子的编号,第2列为相对原子质量,#后面是注释。这里原子类型数目要和上方第7行原子类型数目对应。
  第25行往后是原子的信息。其中原子数目要和第2行对应。第1列为编号,第2列为分组编号,比如我的data文件是3x3x3的,那么每个晶胞都有自己的组,从1-27。第3列为原子类型,对应上方Masses中的第一列原子类型编号。第5-7列为原子的三维坐标信息。#后面属于注释。
1.2 如何拆分
  我们需要构建不同CO2(以下称为客体分子)占有率或者含有缺陷(部分笼子中缺少水分子)的水合物模型。为了便于下一步的处理,我们根据原子类型进行分类。首先分为三类,①data文件中Atoms上方的内容为头文件(head.txt);②水分子坐标文件(waterdata.txt);③客体分子坐标文件(big-and-small.txt)。
  其中③中客体分子可以进一步细分为两类,④大笼中客体分子(big.txt)和⑤小笼中客体分子(small.txt)。
  把这5个文件保存在hyd文件夹中。

5个文件

1.3 拆分出的5个文件
  可以使用Python处理,截取部分行写入新的文件中。水分子和客体分子的分离可以通过判定原子类型处理,其中1和2为水分子,3和4为大笼中的客体分子,5和6为小笼中的客体分子。
  也可以通过周期性来判断,3x3x3的SI型CO2水合物是通过一个晶胞扩胞生成的。一个晶胞包含46个水分子和8个客体分子,也就是54*3=162个原子,其中水分子为1-138,客体分子为139-162,其中小笼为142,143,144;157,158,159;剩下的为大笼。并且第二个晶胞中中编号只是依次增加162。
  以下提供3x3x3的SI型CO2水合物的5个拆分文件。

①head.txt 预览 下载
②waterdata.txt 预览 下载
③big-and-small.txt 预览 下载
④big.txt 预览 下载
⑤small.txt 预览 下载

2.模型atoms构建

2.1 需要的库
1
2
import numpy as np
import random
2.2 思路介绍
  我们知道data文件除去头部的信息(Atoms以下)是由一行行的原子信息构成,并且在本文data文件中构成一个分子的原子都是相邻的。因此如果我们删除指定的分子,就只需要找到对应的原子行数,删除这几行,然后修改头文件中的原子数目就可以了。并且这样的删除之后的文件不需要保证原子的编号是连续的。
  以大笼小笼中客体分子当做等价,地删除部分客体分子为例进行介绍。
  首先我们应该确定删除分子的数目和属于那个晶胞,在本文这个程序(small-equal-big.py)中我们可以选择x个晶胞(n_delete),在x个晶胞中每个晶胞删除a个分子(n_together),并且可以继续选择y个晶胞(n_delete2)(这y个晶胞与前面x个晶胞不重合,没有交集。x+y的和要小于等于27),在y个晶胞中每个晶胞删除b个分子(n_together2)。
1
2
3
4
5
6
7
8
n_delete = 0 #要删笼中客体分子的晶胞个数
n_together = 0 #一个晶胞删除的个数
n_delete2 = 0 #不规则删除的晶胞个数
n_together2 = 0 #不规则删除的一个晶胞内需扣除笼子数

num = 648 - 3 * n_together * n_delete - 3 * n_together2 * n_delete2

num = num + 3726 #小笼内气体原子数 + 大笼内气体原子数 + 水的原子数
  我们确定好删除客体分子的数目后,我们把27个晶胞当做一个27个数字数组c_out,如果这个晶胞不删除客体分子用1表示,属于n_delete的用0表示,属于n_delete2的用0.5表示。获得一个长度为27的数组c_out。使用random.shuffle(c_out)进行随机重排,实现随机效果。
  接下来我们用f_out记录每个原子是否要删除,其中1是保留,0是删除,因此f_out在本文中应当是27个晶胞,每个晶胞8个客体分子,每个客体分子3个原子,一共27x8x3=648长度的数组。定义一个中间变量a_arry记录每个晶胞中记录哪个分子要删除。使用一个27次循环来实现对每个晶胞中的8个分子处理。
  ①如果发现c_out中读取的数字是0.5,则在a_arry中写入n_together2个0和8-n_together2个1,a_arry是个长度为8的数组,对其进行shuffle操作,代表随机删除晶胞中的分子。读取a_arry,如果是1则,f_out写入3个1,如果0则f_out写入3个0,这代表晶胞中24个原子是否删除。
  ②如果发现c_out中读取的数字是0,则在a_arry中写入n_together个0和8-n_together个1,a_arry是个长度为8的数组,对其进行shuffle操作,代表随机删除晶胞中的分子。读取a_arry,如果是1则,f_out写入3个1,如果0则f_out写入3个0,这代表晶胞中24个原子是否删除。
  ③如果发现c_out中读取的数字是1,则f_out输入24个1,代表8个分子的24个原子都要写入。
  并且使用choose.txt记录哪个晶胞发生了客体分子的删除和哪个原子被删除了。
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
check = 0 #判别笼子类型
a_arry = [] #同晶胞内排列
c_out = [] #笼子的排列
f_out = [] #输出用序列

i = 0
j = 0
k = 0

choose = open('..\\result\\choose.txt', 'w')
choose.write("哪些晶胞内的气体将会扣除\n(0为扣除,1为未扣除)\n")
"""写入哪个晶胞需要删除CO2"""
i = 0
flag = -1
if(n_delete2 != 0):
flag = n_delete2
for i in range(27):
if (flag > 0): #其中一个晶胞扣除不同个数
c_out.append(0.5)
flag -= 1
elif (i < n_delete + n_delete2):
c_out.append(0)
else:
c_out.append(1)
random.shuffle(c_out)
choose.write(str(c_out) + "\n")

"""哪个位置需要删除原子"""
for i in range(27):
check = c_out[i]
if (check == 0.5):
for l in range(8):
if(l<n_together2):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
print(a_arry)
choose.write("第" + str(i+1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(8):
if(a_arry[j] == 0):
f_out.append(0)
f_out.append(0)
f_out.append(0)

else:
f_out.append(1)
f_out.append(1)
f_out.append(1)

a_arry=[]
elif (check == 0) :
for l in range(8):
if(l<n_together):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
print(a_arry)
choose.write("第" + str(i+1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(8):
if(a_arry[j] == 0):
f_out.append(0)
f_out.append(0)
f_out.append(0)

else:
f_out.append(1)
f_out.append(1)
f_out.append(1)

a_arry=[]
else :
for m in range(24):
f_out.append(1)

  打开resultco2作为输出文本文件,首先写入头文件。再把客体分子中的原子写入,根据f_out的输出,1写入该行,0则跳过这一行,也就是不写入,实现了删除的目的。最后把水分子文件写入,本文中水分子没有删除,全部写入就行,删除水分子和删除客体分子同理。
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
27
28
29
30
31
32
33
co2_read = open('..\\hyd\\big-and-small.txt', 'r')
line = co2_read.readlines()
resultco2 = open('..\\result\\result.data', 'w')
resultco2.write("# LAMMPS data file written by OVITO Basic 3.5.4\n" + str(num) + " atoms\n\n")
head = open('..\\hyd\\head.txt', 'r')
for hang in head:
"""将data的头文件写入"""
resultco2.writelines(hang)
"""将co2分子坐标写入"""
i = 0
for i in range(648):
if (f_out[i] == 1):
resultco2.writelines(line[i])
#resultco2.write("\n")
"""将水分子坐标写入"""
water = open('..\\hyd\\waterdata.txt')
for line2 in water:
resultco2.writelines(line2)

"""将每个气体是否存在写入choose"""
zong = []
flag = 1
sn = 0

for i in range(0,648,3):

zong.append(f_out[sn])
sn = sn + 3
flag = flag + 1
if(flag == 9):
flag = 1
choose.write("\n")
choose.write(str(zong) + "\n")
  关闭打开的所有文件。在result的文件夹中可以看到两个文件生成,一个是choose.txt记录了哪些原子被删除,便于后续的处理。result.data记录了模型的初步信息。
1
2
3
4
5
choose.close()
water.close()
co2_read.close()
head.close()
resultco2.close()
2.3 完整代码
  把该代码放入hyd-formation文件夹下。
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import numpy as np
import random
n_delete = 0 #要删笼中客体分子的晶胞个数
n_together = 0 #一个晶胞删除的个数
n_delete2 = 0 #不规则删除的晶胞个数
n_together2 = 0 #不规则删除的一个晶胞内需扣除笼子数

num = 648 - 3 * n_together * n_delete - 3 * n_together2 * n_delete2

num = num + 3726 #小笼内气体原子数 + 大笼内气体原子数 + 水的原子数
check = 0 #判别笼子类型
a_arry = [] #同晶胞内排列
c_out = [] #笼子的排列
f_out = [] #输出用序列

i = 0
j = 0
k = 0

choose = open('..\\result\\choose.txt', 'w')
choose.write("哪些晶胞内的气体将会扣除\n(0为扣除,1为未扣除)\n")
"""写入哪个晶胞需要删除CO2"""
i = 0
flag = -1
if(n_delete2 != 0):
flag = n_delete2
for i in range(27):
if (flag > 0): #其中一个晶胞扣除不同个数
c_out.append(0.5)
flag -= 1
elif (i < n_delete + n_delete2):
c_out.append(0)
else:
c_out.append(1)
random.shuffle(c_out)
print(c_out)
choose.write(str(c_out) + "\n")
for i in range(27):
check = c_out[i]
if (check == 0.5):
for l in range(8):
if(l<n_together2):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
print(a_arry)
choose.write("第" + str(i+1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(8):
if(a_arry[j] == 0):
f_out.append(0)
f_out.append(0)
f_out.append(0)

else:
f_out.append(1)
f_out.append(1)
f_out.append(1)

a_arry=[]
elif (check == 0) :
for l in range(8):
if(l<n_together):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
print(a_arry)
choose.write("第" + str(i+1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(8):
if(a_arry[j] == 0):
f_out.append(0)
f_out.append(0)
f_out.append(0)

else:
f_out.append(1)
f_out.append(1)
f_out.append(1)

a_arry=[]
else :
for m in range(24):
f_out.append(1)

co2_read = open('..\\hyd\\big-and-small.txt', 'r')
line = co2_read.readlines()
resultco2 = open('..\\result\\result.data', 'w')
resultco2.write("# LAMMPS data file written by OVITO Basic 3.5.4\n" + str(num) + " atoms\n\n")
head = open('..\\hyd\\head.txt', 'r')
for hang in head:
"""将data的头文件写入"""
resultco2.writelines(hang)
"""将co2分子坐标写入"""
i = 0
for i in range(648):
if (f_out[i] == 1):
resultco2.writelines(line[i])
#resultco2.write("\n")
"""将水分子坐标写入"""
water = open('..\\hyd\\waterdata.txt')
for line2 in water:
resultco2.writelines(line2)

"""将每个气体是否存在写入choose"""
zong = []
flag = 1
sn = 0

for i in range(0,648,3):

zong.append(f_out[sn])
sn = sn + 3
flag = flag + 1
if(flag == 9):
flag = 1
choose.write("\n")
choose.write(str(zong) + "\n")

choose.close()
water.close()
co2_read.close()
head.close()
resultco2.close()

大小笼等价代码small-equal-big.py 下载

2.4 其他代码
  提供了另外两种删除客体分子的代码,分别为区分大小笼big-or-small.py(可以指定删除大笼或者小笼)和随机代码random.py(在27个晶胞中随机进行删除客体分子)。

区分大小笼big-or-small.py 下载

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import numpy as np
import random
n_smalldelete = 0 #要删小笼中客体分子的小笼晶胞个数
n_smalltogether = 0 #一个晶胞删除小笼的个数(1 or 2)
n_bigdelete = 0 #要删客体分子的的大笼晶胞个数(0 - 27)
n_bigtogether = 0 #一个晶胞删除大笼的个数(1 - 6)

numsmall = 162 - 3 * n_smalltogether * n_smalldelete
numbig = 486 - 3 * n_bigtogether * n_bigdelete
num = numbig + numsmall + 3726 #小笼内气体原子数 + 大笼内气体原子数 + 水的原子数
check = 0 #判别笼子类型
a_arry = [] #同晶胞内排列
c_big = [] #小笼子的排列
c_small = [] #大笼子的排列
f_bigout = [] #输出用序列
f_smallout = [] #输出用序列

i = 0
j = 0
k = 0

choose = open('..\\result\\choose.txt', 'w')
choose.write("哪些晶胞内的气体将会扣除\n(0为扣除,1为未扣除)\n")

"""将扣除co2后的小笼气体坐标写入"""
choose.write("\n\n以下为小笼扣除序列:\n")
i = 0
for i in range(27):
if (i < n_smalldelete):
c_small.append(0)
else:
c_small.append(1)
random.shuffle(c_small)
choose.write(str(c_small) + "\n")
for i in range(27):
check = c_small[i]
if (check == 0) :
for l in range(2):
if(l<n_smalltogether):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
choose.write("第" + str(i + 1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(2):
if(a_arry[j] == 0):
f_smallout.append(0)
f_smallout.append(0)
f_smallout.append(0)

else:
f_smallout.append(1)
f_smallout.append(1)
f_smallout.append(1)

a_arry=[]
else :
for m in range(6):
f_smallout.append(1)

smallco2_read = open('..\\hyd\\small.txt', 'r')
line = smallco2_read.readlines()
resultco2 = open('..\\result\\result.data', 'w')
resultco2.write("# LAMMPS data file written by OVITO Basic 3.5.4\n" + str(num) + " atoms\n\n")
head = open('..\\hyd\\head.txt', 'r')
for hang in head:
"""将data的头文件写入"""
resultco2.writelines(hang)
i = 0
for i in range(162):
if (f_smallout[i] == 1):
resultco2.writelines(line[i])

smallco2_read.close()
head.close()

"""将扣除co2后的大笼气体坐标写入"""
choose.write("\n\n以下为大笼扣除序列:\n")
i = 0
for i in range(27):
if (i < n_bigdelete):
c_big.append(0)
else:
c_big.append(1)
random.shuffle(c_big)
choose.write(str(c_big) + "\n")
i = 0
for i in range(27):
check = c_big[i]
if (check == 0) :
for l in range(6):
if(l<n_bigtogether):
a_arry.append(0)
else:
a_arry.append(1)
random.shuffle(a_arry)
choose.write("第" + str(i + 1) + "个晶胞:" + str(a_arry) + "\n")
for j in range(6):
if(a_arry[j] == 0):
f_bigout.append(0)
f_bigout.append(0)
f_bigout.append(0)

else:
f_bigout.append(1)
f_bigout.append(1)
f_bigout.append(1)

a_arry = []
else:
for m in range(18):
f_bigout.append(1)

bigco2_read = open('..\\hyd\\big.txt', 'r')
line = bigco2_read.readlines()

i = 0
for i in range(486):
if (f_bigout[i] == 1):
resultco2.writelines(line[i])

bigco2_read.close()
head.close()

"""将水分子坐标写入"""
water = open('..\\hyd\\waterdata.txt')
for line2 in water:
resultco2.writelines(line2)


"""将每个气体是否存在写入"""
zong = []
flag = 1
sn = 0
bn = 0
for i in range(0,648,3):
if(flag ==2 or flag == 7):
zong.append(f_smallout[sn])
sn = sn + 3
else:
zong.append(f_bigout[bn])
bn = bn + 3
flag = flag + 1
if(flag == 9):
flag = 1
choose.write("\n")
choose.write(str(zong) + "\n")

choose.close()
water.close()
resultco2.close()

随机代码random.py 下载

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import numpy as np
import random
n_delete = 27 #要删客体分子的个数

num = 648 - 3 * n_delete

num = num + 3726 #小笼内气体原子数 + 大笼内气体原子数 + 水的原子数
check = 0 #判别笼子类型
a_arry = [] #同晶胞内排列
all = [] #整体晶胞的排列
c_out = [] #笼子的排列
f_out = [] #输出用序列

i = 0
j = 0
k = 0

choose = open('..\\result\\choose.txt', 'w')
choose.write("哪些晶胞内的气体将会扣除\n(0为扣除,1为未扣除)\n")
"""将扣除co2后的气体坐标写入"""
count = 0
i = 0
for i in range(216):
if(i < n_delete):
all.append(0)
else:
all.append(1)
random.shuffle(all)
"""寻找被扣除的晶胞是哪个"""
j = 0
for i in range(27):
flag = 1
for j in range(8):
if(all[i * 8 + j] == 0 ):
flag -= 1
if(flag < 1):
c_out.append(0)
else:
c_out.append(1)
print(c_out)
choose.write(str(c_out) + "\n")


for i in range(27):
if(c_out[i] == 0):
for j in range(8):
a_arry.append(all[i * 8 + j])
if (a_arry[j] == 0):
f_out.append(0)
f_out.append(0)
f_out.append(0)

else:
f_out.append(1)
f_out.append(1)
f_out.append(1)
print(a_arry)
choose.write("第" + str(i+1) + "个晶胞:" + str(a_arry) + "\n")
a_arry=[]
else:
for j in range(24):
f_out.append(1)


co2_read = open('..\\hyd\\big-and-small.txt', 'r')
line = co2_read.readlines()
resultco2 = open('..\\result\\result.data', 'w')
resultco2.write("# LAMMPS data file written by OVITO Basic 3.5.4\n" + str(num) + " atoms\n\n")
head = open('..\\hyd\\head.txt', 'r')
for hang in head:
"""将data的头文件写入"""
resultco2.writelines(hang)
i = 0
for i in range(648):
if (f_out[i] == 1):
resultco2.writelines(line[i])
#resultco2.write("\n")
"""将水分子坐标写入"""
water = open('..\\hyd\\waterdata.txt')
for line2 in water:
resultco2.writelines(line2)

"""将每个气体是否存在写入"""
zong = []
flag = 1
sn = 0

for i in range(0,648,3):

zong.append(f_out[sn])
sn = sn + 3
flag = flag + 1
if(flag == 9):
flag = 1
choose.write("\n")
choose.write(str(zong) + "\n")

choose.close()
water.close()
co2_read.close()
head.close()
resultco2.close()

3.模型bonds构建

  使用ovito打开result.data文件。
  ①在右侧Add modification中选择Visualization-Create bonds。

create-bonds1

  ②选择1-2(也就是O和H),在右侧输入1.5,建立H和O之间的化学键。

create-bonds2

  重复上述两步操作,建立大笼中C-O键和小笼中C-O键。一定要重复两步,不能直接在第二步基础上修改。直接在第二步修改,会导致只有一种键类型。
  完成后在左上方点击File-Export Data,选择保存类型LAMMPS Data File,选定位置进行保存,保存为bonds.data。

4.模型angles构建

  打开VMD,并依次输入以下四条命令。
1
2
3
4
cd C:/Users/Admin/Desktop/111
topo readlammpsdata bonds.data full
topo guessangles
topo writelammpsdata angles.data full
  第1行为打开存储bonds.data的路径,把cd后改为文件路径。
  第2行读取bonds.data文件。
  第3行根据文件建立键角,VMD会自行猜测。
  第4行是把含键角信息的文件输出,输出到当前文件夹中,名字为angles.data。

  至此,整个模型构建就完成了。删除方式和删除的分子类型都可以自行修改,思路都是类似的。