MultiOptPy 1.20.6__tar.gz → 1.20.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. {multioptpy-1.20.6 → multioptpy-1.20.8/MultiOptPy.egg-info}/PKG-INFO +7 -7
  2. {multioptpy-1.20.6 → multioptpy-1.20.8}/MultiOptPy.egg-info/SOURCES.txt +1 -0
  3. multioptpy-1.20.8/MultiOptPy.egg-info/requires.txt +9 -0
  4. {multioptpy-1.20.6/MultiOptPy.egg-info → multioptpy-1.20.8}/PKG-INFO +7 -7
  5. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/approx_hessian.py +4 -0
  6. multioptpy-1.20.8/multioptpy/ModelHessian/fischerd3old.py +381 -0
  7. multioptpy-1.20.8/multioptpy/Potential/keep_angle_potential.py +558 -0
  8. multioptpy-1.20.8/multioptpy/Potential/keep_dihedral_angle_potential.py +316 -0
  9. multioptpy-1.20.8/multioptpy/Potential/keep_outofplain_angle_potential.py +277 -0
  10. multioptpy-1.20.8/multioptpy/Potential/keep_potential.py +178 -0
  11. {multioptpy-1.20.6 → multioptpy-1.20.8}/pyproject.toml +7 -7
  12. multioptpy-1.20.6/MultiOptPy.egg-info/requires.txt +0 -9
  13. multioptpy-1.20.6/multioptpy/Potential/keep_angle_potential.py +0 -146
  14. multioptpy-1.20.6/multioptpy/Potential/keep_dihedral_angle_potential.py +0 -105
  15. multioptpy-1.20.6/multioptpy/Potential/keep_outofplain_angle_potential.py +0 -70
  16. multioptpy-1.20.6/multioptpy/Potential/keep_potential.py +0 -99
  17. {multioptpy-1.20.6 → multioptpy-1.20.8}/LICENSE +0 -0
  18. {multioptpy-1.20.6 → multioptpy-1.20.8}/MultiOptPy.egg-info/dependency_links.txt +0 -0
  19. {multioptpy-1.20.6 → multioptpy-1.20.8}/MultiOptPy.egg-info/entry_points.txt +0 -0
  20. {multioptpy-1.20.6 → multioptpy-1.20.8}/MultiOptPy.egg-info/top_level.txt +0 -0
  21. {multioptpy-1.20.6 → multioptpy-1.20.8}/README.md +0 -0
  22. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/__init__.py +0 -0
  23. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_calculation_tools.py +0 -0
  24. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/__init__.py +0 -0
  25. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/fairchem.py +0 -0
  26. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/gamess.py +0 -0
  27. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/gaussian.py +0 -0
  28. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/gxtb_dev.py +0 -0
  29. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/mace.py +0 -0
  30. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/mopac.py +0 -0
  31. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/nwchem.py +0 -0
  32. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/orca.py +0 -0
  33. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/ase_tools/pygfn0.py +0 -0
  34. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/dxtb_calculation_tools.py +0 -0
  35. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/emt_calculation_tools.py +0 -0
  36. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/gpaw_calculation_tools.py +0 -0
  37. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/lj_calculation_tools.py +0 -0
  38. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/psi4_calculation_tools.py +0 -0
  39. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/pwscf_calculation_tools.py +0 -0
  40. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/pyscf_calculation_tools.py +0 -0
  41. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/sqm1_calculation_tools.py +0 -0
  42. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/sqm2_calculation_tools.py +0 -0
  43. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/tblite_calculation_tools.py +0 -0
  44. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Calculator/tersoff_calculation_tools.py +0 -0
  45. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Constraint/__init__.py +0 -0
  46. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Constraint/constraint_condition.py +0 -0
  47. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Coordinate/__init__.py +0 -0
  48. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Coordinate/polar_coordinate.py +0 -0
  49. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Coordinate/redundant_coordinate.py +0 -0
  50. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/__init__.py +0 -0
  51. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/converge_criteria.py +0 -0
  52. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/dvv.py +0 -0
  53. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/euler.py +0 -0
  54. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/hpc.py +0 -0
  55. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/lqa.py +0 -0
  56. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/modekill.py +0 -0
  57. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/IRC/rk4.py +0 -0
  58. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/__init__.py +0 -0
  59. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/adaptive_interpolation.py +0 -0
  60. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/binomial_interpolation.py +0 -0
  61. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/geodesic_interpolation.py +0 -0
  62. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/interpolation.py +0 -0
  63. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/linear_interpolation.py +0 -0
  64. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/savitzky_golay_interpolation.py +0 -0
  65. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Interpolation/spline_interpolation.py +0 -0
  66. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MD/__init__.py +0 -0
  67. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MD/thermostat.py +0 -0
  68. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/__init__.py +0 -0
  69. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_bneb_force.py +0 -0
  70. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_dmf_force.py +0 -0
  71. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_dneb_force.py +0 -0
  72. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_ewbneb_force.py +0 -0
  73. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_gpneb_force.py +0 -0
  74. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_lup_force.py +0 -0
  75. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_neb_force.py +0 -0
  76. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_nesb_force.py +0 -0
  77. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_om_force.py +0 -0
  78. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_qsm_force.py +0 -0
  79. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/MEP/pathopt_qsmv2_force.py +0 -0
  80. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/__init__.py +0 -0
  81. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/avoiding_model_function.py +0 -0
  82. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/binary_image_ts_search_model_function.py +0 -0
  83. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/conical_model_function.py +0 -0
  84. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/opt_meci.py +0 -0
  85. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/opt_mesx.py +0 -0
  86. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/opt_mesx_2.py +0 -0
  87. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelFunction/seam_model_function.py +0 -0
  88. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/__init__.py +0 -0
  89. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/calc_params.py +0 -0
  90. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/fischer.py +0 -0
  91. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/fischerd3.py +0 -0
  92. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/fischerd4.py +0 -0
  93. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/gfn0xtb.py +0 -0
  94. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/gfnff.py +0 -0
  95. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/lindh.py +0 -0
  96. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/lindh2007d2.py +0 -0
  97. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/lindh2007d3.py +0 -0
  98. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/lindh2007d4.py +0 -0
  99. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/morse.py +0 -0
  100. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/schlegel.py +0 -0
  101. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/schlegeld3.py +0 -0
  102. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/schlegeld4.py +0 -0
  103. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/shortrange.py +0 -0
  104. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/swartd2.py +0 -0
  105. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/swartd3.py +0 -0
  106. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/swartd4.py +0 -0
  107. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ModelHessian/tshess.py +0 -0
  108. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/QHAdam.py +0 -0
  109. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/__init__.py +0 -0
  110. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/abc_fire.py +0 -0
  111. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adabelief.py +0 -0
  112. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adabound.py +0 -0
  113. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adadelta.py +0 -0
  114. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adaderivative.py +0 -0
  115. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adadiff.py +0 -0
  116. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adafactor.py +0 -0
  117. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adam.py +0 -0
  118. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adamax.py +0 -0
  119. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adamod.py +0 -0
  120. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adamw.py +0 -0
  121. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/adiis.py +0 -0
  122. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/afire_neb.py +0 -0
  123. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/block_hessian_update.py +0 -0
  124. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/c2diis.py +0 -0
  125. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/component_wise_scaling.py +0 -0
  126. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/conjugate_gradient.py +0 -0
  127. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/conjugate_gradient_neb.py +0 -0
  128. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/coordinate_locking.py +0 -0
  129. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/crsirfo.py +0 -0
  130. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/dic_rsirfo.py +0 -0
  131. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/ediis.py +0 -0
  132. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/eve.py +0 -0
  133. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/fastadabelief.py +0 -0
  134. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/fire.py +0 -0
  135. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/fire2.py +0 -0
  136. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/fire_neb.py +0 -0
  137. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gan_step.py +0 -0
  138. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gdiis.py +0 -0
  139. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gediis.py +0 -0
  140. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/geodesic_step.py +0 -0
  141. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gpmin.py +0 -0
  142. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gpr_step.py +0 -0
  143. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gradientdescent.py +0 -0
  144. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/gradientdescent_neb.py +0 -0
  145. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/hessian_update.py +0 -0
  146. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/hybrid_rfo.py +0 -0
  147. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/kdiis.py +0 -0
  148. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/lars.py +0 -0
  149. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/lbfgs.py +0 -0
  150. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/lbfgs_neb.py +0 -0
  151. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/linesearch.py +0 -0
  152. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/lookahead.py +0 -0
  153. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/mf_rsirfo.py +0 -0
  154. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/mode_following.py +0 -0
  155. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/nadam.py +0 -0
  156. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/newton.py +0 -0
  157. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/prodigy.py +0 -0
  158. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/purtubation.py +0 -0
  159. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/quickmin_neb.py +0 -0
  160. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/radam.py +0 -0
  161. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/rfo_neb.py +0 -0
  162. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/ric_rfo.py +0 -0
  163. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/rl_step.py +0 -0
  164. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/rmspropgrave.py +0 -0
  165. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/rsirfo.py +0 -0
  166. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/rsprfo.py +0 -0
  167. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/sadam.py +0 -0
  168. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/samsgrad.py +0 -0
  169. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/tr_lbfgs.py +0 -0
  170. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/trim.py +0 -0
  171. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/trust_radius.py +0 -0
  172. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/trust_radius_neb.py +0 -0
  173. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Optimizer/yogi.py +0 -0
  174. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/__init__.py +0 -0
  175. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/addf.py +0 -0
  176. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/dimer.py +0 -0
  177. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/elastic_image_pair.py +0 -0
  178. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/modelfunction.py +0 -0
  179. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/newton_traj.py +0 -0
  180. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/spring_pair_method.py +0 -0
  181. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/OtherMethod/twopshs.py +0 -0
  182. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/PESAnalyzer/__init__.py +0 -0
  183. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/PESAnalyzer/calc_irc_curvature.py +0 -0
  184. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/PESAnalyzer/cmds_analysis.py +0 -0
  185. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/PESAnalyzer/koopman_analysis.py +0 -0
  186. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/PESAnalyzer/pca_analysis.py +0 -0
  187. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/__init__.py +0 -0
  188. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/atomic_mass.py +0 -0
  189. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/atomic_number.py +0 -0
  190. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/covalent_radii.py +0 -0
  191. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/d2.py +0 -0
  192. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/d3.py +0 -0
  193. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/d4.py +0 -0
  194. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/dreiding.py +0 -0
  195. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/gfn0xtb_param.py +0 -0
  196. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/gfnff_param.py +0 -0
  197. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/gnb.py +0 -0
  198. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/parameter.py +0 -0
  199. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/uff.py +0 -0
  200. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Parameters/unit_values.py +0 -0
  201. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/AFIR_potential.py +0 -0
  202. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/LJ_repulsive_potential.py +0 -0
  203. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/__init__.py +0 -0
  204. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/anharmonic_keep_potential.py +0 -0
  205. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/asym_elllipsoidal_potential.py +0 -0
  206. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/electrostatic_potential.py +0 -0
  207. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/flux_potential.py +0 -0
  208. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/gaussian_potential.py +0 -0
  209. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/idpp.py +0 -0
  210. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/mechano_force_potential.py +0 -0
  211. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/nanoreactor_potential.py +0 -0
  212. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/potential.py +0 -0
  213. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/spacer_model_potential.py +0 -0
  214. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/switching_potential.py +0 -0
  215. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/universal_potential.py +0 -0
  216. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/value_range_potential.py +0 -0
  217. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Potential/void_point_potential.py +0 -0
  218. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/__init__.py +0 -0
  219. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm1/__init__.py +0 -0
  220. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm1/sqm1_core.py +0 -0
  221. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/__init__.py +0 -0
  222. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/calc_tools.py +0 -0
  223. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_basis.py +0 -0
  224. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_bond.py +0 -0
  225. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_core.py +0 -0
  226. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_data.py +0 -0
  227. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_disp.py +0 -0
  228. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_eeq.py +0 -0
  229. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_overlapint.py +0 -0
  230. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_qm.py +0 -0
  231. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_rep.py +0 -0
  232. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/SQM/sqm2/sqm2_srb.py +0 -0
  233. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Thermo/__init__.py +0 -0
  234. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Thermo/normal_mode_analyzer.py +0 -0
  235. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/__init__.py +0 -0
  236. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/bond_connectivity.py +0 -0
  237. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/calc_tools.py +0 -0
  238. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/oniom.py +0 -0
  239. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/pbc.py +0 -0
  240. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/riemann_curvature.py +0 -0
  241. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Utils/symmetry_analyzer.py +0 -0
  242. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Visualization/__init__.py +0 -0
  243. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Visualization/visualization.py +0 -0
  244. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/WFAnalyzer/MO_analysis.py +0 -0
  245. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/WFAnalyzer/__init__.py +0 -0
  246. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/__init__.py +0 -0
  247. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/autots.py +0 -0
  248. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/ieip_wrapper.py +0 -0
  249. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/md_wrapper.py +0 -0
  250. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/neb_wrapper.py +0 -0
  251. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/Wrapper/optimize_wrapper.py +0 -0
  252. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/__init__.py +0 -0
  253. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/entrypoints.py +0 -0
  254. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/fileio.py +0 -0
  255. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/ieip.py +0 -0
  256. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/interface.py +0 -0
  257. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/irc.py +0 -0
  258. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/moleculardynamics.py +0 -0
  259. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/neb.py +0 -0
  260. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/optimization.py +0 -0
  261. {multioptpy-1.20.6 → multioptpy-1.20.8}/multioptpy/optimizer.py +0 -0
  262. {multioptpy-1.20.6 → multioptpy-1.20.8}/setup.cfg +0 -0
