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,47 @@
1
+ import numpy as np
2
+
3
+ class OptMESX:
4
+ def __init__(self):
5
+ #ref.: Chemical Physics Letters 674 (2017) 141-145
6
+
7
+ self.switch_threshold = 5e-4
8
+ self.alpha = 1e-3
9
+ return
10
+
11
+ def calc_energy(self, energy_1, energy_2):
12
+ tot_energy = (energy_1 + energy_2) / 2.0
13
+ print("energy_1:", energy_1, "hartree")
14
+ print("energy_2:", energy_2, "hartree")
15
+ print("|energy_1 - energy_2|:", abs(energy_1 - energy_2), "hartree")
16
+ return tot_energy
17
+
18
+ def calc_grad(self, energy_1, energy_2, grad_1, grad_2):
19
+ delta_grad = grad_1 - grad_2
20
+ norm_delta_grad = np.linalg.norm(delta_grad)
21
+ if norm_delta_grad < 1e-8:
22
+ dgv_vec = np.zeros_like(delta_grad)
23
+ else:
24
+ dgv_vec = delta_grad / norm_delta_grad
25
+ dgv_vec = dgv_vec.reshape(-1, 1)
26
+
27
+ P_matrix = np.eye((len(dgv_vec))) -1 * np.dot(dgv_vec, dgv_vec.T)
28
+ P_matrix = 0.5 * (P_matrix + P_matrix.T)
29
+ gp_grad = 2 * (energy_1 - energy_2) * dgv_vec + np.dot(P_matrix, 0.5 * (grad_1.reshape(-1, 1) + grad_2.reshape(-1, 1)))
30
+
31
+ gp_grad = gp_grad.reshape(len(grad_1), 3)
32
+ return gp_grad
33
+
34
+ def calc_hess(self, grad_1, grad_2, hess_1, hess_2):
35
+ delta_grad = grad_1 - grad_2
36
+ norm_delta_grad = np.linalg.norm(delta_grad)
37
+ if norm_delta_grad < 1e-8:
38
+ dgv_vec = np.zeros_like(delta_grad)
39
+ else:
40
+ dgv_vec = delta_grad / norm_delta_grad
41
+ delta_grad = delta_grad.reshape(-1, 1)
42
+ dgv_vec = dgv_vec.reshape(-1, 1)
43
+ P_matrix = np.eye((len(dgv_vec))) -1 * np.dot(dgv_vec, dgv_vec.T)
44
+ P_matrix = 0.5 * (P_matrix + P_matrix.T)
45
+ gp_hess = 2.0 * np.dot(delta_grad, dgv_vec.T) + np.dot(P_matrix, 0.5 * (hess_1 + hess_2))
46
+ return gp_hess
47
+
@@ -0,0 +1,49 @@
1
+ import numpy as np
2
+
3
+ class OptMESX2:
4
+ def __init__(self):
5
+ #ref.: Theor Chem Acc 99, 95–99 (1998)
6
+
7
+ self.switch_threshold = 5e-4
8
+ self.alpha = 1e-3
9
+ return
10
+
11
+ def calc_energy(self, energy_1, energy_2):
12
+ tot_energy = (energy_1 + energy_2) / 2.0
13
+ print("energy_1:", energy_1, "hartree")
14
+ print("energy_2:", energy_2, "hartree")
15
+ print("energy_1 - energy_2:", abs(energy_1 - energy_2), "hartree")
16
+ return tot_energy
17
+
18
+ def calc_grad(self, energy_1, energy_2, grad_1, grad_2):
19
+ grad_1 = grad_1.reshape(-1, 1)
20
+ grad_2 = grad_2.reshape(-1, 1)
21
+
22
+ delta_grad = grad_1 - grad_2
23
+ norm_delta_grad = np.linalg.norm(delta_grad)
24
+ if norm_delta_grad < 1e-8:
25
+ projection = np.zeros_like(delta_grad)
26
+ else:
27
+ projection = np.sum(grad_1 * delta_grad) / norm_delta_grad
28
+
29
+ parallel = grad_1 - delta_grad * projection / norm_delta_grad
30
+
31
+ gp_grad = (energy_1 - energy_2) * 140 * delta_grad + 1.0 * parallel
32
+
33
+ gp_grad = gp_grad.reshape(-1, 3)
34
+ return gp_grad
35
+
36
+ def calc_hess(self, grad_1, grad_2, hess_1, hess_2):
37
+ delta_grad = grad_1 - grad_2
38
+ norm_delta_grad = np.linalg.norm(delta_grad)
39
+ if norm_delta_grad < 1e-8:
40
+ dgv_vec = np.zeros_like(delta_grad)
41
+ else:
42
+ dgv_vec = delta_grad / norm_delta_grad
43
+ delta_grad = delta_grad.reshape(-1, 1)
44
+ dgv_vec = dgv_vec.reshape(-1, 1)
45
+ P_matrix = np.eye((len(dgv_vec))) -1 * np.dot(dgv_vec, dgv_vec.T)
46
+ P_matrix = 0.5 * (P_matrix + P_matrix.T)
47
+
48
+ gp_hess = 2.0 * np.dot(delta_grad, dgv_vec.T) + np.dot(P_matrix, 0.5 * (hess_1 + hess_2))
49
+ return gp_hess
@@ -0,0 +1,27 @@
1
+ import numpy as np
2
+
3
+
4
+ class SeamModelFunction:
5
+ def __init__(self):
6
+ #ref.: J. Phys. Chem. A 2009, 113, 9, 1704-1710
7
+ self.alpha = 0.05
8
+ return
9
+
10
+ def calc_energy(self, energy_1, energy_2):
11
+ tot_energy = 0.5 * (energy_1 + energy_2) + (energy_1 - energy_2) ** 2 / (self.alpha)
12
+ return tot_energy
13
+
14
+ def calc_grad(self, energy_1, energy_2, grad_1, grad_2):
15
+
16
+ smf_grad_1 = 0.5 * (grad_1) + 0.5 * (grad_2) + 2 * (energy_1 - energy_2) * (grad_1 - grad_2) / (self.alpha)
17
+ smf_grad_2 = 0.5 * (grad_1) + 0.5 * (grad_2) + 2 * (energy_1 - energy_2) * (grad_1 - grad_2) / (self.alpha)
18
+ return smf_grad_1, smf_grad_2
19
+
20
+ def calc_hess(self, energy_1, energy_2, grad_1, grad_2, hess_1, hess_2):
21
+ grad_1 = grad_1.reshape(-1, 1)
22
+ grad_2 = grad_2.reshape(-1, 1)
23
+ delta_grad = grad_1 - grad_2
24
+ delta_energy = energy_1 - energy_2
25
+ smf_hess = 0.5 * (hess_1 + hess_2) + (2.0 / self.alpha) * np.dot(delta_grad, delta_grad.T) + (2.0 / self.alpha) * delta_energy * (hess_1 - hess_2)
26
+
27
+ return smf_hess
File without changes
@@ -0,0 +1,147 @@
1
+ import numpy as np
2
+
3
+ from multioptpy.ModelHessian.fischer import FischerApproxHessian
4
+ from multioptpy.ModelHessian.fischerd3 import FischerD3ApproxHessian
5
+ from multioptpy.ModelHessian.fischerd4 import FischerD4ApproxHessian
6
+ from multioptpy.ModelHessian.gfnff import GFNFFApproxHessian
7
+ from multioptpy.ModelHessian.gfn0xtb import GFN0XTBApproxHessian
8
+ from multioptpy.ModelHessian.lindh import LindhApproxHessian
9
+ from multioptpy.ModelHessian.lindh2007d2 import Lindh2007D2ApproxHessian
10
+ from multioptpy.ModelHessian.lindh2007d3 import Lindh2007D3ApproxHessian
11
+ from multioptpy.ModelHessian.lindh2007d4 import Lindh2007D4ApproxHessian
12
+ from multioptpy.ModelHessian.morse import MorseApproxHessian
13
+ from multioptpy.ModelHessian.schlegel import SchlegelApproxHessian
14
+ from multioptpy.ModelHessian.schlegeld3 import SchlegelD3ApproxHessian
15
+ from multioptpy.ModelHessian.schlegeld4 import SchlegelD4ApproxHessian
16
+ from multioptpy.ModelHessian.swartd2 import SwartD2ApproxHessian
17
+ from multioptpy.ModelHessian.swartd3 import SwartD3ApproxHessian
18
+ from multioptpy.ModelHessian.swartd4 import SwartD4ApproxHessian
19
+ from multioptpy.ModelHessian.shortrange import ShortRangeCorrectionHessian
20
+ from multioptpy.ModelHessian.tshess import TransitionStateHessian
21
+
22
+ from multioptpy.Parameters.parameter import UnitValueLib
23
+
24
+ class ApproxHessian:
25
+ def __init__(self):
26
+ return
27
+
28
+ def main(self, coord, element_list, cart_gradient, approx_hess_type="lindh2007d3"):
29
+ #coord: Bohr
30
+
31
+
32
+ if "gfnff" in approx_hess_type.lower():
33
+ GFNFFAH = GFNFFApproxHessian()
34
+ hess_proj = GFNFFAH.main(coord, element_list, cart_gradient)
35
+ elif "gfn0xtb" in approx_hess_type.lower():
36
+ GFN0AH = GFN0XTBApproxHessian()
37
+ hess_proj = GFN0AH.main(coord, element_list, cart_gradient)
38
+ elif "fischerd3" in approx_hess_type.lower():
39
+ FAHD3 = FischerD3ApproxHessian()
40
+ hess_proj = FAHD3.main(coord, element_list, cart_gradient)
41
+ elif "fischerd4" in approx_hess_type.lower():
42
+ FAHD4 = FischerD4ApproxHessian()
43
+ hess_proj = FAHD4.main(coord, element_list, cart_gradient)
44
+
45
+ elif "schlegeld3" in approx_hess_type.lower():
46
+ SAHD3 = SchlegelD3ApproxHessian()
47
+ hess_proj = SAHD3.main(coord, element_list, cart_gradient)
48
+ elif "schlegeld4" in approx_hess_type.lower():
49
+ SAHD4 = SchlegelD4ApproxHessian()
50
+ hess_proj = SAHD4.main(coord, element_list, cart_gradient)
51
+ elif "schlegel" in approx_hess_type.lower():
52
+ SAH = SchlegelApproxHessian()
53
+ hess_proj = SAH.main(coord, element_list, cart_gradient)
54
+
55
+ elif "swartd3" in approx_hess_type.lower():
56
+ SWHD3 = SwartD3ApproxHessian()
57
+ hess_proj = SWHD3.main(coord, element_list, cart_gradient)
58
+ elif "swartd4" in approx_hess_type.lower():
59
+ SWHD4 = SwartD4ApproxHessian()
60
+ hess_proj = SWHD4.main(coord, element_list, cart_gradient)
61
+ elif "swart" in approx_hess_type.lower():
62
+ SWH = SwartD2ApproxHessian()
63
+ hess_proj = SWH.main(coord, element_list, cart_gradient)
64
+ elif "lindh2007d3" in approx_hess_type.lower():
65
+ LH2007D3 = Lindh2007D3ApproxHessian()
66
+ hess_proj = LH2007D3.main(coord, element_list, cart_gradient)
67
+ elif "lindh2007d4" in approx_hess_type.lower():
68
+ LH2007D4 = Lindh2007D4ApproxHessian()
69
+ hess_proj = LH2007D4.main(coord, element_list, cart_gradient)
70
+ elif "lindh2007" in approx_hess_type.lower():
71
+ LH2007 = Lindh2007D2ApproxHessian()
72
+ hess_proj = LH2007.main(coord, element_list, cart_gradient)
73
+ elif "lindh" in approx_hess_type.lower():
74
+ LAH = LindhApproxHessian()
75
+ hess_proj = LAH.main(coord, element_list, cart_gradient)
76
+ elif "fischer" in approx_hess_type.lower():
77
+ FH = FischerApproxHessian()
78
+ hess_proj = FH.main(coord, element_list, cart_gradient)
79
+ elif "morse" in approx_hess_type.lower():
80
+ MH = MorseApproxHessian()
81
+ hess_proj = MH.create_model_hessian(coord, element_list)
82
+ else:
83
+ print("Approximate Hessian type not recognized. Using default Lindh (2007) D3 model...")
84
+ LH2007D3 = Lindh2007D3ApproxHessian()
85
+ hess_proj = LH2007D3.main(coord, element_list, cart_gradient)
86
+
87
+ if "ts" in approx_hess_type.lower():
88
+ print("Applying transition state Hessian modification...")
89
+ TSH = TransitionStateHessian()
90
+ hess_proj = TSH.create_ts_hessian(hess_proj, cart_gradient)
91
+
92
+ if "sr" in approx_hess_type.lower():
93
+ SRCH = ShortRangeCorrectionHessian()
94
+ hess_proj = SRCH.main(coord, element_list, hess_proj)
95
+
96
+ if "clip" in approx_hess_type.lower():
97
+ print("Applying eigenvalue clipping...")
98
+ #eigenvalue smoothing
99
+ eigval, eigvec = np.linalg.eigh(hess_proj)
100
+ eigval = np.asarray(eigval)
101
+ eigval = smooth_eigval(eigval, alpha=0.1)
102
+ hess_proj = np.dot(eigvec, np.dot(np.diag(eigval), eigvec.T))
103
+
104
+ return hess_proj#cart_hess
105
+
106
+
107
+ def smooth_eigval(eigval, alpha=0.1):
108
+ """Smooth eigenvalues to avoid abnormally large values"""
109
+ eigval = np.asarray(eigval)
110
+ result = eigval.astype(float, copy=True)
111
+ mask = np.abs(eigval) >= 1.0
112
+ result[mask] = np.sign(eigval[mask]) * (2.0 - 1.0 / (np.abs(eigval)[mask] ** alpha))
113
+ return result
114
+
115
+
116
+ def test():
117
+ AH = ApproxHessian()
118
+ words = ["O 1.607230637 0.000000000 -4.017111134",
119
+ "O 1.607230637 0.463701826 -2.637210910",
120
+ "H 2.429229637 0.052572461 -2.324941515",
121
+ "H 0.785231637 -0.516274287 -4.017735703"]
122
+
123
+ elements = []
124
+ coord = []
125
+
126
+ for word in words:
127
+ sw = word.split()
128
+ elements.append(sw[0])
129
+ coord.append(sw[1:4])
130
+
131
+ coord = np.array(coord, dtype="float64")/UnitValueLib().bohr2angstroms#Bohr
132
+ gradient = np.array([[-0.0028911 , -0.0015559 , 0.0002471],
133
+ [ 0.0028769 , -0.0013954 , 0.0007272],
134
+ [-0.0025737 , 0.0013921 , -0.0007226],
135
+ [ 0.0025880 , 0.0015592 , -0.0002518]], dtype="float64")#a. u.
136
+
137
+ hess_proj = AH.main(coord, elements, gradient)
138
+
139
+ return hess_proj
140
+
141
+
142
+
143
+ if __name__ == "__main__":#test
144
+ test()
145
+
146
+
147
+
@@ -0,0 +1,227 @@
1
+ import numpy as np
2
+ from multioptpy.Parameters.parameter import D2_S6_parameter
3
+
4
+
5
+ def calc_vdw_isotopic(x_ij, y_ij, z_ij, C6_param_ij, C6_VDW_ij):
6
+
7
+ x_ij = x_ij + 1.0e-12
8
+ y_ij = y_ij + 1.0e-12
9
+ z_ij = z_ij + 1.0e-12
10
+ a_vdw = 20.0
11
+ t_1 = D2_S6_parameter * C6_param_ij
12
+ t_2 = x_ij ** 2
13
+ t_3 = y_ij ** 2
14
+ t_4 = z_ij ** 2
15
+ t_5 = t_2 + t_3 + t_4
16
+ t_6 = t_5 ** 2
17
+ t_7 = t_6 ** 2
18
+ t_10 = t_5 ** 0.5
19
+ t_11 = 0.1 / C6_VDW_ij
20
+
21
+ t_15 = np.exp(-1 * a_vdw * (t_10 * t_11 - 0.1)) + 1.0e-12
22
+ t_16 = 0.1 + t_15
23
+ t_17 = 0.1 / t_16
24
+ t_24 = t_16 ** 2
25
+ t_25 = 0.1 / t_24
26
+ t_29 = t_11 * t_15
27
+ t_33 = 0.1 / t_7
28
+ t_41 = a_vdw ** 2
29
+ t_42 = C6_VDW_ij ** 2
30
+ t_44 = t_41 / t_42
31
+ t_45 = t_15 ** 2
32
+ #print(t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_10, t_11, t_15, t_16, t_17, t_24, t_25, t_29, t_33, t_41, t_42, t_44, t_45)
33
+ t_62 = -0.48 * t_1 / t_7 / t_5 * t_17 * t_2 + 0.13 * t_1 / t_10 / t_7 * t_25 * t_2 * a_vdw * t_29 + 0.6 * t_1 * t_33 * t_17 - 0.2 * t_1 * t_33 / t_24 / t_16 * t_44 * t_2 * t_45 - t_1 / t_10 / t_6 / t_5 * t_25 * a_vdw * t_29 + t_1 * t_33 * t_25 * t_44 * t_2 * t_15
34
+
35
+ return t_62
36
+
37
+ def calc_vdw_anisotropic(x_ij, y_ij, z_ij, C6_param_ij, C6_VDW_ij):
38
+ a_vdw = 20.0
39
+ x_ij = x_ij + 1.0e-12
40
+ y_ij = y_ij + 1.0e-12
41
+ z_ij = z_ij + 1.0e-12
42
+
43
+ t_1 = D2_S6_parameter * C6_param_ij
44
+ t_2 = x_ij ** 2
45
+ t_3 = y_ij ** 2
46
+ t_4 = z_ij ** 2
47
+ t_5 = t_2 + t_3 + t_4
48
+ t_6 = t_5 ** 2
49
+ t_7 = t_6 ** 2
50
+ t_11 = t_5 ** 0.5
51
+ t_12 = 0.1 / C6_VDW_ij
52
+
53
+ t_16 = np.exp(-1 * a_vdw * (t_11 * t_12 - 0.1)) + 1.0e-12
54
+ t_17 = 0.1 + t_16
55
+ t_25 = t_17 ** 2
56
+ t_26 = 0.1 / t_25
57
+ t_35 = 0.1 / t_7
58
+ t_40 = a_vdw ** 2
59
+ t_41 = C6_VDW_ij ** 2
60
+ t_43 = t_40 / t_41
61
+ t_44 = t_16 ** 2
62
+ #print(t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_11, t_12, t_16, t_17, t_25, t_26, t_35, t_40, t_41, t_43, t_44)
63
+ t_56 = -0.48 * t_1 / t_7 / t_5 / t_17 * x_ij * y_ij + 0.13 * t_1 / t_11 / t_7 * t_26 * x_ij * a_vdw * t_12 * y_ij * t_16 - 0.2 * t_1 * t_35 / t_25 / t_17 * t_43 * x_ij * t_44 * y_ij + t_1 * t_35 * t_26 * t_43 * x_ij * y_ij * t_16
64
+ #print(t_16, t_56)
65
+ return t_56
66
+
67
+
68
+ def outofplane2(t_xyz):
69
+ r_1 = t_xyz[0] - t_xyz[3]
70
+ q_41 = np.linalg.norm(r_1)
71
+ e_41 = r_1 / q_41
72
+
73
+ r_2 = t_xyz[1] - t_xyz[3]
74
+ q_42 = np.linalg.norm(r_2)
75
+ e_42 = r_2 / q_42
76
+
77
+ r_3 = t_xyz[2] - t_xyz[3]
78
+ q_43 = np.linalg.norm(r_3)
79
+ e_43 = r_3 / q_43
80
+
81
+ cosfi1 = np.dot(e_43, e_42)
82
+
83
+ fi_1 = np.arccos(cosfi1)
84
+
85
+ if abs(fi_1 - np.pi) < 1e-12:
86
+ teta = 0.0
87
+ bt = 0.0
88
+ return teta, bt
89
+
90
+ cosfi2 = np.dot(e_41, e_43)
91
+ fi_2 = np.arccos(cosfi2)
92
+ #deg_fi_2 = 180.0 * fi_2 / np.pi
93
+
94
+ cosfi3 = np.dot(e_41, e_42)
95
+
96
+ fi_3 = np.arccos(cosfi3)
97
+ #deg_fi_3 = 180.0 * fi_3 / np.pi
98
+
99
+ c14 = np.zeros((3, 3))
100
+
101
+ c14[0] = t_xyz[0]
102
+ c14[1] = t_xyz[3]
103
+
104
+ r_42 = t_xyz[1] - t_xyz[3]
105
+ r_43 = t_xyz[2] - t_xyz[3]
106
+ c14[2][0] = r_42[1] * r_43[2] - r_42[2] * r_43[1]
107
+ c14[2][1] = r_42[2] * r_43[0] - r_42[0] * r_43[2]
108
+ c14[2][2] = r_42[0] * r_43[1] - r_42[1] * r_43[0]
109
+
110
+ if ((c14[2][0] ** 2 + c14[2][1] ** 2 + c14[2][2] ** 2) < 1e-12):
111
+ teta = 0.0
112
+ bt = 0.0
113
+ return teta, bt
114
+ c14[2][0] = c14[2][0] + t_xyz[3][0]
115
+ c14[2][1] = c14[2][1] + t_xyz[3][1]
116
+ c14[2][2] = c14[2][2] + t_xyz[3][2]
117
+
118
+ teta, br_14 = bend2(c14)
119
+
120
+ teta = teta -0.5 * np.pi
121
+
122
+ bt = np.zeros((4, 3))
123
+
124
+ for i_x in range(1, 4):
125
+ i_y = (i_x + 1) % 4 + (i_x + 1) // 4
126
+ i_z = (i_y + 1) % 4 + (i_y + 1) // 4
127
+
128
+ bt[0][i_x-1] = -1 * br_14[2][i_x-1]
129
+ bt[1][i_x-1] = -1 * br_14[2][i_y-1]
130
+ bt[2][i_x-1] = -1 * br_14[2][i_z-1]
131
+ bt[3][i_x-1] = -1 * (bt[0][i_x-1] + bt[1][i_x-1] + bt[2][i_x-1])
132
+
133
+ bt *= -1.0
134
+
135
+ return teta, bt# angle, move_vector
136
+
137
+ def torsion2(t_xyz):
138
+ r_ij_1, b_r_ij = stretch2(t_xyz[0:2])
139
+ r_ij_2, b_r_jk = stretch2(t_xyz[1:3])
140
+ r_ij_3, b_r_kl = stretch2(t_xyz[2:4])
141
+
142
+ fi_2, b_fi_2 = bend2(t_xyz[0:3])
143
+ fi_3, b_fi_3 = bend2(t_xyz[1:4])
144
+ sin_fi_2 = np.sin(fi_2)
145
+ sin_fi_3 = np.sin(fi_3)
146
+ cos_fi_2 = np.cos(fi_2)
147
+ cos_fi_3 = np.cos(fi_3)
148
+ costau = ( (b_r_ij[0][1] * b_r_jk[1][2] - b_r_jk[1][1] * b_r_ij[0][2])) * (b_r_jk[0][1] * b_r_kl[1][2] - b_r_jk[0][2] * b_r_kl[1][1]) + (b_r_ij[0][2] * b_r_jk[1][0] - b_r_ij[0][0] * b_r_jk[1][2]) * (b_r_jk[0][2] * b_r_kl[1][0] - b_r_jk[0][0] * b_r_kl[1][2]) + (b_r_ij[0][0] * b_r_jk[1][1] - b_r_ij[0][1] * b_r_jk[1][0]) * (b_r_jk[0][0] * b_r_kl[1][1] - b_r_jk[0][1] * b_r_kl[1][0]) / (sin_fi_2 * sin_fi_3)
149
+ sintau = (b_r_ij[1][0] * (b_r_jk[0][1] * b_r_kl[1][2] - b_r_jk[0][2] * b_r_kl[1][1]) + b_r_ij[1][1] * (b_r_jk[0][2] * b_r_kl[1][0] - b_r_jk[0][0] * b_r_kl[1][2]) + b_r_ij[1][2] * (b_r_jk[0][0] * b_r_kl[1][1] - b_r_jk[0][1] * b_r_kl[1][0])) / (sin_fi_2 * sin_fi_3)
150
+
151
+ tau = np.arctan2(sintau, costau)
152
+
153
+ if abs(tau) == np.pi:
154
+ tau = np.pi
155
+
156
+ bt = np.zeros((4, 3))
157
+ for i_x in range(1,4):
158
+ i_y = i_x + 1
159
+ if i_y > 3:
160
+ i_y = i_y - 3
161
+ i_z = i_y + 1
162
+ if i_z > 3:
163
+ i_z = i_z - 3
164
+ bt[0][i_x-1] = (b_r_ij[1][i_y-1] * b_r_jk[1][i_z-1] - b_r_ij[1][i_z-1] * b_r_jk[1][i_y-1]) / (r_ij_1 * sin_fi_2 ** 2)
165
+ bt[3][i_x-1] = (b_r_kl[0][i_y-1] * b_r_jk[0][i_z-1] - b_r_kl[0][i_z-1] * b_r_jk[0][i_y-1]) / (r_ij_3 * sin_fi_3 ** 2)
166
+ bt[1][i_x-1] = -1 * ((r_ij_2 - r_ij_1 * cos_fi_2) * bt[0][i_x-1] + r_ij_3 * cos_fi_3 * bt[3][i_x-1]) / r_ij_2
167
+ bt[2][i_x-1] = -1 * (bt[0][i_x-1] + bt[1][i_x-1] + bt[3][i_x-1])
168
+
169
+ for ix in range(1, 4):
170
+ iy = ix + 1
171
+ if iy > 3:
172
+ iy = iy - 3
173
+ iz = iy + 1
174
+ if iz > 3:
175
+ iz = iz - 3
176
+ bt[0][ix-1] = (b_r_ij[1][iy-1] * b_r_jk[1][iz-1] - b_r_ij[1][iz-1] * b_r_jk[1][iy-1]) / (r_ij_1 * sin_fi_2 ** 2)
177
+ bt[3][ix-1] = (b_r_kl[0][iy-1] * b_r_jk[0][iz-1] - b_r_kl[0][iz-1] * b_r_jk[0][iy-1]) / (r_ij_3 * sin_fi_3 ** 2)
178
+ bt[1][ix-1] = -1 * ((r_ij_2 - r_ij_1 * cos_fi_2) * bt[0][ix-1] + r_ij_3 * cos_fi_3 * bt[3][ix-1]) / r_ij_2
179
+ bt[2][ix-1] = -1 * (bt[0][ix-1] + bt[1][ix-1] + bt[3][ix-1])
180
+
181
+ return tau, bt # angle, move_vector
182
+
183
+ def bend2(t_xyz):
184
+ r_ij_1, b_r_ij = stretch2(t_xyz[0:2])
185
+ r_jk_1, b_r_jk = stretch2(t_xyz[1:3])
186
+ c_o = 0.0
187
+ crap = 0.0
188
+ for i in range(3):
189
+ c_o += b_r_ij[0][i] * b_r_jk[1][i]
190
+ crap += b_r_ij[0][i] ** 2
191
+ crap += b_r_jk[1][i] ** 2
192
+
193
+ if np.sqrt(crap) < 1e-12:
194
+ fir = np.pi - np.arcsin(np.sqrt(crap))
195
+ si = np.sqrt(crap)
196
+ else:
197
+ fir = np.arccos(c_o)
198
+ si = np.sqrt(1 - c_o ** 2)
199
+
200
+ if np.abs(fir - np.pi) < 1e-12:
201
+ fir = np.pi
202
+
203
+ bf = np.zeros((3, 3))
204
+ denom_1 = r_ij_1 * si
205
+ denom_2 = r_jk_1 * si
206
+
207
+ for i in range(3):
208
+ if denom_1 < 1e-12:
209
+ bf[0][i] = 0.0
210
+ else:
211
+ bf[0][i] = (c_o * b_r_ij[0][i] - b_r_jk[1][i]) / denom_1
212
+ if denom_2 < 1e-12:
213
+ bf[2][i] = 0.0
214
+ else:
215
+ bf[2][i] = (c_o * b_r_jk[1][i] - b_r_ij[0][i]) / denom_2
216
+ bf[1][i] = -1 * (bf[0][i] + bf[2][i])
217
+
218
+ return fir, bf # angle, move_vector
219
+
220
+ def stretch2(t_xyz):
221
+ dist = t_xyz[0] - t_xyz[1]
222
+ norm_dist = np.linalg.norm(dist)
223
+ b = np.zeros((2,3))
224
+ b[0] = -1 * dist / norm_dist
225
+ b[1] = dist / norm_dist
226
+ return norm_dist, b # distance, move_vectors (unit_vector)
227
+