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.
- {multioptpy-1.20.5 → multioptpy-1.20.7/MultiOptPy.egg-info}/PKG-INFO +10 -10
- {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/requires.txt +1 -1
- {multioptpy-1.20.5/MultiOptPy.egg-info → multioptpy-1.20.7}/PKG-INFO +10 -10
- {multioptpy-1.20.5 → multioptpy-1.20.7}/README.md +8 -8
- multioptpy-1.20.7/multioptpy/MD/thermostat.py +298 -0
- multioptpy-1.20.7/multioptpy/ModelHessian/fischerd3.py +305 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rsirfo.py +112 -4
- multioptpy-1.20.7/multioptpy/Optimizer/rsprfo.py +1363 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/entrypoints.py +406 -16
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/moleculardynamics.py +21 -13
- {multioptpy-1.20.5 → multioptpy-1.20.7}/pyproject.toml +3 -2
- multioptpy-1.20.5/multioptpy/MD/thermostat.py +0 -185
- multioptpy-1.20.5/multioptpy/ModelHessian/fischerd3.py +0 -360
- multioptpy-1.20.5/multioptpy/Optimizer/rsprfo.py +0 -1056
- {multioptpy-1.20.5 → multioptpy-1.20.7}/LICENSE +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/SOURCES.txt +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/dependency_links.txt +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/entry_points.txt +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/MultiOptPy.egg-info/top_level.txt +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/fairchem.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gamess.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gaussian.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/gxtb_dev.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/mace.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/mopac.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/nwchem.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/orca.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/ase_tools/pygfn0.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/dxtb_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/emt_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/gpaw_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/lj_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/psi4_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/pwscf_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/pyscf_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/sqm1_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/sqm2_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/tblite_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Calculator/tersoff_calculation_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Constraint/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Constraint/constraint_condition.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/polar_coordinate.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Coordinate/redundant_coordinate.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/converge_criteria.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/dvv.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/euler.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/hpc.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/lqa.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/modekill.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/IRC/rk4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/adaptive_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/binomial_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/geodesic_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/linear_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/savitzky_golay_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Interpolation/spline_interpolation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MD/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_bneb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_dmf_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_dneb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_ewbneb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_gpneb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_lup_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_neb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_nesb_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_om_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_qsm_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/MEP/pathopt_qsmv2_force.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/avoiding_model_function.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/binary_image_ts_search_model_function.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/conical_model_function.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_meci.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_mesx.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/opt_mesx_2.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelFunction/seam_model_function.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/approx_hessian.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/calc_params.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/fischer.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/fischerd4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/gfn0xtb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/gfnff.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d2.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d3.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/lindh2007d4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/morse.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegel.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegeld3.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/schlegeld4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/shortrange.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd2.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd3.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/swartd4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ModelHessian/tshess.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/QHAdam.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/abc_fire.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adabelief.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adabound.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adadelta.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adaderivative.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adadiff.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adafactor.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adam.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamax.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamod.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adamw.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/adiis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/afire_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/block_hessian_update.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/c2diis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/component_wise_scaling.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/conjugate_gradient.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/conjugate_gradient_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/coordinate_locking.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/crsirfo.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/dic_rsirfo.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/ediis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/eve.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fastadabelief.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire2.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/fire_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gan_step.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gdiis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gediis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/geodesic_step.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gpmin.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gpr_step.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gradientdescent.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/gradientdescent_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/hessian_update.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/hybrid_rfo.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/kdiis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lars.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lbfgs.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lbfgs_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/linesearch.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/lookahead.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/mf_rsirfo.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/mode_following.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/nadam.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/newton.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/prodigy.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/purtubation.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/quickmin_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/radam.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rfo_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/ric_rfo.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rl_step.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/rmspropgrave.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/sadam.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/samsgrad.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/tr_lbfgs.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trim.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trust_radius.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/trust_radius_neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Optimizer/yogi.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/addf.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/dimer.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/elastic_image_pair.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/modelfunction.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/newton_traj.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/spring_pair_method.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/OtherMethod/twopshs.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/calc_irc_curvature.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/cmds_analysis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/koopman_analysis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/PESAnalyzer/pca_analysis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/atomic_mass.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/atomic_number.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/covalent_radii.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d2.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d3.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/d4.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/dreiding.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gfn0xtb_param.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gfnff_param.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/gnb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/parameter.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/uff.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Parameters/unit_values.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/AFIR_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/LJ_repulsive_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/anharmonic_keep_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/asym_elllipsoidal_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/electrostatic_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/flux_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/gaussian_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/idpp.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_angle_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_dihedral_angle_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_outofplain_angle_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/keep_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/mechano_force_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/nanoreactor_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/spacer_model_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/switching_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/universal_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/value_range_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Potential/void_point_potential.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm1/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm1/sqm1_core.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/calc_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_basis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_bond.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_core.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_data.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_disp.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_eeq.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_overlapint.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_qm.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_rep.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/SQM/sqm2/sqm2_srb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Thermo/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Thermo/normal_mode_analyzer.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/bond_connectivity.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/calc_tools.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/oniom.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/pbc.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/riemann_curvature.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Utils/symmetry_analyzer.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Visualization/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Visualization/visualization.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/WFAnalyzer/MO_analysis.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/WFAnalyzer/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/autots.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/ieip_wrapper.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/md_wrapper.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/neb_wrapper.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/Wrapper/optimize_wrapper.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/__init__.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/fileio.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/ieip.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/interface.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/irc.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/neb.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/optimization.py +0 -0
- {multioptpy-1.20.5 → multioptpy-1.20.7}/multioptpy/optimizer.py +0 -0
- {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.
|
|
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
|
|
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.
|
|
84
|
-
unzip v1.20.
|
|
85
|
-
cd MultiOptPy-1.20.
|
|
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.
|
|
111
|
-
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.
|
|
112
|
-
unzip v1.20.
|
|
113
|
-
cd MultiOptPy-1.20.
|
|
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
|
|
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
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MultiOptPy
|
|
3
|
-
Version: 1.20.
|
|
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
|
|
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.
|
|
84
|
-
unzip v1.20.
|
|
85
|
-
cd MultiOptPy-1.20.
|
|
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.
|
|
111
|
-
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.
|
|
112
|
-
unzip v1.20.
|
|
113
|
-
cd MultiOptPy-1.20.
|
|
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
|
|
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.
|
|
64
|
-
unzip v1.20.
|
|
65
|
-
cd MultiOptPy-1.20.
|
|
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.
|
|
91
|
-
wget https://github.com/ss0832/MultiOptPy/archive/refs/tags/v1.20.
|
|
92
|
-
unzip v1.20.
|
|
93
|
-
cd MultiOptPy-1.20.
|
|
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
|
|
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
|