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.
Files changed (372) hide show
  1. hessian_ff/__init__.py +50 -0
  2. hessian_ff/analytical_hessian.py +609 -0
  3. hessian_ff/constants.py +46 -0
  4. hessian_ff/forcefield.py +339 -0
  5. hessian_ff/loaders.py +608 -0
  6. hessian_ff/native/Makefile +8 -0
  7. hessian_ff/native/__init__.py +28 -0
  8. hessian_ff/native/analytical_hessian.py +88 -0
  9. hessian_ff/native/analytical_hessian_ext.cpp +258 -0
  10. hessian_ff/native/bonded.py +82 -0
  11. hessian_ff/native/bonded_ext.cpp +640 -0
  12. hessian_ff/native/loader.py +349 -0
  13. hessian_ff/native/nonbonded.py +118 -0
  14. hessian_ff/native/nonbonded_ext.cpp +1150 -0
  15. hessian_ff/prmtop_parmed.py +23 -0
  16. hessian_ff/system.py +107 -0
  17. hessian_ff/terms/__init__.py +14 -0
  18. hessian_ff/terms/angle.py +73 -0
  19. hessian_ff/terms/bond.py +44 -0
  20. hessian_ff/terms/cmap.py +406 -0
  21. hessian_ff/terms/dihedral.py +141 -0
  22. hessian_ff/terms/nonbonded.py +209 -0
  23. hessian_ff/tests/__init__.py +0 -0
  24. hessian_ff/tests/conftest.py +75 -0
  25. hessian_ff/tests/data/small/complex.parm7 +1346 -0
  26. hessian_ff/tests/data/small/complex.pdb +125 -0
  27. hessian_ff/tests/data/small/complex.rst7 +63 -0
  28. hessian_ff/tests/test_coords_input.py +44 -0
  29. hessian_ff/tests/test_energy_force.py +49 -0
  30. hessian_ff/tests/test_hessian.py +137 -0
  31. hessian_ff/tests/test_smoke.py +18 -0
  32. hessian_ff/tests/test_validation.py +40 -0
  33. hessian_ff/workflows.py +889 -0
  34. mlmm/__init__.py +36 -0
  35. mlmm/__main__.py +7 -0
  36. mlmm/_version.py +34 -0
  37. mlmm/add_elem_info.py +374 -0
  38. mlmm/advanced_help.py +91 -0
  39. mlmm/align_freeze_atoms.py +601 -0
  40. mlmm/all.py +3535 -0
  41. mlmm/bond_changes.py +231 -0
  42. mlmm/bool_compat.py +223 -0
  43. mlmm/cli.py +574 -0
  44. mlmm/cli_utils.py +166 -0
  45. mlmm/default_group.py +337 -0
  46. mlmm/defaults.py +467 -0
  47. mlmm/define_layer.py +526 -0
  48. mlmm/dft.py +1041 -0
  49. mlmm/energy_diagram.py +253 -0
  50. mlmm/extract.py +2213 -0
  51. mlmm/fix_altloc.py +464 -0
  52. mlmm/freq.py +1406 -0
  53. mlmm/harmonic_constraints.py +140 -0
  54. mlmm/hessian_cache.py +44 -0
  55. mlmm/hessian_calc.py +174 -0
  56. mlmm/irc.py +638 -0
  57. mlmm/mlmm_calc.py +2262 -0
  58. mlmm/mm_parm.py +945 -0
  59. mlmm/oniom_export.py +1983 -0
  60. mlmm/oniom_import.py +457 -0
  61. mlmm/opt.py +1742 -0
  62. mlmm/path_opt.py +1353 -0
  63. mlmm/path_search.py +2299 -0
  64. mlmm/preflight.py +88 -0
  65. mlmm/py.typed +1 -0
  66. mlmm/pysis_runner.py +45 -0
  67. mlmm/scan.py +1047 -0
  68. mlmm/scan2d.py +1226 -0
  69. mlmm/scan3d.py +1265 -0
  70. mlmm/scan_common.py +184 -0
  71. mlmm/summary_log.py +736 -0
  72. mlmm/trj2fig.py +448 -0
  73. mlmm/tsopt.py +2871 -0
  74. mlmm/utils.py +2309 -0
  75. mlmm/xtb_embedcharge_correction.py +475 -0
  76. mlmm_toolkit-0.2.2.dev0.dist-info/METADATA +1159 -0
  77. mlmm_toolkit-0.2.2.dev0.dist-info/RECORD +372 -0
  78. mlmm_toolkit-0.2.2.dev0.dist-info/WHEEL +5 -0
  79. mlmm_toolkit-0.2.2.dev0.dist-info/entry_points.txt +2 -0
  80. mlmm_toolkit-0.2.2.dev0.dist-info/licenses/LICENSE +674 -0
  81. mlmm_toolkit-0.2.2.dev0.dist-info/top_level.txt +4 -0
  82. pysisyphus/Geometry.py +1667 -0
  83. pysisyphus/LICENSE +674 -0
  84. pysisyphus/TableFormatter.py +63 -0
  85. pysisyphus/TablePrinter.py +74 -0
  86. pysisyphus/__init__.py +12 -0
  87. pysisyphus/calculators/AFIR.py +452 -0
  88. pysisyphus/calculators/AnaPot.py +20 -0
  89. pysisyphus/calculators/AnaPot2.py +48 -0
  90. pysisyphus/calculators/AnaPot3.py +12 -0
  91. pysisyphus/calculators/AnaPot4.py +20 -0
  92. pysisyphus/calculators/AnaPotBase.py +337 -0
  93. pysisyphus/calculators/AnaPotCBM.py +25 -0
  94. pysisyphus/calculators/AtomAtomTransTorque.py +154 -0
  95. pysisyphus/calculators/CFOUR.py +250 -0
  96. pysisyphus/calculators/Calculator.py +844 -0
  97. pysisyphus/calculators/CerjanMiller.py +24 -0
  98. pysisyphus/calculators/Composite.py +123 -0
  99. pysisyphus/calculators/ConicalIntersection.py +171 -0
  100. pysisyphus/calculators/DFTBp.py +430 -0
  101. pysisyphus/calculators/DFTD3.py +66 -0
  102. pysisyphus/calculators/DFTD4.py +84 -0
  103. pysisyphus/calculators/Dalton.py +61 -0
  104. pysisyphus/calculators/Dimer.py +681 -0
  105. pysisyphus/calculators/Dummy.py +20 -0
  106. pysisyphus/calculators/EGO.py +76 -0
  107. pysisyphus/calculators/EnergyMin.py +224 -0
  108. pysisyphus/calculators/ExternalPotential.py +264 -0
  109. pysisyphus/calculators/FakeASE.py +35 -0
  110. pysisyphus/calculators/FourWellAnaPot.py +28 -0
  111. pysisyphus/calculators/FreeEndNEBPot.py +39 -0
  112. pysisyphus/calculators/Gaussian09.py +18 -0
  113. pysisyphus/calculators/Gaussian16.py +726 -0
  114. pysisyphus/calculators/HardSphere.py +159 -0
  115. pysisyphus/calculators/IDPPCalculator.py +49 -0
  116. pysisyphus/calculators/IPIClient.py +133 -0
  117. pysisyphus/calculators/IPIServer.py +234 -0
  118. pysisyphus/calculators/LEPSBase.py +24 -0
  119. pysisyphus/calculators/LEPSExpr.py +139 -0
  120. pysisyphus/calculators/LennardJones.py +80 -0
  121. pysisyphus/calculators/MOPAC.py +219 -0
  122. pysisyphus/calculators/MullerBrownSympyPot.py +51 -0
  123. pysisyphus/calculators/MultiCalc.py +85 -0
  124. pysisyphus/calculators/NFK.py +45 -0
  125. pysisyphus/calculators/OBabel.py +87 -0
  126. pysisyphus/calculators/ONIOMv2.py +1129 -0
  127. pysisyphus/calculators/ORCA.py +893 -0
  128. pysisyphus/calculators/ORCA5.py +6 -0
  129. pysisyphus/calculators/OpenMM.py +88 -0
  130. pysisyphus/calculators/OpenMolcas.py +281 -0
  131. pysisyphus/calculators/OverlapCalculator.py +908 -0
  132. pysisyphus/calculators/Psi4.py +218 -0
  133. pysisyphus/calculators/PyPsi4.py +37 -0
  134. pysisyphus/calculators/PySCF.py +341 -0
  135. pysisyphus/calculators/PyXTB.py +73 -0
  136. pysisyphus/calculators/QCEngine.py +106 -0
  137. pysisyphus/calculators/Rastrigin.py +22 -0
  138. pysisyphus/calculators/Remote.py +76 -0
  139. pysisyphus/calculators/Rosenbrock.py +15 -0
  140. pysisyphus/calculators/SocketCalc.py +97 -0
  141. pysisyphus/calculators/TIP3P.py +111 -0
  142. pysisyphus/calculators/TransTorque.py +161 -0
  143. pysisyphus/calculators/Turbomole.py +965 -0
  144. pysisyphus/calculators/VRIPot.py +37 -0
  145. pysisyphus/calculators/WFOWrapper.py +333 -0
  146. pysisyphus/calculators/WFOWrapper2.py +341 -0
  147. pysisyphus/calculators/XTB.py +418 -0
  148. pysisyphus/calculators/__init__.py +81 -0
  149. pysisyphus/calculators/cosmo_data.py +139 -0
  150. pysisyphus/calculators/parser.py +150 -0
  151. pysisyphus/color.py +19 -0
  152. pysisyphus/config.py +133 -0
  153. pysisyphus/constants.py +65 -0
  154. pysisyphus/cos/AdaptiveNEB.py +230 -0
  155. pysisyphus/cos/ChainOfStates.py +725 -0
  156. pysisyphus/cos/FreeEndNEB.py +25 -0
  157. pysisyphus/cos/FreezingString.py +103 -0
  158. pysisyphus/cos/GrowingChainOfStates.py +71 -0
  159. pysisyphus/cos/GrowingNT.py +309 -0
  160. pysisyphus/cos/GrowingString.py +508 -0
  161. pysisyphus/cos/NEB.py +189 -0
  162. pysisyphus/cos/SimpleZTS.py +64 -0
  163. pysisyphus/cos/__init__.py +22 -0
  164. pysisyphus/cos/stiffness.py +199 -0
  165. pysisyphus/drivers/__init__.py +17 -0
  166. pysisyphus/drivers/afir.py +855 -0
  167. pysisyphus/drivers/barriers.py +271 -0
  168. pysisyphus/drivers/birkholz.py +138 -0
  169. pysisyphus/drivers/cluster.py +318 -0
  170. pysisyphus/drivers/diabatization.py +133 -0
  171. pysisyphus/drivers/merge.py +368 -0
  172. pysisyphus/drivers/merge_mol2.py +322 -0
  173. pysisyphus/drivers/opt.py +375 -0
  174. pysisyphus/drivers/perf.py +91 -0
  175. pysisyphus/drivers/pka.py +52 -0
  176. pysisyphus/drivers/precon_pos_rot.py +669 -0
  177. pysisyphus/drivers/rates.py +480 -0
  178. pysisyphus/drivers/replace.py +219 -0
  179. pysisyphus/drivers/scan.py +212 -0
  180. pysisyphus/drivers/spectrum.py +166 -0
  181. pysisyphus/drivers/thermo.py +31 -0
  182. pysisyphus/dynamics/Gaussian.py +103 -0
  183. pysisyphus/dynamics/__init__.py +20 -0
  184. pysisyphus/dynamics/colvars.py +136 -0
  185. pysisyphus/dynamics/driver.py +297 -0
  186. pysisyphus/dynamics/helpers.py +256 -0
  187. pysisyphus/dynamics/lincs.py +105 -0
  188. pysisyphus/dynamics/mdp.py +364 -0
  189. pysisyphus/dynamics/rattle.py +121 -0
  190. pysisyphus/dynamics/thermostats.py +128 -0
  191. pysisyphus/dynamics/wigner.py +266 -0
  192. pysisyphus/elem_data.py +3473 -0
  193. pysisyphus/exceptions.py +2 -0
  194. pysisyphus/filtertrj.py +69 -0
  195. pysisyphus/helpers.py +623 -0
  196. pysisyphus/helpers_pure.py +649 -0
  197. pysisyphus/init_logging.py +50 -0
  198. pysisyphus/intcoords/Bend.py +69 -0
  199. pysisyphus/intcoords/Bend2.py +25 -0
  200. pysisyphus/intcoords/BondedFragment.py +32 -0
  201. pysisyphus/intcoords/Cartesian.py +41 -0
  202. pysisyphus/intcoords/CartesianCoords.py +140 -0
  203. pysisyphus/intcoords/Coords.py +56 -0
  204. pysisyphus/intcoords/DLC.py +197 -0
  205. pysisyphus/intcoords/DistanceFunction.py +34 -0
  206. pysisyphus/intcoords/DummyImproper.py +70 -0
  207. pysisyphus/intcoords/DummyTorsion.py +72 -0
  208. pysisyphus/intcoords/LinearBend.py +105 -0
  209. pysisyphus/intcoords/LinearDisplacement.py +80 -0
  210. pysisyphus/intcoords/OutOfPlane.py +59 -0
  211. pysisyphus/intcoords/PrimTypes.py +286 -0
  212. pysisyphus/intcoords/Primitive.py +137 -0
  213. pysisyphus/intcoords/RedundantCoords.py +659 -0
  214. pysisyphus/intcoords/RobustTorsion.py +59 -0
  215. pysisyphus/intcoords/Rotation.py +147 -0
  216. pysisyphus/intcoords/Stretch.py +31 -0
  217. pysisyphus/intcoords/Torsion.py +101 -0
  218. pysisyphus/intcoords/Torsion2.py +25 -0
  219. pysisyphus/intcoords/Translation.py +45 -0
  220. pysisyphus/intcoords/__init__.py +61 -0
  221. pysisyphus/intcoords/augment_bonds.py +126 -0
  222. pysisyphus/intcoords/derivatives.py +10512 -0
  223. pysisyphus/intcoords/eval.py +80 -0
  224. pysisyphus/intcoords/exceptions.py +37 -0
  225. pysisyphus/intcoords/findiffs.py +48 -0
  226. pysisyphus/intcoords/generate_derivatives.py +414 -0
  227. pysisyphus/intcoords/helpers.py +235 -0
  228. pysisyphus/intcoords/logging_conf.py +10 -0
  229. pysisyphus/intcoords/mp_derivatives.py +10836 -0
  230. pysisyphus/intcoords/setup.py +962 -0
  231. pysisyphus/intcoords/setup_fast.py +176 -0
  232. pysisyphus/intcoords/update.py +272 -0
  233. pysisyphus/intcoords/valid.py +89 -0
  234. pysisyphus/interpolate/Geodesic.py +93 -0
  235. pysisyphus/interpolate/IDPP.py +55 -0
  236. pysisyphus/interpolate/Interpolator.py +116 -0
  237. pysisyphus/interpolate/LST.py +70 -0
  238. pysisyphus/interpolate/Redund.py +152 -0
  239. pysisyphus/interpolate/__init__.py +9 -0
  240. pysisyphus/interpolate/helpers.py +34 -0
  241. pysisyphus/io/__init__.py +22 -0
  242. pysisyphus/io/aomix.py +178 -0
  243. pysisyphus/io/cjson.py +24 -0
  244. pysisyphus/io/crd.py +101 -0
  245. pysisyphus/io/cube.py +220 -0
  246. pysisyphus/io/fchk.py +184 -0
  247. pysisyphus/io/hdf5.py +49 -0
  248. pysisyphus/io/hessian.py +72 -0
  249. pysisyphus/io/mol2.py +146 -0
  250. pysisyphus/io/molden.py +293 -0
  251. pysisyphus/io/orca.py +189 -0
  252. pysisyphus/io/pdb.py +269 -0
  253. pysisyphus/io/psf.py +79 -0
  254. pysisyphus/io/pubchem.py +31 -0
  255. pysisyphus/io/qcschema.py +34 -0
  256. pysisyphus/io/sdf.py +29 -0
  257. pysisyphus/io/xyz.py +61 -0
  258. pysisyphus/io/zmat.py +175 -0
  259. pysisyphus/irc/DWI.py +108 -0
  260. pysisyphus/irc/DampedVelocityVerlet.py +134 -0
  261. pysisyphus/irc/Euler.py +22 -0
  262. pysisyphus/irc/EulerPC.py +345 -0
  263. pysisyphus/irc/GonzalezSchlegel.py +187 -0
  264. pysisyphus/irc/IMKMod.py +164 -0
  265. pysisyphus/irc/IRC.py +878 -0
  266. pysisyphus/irc/IRCDummy.py +10 -0
  267. pysisyphus/irc/Instanton.py +307 -0
  268. pysisyphus/irc/LQA.py +53 -0
  269. pysisyphus/irc/ModeKill.py +136 -0
  270. pysisyphus/irc/ParamPlot.py +53 -0
  271. pysisyphus/irc/RK4.py +36 -0
  272. pysisyphus/irc/__init__.py +31 -0
  273. pysisyphus/irc/initial_displ.py +219 -0
  274. pysisyphus/linalg.py +411 -0
  275. pysisyphus/line_searches/Backtracking.py +88 -0
  276. pysisyphus/line_searches/HagerZhang.py +184 -0
  277. pysisyphus/line_searches/LineSearch.py +232 -0
  278. pysisyphus/line_searches/StrongWolfe.py +108 -0
  279. pysisyphus/line_searches/__init__.py +9 -0
  280. pysisyphus/line_searches/interpol.py +15 -0
  281. pysisyphus/modefollow/NormalMode.py +40 -0
  282. pysisyphus/modefollow/__init__.py +10 -0
  283. pysisyphus/modefollow/davidson.py +199 -0
  284. pysisyphus/modefollow/lanczos.py +95 -0
  285. pysisyphus/optimizers/BFGS.py +99 -0
  286. pysisyphus/optimizers/BacktrackingOptimizer.py +113 -0
  287. pysisyphus/optimizers/ConjugateGradient.py +98 -0
  288. pysisyphus/optimizers/CubicNewton.py +75 -0
  289. pysisyphus/optimizers/FIRE.py +113 -0
  290. pysisyphus/optimizers/HessianOptimizer.py +1176 -0
  291. pysisyphus/optimizers/LBFGS.py +228 -0
  292. pysisyphus/optimizers/LayerOpt.py +411 -0
  293. pysisyphus/optimizers/MicroOptimizer.py +169 -0
  294. pysisyphus/optimizers/NCOptimizer.py +90 -0
  295. pysisyphus/optimizers/Optimizer.py +1084 -0
  296. pysisyphus/optimizers/PreconLBFGS.py +260 -0
  297. pysisyphus/optimizers/PreconSteepestDescent.py +7 -0
  298. pysisyphus/optimizers/QuickMin.py +74 -0
  299. pysisyphus/optimizers/RFOptimizer.py +181 -0
  300. pysisyphus/optimizers/RSA.py +99 -0
  301. pysisyphus/optimizers/StabilizedQNMethod.py +248 -0
  302. pysisyphus/optimizers/SteepestDescent.py +23 -0
  303. pysisyphus/optimizers/StringOptimizer.py +173 -0
  304. pysisyphus/optimizers/__init__.py +41 -0
  305. pysisyphus/optimizers/closures.py +301 -0
  306. pysisyphus/optimizers/cls_map.py +58 -0
  307. pysisyphus/optimizers/exceptions.py +6 -0
  308. pysisyphus/optimizers/gdiis.py +280 -0
  309. pysisyphus/optimizers/guess_hessians.py +311 -0
  310. pysisyphus/optimizers/hessian_updates.py +355 -0
  311. pysisyphus/optimizers/poly_fit.py +285 -0
  312. pysisyphus/optimizers/precon.py +153 -0
  313. pysisyphus/optimizers/restrict_step.py +24 -0
  314. pysisyphus/pack.py +172 -0
  315. pysisyphus/peakdetect.py +948 -0
  316. pysisyphus/plot.py +1031 -0
  317. pysisyphus/run.py +2106 -0
  318. pysisyphus/socket_helper.py +74 -0
  319. pysisyphus/stocastic/FragmentKick.py +132 -0
  320. pysisyphus/stocastic/Kick.py +81 -0
  321. pysisyphus/stocastic/Pipeline.py +303 -0
  322. pysisyphus/stocastic/__init__.py +21 -0
  323. pysisyphus/stocastic/align.py +127 -0
  324. pysisyphus/testing.py +96 -0
  325. pysisyphus/thermo.py +156 -0
  326. pysisyphus/trj.py +824 -0
  327. pysisyphus/tsoptimizers/RSIRFOptimizer.py +56 -0
  328. pysisyphus/tsoptimizers/RSPRFOptimizer.py +182 -0
  329. pysisyphus/tsoptimizers/TRIM.py +59 -0
  330. pysisyphus/tsoptimizers/TSHessianOptimizer.py +463 -0
  331. pysisyphus/tsoptimizers/__init__.py +23 -0
  332. pysisyphus/wavefunction/Basis.py +239 -0
  333. pysisyphus/wavefunction/DIIS.py +76 -0
  334. pysisyphus/wavefunction/__init__.py +25 -0
  335. pysisyphus/wavefunction/build_ext.py +42 -0
  336. pysisyphus/wavefunction/cart2sph.py +190 -0
  337. pysisyphus/wavefunction/diabatization.py +304 -0
  338. pysisyphus/wavefunction/excited_states.py +435 -0
  339. pysisyphus/wavefunction/gen_ints.py +1811 -0
  340. pysisyphus/wavefunction/helpers.py +104 -0
  341. pysisyphus/wavefunction/ints/__init__.py +0 -0
  342. pysisyphus/wavefunction/ints/boys.py +193 -0
  343. pysisyphus/wavefunction/ints/boys_table_N_64_xasym_27.1_step_0.01.npy +0 -0
  344. pysisyphus/wavefunction/ints/cart_gto3d.py +176 -0
  345. pysisyphus/wavefunction/ints/coulomb3d.py +25928 -0
  346. pysisyphus/wavefunction/ints/diag_quadrupole3d.py +10036 -0
  347. pysisyphus/wavefunction/ints/dipole3d.py +8762 -0
  348. pysisyphus/wavefunction/ints/int2c2e3d.py +7198 -0
  349. pysisyphus/wavefunction/ints/int3c2e3d_sph.py +65040 -0
  350. pysisyphus/wavefunction/ints/kinetic3d.py +8240 -0
  351. pysisyphus/wavefunction/ints/ovlp3d.py +3777 -0
  352. pysisyphus/wavefunction/ints/quadrupole3d.py +15054 -0
  353. pysisyphus/wavefunction/ints/self_ovlp3d.py +198 -0
  354. pysisyphus/wavefunction/localization.py +458 -0
  355. pysisyphus/wavefunction/multipole.py +159 -0
  356. pysisyphus/wavefunction/normalization.py +36 -0
  357. pysisyphus/wavefunction/pop_analysis.py +134 -0
  358. pysisyphus/wavefunction/shells.py +1171 -0
  359. pysisyphus/wavefunction/wavefunction.py +504 -0
  360. pysisyphus/wrapper/__init__.py +11 -0
  361. pysisyphus/wrapper/exceptions.py +2 -0
  362. pysisyphus/wrapper/jmol.py +120 -0
  363. pysisyphus/wrapper/mwfn.py +169 -0
  364. pysisyphus/wrapper/packmol.py +71 -0
  365. pysisyphus/xyzloader.py +168 -0
  366. pysisyphus/yaml_mods.py +45 -0
  367. thermoanalysis/LICENSE +674 -0
  368. thermoanalysis/QCData.py +244 -0
  369. thermoanalysis/__init__.py +0 -0
  370. thermoanalysis/config.py +3 -0
  371. thermoanalysis/constants.py +20 -0
  372. 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