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,24 @@
1
+ from pysisyphus.calculators.AnaPotBase import AnaPotBase
2
+
3
+ # [1] https://aip.scitation.org/doi/abs/10.1063/1.442352
4
+ # Cerjan, Miller
5
+
6
+
7
+ class CerjanMiller(AnaPotBase):
8
+
9
+ def __init__(self, a=1, b=1, c=1):
10
+ # Eq. (3.1) in [1]
11
+ V_str = f"({a}-{b}*y**2)*x**2*exp(-x**2)+{c}/2*y**2"
12
+ xlim = (-1.3, 1.3)
13
+ ylim = (-0.7, 1.9)
14
+ super().__init__(V_str=V_str, xlim=xlim, ylim=ylim)
15
+
16
+ def __str__(self):
17
+ return "CerjanMiller calculator"
18
+
19
+
20
+ if __name__ == "__main__":
21
+ cj = CerjanMiller()
22
+ cj.plot()
23
+ import matplotlib.pyplot as plt
24
+ plt.show()
@@ -0,0 +1,123 @@
1
+ import numpy as np
2
+ import sympy as sym
3
+
4
+ # from sympy import sympify, lambdify,
5
+
6
+ from pysisyphus.calculators.Calculator import Calculator
7
+
8
+ from pysisyphus.calculators import ORCA, Turbomole, DFTD4
9
+
10
+
11
+ CALC_CLASSES = {
12
+ "dftd4": DFTD4.DFTD4,
13
+ "orca": ORCA.ORCA,
14
+ "turbomole": Turbomole.Turbomole,
15
+ }
16
+ try:
17
+ from pysisyphus.calculators import PySCF
18
+
19
+ CALC_CLASSES["pyscf"] = PySCF.PySCF
20
+ except (ModuleNotFoundError, OSError):
21
+ pass
22
+
23
+
24
+ class Composite(Calculator):
25
+ def __init__(
26
+ self, final, keys_calcs=None, calcs=None, remove_translation=False, **kwargs
27
+ ):
28
+ # Either directly supply a dictionary with Calculator objects (key_calcs)
29
+ # or a dictionary containing information to set up calculators.
30
+ assert keys_calcs or calcs
31
+
32
+ super().__init__(**kwargs)
33
+
34
+ if calcs:
35
+ keys_calcs = {}
36
+ calc_kwargs_ = {
37
+ "charge": self.charge,
38
+ "mult": self.mult,
39
+ "pal": self.pal,
40
+ "mem": self.mem,
41
+ }
42
+ for i, (key, kwargs) in enumerate(calcs.items()):
43
+ calc_kwargs = calc_kwargs_.copy()
44
+ calc_kwargs["calc_number"] = i
45
+ calc_kwargs["base_name"] = f"composite_{key}"
46
+ # Don't modify original dict
47
+ kwargs = kwargs.copy()
48
+ type_ = kwargs.pop("type")
49
+ calc_kwargs.update(**kwargs)
50
+ calc_cls = CALC_CLASSES[type_]
51
+ keys_calcs[key] = calc_cls(**calc_kwargs)
52
+
53
+ self.keys_calcs = keys_calcs
54
+ assert all([key in final for key in self.keys_calcs.keys()])
55
+ self.final = final
56
+ self.remove_translation = remove_translation
57
+
58
+ # The energies are just numbers that we can easily substitute in
59
+ self.energy_expr = sym.sympify(self.final)
60
+ # The forces/Hessians are matrices that we can't just easily substitute in.
61
+ self.arr_args = sym.symbols(" ".join(self.keys_calcs.keys()))
62
+ self.arr_expr = sym.lambdify(self.arr_args, self.energy_expr)
63
+
64
+ def get_final_energy(self, energies):
65
+ return float(self.energy_expr.subs(energies).evalf())
66
+
67
+ def get_energy(self, atoms, coords, **prepare_kwargs):
68
+ energies = {}
69
+ for key, calc in self.keys_calcs.items():
70
+ energy = calc.get_energy(atoms, coords, **prepare_kwargs)["energy"]
71
+ energies[key] = energy
72
+
73
+ final_energy = self.get_final_energy(energies)
74
+ results = {
75
+ "energy": final_energy,
76
+ }
77
+ return results
78
+
79
+ def get_forces(self, atoms, coords, **prepare_kwargs):
80
+ energies = {}
81
+ forces = {}
82
+ for key, calc in self.keys_calcs.items():
83
+ results = calc.get_forces(atoms, coords, **prepare_kwargs)
84
+ energies[key] = results["energy"]
85
+ forces[key] = results["forces"]
86
+ keys = self.keys_calcs.keys()
87
+ for key in keys:
88
+ self.log(f"|forces_{key}|={np.linalg.norm(forces[key]):.6f}")
89
+ self.log("")
90
+
91
+ final_energy = self.get_final_energy(energies)
92
+ final_forces = self.arr_expr(**forces)
93
+
94
+ # Remove overall translation
95
+ if self.remove_translation:
96
+ f3d = final_forces.reshape(-1, 3)
97
+ f3d -= f3d.mean(axis=0)[None, :]
98
+
99
+ results = {
100
+ "energy": final_energy,
101
+ "forces": final_forces,
102
+ }
103
+ return results
104
+
105
+ def get_hessian(self, atoms, coords, **prepare_kwargs):
106
+ energies = {}
107
+ hessians = {}
108
+ for key, calc in self.keys_calcs.items():
109
+ results = calc.get_hessian(atoms, coords, **prepare_kwargs)
110
+ energies[key] = results["energy"]
111
+ hessians[key] = results["hessian"]
112
+
113
+ final_energy = self.get_final_energy(energies)
114
+ final_hessian = self.arr_expr(**hessians)
115
+
116
+ results = {
117
+ "energy": final_energy,
118
+ "hessian": final_hessian,
119
+ }
120
+ return results
121
+
122
+ def run_calculation(self, atoms, coords, **prepare_kwargs):
123
+ return self.get_energy(atoms, coords, **prepare_kwargs)
@@ -0,0 +1,171 @@
1
+ # [1] https://pubs.acs.org/doi/pdf/10.1021/ct1000268
2
+ # Updated Branching Plane for Finding Conical Intersections without Coupling
3
+ # Derivative Vectors
4
+ # Maeda, Ohno, Morokuma, 2010
5
+
6
+
7
+ from copy import deepcopy
8
+ from dataclasses import dataclass
9
+ from math import sqrt
10
+
11
+ import numpy as np
12
+
13
+ from pysisyphus.calculators.Calculator import Calculator
14
+ from pysisyphus.constants import AU2KJPERMOL
15
+ from pysisyphus.helpers_pure import hash_args
16
+
17
+
18
+ def update_y(x, x_prev, y_prev):
19
+ """Update approximate coupling derivative vector y."""
20
+
21
+ y_prev_x = y_prev.dot(x)
22
+ x_prev_x = x_prev.dot(x)
23
+ y = (y_prev_x * x_prev - x_prev_x * y_prev) / sqrt(y_prev_x ** 2 + x_prev_x ** 2)
24
+ return y
25
+
26
+
27
+ def get_P(x, y):
28
+ """Projector to project out components in branching plane."""
29
+
30
+ I = np.eye(x.size)
31
+ x_ = x / np.linalg.norm(x)
32
+ y_ = y / np.linalg.norm(y)
33
+ P = I - np.outer(x_, x_) - np.outer(y_, y_)
34
+ return P
35
+
36
+
37
+ @dataclass
38
+ class CIQuantities:
39
+ energy1: float
40
+ gradient1: np.ndarray
41
+ energy2: float
42
+ gradient2: np.ndarray
43
+ energy_diff: float
44
+ gradient_diff: np.ndarray
45
+ gradient_mean: np.ndarray
46
+ P: np.ndarray
47
+ # Difference gradient vector
48
+ x: np.ndarray
49
+ # Derivative coupling vector
50
+ y: np.ndarray
51
+ energy: float
52
+ forces: np.ndarray
53
+
54
+
55
+ class ConicalIntersection(Calculator):
56
+ """Calculator for conical intersection optimization.
57
+
58
+ Based on [1].
59
+ """
60
+
61
+ def __init__(self, calculator1, calculator2, **kwargs):
62
+ super().__init__(**kwargs)
63
+
64
+ self.calculator1 = calculator1
65
+ self.calculator2 = calculator2
66
+
67
+ self.x_prev = None
68
+ self.y_prev = None
69
+ self.ciq_store = dict()
70
+
71
+ def get_energy(self, atoms, coords, **prepare_kwargs):
72
+ """Energy of calculator 1."""
73
+ return self.calculator1.get_energy(atoms, coords, **prepare_kwargs)
74
+
75
+ def get_ci_quantities(self, atoms, coords, **prepare_kwargs):
76
+ """Relavent quantities including branching plane and projector P."""
77
+ hash_ = hash_args(atoms, coords, *prepare_kwargs.values(), precision=6)
78
+ if hash_ in self.ciq_store:
79
+ ciq = self.ciq_store[hash_]
80
+ self.log(f"Returning cached CI quantities for hash='{hash_}'.")
81
+ return ciq
82
+ else:
83
+ self.log(f"Calculating CI quantities for hash='{hash_}'.")
84
+
85
+ res1 = self.calculator1.get_forces(atoms, coords, **prepare_kwargs)
86
+ energy1 = res1["energy"]
87
+ gradient1 = -res1["forces"]
88
+
89
+ res2 = self.calculator2.get_forces(atoms, coords, **prepare_kwargs)
90
+ energy2 = res2["energy"]
91
+ gradient2 = -res2["forces"]
92
+
93
+ # Energy difference
94
+ energy_diff = energy1 - energy2
95
+ # Difference Gradient vector DGV
96
+ gradient_diff = gradient1 - gradient2
97
+ # Gradient mean
98
+ gradient_mean = (gradient1 + gradient2) / 2
99
+
100
+ # x vector; unit vector parallel to DGV
101
+ x = gradient_diff / np.linalg.norm(gradient_diff)
102
+
103
+ # Initialize y when it is not yet set ...
104
+ if self.y_prev is None:
105
+ y = gradient_mean / np.linalg.norm(gradient_mean)
106
+ # ... or update it in later calculations
107
+ else:
108
+ y = update_y(x, self.x_prev, self.y_prev)
109
+
110
+ # Orthogonalize against x
111
+ y -= y.dot(x) * x
112
+ # And renormalize
113
+ y /= np.linalg.norm(y)
114
+
115
+ # Projector to remove components along x and y (in BP) from gradient.
116
+ # Eq. (7) in [1].
117
+ P = get_P(x, y)
118
+
119
+ self.log(f"ΔE={energy_diff:.6f} au ({energy_diff*AU2KJPERMOL:.2f} kJ mol⁻¹)")
120
+ # Store vectors for next calculation
121
+ self.x_prev = x
122
+ self.y_prev = y
123
+
124
+ gradient_diff_dash = 2 * energy_diff * x
125
+ # Eq. (6) in [1].
126
+ forces = -(gradient_diff_dash + P.dot(gradient_mean))
127
+
128
+ ciq = CIQuantities(
129
+ energy1=energy1,
130
+ gradient1=gradient1,
131
+ energy2=energy2,
132
+ gradient2=gradient2,
133
+ energy_diff=energy_diff,
134
+ gradient_diff=gradient_diff,
135
+ gradient_mean=gradient_mean,
136
+ P=P,
137
+ x=x,
138
+ y=y,
139
+ energy=energy1,
140
+ forces=forces,
141
+ )
142
+ self.ciq_store[hash_] = deepcopy(ciq)
143
+ return ciq
144
+
145
+ def get_forces(self, atoms, coords, **prepare_kwargs):
146
+ """Projected gradient for CI optimization."""
147
+ ciq = self.get_ci_quantities(atoms, coords, **prepare_kwargs)
148
+
149
+ return {
150
+ "energy": ciq.energy,
151
+ "forces": ciq.forces,
152
+ }
153
+
154
+ def get_hessian(self, atoms, coords, **prepare_kwargs):
155
+ """Projected Hessian."""
156
+ ciq = self.get_ci_quantities(atoms, coords, **prepare_kwargs)
157
+
158
+ hessian1 = self.calculator1.get_hessian(atoms, coords, **prepare_kwargs)[
159
+ "hessian"
160
+ ]
161
+ hessian2 = self.calculator2.get_hessian(atoms, coords, **prepare_kwargs)[
162
+ "hessian"
163
+ ]
164
+ hessian_mean = (hessian1 + hessian2) / 2
165
+ hessian_proj = ciq.P.dot(hessian_mean).dot(ciq.P)
166
+
167
+ return {
168
+ "energy": ciq.energy,
169
+ "forces": ciq.forces,
170
+ "hessian": hessian_proj,
171
+ }