ion-CSP 2.0.2__py3-none-any.whl
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.
- ion_CSP/__init__.py +8 -0
- ion_CSP/app.py +201 -0
- ion_CSP/convert_SMILES.py +291 -0
- ion_CSP/empirical_estimate.py +505 -0
- ion_CSP/gen_opt.py +378 -0
- ion_CSP/identify_molecules.py +88 -0
- ion_CSP/log_and_time.py +234 -0
- ion_CSP/mlp_opt.py +154 -0
- ion_CSP/read_mlp_density.py +144 -0
- ion_CSP/steps_opt_monitor.sh +110 -0
- ion_CSP/upload_download.py +487 -0
- ion_CSP/vasp_processing.py +299 -0
- ion_csp-2.0.2.dist-info/METADATA +83 -0
- ion_csp-2.0.2.dist-info/RECORD +18 -0
- ion_csp-2.0.2.dist-info/WHEEL +5 -0
- ion_csp-2.0.2.dist-info/entry_points.txt +2 -0
- ion_csp-2.0.2.dist-info/licenses/LICENSE +21 -0
- ion_csp-2.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,299 @@
|
|
1
|
+
import os
|
2
|
+
import csv
|
3
|
+
import json
|
4
|
+
import yaml
|
5
|
+
import shutil
|
6
|
+
import logging
|
7
|
+
from ase.io import ParseError
|
8
|
+
from ase.io.vasp import read_vasp_out
|
9
|
+
from dpdispatcher import Machine, Resources, Task, Submission
|
10
|
+
from ion_CSP.log_and_time import redirect_dpdisp_logging
|
11
|
+
from ion_CSP.identify_molecules import identify_molecules, molecules_information
|
12
|
+
|
13
|
+
|
14
|
+
class VaspProcessing:
|
15
|
+
def __init__(self, work_dir: str):
|
16
|
+
redirect_dpdisp_logging(os.path.join(work_dir, "dpdispatcher.log"))
|
17
|
+
self.base_dir = work_dir
|
18
|
+
os.chdir(self.base_dir)
|
19
|
+
self.for_vasp_opt_dir = f"{work_dir}/3_for_vasp_opt"
|
20
|
+
self.vasp_optimized_dir = f"{work_dir}/4_vasp_optimized"
|
21
|
+
self.param_dir = os.path.join(os.path.dirname(__file__), "../../param")
|
22
|
+
|
23
|
+
def dpdisp_vasp_tasks(
|
24
|
+
self,
|
25
|
+
machine: str,
|
26
|
+
resources: str,
|
27
|
+
nodes: int = 1,
|
28
|
+
):
|
29
|
+
"""
|
30
|
+
Based on the dpdispatcher module, prepare and submit files for optimization on remote server or local machine.
|
31
|
+
"""
|
32
|
+
# 调整工作目录,减少错误发生
|
33
|
+
os.chdir(self.for_vasp_opt_dir)
|
34
|
+
# 读取machine.json和resources.json的参数
|
35
|
+
if machine.endswith(".json"):
|
36
|
+
machine = Machine.load_from_json(machine)
|
37
|
+
elif machine.endswith(".yaml"):
|
38
|
+
machine = Machine.load_from_yaml(machine)
|
39
|
+
else:
|
40
|
+
raise KeyError("Not supported machine file type")
|
41
|
+
if resources.endswith(".json"):
|
42
|
+
resources = Resources.load_from_json(resources)
|
43
|
+
elif resources.endswith(".yaml"):
|
44
|
+
resources = Resources.load_from_yaml(resources)
|
45
|
+
else:
|
46
|
+
raise KeyError("Not supported resources file type")
|
47
|
+
# 由于dpdispatcher对于远程服务器以及本地运行的forward_common_files的默认存放位置不同,因此需要预先进行判断,从而不改动优化脚本
|
48
|
+
machine_inform = machine.serialize()
|
49
|
+
if machine_inform["context_type"] == "SSHContext":
|
50
|
+
# 如果调用远程服务器,则创建二级目录
|
51
|
+
parent = "data/"
|
52
|
+
elif machine_inform["context_type"] == "LocalContext":
|
53
|
+
# 如果在本地运行作业,则只在后续创建一级目录
|
54
|
+
parent = ""
|
55
|
+
|
56
|
+
# 获取dir文件夹中所有以prefix_name开头的文件,在此实例中为POSCAR_
|
57
|
+
mlp_contcar_files = [
|
58
|
+
f for f in os.listdir(self.for_vasp_opt_dir) if f.startswith("CONTCAR_")
|
59
|
+
]
|
60
|
+
# 创建一个嵌套列表来存储每个节点的任务并将文件平均依次分配给每个节点
|
61
|
+
# 例如:对于10个结构文件任务分发给4个节点的情况,则4个节点领到的任务分别[0, 4, 8], [1, 5, 9], [2, 6], [3, 7]
|
62
|
+
node_jobs = [[] for _ in range(nodes)]
|
63
|
+
for index, file in enumerate(mlp_contcar_files):
|
64
|
+
node_index = index % nodes
|
65
|
+
node_jobs[node_index].append(index)
|
66
|
+
task_list = []
|
67
|
+
for pop in range(nodes):
|
68
|
+
forward_files = [
|
69
|
+
"INCAR_1",
|
70
|
+
"INCAR_2",
|
71
|
+
"POTCAR_H",
|
72
|
+
"POTCAR_C",
|
73
|
+
"POTCAR_N",
|
74
|
+
"POTCAR_O",
|
75
|
+
"sub.sh",
|
76
|
+
]
|
77
|
+
backward_files = ["log", "err"]
|
78
|
+
# 将所有参数文件各复制一份到每个 task_dir 目录下
|
79
|
+
task_dir = os.path.join(self.for_vasp_opt_dir, f"{parent}pop{pop}")
|
80
|
+
os.makedirs(task_dir, exist_ok=True)
|
81
|
+
for file in forward_files:
|
82
|
+
shutil.copyfile(f"{self.param_dir}/{file}", f"{task_dir}/{file}")
|
83
|
+
for job_i in node_jobs[pop]:
|
84
|
+
# 将分配好的POSCAR文件添加到对应的上传文件中
|
85
|
+
forward_files.append(mlp_contcar_files[job_i])
|
86
|
+
vasp_dir = mlp_contcar_files[job_i].split("CONTCAR_")[1]
|
87
|
+
# 每个POSCAR文件在优化后都取回对应的CONTCAR和OUTCAR输出文件
|
88
|
+
backward_files.append(f"{vasp_dir}/fine/*")
|
89
|
+
backward_files.append(f"{vasp_dir}/*")
|
90
|
+
shutil.copyfile(
|
91
|
+
f"{self.for_vasp_opt_dir}/{mlp_contcar_files[job_i]}",
|
92
|
+
f"{task_dir}/{mlp_contcar_files[job_i]}",
|
93
|
+
)
|
94
|
+
|
95
|
+
remote_task_dir = f"{parent}pop{pop}"
|
96
|
+
command = "chmod +x sub.sh && ./sub.sh"
|
97
|
+
task = Task(
|
98
|
+
command=command,
|
99
|
+
task_work_path=remote_task_dir,
|
100
|
+
forward_files=forward_files,
|
101
|
+
backward_files=backward_files,
|
102
|
+
)
|
103
|
+
task_list.append(task)
|
104
|
+
|
105
|
+
submission = Submission(
|
106
|
+
work_base=self.for_vasp_opt_dir,
|
107
|
+
machine=machine,
|
108
|
+
resources=resources,
|
109
|
+
task_list=task_list,
|
110
|
+
)
|
111
|
+
submission.run_submission()
|
112
|
+
|
113
|
+
# 创建用于存放优化后文件的 4_vasp_optimized 目录
|
114
|
+
os.makedirs(self.vasp_optimized_dir, exist_ok=True)
|
115
|
+
mlp_outcar_files = [
|
116
|
+
f for f in os.listdir(self.for_vasp_opt_dir) if f.startswith("OUTCAR_")
|
117
|
+
]
|
118
|
+
for mlp_contcar, mlp_outcar in zip(mlp_contcar_files, mlp_outcar_files):
|
119
|
+
shutil.copyfile(
|
120
|
+
f"{self.for_vasp_opt_dir}/{mlp_contcar}",
|
121
|
+
f"{self.vasp_optimized_dir}/{mlp_contcar}",
|
122
|
+
)
|
123
|
+
shutil.copyfile(
|
124
|
+
f"{self.for_vasp_opt_dir}/{mlp_outcar}",
|
125
|
+
f"{self.vasp_optimized_dir}/{mlp_outcar}",
|
126
|
+
)
|
127
|
+
for pop in range(nodes):
|
128
|
+
# 从传回的 pop 文件夹中将结果文件取到 4_vasp_optimized 目录
|
129
|
+
task_dir = os.path.join(self.for_vasp_opt_dir, f"{parent}pop{pop}")
|
130
|
+
for job_i in node_jobs[pop]:
|
131
|
+
vasp_dir = mlp_contcar_files[job_i].split("CONTCAR_")[1]
|
132
|
+
shutil.copytree(
|
133
|
+
f"{task_dir}/{vasp_dir}", f"{self.vasp_optimized_dir}/{vasp_dir}"
|
134
|
+
)
|
135
|
+
# 在成功完成 VASP 分步优化后,删除 3_for_vasp_opt/{parent}/pop{n} 文件夹以节省空间
|
136
|
+
shutil.rmtree(task_dir)
|
137
|
+
if machine_inform["context_type"] == "SSHContext":
|
138
|
+
# 如果调用远程服务器,则删除data级目录
|
139
|
+
shutil.rmtree(os.path.join(self.for_vasp_opt_dir, parent))
|
140
|
+
logging.info("Batch VASP optimization completed!!!")
|
141
|
+
|
142
|
+
def read_vaspout_save_csv(self, molecules_prior: bool):
|
143
|
+
"""
|
144
|
+
Read VASP output files in batches and save energy and density to corresponding CSV files in the directory
|
145
|
+
"""
|
146
|
+
os.chdir(self.base_dir)
|
147
|
+
vasp_opt_dir = self.vasp_optimized_dir
|
148
|
+
numbers, mlp_densities, mlp_energies = [], [], []
|
149
|
+
rough_densities, rough_energies = [], []
|
150
|
+
fine_densities, fine_energies = [], []
|
151
|
+
ions_checks, packing_coefficients = [], []
|
152
|
+
for folder in os.listdir(vasp_opt_dir):
|
153
|
+
vasp_opt_path = os.path.join(vasp_opt_dir, folder)
|
154
|
+
if os.path.isdir(vasp_opt_path):
|
155
|
+
mlp_density, number = folder.split("_")[0], folder.split("_")[1]
|
156
|
+
numbers.append(number)
|
157
|
+
mlp_densities.append(mlp_density)
|
158
|
+
# 读取一级目录下的 OUTCAR 文件
|
159
|
+
OUTCAR_file_path = os.path.join(vasp_opt_path, "OUTCAR")
|
160
|
+
logging.info(f"CONTCAR_{mlp_density}_{number}")
|
161
|
+
try:
|
162
|
+
with open(
|
163
|
+
f"{vasp_opt_dir}/OUTCAR_{mlp_density}_{number}"
|
164
|
+
) as mlp_out:
|
165
|
+
lines = mlp_out.readlines()
|
166
|
+
for line in lines:
|
167
|
+
if "TOTEN" in line:
|
168
|
+
values = line.split()
|
169
|
+
mlp_energy = round(float(values[-2]), 2)
|
170
|
+
except FileNotFoundError:
|
171
|
+
logging.error(
|
172
|
+
f" No avalible MLP OUTCAR_{mlp_density}_{number} found"
|
173
|
+
)
|
174
|
+
mlp_energy = False
|
175
|
+
|
176
|
+
try:
|
177
|
+
rough_atoms = read_vasp_out(OUTCAR_file_path)
|
178
|
+
atoms_volume = rough_atoms.get_volume() # 体积单位为立方埃(ų)
|
179
|
+
atoms_masses = sum(
|
180
|
+
rough_atoms.get_masses()
|
181
|
+
) # 质量单位为原子质量单位(amu)
|
182
|
+
# 1.66054这一转换因子用于将原子质量单位转换为克,以便在宏观尺度上计算密度g/cm³
|
183
|
+
rough_density = round(1.66054 * atoms_masses / atoms_volume, 4)
|
184
|
+
rough_energy = round(rough_atoms.get_total_energy(), 2)
|
185
|
+
logging.info(
|
186
|
+
f" MLP_Density: {mlp_density}, MLP_Energy: {mlp_energy}"
|
187
|
+
)
|
188
|
+
logging.info(
|
189
|
+
f" Rough_Density: {rough_density}, Rough_Energy: {rough_energy}"
|
190
|
+
)
|
191
|
+
except (ParseError, FileNotFoundError):
|
192
|
+
logging.error(
|
193
|
+
f" Unfinished optimization job of CONTCAR_{mlp_density}_{number}"
|
194
|
+
)
|
195
|
+
rough_density, rough_energy = False, False
|
196
|
+
|
197
|
+
# 读取二级目录下的 OUTCAR 文件
|
198
|
+
fine_OUTCAR_file_path = os.path.join(vasp_opt_path, "fine", "OUTCAR")
|
199
|
+
try:
|
200
|
+
fine_atoms = read_vasp_out(fine_OUTCAR_file_path)
|
201
|
+
molecules, molecules_flag, initial_information = identify_molecules(
|
202
|
+
fine_atoms
|
203
|
+
)
|
204
|
+
if not initial_information:
|
205
|
+
raise KeyError("No available initial molecules")
|
206
|
+
fine_atoms_volume = (
|
207
|
+
fine_atoms.get_volume()
|
208
|
+
) # 体积单位为立方埃(ų)
|
209
|
+
fine_atoms_masses = sum(
|
210
|
+
fine_atoms.get_masses()
|
211
|
+
) # 质量单位为原子质量单位(amu)
|
212
|
+
# 1.66054这一转换因子用于将原子质量单位转换为克,以便在宏观尺度上计算密度g/cm³
|
213
|
+
fine_density = round(
|
214
|
+
1.66054 * fine_atoms_masses / fine_atoms_volume, 4
|
215
|
+
)
|
216
|
+
fine_energy = round(fine_atoms.get_total_energy(), 2)
|
217
|
+
logging.info(
|
218
|
+
f" Fine_Density: {fine_density}, Fine_Energy: {fine_energy}"
|
219
|
+
)
|
220
|
+
molecules_information(
|
221
|
+
molecules, molecules_flag, initial_information
|
222
|
+
)
|
223
|
+
except (ParseError, FileNotFoundError):
|
224
|
+
logging.error(
|
225
|
+
f" Unfinished fine optimization job of CONTCAR_{mlp_density}_{number}"
|
226
|
+
)
|
227
|
+
fine_density, fine_energy = False, False
|
228
|
+
|
229
|
+
# 读取根目录下的 config.yaml 信息与对应的 .json 文件
|
230
|
+
config_path = os.path.join(self.base_dir, "config.yaml")
|
231
|
+
with open(config_path, "r") as file:
|
232
|
+
config = yaml.safe_load(file)
|
233
|
+
try:
|
234
|
+
species_json = [
|
235
|
+
os.path.splitext(f)[0] + ".json"
|
236
|
+
for f in config["gen_opt"]["species"]
|
237
|
+
]
|
238
|
+
ion_numbers = config["gen_opt"]["ion_numbers"]
|
239
|
+
for json_file, count in zip(species_json, ion_numbers):
|
240
|
+
molecular_volumes = 0
|
241
|
+
with open(os.path.join(self.base_dir, json_file), "r") as file:
|
242
|
+
property = json.load(file)
|
243
|
+
molecular_volume = float(property["volume"])
|
244
|
+
molecular_volumes += molecular_volume * count
|
245
|
+
packing_coefficient = round(
|
246
|
+
molecular_volumes / fine_atoms_volume, 4
|
247
|
+
)
|
248
|
+
except FileNotFoundError:
|
249
|
+
raise
|
250
|
+
|
251
|
+
mlp_energies.append(mlp_energy)
|
252
|
+
rough_densities.append(rough_density)
|
253
|
+
rough_energies.append(rough_energy)
|
254
|
+
fine_densities.append(fine_density)
|
255
|
+
fine_energies.append(fine_energy)
|
256
|
+
ions_checks.append(molecules_flag)
|
257
|
+
packing_coefficients.append(packing_coefficient)
|
258
|
+
|
259
|
+
with open(
|
260
|
+
f"{self.base_dir}/vasp_density_energy.csv",
|
261
|
+
"w",
|
262
|
+
newline="",
|
263
|
+
encoding="utf-8",
|
264
|
+
) as csv_file:
|
265
|
+
writer = csv.writer(csv_file)
|
266
|
+
header = [
|
267
|
+
"Number",
|
268
|
+
"MLP_E",
|
269
|
+
"Rough_E",
|
270
|
+
"Fine_E",
|
271
|
+
"MLP_Density",
|
272
|
+
"Rough_Density",
|
273
|
+
"Fine_Density",
|
274
|
+
"Ions_Check",
|
275
|
+
]
|
276
|
+
if packing_coefficients:
|
277
|
+
header.append("Pack_Coef")
|
278
|
+
datas = list(
|
279
|
+
zip(
|
280
|
+
numbers,
|
281
|
+
mlp_energies,
|
282
|
+
rough_energies,
|
283
|
+
fine_energies,
|
284
|
+
mlp_densities,
|
285
|
+
rough_densities,
|
286
|
+
fine_densities,
|
287
|
+
ions_checks,
|
288
|
+
(*packing_coefficients,) if packing_coefficients else (),
|
289
|
+
)
|
290
|
+
)
|
291
|
+
if molecules_prior:
|
292
|
+
# 如果设置了 molecules_prior 参数为 True,则优先第7列(从0列开始)Ions_Check 为 True 的结果,再根据第6列的 Fine_Density 降序排序
|
293
|
+
datas.sort(key=lambda x: (not x[7], -float(x[6])))
|
294
|
+
else:
|
295
|
+
# 否则,直接根据第6列(从0列开始)的 Fine_Density 降序排序
|
296
|
+
datas.sort(key=lambda x: -float(x[6]))
|
297
|
+
writer.writerow(header)
|
298
|
+
for data in datas:
|
299
|
+
writer.writerow(data)
|
@@ -0,0 +1,83 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: ion_CSP
|
3
|
+
Version: 2.0.2
|
4
|
+
Summary: Crystal Structure Design Software Based on Molecular/Ionic Configuration.
|
5
|
+
Home-page: https://github.com/bagabaga007/ion_CSP
|
6
|
+
Author: yangze
|
7
|
+
Author-email: Ze Yang <yangze1995007@163.com>
|
8
|
+
License: MIT License
|
9
|
+
|
10
|
+
Copyright (c) [2025] [ion_CSP]
|
11
|
+
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
14
|
+
in the Software without restriction, including without limitation the rights
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
17
|
+
furnished to do so, subject to the following conditions:
|
18
|
+
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
20
|
+
copies or substantial portions of the Software.
|
21
|
+
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
28
|
+
SOFTWARE.
|
29
|
+
|
30
|
+
Keywords: ion_crystal, crystal_structure_prediction
|
31
|
+
Classifier: Programming Language :: Python :: 3
|
32
|
+
Classifier: License :: OSI Approved :: MIT License
|
33
|
+
Classifier: Operating System :: OS Independent
|
34
|
+
Requires-Python: >=3.11
|
35
|
+
Description-Content-Type: text/markdown
|
36
|
+
License-File: LICENSE
|
37
|
+
Requires-Dist: ase==3.23.0
|
38
|
+
Requires-Dist: deepmd-kit==3.0.1
|
39
|
+
Requires-Dist: torch==2.5.0
|
40
|
+
Requires-Dist: dpdispatcher==0.6.7
|
41
|
+
Requires-Dist: numpy==1.26.4
|
42
|
+
Requires-Dist: paramiko==3.5.1
|
43
|
+
Requires-Dist: pyxtal==1.0.4
|
44
|
+
Requires-Dist: phonopy==2.28.0
|
45
|
+
Requires-Dist: rdkit==2023.03.3
|
46
|
+
Dynamic: author
|
47
|
+
Dynamic: home-page
|
48
|
+
Dynamic: license-file
|
49
|
+
Dynamic: requires-python
|
50
|
+
|
51
|
+
# 基于分子/离子构型的晶体结构设计软件 V2.0
|
52
|
+
|
53
|
+
基于分子/离子构型的晶体结构设计软件可以从分子/离子构型出发,结合经验公式、微调的机器学习势、第一性原理分步优化以及分子/离子识别方法,可以高效且有导向地筛选同时满足结构要求和性质要求的分子/离子晶体结构。该软件实现了分子/离子晶体结构的设计、构建、分析、筛选、评估全流程的自动化与模块化,保证了流程的扩展性和可重用性,能够在保证结果精度的同时,显著提高材料筛选效率。在整个流程中提供了多种检查功能以及结果可视化功能,方便用户使用。该软件使用Python语言编写,提供了完整的面向对象编程支持,在具有较高运行效率的同时使程序更易于理解、扩展和维护。
|
54
|
+
|
55
|
+
# 安装
|
56
|
+
|
57
|
+
在项目根目录下使用以下命令安装依赖:
|
58
|
+
|
59
|
+
pip install -r requirements.txt
|
60
|
+
|
61
|
+
pip install -e .
|
62
|
+
|
63
|
+
chmod +x ./scripts/*.sh
|
64
|
+
|
65
|
+
# 使用示例
|
66
|
+
|
67
|
+
### 使用交互式功能自主选择
|
68
|
+
./scripts/main.sh
|
69
|
+
|
70
|
+
#### 使用经验评估(EE)模块从SMILES表格开始生成离子组合
|
71
|
+
./scripts/main_EE.sh examples/example_1
|
72
|
+
|
73
|
+
|
74
|
+
#### 使用离子晶体结构预测(CSP)模块从离子组合开始生成晶体并筛选和优化
|
75
|
+
./scripts/main_CSP.sh examples/example_2
|
76
|
+
|
77
|
+
# 功能
|
78
|
+
使用经验评估(EE)模块从SMILES表格开始生成离子组合。
|
79
|
+
|
80
|
+
使用离子晶体结构预测(CSP)模块从离子组合开始生成晶体并筛选和优化。
|
81
|
+
|
82
|
+
# 联系
|
83
|
+
如有问题,请联系 yangze1995007@163.com。
|
@@ -0,0 +1,18 @@
|
|
1
|
+
ion_CSP/__init__.py,sha256=M5RcbYDdt-UBVpsDKiJWJqLvSFfoBfU6aTUVccgK_BE,190
|
2
|
+
ion_CSP/app.py,sha256=MnuVdzV6yiTG__SPuWeQ05V0rwYqoJtez2XpdmRZOrU,6996
|
3
|
+
ion_CSP/convert_SMILES.py,sha256=4fndMcuIEypYtkXWBoS7W7uEXkZXVLeMDshdXEIk5kY,13864
|
4
|
+
ion_CSP/empirical_estimate.py,sha256=_U5VRWSIAiJGcxnP3mnCHn8zKzviFEQhQwN7TjPTnCU,29089
|
5
|
+
ion_CSP/gen_opt.py,sha256=i9BxV6881YEO5PQZfYqu4wpJ_JfDfTqn0o2XJ90s9UU,19463
|
6
|
+
ion_CSP/identify_molecules.py,sha256=yzLMWpGW1YM1B4a9cg4Jd1CekTWtXsPWAt-TpwL1Rks,4638
|
7
|
+
ion_CSP/log_and_time.py,sha256=6RKegXF8Gc1HqzAbE-PT9ejX3Ncyuz3v3FivujJt8to,9072
|
8
|
+
ion_CSP/mlp_opt.py,sha256=ox4Qxg4D6WzrB8dxVnUWmAngnOA_wdcInP5UhBWsH4c,5535
|
9
|
+
ion_CSP/read_mlp_density.py,sha256=ktGNHYWLi4VrdJK_Hg2ac2-JM2QlVt9iymLxdixkLb8,9663
|
10
|
+
ion_CSP/steps_opt_monitor.sh,sha256=1klPjnK0gqkDbvI9PtjdK5qidJ5G0Mo8q1SfrlLW5xM,3330
|
11
|
+
ion_CSP/upload_download.py,sha256=Hiz5jKOy9x26hJJdcpt-owQdVUbzzGuGOelro6JozY8,23801
|
12
|
+
ion_CSP/vasp_processing.py,sha256=Pd-_muPDMst-DKj6vGR34e7IFWsSyGiP7q-aMGZXatA,13911
|
13
|
+
ion_csp-2.0.2.dist-info/licenses/LICENSE,sha256=2J6A8GT2iIf2LhuWO1_0ilgx7ijzzpQ2BXU7rHKe8Cc,1068
|
14
|
+
ion_csp-2.0.2.dist-info/METADATA,sha256=OfnWFxuY9bXCwIpbkwJVqh8ZQyM1l78YWr6k44ZmVFk,3719
|
15
|
+
ion_csp-2.0.2.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
16
|
+
ion_csp-2.0.2.dist-info/entry_points.txt,sha256=l8q_8U8whrkzO1-8RIppbDco-520Cy3Pq1N5LyLTTLc,49
|
17
|
+
ion_csp-2.0.2.dist-info/top_level.txt,sha256=aYZa43dDebjLpWPN6bDIlBb6BVwA8gk4ajEjDDK9b9I,8
|
18
|
+
ion_csp-2.0.2.dist-info/RECORD,,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) [2025] [ion_CSP]
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1 @@
|
|
1
|
+
ion_CSP
|