MultiOptPy 1.20.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.
Files changed (246) hide show
  1. multioptpy/Calculator/__init__.py +0 -0
  2. multioptpy/Calculator/ase_calculation_tools.py +424 -0
  3. multioptpy/Calculator/ase_tools/__init__.py +0 -0
  4. multioptpy/Calculator/ase_tools/fairchem.py +28 -0
  5. multioptpy/Calculator/ase_tools/gamess.py +19 -0
  6. multioptpy/Calculator/ase_tools/gaussian.py +165 -0
  7. multioptpy/Calculator/ase_tools/mace.py +28 -0
  8. multioptpy/Calculator/ase_tools/mopac.py +19 -0
  9. multioptpy/Calculator/ase_tools/nwchem.py +31 -0
  10. multioptpy/Calculator/ase_tools/orca.py +22 -0
  11. multioptpy/Calculator/ase_tools/pygfn0.py +37 -0
  12. multioptpy/Calculator/dxtb_calculation_tools.py +344 -0
  13. multioptpy/Calculator/emt_calculation_tools.py +458 -0
  14. multioptpy/Calculator/gpaw_calculation_tools.py +183 -0
  15. multioptpy/Calculator/lj_calculation_tools.py +314 -0
  16. multioptpy/Calculator/psi4_calculation_tools.py +334 -0
  17. multioptpy/Calculator/pwscf_calculation_tools.py +189 -0
  18. multioptpy/Calculator/pyscf_calculation_tools.py +327 -0
  19. multioptpy/Calculator/sqm1_calculation_tools.py +611 -0
  20. multioptpy/Calculator/sqm2_calculation_tools.py +376 -0
  21. multioptpy/Calculator/tblite_calculation_tools.py +352 -0
  22. multioptpy/Calculator/tersoff_calculation_tools.py +818 -0
  23. multioptpy/Constraint/__init__.py +0 -0
  24. multioptpy/Constraint/constraint_condition.py +834 -0
  25. multioptpy/Coordinate/__init__.py +0 -0
  26. multioptpy/Coordinate/polar_coordinate.py +199 -0
  27. multioptpy/Coordinate/redundant_coordinate.py +638 -0
  28. multioptpy/IRC/__init__.py +0 -0
  29. multioptpy/IRC/converge_criteria.py +28 -0
  30. multioptpy/IRC/dvv.py +544 -0
  31. multioptpy/IRC/euler.py +439 -0
  32. multioptpy/IRC/hpc.py +564 -0
  33. multioptpy/IRC/lqa.py +540 -0
  34. multioptpy/IRC/modekill.py +662 -0
  35. multioptpy/IRC/rk4.py +579 -0
  36. multioptpy/Interpolation/__init__.py +0 -0
  37. multioptpy/Interpolation/adaptive_interpolation.py +283 -0
  38. multioptpy/Interpolation/binomial_interpolation.py +179 -0
  39. multioptpy/Interpolation/geodesic_interpolation.py +785 -0
  40. multioptpy/Interpolation/interpolation.py +156 -0
  41. multioptpy/Interpolation/linear_interpolation.py +473 -0
  42. multioptpy/Interpolation/savitzky_golay_interpolation.py +252 -0
  43. multioptpy/Interpolation/spline_interpolation.py +353 -0
  44. multioptpy/MD/__init__.py +0 -0
  45. multioptpy/MD/thermostat.py +185 -0
  46. multioptpy/MEP/__init__.py +0 -0
  47. multioptpy/MEP/pathopt_bneb_force.py +443 -0
  48. multioptpy/MEP/pathopt_dmf_force.py +448 -0
  49. multioptpy/MEP/pathopt_dneb_force.py +130 -0
  50. multioptpy/MEP/pathopt_ewbneb_force.py +207 -0
  51. multioptpy/MEP/pathopt_gpneb_force.py +512 -0
  52. multioptpy/MEP/pathopt_lup_force.py +113 -0
  53. multioptpy/MEP/pathopt_neb_force.py +225 -0
  54. multioptpy/MEP/pathopt_nesb_force.py +205 -0
  55. multioptpy/MEP/pathopt_om_force.py +153 -0
  56. multioptpy/MEP/pathopt_qsm_force.py +174 -0
  57. multioptpy/MEP/pathopt_qsmv2_force.py +304 -0
  58. multioptpy/ModelFunction/__init__.py +7 -0
  59. multioptpy/ModelFunction/avoiding_model_function.py +29 -0
  60. multioptpy/ModelFunction/binary_image_ts_search_model_function.py +47 -0
  61. multioptpy/ModelFunction/conical_model_function.py +26 -0
  62. multioptpy/ModelFunction/opt_meci.py +50 -0
  63. multioptpy/ModelFunction/opt_mesx.py +47 -0
  64. multioptpy/ModelFunction/opt_mesx_2.py +49 -0
  65. multioptpy/ModelFunction/seam_model_function.py +27 -0
  66. multioptpy/ModelHessian/__init__.py +0 -0
  67. multioptpy/ModelHessian/approx_hessian.py +147 -0
  68. multioptpy/ModelHessian/calc_params.py +227 -0
  69. multioptpy/ModelHessian/fischer.py +236 -0
  70. multioptpy/ModelHessian/fischerd3.py +360 -0
  71. multioptpy/ModelHessian/fischerd4.py +398 -0
  72. multioptpy/ModelHessian/gfn0xtb.py +633 -0
  73. multioptpy/ModelHessian/gfnff.py +709 -0
  74. multioptpy/ModelHessian/lindh.py +165 -0
  75. multioptpy/ModelHessian/lindh2007d2.py +707 -0
  76. multioptpy/ModelHessian/lindh2007d3.py +822 -0
  77. multioptpy/ModelHessian/lindh2007d4.py +1030 -0
  78. multioptpy/ModelHessian/morse.py +106 -0
  79. multioptpy/ModelHessian/schlegel.py +144 -0
  80. multioptpy/ModelHessian/schlegeld3.py +322 -0
  81. multioptpy/ModelHessian/schlegeld4.py +559 -0
  82. multioptpy/ModelHessian/shortrange.py +346 -0
  83. multioptpy/ModelHessian/swartd2.py +496 -0
  84. multioptpy/ModelHessian/swartd3.py +706 -0
  85. multioptpy/ModelHessian/swartd4.py +918 -0
  86. multioptpy/ModelHessian/tshess.py +40 -0
  87. multioptpy/Optimizer/QHAdam.py +61 -0
  88. multioptpy/Optimizer/__init__.py +0 -0
  89. multioptpy/Optimizer/abc_fire.py +83 -0
  90. multioptpy/Optimizer/adabelief.py +58 -0
  91. multioptpy/Optimizer/adabound.py +68 -0
  92. multioptpy/Optimizer/adadelta.py +65 -0
  93. multioptpy/Optimizer/adaderivative.py +56 -0
  94. multioptpy/Optimizer/adadiff.py +68 -0
  95. multioptpy/Optimizer/adafactor.py +70 -0
  96. multioptpy/Optimizer/adam.py +65 -0
  97. multioptpy/Optimizer/adamax.py +62 -0
  98. multioptpy/Optimizer/adamod.py +83 -0
  99. multioptpy/Optimizer/adamw.py +65 -0
  100. multioptpy/Optimizer/adiis.py +523 -0
  101. multioptpy/Optimizer/afire_neb.py +282 -0
  102. multioptpy/Optimizer/block_hessian_update.py +709 -0
  103. multioptpy/Optimizer/c2diis.py +491 -0
  104. multioptpy/Optimizer/component_wise_scaling.py +405 -0
  105. multioptpy/Optimizer/conjugate_gradient.py +82 -0
  106. multioptpy/Optimizer/conjugate_gradient_neb.py +345 -0
  107. multioptpy/Optimizer/coordinate_locking.py +405 -0
  108. multioptpy/Optimizer/dic_rsirfo.py +1015 -0
  109. multioptpy/Optimizer/ediis.py +417 -0
  110. multioptpy/Optimizer/eve.py +76 -0
  111. multioptpy/Optimizer/fastadabelief.py +61 -0
  112. multioptpy/Optimizer/fire.py +77 -0
  113. multioptpy/Optimizer/fire2.py +249 -0
  114. multioptpy/Optimizer/fire_neb.py +92 -0
  115. multioptpy/Optimizer/gan_step.py +486 -0
  116. multioptpy/Optimizer/gdiis.py +609 -0
  117. multioptpy/Optimizer/gediis.py +203 -0
  118. multioptpy/Optimizer/geodesic_step.py +433 -0
  119. multioptpy/Optimizer/gpmin.py +633 -0
  120. multioptpy/Optimizer/gpr_step.py +364 -0
  121. multioptpy/Optimizer/gradientdescent.py +78 -0
  122. multioptpy/Optimizer/gradientdescent_neb.py +52 -0
  123. multioptpy/Optimizer/hessian_update.py +433 -0
  124. multioptpy/Optimizer/hybrid_rfo.py +998 -0
  125. multioptpy/Optimizer/kdiis.py +625 -0
  126. multioptpy/Optimizer/lars.py +21 -0
  127. multioptpy/Optimizer/lbfgs.py +253 -0
  128. multioptpy/Optimizer/lbfgs_neb.py +355 -0
  129. multioptpy/Optimizer/linesearch.py +236 -0
  130. multioptpy/Optimizer/lookahead.py +40 -0
  131. multioptpy/Optimizer/nadam.py +64 -0
  132. multioptpy/Optimizer/newton.py +200 -0
  133. multioptpy/Optimizer/prodigy.py +70 -0
  134. multioptpy/Optimizer/purtubation.py +16 -0
  135. multioptpy/Optimizer/quickmin_neb.py +245 -0
  136. multioptpy/Optimizer/radam.py +75 -0
  137. multioptpy/Optimizer/rfo_neb.py +302 -0
  138. multioptpy/Optimizer/ric_rfo.py +842 -0
  139. multioptpy/Optimizer/rl_step.py +627 -0
  140. multioptpy/Optimizer/rmspropgrave.py +65 -0
  141. multioptpy/Optimizer/rsirfo.py +1647 -0
  142. multioptpy/Optimizer/rsprfo.py +1056 -0
  143. multioptpy/Optimizer/sadam.py +60 -0
  144. multioptpy/Optimizer/samsgrad.py +63 -0
  145. multioptpy/Optimizer/tr_lbfgs.py +678 -0
  146. multioptpy/Optimizer/trim.py +273 -0
  147. multioptpy/Optimizer/trust_radius.py +207 -0
  148. multioptpy/Optimizer/trust_radius_neb.py +121 -0
  149. multioptpy/Optimizer/yogi.py +60 -0
  150. multioptpy/OtherMethod/__init__.py +0 -0
  151. multioptpy/OtherMethod/addf.py +1150 -0
  152. multioptpy/OtherMethod/dimer.py +895 -0
  153. multioptpy/OtherMethod/elastic_image_pair.py +629 -0
  154. multioptpy/OtherMethod/modelfunction.py +456 -0
  155. multioptpy/OtherMethod/newton_traj.py +454 -0
  156. multioptpy/OtherMethod/twopshs.py +1095 -0
  157. multioptpy/PESAnalyzer/__init__.py +0 -0
  158. multioptpy/PESAnalyzer/calc_irc_curvature.py +125 -0
  159. multioptpy/PESAnalyzer/cmds_analysis.py +152 -0
  160. multioptpy/PESAnalyzer/koopman_analysis.py +268 -0
  161. multioptpy/PESAnalyzer/pca_analysis.py +314 -0
  162. multioptpy/Parameters/__init__.py +0 -0
  163. multioptpy/Parameters/atomic_mass.py +20 -0
  164. multioptpy/Parameters/atomic_number.py +22 -0
  165. multioptpy/Parameters/covalent_radii.py +44 -0
  166. multioptpy/Parameters/d2.py +61 -0
  167. multioptpy/Parameters/d3.py +63 -0
  168. multioptpy/Parameters/d4.py +103 -0
  169. multioptpy/Parameters/dreiding.py +34 -0
  170. multioptpy/Parameters/gfn0xtb_param.py +137 -0
  171. multioptpy/Parameters/gfnff_param.py +315 -0
  172. multioptpy/Parameters/gnb.py +104 -0
  173. multioptpy/Parameters/parameter.py +22 -0
  174. multioptpy/Parameters/uff.py +72 -0
  175. multioptpy/Parameters/unit_values.py +20 -0
  176. multioptpy/Potential/AFIR_potential.py +55 -0
  177. multioptpy/Potential/LJ_repulsive_potential.py +345 -0
  178. multioptpy/Potential/__init__.py +0 -0
  179. multioptpy/Potential/anharmonic_keep_potential.py +28 -0
  180. multioptpy/Potential/asym_elllipsoidal_potential.py +718 -0
  181. multioptpy/Potential/electrostatic_potential.py +69 -0
  182. multioptpy/Potential/flux_potential.py +30 -0
  183. multioptpy/Potential/gaussian_potential.py +101 -0
  184. multioptpy/Potential/idpp.py +516 -0
  185. multioptpy/Potential/keep_angle_potential.py +146 -0
  186. multioptpy/Potential/keep_dihedral_angle_potential.py +105 -0
  187. multioptpy/Potential/keep_outofplain_angle_potential.py +70 -0
  188. multioptpy/Potential/keep_potential.py +99 -0
  189. multioptpy/Potential/mechano_force_potential.py +74 -0
  190. multioptpy/Potential/nanoreactor_potential.py +52 -0
  191. multioptpy/Potential/potential.py +896 -0
  192. multioptpy/Potential/spacer_model_potential.py +221 -0
  193. multioptpy/Potential/switching_potential.py +258 -0
  194. multioptpy/Potential/universal_potential.py +34 -0
  195. multioptpy/Potential/value_range_potential.py +36 -0
  196. multioptpy/Potential/void_point_potential.py +25 -0
  197. multioptpy/SQM/__init__.py +0 -0
  198. multioptpy/SQM/sqm1/__init__.py +0 -0
  199. multioptpy/SQM/sqm1/sqm1_core.py +1792 -0
  200. multioptpy/SQM/sqm2/__init__.py +0 -0
  201. multioptpy/SQM/sqm2/calc_tools.py +95 -0
  202. multioptpy/SQM/sqm2/sqm2_basis.py +850 -0
  203. multioptpy/SQM/sqm2/sqm2_bond.py +119 -0
  204. multioptpy/SQM/sqm2/sqm2_core.py +303 -0
  205. multioptpy/SQM/sqm2/sqm2_data.py +1229 -0
  206. multioptpy/SQM/sqm2/sqm2_disp.py +65 -0
  207. multioptpy/SQM/sqm2/sqm2_eeq.py +243 -0
  208. multioptpy/SQM/sqm2/sqm2_overlapint.py +704 -0
  209. multioptpy/SQM/sqm2/sqm2_qm.py +578 -0
  210. multioptpy/SQM/sqm2/sqm2_rep.py +66 -0
  211. multioptpy/SQM/sqm2/sqm2_srb.py +70 -0
  212. multioptpy/Thermo/__init__.py +0 -0
  213. multioptpy/Thermo/normal_mode_analyzer.py +865 -0
  214. multioptpy/Utils/__init__.py +0 -0
  215. multioptpy/Utils/bond_connectivity.py +264 -0
  216. multioptpy/Utils/calc_tools.py +884 -0
  217. multioptpy/Utils/oniom.py +96 -0
  218. multioptpy/Utils/pbc.py +48 -0
  219. multioptpy/Utils/riemann_curvature.py +208 -0
  220. multioptpy/Utils/symmetry_analyzer.py +482 -0
  221. multioptpy/Visualization/__init__.py +0 -0
  222. multioptpy/Visualization/visualization.py +156 -0
  223. multioptpy/WFAnalyzer/MO_analysis.py +104 -0
  224. multioptpy/WFAnalyzer/__init__.py +0 -0
  225. multioptpy/Wrapper/__init__.py +0 -0
  226. multioptpy/Wrapper/autots.py +1239 -0
  227. multioptpy/Wrapper/ieip_wrapper.py +93 -0
  228. multioptpy/Wrapper/md_wrapper.py +92 -0
  229. multioptpy/Wrapper/neb_wrapper.py +94 -0
  230. multioptpy/Wrapper/optimize_wrapper.py +76 -0
  231. multioptpy/__init__.py +5 -0
  232. multioptpy/entrypoints.py +916 -0
  233. multioptpy/fileio.py +660 -0
  234. multioptpy/ieip.py +340 -0
  235. multioptpy/interface.py +1086 -0
  236. multioptpy/irc.py +529 -0
  237. multioptpy/moleculardynamics.py +432 -0
  238. multioptpy/neb.py +1267 -0
  239. multioptpy/optimization.py +1553 -0
  240. multioptpy/optimizer.py +709 -0
  241. multioptpy-1.20.2.dist-info/METADATA +438 -0
  242. multioptpy-1.20.2.dist-info/RECORD +246 -0
  243. multioptpy-1.20.2.dist-info/WHEEL +5 -0
  244. multioptpy-1.20.2.dist-info/entry_points.txt +9 -0
  245. multioptpy-1.20.2.dist-info/licenses/LICENSE +674 -0
  246. multioptpy-1.20.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,432 @@