@@ -1,21 +1,21 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiOptPy
3
- Version: 1.20.6
3
+ Version: 1.20.8
4
4
  Summary: Multifunctional geometry optimization tools for quantum chemical calculations.
5
5
  Author-email: ss0832 <highlighty876@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
7
7
  Requires-Python: >=3.12
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
- Requires-Dist: numpy>=2.2.0
11
- Requires-Dist: scipy>=1.13.0
12
- Requires-Dist: matplotlib>=3.10.0
10
+ Requires-Dist: numpy~=2.2.0
11
+ Requires-Dist: scipy~=1.13.0
12
+ Requires-Dist: matplotlib~=3.10.0
13
13
  Requires-Dist: torch~=2.6.0
14
- Requires-Dist: pyscf>=2.9.0
15
- Requires-Dist: tblite>=0.4.0
14
+ Requires-Dist: pyscf~=2.9.0
15
+ Requires-Dist: tblite~=0.4.0
16
16
  Requires-Dist: ase~=3.26.0
17
17
  Requires-Dist: fairchem-core~=2.7.0
18
- Requires-Dist: sympy>=1.13.0
18
+ Requires-Dist: sympy~=1.13.0
19
19
  Dynamic: license-file
20
20
 
21
21
  # MultiOptPy
@@ -88,6 +88,7 @@ multioptpy/ModelHessian/approx_hessian.py
88
88
  multioptpy/ModelHessian/calc_params.py
