mlmm-toolkit 0.2.2.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hessian_ff/__init__.py +50 -0
- hessian_ff/analytical_hessian.py +609 -0
- hessian_ff/constants.py +46 -0
- hessian_ff/forcefield.py +339 -0
- hessian_ff/loaders.py +608 -0
- hessian_ff/native/Makefile +8 -0
- hessian_ff/native/__init__.py +28 -0
- hessian_ff/native/analytical_hessian.py +88 -0
- hessian_ff/native/analytical_hessian_ext.cpp +258 -0
- hessian_ff/native/bonded.py +82 -0
- hessian_ff/native/bonded_ext.cpp +640 -0
- hessian_ff/native/loader.py +349 -0
- hessian_ff/native/nonbonded.py +118 -0
- hessian_ff/native/nonbonded_ext.cpp +1150 -0
- hessian_ff/prmtop_parmed.py +23 -0
- hessian_ff/system.py +107 -0
- hessian_ff/terms/__init__.py +14 -0
- hessian_ff/terms/angle.py +73 -0
- hessian_ff/terms/bond.py +44 -0
- hessian_ff/terms/cmap.py +406 -0
- hessian_ff/terms/dihedral.py +141 -0
- hessian_ff/terms/nonbonded.py +209 -0
- hessian_ff/tests/__init__.py +0 -0
- hessian_ff/tests/conftest.py +75 -0
- hessian_ff/tests/data/small/complex.parm7 +1346 -0
- hessian_ff/tests/data/small/complex.pdb +125 -0
- hessian_ff/tests/data/small/complex.rst7 +63 -0
- hessian_ff/tests/test_coords_input.py +44 -0
- hessian_ff/tests/test_energy_force.py +49 -0
- hessian_ff/tests/test_hessian.py +137 -0
- hessian_ff/tests/test_smoke.py +18 -0
- hessian_ff/tests/test_validation.py +40 -0
- hessian_ff/workflows.py +889 -0
- mlmm/__init__.py +36 -0
- mlmm/__main__.py +7 -0
- mlmm/_version.py +34 -0
- mlmm/add_elem_info.py +374 -0
- mlmm/advanced_help.py +91 -0
- mlmm/align_freeze_atoms.py +601 -0
- mlmm/all.py +3535 -0
- mlmm/bond_changes.py +231 -0
- mlmm/bool_compat.py +223 -0
- mlmm/cli.py +574 -0
- mlmm/cli_utils.py +166 -0
- mlmm/default_group.py +337 -0
- mlmm/defaults.py +467 -0
- mlmm/define_layer.py +526 -0
- mlmm/dft.py +1041 -0
- mlmm/energy_diagram.py +253 -0
- mlmm/extract.py +2213 -0
- mlmm/fix_altloc.py +464 -0
- mlmm/freq.py +1406 -0
- mlmm/harmonic_constraints.py +140 -0
- mlmm/hessian_cache.py +44 -0
- mlmm/hessian_calc.py +174 -0
- mlmm/irc.py +638 -0
- mlmm/mlmm_calc.py +2262 -0
- mlmm/mm_parm.py +945 -0
- mlmm/oniom_export.py +1983 -0
- mlmm/oniom_import.py +457 -0
- mlmm/opt.py +1742 -0
- mlmm/path_opt.py +1353 -0
- mlmm/path_search.py +2299 -0
- mlmm/preflight.py +88 -0
- mlmm/py.typed +1 -0
- mlmm/pysis_runner.py +45 -0
- mlmm/scan.py +1047 -0
- mlmm/scan2d.py +1226 -0
- mlmm/scan3d.py +1265 -0
- mlmm/scan_common.py +184 -0
- mlmm/summary_log.py +736 -0
- mlmm/trj2fig.py +448 -0
- mlmm/tsopt.py +2871 -0
- mlmm/utils.py +2309 -0
- mlmm/xtb_embedcharge_correction.py +475 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/METADATA +1159 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/RECORD +372 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/WHEEL +5 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/entry_points.txt +2 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/licenses/LICENSE +674 -0
- mlmm_toolkit-0.2.2.dev0.dist-info/top_level.txt +4 -0
- pysisyphus/Geometry.py +1667 -0
- pysisyphus/LICENSE +674 -0
- pysisyphus/TableFormatter.py +63 -0
- pysisyphus/TablePrinter.py +74 -0
- pysisyphus/__init__.py +12 -0
- pysisyphus/calculators/AFIR.py +452 -0
- pysisyphus/calculators/AnaPot.py +20 -0
- pysisyphus/calculators/AnaPot2.py +48 -0
- pysisyphus/calculators/AnaPot3.py +12 -0
- pysisyphus/calculators/AnaPot4.py +20 -0
- pysisyphus/calculators/AnaPotBase.py +337 -0
- pysisyphus/calculators/AnaPotCBM.py +25 -0
- pysisyphus/calculators/AtomAtomTransTorque.py +154 -0
- pysisyphus/calculators/CFOUR.py +250 -0
- pysisyphus/calculators/Calculator.py +844 -0
- pysisyphus/calculators/CerjanMiller.py +24 -0
- pysisyphus/calculators/Composite.py +123 -0
- pysisyphus/calculators/ConicalIntersection.py +171 -0
- pysisyphus/calculators/DFTBp.py +430 -0
- pysisyphus/calculators/DFTD3.py +66 -0
- pysisyphus/calculators/DFTD4.py +84 -0
- pysisyphus/calculators/Dalton.py +61 -0
- pysisyphus/calculators/Dimer.py +681 -0
- pysisyphus/calculators/Dummy.py +20 -0
- pysisyphus/calculators/EGO.py +76 -0
- pysisyphus/calculators/EnergyMin.py +224 -0
- pysisyphus/calculators/ExternalPotential.py +264 -0
- pysisyphus/calculators/FakeASE.py +35 -0
- pysisyphus/calculators/FourWellAnaPot.py +28 -0
- pysisyphus/calculators/FreeEndNEBPot.py +39 -0
- pysisyphus/calculators/Gaussian09.py +18 -0
- pysisyphus/calculators/Gaussian16.py +726 -0
- pysisyphus/calculators/HardSphere.py +159 -0
- pysisyphus/calculators/IDPPCalculator.py +49 -0
- pysisyphus/calculators/IPIClient.py +133 -0
- pysisyphus/calculators/IPIServer.py +234 -0
- pysisyphus/calculators/LEPSBase.py +24 -0
- pysisyphus/calculators/LEPSExpr.py +139 -0
- pysisyphus/calculators/LennardJones.py +80 -0
- pysisyphus/calculators/MOPAC.py +219 -0
- pysisyphus/calculators/MullerBrownSympyPot.py +51 -0
- pysisyphus/calculators/MultiCalc.py +85 -0
- pysisyphus/calculators/NFK.py +45 -0
- pysisyphus/calculators/OBabel.py +87 -0
- pysisyphus/calculators/ONIOMv2.py +1129 -0
- pysisyphus/calculators/ORCA.py +893 -0
- pysisyphus/calculators/ORCA5.py +6 -0
- pysisyphus/calculators/OpenMM.py +88 -0
- pysisyphus/calculators/OpenMolcas.py +281 -0
- pysisyphus/calculators/OverlapCalculator.py +908 -0
- pysisyphus/calculators/Psi4.py +218 -0
- pysisyphus/calculators/PyPsi4.py +37 -0
- pysisyphus/calculators/PySCF.py +341 -0
- pysisyphus/calculators/PyXTB.py +73 -0
- pysisyphus/calculators/QCEngine.py +106 -0
- pysisyphus/calculators/Rastrigin.py +22 -0
- pysisyphus/calculators/Remote.py +76 -0
- pysisyphus/calculators/Rosenbrock.py +15 -0
- pysisyphus/calculators/SocketCalc.py +97 -0
- pysisyphus/calculators/TIP3P.py +111 -0
- pysisyphus/calculators/TransTorque.py +161 -0
- pysisyphus/calculators/Turbomole.py +965 -0
- pysisyphus/calculators/VRIPot.py +37 -0
- pysisyphus/calculators/WFOWrapper.py +333 -0
- pysisyphus/calculators/WFOWrapper2.py +341 -0
- pysisyphus/calculators/XTB.py +418 -0
- pysisyphus/calculators/__init__.py +81 -0
- pysisyphus/calculators/cosmo_data.py +139 -0
- pysisyphus/calculators/parser.py +150 -0
- pysisyphus/color.py +19 -0
- pysisyphus/config.py +133 -0
- pysisyphus/constants.py +65 -0
- pysisyphus/cos/AdaptiveNEB.py +230 -0
- pysisyphus/cos/ChainOfStates.py +725 -0
- pysisyphus/cos/FreeEndNEB.py +25 -0
- pysisyphus/cos/FreezingString.py +103 -0
- pysisyphus/cos/GrowingChainOfStates.py +71 -0
- pysisyphus/cos/GrowingNT.py +309 -0
- pysisyphus/cos/GrowingString.py +508 -0
- pysisyphus/cos/NEB.py +189 -0
- pysisyphus/cos/SimpleZTS.py +64 -0
- pysisyphus/cos/__init__.py +22 -0
- pysisyphus/cos/stiffness.py +199 -0
- pysisyphus/drivers/__init__.py +17 -0
- pysisyphus/drivers/afir.py +855 -0
- pysisyphus/drivers/barriers.py +271 -0
- pysisyphus/drivers/birkholz.py +138 -0
- pysisyphus/drivers/cluster.py +318 -0
- pysisyphus/drivers/diabatization.py +133 -0
- pysisyphus/drivers/merge.py +368 -0
- pysisyphus/drivers/merge_mol2.py +322 -0
- pysisyphus/drivers/opt.py +375 -0
- pysisyphus/drivers/perf.py +91 -0
- pysisyphus/drivers/pka.py +52 -0
- pysisyphus/drivers/precon_pos_rot.py +669 -0
- pysisyphus/drivers/rates.py +480 -0
- pysisyphus/drivers/replace.py +219 -0
- pysisyphus/drivers/scan.py +212 -0
- pysisyphus/drivers/spectrum.py +166 -0
- pysisyphus/drivers/thermo.py +31 -0
- pysisyphus/dynamics/Gaussian.py +103 -0
- pysisyphus/dynamics/__init__.py +20 -0
- pysisyphus/dynamics/colvars.py +136 -0
- pysisyphus/dynamics/driver.py +297 -0
- pysisyphus/dynamics/helpers.py +256 -0
- pysisyphus/dynamics/lincs.py +105 -0
- pysisyphus/dynamics/mdp.py +364 -0
- pysisyphus/dynamics/rattle.py +121 -0
- pysisyphus/dynamics/thermostats.py +128 -0
- pysisyphus/dynamics/wigner.py +266 -0
- pysisyphus/elem_data.py +3473 -0
- pysisyphus/exceptions.py +2 -0
- pysisyphus/filtertrj.py +69 -0
- pysisyphus/helpers.py +623 -0
- pysisyphus/helpers_pure.py +649 -0
- pysisyphus/init_logging.py +50 -0
- pysisyphus/intcoords/Bend.py +69 -0
- pysisyphus/intcoords/Bend2.py +25 -0
- pysisyphus/intcoords/BondedFragment.py +32 -0
- pysisyphus/intcoords/Cartesian.py +41 -0
- pysisyphus/intcoords/CartesianCoords.py +140 -0
- pysisyphus/intcoords/Coords.py +56 -0
- pysisyphus/intcoords/DLC.py +197 -0
- pysisyphus/intcoords/DistanceFunction.py +34 -0
- pysisyphus/intcoords/DummyImproper.py +70 -0
- pysisyphus/intcoords/DummyTorsion.py +72 -0
- pysisyphus/intcoords/LinearBend.py +105 -0
- pysisyphus/intcoords/LinearDisplacement.py +80 -0
- pysisyphus/intcoords/OutOfPlane.py +59 -0
- pysisyphus/intcoords/PrimTypes.py +286 -0
- pysisyphus/intcoords/Primitive.py +137 -0
- pysisyphus/intcoords/RedundantCoords.py +659 -0
- pysisyphus/intcoords/RobustTorsion.py +59 -0
- pysisyphus/intcoords/Rotation.py +147 -0
- pysisyphus/intcoords/Stretch.py +31 -0
- pysisyphus/intcoords/Torsion.py +101 -0
- pysisyphus/intcoords/Torsion2.py +25 -0
- pysisyphus/intcoords/Translation.py +45 -0
- pysisyphus/intcoords/__init__.py +61 -0
- pysisyphus/intcoords/augment_bonds.py +126 -0
- pysisyphus/intcoords/derivatives.py +10512 -0
- pysisyphus/intcoords/eval.py +80 -0
- pysisyphus/intcoords/exceptions.py +37 -0
- pysisyphus/intcoords/findiffs.py +48 -0
- pysisyphus/intcoords/generate_derivatives.py +414 -0
- pysisyphus/intcoords/helpers.py +235 -0
- pysisyphus/intcoords/logging_conf.py +10 -0
- pysisyphus/intcoords/mp_derivatives.py +10836 -0
- pysisyphus/intcoords/setup.py +962 -0
- pysisyphus/intcoords/setup_fast.py +176 -0
- pysisyphus/intcoords/update.py +272 -0
- pysisyphus/intcoords/valid.py +89 -0
- pysisyphus/interpolate/Geodesic.py +93 -0
- pysisyphus/interpolate/IDPP.py +55 -0
- pysisyphus/interpolate/Interpolator.py +116 -0
- pysisyphus/interpolate/LST.py +70 -0
- pysisyphus/interpolate/Redund.py +152 -0
- pysisyphus/interpolate/__init__.py +9 -0
- pysisyphus/interpolate/helpers.py +34 -0
- pysisyphus/io/__init__.py +22 -0
- pysisyphus/io/aomix.py +178 -0
- pysisyphus/io/cjson.py +24 -0
- pysisyphus/io/crd.py +101 -0
- pysisyphus/io/cube.py +220 -0
- pysisyphus/io/fchk.py +184 -0
- pysisyphus/io/hdf5.py +49 -0
- pysisyphus/io/hessian.py +72 -0
- pysisyphus/io/mol2.py +146 -0
- pysisyphus/io/molden.py +293 -0
- pysisyphus/io/orca.py +189 -0
- pysisyphus/io/pdb.py +269 -0
- pysisyphus/io/psf.py +79 -0
- pysisyphus/io/pubchem.py +31 -0
- pysisyphus/io/qcschema.py +34 -0
- pysisyphus/io/sdf.py +29 -0
- pysisyphus/io/xyz.py +61 -0
- pysisyphus/io/zmat.py +175 -0
- pysisyphus/irc/DWI.py +108 -0
- pysisyphus/irc/DampedVelocityVerlet.py +134 -0
- pysisyphus/irc/Euler.py +22 -0
- pysisyphus/irc/EulerPC.py +345 -0
- pysisyphus/irc/GonzalezSchlegel.py +187 -0
- pysisyphus/irc/IMKMod.py +164 -0
- pysisyphus/irc/IRC.py +878 -0
- pysisyphus/irc/IRCDummy.py +10 -0
- pysisyphus/irc/Instanton.py +307 -0
- pysisyphus/irc/LQA.py +53 -0
- pysisyphus/irc/ModeKill.py +136 -0
- pysisyphus/irc/ParamPlot.py +53 -0
- pysisyphus/irc/RK4.py +36 -0
- pysisyphus/irc/__init__.py +31 -0
- pysisyphus/irc/initial_displ.py +219 -0
- pysisyphus/linalg.py +411 -0
- pysisyphus/line_searches/Backtracking.py +88 -0
- pysisyphus/line_searches/HagerZhang.py +184 -0
- pysisyphus/line_searches/LineSearch.py +232 -0
- pysisyphus/line_searches/StrongWolfe.py +108 -0
- pysisyphus/line_searches/__init__.py +9 -0
- pysisyphus/line_searches/interpol.py +15 -0
- pysisyphus/modefollow/NormalMode.py +40 -0
- pysisyphus/modefollow/__init__.py +10 -0
- pysisyphus/modefollow/davidson.py +199 -0
- pysisyphus/modefollow/lanczos.py +95 -0
- pysisyphus/optimizers/BFGS.py +99 -0
- pysisyphus/optimizers/BacktrackingOptimizer.py +113 -0
- pysisyphus/optimizers/ConjugateGradient.py +98 -0
- pysisyphus/optimizers/CubicNewton.py +75 -0
- pysisyphus/optimizers/FIRE.py +113 -0
- pysisyphus/optimizers/HessianOptimizer.py +1176 -0
- pysisyphus/optimizers/LBFGS.py +228 -0
- pysisyphus/optimizers/LayerOpt.py +411 -0
- pysisyphus/optimizers/MicroOptimizer.py +169 -0
- pysisyphus/optimizers/NCOptimizer.py +90 -0
- pysisyphus/optimizers/Optimizer.py +1084 -0
- pysisyphus/optimizers/PreconLBFGS.py +260 -0
- pysisyphus/optimizers/PreconSteepestDescent.py +7 -0
- pysisyphus/optimizers/QuickMin.py +74 -0
- pysisyphus/optimizers/RFOptimizer.py +181 -0
- pysisyphus/optimizers/RSA.py +99 -0
- pysisyphus/optimizers/StabilizedQNMethod.py +248 -0
- pysisyphus/optimizers/SteepestDescent.py +23 -0
- pysisyphus/optimizers/StringOptimizer.py +173 -0
- pysisyphus/optimizers/__init__.py +41 -0
- pysisyphus/optimizers/closures.py +301 -0
- pysisyphus/optimizers/cls_map.py +58 -0
- pysisyphus/optimizers/exceptions.py +6 -0
- pysisyphus/optimizers/gdiis.py +280 -0
- pysisyphus/optimizers/guess_hessians.py +311 -0
- pysisyphus/optimizers/hessian_updates.py +355 -0
- pysisyphus/optimizers/poly_fit.py +285 -0
- pysisyphus/optimizers/precon.py +153 -0
- pysisyphus/optimizers/restrict_step.py +24 -0
- pysisyphus/pack.py +172 -0
- pysisyphus/peakdetect.py +948 -0
- pysisyphus/plot.py +1031 -0
- pysisyphus/run.py +2106 -0
- pysisyphus/socket_helper.py +74 -0
- pysisyphus/stocastic/FragmentKick.py +132 -0
- pysisyphus/stocastic/Kick.py +81 -0
- pysisyphus/stocastic/Pipeline.py +303 -0
- pysisyphus/stocastic/__init__.py +21 -0
- pysisyphus/stocastic/align.py +127 -0
- pysisyphus/testing.py +96 -0
- pysisyphus/thermo.py +156 -0
- pysisyphus/trj.py +824 -0
- pysisyphus/tsoptimizers/RSIRFOptimizer.py +56 -0
- pysisyphus/tsoptimizers/RSPRFOptimizer.py +182 -0
- pysisyphus/tsoptimizers/TRIM.py +59 -0
- pysisyphus/tsoptimizers/TSHessianOptimizer.py +463 -0
- pysisyphus/tsoptimizers/__init__.py +23 -0
- pysisyphus/wavefunction/Basis.py +239 -0
- pysisyphus/wavefunction/DIIS.py +76 -0
- pysisyphus/wavefunction/__init__.py +25 -0
- pysisyphus/wavefunction/build_ext.py +42 -0
- pysisyphus/wavefunction/cart2sph.py +190 -0
- pysisyphus/wavefunction/diabatization.py +304 -0
- pysisyphus/wavefunction/excited_states.py +435 -0
- pysisyphus/wavefunction/gen_ints.py +1811 -0
- pysisyphus/wavefunction/helpers.py +104 -0
- pysisyphus/wavefunction/ints/__init__.py +0 -0
- pysisyphus/wavefunction/ints/boys.py +193 -0
- pysisyphus/wavefunction/ints/boys_table_N_64_xasym_27.1_step_0.01.npy +0 -0
- pysisyphus/wavefunction/ints/cart_gto3d.py +176 -0
- pysisyphus/wavefunction/ints/coulomb3d.py +25928 -0
- pysisyphus/wavefunction/ints/diag_quadrupole3d.py +10036 -0
- pysisyphus/wavefunction/ints/dipole3d.py +8762 -0
- pysisyphus/wavefunction/ints/int2c2e3d.py +7198 -0
- pysisyphus/wavefunction/ints/int3c2e3d_sph.py +65040 -0
- pysisyphus/wavefunction/ints/kinetic3d.py +8240 -0
- pysisyphus/wavefunction/ints/ovlp3d.py +3777 -0
- pysisyphus/wavefunction/ints/quadrupole3d.py +15054 -0
- pysisyphus/wavefunction/ints/self_ovlp3d.py +198 -0
- pysisyphus/wavefunction/localization.py +458 -0
- pysisyphus/wavefunction/multipole.py +159 -0
- pysisyphus/wavefunction/normalization.py +36 -0
- pysisyphus/wavefunction/pop_analysis.py +134 -0
- pysisyphus/wavefunction/shells.py +1171 -0
- pysisyphus/wavefunction/wavefunction.py +504 -0
- pysisyphus/wrapper/__init__.py +11 -0
- pysisyphus/wrapper/exceptions.py +2 -0
- pysisyphus/wrapper/jmol.py +120 -0
- pysisyphus/wrapper/mwfn.py +169 -0
- pysisyphus/wrapper/packmol.py +71 -0
- pysisyphus/xyzloader.py +168 -0
- pysisyphus/yaml_mods.py +45 -0
- thermoanalysis/LICENSE +674 -0
- thermoanalysis/QCData.py +244 -0
- thermoanalysis/__init__.py +0 -0
- thermoanalysis/config.py +3 -0
- thermoanalysis/constants.py +20 -0
- thermoanalysis/thermo.py +1011 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# [1] http://aip.scitation.org/doi/abs/10.1063/1.2720838
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from scipy.interpolate import splprep, splev
|
|
5
|
+
|
|
6
|
+
from pysisyphus.cos.ChainOfStates import ChainOfStates
|
|
7
|
+
|
|
8
|
+
class SimpleZTS(ChainOfStates):
|
|
9
|
+
|
|
10
|
+
def __init__(self, images, param="equal", **kwargs):
|
|
11
|
+
self.param = param
|
|
12
|
+
super(SimpleZTS, self).__init__(images, **kwargs)
|
|
13
|
+
|
|
14
|
+
def reparametrize(self):
|
|
15
|
+
def weight_function(mean_energies):
|
|
16
|
+
mean_energies = np.abs(mean_energies)
|
|
17
|
+
weights = mean_energies / mean_energies.max()
|
|
18
|
+
weights = np.sqrt(weights)
|
|
19
|
+
return weights
|
|
20
|
+
|
|
21
|
+
reshaped = self.coords.reshape(-1, self.coords_length)
|
|
22
|
+
# To use splprep we have to transpose the coords.
|
|
23
|
+
transp_coords = reshaped.transpose()
|
|
24
|
+
|
|
25
|
+
# Equal arc length parametrization, default.
|
|
26
|
+
u = None
|
|
27
|
+
# Energy weighted arc length parametrization.
|
|
28
|
+
if self.param == "energy":
|
|
29
|
+
energies = [img.energy for img in self.images]
|
|
30
|
+
mean_energies = [(energies[i] + energies[i-1])/2
|
|
31
|
+
for i in range(1, len(self.images))
|
|
32
|
+
]
|
|
33
|
+
weights = weight_function(mean_energies)
|
|
34
|
+
arc_segments = [0, ]
|
|
35
|
+
for i in range(1, len(self.images)):
|
|
36
|
+
coord_diff = np.linalg.norm(
|
|
37
|
+
self.images[i].coords - self.images[i-1].coords
|
|
38
|
+
)
|
|
39
|
+
next_segment = arc_segments[-1] + weights[i-1]*coord_diff
|
|
40
|
+
arc_segments.append(next_segment)
|
|
41
|
+
arc_segments = np.array(arc_segments)
|
|
42
|
+
arc_segments /= arc_segments.max()
|
|
43
|
+
|
|
44
|
+
u = arc_segments
|
|
45
|
+
# Use chunks of 9 dimension because splprep can handle at max
|
|
46
|
+
# 11 dimensions (as of scipy 1.0.0). Every atoms already yields
|
|
47
|
+
# three dimensions (the coordinates X, Y, Z).
|
|
48
|
+
#
|
|
49
|
+
# For dim <= 11 it would go like this:
|
|
50
|
+
#
|
|
51
|
+
# tck, u = splprep(transp_coords, u=u, s=0)
|
|
52
|
+
# uniform_mesh = np.linspace(0, 1, num=len(self.images))
|
|
53
|
+
# new_points = np.array(splev(uniform_mesh, tck))
|
|
54
|
+
tcks, us = zip(*[splprep(transp_coords[i:i+9], u=u, s=0)
|
|
55
|
+
for i in range(0, len(transp_coords), 9)]
|
|
56
|
+
)
|
|
57
|
+
uniform_mesh = np.linspace(0, 1, num=len(self.images))
|
|
58
|
+
# Reparametrize mesh
|
|
59
|
+
new_points = np.vstack([splev(uniform_mesh, tck) for tck in tcks])
|
|
60
|
+
# Flatten along first dimension.
|
|
61
|
+
new_points = new_points.reshape(-1, len(self.images))
|
|
62
|
+
self.coords = new_points.transpose().flatten()
|
|
63
|
+
|
|
64
|
+
return True
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"AdaptiveNEB",
|
|
5
|
+
"ChainOfStates",
|
|
6
|
+
"FreeEndNEB",
|
|
7
|
+
"FreezingString",
|
|
8
|
+
"GrowingNT",
|
|
9
|
+
"GrowingString",
|
|
10
|
+
"NEB",
|
|
11
|
+
"SimpleZTS",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger("cos")
|
|
15
|
+
logger.setLevel(logging.DEBUG)
|
|
16
|
+
# delay = True prevents creation of empty logfiles
|
|
17
|
+
handler = logging.FileHandler("cos.log", mode="w", delay=True)
|
|
18
|
+
# fmt_str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
19
|
+
fmt_str = "%(message)s"
|
|
20
|
+
formatter = logging.Formatter(fmt_str)
|
|
21
|
+
handler.setFormatter(formatter)
|
|
22
|
+
logger.addHandler(handler)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# [1] https://doi.org/10.1002/jcc.27169
|
|
2
|
+
# Nudged elastic stiffness band method: A method to solve kinks problems
|
|
3
|
+
# of reaction paths
|
|
4
|
+
# Mitsuta, Asada
|
|
5
|
+
|
|
6
|
+
# Adapted from the original implementation provided under MIT
|
|
7
|
+
# license by Yuki Mitsuta. Modifications by Johannes Steinmetzer.
|
|
8
|
+
#
|
|
9
|
+
# Main modifications were made in 'get_stiff_stress'; the other two
|
|
10
|
+
# functions are mostly original, disregarding some renaming.
|
|
11
|
+
#
|
|
12
|
+
# Original code is found at https://github.com/YukiMitsuta/Fstiffness
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
from collections.abc import Sequence
|
|
16
|
+
from typing import Union
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_stiff_stress(
|
|
22
|
+
bandwidth: float,
|
|
23
|
+
kappa: Union[float, Sequence],
|
|
24
|
+
image_coords: np.ndarray,
|
|
25
|
+
tangents: np.ndarray,
|
|
26
|
+
straight_thresh: float = 1e-8,
|
|
27
|
+
) -> np.ndarray:
|
|
28
|
+
"""Function to calculate the stress of stiffness
|
|
29
|
+
|
|
30
|
+
See [1] for a discussion.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
bandwidth
|
|
35
|
+
The band width of stiffness term in Bohr. The larger this parameter is,
|
|
36
|
+
the higher the stress of stiffness.
|
|
37
|
+
kappa
|
|
38
|
+
The NEB spring constant (float or sequence of float). When a float is given
|
|
39
|
+
the same spring constants is used for all images.
|
|
40
|
+
image_coords
|
|
41
|
+
2d array of image coordinates of shape (nimages, ncoords) with nimages
|
|
42
|
+
being the number of images and ncoords the number of coordinates of
|
|
43
|
+
each image the instance of each coordinates are numpy.array
|
|
44
|
+
tangents
|
|
45
|
+
2d array with the same shape as 'image_coords', containing the tangents
|
|
46
|
+
defined at each image.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
Fstlist
|
|
51
|
+
Array containing the stress of stiffness with the same shape as 'image_coords'.
|
|
52
|
+
"""
|
|
53
|
+
assert bandwidth > 0.0
|
|
54
|
+
assert image_coords.shape == tangents.shape
|
|
55
|
+
|
|
56
|
+
nimages, ncoords = image_coords.shape
|
|
57
|
+
Fstlist = np.zeros((nimages, ncoords))
|
|
58
|
+
|
|
59
|
+
# Determine if all images are in a straight line by calculating the dot products
|
|
60
|
+
# of all tangents with the normalized coordinate difference vector between the first
|
|
61
|
+
# and last image.
|
|
62
|
+
start_end_tangent = image_coords[-1] - image_coords[0]
|
|
63
|
+
start_end_tangent /= np.linalg.norm(start_end_tangent)
|
|
64
|
+
ovlps = np.einsum("u,vu->v", start_end_tangent, tangents)
|
|
65
|
+
if (np.abs(ovlps - 1.0) <= straight_thresh).all():
|
|
66
|
+
return Fstlist
|
|
67
|
+
|
|
68
|
+
tangents_perp, _ = calcEholo_vert(image_coords, tangents)
|
|
69
|
+
|
|
70
|
+
offset = 0.5 * tangents_perp * bandwidth
|
|
71
|
+
# Virtual image coordinates. Eq. (14) and (15) in [1].
|
|
72
|
+
plus_coords = image_coords.copy() + offset
|
|
73
|
+
minus_coords = image_coords.copy() - offset
|
|
74
|
+
|
|
75
|
+
# Construct list of kappas, when only one kappa is given.
|
|
76
|
+
# For N images, pysisyphus uses N-1 spring constants
|
|
77
|
+
try:
|
|
78
|
+
len(kappa)
|
|
79
|
+
except TypeError:
|
|
80
|
+
kappa = [kappa] * (nimages - 1)
|
|
81
|
+
|
|
82
|
+
assert len(kappa) == (nimages - 1)
|
|
83
|
+
|
|
84
|
+
# Terminal images don't feel stiffness force.
|
|
85
|
+
for k in range(1, nimages - 1):
|
|
86
|
+
Fstlist[k] = Fstiffness_k(
|
|
87
|
+
k,
|
|
88
|
+
kappa[k - 1],
|
|
89
|
+
kappa[k],
|
|
90
|
+
minus_coords,
|
|
91
|
+
plus_coords,
|
|
92
|
+
tangents_perp,
|
|
93
|
+
)
|
|
94
|
+
return Fstlist
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def Fstiffness_k(
|
|
98
|
+
k: int,
|
|
99
|
+
kappa0: float,
|
|
100
|
+
kappa1: float,
|
|
101
|
+
innerimagelist: np.ndarray,
|
|
102
|
+
outerimagelist: np.ndarray,
|
|
103
|
+
Eholo_vertical: np.ndarray,
|
|
104
|
+
):
|
|
105
|
+
"""Stress of stiffness for image k."""
|
|
106
|
+
|
|
107
|
+
v0inner = innerimagelist[k] - innerimagelist[k + 1]
|
|
108
|
+
tdelta0inner = np.linalg.norm(v0inner)
|
|
109
|
+
v0outer = outerimagelist[k] - outerimagelist[k + 1]
|
|
110
|
+
tdelta0outer = np.linalg.norm(v0outer)
|
|
111
|
+
tdeltadelta = tdelta0inner - tdelta0outer
|
|
112
|
+
Vvert = -Eholo_vertical[k] * tdeltadelta * kappa0 * 0.5
|
|
113
|
+
|
|
114
|
+
v1inner = innerimagelist[k] - innerimagelist[k - 1]
|
|
115
|
+
tdelta1inner = np.linalg.norm(v1inner)
|
|
116
|
+
v1outer = outerimagelist[k] - outerimagelist[k - 1]
|
|
117
|
+
tdelta1outer = np.linalg.norm(v1outer)
|
|
118
|
+
tdeltadelta = tdelta1inner - tdelta1outer
|
|
119
|
+
Vvert -= Eholo_vertical[k] * tdeltadelta * kappa1 * 0.5
|
|
120
|
+
return Vvert
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def calcEholo_vert(
|
|
124
|
+
image_coords: np.ndarray, tangents: np.ndarray, thresh: float = 1e-3
|
|
125
|
+
):
|
|
126
|
+
"""Calculate perpendicular tangents for given images and tangents.
|
|
127
|
+
|
|
128
|
+
Implements eq. (8) to (13) in [1]. This function seems to crash when all images
|
|
129
|
+
(tangents) lie (point) in a straight line. Currently, this check is done in
|
|
130
|
+
'get_stiff_stress'.
|
|
131
|
+
"""
|
|
132
|
+
nimages = len(image_coords)
|
|
133
|
+
tangents_perp = [None for _ in range(nimages)]
|
|
134
|
+
findvertlist = [False for _ in range(nimages)]
|
|
135
|
+
whileN = 0
|
|
136
|
+
while whileN < 1000:
|
|
137
|
+
whileN += 1
|
|
138
|
+
if all(findvertlist):
|
|
139
|
+
break
|
|
140
|
+
for k in range(nimages):
|
|
141
|
+
if findvertlist[k]:
|
|
142
|
+
continue
|
|
143
|
+
tau = tangents[k]
|
|
144
|
+
if k == 0 and findvertlist[1]:
|
|
145
|
+
if findvertlist[1]:
|
|
146
|
+
tau_nei = tangents_perp[1]
|
|
147
|
+
a = -np.dot(tau_nei, tau) / np.dot(tau, tau)
|
|
148
|
+
tangents_perp[k] = a * tau + tau_nei
|
|
149
|
+
findvertlist[k] = True
|
|
150
|
+
elif k == nimages - 1:
|
|
151
|
+
if findvertlist[-2]:
|
|
152
|
+
tau_nei = tangents_perp[-2]
|
|
153
|
+
a = -np.dot(tau_nei, tau) / np.dot(tau, tau)
|
|
154
|
+
tangents_perp[k] = a * tau + tau_nei
|
|
155
|
+
findvertlist[k] = True
|
|
156
|
+
else:
|
|
157
|
+
v1 = image_coords[k - 1] - image_coords[k]
|
|
158
|
+
v1 = v1 / np.linalg.norm(v1)
|
|
159
|
+
v1taudot = np.abs(np.dot(v1, tau))
|
|
160
|
+
v2 = image_coords[k + 1] - image_coords[k]
|
|
161
|
+
v2 = v2 / np.linalg.norm(v2)
|
|
162
|
+
v2taudot = np.abs(np.dot(v2, tau))
|
|
163
|
+
if 1.0 - thresh < v1taudot and 1.0 - thresh < v2taudot:
|
|
164
|
+
if findvertlist[k - 1]:
|
|
165
|
+
tau_nei = tangents_perp[k - 1]
|
|
166
|
+
a = -np.dot(tau_nei, tau) / np.dot(tau, tau)
|
|
167
|
+
tangents_perp[k] = a * tau + tau_nei
|
|
168
|
+
findvertlist[k] = True
|
|
169
|
+
elif findvertlist[k + 1]:
|
|
170
|
+
tau_nei = tangents_perp[k + 1]
|
|
171
|
+
a = -np.dot(tau_nei, tau) / np.dot(tau, tau)
|
|
172
|
+
tangents_perp[k] = a * tau + tau_nei
|
|
173
|
+
findvertlist[k] = True
|
|
174
|
+
elif thresh <= v1taudot:
|
|
175
|
+
a = -np.dot(v2, tau) / np.dot(v1, tau)
|
|
176
|
+
tangents_perp[k] = a * v1 + v2
|
|
177
|
+
tangents_perp[k] /= np.linalg.norm(tangents_perp[k])
|
|
178
|
+
findvertlist[k] = True
|
|
179
|
+
elif thresh <= v2taudot:
|
|
180
|
+
a = -np.dot(v1, tau) / np.dot(v2, tau)
|
|
181
|
+
tangents_perp[k] = a * v2 + v1
|
|
182
|
+
tangents_perp[k] /= np.linalg.norm(tangents_perp[k])
|
|
183
|
+
findvertlist[k] = True
|
|
184
|
+
# The elif is from the original code, but it should always evaluted to True.
|
|
185
|
+
# If one of the two conditions wouldn't evalute to True, one of the two
|
|
186
|
+
# conditionals above would run.
|
|
187
|
+
# elif v1taudot < thresh and v2taudot < thresh:
|
|
188
|
+
else:
|
|
189
|
+
tangents_perp[k] = v1
|
|
190
|
+
findvertlist[k] = True
|
|
191
|
+
# else:
|
|
192
|
+
# raise Exception("Error in calcEholovertTh")
|
|
193
|
+
for k in range(1, nimages):
|
|
194
|
+
vbefore = tangents_perp[k - 1]
|
|
195
|
+
v = tangents_perp[k]
|
|
196
|
+
if vbefore.dot(v) < 0.0:
|
|
197
|
+
tangents_perp[k] *= -1
|
|
198
|
+
tangents_perp = np.array(tangents_perp)
|
|
199
|
+
return tangents_perp, findvertlist
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from pysisyphus.drivers.afir import run_afir_paths
|
|
2
|
+
from pysisyphus.drivers.diabatization import dq_diabatization_from_run_dict
|
|
3
|
+
from pysisyphus.drivers.opt import run_opt
|
|
4
|
+
from pysisyphus.drivers.scan import relaxed_scan, relaxed_1d_scan
|
|
5
|
+
from pysisyphus.drivers.birkholz import birkholz_interpolation
|
|
6
|
+
from pysisyphus.drivers.precon_pos_rot import run_precontr
|
|
7
|
+
from pysisyphus.drivers.perf import run_perf, print_perf_results
|
|
8
|
+
from pysisyphus.drivers.rates import (
|
|
9
|
+
eyring_rate,
|
|
10
|
+
harmonic_tst_rate,
|
|
11
|
+
bell_corr,
|
|
12
|
+
eckart_corr,
|
|
13
|
+
eckart_corr_brown,
|
|
14
|
+
wigner_corr,
|
|
15
|
+
)
|
|
16
|
+
from pysisyphus.drivers.replace import replace_atoms
|
|
17
|
+
from pysisyphus.drivers.spectrum import Spectrum
|