mdkits 0.1.28__tar.gz → 0.1.30__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mdkits might be problematic. Click here for more details.

Files changed (53) hide show
  1. {mdkits-0.1.28 → mdkits-0.1.30}/PKG-INFO +122 -26
  2. mdkits-0.1.30/README.md +295 -0
  3. {mdkits-0.1.28 → mdkits-0.1.30}/pyproject.toml +2 -1
  4. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/adsorbate.py +1 -0
  5. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/build_surface.py +1 -4
  6. mdkits-0.1.30/src/mdkits/md_cli/angle.py +122 -0
  7. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/md_cli/density.py +11 -13
  8. mdkits-0.1.30/src/mdkits/md_cli/dipole.py +120 -0
  9. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/md_cli/hb_distribution.py +14 -15
  10. mdkits-0.1.30/src/mdkits/md_cli/md_cli.py +30 -0
  11. mdkits-0.1.30/src/mdkits/md_cli/monitor.py +104 -0
  12. mdkits-0.1.30/src/mdkits/md_cli/msd.py +30 -0
  13. mdkits-0.1.30/src/mdkits/md_cli/rdf.py +39 -0
  14. mdkits-0.1.30/src/mdkits/md_cli/setting.py +14 -0
  15. {mdkits-0.1.28/src/mdkits/cli → mdkits-0.1.30/src/mdkits/md_cli}/wrap.py +1 -1
  16. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/mdkits.py +2 -4
  17. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/arg_type.py +2 -2
  18. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/encapsulated_mda.py +4 -1
  19. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/numpy_geo.py +10 -5
  20. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/out_err.py +1 -1
  21. mdkits-0.1.28/README.md +0 -200
  22. mdkits-0.1.28/src/mdkits/md_cli/md_cli.py +0 -19
  23. {mdkits-0.1.28 → mdkits-0.1.30}/LICENSE +0 -0
  24. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/__init__.py +0 -0
  25. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/__init__.py +0 -0
  26. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/build_bulk.py +0 -0
  27. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/build_cli.py +0 -0
  28. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/build_interface.py +0 -0
  29. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/build_solution.py +0 -0
  30. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/cut_surface.py +0 -0
  31. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/supercell.py +0 -0
  32. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/build_cli/water.xyz +0 -0
  33. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/,hb_distribution_down.py +0 -0
  34. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/convert.py +0 -0
  35. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/data.py +0 -0
  36. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/extract.py +0 -0
  37. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/hartree_potential.py +0 -0
  38. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/hartree_potential_ave.py +0 -0
  39. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/hb.py +0 -0
  40. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/packmol_input.py +0 -0
  41. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/cli/plot.py +0 -0
  42. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/config/__init__.py +0 -0
  43. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/config/settings.yml +0 -0
  44. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/dft_cli/cube.py +0 -0
  45. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/dft_cli/dft_cli.py +0 -0
  46. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/dft_cli/pdos.py +0 -0
  47. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/.fig_operation.py.swp +0 -0
  48. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/__init__.py +0 -0
  49. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/cp2k_input_parsing.py +0 -0
  50. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/encapsulated_ase.py +0 -0
  51. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/fig_operation.py +0 -0
  52. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/os_operation.py +0 -0
  53. {mdkits-0.1.28 → mdkits-0.1.30}/src/mdkits/util/structure_parsing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mdkits
3
- Version: 0.1.28
3
+ Version: 0.1.30
4
4
  Summary: kits for md or dft
5
5
  License: MIT
6
6
  Keywords: molecular dynamics,density functional theory
@@ -21,102 +21,144 @@ Requires-Dist: julia (>=0.6.2,<0.7.0)
21
21
  Requires-Dist: matplotlib (>=3.9.0,<4.0.0)
22
22
  Requires-Dist: numpy (>=1.26.4,<2.0.0)
23
23
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
24
+ Requires-Dist: tidynamics (>=1.1.2,<2.0.0)
24
25
  Project-URL: Repository, https://github.com/jxxcr/mdkits
25
26
  Description-Content-Type: text/markdown
26
27
 
27
- # MD 轨迹分析脚本
28
+ # mdkits
28
29
  `mdkits` 提供了多种工具, 安装脚本:
29
30
  ```bash
30
31
  pip install mdkits --upgrade
31
32
  ```