89
89
  multioptpy/ModelHessian/fischer.py
90
90
  multioptpy/ModelHessian/fischerd3.py
91
+ multioptpy/ModelHessian/fischerd3old.py
91
92
  multioptpy/ModelHessian/fischerd4.py
92
93
  multioptpy/ModelHessian/gfn0xtb.py
93
94
  multioptpy/ModelHessian/gfnff.py
@@ -0,0 +1,9 @@
1
+ numpy~=2.2.0
2
+ scipy~=1.13.0
3
+ matplotlib~=3.10.0
4
+ torch~=2.6.0
5
+ pyscf~=2.9.0
6
+ tblite~=0.4.0
7
+ ase~=3.26.0
8
+ fairchem-core~=2.7.0
9
+ sympy~=1.13.0
@@ -1,21 +1,21 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiOptPy
3
- Version: 1.20.6
3
+ Version: 1.20.8
4
4
  Summary: Multifunctional geometry optimization tools for quantum chemical calculations.
5
5
  Author-email: ss0832 <highlighty876@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
7
7
  Requires-Python: >=3.12
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
- Requires-Dist: numpy>=2.2.0
11
- Requires-Dist: scipy>=1.13.0
12
- Requires-Dist: matplotlib>=3.10.0
10
+ Requires-Dist: numpy~=2.2.0
11
+ Requires-Dist: scipy~=1.13.0
12
+ Requires-Dist: matplotlib~=3.10.0
13
13
  Requires-Dist: torch~=2.6.0
