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,104 @@
1
+ from typing import Literal, Union
2
+
3
+ import numpy as np
4
+
5
+ from enum import IntEnum
6
+
7
+
8
+ L_MAP = {
9
+ "s": 0,
10
+ "p": 1,
11
+ "d": 2,
12
+ "f": 3,
13
+ "g": 4,
14
+ "h": 5,
15
+ }
16
+ L_MAP_INV = {key: L for L, key in L_MAP.items()}
17
+ L_SIZE = {l: (l + 1) * (l + 2) // 2 for l in L_MAP.values()}
18
+
19
+ Ls = Literal["s", "p", "d", "f", "g", "h"]
20
+ L_Inp = Union[int, Ls]
21
+
22
+
23
+ def get_l(l_inp: L_Inp) -> int:
24
+ """Convert shell label to angular moment quantum number l."""
25
+ try:
26
+ l = L_MAP[l_inp.lower()]
27
+ except (KeyError, AttributeError):
28
+ l = int(l_inp)
29
+ return l
30
+
31
+
32
+ def get_shell_shape(*Ls):
33
+ return [L_SIZE[L] for L in Ls]
34
+
35
+
36
+ class BFType(IntEnum):
37
+ CARTESIAN = 1
38
+ PURE_SPHERICAL = 2
39
+
40
+
41
+ def canonical_order(L):
42
+ inds = list()
43
+ for i in range(L + 1):
44
+ l = L - i
45
+ for n in range(i + 1):
46
+ m = i - n
47
+ inds.append((l, m, n))
48
+ return inds
49
+
50
+
51
+ def cca_order(l):
52
+ """Same as canonical_order()."""
53
+ inds = [
54
+ (l, 0, 0),
55
+ ]
56
+ a = l
57
+ b = c = 0
58
+ for _ in range(((l + 1) * (l + 2) // 2) - 1):
59
+ if c < l - a:
60
+ b -= 1
61
+ c += 1
62
+ else:
63
+ a -= 1
64
+ c = 0
65
+ b = l - a
66
+ inds.append((a, b, c))
67
+ return inds
68
+
69
+
70
+ def cart2ang_moms(cart):
71
+ """Translate 'xxx' to (3, 0, 0) etc."""
72
+
73
+ ang_moms = np.zeros(3, dtype=int)
74
+ for char in cart:
75
+ # x: 120, y: 121, z: 122
76
+ ang_moms[ord(char.lower()) - 120] += 1
77
+ return tuple(ang_moms)
78
+
79
+
80
+ def permut_for_order(cart_orders, pysis_order_func=cca_order):
81
+ """Create permutation matrices to reorder Cartesian integrals."""
82
+ Ps = dict()
83
+ for cart_order in cart_orders:
84
+ lengths = [len(_) for _ in cart_order]
85
+ l0 = lengths[0]
86
+ assert all([length == l0 for length in lengths])
87
+ other_order = [cart2ang_moms(_) for _ in cart_order]
88
+ pysis_order = pysis_order_func(l0)
89
+
90
+ num = len(pysis_order)
91
+ P = np.zeros((num, num), dtype=int)
92
+ for i, po in enumerate(other_order):
93
+ ind = pysis_order.index(po)
94
+ P[i, ind] = 1
95
+ Ps[l0] = P
96
+ return Ps
97
+
98
+
99
+ def symmetric_orthogonalization(mat, S, thresh=1e-6):
100
+ w, v = np.linalg.eigh(mat.T.dot(S).dot(mat))
101
+ mask = w >= thresh
102
+ w_isqrt = np.sqrt(w[mask])
103
+ S_isqrt = (v[:, mask] / w_isqrt).dot(v[:, mask].T)
104
+ return mat.dot(S_isqrt)
File without changes
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env python
2
+
3
+ # [1] https://pubs.acs.org/doi/full/10.1021/acs.jctc.7b00788
4
+ # libreta: Computerized Optimization and Code Synthesis for Electron
5
+ # Repulsion Integral Evaluation
6
+ # Jun Zhang, 2018
7
+ # [2] https://doi.org/10.1002/qua.560400604
8
+ # Two-electron repulsion integrals over Gaussian s functions
9
+ # Gill, Johnson, Pople, 1991
10
+
11
+ import argparse
12
+ import sys
13
+
14
+ import numpy as np
15
+ from scipy.special import factorial2
16
+
17
+ from pysisyphus.config import CONFIG_DIR, L_MAX, L_AUX_MAX
18
+
19
+
20
+ _BOYS_TABLE = np.load(
21
+ CONFIG_DIR / "wavefunction/ints/boys_table_N_64_xasym_27.1_step_0.01.npy"
22
+ )
23
+ _BOYS_N_MAX = (
24
+ max(L_MAX, L_AUX_MAX) * 3
25
+ ) # Currently, there are at most 3center integrals
26
+ _BOYS_X_ASYM = (
27
+ 27.0 # Beyond this x the Boys function can be calculated via an analytical formula
28
+ )
29
+ _BOYS_ADD_POINTS = 10 # Go a bit beyond X_ASYM
30
+ _BOYS_STEP = 0.01
31
+ _BOYS_FACTOR = 100 # int(1 / _BOYS_FACTOR)
32
+ _BOYS_XS = np.arange(0, _BOYS_X_ASYM + (_BOYS_ADD_POINTS + 1) * _BOYS_STEP, _BOYS_STEP)
33
+
34
+ PI = np.pi
35
+ FACT2 = np.array(
36
+ [factorial2(N, exact=True) for N in range(2 * _BOYS_N_MAX)], dtype=np.int64
37
+ )
38
+
39
+
40
+ def make_boys_table():
41
+ from scipy.integrate import quad
42
+
43
+ def boys(t, x, N):
44
+ return t ** (2 * N) * np.exp(-x * t**2)
45
+
46
+ xs = _BOYS_XS
47
+ boys_table = list()
48
+ for N in range(_BOYS_N_MAX + 1):
49
+ print(f"{N=}, calculating at {xs.size} points from {xs[0]} to {xs[-1]}")
50
+ vals = list()
51
+ max_abserr = 0.0
52
+ for i, x in enumerate(xs):
53
+ if i % 1000 == 0:
54
+ print(f"\t{i} values")
55
+ y, abserr = quad(boys, 0, 1, args=(x, N), epsabs=5e-13, epsrel=5e-13)
56
+ max_abserr = max(abserr, max_abserr)
57
+ vals.append(y)
58
+ print(f"\tN={N}, max(abserr)={max_abserr:.8e}")
59
+ boys_table.append(vals)
60
+ boys_table = np.array(boys_table)
61
+ fn = f"boys_table_N_{_BOYS_N_MAX}_xasym_{xs[-1]:.1f}_step_{_BOYS_STEP:.2f}.npy"
62
+ np.save(fn, boys_table)
63
+ return fn
64
+
65
+
66
+ def neville(x, xs_table, table, step, points=5, factor=None):
67
+ """Slow, recursive implementation of Neville interpolation.
68
+
69
+ We multiply 'x' by int(1/step), so we only have to deal with integer arithmetic, to
70
+ determine the first entry from the table. 'x_closest' is always chosen in a way, that
71
+ 'x' is contained in the 'xs' interval. Just to be sure, one can also suppy the 'factor'
72
+ to this method."""
73
+
74
+ if factor is None:
75
+ factor = int(1 / step)
76
+
77
+ # Determine closest x
78
+ x_closest = int(x * factor)
79
+ indices = np.arange(points) + x_closest
80
+ xs = xs_table[indices]
81
+ ys = table[indices]
82
+ p_ = {(i, i): ys[i] for i in range(points)}
83
+
84
+ def p(i, j):
85
+ key = (i, j)
86
+ if key not in p_:
87
+ xi, xj = xs[[i, j]]
88
+ p_[key] = ((x - xj) * p(i, j - 1) - (x - xi) * p(i + 1, j)) / (xi - xj)
89
+ return p_[key]
90
+
91
+ return p(0, points - 1)
92
+
93
+
94
+ def neville_gen5(x, xs_table, table, step, factor=None):
95
+ """Code-generated Neville interpolation using 5 points."""
96
+
97
+ points = 5
98
+ if factor is None:
99
+ factor = int(1 / step)
100
+
101
+ # Determine closest x
102
+ x_closest = int(x * factor)
103
+ indices = np.arange(points) + x_closest
104
+ xs = xs_table[indices]
105
+ ys = table[indices]
106
+
107
+ x0 = -xs[4]
108
+ x1 = x - xs[0]
109
+ x2 = -xs[1]
110
+ x3 = x + x2
111
+ x4 = -xs[2]
112
+ x5 = x + x4
113
+ x6 = -xs[3]
114
+ x7 = x + x6
115
+ x8 = x + x0
116
+ x9 = (x5 * ys[3] - x7 * ys[2]) / (-x6 - xs[2])
117
+ x10 = (x3 * ys[2] - x5 * ys[1]) / (-x4 - xs[1])
118
+ x11 = (-x10 * x7 + x3 * x9) / (-x6 - xs[1])
119
+
120
+ return (
121
+ x1
122
+ * (
123
+ -x11 * x8
124
+ + x3
125
+ * (x5 * (x7 * ys[4] - x8 * ys[3]) / (-x0 - xs[3]) - x8 * x9)
126
+ / (-x0 - xs[2])
127
+ )
128
+ / (-x0 - xs[1])
129
+ - x8
130
+ * (
131
+ x1 * x11
132
+ - x7
133
+ * (x1 * x10 - x5 * (x1 * ys[1] - x3 * ys[0]) / (-x2 - xs[0]))
134
+ / (-x4 - xs[0])
135
+ )
136
+ / (-x6 - xs[0])
137
+ ) / (-x0 - xs[0])
138
+
139
+
140
+ def neville_boys(N, x):
141
+ """Wrapper for Boys function from Neville-interpolation."""
142
+ return neville_gen5(
143
+ x, _BOYS_XS, _BOYS_TABLE[N], step=_BOYS_STEP, factor=_BOYS_FACTOR
144
+ )
145
+
146
+
147
+ def factorial_boys(N, x):
148
+ """Boys function for (big) x > 27.0 as described in the SI of [1]. See also [2].
149
+ ___________
150
+ -N - 1 ╱ -2⋅N - 1
151
+ 2 ⋅√π⋅╲╱ x ⋅(2⋅N - 1)!
152
+
153
+ """
154
+ return FACT2[max(0, 2 * N - 1)] / 2 ** (N + 1) * np.sqrt(PI / x ** (2 * N + 1))
155
+
156
+
157
+ def boys(N, xs):
158
+ """Wrapper for Boys function calculation.
159
+
160
+ Supports scalar values and np.ndarray for 'xs'.
161
+ """
162
+
163
+ def func(N, x):
164
+ return neville_boys(N, x) if (x <= _BOYS_X_ASYM) else factorial_boys(N, x)
165
+
166
+ if isinstance(xs, np.ndarray):
167
+ boys_list = list()
168
+
169
+ with np.nditer(xs) as it:
170
+ for x in it:
171
+ boys_list.append(func(N, x))
172
+ boys_table = np.reshape(boys_list, xs.shape)
173
+ return boys_table
174
+ else:
175
+ return func(N, xs)
176
+
177
+
178
+ def parse_args(args):
179
+ parser = argparse.ArgumentParser()
180
+ parser.add_argument("--table", action="store_true")
181
+ return parser.parse_args(args)
182
+
183
+
184
+ def run():
185
+ args = parse_args(sys.argv[1:])
186
+
187
+ if args.table:
188
+ fn = make_boys_table()
189
+ print(f"Wrote Boys table to '{fn}'.")
190
+
191
+
192
+ if __name__ == "__main__":
193
+ run()
@@ -0,0 +1,176 @@
1
+ """
2
+ Molecular integrals over Gaussian basis functions generated by sympleints.
3
+ See https://github.com/eljost/sympleints for more information.
4
+
5
+ sympleints version: 0.1.dev79+g63f1ef8.d20230515
6
+ symppy version: 1.10.1
7
+
8
+ sympleints was executed with the following arguments:
9
+ lmax = 4
10
+ lauxmax = 6
11
+ write = False
12
+ out_dir = devel_ints
13
+ keys = ['~2c2e', '~3c2e_sph']
14
+ sph = False
15
+ opt_basic = True
16
+ normalize = cgto
17
+ """
18
+
19
+ import numpy
20
+
21
+
22
+ def cart_gto3d_0(ax, da, A, R):
23
+ """3D Cartesian s-Gaussian shell.
24
+ Exponent ax, contraction coeff. da, centered at A, evaluated at R.
25
+
26
+ Generated code; DO NOT modify by hand!"""
27
+
28
+ result = numpy.zeros((1,), dtype=float)
29
+
30
+ # 1 item(s)
31
+ result[0] = numpy.sum(
32
+ da
33
+ * numpy.exp(-ax * ((A[0] - R[0]) ** 2 + (A[1] - R[1]) ** 2 + (A[2] - R[2]) ** 2))
34
+ )
35
+ return result
36
+
37
+
38
+ def cart_gto3d_1(ax, da, A, R):
39
+ """3D Cartesian p-Gaussian shell.
40
+ Exponent ax, contraction coeff. da, centered at A, evaluated at R.
41
+
42
+ Generated code; DO NOT modify by hand!"""
43
+
44
+ result = numpy.zeros((3,), dtype=float)
45
+
46
+ x0 = A[0] - R[0]
47
+ x1 = A[1] - R[1]
48
+ x2 = A[2] - R[2]
49
+ x3 = da * numpy.exp(-ax * (x0**2 + x1**2 + x2**2))
50
+
51
+ # 3 item(s)
52
+ result[0] = numpy.sum(-x0 * x3)
53
+ result[1] = numpy.sum(-x1 * x3)
54
+ result[2] = numpy.sum(-x2 * x3)
55
+ return result
56
+
57
+
58
+ def cart_gto3d_2(ax, da, A, R):
59
+ """3D Cartesian d-Gaussian shell.
60
+ Exponent ax, contraction coeff. da, centered at A, evaluated at R.
61
+
62
+ Generated code; DO NOT modify by hand!"""
63
+
64
+ result = numpy.zeros((6,), dtype=float)
65
+
66
+ x0 = A[0] - R[0]
67
+ x1 = x0**2
68
+ x2 = A[1] - R[1]
69
+ x3 = x2**2
70
+ x4 = A[2] - R[2]
71
+ x5 = x4**2
72
+ x6 = da * numpy.exp(-ax * (x1 + x3 + x5))
73
+ x7 = 0.5773502691896258 * x6
74
+ x8 = x0 * x6
75
+
76
+ # 6 item(s)
77
+ result[0] = numpy.sum(x1 * x7)
78
+ result[1] = numpy.sum(x2 * x8)
79
+ result[2] = numpy.sum(x4 * x8)
80
+ result[3] = numpy.sum(x3 * x7)
81
+ result[4] = numpy.sum(x2 * x4 * x6)
82
+ result[5] = numpy.sum(x5 * x7)
83
+ return result
84
+
85
+
86
+ def cart_gto3d_3(ax, da, A, R):
87
+ """3D Cartesian f-Gaussian shell.
88
+ Exponent ax, contraction coeff. da, centered at A, evaluated at R.
89
+
90
+ Generated code; DO NOT modify by hand!"""
91
+
92
+ result = numpy.zeros((10,), dtype=float)
93
+
94
+ x0 = A[0] - R[0]
95
+ x1 = x0**2
96
+ x2 = A[1] - R[1]
97
+ x3 = x2**2
98
+ x4 = A[2] - R[2]
99
+ x5 = x4**2
100
+ x6 = da * numpy.exp(-ax * (x1 + x3 + x5))
101
+ x7 = 0.2581988897471611 * x6
102
+ x8 = x2 * x6
103
+ x9 = 0.5773502691896258
104
+ x10 = x1 * x9
105
+ x11 = x4 * x6
106
+ x12 = x3 * x9
107
+ x13 = x0 * x6
108
+ x14 = x5 * x9
109
+
110
+ # 10 item(s)
111
+ result[0] = numpy.sum(-(x0**3) * x7)
112
+ result[1] = numpy.sum(-x10 * x8)
113
+ result[2] = numpy.sum(-x10 * x11)
114
+ result[3] = numpy.sum(-x12 * x13)
115
+ result[4] = numpy.sum(-x0 * x4 * x8)
116
+ result[5] = numpy.sum(-x13 * x14)
117
+ result[6] = numpy.sum(-(x2**3) * x7)
118
+ result[7] = numpy.sum(-x11 * x12)
119
+ result[8] = numpy.sum(-x14 * x8)
120
+ result[9] = numpy.sum(-(x4**3) * x7)
121
+ return result
122
+
123
+
124
+ def cart_gto3d_4(ax, da, A, R):
125
+ """3D Cartesian g-Gaussian shell.
126
+ Exponent ax, contraction coeff. da, centered at A, evaluated at R.
127
+
128
+ Generated code; DO NOT modify by hand!"""
129
+
130
+ result = numpy.zeros((15,), dtype=float)
131
+
132
+ x0 = -A[0] + R[0]
133
+ x1 = x0**2
134
+ x2 = -A[1] + R[1]
135
+ x3 = x2**2
136
+ x4 = -A[2] + R[2]
137
+ x5 = x4**2
138
+ x6 = da * numpy.exp(-ax * (x1 + x3 + x5))
139
+ x7 = 0.09759000729485332 * x6
140
+ x8 = 0.2581988897471611 * x6
141
+ x9 = x0**3 * x8
142
+ x10 = 0.3333333333333333 * x6
143
+ x11 = x1 * x10
144
+ x12 = 1.732050807568877
145
+ x13 = x12 * x4
146
+ x14 = x2**3
147
+ x15 = x0 * x8
148
+ x16 = x10 * x3
149
+ x17 = x4**3
150
+
151
+ # 15 item(s)
152
+ result[0] = numpy.sum(x0**4 * x7)
153
+ result[1] = numpy.sum(x2 * x9)
154
+ result[2] = numpy.sum(x4 * x9)
155
+ result[3] = numpy.sum(x11 * x3)
156
+ result[4] = numpy.sum(x11 * x13 * x2)
157
+ result[5] = numpy.sum(x11 * x5)
158
+ result[6] = numpy.sum(x14 * x15)
159
+ result[7] = numpy.sum(x0 * x13 * x16)
160
+ result[8] = numpy.sum(x0 * x10 * x12 * x2 * x5)
161
+ result[9] = numpy.sum(x15 * x17)
162
+ result[10] = numpy.sum(x2**4 * x7)
163
+ result[11] = numpy.sum(x14 * x4 * x8)
164
+ result[12] = numpy.sum(x16 * x5)
165
+ result[13] = numpy.sum(x17 * x2 * x8)
166
+ result[14] = numpy.sum(x4**4 * x7)
167
+ return result
168
+
169
+
170
+ cart_gto3d = {
171
+ (0,): cart_gto3d_0,
172
+ (1,): cart_gto3d_1,
173
+ (2,): cart_gto3d_2,
174
+ (3,): cart_gto3d_3,
175
+ (4,): cart_gto3d_4,
176
+ }