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,304 @@
|
|
|
1
|
+
# [1] https://doi.org/10.1063/1.4894472
|
|
2
|
+
# Diabatization based on the dipole and quadrupole: The DQ method
|
|
3
|
+
# Hoyer, Xu, Ma, Gagliardi, Truhlar, 2014
|
|
4
|
+
# [2] https://doi.org/10.1063/1.4948728
|
|
5
|
+
# The DQ and DQΦ electronic structure diabatization methods:
|
|
6
|
+
# Validation for general applications
|
|
7
|
+
# Hoyer, Parker, Galgiardi, Truhlar, 2016
|
|
8
|
+
# [3] https://doi.org/10.1063/1.3042233
|
|
9
|
+
# Constructing diabatic states from adiabatic states: Extending
|
|
10
|
+
# generalized Mulliken–Hush to multiple charge centers with Boys localization
|
|
11
|
+
# Subotnik, Yeganeh, Cave, Ratner, 2008
|
|
12
|
+
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import Optional
|
|
15
|
+
|
|
16
|
+
from jinja2 import Template
|
|
17
|
+
import numpy as np
|
|
18
|
+
from numpy.typing import NDArray
|
|
19
|
+
|
|
20
|
+
from pysisyphus.helpers_pure import highlight_text, to_subscript_num
|
|
21
|
+
from pysisyphus.wavefunction import logger
|
|
22
|
+
from pysisyphus.wavefunction.localization import (
|
|
23
|
+
JacobiSweepResult,
|
|
24
|
+
jacobi_sweeps,
|
|
25
|
+
get_fb_ab_func,
|
|
26
|
+
get_fb_cost_func,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
DQTemplate = Template(
|
|
30
|
+
"""{{ name }}
|
|
31
|
+
|
|
32
|
+
Dipole moments
|
|
33
|
+
--------------
|
|
34
|
+
{{ dip_moms }}
|
|
35
|
+
{%- if quad_moms is not none%}
|
|
36
|
+
Trace of quadrupole tensor
|
|
37
|
+
--------------------------
|
|
38
|
+
{{ quad_moms }}
|
|
39
|
+
α = {{ "%.2f"|format(alpha) }}
|
|
40
|
+
{% endif %}
|
|
41
|
+
{%- if epots is not none %}
|
|
42
|
+
Electronic component of electrostatic potential
|
|
43
|
+
-----------------------------------------------
|
|
44
|
+
{{ epots}}
|
|
45
|
+
β = {{ "%.2f"|format(beta) }}
|
|
46
|
+
{% endif %}
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def dq_jacobi_sweeps(
|
|
53
|
+
dip_moms: NDArray[float],
|
|
54
|
+
quad_moms: Optional[NDArray[float]] = None,
|
|
55
|
+
epots: Optional[NDArray[float]] = None,
|
|
56
|
+
alpha: Optional[float] = 10.0,
|
|
57
|
+
beta: Optional[float] = 1.0,
|
|
58
|
+
) -> JacobiSweepResult:
|
|
59
|
+
"""Rotation matrix from DQ-diabatization as outlined in [1], [2] and [3].
|
|
60
|
+
|
|
61
|
+
When no quadrupole moments are given, the DQ-diabatization reduces to a simple
|
|
62
|
+
Boys-diabatization, as outlined by Subotnik et al in [3]. In this case we just
|
|
63
|
+
zeros for the quadrupole moments. As the overall size of the matrices is small,
|
|
64
|
+
the additional FLOPs dont hurt and the code can be kept simpler.
|
|
65
|
+
|
|
66
|
+
We only use the trace of the quadrupole moment matrix. There are three
|
|
67
|
+
dipole moment components, but only one trace of the quadrupole moment
|
|
68
|
+
matrix.
|
|
69
|
+
|
|
70
|
+
TODO: In principle this function can easily be extended to support an arbitrary
|
|
71
|
+
number of properties, each with its own scaling factor. When this is implemented,
|
|
72
|
+
we could drop the separate Boys-localiatzion function in wavefunction.localization.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
dip_moms
|
|
77
|
+
Dipole moment matrix of the adiabatic states.
|
|
78
|
+
Shape (3, nstates, nstates).
|
|
79
|
+
quad_moms
|
|
80
|
+
Optional matrix containing the trace of the primitive quadrupole
|
|
81
|
+
moments. Shape (1, nstates, nstates). Optional.
|
|
82
|
+
epots
|
|
83
|
+
Electronic part of the electrostatic potential.
|
|
84
|
+
alpha
|
|
85
|
+
Scaling factor for quadrupole moment contribution.
|
|
86
|
+
beta
|
|
87
|
+
Scaling factor for electrostatic potential contribution.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
JacobiSweepResult
|
|
92
|
+
Diabatization result.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
_, nstates, _ = dip_moms.shape
|
|
96
|
+
U = np.eye(nstates)
|
|
97
|
+
|
|
98
|
+
assert dip_moms.shape == (3, *U.shape)
|
|
99
|
+
assert U.ndim == 2
|
|
100
|
+
assert U.shape[0] == U.shape[1]
|
|
101
|
+
expected_quad_mom_shape = (1, *dip_moms.shape[1:])
|
|
102
|
+
|
|
103
|
+
prefixes = [
|
|
104
|
+
char_
|
|
105
|
+
for property_, char_ in ((dip_moms, "D"), (quad_moms, "Q"), (epots, "Φ"))
|
|
106
|
+
if property_ is not None
|
|
107
|
+
]
|
|
108
|
+
name = "".join(prefixes) + "-diabatization"
|
|
109
|
+
if no_quad_moms := quad_moms is None:
|
|
110
|
+
quad_moms = np.zeros(expected_quad_mom_shape)
|
|
111
|
+
if no_epots := epots is None:
|
|
112
|
+
epots = np.zeros(expected_quad_mom_shape)
|
|
113
|
+
quad_moms = quad_moms.reshape(*expected_quad_mom_shape)
|
|
114
|
+
epots = epots.reshape(*expected_quad_mom_shape)
|
|
115
|
+
|
|
116
|
+
dip_ab_func = get_fb_ab_func(dip_moms)
|
|
117
|
+
quad_ab_func = get_fb_ab_func(quad_moms)
|
|
118
|
+
epot_ab_func = get_fb_ab_func(epots)
|
|
119
|
+
|
|
120
|
+
def ab_func(j, k, U):
|
|
121
|
+
dip_A, dip_B = dip_ab_func(j, k, U)
|
|
122
|
+
quad_A, quad_B = quad_ab_func(j, k, U)
|
|
123
|
+
epot_A, epot_B = epot_ab_func(j, k, U)
|
|
124
|
+
A = dip_A + alpha * quad_A + beta * epot_A
|
|
125
|
+
B = dip_B + alpha * quad_B + beta * epot_B
|
|
126
|
+
return A, B
|
|
127
|
+
|
|
128
|
+
dip_cost_func = get_fb_cost_func(dip_moms)
|
|
129
|
+
quad_cost_func = get_fb_cost_func(quad_moms)
|
|
130
|
+
epot_cost_func = get_fb_cost_func(epots)
|
|
131
|
+
|
|
132
|
+
def cost_func(U):
|
|
133
|
+
dip_P = dip_cost_func(U)
|
|
134
|
+
quad_P = quad_cost_func(U)
|
|
135
|
+
epot_P = epot_cost_func(U)
|
|
136
|
+
P = dip_P + alpha * quad_P + beta * epot_P
|
|
137
|
+
return P
|
|
138
|
+
|
|
139
|
+
msg = DQTemplate.render(
|
|
140
|
+
name=highlight_text(name),
|
|
141
|
+
dip_moms=dip_moms,
|
|
142
|
+
quad_moms=quad_moms if not no_quad_moms else None,
|
|
143
|
+
alpha=alpha,
|
|
144
|
+
epots=epots if not no_epots else None,
|
|
145
|
+
beta=beta,
|
|
146
|
+
)
|
|
147
|
+
logger.info(msg)
|
|
148
|
+
return jacobi_sweeps(U, cost_func, ab_func)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
DiaResultTemplate = Template(
|
|
152
|
+
"""
|
|
153
|
+
All energies are given in {{ unit }}.
|
|
154
|
+
|
|
155
|
+
Adiabatic energy matrix V
|
|
156
|
+
-------------------------
|
|
157
|
+
{{ adia_mat }}
|
|
158
|
+
|
|
159
|
+
Rotation matrix U
|
|
160
|
+
-----------------
|
|
161
|
+
{{ U }}
|
|
162
|
+
det(U)={{ "%.4f"|format(det) }}
|
|
163
|
+
|
|
164
|
+
Diabatic energy matrix D = UᵀVU
|
|
165
|
+
-------------------------------
|
|
166
|
+
{{ dia_mat }}
|
|
167
|
+
|
|
168
|
+
Diabatic states Ξᵢ sorted by energy
|
|
169
|
+
--------------------------------
|
|
170
|
+
{%- for ind, dia_state, dia_en in dia_states_sorted %}
|
|
171
|
+
{{ ind }}: {{ dia_state }}, {{ "%.4f"|format(dia_en) }} {{ unit }}
|
|
172
|
+
{%- endfor %}
|
|
173
|
+
|
|
174
|
+
Composition of diabatic states Ξᵢ
|
|
175
|
+
---------------------------------
|
|
176
|
+
{%- for dia_comp in dia_compositions %}
|
|
177
|
+
{{ dia_comp }}
|
|
178
|
+
{%- endfor %}
|
|
179
|
+
|
|
180
|
+
Weights U²
|
|
181
|
+
----------
|
|
182
|
+
{{ U2 }}
|
|
183
|
+
|
|
184
|
+
Absolute diabatic couplings
|
|
185
|
+
---------------------------
|
|
186
|
+
{%- for key, coupling in couplings %}
|
|
187
|
+
|{{ key }}| = {{ "%.4f"|format(coupling) }} {{ unit }}
|
|
188
|
+
{%- endfor %}
|
|
189
|
+
"""
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@dataclass
|
|
194
|
+
class DiabatizationResult:
|
|
195
|
+
U: NDArray[float]
|
|
196
|
+
adia_ens: NDArray[float]
|
|
197
|
+
dia_ens: NDArray[float]
|
|
198
|
+
adia_mat: NDArray[float]
|
|
199
|
+
dia_mat: NDArray[float]
|
|
200
|
+
is_converged: bool
|
|
201
|
+
cur_cycle: int
|
|
202
|
+
P: float
|
|
203
|
+
dip_moms: Optional[NDArray] = None
|
|
204
|
+
quad_moms: Optional[NDArray] = None
|
|
205
|
+
epots: Optional[NDArray] = None
|
|
206
|
+
|
|
207
|
+
@property
|
|
208
|
+
def nstates(self):
|
|
209
|
+
return len(self.adia_ens)
|
|
210
|
+
|
|
211
|
+
def __post_init__(self):
|
|
212
|
+
assert len(self.adia_ens) == len(self.dia_ens)
|
|
213
|
+
quad_shape = (self.nstates, self.nstates)
|
|
214
|
+
assert self.U.shape == self.adia_mat.shape == self.dia_mat.shape == quad_shape
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def couplings(self):
|
|
218
|
+
nstates = self.nstates
|
|
219
|
+
abs_dia_mat = np.abs(self.dia_mat)
|
|
220
|
+
couplings = dict()
|
|
221
|
+
for from_ in range(nstates):
|
|
222
|
+
for to_ in range(from_ + 1, nstates):
|
|
223
|
+
key = (from_, to_)
|
|
224
|
+
couplings[key] = couplings[key[::-1]] = abs_dia_mat[from_, to_]
|
|
225
|
+
return couplings
|
|
226
|
+
|
|
227
|
+
def render_report(self, adia_labels=None, unit="eV"):
|
|
228
|
+
U = self.U
|
|
229
|
+
nstates = self.nstates
|
|
230
|
+
U2 = U ** 2
|
|
231
|
+
det = np.linalg.det(U)
|
|
232
|
+
|
|
233
|
+
subscripts = [to_subscript_num(i) for i in range(nstates)]
|
|
234
|
+
adia_wfs = [f"Φ{subscripts[i]}" for i in range(nstates)]
|
|
235
|
+
dia_wfs = [f"Ξ{subscripts[i]}" for i in range(nstates)]
|
|
236
|
+
|
|
237
|
+
# Diabatic states, sorted by energy
|
|
238
|
+
dia_ens = self.dia_ens
|
|
239
|
+
sorted_inds = np.argsort(dia_ens)
|
|
240
|
+
dia_states_sorted = list()
|
|
241
|
+
for i, sort_ind in enumerate(sorted_inds):
|
|
242
|
+
dia_states_sorted.append((i, dia_wfs[sort_ind], dia_ens[sort_ind]))
|
|
243
|
+
|
|
244
|
+
# Composition of diabatic states
|
|
245
|
+
dia_compositions = list()
|
|
246
|
+
if adia_labels:
|
|
247
|
+
adia_labels = [f"({al})" for al in adia_labels]
|
|
248
|
+
else:
|
|
249
|
+
adia_labels = ["" for _ in range(nstates)]
|
|
250
|
+
for i in range(nstates):
|
|
251
|
+
coeffs = U[:, i]
|
|
252
|
+
signs = ["+" if c > 0 else "-" for c in coeffs]
|
|
253
|
+
sum_ = " ".join(
|
|
254
|
+
[
|
|
255
|
+
f"{sign} {c:>6.4f}·{awf}{al}"
|
|
256
|
+
for sign, c, awf, al in zip(
|
|
257
|
+
signs, np.abs(coeffs), adia_wfs, adia_labels
|
|
258
|
+
)
|
|
259
|
+
]
|
|
260
|
+
)
|
|
261
|
+
dia_compositions.append(f"{dia_wfs[i]} = {sum_}")
|
|
262
|
+
|
|
263
|
+
# Couplings
|
|
264
|
+
couplings = self.couplings
|
|
265
|
+
flat_couplings = list()
|
|
266
|
+
for from_ in range(nstates):
|
|
267
|
+
for to_ in range(from_ + 1, nstates):
|
|
268
|
+
key = f"D{subscripts[from_]}{subscripts[to_]}"
|
|
269
|
+
flat_couplings.append((key, couplings[(from_, to_)]))
|
|
270
|
+
|
|
271
|
+
rendered = DiaResultTemplate.render(
|
|
272
|
+
unit=unit,
|
|
273
|
+
adia_mat=self.adia_mat,
|
|
274
|
+
U=U,
|
|
275
|
+
det=det,
|
|
276
|
+
dia_mat=self.dia_mat,
|
|
277
|
+
dia_states_sorted=dia_states_sorted,
|
|
278
|
+
dia_compositions=dia_compositions,
|
|
279
|
+
U2=U2,
|
|
280
|
+
couplings=flat_couplings,
|
|
281
|
+
)
|
|
282
|
+
return rendered
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def dq_diabatization(adia_ens, dip_moms, quad_moms=None, epots=None, **kwargs):
|
|
286
|
+
jac_res = dq_jacobi_sweeps(dip_moms, quad_moms=quad_moms, epots=epots, **kwargs)
|
|
287
|
+
U = jac_res.C
|
|
288
|
+
adia_mat = np.diag(adia_ens)
|
|
289
|
+
dia_mat = U.T @ adia_mat @ U
|
|
290
|
+
dia_ens = np.diag(dia_mat)
|
|
291
|
+
dia_result = DiabatizationResult(
|
|
292
|
+
U=U,
|
|
293
|
+
adia_ens=adia_ens,
|
|
294
|
+
dia_ens=dia_ens,
|
|
295
|
+
adia_mat=adia_mat,
|
|
296
|
+
dia_mat=dia_mat,
|
|
297
|
+
is_converged=jac_res.is_converged,
|
|
298
|
+
cur_cycle=jac_res.cur_cycle,
|
|
299
|
+
P=jac_res.P,
|
|
300
|
+
dip_moms=dip_moms,
|
|
301
|
+
quad_moms=quad_moms,
|
|
302
|
+
epots=epots,
|
|
303
|
+
)
|
|
304
|
+
return dia_result
|