14
- Requires-Dist: pyscf>=2.9.0
15
- Requires-Dist: tblite>=0.4.0
14
+ Requires-Dist: pyscf~=2.9.0
15
+ Requires-Dist: tblite~=0.4.0
16
16
  Requires-Dist: ase~=3.26.0
17
17
  Requires-Dist: fairchem-core~=2.7.0
18
- Requires-Dist: sympy>=1.13.0
18
+ Requires-Dist: sympy~=1.13.0
19
19
  Dynamic: license-file
20
20
 
21
21
  # MultiOptPy
@@ -2,6 +2,7 @@ import numpy as np
2
2
 
3
3
  from multioptpy.ModelHessian.fischer import FischerApproxHessian
4
4
  from multioptpy.ModelHessian.fischerd3 import FischerD3ApproxHessian
5
+ from multioptpy.ModelHessian.fischerd3old import FischerD3ApproxHessianOld
5
6
  from multioptpy.ModelHessian.fischerd4 import FischerD4ApproxHessian
6
7
  from multioptpy.ModelHessian.gfnff import GFNFFApproxHessian
7
8
  from multioptpy.ModelHessian.gfn0xtb import GFN0XTBApproxHessian
@@ -35,6 +36,9 @@ class ApproxHessian:
35
36
  elif "gfn0xtb" in approx_hess_type.lower():
36
37
  GFN0AH = GFN0XTBApproxHessian()
37
38
  hess_proj = GFN0AH.main(coord, element_list, cart_gradient)
39
+ elif "fischerd3old" in approx_hess_type.lower():
40
+ FAHD3O = FischerD3ApproxHessianOld()
41
+ hess_proj = FAHD3O.main(coord, element_list, cart_gradient)
38
42
  elif "fischerd3" in approx_hess_type.lower():
39
43
  FAHD3 = FischerD3ApproxHessian()
40
44
  hess_proj = FAHD3.main(coord, element_list, cart_gradient)
