MultiOptPy 1.20.5__tar.gz → 1.20.7__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 (259) hide show
  1. {multioptpy-1.20.5 → multioptpy-1.20.7/MultiOptPy.egg-info}/PKG-INFO +10 -10
  2. {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/requires.txt +1 -1
  3. {multioptpy-1.20.5/MultiOptPy.egg-info → multioptpy-1.20.7}/PKG-INFO +10 -10
  4. {multioptpy-1.20.5 → multioptpy-1.20.7}/README.md +8 -8
  5. multioptpy-1.20.7/multioptpy/MD/thermostat.py +298 -0
  6. multioptpy-1.20.7/multioptpy/ModelHessian/fischerd3.py +305 -0
  7. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rsirfo.py +112 -4
  8. multioptpy-1.20.7/multioptpy/Optimizer/rsprfo.py +1363 -0
  9. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/entrypoints.py +406 -16
  10. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/moleculardynamics.py +21 -13
  11. {multioptpy-1.20.5 → multioptpy-1.20.7}/pyproject.toml +3 -2
  12. multioptpy-1.20.5/multioptpy/MD/thermostat.py +0 -185
  13. multioptpy-1.20.5/multioptpy/ModelHessian/fischerd3.py +0 -360
  14. multioptpy-1.20.5/multioptpy/Optimizer/rsprfo.py +0 -1056
  15. {multioptpy-1.20.5 → multioptpy-1.20.7}/LICENSE +0 -0
  16. {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/SOURCES.txt +0 -0
  17. {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/dependency_links.txt +0 -0
  18. {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/entry_points.txt +0 -0
  19. {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/top_level.txt +0 -0
  20. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/__init__.py +0 -0
  21. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_calculation_tools.py +0 -0
  22. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/__init__.py +0 -0
  23. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/fairchem.py +0 -0
  24. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gamess.py +0 -0
  25. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gaussian.py +0 -0
  26. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gxtb_dev.py +0 -0
  27. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/mace.py +0 -0
  28. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/mopac.py +0 -0
  29. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/nwchem.py +0 -0
  30. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/orca.py +0 -0
  31. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/pygfn0.py +0 -0
  32. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/dxtb_calculation_tools.py +0 -0
  33. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/emt_calculation_tools.py +0 -0
  34. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/gpaw_calculation_tools.py +0 -0
  35. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/lj_calculation_tools.py +0 -0
  36. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/psi4_calculation_tools.py +0 -0
  37. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/pwscf_calculation_tools.py +0 -0
  38. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/pyscf_calculation_tools.py +0 -0
  39. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/sqm1_calculation_tools.py +0 -0
  40. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/sqm2_calculation_tools.py +0 -0
  41. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/tblite_calculation_tools.py +0 -0
  42. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/tersoff_calculation_tools.py +0 -0
  43. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Constraint/__init__.py +0 -0
  44. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Constraint/constraint_condition.py +0 -0
  45. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/__init__.py +0 -0
  46. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/polar_coordinate.py +0 -0
  47. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/redundant_coordinate.py +0 -0
  48. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/__init__.py +0 -0
  49. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/converge_criteria.py +0 -0
  50. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/dvv.py +0 -0
  51. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/euler.py +0 -0
  52. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/hpc.py +0 -0
  53. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/lqa.py +0 -0
  54. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/modekill.py +0 -0
  55. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/rk4.py +0 -0
  56. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/__init__.py +0 -0
  57. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/adaptive_interpolation.py +0 -0
  58. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/binomial_interpolation.py +0 -0
  59. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/geodesic_interpolation.py +0 -0
  60. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/interpolation.py +0 -0
  61. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/linear_interpolation.py +0 -0
  62. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/savitzky_golay_interpolation.py +0 -0
  63. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/spline_interpolation.py +0 -0
  64. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MD/__init__.py +0 -0
  65. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/__init__.py +0 -0
  66. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_bneb_force.py +0 -0
  67. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_dmf_force.py +0 -0
  68. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_dneb_force.py +0 -0
  69. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_ewbneb_force.py +0 -0
  70. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_gpneb_force.py +0 -0
  71. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_lup_force.py +0 -0
  72. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_neb_force.py +0 -0
  73. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_nesb_force.py +0 -0
  74. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_om_force.py +0 -0
  75. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_qsm_force.py +0 -0
  76. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_qsmv2_force.py +0 -0
  77. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/__init__.py +0 -0
  78. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/avoiding_model_function.py +0 -0
  79. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/binary_image_ts_search_model_function.py +0 -0
  80. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/conical_model_function.py +0 -0
  81. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_meci.py +0 -0
  82. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_mesx.py +0 -0
  83. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_mesx_2.py +0 -0
  84. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/seam_model_function.py +0 -0
  85. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/__init__.py +0 -0
  86. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/approx_hessian.py +0 -0
  87. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/calc_params.py +0 -0
  88. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/fischer.py +0 -0
  89. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/fischerd4.py +0 -0
  90. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/gfn0xtb.py +0 -0
  91. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/gfnff.py +0 -0
  92. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh.py +0 -0
  93. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d2.py +0 -0
  94. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d3.py +0 -0
  95. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d4.py +0 -0
  96. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/morse.py +0 -0
  97. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegel.py +0 -0
  98. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegeld3.py +0 -0
  99. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegeld4.py +0 -0
  100. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/shortrange.py +0 -0
  101. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd2.py +0 -0
  102. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd3.py +0 -0
  103. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd4.py +0 -0
  104. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/tshess.py +0 -0
  105. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/QHAdam.py +0 -0
  106. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/__init__.py +0 -0
  107. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/abc_fire.py +0 -0
  108. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adabelief.py +0 -0
  109. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adabound.py +0 -0
  110. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adadelta.py +0 -0
  111. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adaderivative.py +0 -0
  112. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adadiff.py +0 -0
  113. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adafactor.py +0 -0
  114. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adam.py +0 -0
  115. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamax.py +0 -0
  116. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamod.py +0 -0
  117. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamw.py +0 -0
  118. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adiis.py +0 -0
  119. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/afire_neb.py +0 -0
  120. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/block_hessian_update.py +0 -0
  121. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/c2diis.py +0 -0
  122. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/component_wise_scaling.py +0 -0
  123. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/conjugate_gradient.py +0 -0
  124. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/conjugate_gradient_neb.py +0 -0
  125. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/coordinate_locking.py +0 -0
  126. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/crsirfo.py +0 -0
  127. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/dic_rsirfo.py +0 -0
  128. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/ediis.py +0 -0
  129. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/eve.py +0 -0
  130. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fastadabelief.py +0 -0
  131. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire.py +0 -0
  132. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire2.py +0 -0
  133. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire_neb.py +0 -0
  134. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gan_step.py +0 -0
  135. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gdiis.py +0 -0
  136. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gediis.py +0 -0
  137. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/geodesic_step.py +0 -0
  138. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gpmin.py +0 -0
  139. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gpr_step.py +0 -0
  140. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gradientdescent.py +0 -0
  141. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gradientdescent_neb.py +0 -0
  142. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/hessian_update.py +0 -0
  143. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/hybrid_rfo.py +0 -0
  144. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/kdiis.py +0 -0
  145. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lars.py +0 -0
  146. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lbfgs.py +0 -0
  147. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lbfgs_neb.py +0 -0
  148. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/linesearch.py +0 -0
  149. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lookahead.py +0 -0
  150. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/mf_rsirfo.py +0 -0
  151. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/mode_following.py +0 -0
  152. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/nadam.py +0 -0
  153. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/newton.py +0 -0
  154. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/prodigy.py +0 -0
  155. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/purtubation.py +0 -0
  156. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/quickmin_neb.py +0 -0
  157. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/radam.py +0 -0
  158. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rfo_neb.py +0 -0
  159. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/ric_rfo.py +0 -0
  160. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rl_step.py +0 -0
  161. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rmspropgrave.py +0 -0
  162. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/sadam.py +0 -0
  163. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/samsgrad.py +0 -0
  164. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/tr_lbfgs.py +0 -0
  165. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trim.py +0 -0
  166. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trust_radius.py +0 -0
  167. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trust_radius_neb.py +0 -0
  168. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/yogi.py +0 -0
  169. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/__init__.py +0 -0
  170. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/addf.py +0 -0
  171. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/dimer.py +0 -0
  172. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/elastic_image_pair.py +0 -0
  173. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/modelfunction.py +0 -0
  174. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/newton_traj.py +0 -0
  175. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/spring_pair_method.py +0 -0
  176. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/twopshs.py +0 -0
  177. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/__init__.py +0 -0
  178. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/calc_irc_curvature.py +0 -0
  179. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/cmds_analysis.py +0 -0
  180. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/koopman_analysis.py +0 -0
  181. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/pca_analysis.py +0 -0
  182. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/__init__.py +0 -0
  183. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/atomic_mass.py +0 -0
  184. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/atomic_number.py +0 -0
  185. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/covalent_radii.py +0 -0
  186. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d2.py +0 -0
  187. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d3.py +0 -0
  188. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d4.py +0 -0
  189. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/dreiding.py +0 -0
  190. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gfn0xtb_param.py +0 -0
  191. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gfnff_param.py +0 -0
  192. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gnb.py +0 -0
  193. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/parameter.py +0 -0
  194. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/uff.py +0 -0
  195. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/unit_values.py +0 -0
  196. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/AFIR_potential.py +0 -0
  197. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/LJ_repulsive_potential.py +0 -0
  198. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/__init__.py +0 -0
  199. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/anharmonic_keep_potential.py +0 -0
  200. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/asym_elllipsoidal_potential.py +0 -0
  201. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/electrostatic_potential.py +0 -0
  202. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/flux_potential.py +0 -0
  203. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/gaussian_potential.py +0 -0
  204. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/idpp.py +0 -0
  205. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_angle_potential.py +0 -0
  206. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_dihedral_angle_potential.py +0 -0
  207. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_outofplain_angle_potential.py +0 -0
  208. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_potential.py +0 -0
  209. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/mechano_force_potential.py +0 -0
  210. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/nanoreactor_potential.py +0 -0
  211. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/potential.py +0 -0
  212. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/spacer_model_potential.py +0 -0
  213. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/switching_potential.py +0 -0
  214. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/universal_potential.py +0 -0
  215. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/value_range_potential.py +0 -0
  216. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/void_point_potential.py +0 -0
  217. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/__init__.py +0 -0
  218. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm1/__init__.py +0 -0
  219. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm1/sqm1_core.py +0 -0
  220. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/__init__.py +0 -0
  221. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/calc_tools.py +0 -0
  222. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_basis.py +0 -0
  223. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_bond.py +0 -0
  224. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_core.py +0 -0
  225. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_data.py +0 -0
  226. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_disp.py +0 -0
  227. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_eeq.py +0 -0
  228. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_overlapint.py +0 -0
  229. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_qm.py +0 -0
  230. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_rep.py +0 -0
  231. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_srb.py +0 -0
  232. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Thermo/__init__.py +0 -0
  233. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Thermo/normal_mode_analyzer.py +0 -0
  234. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/__init__.py +0 -0
  235. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/bond_connectivity.py +0 -0
  236. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/calc_tools.py +0 -0
  237. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/oniom.py +0 -0
  238. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/pbc.py +0 -0
  239. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/riemann_curvature.py +0 -0
  240. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/symmetry_analyzer.py +0 -0
  241. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Visualization/__init__.py +0 -0
  242. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Visualization/visualization.py +0 -0
  243. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/WFAnalyzer/MO_analysis.py +0 -0
  244. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/WFAnalyzer/__init__.py +0 -0
  245. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/__init__.py +0 -0
  246. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/autots.py +0 -0
  247. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/ieip_wrapper.py +0 -0
  248. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/md_wrapper.py +0 -0
  249. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/neb_wrapper.py +0 -0
  250. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/optimize_wrapper.py +0 -0
  251. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/__init__.py +0 -0
  252. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/fileio.py +0 -0
  253. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ieip.py +0 -0
  254. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/interface.py +0 -0
  255. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/irc.py +0 -0
  256. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/neb.py +0 -0
  257. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/optimization.py +0 -0
  258. {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/optimizer.py +0 -0
  259. {multioptpy-1.20.5 → multioptpy-1.20.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiOptPy
3
- Version: 1.20.5
3
+ Version: 1.20.7
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
@@ -12,7 +12,7 @@ Requires-Dist: scipy>=1.13.0
12
12
  Requires-Dist: matplotlib>=3.10.0
13
13
  Requires-Dist: torch~=2.6.0
14
14
  Requires-Dist: pyscf>=2.9.0
15
- Requires-Dist: tblite>=0.4.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
18
  Requires-Dist: sympy>=1.13.0
@@ -80,9 +80,9 @@ conda create -n test_mop python=3.12.7
80
80
  conda activate test_mop
81
81
 
82
82
  ## 3. Download and install MultiOptPy:
83
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
84
- unzip v1.20.4.zip
85
- cd MultiOptPy-1.20.4
83
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
84
+ unzip v1.20.5.zip
85
+ cd MultiOptPy-1.20.5
86
86
  pip install -r requirements.txt
87
87
 
88
88
  ## 4. Copy the test configuration file and run the AutoTS workflow:
@@ -107,10 +107,10 @@ python run_autots.py aldol_rxn.xyz -cfg config_autots_run_xtb_test.json
107
107
  # Installation via pip (Linux)
108
108
  conda create -n <env-name> python=3.12 pip
109
109
  conda activate <env-name>
110
- pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.4
111
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
112
- unzip v1.20.4.zip
113
- cd MultiOptPy-1.20.4
110
+ pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.5
111
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
112
+ unzip v1.20.5.zip
113
+ cd MultiOptPy-1.20.5
114
114
 
115
115
  ## 💻 Command Line Interface (CLI) Functionality (v1.20.2)
116
116
  # The following eight core functionalities are available as direct executable commands in your terminal after installation:
@@ -157,7 +157,7 @@ References are given in the source code.
157
157
  After downloading the repository using git clone or similar commands, move to the generated directory and run the following:
158
158
  python command
159
159
  ```
160
- python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec 0 -spin 0 -opt rsirfo_block_fsb -modelhess
160
+ python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec -1 -spin 0 -opt rsirfo_block_fsb -modelhess
161
161
  ```
162
162
  CLI command (arbitrary directory)
163
163
  ```
@@ -3,7 +3,7 @@ scipy>=1.13.0
3
3
  matplotlib>=3.10.0
4
4
  torch~=2.6.0
5
5
  pyscf>=2.9.0
6
- tblite>=0.4.0
6
+ tblite==0.4.0
7
7
  ase~=3.26.0
8
8
  fairchem-core~=2.7.0
9
9
  sympy>=1.13.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MultiOptPy
3
- Version: 1.20.5
3
+ Version: 1.20.7
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
@@ -12,7 +12,7 @@ Requires-Dist: scipy>=1.13.0
12
12
  Requires-Dist: matplotlib>=3.10.0
13
13
  Requires-Dist: torch~=2.6.0
14
14
  Requires-Dist: pyscf>=2.9.0
15
- Requires-Dist: tblite>=0.4.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
18
  Requires-Dist: sympy>=1.13.0
@@ -80,9 +80,9 @@ conda create -n test_mop python=3.12.7
80
80
  conda activate test_mop
81
81
 
82
82
  ## 3. Download and install MultiOptPy:
83
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
84
- unzip v1.20.4.zip
85
- cd MultiOptPy-1.20.4
83
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
84
+ unzip v1.20.5.zip
85
+ cd MultiOptPy-1.20.5
86
86
  pip install -r requirements.txt
87
87
 
88
88
  ## 4. Copy the test configuration file and run the AutoTS workflow:
@@ -107,10 +107,10 @@ python run_autots.py aldol_rxn.xyz -cfg config_autots_run_xtb_test.json
107
107
  # Installation via pip (Linux)
108
108
  conda create -n <env-name> python=3.12 pip
109
109
  conda activate <env-name>
110
- pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.4
111
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
112
- unzip v1.20.4.zip
113
- cd MultiOptPy-1.20.4
110
+ pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.5
111
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
112
+ unzip v1.20.5.zip
113
+ cd MultiOptPy-1.20.5
114
114
 
115
115
  ## 💻 Command Line Interface (CLI) Functionality (v1.20.2)
116
116
  # The following eight core functionalities are available as direct executable commands in your terminal after installation:
@@ -157,7 +157,7 @@ References are given in the source code.
157
157
  After downloading the repository using git clone or similar commands, move to the generated directory and run the following:
158
158
  python command
159
159
  ```
160
- python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec 0 -spin 0 -opt rsirfo_block_fsb -modelhess
160
+ python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec -1 -spin 0 -opt rsirfo_block_fsb -modelhess
161
161
  ```
162
162
  CLI command (arbitrary directory)
163
163
  ```
@@ -60,9 +60,9 @@ conda create -n test_mop python=3.12.7
60
60
  conda activate test_mop
61
61
 
62
62
  ## 3. Download and install MultiOptPy:
63
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
64
- unzip v1.20.4.zip
65
- cd MultiOptPy-1.20.4
63
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
64
+ unzip v1.20.5.zip
65
+ cd MultiOptPy-1.20.5
66
66
  pip install -r requirements.txt
67
67
 
68
68
  ## 4. Copy the test configuration file and run the AutoTS workflow:
@@ -87,10 +87,10 @@ python run_autots.py aldol_rxn.xyz -cfg config_autots_run_xtb_test.json
87
87
  # Installation via pip (Linux)
88
88
  conda create -n <env-name> python=3.12 pip
89
89
  conda activate <env-name>
90
- pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.4
91
- wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.4.zip
92
- unzip v1.20.4.zip
93
- cd MultiOptPy-1.20.4
90
+ pip install git+https://github.com/ss0832/MultiOptPy.git@v1.20.5
91
+ wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.5.zip
92
+ unzip v1.20.5.zip
93
+ cd MultiOptPy-1.20.5
94
94
 
95
95
  ## 💻 Command Line Interface (CLI) Functionality (v1.20.2)
96
96
  # The following eight core functionalities are available as direct executable commands in your terminal after installation:
@@ -137,7 +137,7 @@ References are given in the source code.
137
137
  After downloading the repository using git clone or similar commands, move to the generated directory and run the following:
138
138
  python command
139
139
  ```
140
- python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec 0 -spin 0 -opt rsirfo_block_fsb -modelhess
140
+ python optmain.py SN2.xyz -ma 150 1 6 -pyscf -elec -1 -spin 0 -opt rsirfo_block_fsb -modelhess
141
141
  ```
142
142
  CLI command (arbitrary directory)
143
143
  ```
@@ -0,0 +1,298 @@
1
+ import numpy as np
2
+ import copy
3
+ from multioptpy.Parameters.parameter import UnitValueLib, atomic_mass
4
+
5
+ class Thermostat:
6
+ def __init__(self, momentum_list, temperature, pressure, element_list=None):
7
+ # Mutable default argument fix
8
+ if element_list is None:
9
+ self.element_list = []
10
+ else:
11
+ self.element_list = element_list
12
+
13
+ # ---------------------------------------------------------
14
+ # [Optimization] Pre-compute masses for vectorization
15
+ # shape: (N_atoms, 1) to allow broadcasting: momentum (N,3) / mass (N,1)
16
+ # ---------------------------------------------------------
17
+ self.masses = np.array([atomic_mass(e) for e in self.element_list], dtype=np.float64)[:, None]
18
+ self.inverse_masses = 1.0 / self.masses
19
+
20
+ # Keep momentum as numpy array internally for performance
21
+ self.momentum_list = np.array(momentum_list, dtype=np.float64)
22
+
23
+ self.temperature = temperature # K
24
+ self.initial_temperature = temperature # K
25
+
26
+ # Pressure conversion
27
+ self.pressure = pressure * (3.39893 * 10 ** (-11)) # kPa -> a.u.
28
+ self.initial_pressure = self.pressure
29
+
30
+ # Thermostat Parameters
31
+ self.Langevin_zeta = 0.01
32
+ self.zeta = 0.0
33
+ self.eta = 0.0
34
+ self.scaling = 1.0
35
+ self.Ps_momentum = 0.0
36
+
37
+ # Degrees of freedom (3N)
38
+ self.g_value = len(momentum_list) * 3
39
+
40
+ # Constants
41
+ self.Q_value = 1e-1
42
+ self.M_value = 1e+12
43
+ self.Boltzmann_constant = 3.16681 * 10 ** (-6) # hartree/K
44
+ self.delta_timescale = 1e-1
45
+ self.volume = 1e-23 * (1/UnitValueLib().bohr2m) ** 3 # m^3 -> Bohr^3
46
+
47
+ # Nose-Hoover Chain Parameters
48
+ self.Q_value_chain = np.array([1.0, 2.0, 3.0, 6.0, 10.0, 20, 40, 50, 100, 200], dtype=np.float64)
49
+ self.zeta_chain = np.zeros(len(self.Q_value_chain), dtype=np.float64)
50
+ self.timestep = None
51
+
52
+ # History
53
+ self.Instantaneous_temperatures_list = []
54
+ self.Instantaneous_momentum_list = []
55
+ self.tot_kinetic_ene = 0.0
56
+ self.Instantaneous_temperature = 0.0
57
+
58
+ # =========================================================================
59
+ # Internal Helpers (Vectorized & Logical Separation)
60
+ # =========================================================================
61
+
62
+ def _update_momentum(self, forces, scaling=1.0):
63
+ """Vectorized momentum update"""
64
+ pass
65
+
66
+ def _update_position(self, current_geometry_arr, dt):
67
+ """Vectorized position update: r(t+dt) = r(t) + v(t)*dt"""
68
+ # v = p / m
69
+ velocities = self.momentum_list * self.inverse_masses
70
+ return current_geometry_arr + velocities * dt
71
+
72
+ def _propagate_nhc_zeta(self, dt, kinetic_energy_2x):
73
+ """
74
+ Propagate Nose-Hoover Chain variables.
75
+ """
76
+ # 1. Update first chain link force
77
+ driving_force = (kinetic_energy_2x - self.g_value * self.Boltzmann_constant * self.initial_temperature)
78
+
79
+ self.zeta_chain[0] += dt * driving_force / self.Q_value_chain[0]
80
+ self.zeta_chain[0] -= dt * self.zeta_chain[0] * self.zeta_chain[1] # Coupling with next
81
+
82
+ # 2. Update middle chain links
83
+ for j in range(1, len(self.zeta_chain)-1):
84
+ driving_force_j = (self.Q_value_chain[j-1] * self.zeta_chain[j-1]**2 - self.Boltzmann_constant * self.initial_temperature)
85
+ self.zeta_chain[j] += dt * driving_force_j / self.Q_value_chain[j]
86
+ self.zeta_chain[j] -= dt * self.zeta_chain[j] * self.zeta_chain[j+1]
87
+
88
+ # 3. Update last chain link
89
+ last = -1
90
+ driving_force_last = (self.Q_value_chain[last-1] * self.zeta_chain[last-1]**2 - self.Boltzmann_constant * self.initial_temperature)
91
+ self.zeta_chain[last] += dt * driving_force_last / self.Q_value_chain[last]
92
+
93
+ # =========================================================================
94
+ # Public API (Compatible with moleculardynamics.py)
95
+ # =========================================================================
96
+
97
+ def calc_tot_kinetic_energy(self):
98
+ """
99
+ Vectorized calculation of total kinetic energy.
100
+ KE = sum(p^2 / 2m)
101
+ """
102
+ p_sq = self.momentum_list ** 2
103
+ p_sq_atom = np.sum(p_sq, axis=1)
104
+ self.tot_kinetic_ene = np.sum(p_sq_atom / (2.0 * self.masses.flatten()))
105
+ return self.tot_kinetic_ene
106
+
107
+ def calc_inst_temperature(self):
108
+ """Calculates and stores instantaneous temperature."""
109
+ self.calc_tot_kinetic_energy()
110
+ self.Instantaneous_temperature = 2.0 * self.tot_kinetic_ene / (self.g_value * self.Boltzmann_constant)
111
+ print(f"Instantaneous_temperature: {self.Instantaneous_temperature:.8f} K")
112
+ return self.Instantaneous_temperature
113
+
114
+ def add_inst_temperature_list(self):
115
+ self.Instantaneous_temperatures_list.append(self.Instantaneous_temperature)
116
+
117
+ def Nose_Hoover_thermostat(self, geom_num_list, new_g): # fixed volume #NVT ensemble
118
+ """
119
+ Single Nose-Hoover implementation.
120
+ """
121
+ geom_arr = np.array(geom_num_list, dtype=np.float64)
122
+ force = -1.0 * np.array(new_g, dtype=np.float64)
123
+
124
+ # 1. First half-step thermostat scaling
125
+ self.momentum_list *= np.exp(-self.delta_timescale * self.zeta * 0.5)
126
+
127
+ # 2. First half-step momentum update (Force contribution)
128
+ self.momentum_list += force * self.delta_timescale * 0.5
129
+
130
+ print("NVT ensemble (Nose_Hoover) : Sum of momenta (absolute value):", np.sum(np.abs(self.momentum_list)))
131
+
132
+ # 3. Position update (Full step)
133
+ new_geometry = self._update_position(geom_arr, self.delta_timescale)
134
+
135
+ # 4. Thermostat Propagation
136
+ self.calc_inst_temperature()
137
+ self.add_inst_temperature_list()
138
+
139
+ driving_force = (2 * self.tot_kinetic_ene - self.g_value * self.Boltzmann_constant * self.initial_temperature)
140
+ self.zeta += self.delta_timescale * driving_force / self.Q_value
141
+
142
+ # 5. Second half-step momentum update
143
+ self.momentum_list += force * self.delta_timescale * 0.5
144
+
145
+ # 6. Second half-step thermostat scaling
146
+ self.momentum_list *= np.exp(-self.delta_timescale * self.zeta * 0.5)
147
+
148
+ return new_geometry # Corrected: Returns numpy array, not list
149
+
150
+ def Nose_Hoover_chain_thermostat(self, geom_num_list, new_g): # fixed volume #NVT ensemble
151
+ """
152
+ Nose-Hoover Chain implementation.
153
+ """
154
+ geom_arr = np.array(geom_num_list, dtype=np.float64)
155
+ force = -1.0 * np.array(new_g, dtype=np.float64)
156
+
157
+ # 1. First half-step thermostat scaling
158
+ self.momentum_list *= np.exp(-self.delta_timescale * self.zeta_chain[0] * 0.5)
159
+
160
+ # 2. First half-step momentum update
161
+ self.momentum_list += force * self.delta_timescale * 0.5
162
+
163
+ print("NVT ensemble (Nose_Hoover chain) : Sum of momenta (absolute value):", np.sum(np.abs(self.momentum_list)))
164
+
165
+ # 3. Position update
166
+ new_geometry = self._update_position(geom_arr, self.delta_timescale)
167
+
168
+ # 4. Thermostat Propagation
169
+ self.calc_inst_temperature()
170
+ self.add_inst_temperature_list()
171
+
172
+ self._propagate_nhc_zeta(self.delta_timescale, 2 * self.tot_kinetic_ene)
173
+
174
+ print("zeta_list (Coefficient of friction): ", self.zeta_chain)
175
+
176
+ # 5. Second half-step momentum update
177
+ self.momentum_list += force * self.delta_timescale * 0.5
178
+
179
+ # 6. Second half-step thermostat scaling
180
+ self.momentum_list *= np.exp(-self.delta_timescale * self.zeta_chain[0] * 0.5)
181
+
182
+ return new_geometry # Corrected: Returns numpy array, not list
183
+
184
+ def Velocity_Verlet(self, geom_num_list, new_g, prev_g, iter): # NVE ensemble
185
+ """
186
+ Velocity Verlet integration.
187
+ """
188
+ geom_arr = np.array(geom_num_list, dtype=np.float64)
189
+
190
+ force_new = -1.0 * np.array(new_g, dtype=np.float64)
191
+ force_prev = -1.0 * np.array(prev_g, dtype=np.float64)
192
+
193
+ # 1. Update Momentum
194
+ self.momentum_list += (force_new + force_prev) * self.delta_timescale * 0.5
195
+
196
+ # 2. Position Update
197
+ term1 = (self.momentum_list * self.inverse_masses) * self.delta_timescale
198
+ term2 = (force_new * self.inverse_masses) * (self.delta_timescale**2 / 2.0)
199
+
200
+ new_geometry = geom_arr + term1 + term2
201
+
202
+ # Stats
203
+ self.calc_inst_temperature()
204
+ self.add_inst_temperature_list()
205
+
206
+ return new_geometry # Corrected: Returns numpy array, not list
207
+
208
+ def generate_normal_random_variables(self, n_variables):
209
+ """Vectorized Box-Muller transformation"""
210
+ n_pairs = (n_variables + 1) // 2
211
+ u1 = np.random.rand(n_pairs)
212
+ u2 = np.random.rand(n_pairs)
213
+
214
+ r = np.sqrt(-2 * np.log(u1))
215
+ theta = 2 * np.pi * u2
216
+
217
+ z1 = r * np.cos(theta)
218
+ z2 = r * np.sin(theta)
219
+
220
+ result = np.empty(n_pairs * 2)
221
+ result[0::2] = z1
222
+ result[1::2] = z2
223
+
224
+ return result[:n_variables]
225
+
226
+ def calc_rand_moment_based_on_boltzman_const(self, random_variables):
227
+ """
228
+ Scales random variables by sqrt(kB * T * m).
229
+ """
230
+ rand_moment = np.array(random_variables, dtype=np.float64)
231
+ scale_factors = np.sqrt(self.Boltzmann_constant * self.temperature * self.masses)
232
+ rand_moment *= scale_factors
233
+ return rand_moment
234
+
235
+ def init_purtubation(self, geometry, B_e, B_g):
236
+ """Initializes momenta with random thermal noise."""
237
+ N = len(self.element_list)
238
+ random_vars = self.generate_normal_random_variables(N * 3).reshape(N, 3)
239
+ v_thermal = random_vars * np.sqrt(self.Boltzmann_constant * self.temperature * self.inverse_masses)
240
+ init_momentum = v_thermal * self.masses
241
+
242
+ self.momentum_list += init_momentum
243
+ self.init_energy = B_e
244
+ return
245
+ def Langevin_thermostat(self, geom_num_list, new_g):
246
+ """
247
+ Langevin Dynamics (BAOAB integrator)
248
+ Reference: B. Leimkuhler and C. Matthews, J. Chem. Phys. 138, 174102 (2013).
249
+
250
+ Structure:
251
+ B: Momentum += 0.5 * dt * Force
252
+ A: Position += 0.5 * dt * Velocity
253
+ O: Momentum = c1 * Momentum + c2 * Noise (Ornstein-Uhlenbeck)
254
+ A: Position += 0.5 * dt * Velocity
255
+ B: Momentum += 0.5 * dt * Force
256
+ """
257
+ geom_arr = np.array(geom_num_list, dtype=np.float64)
258
+ force = -1.0 * np.array(new_g, dtype=np.float64)
259
+
260
+
261
+ dt = self.delta_timescale
262
+ gamma = self.Langevin_zeta # (1/time)
263
+ target_temp = self.initial_temperature
264
+
265
+ #
266
+ c1 = np.exp(-gamma * dt)
267
+ c2 = np.sqrt(1.0 - c1**2)
268
+
269
+ # sigma = sqrt(m * kB * T)
270
+ # self.masses shape: (N, 1) -> broadcasting works
271
+ sigma = np.sqrt(self.masses * self.Boltzmann_constant * target_temp)
272
+
273
+ # 1. B: Half-step Momentum Update (Force)
274
+ self.momentum_list += 0.5 * dt * force
275
+
276
+ # 2. A: Half-step Position Update
277
+ # r(t+dt/2) = r(t) + 0.5 * dt * v(t+dt/2)
278
+ new_geometry = self._update_position(geom_arr, 0.5 * dt)
279
+
280
+ # 3. O: Fluctuation-Dissipation (Thermostat)
281
+ # p' = c1 * p + c2 * sigma * noise
282
+
283
+ noise = np.random.normal(0.0, 1.0, self.momentum_list.shape)
284
+ self.momentum_list = c1 * self.momentum_list + c2 * sigma * noise
285
+
286
+ # 4. A: Half-step Position Update
287
+ # r(t+dt) = r(t+dt/2) + 0.5 * dt * v'
288
+ new_geometry = self._update_position(new_geometry, 0.5 * dt)
289
+
290
+ # 5. B: Half-step Momentum Update (Force)
291
+
292
+ self.momentum_list += 0.5 * dt * force
293
+
294
+
295
+ self.calc_inst_temperature()
296
+ self.add_inst_temperature_list()
297
+
298
+ return new_geometry