1
+ import sys
2
+ import os
3
+ import shutil
4
+ import copy
5
+ import glob
6
+ import datetime
7
+
8
+ import numpy as np
9
+
10
+ from multioptpy.Potential.potential import BiasPotentialCalculation
11
+ from multioptpy.Utils.calc_tools import CalculationStructInfo
12
+ from multioptpy.Visualization.visualization import Graph
13
+ from multioptpy.fileio import FileIO
14
+ from multioptpy.Parameters.parameter import UnitValueLib, element_number, atomic_mass
15
+ from multioptpy.interface import force_data_parser
16
+ from multioptpy.Constraint.constraint_condition import shake_parser, SHAKE, ProjectOutConstrain
17
+ from multioptpy.Utils.pbc import apply_periodic_boundary_condition
18
+ from multioptpy.MD.thermostat import Thermostat
19
+
20
+
21
+ class MD:
22
+ def __init__(self, args):
23
+ UVL = UnitValueLib()
24
+ np.set_printoptions(precision=12, floatmode="fixed", suppress=True)
25
+ self.hartree2kcalmol = UVL.hartree2kcalmol #
26
+ self.bohr2angstroms = UVL.bohr2angstroms #
27
+ self.hartree2kjmol = UVL.hartree2kjmol #
28
+ self.Boltzmann_constant = 3.16681 * 10 ** (-6) # hartree/K
29
+ self.ENERGY_LIST_FOR_PLOTTING = [] #
30
+ self.AFIR_ENERGY_LIST_FOR_PLOTTING = [] #
31
+ self.NUM_LIST = [] #
32
+ self.time_atom_unit = 2.419 * 10 ** (-17)
33
+ self.args = args #
34
+ self.FC_COUNT = -1 #
35
+ self.excited_state = args.excited_state
36
+ self.initial_temperature = args.temperature
37
+ self.num_of_trajectory = args.TRAJECTORY
38
+ self.change_temperature = args.change_temperature
39
+ self.momentum_list = None
40
+ self.initial_pressure = args.pressure
41
+ self.timestep = args.timestep #
42
+ self.N_THREAD = args.N_THREAD #
43
+ self.SET_MEMORY = args.SET_MEMORY #
44
+ self.START_FILE = args.INPUT #
45
+ self.NSTEP = args.NSTEP #
46
+ #-----------------------------
47
+ self.BASIS_SET = args.basisset #
48
+ self.FUNCTIONAL = args.functional #
49
+
50
+ if len(args.sub_basisset) % 2 != 0:
51
+ print("invaild input (-sub_bs)")
52
+ sys.exit(0)
53
+ self.electronic_charge = args.electronic_charge
54
+ self.spin_multiplicity = args.spin_multiplicity
55
+ self.electric_charge_and_multiplicity = [int(args.electronic_charge), int(args.spin_multiplicity)]
56
+
57
+ if args.pyscf:
58
+ self.SUB_BASIS_SET = {}
59
+ if len(args.sub_basisset) > 0:
60
+ self.SUB_BASIS_SET["default"] = str(self.BASIS_SET) #
61
+ for j in range(int(len(args.sub_basisset)/2)):
62
+ self.SUB_BASIS_SET[args.sub_basisset[2*j]] = args.sub_basisset[2*j+1]
63
+ print("Basis Sets defined by User are detected.")
64
+ print(self.SUB_BASIS_SET) #
65
+ else:
66
+ self.SUB_BASIS_SET = { "default" : self.BASIS_SET}
67
+ else:#psi4
68
+ self.SUB_BASIS_SET = "" #
69
+ if len(args.sub_basisset) > 0:
70
+ self.SUB_BASIS_SET +="\nassign "+str(self.BASIS_SET)+"\n" #
71
+ for j in range(int(len(args.sub_basisset)/2)):
72
+ self.SUB_BASIS_SET += "assign "+args.sub_basisset[2*j]+" "+args.sub_basisset[2*j+1]+"\n"
73
+ print("Basis Sets defined by User are detected.")
74
+ print(self.SUB_BASIS_SET) #
75
+ #-----------------------------
76
+ if len(args.effective_core_potential) % 2 != 0:
77
+ print("invaild input (-ecp)")
78
+ sys.exit(0)
79
+
80
+ if args.pyscf:
81
+ self.ECP = {}
82
+ if len(args.effective_core_potential) > 0:
83
+ for j in range(int(len(args.effective_core_potential)/2)):
84
+ self.ECP[args.effective_core_potential[2*j]] = args.effective_core_potential[2*j+1]
85
+
86
+ else:
87
+ self.ECP = ""
88
+
89
+
90
+
91
+ #-----------------------------
92
+
93
+ self.mdtype = args.mdtype
94
+ self.Model_hess = None #
95
+ self.Opt_params = None #
96
+ self.DC_check_dist = 10.0#ang.
97
+ self.unrestrict = args.unrestrict
98
+ if len(args.constraint_condition) > 0:
99
+ self.constraint_condition_list = shake_parser(args.constraint_condition)
100
+ else:
101
+ self.constraint_condition_list = []
102
+
103
+ if len(args.periodic_boundary_condition) > 0:
104
+ if len(args.periodic_boundary_condition.split(",")) == 3:
105
+ self.pbc_box = np.array(args.periodic_boundary_condition.split(","), dtype="float64") / self.bohr2angstroms
106
+ else:
107
+ self.pbc_box = []
108
+ else:
109
+ self.pbc_box = []
110
+ self.args = args
111
+ self.cpcm_solv_model = args.cpcm_solv_model
112
+ self.alpb_solv_model = args.alpb_solv_model
113
+ self.software_path_file = args.software_path_file
114
+ self.dft_grid = int(args.dft_grid)
115
+ self.sqm1 = args.sqm1
116
+ self.sqm2 = args.sqm2
117
+ return
118
+
119
+
120
+
121
+ def exec_md(self, TM, geom_num_list, prev_geom_num_list, B_g, B_e, pre_B_g, iter):
122
+ if iter == 0 and len(self.constraint_condition_list) > 0:
123
+ self.class_SHAKE = SHAKE(TM.delta_timescale, self.constraint_condition_list)
124
+ if self.mdtype == "nosehoover" or self.mdtype == "nvt":
125
+ new_geometry = TM.Nose_Hoover_thermostat(geom_num_list, B_g)
126
+ elif self.mdtype == "nosehooverchain":
127
+ new_geometry = TM.Nose_Hoover_chain_thermostat(geom_num_list, B_g)
128
+ elif self.mdtype == "velocityverlet" or self.mdtype == "nve":
129
+ new_geometry = TM.Velocity_Verlet(geom_num_list, B_g, pre_B_g, iter)
130
+ else:
131
+ print("Unexpected method.", self.mdtype)
132
+ raise
133
+
134
+ if iter > 0 and len(self.constraint_condition_list) > 0:
135
+
136
+ new_geometry, tmp_momentum_list = self.class_SHAKE.run(new_geometry, prev_geom_num_list, TM.momentum_list, TM.element_list)
137
+ TM.momentum_list = copy.copy(tmp_momentum_list)
138
+
139
+ kinetic_ene = 0.0
140
+
141
+ for i in range(len(geom_num_list)):
142
+ kinetic_ene += np.sum(TM.momentum_list[i] ** 2) / (2 * atomic_mass(TM.element_list[i]))
143
+
144
+ tot_energy = B_e + kinetic_ene
145
+ print("hamiltonian :", tot_energy, "hartree")
146
+
147
+ self.tot_energy_list.append(tot_energy)
148
+
149
+ if len(self.pbc_box) > 0:
150
+ new_geometry = apply_periodic_boundary_condition(new_geometry, TM.element_list, self.pbc_box)
151
+ return new_geometry
152
+
153
+
154
+ def md(self):
155
+ if self.args.othersoft != "None":
156
+ self.BPA_FOLDER_DIRECTORY = str(datetime.datetime.now().strftime("%Y_%m_%d"))+"/"+self.START_FILE[:-4]+"_MD_ASE_"+str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2])+"/"
157
+
158
+ elif self.args.usextb == "None":
159
+ self.BPA_FOLDER_DIRECTORY = str(datetime.datetime.now().strftime("%Y_%m_%d"))+"/"+self.START_FILE[:-4]+"_MD_"+self.FUNCTIONAL+"_"+self.BASIS_SET+"_"+str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2])+"/"
160
+ else:
161
+ self.BPA_FOLDER_DIRECTORY = str(datetime.datetime.now().strftime("%Y_%m_%d"))+"/"+self.START_FILE[:-4]+"_MD_"+self.args.usextb+"_"+str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2])+"/"
162
+
163
+ xtb_method = None
164
+ FIO = FileIO(self.BPA_FOLDER_DIRECTORY, self.START_FILE)
165
+ os.makedirs(self.BPA_FOLDER_DIRECTORY, exist_ok=True)
166
+ if self.args.pyscf:
167
+ from multioptpy.Calculator.pyscf_calculation_tools import Calculation
168
+ elif self.args.sqm2:
169
+ from multioptpy.Calculator.sqm2_calculation_tools import Calculation
170
+ print("Use SQM2 potential.")
171
+
172
+ elif self.args.sqm1:
173
+ from multioptpy.Calculator.sqm1_calculation_tools import Calculation
174
+
175
+ elif self.args.othersoft != "None":
176
+ if self.args.othersoft.lower() == "lj":
177
+ from multioptpy.Calculator.lj_calculation_tools import Calculation
178
+ print("Use Lennard-Jones cluster potential.")
179
+ elif self.args.othersoft.lower() == "emt":
180
+ from multioptpy.Calculator.emt_calculation_tools import Calculation
181
+ print("Use EMT cluster potential.")
182
+ elif self.args.othersoft.lower() == "tersoff":
183
+ from multioptpy.Calculator.tersoff_calculation_tools import Calculation
184
+ print("Use Tersoff cluster potential.")
185
+
186
+ else:
187
+ from multioptpy.Calculator.ase_calculation_tools import Calculation
188
+ print("Use", self.args.othersoft)
189
+ with open(self.BPA_FOLDER_DIRECTORY+"use_"+self.args.othersoft+".txt", "w") as f:
190
+ f.write(self.args.othersoft+"\n")
191
+ f.write(self.BASIS_SET+"\n")
192
+ f.write(self.FUNCTIONAL+"\n")
193
+ else:
194
+ if self.args.usextb != "None":
195
+ from multioptpy.Calculator.tblite_calculation_tools import Calculation
196
+ xtb_method = self.args.usextb
197
+ else:
198
+ from multioptpy.Calculator.psi4_calculation_tools import Calculation
199
+
200
+ self.NUM_LIST = []
201
+ self.ENERGY_LIST_FOR_PLOTTING = []
202
+ self.AFIR_ENERGY_LIST_FOR_PLOTTING = []
203
+ self.tot_energy_list = []
204
+
205
+ temperature_list = []
206
+ force_data = force_data_parser(self.args)
207
+ PC = ProjectOutConstrain(force_data["projection_constraint_condition_list"], force_data["projection_constraint_atoms"], force_data["projection_constraint_constant"])
208
+
209
+
210
+ finish_frag = False
211
+
212
+ geometry_list, element_list, electric_charge_and_multiplicity = FIO.make_geometry_list(self.electric_charge_and_multiplicity)
213
+ file_directory = FIO.make_psi4_input_file(geometry_list, 0)
214
+ #------------------------------------
215
+ self.momentum_list = np.zeros((len(element_list), 3))
216
+ initial_geom_num_list = np.zeros((len(element_list), 3))
217
+
218
+ self.Model_hess = np.eye(len(element_list*3))
219
+
220
+ CalcBiaspot = BiasPotentialCalculation(self.BPA_FOLDER_DIRECTORY)
221
+ #-----------------------------------
222
+ with open(self.BPA_FOLDER_DIRECTORY+"input.txt", "w") as f:
223
+ f.write(str(vars(self.args)))
224
+ pre_B_g = []
225
+
226
+ for i in range(len(element_list)):
227
+ pre_B_g.append(np.array([0,0,0], dtype="float64"))
228
+ pre_B_g = np.array(pre_B_g, dtype="float64")
229
+
230
+ #-------------------------------------
231
+ finish_frag = False
232
+ #-----------------------------------
233
+ SP = Calculation(START_FILE = self.START_FILE,
234
+ N_THREAD = self.N_THREAD,
235
+ BASIS_SET = self.BASIS_SET,
236
+ SET_MEMORY = self.SET_MEMORY ,
237
+ FUNCTIONAL = self.FUNCTIONAL,
238
+ FC_COUNT = self.FC_COUNT,
239
+ BPA_FOLDER_DIRECTORY = self.BPA_FOLDER_DIRECTORY,
240
+ Model_hess = self.Model_hess,
241
+ unrestrict = self.unrestrict,
242
+ SUB_BASIS_SET = self.SUB_BASIS_SET,
243
+ software_type = self.args.othersoft,
244
+ spin_multiplicity = self.spin_multiplicity,
245
+ electronic_charge = self.electronic_charge,
246
+ excited_state = self.excited_state,
247
+ dft_grid=self.dft_grid,
248
+ ECP = self.ECP,
249
+ software_path_file = self.software_path_file
250
+ )
251
+ SP.cpcm_solv_model = self.cpcm_solv_model
252
+ SP.alpb_solv_model = self.alpb_solv_model
253
+
254
+ TM = Thermostat(self.momentum_list, self.initial_temperature, self.initial_pressure, element_list=element_list)
255
+ TM.delta_timescale = self.timestep
256
+ #-----------------------------------
257
+ element_number_list = []
258
+ for elem in element_list:
259
+ element_number_list.append(element_number(elem))
260
+ element_number_list = np.array(element_number_list, dtype="int")
261
+ #----------------------------------
262
+
263
+ cos_list = [[] for i in range(len(force_data["geom_info"]))]
264
+ grad_list = []
265
+
266
+ #----------------------------------
267
+ ct_count = 0
268
+ if len(force_data["projection_constraint_condition_list"]) > 0:
269
+ projection_constrain_flag = True
270
+ else:
271
+ projection_constrain_flag = False
272
+
273
+ for iter in range(self.NSTEP):
274
+ #-----------------------------
275
+ if ct_count < len(self.change_temperature):
276
+ if int(self.change_temperature[ct_count]) == iter:
277
+ TM.initial_temperature = float(self.change_temperature[ct_count+1])
278
+ ct_count += 2
279
+
280
+
281
+ #------------------------------
282
+
283
+ exit_file_detect = os.path.exists(self.BPA_FOLDER_DIRECTORY+"end.txt")
284
+
285
+ if exit_file_detect:
286
+ break
287
+ print("\n# STEP. "+str(iter)+" ("+str(TM.delta_timescale * iter * self.time_atom_unit * 10 ** 15)+" fs)\n")
288
+ #---------------------------------------
289
+
290
+ SP.Model_hess = self.Model_hess
291
+ e, g, geom_num_list, finish_frag = SP.single_point(file_directory, element_number_list, iter, electric_charge_and_multiplicity, force_data["xtb"])
292
+ self.Model_hess = SP.Model_hess
293
+ if finish_frag:
294
+ break
295
+ _, B_e, B_g, _ = CalcBiaspot.main(e, g, geom_num_list, element_list, force_data, pre_B_g, iter, initial_geom_num_list)#new_geometry:ang.
296
+
297
+
298
+
299
+
300
+ #---------------------------------------
301
+ if iter == 0:
302
+ TM.init_purtubation(geom_num_list, B_e, B_g)
303
+ initial_geom_num_list = geom_num_list
304
+ pre_geom = initial_geom_num_list
305
+ if projection_constrain_flag:
306
+ PC.initialize(geom_num_list)
307
+
308
+ else:
309
+ pass
310
+
311
+ if projection_constrain_flag:
312
+ B_g = PC.calc_project_out_grad(geom_num_list, B_g)
313
+ g = PC.calc_project_out_grad(geom_num_list, g)
314
+
315
+
316
+ #-------------------energy profile
317
+ if iter == 0:
318
+ with open(self.BPA_FOLDER_DIRECTORY+"energy_profile.csv","a") as f:
319
+ f.write("energy [hartree] \n")
320
+ with open(self.BPA_FOLDER_DIRECTORY+"energy_profile.csv","a") as f:
321
+ f.write(str(e)+"\n")
322
+ #-------------------gradient profile
323
+ if iter == 0:
324
+ with open(self.BPA_FOLDER_DIRECTORY+"gradient_profile.csv","a") as f:
325
+ f.write("gradient (RMS) [hartree/Bohr] \n")
326
+ with open(self.BPA_FOLDER_DIRECTORY+"gradient_profile.csv","a") as f:
327
+ f.write(str(np.sqrt((g**2).mean()))+"\n")
328
+ #-------------------
329
+ if iter == 0:
330
+ with open(self.BPA_FOLDER_DIRECTORY+"tot_energy_profile.csv","a") as f:
331
+ f.write("total energy [hartree] \n")
332
+ else:
333
+ with open(self.BPA_FOLDER_DIRECTORY+"tot_energy_profile.csv","a") as f:
334
+ f.write(str(self.tot_energy_list[-1])+"\n")
335
+
336
+ if finish_frag:#If QM calculation doesnt end, the process of this program is terminated.
337
+ break
338
+ #----------------------------
339
+ #----------------------------
340
+
341
+
342
+ new_geometry = self.exec_md(TM, geom_num_list, pre_geom, B_g, B_e, pre_B_g, iter)
343
+
344
+ if iter % 10 != 0:
345
+ shutil.rmtree(file_directory)
346
+
347
+
348
+ self.ENERGY_LIST_FOR_PLOTTING.append(e*self.hartree2kcalmol)
349
+ self.AFIR_ENERGY_LIST_FOR_PLOTTING.append(B_e*self.hartree2kcalmol)
350
+ self.NUM_LIST.append(int(iter))
351
+
352
+ #--------------------geometry info
353
+ self.geom_info_extract(force_data, file_directory, B_g, g)
354
+ #----------------------------
355
+
356
+
357
+ grad_list.append(np.sqrt((g**2).mean()))
358
+
359
+ #-------------------------
360
+
361
+ if len(force_data["fix_atoms"]) > 0:
362
+ for j in force_data["fix_atoms"]:
363
+ new_geometry[j-1] = copy.copy(initial_geom_num_list[j-1]*self.bohr2angstroms)
364
+
365
+ if projection_constrain_flag:
366
+ tmp_new_geometry = new_geometry / self.bohr2angstroms
367
+ new_geometry = PC.adjust_init_coord(tmp_new_geometry) * self.bohr2angstroms
368
+
369
+ #----------------------------
370
+ pre_B_g = B_g#Hartree/Bohr
371
+ pre_geom = geom_num_list#Bohr
372
+
373
+ geometry_list = FIO.print_geometry_list(new_geometry*self.bohr2angstroms, element_list, electric_charge_and_multiplicity)
374
+
375
+ file_directory = FIO.make_psi4_input_file(geometry_list, iter+1)
376
+
377
+ #----------------------------
378
+ #plot graph
379
+ G = Graph(self.BPA_FOLDER_DIRECTORY)
380
+ self.NUM_LIST = np.array(self.NUM_LIST, dtype=np.float64)
381
+ #TM.delta_timescale * iter * self.time_atom_unit * 10 ** 15
382
+ G.double_plot(self.NUM_LIST * TM.delta_timescale * self.time_atom_unit * 10 ** 15, self.ENERGY_LIST_FOR_PLOTTING, self.AFIR_ENERGY_LIST_FOR_PLOTTING)
383
+ G.single_plot(self.NUM_LIST * TM.delta_timescale * self.time_atom_unit * 10 ** 15, grad_list, file_directory, "", axis_name_1="STEP (fs)", axis_name_2="gradient (RMS) [a.u.]", name="gradient")
384
+ G.single_plot(self.NUM_LIST * TM.delta_timescale * self.time_atom_unit * 10 ** 15, TM.Instantaneous_temperatures_list, file_directory, "", axis_name_1="STEP (fs)", axis_name_2="temperature [K]", name="temperature")
385
+ G.single_plot(self.NUM_LIST * TM.delta_timescale * self.time_atom_unit * 10 ** 15, self.tot_energy_list, file_directory, "", axis_name_1="STEP (fs)", axis_name_2="total energy [a.u.]", name="tot_energy")
386
+ if len(force_data["geom_info"]) > 1:
387
+ for num, i in enumerate(force_data["geom_info"]):
388
+ self.single_plot(self.NUM_LIST, cos_list[num], file_directory, i)
389
+
390
+
391
+ FIO.make_traj_file()
392
+ FIO.argrelextrema_txt_save(self.ENERGY_LIST_FOR_PLOTTING, "maximum_value", "max")
393
+ FIO.argrelextrema_txt_save(self.ENERGY_LIST_FOR_PLOTTING, "minimum_value", "min")
394
+ FIO.argrelextrema_txt_save(grad_list, "local_min_grad", "min")
395
+
396
+
397
+ with open(self.BPA_FOLDER_DIRECTORY+"energy_profile_kcalmol.csv","w") as f:
398
+ f.write("STEP,energy[kcal/mol]\n")
399
+ for i in range(len(self.ENERGY_LIST_FOR_PLOTTING)):
400
+ f.write(str(i)+","+str(self.ENERGY_LIST_FOR_PLOTTING[i] - self.ENERGY_LIST_FOR_PLOTTING[0])+"\n")
401
+
402
+ #----------------------
403
+ print("Complete...")
404
+ return
405
+
406
+
407
+ def geom_info_extract(self, force_data, file_directory, B_g, g):
408
+ if len(force_data["geom_info"]) > 1:
409
+ CSI = CalculationStructInfo()
410
+
411
+ data_list, data_name_list = CSI.Data_extract(glob.glob(file_directory+"/*.xyz")[0], force_data["geom_info"])
412
+
413
+ for num, i in enumerate(force_data["geom_info"]):
414
+ cos = CSI.calculate_cos(B_g[i-1] - g[i-1], g[i-1])
415
+ self.cos_list[num].append(cos)
416
+ if iter == 0:
417
+ with open(self.BPA_FOLDER_DIRECTORY+"geometry_info.csv","a") as f:
418
+ f.write(",".join(data_name_list)+"\n")
419
+
420
+ with open(self.BPA_FOLDER_DIRECTORY+"geometry_info.csv","a") as f:
421
+ f.write(",".join(list(map(str,data_list)))+"\n")
422
+ return
423
+
424
+ def run(self):
425
+
426
+ for i in range(self.num_of_trajectory):
427
+ self.md()
428
+
429
+
430
+ print("All complete...")
431
+
432
+ return