@@ -0,0 +1,381 @@
1
+ import numpy as np
2
+ from scipy.spatial.distance import cdist # Highly recommended for vectorized distance calculation
3
+ from multioptpy.Parameters.parameter import UnitValueLib, covalent_radii_lib
4
+ from multioptpy.Utils.calc_tools import Calculationtools
5
+ from multioptpy.Parameters.parameter import D3Parameters, D2_C6_coeff_lib, D2_VDW_radii_lib
6
+ from multioptpy.Utils.bond_connectivity import BondConnectivity
7
+ from multioptpy.ModelHessian.calc_params import torsion2, stretch2, bend2
8
+
9
+
10
+ class FischerD3ApproxHessianOld:
11
+ def __init__(self):
12
+ """
13
+ Fischer's Model Hessian implementation with D3 dispersion correction
14
+ Ref: Fischer and Almlöf, J. Phys. Chem., 1992, 96, 24, 9768–9774
15
+ Implementation Ref.: pysisyphus.optimizers.guess_hessians
16
+ """
17
+ self.bohr2angstroms = UnitValueLib().bohr2angstroms
18
+ self.hartree2kcalmol = UnitValueLib().hartree2kcalmol
19
+ self.bond_factor = 1.3 # Bond detection threshold factor
20
+
21
+ # D3 dispersion correction parameters (default: PBE0)
22
+ self.d3_params = D3Parameters()
23
+ self.cart_hess = None
24
+
25
+ def calc_bond_force_const(self, r_ab, r_ab_cov):
26
+ """Calculate force constant for bond stretching using Fischer formula"""
27
+ return 0.3601 * np.exp(-1.944 * (r_ab - r_ab_cov))
28
+
29
+ def calc_bend_force_const(self, r_ab, r_ac, r_ab_cov, r_ac_cov):
30
+ """Calculate force constant for angle bending"""
31
+ val = r_ab_cov * r_ac_cov
32
+ if abs(val) < 1.0e-10:
33
+ return 0.0
34
+
35
+ return 0.089 + 0.11 / (val) ** (-0.42) * np.exp(
36
+ -0.44 * (r_ab + r_ac - r_ab_cov - r_ac_cov)
37
+ )
38
+
39
+ def calc_dihedral_force_const(self, r_ab, r_ab_cov, bond_sum):
40
+ """Calculate force constant for dihedral torsion"""
41
+ val = r_ab * r_ab_cov
42
+ if abs(val) < 1.0e-10:
43
+ return 0.0
44
+ return 0.0015 + 14.0 * max(bond_sum, 0) ** 0.57 / (val) ** 4.0 * np.exp(
45
+ -2.85 * (r_ab - r_ab_cov)
46
+ )
47
+
48
+ def get_c6_coefficient(self, element_i, element_j):
49
+ """Get C6 coefficient based on D3 model (simplified)"""
50
+ c6_i = D2_C6_coeff_lib(element_i)
51
+ c6_j = D2_C6_coeff_lib(element_j)
52
+ c6_ij = np.sqrt(c6_i * c6_j)
53
+ return c6_ij
54
+
55
+ def get_c8_coefficient(self, element_i, element_j):
56
+ """Calculate C8 coefficient based on D3 model using reference r4r2 values"""
57
+ c6_ij = self.get_c6_coefficient(element_i, element_j)
58
+ r4r2_i = self.d3_params.get_r4r2(element_i)
59
+ r4r2_j = self.d3_params.get_r4r2(element_j)
60
+ c8_ij = 3.0 * c6_ij * np.sqrt(r4r2_i * r4r2_j)
61
+ return c8_ij
62
+
63
+ def get_r0_value(self, element_i, element_j):
64
+ """Calculate R0 value for D3 model (characteristic distance for atom pair)"""
65
+ try:
66
+ r_i = D2_VDW_radii_lib(element_i)
67
+ r_j = D2_VDW_radii_lib(element_j)
68
+ return r_i + r_j
69
+ except:
70
+ r_i = covalent_radii_lib(element_i) * 1.5
71
+ r_j = covalent_radii_lib(element_j) * 1.5
72
+ return r_i + r_j
73
+
74
+ def d3_damping_function(self, r_ij, r0, order=6):
75
+ """BJ (Becke-Johnson) damping function for D3"""
76
+ if order == 6:
77
+ a1, a2 = self.d3_params.a1, self.d3_params.a2
78
+ else:
79
+ a1, a2 = self.d3_params.a1, self.d3_params.a2 + 2.0
80
+
81
+ denominator = r_ij**order + (a1 * r0 + a2)**order
82
+ return r_ij**order / denominator
83
+
84
+ def d3_hessian_contribution(self, r_vec, r_ij, element_i, element_j):
85
+ """Calculate D3 dispersion contribution to Hessian"""
86
+ if r_ij < 0.1:
87
+ return np.zeros((3, 3))
88
+
89
+ c6_ij = self.get_c6_coefficient(element_i, element_j)
90
+ c8_ij = self.get_c8_coefficient(element_i, element_j)
91
+ r0 = self.get_r0_value(element_i, element_j)
92
+
93
+ f_damp6 = self.d3_damping_function(r_ij, r0, order=6)
94
+ f_damp8 = self.d3_damping_function(r_ij, r0, order=8)
95
+
96
+ # Derivatives of damping functions
97
+ a1, a2 = self.d3_params.a1, self.d3_params.a2
98
+ a1_8, a2_8 = self.d3_params.a1, self.d3_params.a2 + 2.0
99
+
100
+ denom6 = r_ij**6 + (a1 * r0 + a2)**6
101
+ denom8 = r_ij**8 + (a1_8 * r0 + a2_8)**8
102
+
103
+ # df_damp/dr
104
+ df_damp6 = 6 * r_ij**5 / denom6 - 6 * r_ij**12 / denom6**2
105
+ df_damp8 = 8 * r_ij**7 / denom8 - 8 * r_ij**16 / denom8**2
106
+
107
+ # dE/dr (Gradient magnitude)
108
+ g6 = -self.d3_params.s6 * c6_ij * ((-6.0 / r_ij**7) * f_damp6 + (1.0 / r_ij**6) * df_damp6)
109
+ g8 = -self.d3_params.s8 * c8_ij * ((-8.0 / r_ij**9) * f_damp8 + (1.0 / r_ij**8) * df_damp8)
110
+
111
+ # Unit vector and projection operator
112
+ unit_vec = r_vec / r_ij
113
+ proj_op = np.outer(unit_vec, unit_vec) # P = r_hat * r_hat^T
114
+
115
+ # Coefficients for H = (d^2E/dr^2) * P + (1/r * dE/dr) * (I - P)
116
+ # Using the simplified structure from the original code for d^2E/dr^2 approximation:
117
+ h6_proj_coeff = self.d3_params.s6 * c6_ij / r_ij**8 * (42.0 * f_damp6 - r_ij * df_damp6)
118
+ h8_proj_coeff = self.d3_params.s8 * c8_ij / r_ij**10 * (72.0 * f_damp8 - r_ij * df_damp8)
119
+
120
+ h_proj = h6_proj_coeff + h8_proj_coeff # d^2E/dr^2 approximation
121
+ h_perp = (g6 + g8) / r_ij # 1/r * dE/dr (Perpendicular coefficient)
122
+
123
+ # Construct Hessian matrix
124
+ identity = np.eye(3)
125
+ hessian = h_proj * proj_op + h_perp * (identity - proj_op)
126
+
127
+ return hessian
128
+
129
+ # --- Optimized: Vectorized connectivity calculation ---
130
+ def get_bond_connectivity(self, coord, element_list):
131
+ """Calculate bond connectivity matrix and related data (Optimized with vectorization)"""
132
+ n_atoms = len(coord)
133
+
134
+ # 1. Distance matrix (Vectorized)
135
+ try:
136
+ dist_mat = cdist(coord, coord)
137
+ except NameError:
138
+ diff = coord[:, None, :] - coord[None, :, :]
139
+ dist_mat = np.linalg.norm(diff, axis=-1)
140
+
141
+ # 2. Covalent radii sums (Vectorized)
142
+ cov_radii = np.array([covalent_radii_lib(e) for e in element_list])
143
+ pair_cov_radii_mat = cov_radii[:, None] + cov_radii[None, :]
144
+
145
+ # 3. Bond connectivity matrix
146
+ bond_mat = dist_mat <= (pair_cov_radii_mat * self.bond_factor)
147
+ np.fill_diagonal(bond_mat, False)
148
+
149
+ return bond_mat, dist_mat, pair_cov_radii_mat
150
+
151
+ # --- Optimized: Block assignment using slicing ---
152
+ def fischer_bond(self, coord, element_list):
153
+ """Calculate Hessian components for bond stretching (Optimized with slicing)"""
154
+ BC = BondConnectivity()
155
+ b_c_mat = BC.bond_connect_matrix(element_list, coord)
156
+ bond_indices = BC.bond_connect_table(b_c_mat)
157
+
158
+ for idx in bond_indices:
159
+ i, j = idx
160
+ r_ij = np.linalg.norm(coord[i] - coord[j])
161
+ r_ij_cov = covalent_radii_lib(element_list[i]) + covalent_radii_lib(element_list[j])
162
+
163
+ force_const = self.calc_bond_force_const(r_ij, r_ij_cov)
164
+
165
+ t_xyz = np.array([coord[i], coord[j]])
166
+ r, b_vec = stretch2(t_xyz)
167
+
168
+ # Optimized: Use NumPy slicing and outer product
169
+ b_vec_i, b_vec_j = b_vec[0], b_vec[1]
170
+
171
+ H_ii_block = force_const * np.outer(b_vec_i, b_vec_i)
172
+ H_jj_block = force_const * np.outer(b_vec_j, b_vec_j)
173
+ H_ij_block = force_const * np.outer(b_vec_i, b_vec_j)
174
+ H_ji_block = force_const * np.outer(b_vec_j, b_vec_i)
175
+
176
+ start_i, end_i = 3 * i, 3 * i + 3
177
+ start_j, end_j = 3 * j, 3 * j + 3
178
+
179
+ self.cart_hess[start_i:end_i, start_i:end_i] += H_ii_block
180
+ self.cart_hess[start_j:end_j, start_j:end_j] += H_jj_block
181
+ self.cart_hess[start_i:end_i, start_j:end_j] += H_ij_block
182
+ self.cart_hess[start_j:end_j, start_i:end_i] += H_ji_block
183
+
184
+
185
+ def fischer_angle(self, coord, element_list):
186
+ """Calculate Hessian components for angle bending (Optimized with slicing)"""
187
+ BC = BondConnectivity()
188
+ b_c_mat = BC.bond_connect_matrix(element_list, coord)
189
+ angle_indices = BC.angle_connect_table(b_c_mat)
190
+
191
+ for idx in angle_indices:
192
+ i, j, k = idx # i-j-k angle
193
+
194
+ # --- Linear molecule handling: Check for linearity before processing ---
195
+ r_ij_vec = coord[i] - coord[j]
196
+ r_jk_vec = coord[k] - coord[j]
197
+
198
+ r_ij = np.linalg.norm(r_ij_vec)
199
+ r_jk = np.linalg.norm(r_jk_vec)
200
+
201
+ # Skip if atoms overlap
202
+ if r_ij < 0.1 or r_jk < 0.1:
203
+ continue
204
+
205
+ # Check for linearity (180 deg) or overlap (0 deg)
206
+ cos_theta = np.dot(r_ij_vec, r_jk_vec) / (r_ij * r_jk)
207
+ if abs(cos_theta) > 0.9999:
208
+ continue
209
+ # ----------------------------------------------------------------
210
+
211
+ r_ij_cov = covalent_radii_lib(element_list[i]) + covalent_radii_lib(element_list[j])
212
+ r_jk_cov = covalent_radii_lib(element_list[j]) + covalent_radii_lib(element_list[k])
213
+
214
+ force_const = self.calc_bend_force_const(r_ij, r_jk, r_ij_cov, r_jk_cov)
215
+
216
+ try:
217
+ t_xyz = np.array([coord[i], coord[j], coord[k]])
218
+ theta, b_vec = bend2(t_xyz)
219
+
220
+ # Optimized: Use NumPy slicing and outer product
221
+ atoms = [i, j, k]
222
+
223
+ for m_idx, m_atom in enumerate(atoms):
224
+ for n_idx, n_atom in enumerate(atoms):
225
+ start_m, end_m = 3 * m_atom, 3 * m_atom + 3
226
+ start_n, end_n = 3 * n_atom, 3 * n_atom + 3
227
+
228
+ H_mn_block = force_const * np.outer(b_vec[m_idx], b_vec[n_idx])
229
+ self.cart_hess[start_m:end_m, start_n:end_n] += H_mn_block
230
+ except Exception:
231
+ continue
232
+
233
+
234
+ def fischer_dihedral(self, coord, element_list, bond_mat):
235
+ """Calculate Hessian components for dihedral torsion (Optimized with singularity damping)"""
236
+ BC = BondConnectivity()
237
+ b_c_mat = BC.bond_connect_matrix(element_list, coord)
238
+ dihedral_indices = BC.dihedral_angle_connect_table(b_c_mat)
239
+
240
+ # Calculate bond count for central atoms in dihedrals
241
+ tors_atom_bonds = {}
242
+ for idx in dihedral_indices:
243
+ i, j, k, l = idx # i-j-k-l dihedral
244
+ bond_sum = bond_mat[j].sum() + bond_mat[k].sum() - 2
245
+ tors_atom_bonds[(j, k)] = bond_sum
246
+
247
+ for idx in dihedral_indices:
248
+ i, j, k, l = idx
249
+
250
+ # Vector calculations
251
+ vec_ji = coord[i] - coord[j]
252
+ vec_jk = coord[k] - coord[j]
253
+ vec_kl = coord[l] - coord[k]
254
+
255
+ r_jk = np.linalg.norm(vec_jk)
256
+ r_jk_cov = covalent_radii_lib(element_list[j]) + covalent_radii_lib(element_list[k])
257
+
258
+ bond_sum = tors_atom_bonds.get((j, k), 0)
259
+
260
+ # Calculate base force constant
261
+ force_const = self.calc_dihedral_force_const(r_jk, r_jk_cov, bond_sum)
262
+
263
+ # --- Singularity Handling (Damping for linear angles) ---
264
+ # Determine linearity of angles i-j-k and j-k-l
265
+
266
+ # Angle 1: i-j-k
267
+ n_ji = np.linalg.norm(vec_ji)
268
+ n_jk = r_jk # already calculated
269
+
270
+ # Avoid division by zero if atoms overlap
271
+ if n_ji < 1e-8 or n_jk < 1e-8:
272
+ continue
273
+
274
+ cos_theta1 = np.dot(vec_ji, vec_jk) / (n_ji * n_jk)
275
+
276
+ # Angle 2: j-k-l (Note: vec_kj is -vec_jk)
277
+ vec_kj = -vec_jk
278
+ n_kl = np.linalg.norm(vec_kl)
279
+
280
+ if n_kl < 1e-8:
281
+ continue
282
+
283
+ cos_theta2 = np.dot(vec_kj, vec_kl) / (n_jk * n_kl)
284
+
285
+ # --- Damping Factor Calculation ---
286
+ # The Wilson B-matrix contains 1/sin(theta) terms which diverge at 180 deg.
287
+ # We scale the force constant by sin^2(theta) to cancel this divergence.
288
+ # sin^2(theta) = 1 - cos^2(theta)
289
+
290
+ sin2_theta1 = 1.0 - min(cos_theta1**2, 1.0)
291
+ sin2_theta2 = 1.0 - min(cos_theta2**2, 1.0)
292
+
293
+ # Hard cutoff: If geometry is extremely linear, skip to avoid NaN
294
+ if sin2_theta1 < 1e-4 or sin2_theta2 < 1e-4:
295
+ continue
296
+
297
+ # Apply scaling factor
298
+ # This ensures the force constant goes to 0 as the angle becomes linear
299
+ scaling_factor = sin2_theta1 * sin2_theta2
300
+ force_const *= scaling_factor
301
+
302
+ # --------------------------------------------------------
303
+
304
+ t_xyz = np.array([coord[i], coord[j], coord[k], coord[l]])
305
+
306
+ try:
307
+ tau, b_vec = torsion2(t_xyz)
308
+ except (ValueError, ArithmeticError):
309
+ # Skip if numerical errors occur in torsion calculation
310
+ continue
311
+
312
+ # Optimized: Use NumPy slicing and outer product
313
+ atoms = [i, j, k, l]
314
+
315
+ for m_idx, m_atom in enumerate(atoms):
316
+ for n_idx, n_atom in enumerate(atoms):
317
+ start_m, end_m = 3 * m_atom, 3 * m_atom + 3
318
+ start_n, end_n = 3 * n_atom, 3 * n_atom + 3
319
+
320
+ H_mn_block = force_const * np.outer(b_vec[m_idx], b_vec[n_idx])
321
+ self.cart_hess[start_m:end_m, start_n:end_n] += H_mn_block
322
+
323
+ # --- Optimized: Block assignment using slicing (and fixed logic) ---
324
+ def d3_dispersion_hessian(self, coord, element_list, bond_mat):
325
+ """Calculate Hessian correction based on D3 dispersion forces (Optimized/Corrected)"""
326
+ n_atoms = len(coord)
327
+
328
+ # Calculate D3 dispersion correction for all atom pairs (i > j)
329
+ for i in range(n_atoms):
330
+ for j in range(i):
331
+ # Skip bonded atom pairs
332
+ if bond_mat[i, j]:
333
+ continue
334
+
335
+ r_vec = coord[i] - coord[j]
336
+ r_ij = np.linalg.norm(r_vec)
337
+
338
+ if r_ij < 0.1:
339
+ continue
340
+
341
+ # Calculate D3 Hessian contribution (3x3 block)
342
+ hess_block = self.d3_hessian_contribution(r_vec, r_ij, element_list[i], element_list[j])
343
+
344
+ # Use slicing for efficient block assignment
345
+ # H_ii += H_block, H_jj += H_block, H_ij -= H_block, H_ji -= H_block
346
+ start_i, end_i = 3 * i, 3 * i + 3
347
+ start_j, end_j = 3 * j, 3 * j + 3
348
+
349
+ self.cart_hess[start_i:end_i, start_i:end_i] += hess_block
350
+ self.cart_hess[start_j:end_j, start_j:end_j] += hess_block
351
+ self.cart_hess[start_i:end_i, start_j:end_j] -= hess_block
352
+ self.cart_hess[start_j:end_j, start_i:end_i] -= hess_block
353
+
354
+ # --- Optimized: Main function flow ---
355
+ def main(self, coord, element_list, cart_gradient):
356
+ """
357
+ Calculate Hessian combining Fischer model and D3 dispersion correction
358
+ """
359
+ print("Generating Hessian using Fischer model using D3 dispersion parameter...")
360
+
361
+ n_atoms = len(coord)
362
+ self.cart_hess = np.zeros((n_atoms*3, n_atoms*3), dtype="float64")
363
+
364
+ # Calculate bond connectivity matrix ONCE (Optimized internally)
365
+ bond_mat, dist_mat, pair_cov_radii_mat = self.get_bond_connectivity(coord, element_list)
366
+
367
+ # Calculate Hessian components from Fischer model (Optimized internally with slicing)
368
+ self.fischer_bond(coord, element_list)
369
+ self.fischer_angle(coord, element_list)
370
+ self.fischer_dihedral(coord, element_list, bond_mat)
371
+
372
+ # Calculate Hessian components from D3 dispersion correction (Optimized internally with slicing)
373
+ self.d3_dispersion_hessian(coord, element_list, bond_mat)
374
+
375
+ # Optimized: Symmetrize the Hessian matrix
376
+ self.cart_hess = (self.cart_hess + self.cart_hess.T) / 2.0
377
+
378
+ # Project out rotational and translational modes
379
+ hess_proj = Calculationtools().project_out_hess_tr_and_rot_for_coord(self.cart_hess, element_list, coord)
380
+
381
+ return hess_proj