33
+ ## 通用的选项参数类型
34
+ 1. `CELL TYPE`: 指定晶胞参数, 如`10,10,10`, `10,10,10,90,90,90`等
35
+ 2. `FRAME RANGE`: 指定帧范围, 如`1`, `1:10:2`等
36
+ 3. `--group`和`--surface`: 按[选择语言](https://userguide.mdanalysis.org/stable/selections.html)选取分析对象
37
+ 4. `--update_water`, `--distance` 和 `--angle`: 在分析轨迹的过程中开启动态更新水分子的功能
32
38
 
39
+ ## 轨迹文件处理脚本
40
+ `md`为轨迹文件处理工具, 其中包含多个处理工具
33
41
  ### 密度分布
34
- `density`用于分析体系中的某种元素沿z轴的密度分布, 如分析体系中的`O`元素沿z轴的密度分布, `--element`选项指定元素使用`MDAnalysis`的[选择语言](https://userguide.mdanalysis.org/stable/selections.html):
42
+ `density`用于分析体系中的某种元素沿z轴的密度分布, 如分析体系中的`O`元素沿z轴的密度分布:
35
43
  ```bash
36
- mdkits density [FILENAME] --element="name H" --cell [FILENAME]
44
+ mdkits md density [FILENAME] --group="name H" --cell [FILENAME]
37
45
  ```
38
46
  这样会输出一个文件名为`density_name_H.dat`的文件, 第一列为z轴坐标, 第二列为浓度分布, 单位为 mol/L. 如果想输出为单位为 $g/cm^3$ 的密度分布, 可以指定`--atomic_mass` 选项, 如:
39
47
  ```bash
40
- mdkits density [FILENAME] --element="name H" --cell [FILENAME] --atomic_mass=1.00784
48
+ mdkits md density [FILENAME] --group="name H" --cell [FILENAME] --atomic_mass=1.00784
41
49
  ```
42
50
  则输出单位为 $g/cm^3$ 的密度分布. 可以指定表面原子来将密度分布归一化到表面, 如:
43
51
  ```bash
44
- mdkits density [FILENAME] --element="name O" --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
52
+ mdkits md density [FILENAME] --group="name O" --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
45
53
  ```
46
54
  这样会将密度分布归一化到表面, 同时以O原子的位置作为水分子的位置分析处理水分子的密度分布. 对于体系中存在 $OH^-$ 离子的体系可以使用`--update_water`的选项在每一帧更新水分子的位置, 不需要额外指定元素, 如:
47
55
  ```bash
48
- mdkits density [FILENAME] --update_water --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
56
+ mdkits md density [FILENAME] --update_water --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
49
57
  ```
50
58
  输出的文件名为`density_water.dat`.
51
59
 
52
60
  ### 氢键
53
-
54
- #### 单个水分子
55
-
56
- #### 氢键分布
61
+ `hb`用于分析体系中的氢键, 如分析体系中的氢键在z轴上的分布:
62
+ ```bash
63
+ mdkits md hb [FILENAME] --cell 10,10,40 --surface "prop z < 10" --update_water
64
+ ```
65
+ 或分析单个水分子的氢键:
66
+ ```bash
67
+ mdkits md hb [FILENAME] --cell 10,10,40 --index 15
68
+ ```
57
69
 
58
70
  ### 角度
71
+ `angel`用于分析水分子中的二分向量和OH向量与表面法向量的夹角的丰度分布, 如分析距离表面 5 Å 的水分子的角度丰度分布:
72
+ ```bash
73
+ mdkits md angle [FILENAME] --cell 10,10,40 --surface "name Pt" --water_height 5
74
+ ```
59
75
 
60
- #### 与表面法向量夹角分布
76
+ ### 偶极分布
77
+ `diople`用于分析体系中的偶极($\cos \phi \rho_{H_2 O}$)分布, 如分析体系中的 $\cos \phi \rho_{H_2 O}$ 分布:
78
+ ```bash
79
+ mdkits md diople [FILENAME] --cell 10,10,40 --surface "name Pt"
80
+ ```
61
81
 
62
- #### ion - O - ion 夹角分布
82
+ ### 径向分布函数(RDF)
83
+ `rdf`用于分析两个`group`之间的径向分布函数, 如分析体系中的`O`元素与`H`元素之间的径向分布函数:
84
+ ```bash
85
+ mdkits md rdf [FILENAME] --group "name O" "name H" --cell 10,10,40 --range 0.1 5
86
+ ```
63
87
 
64
- #### $\cos \phi \rho_{H_2 O}$ 分布
88
+ ### 均方位移(MSD)
89
+ `msd`用于分析体系中某些原子的均方位移, 如分析体系中`Li`原子在z轴上的均方位移:
90
+ ```bash
91
+ mdkits md msd [FILENAME] z "name Li"
92
+ ```
65
93
 
66
- ### RDF
94
+ ### 监控
95
+ `monitor`用于监控体系中原子高度, 键长和键角的变化, 如监控`index`为0的原子的高度:
96
+ ```bash
97
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 0
98
+ ```
99
+ 会输出0距离表面的高度随每一帧的变化, 如监控0-1的键长:
100
+ ```bash
101
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 0 -i 1
102
+ ```
103
+ 会输出0和1距离表面的高度和0-1之间的键长随每一帧的变化, 如监控1-0-2的键角:
104
+ ```bash
105
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 1 -i 0 -i 2
106
+ ```
107
+ 会输出1, 0, 2距离表面的高度, 1-0和0-2的键长和1-0-2的键角随每一帧的变化, 注意位于角上的原子应该放在中间
67
108
 
68
109
  ### 位置归一化
69
110
  `wrap`用于将轨迹文件中的原子位置进行归一化处理, 如将`[FILENAME]`中的原子位置归一化到晶胞中, 并输出为`wrapped.xyz`, 默认从`cp2k`的输出文件`input_inp`中读取`ABC`和`ALPHA_BETA_GAMMA`信息作为晶胞参数:
70
111
  ```bash
71
- mdkits wrap [FILENAME]
112
+ mdkits md wrap [FILENAME]
72
113
  ```
73
114
  或指定`cp2k`的输入文件:
74
115
  ```bash
75
- mdkits wrap [FILENAME] --cp2k_input_file setting.inp
116
+ mdkits md wrap [FILENAME] --cp2k_input_file setting.inp
76
117
  ```
77
118
  或指定晶胞参数:
78
119
  ```bash
79
- mdkits wrap [FILENAME] --cell 10,10,10
120
+ mdkits md wrap [FILENAME] --cell 10,10,10
80
121
  ```
81
122
  默认的`[FILENAME]`为`*-pos-1.xyz`
82
123
 
83
124
  ## DFT 性质分析脚本
125
+ `dft`为DFT性质分析工具, 其中包含多个分析工具
84
126
  ### PDOS
85
127
  `pdos`用于分析体系中的pdos, 分析[FILENAME]的d轨道的dos:
86
128
  ```bash
87
- mdkits pdos [FILENAME] -t d
129
+ mdkits dft pdos [FILENAME] -t d
88
130
  ```
89
131
 
90
132
  ### CUBE 文件
91
133
  `cube`用于处理[`cube`格式](https://paulbourke.net/dataformats/cube/)的文件, 将其在z轴上进行平均:
92
134
  ```bash
93
- mdkits cube [FILENAME]
135
+ mdkits dft cube [FILENAME]
94
136
  ```
95
137
  分析好的数据会输出为`cube.out`, 可以同时计算一个区域内的平均值:
96
138
  ```bash
97
- mdkits cube [FILENAME] -b 1 2
139
+ mdkits dft cube [FILENAME] -b 1 2
98
140
  ```
99
141
  会将平均值打印在屏幕上, 同时记录在`cube.out`中的注释行.
100
142
 
101
143
  ## 建模
102
- `build`为界面的工具, 其中包含多个建模工具
144
+ `build`为建模的工具, 其中包含多个建模工具
103
145
 
104
146
  ### 构建体相模型
105
147
  `bulk`用于构建体相模型, 如构建`Pt`的`fcc`体相模型:
106
148
  ```bash
107
- mdkits build_bulk Pt fcc
149
+ mdkits build bulk Pt fcc
108
150
  ```
109
151
  构建为常胞模型:
110
152
  ```bash
111
- mdkits build_bulk Pt fcc --cubic
153
+ mdkits build bulk Pt fcc --cubic
112
154
  ```
113
155
  构建一个`Caesium chloride`结构的模型:
114
156
  ```bash
115
- mdkits build_bulk CsCl cesiumchloride -a 4.123
157
+ mdkits build bulk CsCl cesiumchloride -a 4.123
116
158
  ```
117
159
  构建一个`fluorite `结构的模型:
118
160
  ```bash
119
- mdkits build_bulk BaF2 fluorite -a 6.196
161
+ mdkits build bulk BaF2 fluorite -a 6.196
120
162
  ```
121
163
 
122
164
  ### 构建表面模型
@@ -133,6 +175,60 @@ mdkits build surface Pt fcc111 2 2 3 --vacuum 15
133
175
  mdkits build surface C2 graphene 3 3 1 --vacuum 15
134
176
  ```
135
177
 
178
+ ### 从现有结构中构建表面模型
179
+ `cut`用于从现有的结构中构建表面模型(模型必须为常胞模型), 如从`Pt_fcc.cif`中构建`fcc331`表面模型:
180
+ ```bash
181
+ mdkits build cut Pt_fcc.cif --face 3 3 1 --size 3 3 5 --vacuum 15
182
+ ```
183
+
184
+ ### 在表面结构上添加吸附物
185
+ `adsorbate`用于在表面结构上添加吸附物, 如在`surface.cif`上添加`H`原子:
186
+ ```bash
187
+ mdkits build adsorbate surface.cif H --select "index 0" --height 1
188
+ ```
189
+ 或在`Pt_fcc111_335.cif`上添加覆盖度为5的`H`原子:
190
+ ```bash
191
+ mdkits build adsorbate Pt_fcc111_335.cif H --select "prop z > 16" --height 2 --cover 5
192
+ ```
193
+
194
+ ### 构建溶液相模型
195
+ `solution`用于构建溶液相模型, 初次使用时应先安装`juliaup`:
196
+ ```bash
197
+ mdkits build solution --install_julia
198
+ ```
199
+ 然后安装`Packmol`:
200
+ ```bash
201
+ mdkits build solution --install_packmol
202
+ ```
203
+ 成功安装后就可以使用`solution`功能了, 如构建一个32个水分子的水盒子:
204
+ ```bash
205
+ mdkits build solution --water_number 32 --cell 9.86,9.86,9.86
206
+ ```
207
+ 或构建一个含有离子的溶液:
208
+ ```bash
209
+ mdkits build solution li.xyz k.xyz --water_number 64 --tolerance 2.5 -n 25 -n 45 --cell 15,15,15
210
+ ```
211
+ 其中`-n`的个数必须与指定的溶剂分子种类数量一致, 用于分别指定添加的溶剂的数量. 或者从`packmol`的输入文件中构建溶液相模型:
212
+ ```bash
213
+ mdkits build solution input.pm input2.pm --infile
214
+ ```
215
+
216
+ ### 构建界面模型
217
+ `interface`用于构建界面模型, 如构建一个没有真空的界面模型:
218
+ ```bash
219
+ mdkits build interface --slab Pt_fcc100_555.cif --sol water_160.cif
220
+ ```
221
+ 或构建一个带有气相模型的界面:
222
+ ```bash
223
+ mdkits build interface --slab Pt_fcc100_555.cif --sol water_160.cif --cap ne --vacuum 20
224
+ ```
225
+
226
+ ### 构建超胞模型
227
+ `supercell`用于构建超胞模型:
228
+ ```bash
229
+ mdkits build supercell Li3PO4.cif 2 2 2
230
+ ```
231
+
136
232
  ## 其他
137
233
  ### 轨迹提取
138
234
  `extract`用于提取轨迹文件中的特定的帧, 如从`frames.xyz`中提取第 1000 帧到第 2000 帧的轨迹文件, 并输出为`1000-2000.xyz`, `-r`选项的参数与`Python`的切片语法一致:
@@ -0,0 +1,295 @@
1
+ # mdkits
2
+ `mdkits` 提供了多种工具, 安装脚本:
3
+ ```bash
4
+ pip install mdkits --upgrade
5
+ ```
6
+ ## 通用的选项参数类型
7
+ 1. `CELL TYPE`: 指定晶胞参数, 如`10,10,10`, `10,10,10,90,90,90`等
8
+ 2. `FRAME RANGE`: 指定帧范围, 如`1`, `1:10:2`等
9
+ 3. `--group`和`--surface`: 按[选择语言](https://userguide.mdanalysis.org/stable/selections.html)选取分析对象
10
+ 4. `--update_water`, `--distance` 和 `--angle`: 在分析轨迹的过程中开启动态更新水分子的功能
11
+
12
+ ## 轨迹文件处理脚本
13
+ `md`为轨迹文件处理工具, 其中包含多个处理工具
14
+ ### 密度分布
15
+ `density`用于分析体系中的某种元素沿z轴的密度分布, 如分析体系中的`O`元素沿z轴的密度分布:
16
+ ```bash
17
+ mdkits md density [FILENAME] --group="name H" --cell [FILENAME]
18
+ ```
19
+ 这样会输出一个文件名为`density_name_H.dat`的文件, 第一列为z轴坐标, 第二列为浓度分布, 单位为 mol/L. 如果想输出为单位为 $g/cm^3$ 的密度分布, 可以指定`--atomic_mass` 选项, 如:
20
+ ```bash
21
+ mdkits md density [FILENAME] --group="name H" --cell [FILENAME] --atomic_mass=1.00784
22
+ ```
23
+ 则输出单位为 $g/cm^3$ 的密度分布. 可以指定表面原子来将密度分布归一化到表面, 如:
24
+ ```bash
25
+ mdkits md density [FILENAME] --group="name O" --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
26
+ ```
27
+ 这样会将密度分布归一化到表面, 同时以O原子的位置作为水分子的位置分析处理水分子的密度分布. 对于体系中存在 $OH^-$ 离子的体系可以使用`--update_water`的选项在每一帧更新水分子的位置, 不需要额外指定元素, 如:
28
+ ```bash
29
+ mdkits md density [FILENAME] --update_water --cell 10,10,10 --atomic_mass=18.01528 --surface="name Pt and name Ru"
30
+ ```
31
+ 输出的文件名为`density_water.dat`.
32
+
33
+ ### 氢键
34
+ `hb`用于分析体系中的氢键, 如分析体系中的氢键在z轴上的分布:
35
+ ```bash
36
+ mdkits md hb [FILENAME] --cell 10,10,40 --surface "prop z < 10" --update_water
37
+ ```
38
+ 或分析单个水分子的氢键:
39
+ ```bash
40
+ mdkits md hb [FILENAME] --cell 10,10,40 --index 15
41
+ ```
42
+
43
+ ### 角度
44
+ `angel`用于分析水分子中的二分向量和OH向量与表面法向量的夹角的丰度分布, 如分析距离表面 5 Å 的水分子的角度丰度分布:
45
+ ```bash
46
+ mdkits md angle [FILENAME] --cell 10,10,40 --surface "name Pt" --water_height 5
47
+ ```
48
+
49
+ ### 偶极分布
50
+ `diople`用于分析体系中的偶极($\cos \phi \rho_{H_2 O}$)分布, 如分析体系中的 $\cos \phi \rho_{H_2 O}$ 分布:
51
+ ```bash
52
+ mdkits md diople [FILENAME] --cell 10,10,40 --surface "name Pt"
53
+ ```
54
+
55
+ ### 径向分布函数(RDF)
56
+ `rdf`用于分析两个`group`之间的径向分布函数, 如分析体系中的`O`元素与`H`元素之间的径向分布函数:
57
+ ```bash
58
+ mdkits md rdf [FILENAME] --group "name O" "name H" --cell 10,10,40 --range 0.1 5
59
+ ```
60
+
61
+ ### 均方位移(MSD)
62
+ `msd`用于分析体系中某些原子的均方位移, 如分析体系中`Li`原子在z轴上的均方位移:
63
+ ```bash
64
+ mdkits md msd [FILENAME] z "name Li"
65
+ ```
66
+
67
+ ### 监控
68
+ `monitor`用于监控体系中原子高度, 键长和键角的变化, 如监控`index`为0的原子的高度:
69
+ ```bash
70
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 0
71
+ ```
72
+ 会输出0距离表面的高度随每一帧的变化, 如监控0-1的键长:
73
+ ```bash
74
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 0 -i 1
75
+ ```
76
+ 会输出0和1距离表面的高度和0-1之间的键长随每一帧的变化, 如监控1-0-2的键角:
77
+ ```bash
78
+ mdkits md monitor [FILENAME] --cell 10,10,40 --surface "name Pt" -i 1 -i 0 -i 2
79
+ ```
80
+ 会输出1, 0, 2距离表面的高度, 1-0和0-2的键长和1-0-2的键角随每一帧的变化, 注意位于角上的原子应该放在中间
81
+
82
+ ### 位置归一化
83
+ `wrap`用于将轨迹文件中的原子位置进行归一化处理, 如将`[FILENAME]`中的原子位置归一化到晶胞中, 并输出为`wrapped.xyz`, 默认从`cp2k`的输出文件`input_inp`中读取`ABC`和`ALPHA_BETA_GAMMA`信息作为晶胞参数:
84
+ ```bash
85
+ mdkits md wrap [FILENAME]
86
+ ```
87
+ 或指定`cp2k`的输入文件:
88
+ ```bash
89
+ mdkits md wrap [FILENAME] --cp2k_input_file setting.inp
90
+ ```
91
+ 或指定晶胞参数:
92
+ ```bash
93
+ mdkits md wrap [FILENAME] --cell 10,10,10
94
+ ```
95
+ 默认的`[FILENAME]`为`*-pos-1.xyz`
96
+
97
+ ## DFT 性质分析脚本
98
+ `dft`为DFT性质分析工具, 其中包含多个分析工具
99
+ ### PDOS
100
+ `pdos`用于分析体系中的pdos, 分析[FILENAME]的d轨道的dos:
101
+ ```bash
102
+ mdkits dft pdos [FILENAME] -t d
103
+ ```
104
+
105
+ ### CUBE 文件
106
+ `cube`用于处理[`cube`格式](https://paulbourke.net/dataformats/cube/)的文件, 将其在z轴上进行平均:
107
+ ```bash
108
+ mdkits dft cube [FILENAME]
109
+ ```
110
+ 分析好的数据会输出为`cube.out`, 可以同时计算一个区域内的平均值:
111
+ ```bash
112
+ mdkits dft cube [FILENAME] -b 1 2
113
+ ```
114
+ 会将平均值打印在屏幕上, 同时记录在`cube.out`中的注释行.
115
+
116
+ ## 建模
117
+ `build`为建模的工具, 其中包含多个建模工具
118
+
119
+ ### 构建体相模型
120
+ `bulk`用于构建体相模型, 如构建`Pt`的`fcc`体相模型:
121
+ ```bash
122
+ mdkits build bulk Pt fcc
123
+ ```
124
+ 构建为常胞模型:
125
+ ```bash
126
+ mdkits build bulk Pt fcc --cubic
127
+ ```
128
+ 构建一个`Caesium chloride`结构的模型:
129
+ ```bash
130
+ mdkits build bulk CsCl cesiumchloride -a 4.123
131
+ ```
132
+ 构建一个`fluorite `结构的模型:
133
+ ```bash
134
+ mdkits build bulk BaF2 fluorite -a 6.196
135
+ ```
136
+
137
+ ### 构建表面模型
138
+ `surface`用于构建常见的表面模型, 骑用法为:
139
+ ```bash
140
+ mdkits build surface [ELEMENT] [SURFACE_TYPE] [SIZE]
141
+ ```
142
+ 如构建`Pt`的`fcc111`表面模型:
143
+ ```bash
144
+ mdkits build surface Pt fcc111 2 2 3 --vacuum 15
145
+ ```
146
+ 构建石墨烯表面:
147
+ ```bash
148
+ mdkits build surface C2 graphene 3 3 1 --vacuum 15
149
+ ```
150
+
151
+ ### 从现有结构中构建表面模型
152
+ `cut`用于从现有的结构中构建表面模型(模型必须为常胞模型), 如从`Pt_fcc.cif`中构建`fcc331`表面模型:
153
+ ```bash
154
+ mdkits build cut Pt_fcc.cif --face 3 3 1 --size 3 3 5 --vacuum 15
155
+ ```
156
+
157
+ ### 在表面结构上添加吸附物
158
+ `adsorbate`用于在表面结构上添加吸附物, 如在`surface.cif`上添加`H`原子:
159
+ ```bash
160
+ mdkits build adsorbate surface.cif H --select "index 0" --height 1
161
+ ```
162
+ 或在`Pt_fcc111_335.cif`上添加覆盖度为5的`H`原子:
163
+ ```bash
164
+ mdkits build adsorbate Pt_fcc111_335.cif H --select "prop z > 16" --height 2 --cover 5
165
+ ```
166
+
167
+ ### 构建溶液相模型
168
+ `solution`用于构建溶液相模型, 初次使用时应先安装`juliaup`:
169
+ ```bash
170
+ mdkits build solution --install_julia
171
+ ```
172
+ 然后安装`Packmol`:
173
+ ```bash
174
+ mdkits build solution --install_packmol
175
+ ```
176
+ 成功安装后就可以使用`solution`功能了, 如构建一个32个水分子的水盒子:
177
+ ```bash
178
+ mdkits build solution --water_number 32 --cell 9.86,9.86,9.86
179
+ ```
180
+ 或构建一个含有离子的溶液:
181
+ ```bash
182
+ mdkits build solution li.xyz k.xyz --water_number 64 --tolerance 2.5 -n 25 -n 45 --cell 15,15,15
183
+ ```
184
+ 其中`-n`的个数必须与指定的溶剂分子种类数量一致, 用于分别指定添加的溶剂的数量. 或者从`packmol`的输入文件中构建溶液相模型:
185
+ ```bash
186
+ mdkits build solution input.pm input2.pm --infile
187
+ ```
188
+
189
+ ### 构建界面模型
190
+ `interface`用于构建界面模型, 如构建一个没有真空的界面模型:
191
+ ```bash
192
+ mdkits build interface --slab Pt_fcc100_555.cif --sol water_160.cif
193
+ ```
194
+ 或构建一个带有气相模型的界面:
195
+ ```bash
196
+ mdkits build interface --slab Pt_fcc100_555.cif --sol water_160.cif --cap ne --vacuum 20
197
+ ```
198
+
199
+ ### 构建超胞模型
200
+ `supercell`用于构建超胞模型:
201
+ ```bash
202
+ mdkits build supercell Li3PO4.cif 2 2 2
203
+ ```
204
+
205
+ ## 其他
206
+ ### 轨迹提取
207
+ `extract`用于提取轨迹文件中的特定的帧, 如从`frames.xyz`中提取第 1000 帧到第 2000 帧的轨迹文件, 并输出为`1000-2000.xyz`, `-r`选项的参数与`Python`的切片语法一致:
208
+ ```bash
209
+ mdkits extract frames.xyz -r 1000:2000 -o 1000-2000.xyz
210
+ ```
211
+ 或从`cp2k`的默认输出的轨迹文件`*-pos-1.xyz`文件中提取最后一帧输出为`extracted.xyz`(`extract`的默认行为):
212
+ ```bash
213
+ mdkits extract
214
+ ```
215
+ 或每50帧输出一个结构到`./coord`目录中, 同时调整输出格式为`cp2k`的`@INCLUDE coord.xyz`的形式:
216
+ ```bash
217
+ mdkits extract -cr ::50
218
+ ```
219
+
220
+ ### 结构文件转换
221
+ `convert`用于将结构文件从一种格式转换为另一种格式, 如将`structure.xyz`转换为`out.cif`(默认文件名为`out`), 对于不储存周期性边界条件的文件, 可以使用`--cell`选项指定`PBC`:
222
+ ```bash
223
+ mdkits convert -c structure.xyz --cell 10,10,10
224
+ ```
225
+ 将`structure.cif`转换为`POSCAR`:
226
+ ```bash
227
+ mdkits convert -v structure.cif
228
+ ```
229
+ 将`structure.cif`转换为`structure_xyz.xyz`:
230
+ ```bash
231
+ mdkits convert -c structure.cif -o structure_xyz
232
+ ```
233
+
234
+ ### 数据处理
235
+ `data`用于对数据进行处理如:
236
+ 1. `--nor`: 对数据进行归一化处理
237
+ 2. `--gaus`: 对数据进行高斯过滤
238
+ 3. `--fold`: 堆数据进行折叠平均
239
+ 4. `--err`: 计算数据的误差棒
240
+
241
+
242
+ ### 绘图工具
243
+ `plot`用于绘制数据图, `plot`需要读取`yaml`格式的配置文件进行绘图, `yaml`文件的形式如下:
244
+ ```yaml
245
+ # plot mode 1
246
+ figure1:
247
+ data:
248
+ legend1: ./data1.dat
249
+ legend2: ./data2.dat
250
+ x:
251
+ 0: x-axis
252
+ y:
253
+ 1: y-axis
254
+ x_range:
255
+ - 5
256
+ - 15
257
+
258
+ # plot mode 2
259
+ figure2:
260
+ data:
261
+ y-xais: ./data.dat
262
+ x:
263
+ 0: x-axis
264
+ y:
265
+ 1: legend1
266
+ 2: legend2
267
+ 3: legend3
268
+ 4: legend4
269
+ 5: legend5
270
+ y_range:
271
+ - 0.5
272
+ - 6
273
+ legend_fontsize: 12
274
+
275
+ # plot mode error
276
+ 12_dp_e_error:
277
+ data:
278
+ legend: ./error.dat
279
+ x:
280
+ 0: x-axis
281
+ y:
282
+ 1: y-axis
283
+ fold: dp
284
+ legend_fontsize: 12
285
+ ```
286
+ 如上`plot`支持三种绘图模式, `mode 1`, `mode 2`和`mode error`. `mode 1`用于绘制多组数据文件的同一列数据对比, `mode 2`用于绘制同一数据文件的不同列数据对比, `mode error`用于绘制均方根误差图.
287
+
288
+ `plot`可以同时处理多个`yaml`文件, 每个`yaml`文件可以包含多个绘图配置, `mode 1`和`mode 2`的绘图配置可以自动识别, 但是`error`模式需要而外指定, 如:
289
+ ```bash
290
+ mdkits plot *.yaml
291
+ ```
292
+ 和:
293
+ ```bash
294
+ mdkits plot *.yaml --error
295
+ ```
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "mdkits"
3
- version = "0.1.28"
3
+ version = "0.1.30"
4
4
  description = "kits for md or dft"
5
5
  readme = "README.md"
6
6
  authors = ["jxxcr <jixxcr@qq.com>"]
@@ -22,6 +22,7 @@ pyyaml = "^6.0.1"
22
22
  Cp2kData = "^0.7.2"
23
23
  numpy = "^1.26.4"
24
24
  julia = "^0.6.2"
25
+ tidynamics = "^1.1.2"
25
26
 
26
27
  [tool.poetry.group.dev.dependencies]
27
28
  pylint = "^2.17.4"
@@ -18,6 +18,7 @@ from mdkits.util import arg_type, encapsulated_ase, out_err
18
18
  @click.option('--offset', type=click.Tuple([float, float]), help='adjust site', default=(0, 0), show_default=True)
19
19
  @click.option("--cover", type=int, help='cover the surface with adsorbate randomly')
20
20
  def main(atoms, adsorbate, cell, select, height, rotate, offset, cover):
21
+ """add adsorbate molcule to the surface"""
21
22
  if height is None:
22
23
  raise ValueError("height is required")
23
24
 
@@ -22,10 +22,7 @@ def surface_check(obj, surface_type):
22
22
  @click.option('--orth', is_flag=True, help='if specified and true, forces the creation of a unit cell with orthogonal basis vectors. if the default is such a unit cell, this argument is not supported')
23
23
  @click.option('--vacuum', type=float, help='designate vacuum of surface, default is None', default=0.1, show_default=True)
24
24
  def main(symbol, surface, size, kind, a, c, thickness, orth, vacuum):
25
- #if args.primitive:
26
- # a = args.a * 0.7071 * 2
27
- #else:
28
- # a = args.a
25
+ """build a common surface"""
29
26
 
30
27
  vacuum = vacuum / 2
31
28
  build_surface = surface_check(build, surface)
@@ -0,0 +1,122 @@
1
+ import click
2
+ from MDAnalysis import Universe
3
+ from MDAnalysis.analysis.base import AnalysisBase
4
+ import MDAnalysis
5
+ import sys
6
+ from mdkits.util import numpy_geo, encapsulated_mda, arg_type
7
+ import numpy as np
8
+ from .setting import common_setting
9
+
10
+
11
+ class Angle_distribution(AnalysisBase):
12
+ def __init__(self, filename, cell, water_height, update_water, surface, distance_judg=None, angle_judg=(None, None), dt=0.001, bin_size=5):
13
+ u = Universe(filename)
14
+ u.trajectory.ts.dt = dt
15
+ u.dimensions = cell
16
+
17
+ self.u = u
18
+ self.atomgroup = u.select_atoms("all")
19
+ self.bin_size = bin_size
20
+ self.frame_count = 0
21
+ self.surface = surface
22
+ self.update_water = update_water
23
+ self.mid_z = u.dimensions[2]/2
24
+
25
+ self.normal_up = np.array([0, 0, 1])
26
+ self.normal_down = np.array([0, 0, -1])
27
+ self.total_angle = 180
28
+
29
+ if water_height is None:
30
+ sys.exit("Please specify the water height")
31
+ else:
32
+ self.water_height = water_height
33
+
34
+ if self.update_water:
35
+ self.distance_judg = distance_judg
36
+ self.angle_judg = angle_judg
37
+
38
+ if surface is not None:
39
+ self.surface_group = self.atomgroup.select_atoms(f"{surface}")
40
+ if self.surface_group.n_atoms == 0:
41
+ sys.exit("Please specify the correct surface group")
42
+ else:
43
+ sys.exit("Please specify a surface group")
44
+
45
+ super(Angle_distribution, self).__init__(self.atomgroup.universe.trajectory, verbose=True)
46
+
47
+ def _prepare(self):
48
+ self.bin_num = int(self.total_angle / self.bin_size) + 2
49
+ self.angle_w_distribution = np.zeros(self.bin_num, dtype=np.float64)
50
+ self.angle_oh_distribution = np.zeros(self.bin_num, dtype=np.float64)
51
+
52
+ def _append(self, angle, anglew=True):
53
+ bins = np.floor(angle / self.bin_size).astype(int) + 1
54
+
55
+ if anglew:
56
+ bins = bins[bins < len(self.angle_w_distribution)]
57
+ np.add.at(self.angle_w_distribution, bins, 1)
58
+ else:
59
+ bins = bins[bins < len(self.angle_oh_distribution)]
60
+ np.add.at(self.angle_oh_distribution, bins, 1)
61
+
62
+
63
+ def _single_frame(self):
64
+ surface = numpy_geo.find_surface(self.surface_group.positions[:, 2])
65
+
66
+ if len(surface) == 1:
67
+ o_group = self.atomgroup.select_atoms(f"name O and prop z < {surface[0]+self.water_height}", updating=True)
68
+ else:
69
+ o_group = self.atomgroup.select_atoms(f"name O and (prop z < {surface[0]+self.water_height} or prop z > {surface[1]-self.water_height})", updating=True)
70
+
71
+ h_group = self.atomgroup.select_atoms("name H")
72
+
73
+ if self.update_water:
74
+ o, oh1, oh2 = encapsulated_mda.update_water(self, o_group=o_group, h_group=h_group, distance_judg=self.distance_judg, angle_judg=self.angle_judg, return_index=False)
75
+ else:
76
+ o = o_group
77
+ oh1 = self.atomgroup[o_group.indices + 1]
78
+ oh2 = self.atomgroup[o_group.indices + 2]
79
+
80
+ vec1 = MDAnalysis.lib.distances.minimize_vectors(oh1.positions - o.positions, self.u.dimensions)
81
+ vec2 = MDAnalysis.lib.distances.minimize_vectors(oh2.positions - o.positions, self.u.dimensions)
82
+
83
+ bisector = numpy_geo.vector_between_two_vector(vec1, vec2)
84
+
85
+ angle_vec1 = np.hstack((numpy_geo.vector_vector_angle(vec1[o.positions[:, 2] < self.mid_z], self.normal_up), numpy_geo.vector_vector_angle(vec1[o.positions[:, 2] > self.mid_z], self.normal_down)))
86
+
87
+ angle_vec2 = np.hstack((numpy_geo.vector_vector_angle(vec2[o.positions[:, 2] < self.mid_z], self.normal_up), numpy_geo.vector_vector_angle(vec2[o.positions[:, 2] > self.mid_z], self.normal_down)))
88
+
89
+ angle_bisector = np.hstack((numpy_geo.vector_vector_angle(bisector[o.positions[:, 2] < self.mid_z], self.normal_up), numpy_geo.vector_vector_angle(bisector[o.positions[:, 2] > self.mid_z], self.normal_down)))
90
+
91
+ self._append(angle_vec1, anglew=False)
92
+ self._append(angle_vec2, anglew=False)
93
+ self._append(angle_bisector)
94
+
95
+ self.frame_count += 1
96
+
97
+ def _conclude(self):
98
+ if self.frame_count > 0:
99
+ average_angle_w = self.angle_w_distribution / self.frame_count
100
+ average_angle_oh = self.angle_oh_distribution / (self.frame_count*2)
101
+ bins_z = np.arange(len(average_angle_w)) * self.bin_size
102
+ conbined_data = np.column_stack((bins_z, average_angle_w, average_angle_oh))
103
+ np.savetxt("angle_distribution.dat", conbined_data, header="angle\tw_suf_dist\toh_suf_dist", fmt='%.5f', delimiter='\t')
104
+
105
+
106
+ @click.command(name="angle", help="analysis angle between normal vectors and OH vector or bisector")
107
+ @common_setting
108
+ @click.option("--water_height", type=float, help="water height from surface")
109
+ def main(filename, cell, water_height, update_water, distance, angle, surface, r):
110
+ """analysis angle between normal vectors and OH vector or bisector"""
111
+ a = Angle_distribution(filename, cell, water_height, update_water, distance_judg=distance, angle_judg=angle, surface=surface)
112
+ if r is not None:
113
+ if len(r) == 2:
114
+ a.run(start=r[0], stop=r[1])
115
+ elif len(r) == 3:
116
+ a.run(start=r[0], stop=r[1], step=r[2])
117
+ else:
118
+ a.run()
119
+
120
+
121
+ if __name__ == "__main__":
122
+ main()