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
multioptpy/ieip.py ADDED
@@ -0,0 +1,340 @@
1
+ import os
2
+ import sys
3
+ import datetime
4
+ import glob
5
+ import numpy as np
6
+
7
+
8
+ from multioptpy.fileio import FileIO
9
+ from multioptpy.Parameters.parameter import UnitValueLib
10
+ from multioptpy.interface import force_data_parser
11
+
12
+ from multioptpy.OtherMethod.dimer import DimerMethod
13
+ from multioptpy.OtherMethod.newton_traj import NewtonTrajectory
14
+ from multioptpy.OtherMethod.addf import ADDFlikeMethod
15
+ from multioptpy.OtherMethod.twopshs import twoPSHSlikeMethod
16
+ from multioptpy.OtherMethod.elastic_image_pair import ElasticImagePair
17
+ from multioptpy.OtherMethod.modelfunction import ModelFunctionOptimizer
18
+
19
+ class IEIPConfig:
20
+ """
21
+ Configuration class for Improved Elastic Image Pair (iEIP) method.
22
+
23
+ References:
24
+ - J. Chem. Theory. Comput. 2023, 19, 2410-2417
25
+ - J. Comput. Chem. 2018, 39, 233–251 (DS-AFIR)
26
+ """
27
+ def __init__(self, args):
28
+ UVL = UnitValueLib()
29
+ np.set_printoptions(precision=12, floatmode="fixed", suppress=True)
30
+
31
+ # Unit conversion constants
32
+ self.hartree2kcalmol = UVL.hartree2kcalmol
33
+ self.bohr2angstroms = UVL.bohr2angstroms
34
+ self.hartree2kjmol = UVL.hartree2kjmol
35
+
36
+ # Displacement and convergence thresholds
37
+ self.displacement_limit = 0.04 # Bohr
38
+ self.maximum_ieip_disp = 0.2 # Bohr
39
+ self.L_covergence = 0.03 # Bohr
40
+ self.img_distance_convage_criterion = 0.15 # Bohr
41
+
42
+ # Convergence thresholds
43
+ self.MAX_FORCE_THRESHOLD = 0.0006
44
+ self.RMS_FORCE_THRESHOLD = 0.0004
45
+ self.MAX_DISPLACEMENT_THRESHOLD = 0.0030
46
+ self.RMS_DISPLACEMENT_THRESHOLD = 0.0020
47
+
48
+ # Iteration limits
49
+ self.microiterlimit = int(args.NSTEP)
50
+ self.microiter_num = args.microiter
51
+
52
+ # Electronic state configuration
53
+ self.initial_excite_state = args.excited_state[0]
54
+ self.final_excite_state = args.excited_state[1]
55
+ self.excite_state_list = args.excited_state
56
+
57
+ # Charge and multiplicity
58
+ self.init_electric_charge_and_multiplicity = [int(args.electronic_charge[0]), int(args.spin_multiplicity[0])]
59
+ self.final_electric_charge_and_multiplicity = [int(args.electronic_charge[1]), int(args.spin_multiplicity[1])]
60
+ self.electric_charge_and_multiplicity_list = []
61
+ for i in range(len(args.electronic_charge)):
62
+ self.electric_charge_and_multiplicity_list.append([int(args.electronic_charge[i]), int(args.spin_multiplicity[i])])
63
+
64
+ # Solvation models
65
+ self.cpcm_solv_model = args.cpcm_solv_model
66
+ self.alpb_solv_model = args.alpb_solv_model
67
+
68
+ # Computation resources
69
+ self.N_THREAD = args.N_THREAD
70
+ self.SET_MEMORY = args.SET_MEMORY
71
+ self.START_FILE = args.INPUT + "/"
72
+
73
+ # Quantum chemistry settings
74
+ self.BASIS_SET = args.basisset
75
+ self.FUNCTIONAL = args.functional
76
+ self.usextb = args.usextb
77
+ self.usedxtb = args.usedxtb
78
+ self.electronic_charge = args.electronic_charge
79
+ self.spin_multiplicity = args.spin_multiplicity
80
+
81
+ # Validate sub-basis set inputs
82
+ if len(args.sub_basisset) % 2 != 0:
83
+ print("invalid input (-sub_bs)")
84
+ sys.exit(0)
85
+
86
+ # Configure basis sets
87
+ if args.pyscf:
88
+ self.SUB_BASIS_SET = {}
89
+ if len(args.sub_basisset) > 0:
90
+ self.SUB_BASIS_SET["default"] = str(self.BASIS_SET)
91
+ for j in range(int(len(args.sub_basisset)/2)):
92
+ self.SUB_BASIS_SET[args.sub_basisset[2*j]] = args.sub_basisset[2*j+1]
93
+ print("Basis Sets defined by User are detected.")
94
+ print(self.SUB_BASIS_SET)
95
+ else:
96
+ self.SUB_BASIS_SET = {"default": self.BASIS_SET}
97
+ else: # psi4
98
+ self.SUB_BASIS_SET = ""
99
+ if len(args.sub_basisset) > 0:
100
+ self.SUB_BASIS_SET += "\nassign " + str(self.BASIS_SET) + "\n"
101
+ for j in range(int(len(args.sub_basisset)/2)):
102
+ self.SUB_BASIS_SET += "assign " + args.sub_basisset[2*j] + " " + args.sub_basisset[2*j+1] + "\n"
103
+ print("Basis Sets defined by User are detected.")
104
+ print(self.SUB_BASIS_SET)
105
+
106
+ # Validate effective core potential inputs
107
+ if len(args.effective_core_potential) % 2 != 0:
108
+ print("invalid input (-ecp)")
109
+ sys.exit(0)
110
+
111
+ # Configure effective core potentials
112
+ if args.pyscf:
113
+ self.ECP = {}
114
+ if len(args.effective_core_potential) > 0:
115
+ for j in range(int(len(args.effective_core_potential)/2)):
116
+ self.ECP[args.effective_core_potential[2*j]] = args.effective_core_potential[2*j+1]
117
+ else:
118
+ self.ECP = ""
119
+
120
+ # Other settings
121
+ self.othersoft = args.othersoft
122
+ self.software_path_file = args.software_path_file
123
+ self.basic_set_and_function = args.functional + "/" + args.basisset
124
+ self.force_data = force_data_parser(args)
125
+
126
+ # Set up output directory
127
+ if self.othersoft != "None":
128
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + args.othersoft + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
129
+ elif args.sqm2:
130
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_SQM2_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
131
+
132
+ elif args.sqm1:
133
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_SQM1_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
134
+ elif args.usextb == "None" and args.usedxtb == "None":
135
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.basic_set_and_function.replace("/", "_") + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
136
+ else:
137
+ if args.usedxtb != "None":
138
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.usedxtb + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
139
+ self.force_data["xtb"] = self.usedxtb
140
+ else:
141
+ self.iEIP_FOLDER_DIRECTORY = args.INPUT + "_iEIP_" + self.usextb + "_" + str(datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f")[:-2]) + "/"
142
+ self.force_data["xtb"] = self.usextb
143
+
144
+ # Optimization parameters
145
+ self.args = args
146
+ self.BETA = args.BETA
147
+ self.spring_const = 1e-8
148
+ self.unrestrict = args.unrestrict
149
+ self.mf_mode = args.model_function_mode
150
+ self.FC_COUNT = int(args.calc_exact_hess)
151
+ self.dft_grid = int(args.dft_grid)
152
+
153
+ # Set config for Newton Trajectory Method
154
+ self.use_gnt = getattr(args, 'use_gnt', False)
155
+ self.gnt_step_len = getattr(args, 'gnt_step_len', 0.5)
156
+ self.gnt_rms_thresh = getattr(args, 'gnt_rms_thresh', 1.7e-3)
157
+ self.gnt_vec = getattr(args, 'gnt_vec', None)
158
+ self.gnt_microiter = getattr(args, 'gnt_microiter', 100)
159
+
160
+ # Set config for ADDF-like method
161
+ self.use_addf = getattr(args, 'use_addf', False)
162
+ self.addf_step_num = getattr(args, 'addf_step_num', 300)
163
+ self.nadd = getattr(args, 'number_of_add', 5)
164
+ self.addf_step_size = getattr(args, 'addf_step_size', 0.05)
165
+
166
+ # Set config for 2PSHS-like method
167
+ self.use_2pshs = getattr(args, 'use_2pshs', False)
168
+ self.twoPshs_step_num = getattr(args, 'twoPshs_step_num', 300)
169
+ self.twoPshs_step_size = getattr(args, 'twoPshs_step_size', 0.05)
170
+
171
+ # Set config for Dimer Method
172
+ self.use_dimer = getattr(args, 'use_dimer', False)
173
+ self.dimer_separation = getattr(args, 'dimer_separation', 0.0001)
174
+ self.dimer_trial_angle = getattr(args, 'dimer_trial_angle', np.pi / 32.0)
175
+ self.dimer_max_iterations = getattr(args, 'dimer_max_iterations', 1000)
176
+
177
+ # Create output directory
178
+ os.mkdir(self.iEIP_FOLDER_DIRECTORY)
179
+
180
+ def save_input_data(self):
181
+ """Save the input configuration data to a file"""
182
+ with open(self.iEIP_FOLDER_DIRECTORY + "input.txt", "w") as f:
183
+ f.write(str(vars(self.args)))
184
+ return
185
+
186
+
187
+ class iEIP:
188
+ """
189
+ Main class for Improved Elastic Image Pair (iEIP) method.
190
+
191
+ Manages the overall optimization process by delegating to specialized
192
+ component classes for configuration, elastic image pair optimization,
193
+ model function optimization.
194
+
195
+
196
+ References:
197
+ - J. Chem. Theory. Comput. 2023, 19, 2410-2417
198
+ - J. Comput. Chem. 2018, 39, 233–251 (DS-AFIR)
199
+ """
200
+ def __init__(self, args):
201
+ self.config = IEIPConfig(args)
202
+ self.elastic_image_pair = ElasticImagePair(self.config)
203
+ self.model_function_optimizer = ModelFunctionOptimizer(self.config)
204
+ self.newton_trajectory = NewtonTrajectory(self.config)
205
+ self.addf_like_method = ADDFlikeMethod(self.config)
206
+ self.twoPshs = twoPSHSlikeMethod(self.config)
207
+ self.dimer_method = DimerMethod(self.config)
208
+
209
+
210
+ def optimize(self):
211
+ """Load calculation modules based on configuration and run optimization"""
212
+ if self.config.othersoft != "None":
213
+ if self.config.othersoft.lower() == "lj":
214
+ from multioptpy.Calculator.lj_calculation_tools import Calculation
215
+ print("Use Lennard-Jones cluster potential.")
216
+ elif self.config.othersoft.lower() == "emt":
217
+ from multioptpy.Calculator.emt_calculation_tools import Calculation
218
+ print("Use EMT cluster potential.")
219
+ elif self.config.othersoft.lower() == "tersoff":
220
+ from multioptpy.Calculator.tersoff_calculation_tools import Calculation
221
+ print("Use Tersoff cluster potential.")
222
+ else:
223
+ print("Use", self.config.othersoft)
224
+ with open(self.config.iEIP_FOLDER_DIRECTORY + "use_" + self.config.othersoft + ".txt", "w") as f:
225
+ f.write(self.config.othersoft + "\n")
226
+ f.write(self.config.BASIS_SET + "\n")
227
+ f.write(self.config.FUNCTIONAL + "\n")
228
+ from multioptpy.Calculator.ase_calculation_tools import Calculation
229
+ elif self.config.args.sqm2:
230
+ from multioptpy.Calculator.sqm2_calculation_tools import Calculation
231
+ print("Use SQM2 potential.")
232
+
233
+ elif self.config.args.sqm1:
234
+ from multioptpy.Calculator.sqm1_calculation_tools import Calculation
235
+ elif self.config.args.pyscf:
236
+ from multioptpy.Calculator.pyscf_calculation_tools import Calculation
237
+ elif self.config.args.usextb != "None" and self.config.args.usedxtb == "None":
238
+ from multioptpy.Calculator.tblite_calculation_tools import Calculation
239
+ elif self.config.args.usedxtb != "None" and self.config.args.usextb == "None":
240
+ from multioptpy.Calculator.dxtb_calculation_tools import Calculation
241
+ else:
242
+ from multioptpy.Calculator.psi4_calculation_tools import Calculation
243
+
244
+ file_path_list = glob.glob(self.config.START_FILE+"*_[A-Z].xyz")
245
+ FIO_img_list = []
246
+
247
+ for file_path in file_path_list:
248
+ FIO_img_list.append(FileIO(self.config.iEIP_FOLDER_DIRECTORY, file_path))
249
+
250
+ geometry_list_list = []
251
+ element_list_list = []
252
+ electric_charge_and_multiplicity_list = []
253
+
254
+ for i in range(len(FIO_img_list)):
255
+ geometry_list, element_list, electric_charge_and_multiplicity = FIO_img_list[i].make_geometry_list(
256
+ self.config.electric_charge_and_multiplicity_list[i])
257
+
258
+ if self.config.args.pyscf:
259
+ electric_charge_and_multiplicity = [self.config.electronic_charge[i],
260
+ self.config.spin_multiplicity[i]]
261
+
262
+ geometry_list_list.append(geometry_list)
263
+ element_list_list.append(element_list)
264
+ electric_charge_and_multiplicity_list.append(electric_charge_and_multiplicity)
265
+
266
+ # Save input configuration data
267
+ self.config.save_input_data()
268
+
269
+ # Initialize calculation objects
270
+ SP_list = []
271
+ file_directory_list = []
272
+ for i in range(len(FIO_img_list)):
273
+ SP_list.append(Calculation(
274
+ START_FILE = self.config.START_FILE,
275
+ N_THREAD = self.config.N_THREAD,
276
+ SET_MEMORY = self.config.SET_MEMORY,
277
+ FUNCTIONAL = self.config.FUNCTIONAL,
278
+ FC_COUNT = self.config.FC_COUNT,
279
+ BPA_FOLDER_DIRECTORY = self.config.iEIP_FOLDER_DIRECTORY,
280
+ Model_hess = np.eye(3*len(geometry_list_list[i])),
281
+ unrestrict = self.config.unrestrict,
282
+ BASIS_SET = self.config.BASIS_SET,
283
+ SUB_BASIS_SET = self.config.SUB_BASIS_SET,
284
+ electronic_charge = self.config.electronic_charge[i] or electric_charge_and_multiplicity_list[i][0],
285
+ spin_multiplicity = self.config.spin_multiplicity[i] or electric_charge_and_multiplicity_list[i][1],
286
+ excited_state = self.config.excite_state_list[i],
287
+ dft_grid = self.config.dft_grid,
288
+ ECP = self.config.ECP,
289
+ software_type = self.config.othersoft,
290
+ software_path_file = self.config.software_path_file
291
+ ))
292
+
293
+ SP_list[i].cpcm_solv_model = self.config.cpcm_solv_model
294
+ SP_list[i].alpb_solv_model = self.config.alpb_solv_model
295
+
296
+ file_directory = FIO_img_list[i].make_psi4_input_file(geometry_list_list[i], 0)
297
+ file_directory_list.append(file_directory)
298
+
299
+ # Run optimization with appropriate method
300
+ if self.config.mf_mode != "None":
301
+ self.model_function_optimizer.model_function_optimization(
302
+ file_directory_list, SP_list, element_list_list,
303
+ self.config.electric_charge_and_multiplicity_list, FIO_img_list)
304
+ elif self.config.use_gnt:
305
+ self.newton_trajectory.main(file_directory_list[0], file_directory_list[1],
306
+ SP_list[0], SP_list[1], element_list_list[0],
307
+ self.config.electric_charge_and_multiplicity_list[0],
308
+ self.config.electric_charge_and_multiplicity_list[1],
309
+ FIO_img_list[0], FIO_img_list[1])
310
+ elif self.config.use_addf:
311
+ self.addf_like_method.run(file_directory_list[0],
312
+ SP_list[0],
313
+ self.config.electric_charge_and_multiplicity_list[0],
314
+ FIO_img_list[0])
315
+ elif self.config.use_2pshs:
316
+ self.twoPshs.run(file_directory_list[0],
317
+ SP_list[0], SP_list[1],
318
+ self.config.electric_charge_and_multiplicity_list[0],
319
+ FIO_img_list[0], FIO_img_list[1])
320
+ elif self.config.use_dimer:
321
+ self.dimer_method.run(file_directory_list[0],
322
+ SP_list[0],
323
+ self.config.electric_charge_and_multiplicity_list[0],
324
+ FIO_img_list[0])
325
+
326
+ else:
327
+ self.elastic_image_pair.iteration(
328
+ file_directory_list[0], file_directory_list[1],
329
+ SP_list[0], SP_list[1], element_list_list[0],
330
+ self.config.electric_charge_and_multiplicity_list[0],
331
+ self.config.electric_charge_and_multiplicity_list[1],
332
+ FIO_img_list[0], FIO_img_list[1])
333
+
334
+ return
335
+
336
+ def run(self):
337
+ """Run the optimization process and display completion message"""
338
+ self.optimize()
339
+ print("completed...")
340
+ return