diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..39e4a67 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.py linguist-detectable=true +*.html linguist-detectable=false +*.npz linguist-detectable=false +*.gbf linguist-detectable=false diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0f7582 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# harpy ![](../main/media/aello.jpeg) + +## Hartree-Fock Python + +This is not a *program*, it will run as a program but it wasn't designed with any program structure in mind. It works as a program mainly to facilitate testing but really it is just a collection of quantum chemistry codes. This is not written in Python, the python interpreter understands the code but the style is in no way 'pythonic'. The aim is to write code that can be understood not just by a Python programmer but anyone who understands pseudocode. This means that some of the more syntactically cryptic elements of the langauge have been avoided. For example, there is no einsum. Einsum is very concise and faster than basic Python loops, which are *very* slow, but if you want speed you probably will be programming in another language or using Cython in which case you'll want the explicit loops. + +There are 6 main directories: +* **source** - This contains the .py and .pyx files. Currently they are + 1. adc - algebraic diagrammatic construction + 2. aello - Cython version of the molecular integrals. + 3. atom - atom class. + 4. basis - basis class. + 5. bomd - Born-Oppenheimer molecular dynamics + 6. cc - coupled cluster directory (scc, fcc.ucc and rcc) + 7. ci - configuration interaction. + 8. cogus - cluster operator generator using Sympy + 9. diis - direct inversion of iterative subspace. + 10. eom - equation of motion ccsd and mbpt + 11. ep - electron pair approximation. + 12. fci - full configuration interaction + 13. force - integral derivatives and forces. + 14. h - hydrogenic orbitals + 15. harpy - main run program + 16. integral- molecular integrals and transforms. + 17. mbpt - many-body perturbation diagrams + 18. mp - Moller-Plesset perturbation theory. + 19. ocypete - Cython version of integral derivatives. + 20. post - post SCF, Mulliken, Lowdin, Dipole, Polarizabilities. + 21. project - data files for run. Coordinate geometry. + 22. rESP - restrained Electrostatic Potential + 23. rhf - main resticted Hartree-Fock code. + 24. rohf - restricted open-shell Hartree-Fock + 25. tdhf - time dependent Hartree-Fock + 26. uhf - main unrestricted Hartree-Fock code + 27. view - output control writes to harpy.html. + +* **document** - This contains a .md file for each code module. +* **test** - This has HTML output files for water in sto-3g, dz bases, methane and HHe+ in sto-3g. + These files are provided for comparision with existing programs and for developers wanting to compare their own program results. There are also corresponding .md files which compare harpy results to other programs. + +* **mints** - This contains .npz files containing results from calculation in numpy compressed files. Details of the file contents and how to access them are given in \document\rhf.md + +* **basis** - Basis files from Basis Set Exchange. + +* **codes** - Python code for various cluster methods produced by *cogus* + +For the theory of the code I recommend the book 'Modern Quantum Chemistry' by Szabo & Ostlund, on Github [the Crawford Projects](https://github.com/CrawfordGroup/ProgrammingProjects) and [psi4Numpy](https://github.com/psi4/psi4numpy). My interest in quantum chemistry was renewed by [Josh Goings blog](https://joshuagoings.com/blog/) particularly his article on McMurchie-Davidson integral evaluation, you should also checkout his program on Github [McMurchie-Davidson](https://github.com/jjgoings/McMurchie-Davidson). I hope something here will be useful to you. + +Finally, if you really want to run this as a program then 1) copy (as a minimum) source and basis directories, 2) from **source** directory run setup.py as **python3 setup.py build_ext --inplace install --user** 3) I have my PYTHONPATH set to /harpy/source 4) run harpy.py, again from source directory, as for example **python3 harpy.py -rhf**. You'll need python3, cython, numpy and scipy. The harpy.html output file will also be written to source directory. You can run **python3 harpy.py** with parameters **-rhf|-uhf|-rohf** - if not specified **-rhf** is run, **-v** for a verbose HTML output - if not specified a minimal output is produced, **-m** to produce a mints .npz file - if not specified no file is produced. By default harpy reads the geometry and run specification from the file *project.hpf* in the source directory this can be overridden by specifying an alternative file on the command line as eg **-..\test\water_geometry.hpf** - the file must nave an .hpf extension which must be specified on the command line. The molecule run is by default the first one in the .hpf file, this can be overridden using the command line option **-name**, where *name* is the title of a molecule in the hpf file as it appears in the *name=* specifier. + +__What you will find here__ ++ ADC - Algebraic Diagrammatic Construction - 2nd order PP, IP and EA, 1st order PP and properties ++ aello - cython McMurchie-Davidson integrals, overlap, kinetic, coulomb, 2-electron repulsion, dipole, angular momentum, nabla ++ Atom - Geometry calculations, inertia tensor, principal moments, rotor type, gauge centers, z-matrix ++ Basis - reading BSE files to create basis, normalisation, aufbau orbital assignment ++ BOMD - velocity-Verlet, Beeman or Adams-Moulton integrators, auto-correlation ++ cc(scc) - coupled cluster, CCSD(t), LCCD, CCD, CCSD-Λ, CC2, LCCSD (for loops) ++ cc(fcc) - coupled cluster, CCD, CCSD, CCSD(t), CC2, QCISD, LCCD, LCCSD (einsum) and EOM (einsum and intermediates) ++ cc(ucc) - unitary coupled-cluster (UCC2, UCC3 and UCC(4)) ++ cc(cctn) - coupled-cluster triples, CCSDT-1a, CCSDT-1b, CCSDT-2, CCSDT-3, CCSDT-4, CCSD(T) and CCSDT ++ cc(rcc) -restricted (spin-summed) CCD and CCSD ++ ci - configuration interaction singles, spin-adapted singles/triples, random phase approximation, block Davidson, CIS(D) ++ cogus - code to run COGUS automatically generated codes for CCSD, CCSD(T), CCSDT, CCD, LCCD, LCCSD, CC2, CC3 and CCSD-Λ (einsum) ++ diis - Direct Inversion of Iterative Subspace acceleration for SCF (RHF and UHF) and CCSD ++ eom - equation of motion EOM-CCSD, EOM-MBPT2 (for loops) ++ ep - electron propogator EP2 (spatial and spin), EP3 (spin), Koopman correction by Approximate Green's Function ++ fci - full configuration interaction, determinant representation by string and boolean types ++ force - McMurchie-Davidson 1st derivative integrals (for loops), numerical derivative, geometry optimization ++ h - hydrogenic orbitals, spherical harmonics, Laguerre, Numerov, finite difference. Monte-Carlo ++ integral - McMurchie-Davidson, overlap, kinetic, coulomb, 2-electron repulsion, dipole, angular, nable, electric field and quadrupole (for loops), AO -> MO ++ mbpt - MPn via automatic generation of Hugenholtz diagrams and corresponding Python code to evaluate (einsum) ++ mp - Moller-Plesset, mp2(spin-scaled and natural orbitals), mp3 (for loops), orbital-optimized mp2, Laplace Transform mp2, mp2 unrelaxed density ++ ocepete - cython force integrals ++ post - Mulliken and Lowden charge analysis, Mayer bond order, energy partitioning, dipole, mp2 dipole, quadrupole, polarizabilities, electric field, hyper-polarizability ++ rESP - restrained electrostatic potential ++ rhf - restricted Hartree-Fock, SCF procedure ++ rohf - restricted open-shell Hartree-Fock ++ tdhf - time-dependent Hartree-Fock, Magnus 2 and 4, Pade spectrum, calculation of transition properties, spectrum display, td-CCSD ++ uhf - unrestricted Hartree-Fock ++ view - HTML output, orbital plots + + + + diff --git a/basis/3-21g.gbf b/basis/3-21g.gbf new file mode 100644 index 0000000..5704065 --- /dev/null +++ b/basis/3-21g.gbf @@ -0,0 +1,1216 @@ + + +cartesian + +!---------------------------------------------------------------------- +! Basis Set Exchange +! Version v0.8.12 +! https://www.basissetexchange.org +!---------------------------------------------------------------------- +! Basis set: 3-21G +! Description: 3-21G Split-valence basis set +! Role: orbital +! Version: 1 (Data from Gaussian 09) +!---------------------------------------------------------------------- + + +**** +H 0 +S 2 1.00 + 0.5447178000D+01 0.1562849787D+00 + 0.8245472400D+00 0.9046908767D+00 +S 1 1.00 + 0.1831915800D+00 1.0000000 +**** +He 0 +S 2 1.00 + 0.1362670000D+02 0.1752298718D+00 + 0.1999350000D+01 0.8934823465D+00 +S 1 1.00 + 0.3829930000D+00 1.0000000 +**** +Li 0 +S 3 1.00 + 0.3683820000D+02 0.6966866381D-01 + 0.5481720000D+01 0.3813463493D+00 + 0.1113270000D+01 0.6817026244D+00 +SP 2 1.00 + 0.5402050000D+00 -0.2631264058D+00 0.1615459708D+00 + 0.1022550000D+00 0.1143387418D+01 0.9156628347D+00 +SP 1 1.00 + 0.2856450000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Be 0 +S 3 1.00 + 0.7188760000D+02 0.6442630975D-01 + 0.1072890000D+02 0.3660960554D+00 + 0.2222050000D+01 0.6959341053D+00 +SP 2 1.00 + 0.1295480000D+01 -0.4210640659D+00 0.2051319237D+00 + 0.2688810000D+00 0.1224070192D+01 0.8825276719D+00 +SP 1 1.00 + 0.7735010000D-01 0.1000000000D+01 0.1000000000D+01 +**** +B 0 +S 3 1.00 + 0.1164340000D+03 0.6296046589D-01 + 0.1743140000D+02 0.3633038032D+00 + 0.3680160000D+01 0.6972546223D+00 +SP 2 1.00 + 0.2281870000D+01 -0.3686634773D+00 0.2311519023D+00 + 0.4652480000D+00 0.1199444806D+01 0.8667636337D+00 +SP 1 1.00 + 0.1243280000D+00 0.1000000000D+01 0.1000000000D+01 +**** +C 0 +S 3 1.00 + 0.1722560000D+03 0.6176690738D-01 + 0.2591090000D+02 0.3587940429D+00 + 0.5533350000D+01 0.7007130837D+00 +SP 2 1.00 + 0.3664980000D+01 -0.3958951621D+00 0.2364599466D+00 + 0.7705450000D+00 0.1215834356D+01 0.8606188057D+00 +SP 1 1.00 + 0.1958570000D+00 0.1000000000D+01 0.1000000000D+01 +**** +N 0 +S 3 1.00 + 0.2427660000D+03 0.5986570051D-01 + 0.3648510000D+02 0.3529550030D+00 + 0.7814490000D+01 0.7065130060D+00 +SP 2 1.00 + 0.5425220000D+01 -0.4133000774D+00 0.2379720162D+00 + 0.1149150000D+01 0.1224417267D+01 0.8589530586D+00 +SP 1 1.00 + 0.2832050000D+00 0.1000000000D+01 0.1000000000D+01 +**** +O 0 +S 3 1.00 + 0.3220370000D+03 0.5923939339D-01 + 0.4843080000D+02 0.3514999608D+00 + 0.1042060000D+02 0.7076579210D+00 +SP 2 1.00 + 0.7402940000D+01 -0.4044535832D+00 0.2445861070D+00 + 0.1576200000D+01 0.1221561761D+01 0.8539553735D+00 +SP 1 1.00 + 0.3736840000D+00 0.1000000000D+01 0.1000000000D+01 +**** +F 0 +S 3 1.00 + 0.4138010000D+03 0.5854830293D-01 + 0.6224460000D+02 0.3493080175D+00 + 0.1343400000D+02 0.7096320355D+00 +SP 2 1.00 + 0.9777590000D+01 -0.4073262777D+00 0.2466800032D+00 + 0.2086170000D+01 0.1223137831D+01 0.8523210110D+00 +SP 1 1.00 + 0.4823830000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Ne 0 +S 3 1.00 + 0.5157240000D+03 0.5814303044D-01 + 0.7765380000D+02 0.3479511822D+00 + 0.1681360000D+02 0.7107143721D+00 +SP 2 1.00 + 0.1248300000D+02 -0.4099223208D+00 0.2474599836D+00 + 0.2664510000D+01 0.1224310958D+01 0.8517429435D+00 +SP 1 1.00 + 0.6062500000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Na 0 +S 3 1.00 + 0.5476130000D+03 0.6749111801D-01 + 0.8206780000D+02 0.3935051050D+00 + 0.1769170000D+02 0.6656051776D+00 +SP 3 1.00 + 0.1754070000D+02 -0.1119370290D+00 0.1282330093D+00 + 0.3793980000D+01 0.2546540659D+00 0.4715330341D+00 + 0.9064410000D+00 0.8444172187D+00 0.6042730437D+00 +SP 2 1.00 + 0.5018240000D+00 -0.2196604975D+00 0.9066487958D-02 + 0.6094580000D-01 0.1089122467D+01 0.9972017754D+00 +SP 1 1.00 + 0.2443490000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Mg 0 +S 3 1.00 + 0.6528410000D+03 0.6759814295D-01 + 0.9838050000D+02 0.3917776694D+00 + 0.2129960000D+02 0.6666604374D+00 +SP 3 1.00 + 0.2337270000D+02 -0.1102459524D+00 0.1210138991D+00 + 0.5199530000D+01 0.1841189206D+00 0.4628096140D+00 + 0.1315080000D+01 0.8963986133D+00 0.6069064938D+00 +SP 2 1.00 + 0.6113490000D+00 -0.3611025933D+00 0.2426330920D-01 + 0.1418410000D+00 0.1215055361D+01 0.9866733739D+00 +SP 1 1.00 + 0.4640110000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Al 0 +S 3 1.00 + 0.7757370000D+03 0.6683469647D-01 + 0.1169520000D+03 0.3890609795D+00 + 0.2533260000D+02 0.6694679647D+00 +SP 3 1.00 + 0.2947960000D+02 -0.1079020233D+00 0.1175739856D+00 + 0.6633140000D+01 0.1462450316D+00 0.4611739433D+00 + 0.1726750000D+01 0.9237301994D+00 0.6055349256D+00 +SP 2 1.00 + 0.9461600000D+00 -0.3203269091D+00 0.5193828087D-01 + 0.2025060000D+00 0.1184119664D+01 0.9726596417D+00 +SP 1 1.00 + 0.6390880000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Si 0 +S 3 1.00 + 0.9106550000D+03 0.6608223959D-01 + 0.1373360000D+03 0.3862286469D+00 + 0.2976010000D+02 0.6723793854D+00 +SP 3 1.00 + 0.3667160000D+02 -0.1045110359D+00 0.1133550147D+00 + 0.8317290000D+01 0.1074100369D+00 0.4575780593D+00 + 0.2216450000D+01 0.9514463269D+00 0.6074270787D+00 +SP 2 1.00 + 0.1079130000D+01 -0.3761078795D+00 0.6710299112D-01 + 0.3024220000D+00 0.1251649599D+01 0.9568828734D+00 +SP 1 1.00 + 0.9333920000D-01 0.1000000000D+01 0.1000000000D+01 +**** +P 0 +S 3 1.00 + 0.1054900000D+04 0.6554071355D-01 + 0.1591950000D+03 0.3840360794D+00 + 0.3453040000D+02 0.6745411394D+00 +SP 3 1.00 + 0.4428660000D+02 -0.1021300535D+00 0.1108510025D+00 + 0.1010190000D+02 0.8159224271D-01 0.4564950104D+00 + 0.2739970000D+01 0.9697885076D+00 0.6069360139D+00 +SP 2 1.00 + 0.1218650000D+01 -0.3714960219D+00 0.9158231022D-01 + 0.3955460000D+00 0.1270993496D+01 0.9349241043D+00 +SP 1 1.00 + 0.1228110000D+00 0.1000000000D+01 0.1000000000D+01 +**** +S 0 +S 3 1.00 + 0.1210620000D+04 0.6500708187D-01 + 0.1827470000D+03 0.3820398935D+00 + 0.3966730000D+02 0.6765448113D+00 +SP 3 1.00 + 0.5222360000D+02 -0.1003099399D+00 0.1096459702D+00 + 0.1196290000D+02 0.6508766099D-01 0.4576488757D+00 + 0.3289110000D+01 0.9814544117D+00 0.6042608359D+00 +SP 2 1.00 + 0.1223840000D+01 -0.2860888537D+00 0.1647769947D+00 + 0.4573030000D+00 0.1228059372D+01 0.8708549722D+00 +SP 1 1.00 + 0.1422690000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Cl 0 +S 3 1.00 + 0.1376400000D+04 0.6458270228D-01 + 0.2078570000D+03 0.3803630134D+00 + 0.4515540000D+02 0.6781900239D+00 +SP 3 1.00 + 0.6080140000D+02 -0.9876395275D-01 0.1085980585D+00 + 0.1397650000D+02 0.5113382731D-01 0.4586822471D+00 + 0.3887100000D+01 0.9913375295D+00 0.6019623243D+00 +SP 2 1.00 + 0.1352990000D+01 -0.2224014841D+00 0.2192157972D+00 + 0.5269550000D+00 0.1182522574D+01 0.8223202393D+00 +SP 1 1.00 + 0.1667140000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Ar 0 +S 3 1.00 + 0.1553710000D+04 0.6417071258D-01 + 0.2346780000D+03 0.3787970742D+00 + 0.5101210000D+02 0.6797521332D+00 +SP 3 1.00 + 0.7004530000D+02 -0.9746613989D-01 0.1076190408D+00 + 0.1614730000D+02 0.3905691599D-01 0.4595761744D+00 + 0.4534920000D+01 0.9999164093D+00 0.6000412277D+00 +SP 2 1.00 + 0.1542090000D+01 -0.1768655685D+00 0.2556870130D+00 + 0.6072670000D+00 0.1146897202D+01 0.7898420401D+00 +SP 1 1.00 + 0.1953730000D+00 0.1000000000D+01 0.1000000000D+01 +**** +K 0 +S 3 1.00 + 0.1721175500D+04 0.6487469617D-01 + 0.2600163300D+03 0.3808592775D+00 + 0.5662455400D+02 0.6773680600D+00 +SP 3 1.00 + 0.7155720000D+02 -0.1093428919D+00 0.1339654251D+00 + 0.1543894240D+02 0.1130640319D+00 0.5302672723D+00 + 0.4474551050D+01 0.9462575025D+00 0.5117991842D+00 +SP 3 1.00 + 0.4121275290D+01 -0.2699729532D+00 0.1994922290D-01 + 0.1188620640D+01 0.3646322562D+00 0.4340213019D+00 + 0.3756738350D+00 0.8107532645D+00 0.6453225709D+00 +SP 2 1.00 + 0.2445765580D+00 -0.2688250168D+00 0.3081035470D-03 + 0.3897174940D-01 0.1128982555D+01 0.9998787160D+00 +SP 1 1.00 + 0.1606254630D-01 0.1000000000D+01 0.1000000000D+01 +**** +Ca 0 +S 3 1.00 + 0.1915434800D+04 0.6462369791D-01 + 0.2895332400D+03 0.3798375877D+00 + 0.6310635200D+02 0.6783293781D+00 +SP 3 1.00 + 0.8039744200D+02 -0.1093027800D+00 0.1354331590D+00 + 0.1733075030D+02 0.1088995760D+00 0.5372214579D+00 + 0.5083623800D+01 0.9492767537D+00 0.5018043829D+00 +SP 3 1.00 + 0.4782229420D+01 -0.2816073771D+00 0.1900927729D-01 + 0.1462557920D+01 0.3410510241D+00 0.4360377329D+00 + 0.4792229560D+00 0.8381044043D+00 0.6386709258D+00 +SP 2 1.00 + 0.4396824240D+00 -0.2697048570D+00 0.3081105070D-03 + 0.5913040160D-01 0.1113292710D+01 0.9998964139D+00 +SP 1 1.00 + 0.2389701170D-01 0.1000000000D+01 0.1000000000D+01 +**** +Sc 0 +S 3 1.00 + 0.2119887400D+04 0.6442079848D-01 + 0.3204298600D+03 0.3791602911D+00 + 0.6989892800D+02 0.6789628840D+00 +SP 3 1.00 + 0.8976450310D+02 -0.1093837050D+00 0.1363278069D+00 + 0.1938509550D+02 0.1050698720D+00 0.5418597835D+00 + 0.5731423090D+01 0.9522045460D+00 0.4950550715D+00 +SP 3 1.00 + 0.5491937640D+01 -0.2852107400D+00 0.1761355971D-01 + 0.1743741510D+01 0.3241555420D+00 0.4336448242D+00 + 0.5662273420D+00 0.8565920529D+00 0.6425506952D+00 +SP 2 1.00 + 0.5168015080D+00 -0.2626779794D+00 0.3270566751D-03 + 0.6721403840D-01 0.1108078977D+01 0.9998935093D+00 +SP 1 1.00 + 0.2598451790D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.5722214800D+01 0.2652364479D+00 + 0.1360849500D+01 0.8558605398D+00 +D 1 1.00 + 0.3226516200D+00 1.0000000 +**** +Ti 0 +S 3 1.00 + 0.2335019800D+04 0.6421660118D-01 + 0.3530441500D+03 0.3784120069D+00 + 0.7705845200D+02 0.6796813125D+00 +SP 3 1.00 + 0.9957387050D+02 -0.1094719070D+00 0.1372966030D+00 + 0.2154670630D+02 0.1019426710D+00 0.5458753479D+00 + 0.6413965470D+01 0.9546223767D+00 0.4890680879D+00 +SP 3 1.00 + 0.6238279440D+01 -0.2861371630D+00 0.1923665080D-01 + 0.1996107510D+01 0.3218277600D+00 0.4404421590D+00 + 0.6464898720D+00 0.8595510999D+00 0.6356195070D+00 +SP 2 1.00 + 0.5732848810D+00 -0.2424499988D+00 0.2920157911D-03 + 0.7311942300D-01 0.1100074629D+01 0.9999066954D+00 +SP 1 1.00 + 0.2653793780D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.7083666100D+01 0.2629209951D+00 + 0.1709634100D+01 0.8557720832D+00 +D 1 1.00 + 0.4141224800D+00 1.0000000 +**** +V 0 +S 3 1.00 + 0.2563877200D+04 0.6394750087D-01 + 0.3875340400D+03 0.3775940051D+00 + 0.8459822900D+02 0.6805421093D+00 +SP 3 1.00 + 0.1097938210D+03 -0.1098355310D+00 0.1384209690D+00 + 0.2376921260D+02 0.1007070390D+00 0.5504894170D+00 + 0.7122961440D+01 0.9556327203D+00 0.4824165320D+00 +SP 3 1.00 + 0.6981204030D+01 -0.2884588118D+00 0.2182075430D-01 + 0.2219839200D+01 0.3364356998D+00 0.4567615759D+00 + 0.7198030150D+00 0.8481903234D+00 0.6186749609D+00 +SP 2 1.00 + 0.6312619520D+00 -0.2364898790D+00 0.1899535820D-03 + 0.8006166240D-01 0.1097720655D+01 0.9999396449D+00 +SP 1 1.00 + 0.2886489170D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.8342916900D+01 0.2640620000D+00 + 0.2032944100D+01 0.8539664831D+00 +D 1 1.00 + 0.4957115400D+00 1.0000000 +**** +Cr 0 +S 3 1.00 + 0.2798294400D+04 0.6382379506D-01 + 0.4231369600D+03 0.3770839708D+00 + 0.9243886100D+02 0.6809888473D+00 +SP 3 1.00 + 0.1202805620D+03 -0.1177790010D+00 0.1398781830D+00 + 0.2603727080D+02 0.1014311230D+00 0.5559834482D+00 + 0.7844172480D+01 0.9571981377D+00 0.4748183482D+00 +SP 3 1.00 + 0.7793275650D+01 -0.2888567131D+00 0.2218470920D-01 + 0.2497196130D+01 0.3351146841D+00 0.4616249951D+00 + 0.8051418920D+00 0.8502480973D+00 0.6145386131D+00 +SP 2 1.00 + 0.7039205640D+00 -0.2322507691D+00 0.1799644840D-03 + 0.8616195330D-01 0.1093671325D+01 0.9999447611D+00 +SP 1 1.00 + 0.3219881930D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.9625338600D+01 0.2655959100D+00 + 0.2362264300D+01 0.8521556801D+00 +D 1 1.00 + 0.5770944000D+00 1.0000000 +**** +Mn 0 +S 3 1.00 + 0.3041685900D+04 0.6374489896D-01 + 0.4600900600D+03 0.3767489939D+00 + 0.1005957700D+03 0.6812473889D+00 +SP 3 1.00 + 0.1317673140D+03 -0.1102963670D+00 0.1404540159D+00 + 0.2856915210D+02 0.9818963362D-01 0.5578022288D+00 + 0.8660501060D+01 0.9576594692D+00 0.4715006178D+00 +SP 3 1.00 + 0.8569080670D+01 -0.2917135460D+00 0.2422378882D-01 + 0.2768178450D+01 0.3439630141D+00 0.4686597613D+00 + 0.8872882100D+00 0.8451974601D+00 0.6074211264D+00 +SP 2 1.00 + 0.7674426160D+00 -0.2300038851D+00 0.3078885511D-03 + 0.9202526740D-01 0.1091450305D+01 0.9999073623D+00 +SP 1 1.00 + 0.3326489750D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1106883900D+02 0.2652718099D+00 + 0.2730706800D+01 0.8517944796D+00 +D 1 1.00 + 0.6685094800D+00 1.0000000 +**** +Fe 0 +S 3 1.00 + 0.3299183700D+04 0.6358589971D-01 + 0.4990885600D+03 0.3762015983D+00 + 0.1091613700D+03 0.6817844969D+00 +SP 3 1.00 + 0.1434651730D+03 -0.1105517190D+00 0.1411006120D+00 + 0.3116857540D+02 0.9684680919D-01 0.5603873671D+00 + 0.9483612400D+01 0.9587974389D+00 0.4676443540D+00 +SP 3 1.00 + 0.9464564900D+01 -0.2920555188D+00 0.2376201300D-01 + 0.3100373440D+01 0.3375235918D+00 0.4689112821D+00 + 0.9864930090D+00 0.8519416294D+00 0.6083112671D+00 +SP 2 1.00 + 0.8534123410D+00 -0.2279441130D+00 -0.4262652045D-03 + 0.9881221800D-01 0.1088287380D+01 0.1000123759D+01 +SP 1 1.00 + 0.3644213760D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1235448930D+02 0.2686109881D+00 + 0.3055605300D+01 0.8492716654D+00 +D 1 1.00 + 0.7385908900D+00 1.0000000 +**** +Co 0 +S 3 1.00 + 0.3564762200D+04 0.6348660328D-01 + 0.5393908500D+03 0.3758181194D+00 + 0.1180448900D+03 0.6821217353D+00 +SP 3 1.00 + 0.1554382480D+03 -0.1109867210D+00 0.1420641590D+00 + 0.3381561360D+02 0.9676741612D-01 0.5634438691D+00 + 0.1033323420D+02 0.9589921222D+00 0.4630244281D+00 +SP 3 1.00 + 0.1038152410D+02 -0.2922621778D+00 0.2631326050D-01 + 0.3382714340D+01 0.3432507278D+00 0.4769170349D+00 + 0.1076953850D+01 0.8469634444D+00 0.5991542759D+00 +SP 2 1.00 + 0.9090155490D+00 -0.2174599202D+00 0.2284428400D-03 + 0.1050405600D+00 0.1084998461D+01 0.9999337380D+00 +SP 1 1.00 + 0.3725657630D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1374069800D+02 0.2709549812D+00 + 0.3408982900D+01 0.8473420555D+00 +D 1 1.00 + 0.8186409500D+00 1.0000000 +**** +Ni 0 +S 3 1.00 + 0.3848005100D+04 0.6326609847D-01 + 0.5820306900D+03 0.3751709909D+00 + 0.1273674400D+03 0.6828237835D+00 +SP 3 1.00 + 0.1682895830D+03 -0.1111150760D+00 0.1424904900D+00 + 0.3665633040D+02 0.9532380108D-01 0.5655469960D+00 + 0.1123212360D+02 0.9601612858D+00 0.4599925870D+00 +SP 3 1.00 + 0.1135877310D+02 -0.2920603921D+00 0.2613762460D-01 + 0.3738846220D+01 0.3375407231D+00 0.4765979969D+00 + 0.1182462700D+01 0.8525329813D+00 0.6003798419D+00 +SP 2 1.00 + 0.9889038410D+00 -0.2136872217D+00 0.2943514090D-03 + 0.1110249640D+00 0.1081932884D+01 0.9999170232D+00 +SP 1 1.00 + 0.3925822490D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1522069400D+02 0.2726059660D+00 + 0.3786020100D+01 0.8459279070D+00 +D 1 1.00 + 0.9045573900D+00 1.0000000 +**** +Cu 0 +S 3 1.00 + 0.4134302200D+04 0.6318780134D-01 + 0.6254912200D+03 0.3748448080D+00 + 0.1369555600D+03 0.6831002145D+00 +SP 3 1.00 + 0.1814960330D+03 -0.1113198390D+00 0.1430844431D+00 + 0.3957431190D+02 0.9448678911D-01 0.5677561013D+00 + 0.1216246380D+02 0.9608790191D+00 0.4567141082D+00 +SP 3 1.00 + 0.1235111490D+02 -0.2922230629D+00 0.2772713539D-01 + 0.4049651020D+01 0.3429908579D+00 0.4835244178D+00 + 0.1279225380D+01 0.8479462667D+00 0.5929778748D+00 +SP 2 1.00 + 0.1048299940D+01 -0.2054980895D+00 0.1984900050D-03 + 0.1171180220D+00 0.1079158637D+01 0.9999443279D+00 +SP 1 1.00 + 0.4054498690D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1675937600D+02 0.2741125481D+00 + 0.4178976900D+01 0.8446244862D+00 +D 1 1.00 + 0.9943270400D+00 1.0000000 +**** +Zn 0 +S 3 1.00 + 0.4432288500D+04 0.6309280449D-01 + 0.6706601200D+03 0.3745038267D+00 + 0.1469024500D+03 0.6834160486D+00 +SP 3 1.00 + 0.1950041870D+03 -0.1116283369D+00 0.1438054630D+00 + 0.4256889150D+02 0.9433552835D-01 0.5700018768D+00 + 0.1312143450D+02 0.9611002465D+00 0.4533118549D+00 +SP 3 1.00 + 0.1340230550D+02 -0.2917811139D+00 0.2870528232D-01 + 0.4399906380D+01 0.3426145478D+00 0.4862514674D+00 + 0.1385147570D+01 0.8482839836D+00 0.5902352525D+00 +SP 2 1.00 + 0.1121558010D+01 -0.2023706257D+00 0.3440940799D-03 + 0.1229436400D+00 0.1077034778D+01 0.9999052838D+00 +SP 1 1.00 + 0.4219327240D-01 0.1000000000D+01 0.1000000000D+01 +D 2 1.00 + 0.1836820200D+02 0.2753856309D+00 + 0.4591304100D+01 0.8434772897D+00 +D 1 1.00 + 0.1090202600D+01 1.0000000 +**** +Ga 0 +S 3 1.00 + 0.4751897900D+04 0.6283960439D-01 + 0.7189205400D+03 0.3736112261D+00 + 0.1574459200D+03 0.6843626478D+00 +SP 3 1.00 + 0.2095834380D+03 -0.1115161570D+00 0.1442658399D+00 + 0.4569171330D+02 0.9269636382D-01 0.5731775198D+00 + 0.1413296880D+02 0.9622870572D+00 0.4490857768D+00 +SP 3 1.00 + 0.1459953900D+02 0.2910292410D+00 0.2656185960D-01 + 0.4860842130D+01 -0.3231875870D+00 0.4833136630D+00 + 0.1549110700D+01 -0.8643910510D+00 0.5924303820D+00 +SP 2 1.00 + 0.1267942770D+01 -0.2851306292D+00 0.3018346401D-01 + 0.1883995380D+00 0.1128022057D+01 0.9884658284D+00 +SP 1 1.00 + 0.5723675570D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2129253000D+02 0.1619895026D+00 + 0.5393166200D+01 0.5116739083D+00 + 0.1333882800D+01 0.5898732096D+00 +**** +Ge 0 +S 3 1.00 + 0.5073749900D+04 0.6272490086D-01 + 0.7677241700D+03 0.3731671051D+00 + 0.1681888100D+03 0.6847867093D+00 +SP 3 1.00 + 0.2244360270D+03 -0.1115149850D+00 0.1446395310D+00 + 0.4895542850D+02 0.9120021360D-01 0.5753795618D+00 + 0.1518370510D+02 0.9634490850D+00 0.4459948609D+00 +SP 3 1.00 + 0.1591257150D+02 -0.2895652279D+00 0.2297302161D-01 + 0.5441436790D+01 0.2938828279D+00 0.4732446592D+00 + 0.1742603230D+01 0.8891993228D+00 0.6032778983D+00 +SP 2 1.00 + 0.1466538460D+01 -0.3967339034D+00 0.2789293999D-01 + 0.2630933590D+00 0.1190669835D+01 0.9874900937D+00 +SP 1 1.00 + 0.8482071760D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2432142100D+02 0.1577984994D+00 + 0.6223813500D+01 0.5114921980D+00 + 0.1588737500D+01 0.5857702977D+00 +**** +As 0 +S 3 1.00 + 0.5407613800D+04 0.6260110038D-01 + 0.8181743600D+03 0.3727790022D+00 + 0.1792656900D+03 0.6851842041D+00 +SP 3 1.00 + 0.2377782880D+03 -0.1128384290D+00 0.1496797750D+00 + 0.5425662270D+02 0.8722743790D-01 0.5623222652D+00 + 0.1632802910D+02 0.9681882750D+00 0.4593234971D+00 +SP 3 1.00 + 0.1710185320D+02 -0.2914536779D+00 0.2568559179D-01 + 0.5805144110D+01 0.2969618919D+00 0.4833968069D+00 + 0.1902084190D+01 0.8865791037D+00 0.5887853959D+00 +SP 2 1.00 + 0.1675403610D+01 -0.5057609655D+00 0.2528246599D-01 + 0.3416557060D+00 0.1251764524D+01 0.9874328358D+00 +SP 1 1.00 + 0.1136303120D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2743720900D+02 0.1544952053D+00 + 0.7084044000D+01 0.5114318176D+00 + 0.1855822600D+01 0.5821935201D+00 +**** +Se 0 +S 3 1.00 + 0.5751321500D+04 0.6249340240D-01 + 0.8702572100D+03 0.3723683143D+00 + 0.1907294900D+03 0.6855799263D+00 +SP 3 1.00 + 0.2550163960D+03 -0.1119076329D+00 0.1461488110D+00 + 0.5557653980D+02 0.9099935806D-01 0.5813713921D+00 + 0.1735661220D+02 0.9636681735D+00 0.4374597450D+00 +SP 3 1.00 + 0.1844567560D+02 -0.2917925089D+00 0.2442140969D-01 + 0.6328758670D+01 0.2846211839D+00 0.4833648278D+00 + 0.2096757630D+01 0.8973051926D+00 0.5879038048D+00 +SP 2 1.00 + 0.1872633330D+01 -0.5677638749D+00 0.2825548500D-01 + 0.4174736440D+00 0.1294126620D+01 0.9849059642D+00 +SP 1 1.00 + 0.1370906930D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3062746400D+02 0.1519857962D+00 + 0.7971276400D+01 0.5116402873D+00 + 0.2134809700D+01 0.5786935856D+00 +**** +Br 0 +S 3 1.00 + 0.6103289900D+04 0.6241750453D-01 + 0.9236974300D+03 0.3720414270D+00 + 0.2025203100D+03 0.6858728498D+00 +SP 3 1.00 + 0.2706015060D+03 -0.1121486999D+00 0.1477513840D+00 + 0.5825357430D+02 0.9314450925D-01 0.6010556940D+00 + 0.1846932670D+02 0.9616793735D+00 0.4128703850D+00 +SP 3 1.00 + 0.1976142580D+02 -0.2938703890D+00 0.2500708519D-01 + 0.6821751780D+01 0.2802663020D+00 0.4866098019D+00 + 0.2291628830D+01 0.9020357111D+00 0.5824233508D+00 +SP 2 1.00 + 0.2131205580D+01 -0.6518030629D+00 0.2870833401D-01 + 0.4993537140D+00 0.1336012176D+01 0.9840695395D+00 +SP 1 1.00 + 0.1647636630D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3396509700D+02 0.1496665998D+00 + 0.8900831200D+01 0.5117474993D+00 + 0.2428436000D+01 0.5759147992D+00 +**** +Kr 0 +S 3 1.00 + 0.6446630700D+04 0.6253980013D-01 + 0.9768757000D+03 0.3721075008D+00 + 0.2144795500D+03 0.6856107014D+00 +SP 3 1.00 + 0.2876446250D+03 -0.1120607140D+00 0.1475279021D+00 + 0.6262008730D+02 0.9013913269D-01 0.5868918503D+00 + 0.1969174380D+02 0.9643301108D+00 0.4295067732D+00 +SP 3 1.00 + 0.2112321280D+02 -0.2958173240D+00 0.2606954870D-01 + 0.7303285520D+01 0.2792166830D+00 0.4922497550D+00 + 0.2488849890D+01 0.9037303051D+00 0.5742737490D+00 +SP 2 1.00 + 0.2361373760D+01 -0.7202454254D+00 0.2877517760D-01 + 0.5860160490D+00 0.1376846015D+01 0.9833390701D+00 +SP 1 1.00 + 0.1944473480D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3736810300D+02 0.1479466054D+00 + 0.9854313100D+01 0.5121719185D+00 + 0.2732795500D+01 0.5729498207D+00 +**** +Rb 0 +S 3 1.00 + 0.6816722500D+04 0.6249620050D-01 + 0.1033000700D+04 0.3719500029D+00 + 0.2269086100D+03 0.6857293054D+00 +SP 3 1.00 + 0.3041283190D+03 -0.1123296170D+00 0.1484408888D+00 + 0.6626058030D+02 0.9075080238D-01 0.5891247423D+00 + 0.2091944730D+02 0.9639409908D+00 0.4258251255D+00 +SP 3 1.00 + 0.2246532550D+02 -0.3004849970D+00 0.2445409561D-01 + 0.7877468360D+01 0.2783565750D+00 0.4944538491D+00 + 0.2705271250D+01 0.9076098970D+00 0.5718567161D+00 +SP 3 1.00 + 0.2692115730D+01 -0.3311623420D+00 0.1190050559D-01 + 0.7230562880D+00 0.5096991340D+00 0.4951731447D+00 + 0.2598382590D+00 0.6982461430D+00 0.5737244147D+00 +SP 2 1.00 + 0.1897140210D+00 -0.2711927264D+00 0.3081009049D-03 + 0.3399725700D-01 0.1141549502D+01 0.9998653826D+00 +SP 1 1.00 + 0.1471231270D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.4086603100D+02 0.1466037007D+00 + 0.1084088500D+02 0.5127252025D+00 + 0.3050834100D+01 0.5699804027D+00 +**** +Sr 0 +S 3 1.00 + 0.7215473500D+04 0.6228180400D-01 + 0.1092851900D+04 0.3713101238D+00 + 0.2399818200D+03 0.6864439441D+00 +SP 3 1.00 + 0.3221245830D+03 -0.1122353181D+00 0.1488368389D+00 + 0.7009045940D+02 0.8954359874D-01 0.5919465646D+00 + 0.2217640630D+02 0.9648134634D+00 0.4221715147D+00 +SP 3 1.00 + 0.2392763060D+02 -0.3024718119D+00 0.2483697501D-01 + 0.8475113790D+01 0.2700840889D+00 0.4934775082D+00 + 0.2942934140D+01 0.9159199867D+00 0.5709829252D+00 +SP 3 1.00 + 0.2940966360D+01 -0.3519845979D+00 0.9723335540D-02 + 0.8523558630D+00 0.4972545548D+00 0.4983219640D+00 + 0.3215374960D+00 0.7238597817D+00 0.5650561210D+00 +SP 2 1.00 + 0.3480419380D+00 -0.2851468337D+00 0.3081096440D-03 + 0.4817714650D-01 0.1120939249D+01 0.9998935359D+00 +SP 1 1.00 + 0.2180335040D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.4456611500D+02 0.1451270982D+00 + 0.1188148900D+02 0.5130676936D+00 + 0.3387557900D+01 0.5676639929D+00 +**** +Y 0 +S 3 1.00 + 0.7646421000D+04 0.6189049853D-01 + 0.1156862600D+04 0.3702067912D+00 + 0.2537151800D+03 0.6877559836D+00 +SP 3 1.00 + 0.3418539800D+03 -0.1119000560D+00 0.1485716599D+00 + 0.7420986040D+02 0.8680523582D-01 0.5943066506D+00 + 0.2351352040D+02 0.9667846673D+00 0.4196039557D+00 +SP 3 1.00 + 0.1886260390D+02 -0.1477873303D+01 -0.7041406643D+00 + 0.1645405200D+02 0.1347258752D+01 0.1057861620D+01 + 0.3484499530D+01 0.1006230782D+01 0.7393821373D+00 +SP 3 1.00 + 0.3221732720D+01 -0.3699579711D+00 0.2494434829D-02 + 0.1050704660D+01 0.4308638621D+00 0.4537622898D+00 + 0.3925922690D+00 0.8020873682D+00 0.6130678517D+00 +SP 2 1.00 + 0.4327637070D+00 -0.3464582050D+00 -0.1336559069D-02 + 0.5701219000D-01 0.1132776617D+01 0.1000439599D+01 +SP 1 1.00 + 0.2375370010D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.5035375300D+02 0.1367955945D+00 + 0.1353078000D+02 0.5019061798D+00 + 0.3944996000D+01 0.5788597767D+00 +D 2 1.00 + 0.1530137400D+01 0.3384032639D+00 + 0.6300673400D+00 0.7293289459D+00 +D 1 1.00 + 0.2165884300D+00 1.0000000 +**** +Zr 0 +S 3 1.00 + 0.8084591900D+04 0.6157760047D-01 + 0.1221667800D+04 0.3693989028D+00 + 0.2676917300D+03 0.6887280052D+00 +SP 3 1.00 + 0.3610211930D+03 -0.1119067180D+00 0.1487616111D+00 + 0.7830494800D+02 0.8583992663D-01 0.5965690004D+00 + 0.2484522920D+02 0.9675130223D+00 0.4167848772D+00 +SP 3 1.00 + 0.2000627700D+02 -0.1544348624D+01 -0.7568479798D+00 + 0.1757414640D+02 0.1409596044D+01 0.1112090061D+01 + 0.3742985070D+01 0.1009349253D+01 0.7368023798D+00 +SP 3 1.00 + 0.3554788440D+01 -0.3793873088D+00 0.2599454819D-02 + 0.1178992360D+01 0.4232847258D+00 0.4599758038D+00 + 0.4446965590D+00 0.8140675616D+00 0.6058485068D+00 +SP 2 1.00 + 0.5050488190D+00 -0.3295117829D+00 -0.1248930019D-02 + 0.6211612260D-01 0.1120709453D+01 0.1000384339D+01 +SP 1 1.00 + 0.2557955310D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.5472323200D+02 0.1348239976D+00 + 0.1477416400D+02 0.5005543911D+00 + 0.4358961200D+01 0.5787822897D+00 +D 2 1.00 + 0.1862842400D+01 0.2850320290D+00 + 0.6433135400D+00 0.7972073721D+00 +D 1 1.00 + 0.1993953800D+00 1.0000000 +**** +Nb 0 +S 3 1.00 + 0.8466517300D+04 0.6180380361D-01 + 0.1281261100D+04 0.3698049216D+00 + 0.2812310800D+03 0.6880795402D+00 +SP 3 1.00 + 0.3794728780D+03 -0.1121062840D+00 0.1496673749D+00 + 0.8233588790D+02 0.8650278521D-01 0.5987182126D+00 + 0.2622247550D+02 0.9670573781D+00 0.4132381987D+00 +SP 3 1.00 + 0.2116294500D+02 -0.1555130539D+01 -0.7554622431D+00 + 0.1858978260D+02 0.1417938759D+01 0.1113966263D+01 + 0.4009981040D+01 0.1010619909D+01 0.7327671540D+00 +SP 3 1.00 + 0.3836375100D+01 -0.3891037463D+00 0.3290346942D-02 + 0.1303325200D+01 0.4349695854D+00 0.4716450753D+00 + 0.4934306400D+00 0.8115898937D+00 0.5936990064D+00 +SP 2 1.00 + 0.5723734170D+00 -0.3156093568D+00 -0.1133017876D-02 + 0.6820320050D-01 0.1114047019D+01 0.1000338056D+01 +SP 1 1.00 + 0.2715715000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.5901218700D+02 0.1337104078D+00 + 0.1601279000D+02 0.5000390291D+00 + 0.4777184600D+01 0.5775384336D+00 +D 2 1.00 + 0.1970443400D+01 0.3106808999D+00 + 0.6619346900D+00 0.7800691408D+00 +D 1 1.00 + 0.2059971900D+00 1.0000000 +**** +Mo 0 +S 3 1.00 + 0.8899491100D+04 0.6170640004D-01 + 0.1346763700D+04 0.3694536002D+00 + 0.2956351900D+03 0.6884343004D+00 +SP 3 1.00 + 0.3993138770D+03 -0.1121440250D+00 0.1500665160D+00 + 0.8659355800D+02 0.8601148352D-01 0.6007695369D+00 + 0.2763903930D+02 0.9674334852D+00 0.4103864710D+00 +SP 3 1.00 + 0.2250291540D+02 -0.1422306435D+01 -0.6680660696D+00 + 0.1949170890D+02 0.1284184615D+01 0.1030345622D+01 + 0.4278180270D+01 0.1010866226D+01 0.7283479918D+00 +SP 3 1.00 + 0.4163020710D+01 -0.3964232509D+00 0.2962629458D-02 + 0.1435305440D+01 0.4370791899D+00 0.4791471367D+00 + 0.5437821140D+00 0.8148461598D+00 0.5864869047D+00 +SP 2 1.00 + 0.6318014250D+00 -0.3033617372D+00 -0.1079133201D-02 + 0.7325791380D-01 0.1108413491D+01 0.1000313431D+01 +SP 1 1.00 + 0.2802514570D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.6378044700D+02 0.1317387929D+00 + 0.1737357600D+02 0.4985315731D+00 + 0.5230783900D+01 0.5781774688D+00 +D 2 1.00 + 0.2270936700D+01 0.3112644110D+00 + 0.7546529900D+00 0.7810341741D+00 +D 1 1.00 + 0.2351422000D+00 1.0000000 +**** +Tc 0 +S 3 1.00 + 0.9329481900D+04 0.6171189806D-01 + 0.1412505700D+04 0.3693369884D+00 + 0.3102643400D+03 0.6884723783D+00 +SP 3 1.00 + 0.4188175390D+03 -0.1124024540D+00 0.1500718580D+00 + 0.9125078120D+02 0.8531816312D-01 0.6000567119D+00 + 0.2911211720D+02 0.9681773902D+00 0.4109855669D+00 +SP 3 1.00 + 0.2591064190D+02 -0.1380446280D+01 -0.1655271309D+01 + 0.2326769750D+02 0.1197899670D+01 0.1986020459D+01 + 0.4707083150D+01 0.1052649060D+01 0.7290338916D+00 +SP 3 1.00 + 0.4441137880D+01 -0.4041144308D+00 0.1229062020D-01 + 0.1595639370D+01 0.4398378538D+00 0.4632067049D+00 + 0.5955597810D+00 0.8219360036D+00 0.5983825809D+00 +SP 2 1.00 + 0.6738811570D+00 -0.2700027944D+00 -0.9197675761D-03 + 0.7724070220D-01 0.1099150208D+01 0.1000264166D+01 +SP 1 1.00 + 0.2869556450D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.6878374900D+02 0.1296930121D+00 + 0.1880389500D+02 0.4966191463D+00 + 0.5705228000D+01 0.5795466541D+00 +D 2 1.00 + 0.2599163900D+01 0.3092194710D+00 + 0.8622757400D+00 0.7829056330D+00 +D 1 1.00 + 0.2706072700D+00 1.0000000 +**** +Ru 0 +S 3 1.00 + 0.9786161500D+04 0.6160520028D-01 + 0.1481476800D+04 0.3689816016D+00 + 0.3254122300D+03 0.6888451031D+00 +SP 3 1.00 + 0.4398665150D+03 -0.1123912090D+00 0.1503790650D+00 + 0.9576273480D+02 0.8469449409D-01 0.6019294290D+00 + 0.3060565860D+02 0.9686379149D+00 0.4084639320D+00 +SP 3 1.00 + 0.2727737250D+02 -0.1395552988D+01 -0.1668617781D+01 + 0.2451081690D+02 0.1210851848D+01 0.2002798882D+01 + 0.5008945520D+01 0.1054045099D+01 0.7251435116D+00 +SP 3 1.00 + 0.4765811660D+01 -0.4103626531D+00 0.1127417340D-01 + 0.1734531270D+01 0.4480025071D+00 0.4727032429D+00 + 0.6466354760D+00 0.8198082862D+00 0.5898430219D+00 +SP 2 1.00 + 0.7406620240D+00 -0.2639655063D+00 -0.7620441046D-03 + 0.8217095980D-01 0.1094857035D+01 0.1000211909D+01 +SP 1 1.00 + 0.3009659400D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.7398329900D+02 0.1277597962D+00 + 0.2028148900D+02 0.4951473852D+00 + 0.6194298100D+01 0.5806551827D+00 +D 2 1.00 + 0.2889107600D+01 0.3159938031D+00 + 0.9539609900D+00 0.7780655611D+00 +D 1 1.00 + 0.2958807000D+00 1.0000000 +**** +Rh 0 +S 3 1.00 + 0.1021771400D+05 0.6173240004D-01 + 0.1548411600D+04 0.3691533002D+00 + 0.3404990300D+03 0.6885138004D+00 +SP 3 1.00 + 0.4607592610D+03 -0.1124461021D+00 0.1508582420D+00 + 0.1003289400D+03 0.8438112985D-01 0.6035138860D+00 + 0.3213971350D+02 0.9689016196D+00 0.4060249090D+00 +SP 3 1.00 + 0.2879328560D+02 -0.1404090896D+01 -0.1712218278D+01 + 0.2591768470D+02 0.1216168826D+01 0.2047603377D+01 + 0.5320640440D+01 0.1056555307D+01 0.7229831249D+00 +SP 3 1.00 + 0.5109748290D+01 -0.4126468676D+00 0.9374063923D-02 + 0.1875414330D+01 0.4518853325D+00 0.4815543736D+00 + 0.6995577880D+00 0.8188988952D+00 0.5822312356D+00 +SP 2 1.00 + 0.8005710940D+00 -0.2553480035D+00 -0.7759711433D-03 + 0.8732134050D-01 0.1091308112D+01 0.1000212129D+01 +SP 1 1.00 + 0.3140693350D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.7925597300D+02 0.1261896071D+00 + 0.2178945400D+02 0.4939541278D+00 + 0.6697518100D+01 0.5813296328D+00 +D 2 1.00 + 0.3190908300D+01 0.3210399278D+00 + 0.1054575200D+01 0.7738518424D+00 +D 1 1.00 + 0.3260790600D+00 1.0000000 +**** +Pd 0 +S 3 1.00 + 0.1072874000D+05 0.6142950043D-01 + 0.1624073900D+04 0.3683282026D+00 + 0.3567937500D+03 0.6895025048D+00 +SP 3 1.00 + 0.4824782940D+03 -0.1126789240D+00 0.1510792641D+00 + 0.1050589550D+03 0.8461196572D-01 0.6050916464D+00 + 0.3368145340D+02 0.9687867882D+00 0.4039803793D+00 +SP 3 1.00 + 0.3018654250D+02 -0.1418546866D+01 -0.1709817152D+01 + 0.2716641580D+02 0.1229443675D+01 0.2049307540D+01 + 0.5635933900D+01 0.1057082555D+01 0.7186295705D+00 +SP 3 1.00 + 0.5475373890D+01 -0.4172610321D+00 0.1158391250D-01 + 0.1997604330D+01 0.4705878121D+00 0.4974547529D+00 + 0.7439301560D+00 0.8046363112D+00 0.5655272389D+00 +SP 2 1.00 + 0.8901632350D+00 -0.2784323865D+00 -0.1271580435D-02 + 0.9282090020D-01 0.1093027738D+01 0.1000331866D+01 +SP 1 1.00 + 0.3377393710D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.8423690600D+02 0.1256429007D+00 + 0.2324918600D+02 0.4937201026D+00 + 0.7196760400D+01 0.5803431030D+00 +D 2 1.00 + 0.3473076700D+01 0.3281542780D+00 + 0.1148049700D+01 0.7680266919D+00 +D 1 1.00 + 0.3548105800D+00 1.0000000 +**** +Ag 0 +S 3 1.00 + 0.1119078400D+05 0.6149480212D-01 + 0.1695077000D+04 0.3684053127D+00 + 0.3726751700D+03 0.6893247237D+00 +SP 3 1.00 + 0.5046162050D+03 -0.1126576630D+00 0.1514798020D+00 + 0.1098718020D+03 0.8402784354D-01 0.6065141580D+00 + 0.3529513400D+02 0.9692344314D+00 0.4018302360D+00 +SP 3 1.00 + 0.3156877340D+02 -0.1422027546D+01 -0.1673365657D+01 + 0.2834397060D+02 0.1234098205D+01 0.2018975646D+01 + 0.5945127400D+01 0.1055683174D+01 0.7126888926D+00 +SP 3 1.00 + 0.5800255840D+01 -0.4196170528D+00 0.1430410320D-01 + 0.2127256400D+01 0.4843500928D+00 0.5071942950D+00 + 0.7935511690D+00 0.7952035146D+00 0.5539736311D+00 +SP 2 1.00 + 0.9285444710D+00 -0.2523005089D+00 -0.1480711434D-02 + 0.9725466540D-01 0.1087391930D+01 0.1000388052D+01 +SP 1 1.00 + 0.3493292380D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.8993334900D+02 0.1240158966D+00 + 0.2487495800D+02 0.4923830864D+00 + 0.7738191400D+01 0.5814967839D+00 +D 2 1.00 + 0.3796556700D+01 0.3314258950D+00 + 0.1256644300D+01 0.7651634119D+00 +D 1 1.00 + 0.3881333100D+00 1.0000000 +**** +Cd 0 +S 3 1.00 + 0.1168608600D+05 0.6142649617D-01 + 0.1770111400D+04 0.3681566770D+00 + 0.3892089900D+03 0.6895721570D+00 +SP 3 1.00 + 0.5276003770D+03 -0.1125924770D+00 0.1518050990D+00 + 0.1148328770D+03 0.8326963198D-01 0.6077597690D+00 + 0.3695829310D+02 0.9697978087D+00 0.3999631560D+00 +SP 3 1.00 + 0.3301548210D+02 -0.1406471028D+01 -0.1609023667D+01 + 0.2954543010D+02 0.1218156268D+01 0.1959567526D+01 + 0.6278507560D+01 0.1055520308D+01 0.7080270607D+00 +SP 3 1.00 + 0.6150596330D+01 -0.4229209279D+00 0.1448229450D-01 + 0.2259746070D+01 0.4987714469D+00 0.5186611159D+00 + 0.8414261390D+00 0.7850754939D+00 0.5426657759D+00 +SP 2 1.00 + 0.9490686450D+00 -0.2215546835D+00 -0.1540265823D-02 + 0.1014878430D+00 0.1080944447D+01 0.1000412196D+01 +SP 1 1.00 + 0.3598726440D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.9547274300D+02 0.1230827990D+00 + 0.2648195900D+02 0.4916767962D+00 + 0.8282885800D+01 0.5815407955D+00 +D 2 1.00 + 0.4082141300D+01 0.3379409540D+00 + 0.1357279200D+01 0.7591678870D+00 +D 1 1.00 + 0.4208307600D+00 1.0000000 +**** +In 0 +S 3 1.00 + 0.1221454700D+05 0.6124759985D-01 + 0.1848913600D+04 0.3676753991D+00 + 0.4063683300D+03 0.6901358983D+00 +SP 3 1.00 + 0.5504422550D+03 -0.1127094329D+00 0.1523702989D+00 + 0.1197743540D+03 0.8344349526D-01 0.6096507527D+00 + 0.3866926950D+02 0.9696880355D+00 0.3970249498D+00 +SP 3 1.00 + 0.4702931320D+02 -0.2758954238D+00 -0.1408484750D+00 + 0.2249642350D+02 0.5977348125D-01 0.5290866941D+00 + 0.6697116970D+01 0.1082147535D+01 0.6620681111D+00 +SP 3 1.00 + 0.6572360380D+01 0.4284830560D+00 0.1091304620D-01 + 0.2502157560D+01 -0.4633643610D+00 0.5036758868D+00 + 0.9420245940D+00 -0.8219679320D+00 0.5581808648D+00 +SP 2 1.00 + 0.1001221380D+01 -0.4364171931D+00 -0.2316333509D-01 + 0.1659704190D+00 0.1189893475D+01 -0.9903308877D+00 +SP 1 1.00 + 0.5433974090D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1021735600D+03 0.1205558956D+00 + 0.2839463200D+02 0.4884975820D+00 + 0.8924804500D+01 0.5850189785D+00 +D 3 1.00 + 0.4535363700D+01 0.2508574068D+00 + 0.1537148100D+01 0.5693113154D+00 + 0.4994922600D+00 0.3840635104D+00 +**** +Sn 0 +S 3 1.00 + 0.1274167400D+05 0.6113529959D-01 + 0.1928469200D+04 0.3672928976D+00 + 0.4238079700D+03 0.6905446954D+00 +SP 3 1.00 + 0.5742875030D+03 -0.1127462410D+00 0.1525797960D+00 + 0.1249536520D+03 0.8286347307D-01 0.6110105889D+00 + 0.4039575890D+02 0.9701504517D+00 0.3951548539D+00 +SP 3 1.00 + 0.4880661910D+02 -0.2824533571D+00 -0.1509627539D+00 + 0.2383588110D+02 0.6605594709D-01 0.5399677287D+00 + 0.7048295500D+01 0.1081987257D+01 0.6604823107D+00 +SP 3 1.00 + 0.6973377530D+01 0.4340355839D+00 0.1195129860D-01 + 0.2693039570D+01 -0.4610285879D+00 0.5067194520D+00 + 0.1025957600D+01 -0.8285579378D+00 0.5529105830D+00 +SP 2 1.00 + 0.1131462610D+01 0.5252084707D+00 -0.2107052591D-01 + 0.2034091770D+00 -0.1229226474D+01 -0.9905913714D+00 +SP 1 1.00 + 0.7056383040D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1080563000D+03 0.1198237020D+00 + 0.3013157600D+02 0.4875910081D+00 + 0.9530035900D+01 0.5849874098D+00 +D 3 1.00 + 0.4962609800D+01 0.2529487035D+00 + 0.1712082900D+01 0.5727612080D+00 + 0.5771945100D+00 0.3690387051D+00 +**** +Sb 0 +S 3 1.00 + 0.1328938300D+05 0.6098430000D-01 + 0.2010521800D+04 0.3668487000D+00 + 0.4416981500D+03 0.6910501000D+00 +SP 3 1.00 + 0.5988890500D+03 -0.1127201340D+00 0.1530671170D+00 + 0.1300386010D+03 0.8264432608D-01 0.6135972481D+00 + 0.4213286020D+02 0.9702578608D+00 0.3916990150D+00 +SP 3 1.00 + 0.5151332880D+02 -0.2770433377D+00 -0.1378698580D+00 + 0.2443594590D+02 0.5750323393D-01 0.5363549769D+00 + 0.7420930800D+01 0.1084702829D+01 0.6508676379D+00 +SP 3 1.00 + 0.7314235410D+01 0.4403811641D+00 0.1530518090D-01 + 0.2844052860D+01 -0.4737340951D+00 0.5160832191D+00 + 0.1105854670D+01 -0.8221349682D+00 0.5387570471D+00 +SP 2 1.00 + 0.1278637290D+01 0.6016951047D+00 -0.2225275660D-01 + 0.2412320970D+00 -0.1258692017D+01 -0.9896433641D+00 +SP 1 1.00 + 0.8662967320D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1158095500D+03 0.1166279038D+00 + 0.3230583500D+02 0.4834363158D+00 + 0.1025032800D+02 0.5901395192D+00 +D 3 1.00 + 0.5486210200D+01 0.2483655969D+00 + 0.1921619600D+01 0.5743153928D+00 + 0.6660626500D+00 0.3643043954D+00 +**** +Te 0 +S 3 1.00 + 0.1379656000D+05 0.6108620183D-01 + 0.2088879800D+04 0.3669629110D+00 + 0.4593931900D+03 0.6907944207D+00 +SP 3 1.00 + 0.6232631250D+03 -0.1128200240D+00 0.1534194779D+00 + 0.1353600050D+03 0.8225243100D-01 0.6148996146D+00 + 0.4400048430D+02 0.9706007190D+00 0.3895162447D+00 +SP 3 1.00 + 0.5419078330D+02 -0.2744120347D+00 -0.1433312141D+00 + 0.2582039000D+02 0.5182968462D-01 0.5391881202D+00 + 0.7809583200D+01 0.1087621523D+01 0.6522850782D+00 +SP 3 1.00 + 0.7764216830D+01 0.4467305520D+00 0.1274619601D-01 + 0.3043931600D+01 -0.4694704190D+00 0.5221231254D+00 + 0.1199252880D+01 -0.8298104900D+00 0.5326613984D+00 +SP 2 1.00 + 0.1340363800D+01 0.5904699297D+00 -0.2558833989D-01 + 0.2780883850D+00 -0.1281968387D+01 -0.9871016265D+00 +SP 1 1.00 + 0.9672607420D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1214083000D+03 0.1169135914D+00 + 0.3401521700D+02 0.4835554645D+00 + 0.1086913800D+02 0.5883863568D+00 +D 3 1.00 + 0.5803111300D+01 0.2601938950D+00 + 0.2058065800D+01 0.5797757888D+00 + 0.7328302100D+00 0.3405579934D+00 +**** +I 0 +S 3 1.00 + 0.1435118600D+05 0.6100280121D-01 + 0.2173074100D+04 0.3666398073D+00 + 0.4778720500D+03 0.6911306137D+00 +SP 3 1.00 + 0.6481886590D+03 -0.1128506660D+00 0.1541144881D+00 + 0.1403064480D+03 0.8322833753D-01 0.6194617634D+00 + 0.4569880120D+02 0.9697515913D+00 0.3837583163D+00 +SP 3 1.00 + 0.5669468950D+02 -0.2736964882D+00 -0.1523216720D+00 + 0.2748875260D+02 0.4649967921D-01 0.5437685671D+00 + 0.8209095830D+01 0.1091576055D+01 0.6561678541D+00 +SP 3 1.00 + 0.8191678650D+01 0.4508277048D+00 0.1186987900D-01 + 0.3244595590D+01 -0.4632093728D+00 0.5265245819D+00 + 0.1300489090D+01 -0.8386360157D+00 0.5266076079D+00 +SP 2 1.00 + 0.1451380120D+01 0.6658514628D+00 -0.2754130961D-01 + 0.3281033130D+00 -0.1328583874D+01 -0.9851368322D+00 +SP 1 1.00 + 0.1150758940D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1280902600D+03 0.1158636044D+00 + 0.3598237800D+02 0.4820494181D+00 + 0.1155111600D+02 0.5894448221D+00 +D 3 1.00 + 0.6146152300D+01 0.2681817060D+00 + 0.2220937000D+01 0.5800614130D+00 + 0.8099120200D+00 0.3262263073D+00 +**** +Xe 0 +S 3 1.00 + 0.1490223600D+05 0.6099689663D-01 + 0.2256538300D+04 0.3666289798D+00 + 0.4963731700D+03 0.6911154619D+00 +SP 3 1.00 + 0.6736610920D+03 -0.1129127500D+00 0.1544274850D+00 + 0.1458490890D+03 0.8290529191D-01 0.6206173538D+00 + 0.4757707550D+02 0.9700289051D+00 0.3820041019D+00 +SP 3 1.00 + 0.5916752090D+02 -0.2739774065D+00 -0.1518571811D+00 + 0.2861159240D+02 0.4553005619D-01 0.5471506593D+00 + 0.8596596290D+01 0.1092527552D+01 0.6519540313D+00 +SP 3 1.00 + 0.8638676160D+01 0.4558408016D+00 0.9585055706D-02 + 0.3462817980D+01 -0.4617354976D+00 0.5298192868D+00 + 0.1401039790D+01 -0.8442883033D+00 0.5235984968D+00 +SP 2 1.00 + 0.1578474100D+01 0.7277717934D+00 -0.2807244179D-01 + 0.3750814120D+00 -0.1362797075D+01 -0.9842642086D+00 +SP 1 1.00 + 0.1331789700D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1349133100D+03 0.1150104908D+00 + 0.3795638700D+02 0.4815951616D+00 + 0.1222747500D+02 0.5896132529D+00 +D 3 1.00 + 0.6600492800D+01 0.2718844011D+00 + 0.2398051300D+01 0.5855569025D+00 + 0.8864823900D+00 0.3127456013D+00 +**** + diff --git a/basis/6-31g.gbf b/basis/6-31g.gbf new file mode 100644 index 0000000..a17aaca --- /dev/null +++ b/basis/6-31g.gbf @@ -0,0 +1,960 @@ + + +cartesian + +!---------------------------------------------------------------------- +! Basis Set Exchange +! Version v0.8.12 +! https://www.basissetexchange.org +!---------------------------------------------------------------------- +! Basis set: 6-31G +! Description: 6-31G valence double-zeta +! Role: orbital +! Version: 1 (Data from Gaussian 09/GAMESS) +!---------------------------------------------------------------------- + + +**** +H 0 +S 3 1.00 + 0.1873113696D+02 0.3349460434D-01 + 0.2825394365D+01 0.2347269535D+00 + 0.6401216923D+00 0.8137573261D+00 +S 1 1.00 + 0.1612777588D+00 1.0000000 +**** +He 0 +S 3 1.00 + 0.3842163400D+02 0.4013973935D-01 + 0.5778030000D+01 0.2612460970D+00 + 0.1241774000D+01 0.7931846246D+00 +S 1 1.00 + 0.2979640000D+00 1.0000000 +**** +Li 0 +S 6 1.00 + 0.6424189150D+03 0.2142607810D-02 + 0.9679851530D+02 0.1620887150D-01 + 0.2209112120D+02 0.7731557250D-01 + 0.6201070250D+01 0.2457860520D+00 + 0.1935117680D+01 0.4701890040D+00 + 0.6367357890D+00 0.3454708450D+00 +SP 3 1.00 + 0.2324918408D+01 -0.3509174574D-01 0.8941508043D-02 + 0.6324303556D+00 -0.1912328431D+00 0.1410094640D+00 + 0.7905343475D-01 0.1083987795D+01 0.9453636953D+00 +SP 1 1.00 + 0.3596197175D-01 0.1000000000D+01 0.1000000000D+01 +**** +Be 0 +S 6 1.00 + 0.1264585690D+04 0.1944757590D-02 + 0.1899368060D+03 0.1483505200D-01 + 0.4315908900D+02 0.7209054629D-01 + 0.1209866270D+02 0.2371541500D+00 + 0.3806323220D+01 0.4691986519D+00 + 0.1272890300D+01 0.3565202279D+00 +SP 3 1.00 + 0.3196463098D+01 -0.1126487285D+00 0.5598019980D-01 + 0.7478133038D+00 -0.2295064079D+00 0.2615506110D+00 + 0.2199663302D+00 0.1186916764D+01 0.7939723389D+00 +SP 1 1.00 + 0.8230990070D-01 0.1000000000D+01 0.1000000000D+01 +**** +B 0 +S 6 1.00 + 0.2068882250D+04 0.1866274590D-02 + 0.3106495700D+03 0.1425148170D-01 + 0.7068303300D+02 0.6955161850D-01 + 0.1986108030D+02 0.2325729330D+00 + 0.6299304840D+01 0.4670787120D+00 + 0.2127026970D+01 0.3634314400D+00 +SP 3 1.00 + 0.4727971071D+01 -0.1303937974D+00 0.7459757992D-01 + 0.1190337736D+01 -0.1307889514D+00 0.3078466771D+00 + 0.3594116829D+00 0.1130944484D+01 0.7434568342D+00 +SP 1 1.00 + 0.1267512469D+00 0.1000000000D+01 0.1000000000D+01 +**** +C 0 +S 6 1.00 + 0.3047524880D+04 0.1834737132D-02 + 0.4573695180D+03 0.1403732281D-01 + 0.1039486850D+03 0.6884262226D-01 + 0.2921015530D+02 0.2321844432D+00 + 0.9286662960D+01 0.4679413484D+00 + 0.3163926960D+01 0.3623119853D+00 +SP 3 1.00 + 0.7868272350D+01 -0.1193324198D+00 0.6899906659D-01 + 0.1881288540D+01 -0.1608541517D+00 0.3164239610D+00 + 0.5442492580D+00 0.1143456438D+01 0.7443082909D+00 +SP 1 1.00 + 0.1687144782D+00 0.1000000000D+01 0.1000000000D+01 +**** +N 0 +S 6 1.00 + 0.4173511460D+04 0.1834772160D-02 + 0.6274579110D+03 0.1399462700D-01 + 0.1429020930D+03 0.6858655181D-01 + 0.4023432930D+02 0.2322408730D+00 + 0.1282021290D+02 0.4690699481D+00 + 0.4390437010D+01 0.3604551991D+00 +SP 3 1.00 + 0.1162636186D+02 -0.1149611817D+00 0.6757974388D-01 + 0.2716279807D+01 -0.1691174786D+00 0.3239072959D+00 + 0.7722183966D+00 0.1145851947D+01 0.7408951398D+00 +SP 1 1.00 + 0.2120314975D+00 0.1000000000D+01 0.1000000000D+01 +**** +O 0 +S 6 1.00 + 0.5484671660D+04 0.1831074430D-02 + 0.8252349460D+03 0.1395017220D-01 + 0.1880469580D+03 0.6844507810D-01 + 0.5296450000D+02 0.2327143360D+00 + 0.1689757040D+02 0.4701928980D+00 + 0.5799635340D+01 0.3585208530D+00 +SP 3 1.00 + 0.1553961625D+02 -0.1107775495D+00 0.7087426823D-01 + 0.3599933586D+01 -0.1480262627D+00 0.3397528391D+00 + 0.1013761750D+01 0.1130767015D+01 0.7271585773D+00 +SP 1 1.00 + 0.2700058226D+00 0.1000000000D+01 0.1000000000D+01 +**** +F 0 +S 6 1.00 + 0.7001713090D+04 0.1819616901D-02 + 0.1051366090D+04 0.1391607961D-01 + 0.2392856900D+03 0.6840532453D-01 + 0.6739744530D+02 0.2331857601D+00 + 0.2151995730D+02 0.4712674392D+00 + 0.7403101300D+01 0.3566185462D+00 +SP 3 1.00 + 0.2084795280D+02 -0.1085069751D+00 0.7162872424D-01 + 0.4808308340D+01 -0.1464516581D+00 0.3459121027D+00 + 0.1344069860D+01 0.1128688581D+01 0.7224699564D+00 +SP 1 1.00 + 0.3581513930D+00 0.1000000000D+01 0.1000000000D+01 +**** +Ne 0 +S 6 1.00 + 0.8425851530D+04 0.1884348050D-02 + 0.1268519400D+04 0.1433689940D-01 + 0.2896214140D+03 0.7010962331D-01 + 0.8185900400D+02 0.2373732660D+00 + 0.2625150790D+02 0.4730071261D+00 + 0.9094720510D+01 0.3484012410D+00 +SP 3 1.00 + 0.2653213100D+02 -0.1071182872D+00 0.7190958851D-01 + 0.6101755010D+01 -0.1461638213D+00 0.3495133720D+00 + 0.1696271530D+01 0.1127773503D+01 0.7199405121D+00 +SP 1 1.00 + 0.4458187000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Na 0 +S 6 1.00 + 0.9993200000D+04 0.1937659277D-02 + 0.1499890000D+04 0.1480699448D-01 + 0.3419510000D+03 0.7270547288D-01 + 0.9467960000D+02 0.2526289058D+00 + 0.2973450000D+02 0.4932418160D+00 + 0.1000630000D+02 0.3131688832D+00 +SP 6 1.00 + 0.1509630000D+03 -0.3542083504D-02 0.5001659710D-02 + 0.3558780000D+02 -0.4395884348D-01 0.3551089794D-01 + 0.1116830000D+02 -0.1097521086D+00 0.1428249917D+00 + 0.3902010000D+01 0.1873981854D+00 0.3386199803D+00 + 0.1381770000D+01 0.6466996397D+00 0.4515789738D+00 + 0.4663820000D+00 0.3060583027D+00 0.2732709841D+00 +SP 3 1.00 + 0.4979660000D+00 -0.2485031593D+00 -0.2302250043D-01 + 0.8435290000D-01 -0.1317040844D+00 0.9503590176D+00 + 0.6663500000D-01 0.1233520791D+01 0.5985790111D-01 +SP 1 1.00 + 0.2595440000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Mg 0 +S 6 1.00 + 0.1172280000D+05 0.1977829317D-02 + 0.1759930000D+04 0.1511399478D-01 + 0.4008460000D+03 0.7391077448D-01 + 0.1128070000D+03 0.2491909140D+00 + 0.3599970000D+02 0.4879278316D+00 + 0.1218280000D+02 0.3196618896D+00 +SP 6 1.00 + 0.1891800000D+03 -0.3237170471D-02 0.4928129921D-02 + 0.4521190000D+02 -0.4100790597D-01 0.3498879944D-01 + 0.1435630000D+02 -0.1126000164D+00 0.1407249977D+00 + 0.5138860000D+01 0.1486330216D+00 0.3336419947D+00 + 0.1906520000D+01 0.6164970898D+00 0.4449399929D+00 + 0.7058870000D+00 0.3648290531D+00 0.2692539957D+00 +SP 3 1.00 + 0.9293400000D+00 -0.2122908985D+00 -0.2241918123D-01 + 0.2690350000D+00 -0.1079854570D+00 0.1922708390D+00 + 0.1173790000D+00 0.1175844977D+01 0.8461802916D+00 +SP 1 1.00 + 0.4210610000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Al 0 +S 6 1.00 + 0.1398310000D+05 0.1942669947D-02 + 0.2098750000D+04 0.1485989959D-01 + 0.4777050000D+03 0.7284939800D-01 + 0.1343600000D+03 0.2468299932D+00 + 0.4287090000D+02 0.4872579866D+00 + 0.1451890000D+02 0.3234959911D+00 +SP 6 1.00 + 0.2396680000D+03 -0.2926190028D-02 0.4602845582D-02 + 0.5744190000D+02 -0.3740830036D-01 0.3319896813D-01 + 0.1828590000D+02 -0.1144870011D+00 0.1362818692D+00 + 0.6599140000D+01 0.1156350011D+00 0.3304756828D+00 + 0.2490490000D+01 0.6125950058D+00 0.4491455689D+00 + 0.9445450000D+00 0.3937990037D+00 0.2657037450D+00 +SP 3 1.00 + 0.1277900000D+01 -0.2276069245D+00 -0.1751260189D-01 + 0.3975900000D+00 0.1445835873D-02 0.2445330264D+00 + 0.1600950000D+00 0.1092794439D+01 0.8049340867D+00 +SP 1 1.00 + 0.5565770000D-01 0.1000000000D+01 0.1000000000D+01 +**** +Si 0 +S 6 1.00 + 0.1611590000D+05 0.1959480216D-02 + 0.2425580000D+04 0.1492880164D-01 + 0.5538670000D+03 0.7284780801D-01 + 0.1563400000D+03 0.2461300271D+00 + 0.5006830000D+02 0.4859140535D+00 + 0.1701780000D+02 0.3250020358D+00 +SP 6 1.00 + 0.2927180000D+03 -0.2780941415D-02 0.4438264521D-02 + 0.6987310000D+02 -0.3571461817D-01 0.3266793328D-01 + 0.2233630000D+02 -0.1149850585D+00 0.1347211372D+00 + 0.8150390000D+01 0.9356344760D-01 0.3286783348D+00 + 0.3134580000D+01 0.6030173068D+00 0.4496404580D+00 + 0.1225430000D+01 0.4189592131D+00 0.2613722662D+00 +SP 3 1.00 + 0.1727380000D+01 -0.2446310042D+00 -0.1779510605D-01 + 0.5729220000D+00 0.4315737717D-02 0.2535390863D+00 + 0.2221920000D+00 0.1098184508D+01 0.8006692724D+00 +SP 1 1.00 + 0.7783690000D-01 0.1000000000D+01 0.1000000000D+01 +**** +P 0 +S 6 1.00 + 0.1941330000D+05 0.1851598923D-02 + 0.2909420000D+04 0.1420619174D-01 + 0.6613640000D+03 0.6999945928D-01 + 0.1857590000D+03 0.2400788603D+00 + 0.5919430000D+02 0.4847617180D+00 + 0.2003100000D+02 0.3351998050D+00 +SP 6 1.00 + 0.3394780000D+03 -0.2782170105D-02 0.4564616191D-02 + 0.8101010000D+02 -0.3604990135D-01 0.3369357188D-01 + 0.2587800000D+02 -0.1166310044D+00 0.1397548834D+00 + 0.9452210000D+01 0.9683280364D-01 0.3393617168D+00 + 0.3665660000D+01 0.6144180231D+00 0.4509206237D+00 + 0.1467460000D+01 0.4037980152D+00 0.2385858009D+00 +SP 3 1.00 + 0.2156230000D+01 -0.2529241139D+00 -0.1776531273D-01 + 0.7489970000D+00 0.3285184468D-01 0.2740581964D+00 + 0.2831450000D+00 0.1081254762D+01 0.7854215630D+00 +SP 1 1.00 + 0.9983170000D-01 0.1000000000D+01 0.1000000000D+01 +**** +S 0 +S 6 1.00 + 0.2191710000D+05 0.1869240849D-02 + 0.3301490000D+04 0.1423030646D-01 + 0.7541460000D+03 0.6969623166D-01 + 0.2127110000D+03 0.2384871083D+00 + 0.6798960000D+02 0.4833072195D+00 + 0.2305150000D+02 0.3380741536D+00 +SP 6 1.00 + 0.4237350000D+03 -0.2376770499D-02 0.4061009982D-02 + 0.1007100000D+03 -0.3169300665D-01 0.3068129986D-01 + 0.3215990000D+02 -0.1133170238D+00 0.1304519994D+00 + 0.1180790000D+02 0.5609001177D-01 0.3272049985D+00 + 0.4631100000D+01 0.5922551243D+00 0.4528509980D+00 + 0.1870250000D+01 0.4550060955D+00 0.2560419989D+00 +SP 3 1.00 + 0.2615840000D+01 -0.2503731142D+00 -0.1451048955D-01 + 0.9221670000D+00 0.6695676310D-01 0.3102627765D+00 + 0.3412870000D+00 0.1054506269D+01 0.7544824565D+00 +SP 1 1.00 + 0.1171670000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Cl 0 +S 6 1.00 + 0.2518010000D+05 0.1832959848D-02 + 0.3780350000D+04 0.1403419883D-01 + 0.8604740000D+03 0.6909739426D-01 + 0.2421450000D+03 0.2374519803D+00 + 0.7733490000D+02 0.4830339599D+00 + 0.2624700000D+02 0.3398559718D+00 +SP 6 1.00 + 0.4917650000D+03 -0.2297391417D-02 0.3989400879D-02 + 0.1169840000D+03 -0.3071371894D-01 0.3031770668D-01 + 0.3741530000D+02 -0.1125280694D+00 0.1298800286D+00 + 0.1378340000D+02 0.4501632776D-01 0.3279510723D+00 + 0.5452150000D+01 0.5893533634D+00 0.4535271000D+00 + 0.2225880000D+01 0.4652062868D+00 0.2521540556D+00 +SP 3 1.00 + 0.3186490000D+01 -0.2518280280D+00 -0.1429931472D-01 + 0.1144270000D+01 0.6158925141D-01 0.3235723331D+00 + 0.4203770000D+00 0.1060184328D+01 0.7435077653D+00 +SP 1 1.00 + 0.1426570000D+00 0.1000000000D+01 0.1000000000D+01 +**** +Ar 0 +S 6 1.00 + 0.2834830000D+05 0.1825260192D-02 + 0.4257620000D+04 0.1396860147D-01 + 0.9698570000D+03 0.6870730723D-01 + 0.2732630000D+03 0.2362040249D+00 + 0.8736950000D+02 0.4822140508D+00 + 0.2968670000D+02 0.3420430360D+00 +SP 6 1.00 + 0.5758910000D+03 -0.2159720895D-02 0.3806649842D-02 + 0.1368160000D+03 -0.2907751206D-01 0.2923049879D-01 + 0.4380980000D+02 -0.1108270460D+00 0.1264669948D+00 + 0.1620940000D+02 0.2769991148D-01 0.3235099866D+00 + 0.6460840000D+01 0.5776132395D+00 0.4548959811D+00 + 0.2651140000D+01 0.4886882026D+00 0.2566299894D+00 +SP 3 1.00 + 0.3860280000D+01 -0.2555929604D+00 -0.1591969040D-01 + 0.1413730000D+01 0.3780674206D-01 0.3246458042D+00 + 0.5166460000D+00 0.1080564060D+01 0.7439895512D+00 +SP 1 1.00 + 0.1738880000D+00 0.1000000000D+01 0.1000000000D+01 +**** +K 0 +S 6 1.00 + 0.3159442000D+05 0.1828009922D-02 + 0.4744330000D+04 0.1399402940D-01 + 0.1080419000D+04 0.6887128707D-01 + 0.3042338000D+03 0.2369759899D+00 + 0.9724586000D+02 0.4829039794D+00 + 0.3302495000D+02 0.3404794855D+00 +SP 6 1.00 + 0.6227625000D+03 -0.2502975932D-02 0.4094636754D-02 + 0.1478839000D+03 -0.3315549910D-01 0.3145198811D-01 + 0.4732735000D+02 -0.1226386967D+00 0.1351557919D+00 + 0.1751495000D+02 0.5353642855D-01 0.3390499796D+00 + 0.6922722000D+01 0.6193859832D+00 0.4629454722D+00 + 0.2768277000D+01 0.4345877882D+00 0.2242637865D+00 +SP 6 1.00 + 0.1184802000D+02 0.1277689027D-01 -0.1221377161D-01 + 0.4079211000D+01 0.2098767044D+00 -0.6900537911D-02 + 0.1763481000D+01 -0.3095274065D-02 0.2007466265D+00 + 0.7889270000D+00 -0.5593884117D+00 0.4281332565D+00 + 0.3503870000D+00 -0.5134760107D+00 0.3970156524D+00 + 0.1463440000D+00 -0.6598035138D-01 0.1104718146D+00 +SP 3 1.00 + 0.7168010000D+00 -0.5237766157D-01 0.3164300053D-01 + 0.2337410000D+00 -0.2798499878D+00 -0.4046160068D-01 + 0.3867500000D-01 0.1141545727D+01 0.1012029017D+01 +SP 1 1.00 + 0.1652100000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.9029078000D+01 0.8747672000D-01 + 0.2285045000D+01 0.3795635000D+00 + 0.6638920000D+00 0.7180393000D+00 +D 1 1.00 + 0.1793890000D+00 1.0000000 +**** +Ca 0 +S 6 1.00 + 0.3526486000D+05 0.1813501124D-02 + 0.5295503000D+04 0.1388493095D-01 + 0.1206020000D+04 0.6836162469D-01 + 0.3396839000D+03 0.2356188162D+00 + 0.1086264000D+03 0.4820639331D+00 + 0.3692103000D+02 0.3429819235D+00 +SP 6 1.00 + 0.7063096000D+03 0.2448225082D-02 0.4020370978D-02 + 0.1678187000D+03 0.3241504109D-01 0.3100600983D-01 + 0.5382558000D+02 0.1226219041D+00 0.1337278993D+00 + 0.2001638000D+02 -0.4316965145D-01 0.3367982982D+00 + 0.7970279000D+01 -0.6126995206D+00 0.4631280975D+00 + 0.3212059000D+01 -0.4487540151D+00 0.2257531988D+00 +SP 6 1.00 + 0.1419518000D+02 0.1084500055D-01 -0.1289621138D-01 + 0.4880828000D+01 0.2088333107D+00 -0.1025198110D-01 + 0.2160390000D+01 0.3150338161D-01 0.1959781209D+00 + 0.9878990000D+00 -0.5526518282D+00 0.4357933466D+00 + 0.4495170000D+00 -0.5437997277D+00 0.3996452427D+00 + 0.1873870000D+00 -0.6669342340D-01 0.9713637038D-01 +SP 3 1.00 + 0.1032271000D+01 -0.4439718086D-01 -0.4298620974D+00 + 0.3811710000D+00 -0.3284561584D+00 0.6935828957D-02 + 0.6513100000D-01 0.1163009499D+01 0.9705932940D+00 +SP 1 1.00 + 0.2601000000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1011067000D+02 0.8747672000D-01 + 0.2558769000D+01 0.3795635000D+00 + 0.7434200000D+00 0.7180393000D+00 +D 1 1.00 + 0.2008780000D+00 1.0000000 +**** +Sc 0 +S 6 1.00 + 0.3908898000D+05 0.1803262955D-02 + 0.5869792000D+04 0.1380768965D-01 + 0.1336910000D+04 0.6800395829D-01 + 0.3766031000D+03 0.2347098941D+00 + 0.1204679000D+03 0.4815689879D+00 + 0.4098032000D+02 0.3445651913D+00 +SP 6 1.00 + 0.7862852000D+03 0.2451863032D-02 0.4039529691D-02 + 0.1868870000D+03 0.3259579042D-01 0.3122569761D-01 + 0.6000935000D+02 0.1238242016D+00 0.1349832897D+00 + 0.2225883000D+02 -0.4359890057D-01 0.3424792738D+00 + 0.8885149000D+01 -0.6177181080D+00 0.4623112646D+00 + 0.3609211000D+01 -0.4432823058D+00 0.2177523833D+00 +SP 6 1.00 + 0.2984355000D+02 -0.2586302031D-02 -0.6096652719D-02 + 0.9542383000D+01 0.7188424085D-01 -0.2628884310D-01 + 0.4056790000D+01 0.2503260030D+00 0.5091001601D-01 + 0.1704703000D+01 -0.2991003035D+00 0.3798097448D+00 + 0.7062340000D+00 -0.7446818088D+00 0.5170883610D+00 + 0.2795360000D+00 -0.1799776021D+00 0.1829772216D+00 +SP 3 1.00 + 0.1065609000D+01 0.6482978223D-01 -0.2938439989D+00 + 0.4259330000D+00 0.3253756112D+00 0.9235322967D-01 + 0.7632000000D-01 -0.1170806040D+01 0.9847929965D+00 +SP 1 1.00 + 0.2959400000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1114701000D+02 0.8747672298D-01 + 0.2821043000D+01 0.3795635129D+00 + 0.8196200000D+00 0.7180393244D+00 +D 1 1.00 + 0.2214680000D+00 1.0000000 +**** +Ti 0 +S 6 1.00 + 0.4315295000D+05 0.1791871976D-02 + 0.6479571000D+04 0.1372391982D-01 + 0.1475675000D+04 0.6762829911D-01 + 0.4156991000D+03 0.2337641969D+00 + 0.1330006000D+03 0.4810695937D+00 + 0.4527222000D+02 0.3462279954D+00 +SP 6 1.00 + 0.8746826000D+03 0.2431008053D-02 0.4017679296D-02 + 0.2079785000D+03 0.3233027071D-01 0.3113966230D-01 + 0.6687918000D+02 0.1242520027D+00 0.1349077100D+00 + 0.2487347000D+02 -0.3903905085D-01 0.3431672253D+00 + 0.9968441000D+01 -0.6171789135D+00 0.4625760341D+00 + 0.4063826000D+01 -0.4473097098D+00 0.2154603159D+00 +SP 6 1.00 + 0.3364363000D+02 -0.2940357957D-02 -0.6311620001D-02 + 0.1087565000D+02 0.7163102894D-01 -0.2697638000D-01 + 0.4628225000D+01 0.2528914963D+00 0.5316847001D-01 + 0.1950126000D+01 -0.2966400956D+00 0.3845549000D+00 + 0.8094520000D+00 -0.7432214890D+00 0.5127662001D+00 + 0.3204740000D+00 -0.1853519973D+00 0.1811135000D+00 +SP 3 1.00 + 0.1224148000D+01 0.6351460717D-01 -0.2112070099D+00 + 0.4842630000D+00 0.3151401875D+00 0.7771998364D-01 + 0.8409600000D-01 -0.1162594216D+01 0.9898214464D+00 +SP 1 1.00 + 0.3203600000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1369085000D+02 0.8589417880D-01 + 0.3513154000D+01 0.3784670947D+00 + 0.1040434000D+01 0.7161238900D+00 +D 1 1.00 + 0.2869620000D+00 1.0000000 +**** +V 0 +S 6 1.00 + 0.4735433000D+05 0.1784512997D-02 + 0.7110787000D+04 0.1366753998D-01 + 0.1619591000D+04 0.6736121989D-01 + 0.4563379000D+03 0.2330551996D+00 + 0.1460606000D+03 0.4806315992D+00 + 0.4975791000D+02 0.3474801994D+00 +SP 6 1.00 + 0.9681484000D+03 0.2410599011D-02 0.3995005174D-02 + 0.2302821000D+03 0.3207243014D-01 0.3104061135D-01 + 0.7414591000D+02 0.1245942006D+00 0.1347747059D+00 + 0.2764107000D+02 -0.3482177015D-01 0.3437279150D+00 + 0.1111475000D+02 -0.6167374027D+00 0.4628759202D+00 + 0.4543113000D+01 -0.4509844020D+00 0.2135547093D+00 +SP 6 1.00 + 0.3764050000D+02 -0.3233199384D-02 -0.6494056098D-02 + 0.1228238000D+02 0.7130744847D-01 -0.2753453042D-01 + 0.5233366000D+01 0.2543820302D+00 0.5516284083D-01 + 0.2208950000D+01 -0.2933887348D+00 0.3879672059D+00 + 0.9178800000D+00 -0.7415695881D+00 0.5090258077D+00 + 0.3634120000D+00 -0.1909410227D+00 0.1803840027D+00 +SP 3 1.00 + 0.1392781000D+01 0.6139702133D-01 -0.1891264918D+00 + 0.5439130000D+00 0.3061129568D+00 0.8005452654D-01 + 0.9147600000D-01 -0.1154889837D+01 0.9877398574D+00 +SP 1 1.00 + 0.3431200000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1605025000D+02 0.8599899166D-01 + 0.4160063000D+01 0.3802996074D+00 + 0.1243265000D+01 0.7127659138D+00 +D 1 1.00 + 0.3442770000D+00 1.0000000 +**** +Cr 0 +S 6 1.00 + 0.5178981000D+05 0.1776181956D-02 + 0.7776849000D+04 0.1360475966D-01 + 0.1771385000D+04 0.6706924832D-01 + 0.4991588000D+03 0.2323103942D+00 + 0.1597982000D+03 0.4802409880D+00 + 0.5447021000D+02 0.3487652913D+00 +SP 6 1.00 + 0.1064328000D+04 0.2399669027D-02 0.3986996969D-02 + 0.2532138000D+03 0.3194886035D-01 0.3104661976D-01 + 0.8160924000D+02 0.1250868014D+00 0.1350517989D+00 + 0.3048193000D+02 -0.3221866036D-01 0.3448864973D+00 + 0.1229439000D+02 -0.6172284069D+00 0.4628570964D+00 + 0.5037722000D+01 -0.4525936050D+00 0.2110425984D+00 +SP 6 1.00 + 0.4156291000D+02 -0.3454215978D-02 -0.6722497017D-02 + 0.1367627000D+02 0.7218427953D-01 -0.2806471007D-01 + 0.5844390000D+01 0.2544819984D+00 0.5820028015D-01 + 0.2471609000D+01 -0.2934533981D+00 0.3916988010D+00 + 0.1028308000D+01 -0.7385454952D+00 0.5047823013D+00 + 0.4072500000D+00 -0.1947156987D+00 0.1790290005D+00 +SP 3 1.00 + 0.1571464000D+01 0.5892221460D-01 -0.1930100080D+00 + 0.6055800000D+00 0.2976056242D+00 0.9605620398D-01 + 0.9856100000D-01 -0.1147506479D+01 0.9817609407D+00 +SP 1 1.00 + 0.3645900000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.1841930000D+02 0.8650816335D-01 + 0.4812661000D+01 0.3826699148D+00 + 0.1446447000D+01 0.7093772274D+00 +D 1 1.00 + 0.4004130000D+00 1.0000000 +**** +Mn 0 +S 6 1.00 + 0.5634714000D+05 0.1771579986D-02 + 0.8460943000D+04 0.1357080989D-01 + 0.1927325000D+04 0.6690604948D-01 + 0.5432343000D+03 0.2318540982D+00 + 0.1739905000D+03 0.4799045963D+00 + 0.5936005000D+02 0.3495736973D+00 +SP 6 1.00 + 0.1165412000D+04 0.2388751027D-02 0.3977317926D-02 + 0.2773276000D+03 0.3181708036D-01 0.3103111942D-01 + 0.8947278000D+02 0.1254670014D+00 0.1351893975D+00 + 0.3348256000D+02 -0.2955431033D-01 0.3457386935D+00 + 0.1354037000D+02 -0.6175160070D+00 0.4629204913D+00 + 0.5557972000D+01 -0.4544458051D+00 0.2090591961D+00 +SP 6 1.00 + 0.4583532000D+02 -0.3665856137D-02 -0.6887577902D-02 + 0.1518777000D+02 0.7231971269D-01 -0.2846815959D-01 + 0.6500710000D+01 0.2544486095D+00 0.6031831914D-01 + 0.2751583000D+01 -0.2910380108D+00 0.3938960944D+00 + 0.1145404000D+01 -0.7359860274D+00 0.5013768928D+00 + 0.4536870000D+00 -0.1997617074D+00 0.1792263974D+00 +SP 3 1.00 + 0.1757999000D+01 0.5628573186D-01 -0.5035023825D+00 + 0.6670220000D+00 0.2897491610D+00 0.2345010919D+00 + 0.1051290000D+00 -0.1140653240D+01 0.9141256682D+00 +SP 1 1.00 + 0.3841800000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2094355000D+02 0.8672702314D-01 + 0.5510486000D+01 0.3841883139D+00 + 0.1665038000D+01 0.7069071256D+00 +D 1 1.00 + 0.4617330000D+00 1.0000000 +**** +Fe 0 +S 6 1.00 + 0.6113262000D+05 0.1766110976D-02 + 0.9179342000D+04 0.1353037982D-01 + 0.2090857000D+04 0.6673127910D-01 + 0.5892479000D+03 0.2314822969D+00 + 0.1887543000D+03 0.4797057935D+00 + 0.6444629000D+02 0.3501975953D+00 +SP 6 1.00 + 0.1259980000D+04 0.2438014027D-02 0.4028018665D-02 + 0.2998761000D+03 0.3224048035D-01 0.3144646739D-01 + 0.9684917000D+02 0.1265724014D+00 0.1368316886D+00 + 0.3631020000D+02 -0.3139902035D-01 0.3487235710D+00 + 0.1472996000D+02 -0.6207593068D+00 0.4617930616D+00 + 0.6066075000D+01 -0.4502914050D+00 0.2043057830D+00 +SP 6 1.00 + 0.5043485000D+02 -0.3873255984D-02 -0.7017127880D-02 + 0.1683929000D+02 0.7196597971D-01 -0.2877659951D-01 + 0.7192086000D+01 0.2556590990D+00 0.6181382895D-01 + 0.3053420000D+01 -0.2882836988D+00 0.3954945933D+00 + 0.1273643000D+01 -0.7342821970D+00 0.4989058915D+00 + 0.5040910000D+00 -0.2049352992D+00 0.1791250969D+00 +SP 3 1.00 + 0.1950316000D+01 0.5694869031D-01 -0.4593796163D+00 + 0.7367210000D+00 0.2882915015D+00 0.2852139102D+00 + 0.1141770000D+00 -0.1138159006D+01 0.9076485323D+00 +SP 1 1.00 + 0.4114800000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2314994000D+02 0.8876935479D-01 + 0.6122368000D+01 0.3896319210D+00 + 0.1846601000D+01 0.7014816379D+00 +D 1 1.00 + 0.5043610000D+00 1.0000000 +**** +Co 0 +S 6 1.00 + 0.6614899000D+05 0.1759787106D-02 + 0.9933077000D+04 0.1348162081D-01 + 0.2262816000D+04 0.6649342399D-01 + 0.6379154000D+03 0.2307939139D+00 + 0.2044122000D+03 0.4792919288D+00 + 0.6982538000D+02 0.3514097211D+00 +SP 6 1.00 + 0.1378841000D+04 0.2376276103D-02 0.3971488140D-02 + 0.3282694000D+03 0.3167450137D-01 0.3108174109D-01 + 0.1060946000D+03 0.1262888054D+00 0.1357439048D+00 + 0.3983275000D+02 -0.2584552112D-01 0.3476827122D+00 + 0.1618622000D+02 -0.6183491267D+00 0.4626340163D+00 + 0.6667788000D+01 -0.4567008197D+00 0.2051632072D+00 +SP 6 1.00 + 0.5452355000D+02 -0.3993003860D-02 -0.7290771623D-02 + 0.1829783000D+02 0.7409662740D-01 -0.2926026849D-01 + 0.7867348000D+01 0.2541999911D+00 0.6564149661D-01 + 0.3340534000D+01 -0.2921656898D+00 0.4000651793D+00 + 0.1393756000D+01 -0.7318702744D+00 0.4950235744D+00 + 0.5513260000D+00 -0.2040783929D+00 0.1758239909D+00 +SP 3 1.00 + 0.2151947000D+01 0.5379840456D-01 -0.2165495935D+00 + 0.8110630000D+00 0.2759969695D+00 0.1240487963D+00 + 0.1210170000D+00 -0.1129691466D+01 0.9724063708D+00 +SP 1 1.00 + 0.4303700000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2559306000D+02 0.9004748403D-01 + 0.6800990000D+01 0.3931703176D+00 + 0.2051647000D+01 0.6976844312D+00 +D 1 1.00 + 0.5556710000D+00 1.0000000 +**** +Ni 0 +S 6 1.00 + 0.7139635000D+05 0.1753002902D-02 + 0.1072084000D+05 0.1343121925D-01 + 0.2442129000D+04 0.6627040631D-01 + 0.6884265000D+03 0.2302507872D+00 + 0.2206153000D+03 0.4790185733D+00 + 0.7539373000D+02 0.3523443804D+00 +SP 6 1.00 + 0.1492532000D+04 0.2370713841D-02 0.3967554145D-02 + 0.3554013000D+03 0.3160565787D-01 0.3109479114D-01 + 0.1149534000D+03 0.1266334915D+00 0.1359517050D+00 + 0.4322043000D+02 -0.2417036837D-01 0.3485136127D+00 + 0.1759710000D+02 -0.6187774584D+00 0.4625498169D+00 + 0.7257765000D+01 -0.4576769692D+00 0.2035186074D+00 +SP 6 1.00 + 0.5935261000D+02 -0.4162002046D-02 -0.7421451709D-02 + 0.2002181000D+02 0.7425111082D-01 -0.2953409884D-01 + 0.8614561000D+01 0.2541360028D+00 0.6731851736D-01 + 0.3660531000D+01 -0.2903477032D+00 0.4016659842D+00 + 0.1528111000D+01 -0.7302121080D+00 0.4926622807D+00 + 0.6040570000D+00 -0.2076057023D+00 0.1756892931D+00 +SP 3 1.00 + 0.2379276000D+01 0.5157890540D-01 -0.1887663036D+00 + 0.8858390000D+00 0.2707612333D+00 0.1015199019D+00 + 0.1285290000D+00 -0.1124770554D+01 0.9790906185D+00 +SP 1 1.00 + 0.4519500000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.2819147000D+02 0.9098880504D-01 + 0.7523584000D+01 0.3958207784D+00 + 0.2271228000D+01 0.6947153621D+00 +D 1 1.00 + 0.6116030000D+00 1.0000000 +**** +Cu 0 +S 6 1.00 + 0.7679438000D+05 0.1748161083D-02 + 0.1153070000D+05 0.1339602064D-01 + 0.2626575000D+04 0.6610885315D-01 + 0.7404903000D+03 0.2298265110D+00 + 0.2373528000D+03 0.4787675228D+00 + 0.8115818000D+02 0.3530739168D+00 +SP 6 1.00 + 0.1610814000D+04 0.2364054998D-02 0.3963306847D-02 + 0.3836367000D+03 0.3153634997D-01 0.3110222880D-01 + 0.1241733000D+03 0.1269451999D+00 0.1361349948D+00 + 0.4674678000D+02 -0.2262839998D-01 0.3492913866D+00 + 0.1906569000D+02 -0.6192079994D+00 0.4624779822D+00 + 0.7871567000D+01 -0.4585392996D+00 0.2020101922D+00 +SP 6 1.00 + 0.6445732000D+02 -0.4331075387D-02 -0.7523724515D-02 + 0.2185212000D+02 0.7412307662D-01 -0.2975686808D-01 + 0.9405343000D+01 0.2542108227D+00 0.6849653559D-01 + 0.3999168000D+01 -0.2874843257D+00 0.4027140741D+00 + 0.1670297000D+01 -0.7291436651D+00 0.4908489684D+00 + 0.6596270000D+00 -0.2113951189D+00 0.1759267887D+00 +SP 3 1.00 + 0.2600088000D+01 0.5027577003D-01 -0.1702910950D+00 + 0.9630940000D+00 0.2650040002D+00 0.9310132728D-01 + 0.1361610000D+00 -0.1120155001D+01 0.9814335714D+00 +SP 1 1.00 + 0.4733200000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3085341000D+02 0.9199905385D-01 + 0.8264985000D+01 0.3985021167D+00 + 0.2495332000D+01 0.6917897289D+00 +D 1 1.00 + 0.6676580000D+00 1.0000000 +**** +Zn 0 +S 6 1.00 + 0.8240094000D+05 0.1743328988D-02 + 0.1237255000D+05 0.1335965991D-01 + 0.2818351000D+04 0.6594364956D-01 + 0.7945717000D+03 0.2294150985D+00 + 0.2547232000D+03 0.4785452968D+00 + 0.8713880000D+02 0.3537752977D+00 +SP 6 1.00 + 0.1732569000D+04 0.2361459089D-02 0.3963125053D-02 + 0.4127149000D+03 0.3150177119D-01 0.3113411042D-01 + 0.1336780000D+03 0.1272774048D+00 0.1363931018D+00 + 0.5038585000D+02 -0.2145928081D-01 0.3501266047D+00 + 0.2058358000D+02 -0.6197652235D+00 0.4623179062D+00 + 0.8505940000D+01 -0.4590180174D+00 0.2004995027D+00 +SP 6 1.00 + 0.6936492000D+02 -0.4440098182D-02 -0.7689261805D-02 + 0.2362082000D+02 0.7505253308D-01 -0.2997981924D-01 + 0.1018471000D+02 0.2533111104D+00 0.7082410821D-01 + 0.4334082000D+01 -0.2881897118D+00 0.4046140897D+00 + 0.1810918000D+01 -0.7267052298D+00 0.4882324876D+00 + 0.7148410000D+00 -0.2133439088D+00 0.1751969956D+00 +SP 3 1.00 + 0.2823842000D+01 0.4898545031D-01 -0.1586762981D+00 + 0.1039543000D+01 0.2592794075D+00 0.8379326898D-01 + 0.1432640000D+00 -0.1115711463D+01 0.9840546881D+00 +SP 1 1.00 + 0.4929600000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3370764000D+02 0.9262647815D-01 + 0.9061106000D+01 0.4002979920D+00 + 0.2738383000D+01 0.6896607863D+00 +D 1 1.00 + 0.7302940000D+00 1.0000000 +**** +Ga 0 +S 6 1.00 + 0.8828461000D+05 0.1736921000D-02 + 0.1325606000D+05 0.1331136000D-01 + 0.3019649000D+04 0.6571709000D-01 + 0.8514222000D+03 0.2287932000D+00 + 0.2729997000D+03 0.4781507000D+00 + 0.9342593000D+02 0.3549154000D+00 +SP 6 1.00 + 0.1877680000D+04 0.2316733000D-02 0.3896102000D-02 + 0.4474374000D+03 0.3090570000D-01 0.3066136000D-01 + 0.1451401000D+03 0.1264173000D+00 0.1344509000D+00 + 0.5484977000D+02 -0.1429714000D-01 0.3470761000D+00 + 0.2244351000D+02 -0.6132855000D+00 0.4635435000D+00 + 0.9286622000D+01 -0.4703598000D+00 0.2039435000D+00 +SP 6 1.00 + 0.8005681000D+02 -0.5056378000D-02 -0.6947816000D-02 + 0.2757856000D+02 0.6117037000D-01 -0.2938902000D-01 + 0.1171717000D+02 0.2575692000D+00 0.5377307000D-01 + 0.5054113000D+01 -0.2150754000D+00 0.3764511000D+00 + 0.2172525000D+01 -0.7213703000D+00 0.4923913000D+00 + 0.9041840000D+00 -0.2785244000D+00 0.2073613000D+00 +SP 3 1.00 + 0.1112438000D+01 0.1970334000D+00 -0.9151867000D-02 + 0.3287220000D+00 -0.2497645000D+00 0.3111786000D+00 + 0.1305520000D+00 -0.8749447000D+00 0.7436549000D+00 +SP 1 1.00 + 0.4758900000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.3911406000D+02 0.8790043000D-01 + 0.1061218000D+02 0.3915600000D+00 + 0.3273033000D+01 0.6956990000D+00 +D 1 1.00 + 0.9156600000D+00 1.0000000 +**** +Ge 0 +S 6 1.00 + 0.9428132000D+05 0.1732993000D-02 + 0.1415642000D+05 0.1328181000D-01 + 0.3224935000D+04 0.6557319000D-01 + 0.9094821000D+03 0.2283712000D+00 + 0.2917149000D+03 0.4778104000D+00 + 0.9989074000D+02 0.3557135000D+00 +SP 6 1.00 + 0.2016629000D+04 0.2299186000D-02 0.3872605000D-02 + 0.4806599000D+03 0.3068823000D-01 0.3051218000D-01 + 0.1560616000D+03 0.1262906000D+00 0.1338971000D+00 + 0.5907914000D+02 -0.1105405000D-01 0.3462496000D+00 + 0.2422346000D+02 -0.6103659000D+00 0.4635741000D+00 + 0.1004418000D+02 -0.4755387000D+00 0.2047879000D+00 +SP 6 1.00 + 0.8728112000D+02 -0.5330845000D-02 -0.6893957000D-02 + 0.3028230000D+02 0.5874495000D-01 -0.2954252000D-01 + 0.1285367000D+02 0.2598349000D+00 0.5042291000D-01 + 0.5587437000D+01 -0.1926917000D+00 0.3699366000D+00 + 0.2438461000D+01 -0.7190570000D+00 0.4933147000D+00 + 0.1040324000D+01 -0.2995181000D+00 0.2116445000D+00 +SP 3 1.00 + 0.1344960000D+01 0.2338815000D+00 -0.1976804000D-01 + 0.4436620000D+00 -0.2189617000D+00 0.3028906000D+00 + 0.1760820000D+00 -0.9242006000D+00 0.7562828000D+00 +SP 1 1.00 + 0.6466500000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.4463105000D+02 0.8431036000D-01 + 0.1220184000D+02 0.3847726000D+00 + 0.3823423000D+01 0.7003323000D+00 +D 1 1.00 + 0.1108831000D+01 1.0000000 +**** +As 0 +S 6 1.00 + 0.1005955000D+06 0.1726750000D-02 + 0.1510482000D+05 0.1323462000D-01 + 0.3440884000D+04 0.6535848000D-01 + 0.9703961000D+03 0.2278042000D+00 + 0.3112852000D+03 0.4774525000D+00 + 0.1066284000D+03 0.3567619000D+00 +SP 6 1.00 + 0.2166679000D+04 0.2271761000D-02 0.3832156000D-02 + 0.5165414000D+03 0.3033475000D-01 0.3023558000D-01 + 0.1678674000D+03 0.1259057000D+00 0.1328632000D+00 + 0.6364638000D+02 -0.6687172000D-02 0.3447648000D+00 + 0.2613673000D+02 -0.6065306000D+00 0.4640368000D+00 + 0.1085439000D+02 -0.4823144000D+00 0.2064824000D+00 +SP 6 1.00 + 0.9506989000D+02 -0.5587423000D-02 -0.6816583000D-02 + 0.3318087000D+02 0.5632506000D-01 -0.2970303000D-01 + 0.1406773000D+02 0.2625835000D+00 0.4704335000D-01 + 0.6153288000D+01 -0.1718349000D+00 0.3645042000D+00 + 0.2721712000D+01 -0.7175645000D+00 0.4945157000D+00 + 0.1185334000D+01 -0.3184598000D+00 0.2149830000D+00 +SP 3 1.00 + 0.1615315000D+01 0.2645372000D+00 -0.2574061000D-01 + 0.5513300000D+00 -0.1952737000D+00 0.3072764000D+00 + 0.2227620000D+00 -0.9595400000D+00 0.7537368000D+00 +SP 1 1.00 + 0.8292300000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.5030227000D+02 0.8144711000D-01 + 0.1384166000D+02 0.3792908000D+00 + 0.4393458000D+01 0.7040401000D+00 +D 1 1.00 + 0.1310755000D+01 1.0000000 +**** +Se 0 +S 6 1.00 + 0.1070273000D+06 0.1722646000D-02 + 0.1607076000D+05 0.1320324000D-01 + 0.3661226000D+04 0.6520494000D-01 + 0.1032673000D+04 0.2273787000D+00 + 0.3313339000D+03 0.4771451000D+00 + 0.1135470000D+03 0.3575553000D+00 +SP 6 1.00 + 0.2313540000D+04 0.2261924000D-02 0.3818409000D-02 + 0.5516849000D+03 0.3019493000D-01 0.3015145000D-01 + 0.1794401000D+03 0.1258828000D+00 0.1325614000D+00 + 0.6813044000D+02 -0.4373809000D-02 0.3443419000D+00 + 0.2803062000D+02 -0.6043277000D+00 0.4639237000D+00 + 0.1166572000D+02 -0.4861200000D+00 0.2068198000D+00 +SP 6 1.00 + 0.1015754000D+03 -0.5752618000D-02 -0.6942389000D-02 + 0.3561545000D+02 0.5675608000D-01 -0.3014441000D-01 + 0.1513135000D+02 0.2651243000D+00 0.4776411000D-01 + 0.6646923000D+01 -0.1670582000D+00 0.3663827000D+00 + 0.2972805000D+01 -0.7188737000D+00 0.4940086000D+00 + 0.1316707000D+01 -0.3221907000D+00 0.2100109000D+00 +SP 3 1.00 + 0.1846991000D+01 0.2823156000D+00 -0.2653920000D-01 + 0.6471590000D+00 -0.2129616000D+00 0.3357291000D+00 + 0.2579870000D+00 -0.9545384000D+00 0.7301815000D+00 +SP 1 1.00 + 0.9410700000D-01 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.5618544000D+02 0.7904963000D-01 + 0.1554808000D+02 0.3746449000D+00 + 0.4989394000D+01 0.7071645000D+00 +D 1 1.00 + 0.1523844000D+01 1.0000000 +**** +Br 0 +S 6 1.00 + 0.1137182000D+06 0.1717696000D-02 + 0.1707444000D+05 0.1316744000D-01 + 0.3889576000D+04 0.6504553000D-01 + 0.1097096000D+04 0.2269505000D+00 + 0.3520624000D+03 0.4768357000D+00 + 0.1207002000D+03 0.3583677000D+00 +SP 6 1.00 + 0.2471138000D+04 0.2243687000D-02 0.3790182000D-02 + 0.5893838000D+03 0.2994853000D-01 0.2995979000D-01 + 0.1918738000D+03 0.1256009000D+00 0.1318228000D+00 + 0.7295339000D+02 -0.9832786000D-03 0.3432708000D+00 + 0.3005839000D+02 -0.6013141000D+00 0.4642345000D+00 + 0.1252927000D+02 -0.4913983000D+00 0.2079387000D+00 +SP 6 1.00 + 0.1096411000D+03 -0.5975683000D-02 -0.6907483000D-02 + 0.3858948000D+02 0.5542122000D-01 -0.3041432000D-01 + 0.1637818000D+02 0.2681200000D+00 0.4602725000D-01 + 0.7221836000D+01 -0.1543606000D+00 0.3650689000D+00 + 0.3263697000D+01 -0.7206306000D+00 0.4949232000D+00 + 0.1465499000D+01 -0.3316437000D+00 0.2090394000D+00 +SP 3 1.00 + 0.2103651000D+01 0.3029029000D+00 -0.2826714000D-01 + 0.7547050000D+00 -0.2152659000D+00 0.3503065000D+00 + 0.3005140000D+00 -0.9633941000D+00 0.7182446000D+00 +SP 1 1.00 + 0.1090710000D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.6225514000D+02 0.7704229000D-01 + 0.1731284000D+02 0.3707384000D+00 + 0.5607915000D+01 0.7097628000D+00 +D 1 1.00 + 0.1746486000D+01 1.0000000 +**** +Kr 0 +S 6 1.00 + 0.1205524000D+06 0.1714050000D-02 + 0.1810225000D+05 0.1313805000D-01 + 0.4124126000D+04 0.6490006000D-01 + 0.1163472000D+04 0.2265185000D+00 + 0.3734612000D+03 0.4764961000D+00 + 0.1280897000D+03 0.3591952000D+00 +SP 6 1.00 + 0.2634681000D+04 0.2225111000D-02 0.3761911000D-02 + 0.6284533000D+03 0.2971122000D-01 0.2977531000D-01 + 0.2047081000D+03 0.1253926000D+00 0.1311878000D+00 + 0.7790827000D+02 0.1947058000D-02 0.3425019000D+00 + 0.3213816000D+02 -0.5987388000D+00 0.4644938000D+00 + 0.1341845000D+02 -0.4958972000D+00 0.2087284000D+00 +SP 6 1.00 + 0.1175107000D+03 -0.6157662000D-02 -0.6922855000D-02 + 0.4152553000D+02 0.5464841000D-01 -0.3069239000D-01 + 0.1765290000D+02 0.2706994000D+00 0.4480260000D-01 + 0.7818313000D+01 -0.1426136000D+00 0.3636775000D+00 + 0.3571775000D+01 -0.7216781000D+00 0.4952412000D+00 + 0.1623750000D+01 -0.3412008000D+00 0.2086340000D+00 +SP 3 1.00 + 0.2374560000D+01 0.3251184000D+00 -0.3009554000D-01 + 0.8691930000D+00 -0.2141533000D+00 0.3598893000D+00 + 0.3474730000D+00 -0.9755083000D+00 0.7103098000D+00 +SP 1 1.00 + 0.1264790000D+00 0.1000000000D+01 0.1000000000D+01 +D 3 1.00 + 0.6853888000D+02 0.7530705000D-01 + 0.1914333000D+02 0.3673551000D+00 + 0.6251213000D+01 0.7120146000D+00 +D 1 1.00 + 0.1979236000D+01 1.0000000 +**** + diff --git a/basis/aug-cc-pvdz.gbf b/basis/aug-cc-pvdz.gbf new file mode 100644 index 0000000..c610b4b --- /dev/null +++ b/basis/aug-cc-pvdz.gbf @@ -0,0 +1,3522 @@ +spherical + +! +! cc-pVDZ EMSL Basis Set Exchange Library 5/17/11 11:50 AM +! Elements References +! -------- ---------- +! H : T.H. Dunning, Jr. J. Chem. Phys. 90, 1007 (1989). +! He : D.E. Woon and T.H. Dunning, Jr. J. Chem. Phys. 100, 2975 (1994). +! Li - Ne: T.H. Dunning, Jr. J. Chem. Phys. 90, 1007 (1989). +! Na - Mg: D.E. Woon and T.H. Dunning, Jr. (to be published) +! Al - Ar: D.E. Woon and T.H. Dunning, Jr. J. Chem. Phys. 98, 1358 (1993). +! Sc - Zn: N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 123, 064107 (2005), +! N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 125, 074110 (2006) +! Ca : J. Koput and K.A. Peterson, J. Phys. Chem. A, 106, 9595 (2002). +! +! +! aug-cc-pVDZ Diffuse EMSL Basis Set Exchange Library 5/17/11 12:08 PM +! Elements References +! -------- --------- +! H : T.H. Dunning, Jr. J. Chem. Phys. 90, 1007 (1989). +! He : D.E. Woon and T.H. Dunning, Jr., J. Chem. Phys. 100, 2975 (1994). +! B - F: R.A. Kendall, T.H. Dunning, Jr. and R.J. Harrison, J. Chem. Phys. 96, +! 6796 (1992). +! Al - Cl: D.E. Woon and T.H. Dunning, Jr. J. Chem. Phys. 98, 1358 (1993). +! Sc - Zn: N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 123, 064107 (2005), +! N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 125, 074110 (2006). +! +! +! merged from cc-pvdz.gbs and diffuse-aug-cc-pvdz.gbs at Tue, 16:44 May 17, 2011 +! + + + +**** +H 0 +S 3 1.00 + 13.0100000 0.0196850 + 1.9620000 0.1379770 + 0.4446000 0.4781480 +S 1 1.00 + 0.1220000 1.0000000 +P 1 1.00 + 0.7270000 1.0000000 +S 1 1.00 + 0.0297400 1.0000000 +P 1 1.00 + 0.1410000 1.0000000 +**** +He 0 +S 3 1.00 + 38.3600000 0.0238090 + 5.7700000 0.1548910 + 1.2400000 0.4699870 +S 1 1.00 + 0.2976000 1.0000000 +P 1 1.00 + 1.2750000 1.0000000 +S 1 1.00 + 0.0725500 1.0000000 +P 1 1.00 + 0.2473000 1.0000000 +**** +Li 0 +S 8 1.00 + 1469.0000000 0.0007660 + 220.5000000 0.0058920 + 50.2600000 0.0296710 + 14.2400000 0.1091800 + 4.5810000 0.2827890 + 1.5800000 0.4531230 + 0.5640000 0.2747740 + 0.0734500 0.0097510 +S 8 1.00 + 1469.0000000 -0.0001200 + 220.5000000 -0.0009230 + 50.2600000 -0.0046890 + 14.2400000 -0.0176820 + 4.5810000 -0.0489020 + 1.5800000 -0.0960090 + 0.5640000 -0.1363800 + 0.0734500 0.5751020 +S 1 1.00 + 0.0280500 1.0000000 +P 3 1.00 + 1.5340000 0.0227840 + 0.2749000 0.1391070 + 0.0736200 0.5003750 +P 1 1.00 + 0.0240300 1.0000000 +D 1 1.00 + 0.1239000 1.0000000 +S 1 1.00 + 0.0086400 1.0000000 +P 1 1.00 + 0.0057900 1.0000000 +D 1 1.00 + 0.0725000 1.0000000 +**** +Be 0 +S 8 1.00 + 2940.0000000 0.0006800 + 441.2000000 0.0052360 + 100.5000000 0.0266060 + 28.4300000 0.0999930 + 9.1690000 0.2697020 + 3.1960000 0.4514690 + 1.1590000 0.2950740 + 0.1811000 0.0125870 +S 8 1.00 + 2940.0000000 -0.0001230 + 441.2000000 -0.0009660 + 100.5000000 -0.0048310 + 28.4300000 -0.0193140 + 9.1690000 -0.0532800 + 3.1960000 -0.1207230 + 1.1590000 -0.1334350 + 0.1811000 0.5307670 +S 1 1.00 + 0.0589000 1.0000000 +P 3 1.00 + 3.6190000 0.0291110 + 0.7110000 0.1693650 + 0.1951000 0.5134580 +P 1 1.00 + 0.0601800 1.0000000 +D 1 1.00 + 0.2380000 1.0000000 +S 1 1.00 + 0.0187700 1.0000000 +P 1 1.00 + 0.0085000 1.0000000 +D 1 1.00 + 0.0740000 1.0000000 +**** +B 0 +S 8 1.00 + 4570.0000000 0.0006960 + 685.9000000 0.0053530 + 156.5000000 0.0271340 + 44.4700000 0.1013800 + 14.4800000 0.2720550 + 5.1310000 0.4484030 + 1.8980000 0.2901230 + 0.3329000 0.0143220 +S 8 1.00 + 4570.0000000 -0.0001390 + 685.9000000 -0.0010970 + 156.5000000 -0.0054440 + 44.4700000 -0.0219160 + 14.4800000 -0.0597510 + 5.1310000 -0.1387320 + 1.8980000 -0.1314820 + 0.3329000 0.5395260 +S 1 1.00 + 0.1043000 1.0000000 +P 3 1.00 + 6.0010000 0.0354810 + 1.2410000 0.1980720 + 0.3364000 0.5052300 +P 1 1.00 + 0.0953800 1.0000000 +D 1 1.00 + 0.3430000 1.0000000 +S 1 1.00 + 0.0310500 1.0000000 +P 1 1.00 + 0.0237800 1.0000000 +D 1 1.00 + 0.0904000 1.0000000 +**** +C 0 +S 8 1.00 + 6665.0000000 0.0006920 + 1000.0000000 0.0053290 + 228.0000000 0.0270770 + 64.7100000 0.1017180 + 21.0600000 0.2747400 + 7.4950000 0.4485640 + 2.7970000 0.2850740 + 0.5215000 0.0152040 +S 8 1.00 + 6665.0000000 -0.0001460 + 1000.0000000 -0.0011540 + 228.0000000 -0.0057250 + 64.7100000 -0.0233120 + 21.0600000 -0.0639550 + 7.4950000 -0.1499810 + 2.7970000 -0.1272620 + 0.5215000 0.5445290 +S 1 1.00 + 0.1596000 1.0000000 +P 3 1.00 + 9.4390000 0.0381090 + 2.0020000 0.2094800 + 0.5456000 0.5085570 +P 1 1.00 + 0.1517000 1.0000000 +D 1 1.00 + 0.5500000 1.0000000 +S 1 1.00 + 0.0469000 1.0000000 +P 1 1.00 + 0.0404100 1.0000000 +D 1 1.00 + 0.1510000 1.0000000 +**** +N 0 +S 8 1.00 + 9046.0000000 0.0007000 + 1357.0000000 0.0053890 + 309.3000000 0.0274060 + 87.7300000 0.1032070 + 28.5600000 0.2787230 + 10.2100000 0.4485400 + 3.8380000 0.2782380 + 0.7466000 0.0154400 +S 8 1.00 + 9046.0000000 -0.0001530 + 1357.0000000 -0.0012080 + 309.3000000 -0.0059920 + 87.7300000 -0.0245440 + 28.5600000 -0.0674590 + 10.2100000 -0.1580780 + 3.8380000 -0.1218310 + 0.7466000 0.5490030 +S 1 1.00 + 0.2248000 1.0000000 +P 3 1.00 + 13.5500000 0.0399190 + 2.9170000 0.2171690 + 0.7973000 0.5103190 +P 1 1.00 + 0.2185000 1.0000000 +D 1 1.00 + 0.8170000 1.0000000 +S 1 1.00 + 0.0612400 1.0000000 +P 1 1.00 + 0.0561100 1.0000000 +D 1 1.00 + 0.2300000 1.0000000 +**** +O 0 +S 8 1.00 + 11720.0000000 0.0007100 + 1759.0000000 0.0054700 + 400.8000000 0.0278370 + 113.7000000 0.1048000 + 37.0300000 0.2830620 + 13.2700000 0.4487190 + 5.0250000 0.2709520 + 1.0130000 0.0154580 +S 8 1.00 + 11720.0000000 -0.0001600 + 1759.0000000 -0.0012630 + 400.8000000 -0.0062670 + 113.7000000 -0.0257160 + 37.0300000 -0.0709240 + 13.2700000 -0.1654110 + 5.0250000 -0.1169550 + 1.0130000 0.5573680 +S 1 1.00 + 0.3023000 1.0000000 +P 3 1.00 + 17.7000000 0.0430180 + 3.8540000 0.2289130 + 1.0460000 0.5087280 +P 1 1.00 + 0.2753000 1.0000000 +D 1 1.00 + 1.1850000 1.0000000 +S 1 1.00 + 0.0789600 1.0000000 +P 1 1.00 + 0.0685600 1.0000000 +D 1 1.00 + 0.3320000 1.0000000 +**** +F 0 +S 8 1.00 + 14710.0000000 0.0007210 + 2207.0000000 0.0055530 + 502.8000000 0.0282670 + 142.6000000 0.1064440 + 46.4700000 0.2868140 + 16.7000000 0.4486410 + 6.3560000 0.2647610 + 1.3160000 0.0153330 +S 8 1.00 + 14710.0000000 -0.0001650 + 2207.0000000 -0.0013080 + 502.8000000 -0.0064950 + 142.6000000 -0.0266910 + 46.4700000 -0.0736900 + 16.7000000 -0.1707760 + 6.3560000 -0.1123270 + 1.3160000 0.5628140 +S 1 1.00 + 0.3897000 1.0000000 +P 3 1.00 + 22.6700000 0.0448780 + 4.9770000 0.2357180 + 1.3470000 0.5085210 +P 1 1.00 + 0.3471000 1.0000000 +D 1 1.00 + 1.6400000 1.0000000 +S 1 1.00 + 0.0986300 1.0000000 +P 1 1.00 + 0.0850200 1.0000000 +D 1 1.00 + 0.4640000 1.0000000 +**** +Ne 0 +S 8 1.00 + 17880.0000000 0.0007380 + 2683.0000000 0.0056770 + 611.5000000 0.0288830 + 173.5000000 0.1085400 + 56.6400000 0.2909070 + 20.4200000 0.4483240 + 7.8100000 0.2580260 + 1.6530000 0.0150630 +S 8 1.00 + 17880.0000000 -0.0001720 + 2683.0000000 -0.0013570 + 611.5000000 -0.0067370 + 173.5000000 -0.0276630 + 56.6400000 -0.0762080 + 20.4200000 -0.1752270 + 7.8100000 -0.1070380 + 1.6530000 0.5670500 +S 1 1.00 + 0.4869000 1.0000000 +P 3 1.00 + 28.3900000 0.0460870 + 6.2700000 0.2401810 + 1.6950000 0.5087440 +P 1 1.00 + 0.4317000 1.0000000 +D 1 1.00 + 2.2020000 1.0000000 +S 1 1.00 + 0.1230000 1.0000000 +P 1 1.00 + 0.1064000 1.0000000 +D 1 1.00 + 0.6310000 1.0000000 +**** +Na 0 +S 11 1.00 + 31700.0000000 0.458878D-03 + 4755.0000000 0.355070D-02 + 1082.0000000 0.182618D-01 + 306.4000000 0.716650D-01 + 99.5300000 0.212346D+00 + 35.4200000 0.416203D+00 + 13.3000000 0.373020D+00 + 4.3920000 0.625054D-01 + 1.6760000 -0.624532D-02 + 0.5889000 0.243374D-02 + 0.0564000 -0.442381D-03 +S 11 1.00 + 31700.0000000 -0.112162D-03 + 4755.0000000 -0.868512D-03 + 1082.0000000 -0.451330D-02 + 306.4000000 -0.181436D-01 + 99.5300000 -0.580799D-01 + 35.4200000 -0.137653D+00 + 13.3000000 -0.193908D+00 + 4.3920000 0.858009D-01 + 1.6760000 0.604419D+00 + 0.5889000 0.441719D+00 + 0.0564000 0.130547D-01 +S 11 1.00 + 31700.0000000 0.170160D-04 + 4755.0000000 0.130693D-03 + 1082.0000000 0.687784D-03 + 306.4000000 0.272359D-02 + 99.5300000 0.895529D-02 + 35.4200000 0.207832D-01 + 13.3000000 0.319380D-01 + 4.3920000 -0.191368D-01 + 1.6760000 -0.102595D+00 + 0.5889000 -0.198945D+00 + 0.0564000 0.655952D+00 +S 1 1.00 + 0.0230700 1.0000000 +P 7 1.00 + 138.1000000 0.579641D-02 + 32.2400000 0.415756D-01 + 9.9850000 0.162873D+00 + 3.4840000 0.359401D+00 + 1.2310000 0.449988D+00 + 0.4177000 0.227507D+00 + 0.0651300 0.808247D-02 +P 7 1.00 + 138.1000000 -0.581531D-03 + 32.2400000 -0.407306D-02 + 9.9850000 -0.167937D-01 + 3.4840000 -0.353268D-01 + 1.2310000 -0.521971D-01 + 0.4177000 -0.168359D-01 + 0.0651300 0.434613D+00 +P 1 1.00 + 0.0205300 1.0000000 +D 1 1.00 + 0.0973000 1.0000000 +S 1 1.00 + 0.0072500 1.0000000 +P 1 1.00 + 0.0063300 1.0000000 +D 1 1.00 + 0.0468000 1.0000000 +**** +Mg 0 +S 11 1.00 + 47390.0000000 0.346023D-03 + 7108.0000000 0.268077D-02 + 1618.0000000 0.138367D-01 + 458.4000000 0.551767D-01 + 149.3000000 0.169660D+00 + 53.5900000 0.364703D+00 + 20.7000000 0.406856D+00 + 8.3840000 0.135089D+00 + 2.5420000 0.490884D-02 + 0.8787000 0.286460D-03 + 0.1077000 0.264590D-04 +S 11 1.00 + 47390.0000000 -0.877839D-04 + 7108.0000000 -0.674725D-03 + 1618.0000000 -0.355603D-02 + 458.4000000 -0.142154D-01 + 149.3000000 -0.476748D-01 + 53.5900000 -0.114892D+00 + 20.7000000 -0.200676D+00 + 8.3840000 -0.341224D-01 + 2.5420000 0.570454D+00 + 0.8787000 0.542309D+00 + 0.1077000 0.218128D-01 +S 11 1.00 + 47390.0000000 0.169628D-04 + 7108.0000000 0.129865D-03 + 1618.0000000 0.688831D-03 + 458.4000000 0.273533D-02 + 149.3000000 0.931224D-02 + 53.5900000 0.223265D-01 + 20.7000000 0.411195D-01 + 8.3840000 0.545642D-02 + 2.5420000 -0.134012D+00 + 0.8787000 -0.256176D+00 + 0.1077000 0.605856D+00 +S 1 1.00 + 0.0399900 1.0000000 +P 7 1.00 + 179.9000000 0.538161D-02 + 42.1400000 0.392418D-01 + 13.1300000 0.157445D+00 + 4.6280000 0.358535D+00 + 1.6700000 0.457226D+00 + 0.5857000 0.215918D+00 + 0.1311000 0.664948D-02 +P 7 1.00 + 179.9000000 -0.865948D-03 + 42.1400000 -0.615978D-02 + 13.1300000 -0.261519D-01 + 4.6280000 -0.570647D-01 + 1.6700000 -0.873906D-01 + 0.5857000 -0.122990D-01 + 0.1311000 0.502085D+00 +P 1 1.00 + 0.0411200 1.0000000 +D 1 1.00 + 0.1870000 1.0000000 +S 1 1.00 + 0.0148800 1.0000000 +P 1 1.00 + 0.0093500 1.0000000 +D 1 1.00 + 0.0595000 1.0000000 +**** +Al 0 +S 11 1.00 + 64150.0000000 0.290250D-03 + 9617.0000000 0.225064D-02 + 2189.0000000 0.116459D-01 + 620.5000000 0.467377D-01 + 202.7000000 0.146299D+00 + 73.1500000 0.330283D+00 + 28.5500000 0.415861D+00 + 11.7700000 0.189253D+00 + 3.3000000 0.115889D-01 + 1.1730000 -0.128385D-02 + 0.1752000 0.425883D-03 +S 11 1.00 + 64150.0000000 -0.758048D-04 + 9617.0000000 -0.581791D-03 + 2189.0000000 -0.308113D-02 + 620.5000000 -0.123112D-01 + 202.7000000 -0.419781D-01 + 73.1500000 -0.103371D+00 + 28.5500000 -0.196308D+00 + 11.7700000 -0.830002D-01 + 3.3000000 0.541040D+00 + 1.1730000 0.578796D+00 + 0.1752000 0.288147D-01 +S 11 1.00 + 64150.0000000 0.175078D-04 + 9617.0000000 0.134208D-03 + 2189.0000000 0.712442D-03 + 620.5000000 0.284330D-02 + 202.7000000 0.976842D-02 + 73.1500000 0.241850D-01 + 28.5500000 0.474993D-01 + 11.7700000 0.203621D-01 + 3.3000000 -0.158788D+00 + 1.1730000 -0.311694D+00 + 0.1752000 0.620147D+00 +S 1 1.00 + 0.0647300 1.0000000 +P 7 1.00 + 258.8000000 0.406847D-02 + 60.8900000 0.306815D-01 + 19.1400000 0.129149D+00 + 6.8810000 0.320831D+00 + 2.5740000 0.453815D+00 + 0.9572000 0.275066D+00 + 0.2099000 0.190807D-01 +P 7 1.00 + 258.8000000 -0.748053D-03 + 60.8900000 -0.545796D-02 + 19.1400000 -0.245371D-01 + 6.8810000 -0.582138D-01 + 2.5740000 -0.983756D-01 + 0.9572000 -0.260064D-01 + 0.2099000 0.464020D+00 +P 1 1.00 + 0.0598600 1.0000000 +D 1 1.00 + 0.1890000 1.0000000 +S 1 1.00 + 0.0231000 1.0000000 +P 1 1.00 + 0.0153000 1.0000000 +D 1 1.00 + 0.0535000 1.0000000 +**** +Si 0 +S 11 1.00 + 78860.0000000 0.270443D-03 + 11820.0000000 0.209717D-02 + 2692.0000000 0.108506D-01 + 763.4000000 0.436754D-01 + 249.6000000 0.137653D+00 + 90.2800000 0.316644D+00 + 35.2900000 0.418581D+00 + 14.5100000 0.210212D+00 + 4.0530000 0.144952D-01 + 1.4820000 -0.203590D-02 + 0.2517000 0.624186D-03 +S 11 1.00 + 78860.0000000 -0.723177D-04 + 11820.0000000 -0.555116D-03 + 2692.0000000 -0.293805D-02 + 763.4000000 -0.117687D-01 + 249.6000000 -0.402907D-01 + 90.2800000 -0.100609D+00 + 35.2900000 -0.196528D+00 + 14.5100000 -0.102382D+00 + 4.0530000 0.527190D+00 + 1.4820000 0.593251D+00 + 0.2517000 0.332652D-01 +S 11 1.00 + 78860.0000000 0.185113D-04 + 11820.0000000 0.142236D-03 + 2692.0000000 0.752185D-03 + 763.4000000 0.302279D-02 + 249.6000000 0.103677D-01 + 90.2800000 0.262563D-01 + 35.2900000 0.523989D-01 + 14.5100000 0.290959D-01 + 4.0530000 -0.178003D+00 + 1.4820000 -0.346874D+00 + 0.2517000 0.623020D+00 +S 1 1.00 + 0.0924300 1.0000000 +P 7 1.00 + 315.9000000 0.392656D-02 + 74.4200000 0.298811D-01 + 23.4800000 0.127212D+00 + 8.4880000 0.320943D+00 + 3.2170000 0.455429D+00 + 1.2290000 0.268563D+00 + 0.2964000 0.188336D-01 +P 7 1.00 + 315.9000000 -0.858302D-03 + 74.4200000 -0.630328D-02 + 23.4800000 -0.288255D-01 + 8.4880000 -0.694560D-01 + 3.2170000 -0.119493D+00 + 1.2290000 -0.199581D-01 + 0.2964000 0.510268D+00 +P 1 1.00 + 0.0876800 1.0000000 +D 1 1.00 + 0.2750000 1.0000000 +S 1 1.00 + 0.0332000 1.0000000 +P 1 1.00 + 0.0250000 1.0000000 +D 1 1.00 + 0.0823000 1.0000000 +**** +P 0 +S 11 1.00 + 94840.0000000 0.255509D-03 + 14220.0000000 0.198193D-02 + 3236.0000000 0.102760D-01 + 917.1000000 0.414823D-01 + 299.5000000 0.131984D+00 + 108.1000000 0.308662D+00 + 42.1800000 0.420647D+00 + 17.2800000 0.222878D+00 + 4.8580000 0.164035D-01 + 1.8180000 -0.254255D-02 + 0.3372000 0.748050D-03 +S 11 1.00 + 94840.0000000 -0.696939D-04 + 14220.0000000 -0.535266D-03 + 3236.0000000 -0.283709D-02 + 917.1000000 -0.113983D-01 + 299.5000000 -0.392929D-01 + 108.1000000 -0.996364D-01 + 42.1800000 -0.197983D+00 + 17.2800000 -0.114860D+00 + 4.8580000 0.518595D+00 + 1.8180000 0.601847D+00 + 0.3372000 0.368612D-01 +S 11 1.00 + 94840.0000000 0.191199D-04 + 14220.0000000 0.147223D-03 + 3236.0000000 0.777912D-03 + 917.1000000 0.314546D-02 + 299.5000000 0.108200D-01 + 108.1000000 0.279957D-01 + 42.1800000 0.563978D-01 + 17.2800000 0.358190D-01 + 4.8580000 -0.193387D+00 + 1.8180000 -0.372097D+00 + 0.3372000 0.624246D+00 +S 1 1.00 + 0.1232000 1.0000000 +P 7 1.00 + 370.5000000 0.395005D-02 + 87.3300000 0.302492D-01 + 27.5900000 0.129554D+00 + 10.0000000 0.327594D+00 + 3.8250000 0.456992D+00 + 1.4940000 0.253086D+00 + 0.3921000 0.168798D-01 +P 7 1.00 + 370.5000000 -0.959832D-03 + 87.3300000 -0.711177D-02 + 27.5900000 -0.327122D-01 + 10.0000000 -0.795784D-01 + 3.8250000 -0.135016D+00 + 1.4940000 -0.910585D-02 + 0.3921000 0.537802D+00 +P 1 1.00 + 0.1186000 1.0000000 +D 1 1.00 + 0.3730000 1.0000000 +S 1 1.00 + 0.0417000 1.0000000 +P 1 1.00 + 0.0343000 1.0000000 +D 1 1.00 + 0.1130000 1.0000000 +**** +S 0 +S 11 1.00 + 110800.0000000 0.247635D-03 + 16610.0000000 0.192026D-02 + 3781.0000000 0.996192D-02 + 1071.0000000 0.402975D-01 + 349.8000000 0.128604D+00 + 126.3000000 0.303480D+00 + 49.2600000 0.421432D+00 + 20.1600000 0.230781D+00 + 5.7200000 0.178971D-01 + 2.1820000 -0.297516D-02 + 0.4327000 0.849522D-03 +S 11 1.00 + 110800.0000000 -0.687039D-04 + 16610.0000000 -0.527681D-03 + 3781.0000000 -0.279671D-02 + 1071.0000000 -0.112651D-01 + 349.8000000 -0.388834D-01 + 126.3000000 -0.995025D-01 + 49.2600000 -0.199740D+00 + 20.1600000 -0.123360D+00 + 5.7200000 0.513194D+00 + 2.1820000 0.607120D+00 + 0.4327000 0.396753D-01 +S 11 1.00 + 110800.0000000 0.199077D-04 + 16610.0000000 0.153483D-03 + 3781.0000000 0.809503D-03 + 1071.0000000 0.328974D-02 + 349.8000000 0.112967D-01 + 126.3000000 0.296385D-01 + 49.2600000 0.599851D-01 + 20.1600000 0.413248D-01 + 5.7200000 -0.207474D+00 + 2.1820000 -0.392889D+00 + 0.4327000 0.632840D+00 +S 1 1.00 + 0.1570000 1.0000000 +P 7 1.00 + 399.7000000 0.447541D-02 + 94.1900000 0.341708D-01 + 29.7500000 0.144250D+00 + 10.7700000 0.353928D+00 + 4.1190000 0.459085D+00 + 1.6250000 0.206383D+00 + 0.4726000 0.102141D-01 +P 7 1.00 + 399.7000000 -0.116251D-02 + 94.1900000 -0.865664D-02 + 29.7500000 -0.390886D-01 + 10.7700000 -0.934625D-01 + 4.1190000 -0.147994D+00 + 1.6250000 0.301904D-01 + 0.4726000 0.561573D+00 +P 1 1.00 + 0.1407000 1.0000000 +D 1 1.00 + 0.4790000 1.0000000 +S 1 1.00 + 0.0507000 1.0000000 +P 1 1.00 + 0.0399000 1.0000000 +D 1 1.00 + 0.1520000 1.0000000 +**** +Cl 0 +S 11 1.00 + 127900.0000000 0.241153D-03 + 19170.0000000 0.187095D-02 + 4363.0000000 0.970827D-02 + 1236.0000000 0.393153D-01 + 403.6000000 0.125932D+00 + 145.7000000 0.299341D+00 + 56.8100000 0.421886D+00 + 23.2300000 0.237201D+00 + 6.6440000 0.191531D-01 + 2.5750000 -0.334792D-02 + 0.5371000 0.929883D-03 +S 11 1.00 + 127900.0000000 -0.678922D-04 + 19170.0000000 -0.521836D-03 + 4363.0000000 -0.276513D-02 + 1236.0000000 -0.111537D-01 + 403.6000000 -0.385919D-01 + 145.7000000 -0.994848D-01 + 56.8100000 -0.201392D+00 + 23.2300000 -0.130313D+00 + 6.6440000 0.509443D+00 + 2.5750000 0.610725D+00 + 0.5371000 0.421549D-01 +S 11 1.00 + 127900.0000000 0.204986D-04 + 19170.0000000 0.158298D-03 + 4363.0000000 0.833639D-03 + 1236.0000000 0.339880D-02 + 403.6000000 0.116738D-01 + 145.7000000 0.309622D-01 + 56.8100000 0.629533D-01 + 23.2300000 0.460257D-01 + 6.6440000 -0.219312D+00 + 2.5750000 -0.408773D+00 + 0.5371000 0.638465D+00 +S 1 1.00 + 0.1938000 1.0000000 +P 7 1.00 + 417.6000000 0.525982D-02 + 98.3300000 0.398332D-01 + 31.0400000 0.164655D+00 + 11.1900000 0.387322D+00 + 4.2490000 0.457072D+00 + 1.6240000 0.151636D+00 + 0.5322000 0.181615D-02 +P 7 1.00 + 417.6000000 -0.143570D-02 + 98.3300000 -0.107796D-01 + 31.0400000 -0.470075D-01 + 11.1900000 -0.111030D+00 + 4.2490000 -0.153275D+00 + 1.6240000 0.894609D-01 + 0.5322000 0.579444D+00 +P 1 1.00 + 0.1620000 1.0000000 +D 1 1.00 + 0.6000000 1.0000000 +S 1 1.00 + 0.0608000 1.0000000 +P 1 1.00 + 0.0466000 1.0000000 +D 1 1.00 + 0.1960000 1.0000000 +**** +Ar 0 +S 11 1.00 + 145700.0000000 0.236700D-03 + 21840.0000000 0.183523D-02 + 4972.0000000 0.952860D-02 + 1408.0000000 0.386283D-01 + 459.7000000 0.124081D+00 + 165.9000000 0.296471D+00 + 64.6900000 0.422068D+00 + 26.4400000 0.241711D+00 + 7.6280000 0.200509D-01 + 2.9960000 -0.361000D-02 + 0.6504000 0.975607D-03 +S 11 1.00 + 145700.0000000 -0.674910D-04 + 21840.0000000 -0.518522D-03 + 4972.0000000 -0.274825D-02 + 1408.0000000 -0.111007D-01 + 459.7000000 -0.384820D-01 + 165.9000000 -0.997599D-01 + 64.6900000 -0.203088D+00 + 26.4400000 -0.135608D+00 + 7.6280000 0.507195D+00 + 2.9960000 0.612898D+00 + 0.6504000 0.442968D-01 +S 11 1.00 + 145700.0000000 0.210457D-04 + 21840.0000000 0.162565D-03 + 4972.0000000 0.855463D-03 + 1408.0000000 0.349745D-02 + 459.7000000 0.120156D-01 + 165.9000000 0.321368D-01 + 64.6900000 0.655279D-01 + 26.4400000 0.499370D-01 + 7.6280000 -0.229769D+00 + 2.9960000 -0.421006D+00 + 0.6504000 0.642331D+00 +S 1 1.00 + 0.2337000 1.0000000 +P 7 1.00 + 453.7000000 0.570555D-02 + 106.8000000 0.430460D-01 + 33.7300000 0.176591D+00 + 12.1300000 0.406863D+00 + 4.5940000 0.452549D+00 + 1.6780000 0.122801D+00 + 0.5909000 -0.445996D-02 +P 7 1.00 + 453.7000000 -0.160655D-02 + 106.8000000 -0.121714D-01 + 33.7300000 -0.520789D-01 + 12.1300000 -0.123737D+00 + 4.5940000 -0.151619D+00 + 1.6780000 0.142425D+00 + 0.5909000 0.584501D+00 +P 1 1.00 + 0.1852000 1.0000000 +D 1 1.00 + 0.7380000 1.0000000 +S 1 1.00 + 0.0709000 1.0000000 +P 1 1.00 + 0.0533000 1.0000000 +D 1 1.00 + 0.2400000 1.0000000 +**** +Sc 0 +S 19 1.00 + 2.715278E+06 8.147221E-06 + 4.065984E+05 6.334788E-05 + 9.253004E+04 3.330384E-04 + 2.620792E+04 1.404055E-03 + 8.549429E+03 5.081725E-03 + 3.085975E+03 1.626926E-02 + 1.203172E+03 4.624577E-02 + 4.984869E+02 1.137223E-01 + 2.167360E+02 2.257636E-01 + 9.787476E+01 3.106700E-01 + 4.520433E+01 2.191906E-01 + 2.021187E+01 7.215879E-02 + 9.574751E+00 1.187030E-01 + 4.540346E+00 1.220532E-01 + 1.995687E+00 2.136795E-02 + 9.422150E-01 -5.357246E-04 + 4.178450E-01 2.435774E-04 + 9.576100E-02 -8.796617E-05 + 5.135100E-02 7.878246E-05 +S 19 1.00 + 2.715278E+06 -4.722109E-06 + 4.065984E+05 -3.671829E-05 + 9.253004E+04 -1.930883E-04 + 2.620792E+04 -8.146870E-04 + 8.549429E+03 -2.955526E-03 + 3.085975E+03 -9.520035E-03 + 1.203172E+03 -2.746858E-02 + 4.984869E+02 -6.991528E-02 + 2.167360E+02 -1.499251E-01 + 9.787476E+01 -2.459153E-01 + 4.520433E+01 -2.401293E-01 + 2.021187E+01 3.567987E-02 + 9.574751E+00 4.915023E-01 + 4.540346E+00 4.911381E-01 + 1.995687E+00 9.120633E-02 + 9.422150E-01 -5.356723E-03 + 4.178450E-01 8.812836E-04 + 9.576100E-02 -7.605536E-04 + 5.135100E-02 6.340116E-04 +S 19 1.00 + 2.715278E+06 9.139905E-07 + 4.065984E+05 7.108513E-06 + 9.253004E+04 3.738126E-05 + 2.620792E+04 1.578828E-04 + 8.549429E+03 5.737686E-04 + 3.085975E+03 1.859244E-03 + 1.203172E+03 5.433182E-03 + 4.984869E+02 1.425387E-02 + 2.167360E+02 3.246144E-02 + 9.787476E+01 6.003454E-02 + 4.520433E+01 6.916105E-02 + 2.021187E+01 -2.113084E-02 + 9.574751E+00 -2.666832E-01 + 4.540346E+00 -4.367591E-01 + 1.995687E+00 6.498243E-02 + 9.422150E-01 7.009599E-01 + 4.178450E-01 4.515562E-01 + 9.576100E-02 3.011910E-02 + 5.135100E-02 -1.329480E-02 +S 19 1.00 + 2.715278E+06 -2.201951E-07 + 4.065984E+05 -1.711419E-06 + 9.253004E+04 -9.008469E-06 + 2.620792E+04 -3.799997E-05 + 8.549429E+03 -1.383227E-04 + 3.085975E+03 -4.473692E-04 + 1.203172E+03 -1.310691E-03 + 4.984869E+02 -3.429860E-03 + 2.167360E+02 -7.847579E-03 + 9.787476E+01 -1.447189E-02 + 4.520433E+01 -1.690669E-02 + 2.021187E+01 5.396115E-03 + 9.574751E+00 6.671062E-02 + 4.540346E+00 1.178356E-01 + 1.995687E+00 -2.738134E-02 + 9.422150E-01 -2.260149E-01 + 4.178450E-01 -3.073539E-01 + 9.576100E-02 2.544054E-01 + 5.135100E-02 5.981590E-01 +S 19 1.00 + 2.715278E+06 -3.757238E-07 + 4.065984E+05 -2.981907E-06 + 9.253004E+04 -1.522586E-05 + 2.620792E+04 -6.684686E-05 + 8.549429E+03 -2.313129E-04 + 3.085975E+03 -7.959729E-04 + 1.203172E+03 -2.161961E-03 + 4.984869E+02 -6.206459E-03 + 2.167360E+02 -1.261905E-02 + 9.787476E+01 -2.739459E-02 + 4.520433E+01 -2.336516E-02 + 2.021187E+01 -5.734627E-03 + 9.574751E+00 1.536025E-01 + 4.540346E+00 1.447100E-01 + 1.995687E+00 9.359699E-02 + 9.422150E-01 -8.687730E-01 + 4.178450E-01 2.114597E-02 + 9.576100E-02 2.275498E+00 + 5.135100E-02 -1.190770E+00 +S 1 1.00 + 2.387800E-02 1.0000000 +P 15 1.00 + 1.059219E+04 4.500000E-05 + 2.507533E+03 4.010000E-04 + 8.144571E+02 2.302000E-03 + 3.115195E+02 1.003700E-02 + 1.319617E+02 3.495400E-02 + 5.998718E+01 9.790900E-02 + 2.866250E+01 2.106800E-01 + 1.410851E+01 3.300930E-01 + 7.103706E+00 3.310270E-01 + 3.609200E+00 1.579600E-01 + 1.776070E+00 2.209900E-02 + 8.547600E-01 -1.605000E-03 + 4.022390E-01 -1.326000E-03 + 1.546650E-01 -2.800000E-04 + 6.494500E-02 3.400000E-05 +P 15 1.00 + 1.059219E+04 -1.500000E-05 + 2.507533E+03 -1.310000E-04 + 8.144571E+02 -7.570000E-04 + 3.115195E+02 -3.318000E-03 + 1.319617E+02 -1.170600E-02 + 5.998718E+01 -3.360400E-02 + 2.866250E+01 -7.487900E-02 + 1.410851E+01 -1.225480E-01 + 7.103706E+00 -1.302760E-01 + 3.609200E+00 1.459600E-02 + 1.776070E+00 3.091840E-01 + 8.547600E-01 4.629980E-01 + 4.022390E-01 3.049570E-01 + 1.546650E-01 5.087800E-02 + 6.494500E-02 -4.493000E-03 +P 15 1.00 + 1.059219E+04 -4.000000E-06 + 2.507533E+03 -3.200000E-05 + 8.144571E+02 -1.850000E-04 + 3.115195E+02 -8.080000E-04 + 1.319617E+02 -2.870000E-03 + 5.998718E+01 -8.207000E-03 + 2.866250E+01 -1.847300E-02 + 1.410851E+01 -3.010100E-02 + 7.103706E+00 -3.294300E-02 + 3.609200E+00 7.958000E-03 + 1.776070E+00 8.799300E-02 + 8.547600E-01 1.523770E-01 + 4.022390E-01 9.717000E-02 + 1.546650E-01 -2.569380E-01 + 6.494500E-02 -5.878150E-01 +P 15 1.00 + 1.059219E+04 4.000000E-06 + 2.507533E+03 3.900000E-05 + 8.144571E+02 2.210000E-04 + 3.115195E+02 9.840000E-04 + 1.319617E+02 3.423000E-03 + 5.998718E+01 9.993000E-03 + 2.866250E+01 2.191600E-02 + 1.410851E+01 3.700800E-02 + 7.103706E+00 3.779400E-02 + 3.609200E+00 -4.379000E-03 + 1.776070E+00 -1.101640E-01 + 8.547600E-01 -1.610170E-01 + 4.022390E-01 -1.824820E-01 + 1.546650E-01 3.886110E-01 + 6.494500E-02 6.911000E-01 +P 1 1.00 + 2.635900E-02 1.0000000 +D 7 1.00 + 5.051380E+01 4.266000E-03 + 1.474050E+01 2.770800E-02 + 5.195000E+00 1.000010E-01 + 2.028460E+00 2.315810E-01 + 8.040860E-01 3.460330E-01 + 3.076890E-01 3.733740E-01 + 1.113920E-01 2.642880E-01 +D 7 1.00 + 5.051380E+01 -4.389000E-03 + 1.474050E+01 -2.836300E-02 + 5.195000E+00 -1.051370E-01 + 2.028460E+00 -2.348540E-01 + 8.040860E-01 -3.246090E-01 + 3.076890E-01 -6.428900E-02 + 1.113920E-01 6.017490E-01 +D 1 1.00 + 3.735200E-02 1.0000000 +F 2 1.00 + 7.126000E-01 3.617450E-01 + 1.636000E-01 8.218680E-01 +S 1 1.00 + 1.110000E-02 1.0000000 +P 1 1.00 + 1.066000E-02 1.0000000 +D 1 1.00 + 1.244000E-02 1.0000000 +F 1 1.00 + 4.063000E-02 1.0000000 +**** +Ti 0 +S 19 1.00 + 3.014643E+06 8.060782E-06 + 4.514329E+05 6.267518E-05 + 1.027338E+05 3.295006E-04 + 2.909817E+04 1.389203E-03 + 9.492330E+03 5.028469E-03 + 3.426346E+03 1.610419E-02 + 1.335896E+03 4.581232E-02 + 5.535026E+02 1.128613E-01 + 2.406925E+02 2.248193E-01 + 1.087293E+02 3.114571E-01 + 5.026457E+01 2.224995E-01 + 2.258004E+01 7.293128E-02 + 1.071432E+01 1.160683E-01 + 5.093546E+00 1.194774E-01 + 2.244183E+00 2.097868E-02 + 1.059570E+00 -5.091715E-04 + 4.688490E-01 2.217859E-04 + 1.061430E-01 -7.636896E-05 + 5.526200E-02 7.719539E-05 +S 19 1.00 + 3.014643E+06 -4.630486E-06 + 4.514329E+05 -3.600451E-05 + 1.027338E+05 -1.893420E-04 + 2.909817E+04 -7.988781E-04 + 9.492330E+03 -2.898698E-03 + 3.426346E+03 -9.339701E-03 + 1.335896E+03 -2.697464E-02 + 5.535026E+02 -6.878913E-02 + 2.406925E+02 -1.481037E-01 + 1.087293E+02 -2.445253E-01 + 5.026457E+01 -2.419916E-01 + 2.258004E+01 3.183790E-02 + 1.071432E+01 4.932686E-01 + 5.093546E+00 4.939655E-01 + 2.244183E+00 9.196313E-02 + 1.059570E+00 -5.316992E-03 + 4.688490E-01 8.085624E-04 + 1.061430E-01 -6.918459E-04 + 5.526200E-02 6.086512E-04 +S 19 1.00 + 3.014643E+06 9.230559E-07 + 4.514329E+05 7.178974E-06 + 1.027338E+05 3.775134E-05 + 2.909817E+04 1.594532E-04 + 9.492330E+03 5.795150E-04 + 3.426346E+03 1.878414E-03 + 1.335896E+03 5.492747E-03 + 5.535026E+02 1.443297E-02 + 2.406925E+02 3.296408E-02 + 1.087293E+02 6.125493E-02 + 5.026457E+01 7.134113E-02 + 2.258004E+01 -1.973150E-02 + 1.071432E+01 -2.741869E-01 + 5.093546E+00 -4.440977E-01 + 2.244183E+00 7.776084E-02 + 1.059570E+00 7.068444E-01 + 4.688490E-01 4.413892E-01 + 1.061430E-01 2.799769E-02 + 5.526200E-02 -1.210790E-02 +S 19 1.00 + 3.014643E+06 -2.180323E-07 + 4.514329E+05 -1.694860E-06 + 1.027338E+05 -8.919208E-06 + 2.909817E+04 -3.763633E-05 + 9.492330E+03 -1.369575E-04 + 3.426346E+03 -4.432894E-04 + 1.335896E+03 -1.298868E-03 + 5.535026E+02 -3.406752E-03 + 2.406925E+02 -7.810829E-03 + 1.087293E+02 -1.449245E-02 + 5.026457E+01 -1.708136E-02 + 2.258004E+01 4.897666E-03 + 1.071432E+01 6.753108E-02 + 5.093546E+00 1.173318E-01 + 2.244183E+00 -2.985025E-02 + 1.059570E+00 -2.277634E-01 + 4.688490E-01 -2.928115E-01 + 1.061430E-01 2.665300E-01 + 5.526200E-02 5.912406E-01 +S 19 1.00 + 3.014643E+06 -3.975126E-07 + 4.514329E+05 -3.161080E-06 + 1.027338E+05 -1.609375E-05 + 2.909817E+04 -7.092947E-05 + 9.492330E+03 -2.442710E-04 + 3.426346E+03 -8.457892E-04 + 1.335896E+03 -2.282208E-03 + 5.535026E+02 -6.619873E-03 + 2.406925E+02 -1.335024E-02 + 1.087293E+02 -2.955830E-02 + 5.026457E+01 -2.477039E-02 + 2.258004E+01 -8.414624E-03 + 1.071432E+01 1.693855E-01 + 5.093546E+00 1.500787E-01 + 2.244183E+00 9.787777E-02 + 1.059570E+00 -9.653608E-01 + 4.688490E-01 1.489721E-01 + 1.061430E-01 2.191179E+00 + 5.526200E-02 -1.243325E+00 +S 1 1.00 + 2.546500E-02 1.0000000 +P 15 1.00 + 1.191203E+04 4.400000E-05 + 2.819947E+03 3.910000E-04 + 9.159479E+02 2.248000E-03 + 3.503842E+02 9.823000E-03 + 1.484825E+02 3.433800E-02 + 6.753944E+01 9.666600E-02 + 3.230332E+01 2.094170E-01 + 1.592786E+01 3.301890E-01 + 8.038035E+00 3.319360E-01 + 4.093916E+00 1.584880E-01 + 2.022390E+00 2.231000E-02 + 9.761020E-01 -1.566000E-03 + 4.595950E-01 -1.324000E-03 + 1.771520E-01 -2.710000E-04 + 7.351700E-02 3.200000E-05 +P 15 1.00 + 1.191203E+04 -1.500000E-05 + 2.819947E+03 -1.310000E-04 + 9.159479E+02 -7.550000E-04 + 3.503842E+02 -3.319000E-03 + 1.484825E+02 -1.175000E-02 + 6.753944E+01 -3.392200E-02 + 3.230332E+01 -7.616400E-02 + 1.592786E+01 -1.257020E-01 + 8.038035E+00 -1.330980E-01 + 4.093916E+00 1.740600E-02 + 2.022390E+00 3.151650E-01 + 9.761020E-01 4.618140E-01 + 4.595950E-01 2.998560E-01 + 1.771520E-01 5.000000E-02 + 7.351700E-02 -4.230000E-03 +P 15 1.00 + 1.191203E+04 4.000000E-06 + 2.819947E+03 3.100000E-05 + 9.159479E+02 1.820000E-04 + 3.503842E+02 7.950000E-04 + 1.484825E+02 2.833000E-03 + 6.753944E+01 8.154000E-03 + 3.230332E+01 1.847200E-02 + 1.592786E+01 3.040000E-02 + 8.038035E+00 3.304700E-02 + 4.093916E+00 -8.251000E-03 + 2.022390E+00 -8.855400E-02 + 9.761020E-01 -1.496120E-01 + 4.595950E-01 -9.422700E-02 + 1.771520E-01 2.508460E-01 + 7.351700E-02 5.866430E-01 +P 15 1.00 + 1.191203E+04 4.000000E-06 + 2.819947E+03 3.900000E-05 + 9.159479E+02 2.230000E-04 + 3.503842E+02 9.920000E-04 + 1.484825E+02 3.476000E-03 + 6.753944E+01 1.017200E-02 + 3.230332E+01 2.257600E-02 + 1.592786E+01 3.823800E-02 + 8.038035E+00 3.933700E-02 + 4.093916E+00 -6.106000E-03 + 2.022390E+00 -1.129620E-01 + 9.761020E-01 -1.681140E-01 + 4.595950E-01 -1.659320E-01 + 1.771520E-01 3.914030E-01 + 7.351700E-02 6.818400E-01 +P 1 1.00 + 2.940100E-02 1.0000000 +D 7 1.00 + 6.401300E+01 3.887000E-03 + 1.881790E+01 2.639900E-02 + 6.728700E+00 9.751100E-02 + 2.664130E+00 2.328480E-01 + 1.078680E+00 3.531520E-01 + 4.232090E-01 3.721860E-01 + 1.559990E-01 2.476720E-01 +D 7 1.00 + 6.401300E+01 -3.970000E-03 + 1.881790E+01 -2.687300E-02 + 6.728700E+00 -1.022750E-01 + 2.664130E+00 -2.377280E-01 + 1.078680E+00 -3.121140E-01 + 4.232090E-01 -4.237800E-02 + 1.559990E-01 5.886580E-01 +D 1 1.00 + 5.188400E-02 1.0000000 +F 2 1.00 + 1.227400E+00 3.581580E-01 + 2.788000E-01 8.257940E-01 +S 1 1.00 + 1.173000E-02 1.0000000 +P 1 1.00 + 1.176000E-02 1.0000000 +D 1 1.00 + 1.726000E-02 1.0000000 +F 1 1.00 + 8.266000E-02 1.0000000 +**** +V 0 +S 19 1.00 + 3.321857E+06 8.039999E-06 + 4.974356E+05 6.251402E-05 + 1.132027E+05 3.286553E-04 + 3.206333E+04 1.385697E-03 + 1.045962E+04 5.016217E-03 + 3.775506E+03 1.606931E-02 + 1.472040E+03 4.574242E-02 + 6.099331E+02 1.128544E-01 + 2.652634E+02 2.254344E-01 + 1.198607E+02 3.140461E-01 + 5.544891E+01 2.267819E-01 + 2.498372E+01 7.334069E-02 + 1.188056E+01 1.102474E-01 + 5.660311E+00 1.131358E-01 + 2.495703E+00 1.971295E-02 + 1.177866E+00 -4.719088E-04 + 5.200440E-01 1.861606E-04 + 1.159650E-01 -6.208598E-05 + 5.893800E-02 7.295314E-05 +S 19 1.00 + 3.321857E+06 -4.503003E-06 + 4.974356E+05 -3.501295E-05 + 1.132027E+05 -1.841339E-04 + 3.206333E+04 -7.769216E-04 + 1.045962E+04 -2.819505E-03 + 3.775506E+03 -9.087486E-03 + 1.472040E+03 -2.627134E-02 + 6.099331E+02 -6.712726E-02 + 2.652634E+02 -1.451130E-01 + 1.198607E+02 -2.412483E-01 + 5.544891E+01 -2.416314E-01 + 2.498372E+01 3.067362E-02 + 1.188056E+01 4.970415E-01 + 5.660311E+00 4.958875E-01 + 2.495703E+00 9.181868E-02 + 1.177866E+00 -5.392514E-03 + 5.200440E-01 7.102380E-04 + 1.159650E-01 -6.363128E-04 + 5.893800E-02 5.979932E-04 +S 19 1.00 + 3.321857E+06 9.320648E-07 + 4.974356E+05 7.249306E-06 + 1.132027E+05 3.811967E-05 + 3.206333E+04 1.610238E-04 + 1.045962E+04 5.852210E-04 + 3.775506E+03 1.897502E-03 + 1.472040E+03 5.550909E-03 + 6.099331E+02 1.460584E-02 + 2.652634E+02 3.342974E-02 + 1.198607E+02 6.235722E-02 + 5.544891E+01 7.312435E-02 + 2.498372E+01 -1.911472E-02 + 1.188056E+01 -2.817249E-01 + 5.660311E+00 -4.488151E-01 + 2.495703E+00 9.202696E-02 + 1.177866E+00 7.110117E-01 + 5.200440E-01 4.309274E-01 + 1.159650E-01 2.604589E-02 + 5.893800E-02 -1.101049E-02 +S 19 1.00 + 3.321857E+06 -2.158944E-07 + 4.974356E+05 -1.678519E-06 + 1.132027E+05 -8.831213E-06 + 3.206333E+04 -3.727769E-05 + 1.045962E+04 -1.356099E-04 + 3.775506E+03 -4.392351E-04 + 1.472040E+03 -1.286948E-03 + 6.099331E+02 -3.382149E-03 + 2.652634E+02 -7.765646E-03 + 1.198607E+02 -1.447985E-02 + 5.544891E+01 -1.715502E-02 + 2.498372E+01 4.610101E-03 + 1.188056E+01 6.827831E-02 + 5.660311E+00 1.161368E-01 + 2.495703E+00 -3.277049E-02 + 1.177866E+00 -2.280000E-01 + 5.200440E-01 -2.793991E-01 + 1.159650E-01 2.771165E-01 + 5.893800E-02 5.852999E-01 +S 19 1.00 + 3.321857E+06 -4.093416E-07 + 4.974356E+05 -3.258956E-06 + 1.132027E+05 -1.656390E-05 + 3.206333E+04 -7.316689E-05 + 1.045962E+04 -2.512784E-04 + 3.775506E+03 -8.732657E-04 + 1.472040E+03 -2.347654E-03 + 6.099331E+02 -6.853150E-03 + 2.652634E+02 -1.376420E-02 + 1.198607E+02 -3.084679E-02 + 5.544891E+01 -2.562208E-02 + 2.498372E+01 -1.005123E-02 + 1.188056E+01 1.795330E-01 + 5.660311E+00 1.522400E-01 + 2.495703E+00 9.483887E-02 + 1.177866E+00 -1.014876E+00 + 5.200440E-01 2.308810E-01 + 1.159650E-01 2.113321E+00 + 5.893800E-02 -1.253048E+00 +S 1 1.00 + 2.694600E-02 1.0000000 +P 15 1.00 + 1.327320E+04 4.300000E-05 + 3.142126E+03 3.840000E-04 + 1.020588E+03 2.210000E-03 + 3.904407E+02 9.678000E-03 + 1.655043E+02 3.393600E-02 + 7.532006E+01 9.591700E-02 + 3.605503E+01 2.088530E-01 + 1.780436E+01 3.306600E-01 + 9.002929E+00 3.323120E-01 + 4.594544E+00 1.581880E-01 + 2.276760E+00 2.225200E-02 + 1.101178E+00 -1.565000E-03 + 5.186380E-01 -1.353000E-03 + 2.005650E-01 -2.650000E-04 + 8.129100E-02 2.900000E-05 +P 15 1.00 + 1.327320E+04 -1.500000E-05 + 3.142126E+03 -1.310000E-04 + 1.020588E+03 -7.550000E-04 + 3.904407E+02 -3.325000E-03 + 1.655043E+02 -1.181100E-02 + 7.532006E+01 -3.425600E-02 + 3.605503E+01 -7.736300E-02 + 1.780436E+01 -1.284560E-01 + 9.002929E+00 -1.350780E-01 + 4.594544E+00 2.083800E-02 + 2.276760E+00 3.204990E-01 + 1.101178E+00 4.602600E-01 + 5.186380E-01 2.953460E-01 + 2.005650E-01 4.904600E-02 + 8.129100E-02 -3.824000E-03 +P 15 1.00 + 1.327320E+04 4.000000E-06 + 3.142126E+03 3.200000E-05 + 1.020588E+03 1.830000E-04 + 3.904407E+02 8.020000E-04 + 1.655043E+02 2.862000E-03 + 7.532006E+01 8.287000E-03 + 3.605503E+01 1.887000E-02 + 1.780436E+01 3.130700E-02 + 9.002929E+00 3.366000E-02 + 4.594544E+00 -9.479000E-03 + 2.276760E+00 -9.231300E-02 + 1.101178E+00 -1.489890E-01 + 5.186380E-01 -8.364400E-02 + 2.005650E-01 2.493390E-01 + 8.129100E-02 5.805150E-01 +P 15 1.00 + 1.327320E+04 4.000000E-06 + 3.142126E+03 3.900000E-05 + 1.020588E+03 2.230000E-04 + 3.904407E+02 9.960000E-04 + 1.655043E+02 3.498000E-03 + 7.532006E+01 1.029600E-02 + 3.605503E+01 2.296200E-02 + 1.780436E+01 3.920800E-02 + 9.002929E+00 3.994300E-02 + 4.594544E+00 -7.121000E-03 + 2.276760E+00 -1.162250E-01 + 1.101178E+00 -1.694960E-01 + 5.186380E-01 -1.553740E-01 + 2.005650E-01 3.950220E-01 + 8.129100E-02 6.789080E-01 +P 1 1.00 + 3.179500E-02 1.0000000 +D 7 1.00 + 7.761150E+01 3.595000E-03 + 2.291590E+01 2.521000E-02 + 8.279540E+00 9.478600E-02 + 3.309930E+00 2.303630E-01 + 1.358630E+00 3.528940E-01 + 5.413500E-01 3.704140E-01 + 2.023560E-01 2.457180E-01 +D 7 1.00 + 7.761150E+01 -3.818000E-03 + 2.291590E+01 -2.671700E-02 + 8.279540E+00 -1.036900E-01 + 3.309930E+00 -2.476890E-01 + 1.358630E+00 -3.115230E-01 + 5.413500E-01 -2.282700E-02 + 2.023560E-01 5.697260E-01 +D 1 1.00 + 6.756800E-02 1.0000000 +F 2 1.00 + 1.748800E+00 3.900680E-01 + 4.057000E-01 8.008410E-01 +S 1 1.00 + 1.232000E-02 1.0000000 +P 1 1.00 + 1.244000E-02 1.0000000 +D 1 1.00 + 2.256000E-02 1.0000000 +F 1 1.00 + 1.311200E-01 1.0000000 +**** +Cr 0 +S 19 1.00 + 6.177194E+06 4.128667E-06 + 9.249295E+05 3.210767E-05 + 2.104865E+05 1.688416E-04 + 5.962005E+04 7.128520E-04 + 1.945076E+04 2.589325E-03 + 7.022056E+03 8.377350E-03 + 2.738763E+03 2.441725E-02 + 1.135814E+03 6.365135E-02 + 4.950923E+02 1.427618E-01 + 2.247487E+02 2.541275E-01 + 1.053836E+02 3.009512E-01 + 5.019359E+01 1.766513E-01 + 2.224957E+01 6.936709E-02 + 1.098265E+01 1.179579E-01 + 5.383665E+00 8.916187E-02 + 2.343685E+00 1.103630E-02 + 1.105202E+00 -3.546048E-04 + 4.878480E-01 1.057311E-04 + 8.959900E-02 1.114640E-05 +S 19 1.00 + 6.177194E+06 -2.301772E-06 + 9.249295E+05 -1.789536E-05 + 2.104865E+05 -9.416174E-05 + 5.962005E+04 -3.975074E-04 + 1.945076E+04 -1.447025E-03 + 7.022056E+03 -4.694622E-03 + 2.738763E+03 -1.382387E-02 + 1.135814E+03 -3.674643E-02 + 4.950923E+02 -8.647185E-02 + 2.247487E+02 -1.696735E-01 + 1.053836E+02 -2.507089E-01 + 5.019359E+01 -1.961156E-01 + 2.224957E+01 1.457244E-01 + 1.098265E+01 5.466706E-01 + 5.383665E+00 3.979434E-01 + 2.343685E+00 5.277007E-02 + 1.105202E+00 -4.374537E-03 + 4.878480E-01 3.204035E-04 + 8.959900E-02 -5.142077E-05 +S 19 1.00 + 6.177194E+06 4.862957E-07 + 9.249295E+05 3.776645E-06 + 2.104865E+05 1.990664E-05 + 5.962005E+04 8.389164E-05 + 1.945076E+04 3.065706E-04 + 7.022056E+03 9.944107E-04 + 2.738763E+03 2.961959E-03 + 1.135814E+03 7.969473E-03 + 4.950923E+02 1.955017E-02 + 2.247487E+02 4.085035E-02 + 1.053836E+02 6.929003E-02 + 5.019359E+01 6.146984E-02 + 2.224957E+01 -6.981302E-02 + 1.098265E+01 -3.517597E-01 + 5.383665E+00 -3.828629E-01 + 2.343685E+00 2.676401E-01 + 1.105202E+00 7.175950E-01 + 4.878480E-01 3.020814E-01 + 8.959900E-02 7.749514E-03 +S 19 1.00 + 6.177194E+06 -1.102451E-07 + 9.249295E+05 -8.530233E-07 + 2.104865E+05 -4.520358E-06 + 5.962005E+04 -1.891612E-05 + 1.945076E+04 -6.974344E-05 + 7.022056E+03 -2.237867E-04 + 2.738763E+03 -6.754503E-04 + 1.135814E+03 -1.789346E-03 + 4.950923E+02 -4.477858E-03 + 2.247487E+02 -9.140144E-03 + 1.053836E+02 -1.610562E-02 + 5.019359E+01 -1.334870E-02 + 2.224957E+01 1.426027E-02 + 1.098265E+01 8.931690E-02 + 5.383665E+00 8.885279E-02 + 2.343685E+00 -6.368776E-02 + 1.105202E+00 -2.783262E-01 + 4.878480E-01 -1.830071E-01 + 8.959900E-02 6.790937E-01 +S 19 1.00 + 6.177194E+06 2.179893E-07 + 9.249295E+05 1.612940E-06 + 2.104865E+05 9.111842E-06 + 5.962005E+04 3.500645E-05 + 1.945076E+04 1.435315E-04 + 7.022056E+03 4.035896E-04 + 2.738763E+03 1.425177E-03 + 1.135814E+03 3.114009E-03 + 4.950923E+02 9.814449E-03 + 2.247487E+02 1.474698E-02 + 1.053836E+02 3.911512E-02 + 5.019359E+01 9.170888E-03 + 2.224957E+01 1.559878E-02 + 1.098265E+01 -2.816844E-01 + 5.383665E+00 -6.895261E-03 + 2.343685E+00 -1.769781E-01 + 1.105202E+00 1.443061E+00 + 4.878480E-01 -1.029318E+00 + 8.959900E-02 -1.307667E+00 +S 1 1.00 + 3.342300E-02 1.0000000 +P 15 1.00 + 1.445420E+04 4.400000E-05 + 3.421676E+03 3.890000E-04 + 1.111387E+03 2.241000E-03 + 4.251918E+02 9.821000E-03 + 1.802623E+02 3.447100E-02 + 8.206117E+01 9.746000E-02 + 3.929726E+01 2.119850E-01 + 1.941959E+01 3.339900E-01 + 9.828899E+00 3.301370E-01 + 5.016810E+00 1.522270E-01 + 2.487091E+00 2.042500E-02 + 1.198780E+00 -1.360000E-03 + 5.586950E-01 -1.195000E-03 + 2.089240E-01 -1.970000E-04 + 8.460800E-02 2.300000E-05 +P 15 1.00 + 1.445420E+04 -1.500000E-05 + 3.421676E+03 -1.350000E-04 + 1.111387E+03 -7.770000E-04 + 4.251918E+02 -3.427000E-03 + 1.802623E+02 -1.218900E-02 + 8.206117E+01 -3.538800E-02 + 3.929726E+01 -7.991500E-02 + 1.941959E+01 -1.323350E-01 + 9.828899E+00 -1.354010E-01 + 5.016810E+00 3.200800E-02 + 2.487091E+00 3.338490E-01 + 1.198780E+00 4.617730E-01 + 5.586950E-01 2.812900E-01 + 2.089240E-01 4.184300E-02 + 8.460800E-02 -4.002000E-03 +P 15 1.00 + 1.445420E+04 4.000000E-06 + 3.421676E+03 3.200000E-05 + 1.111387E+03 1.850000E-04 + 4.251918E+02 8.100000E-04 + 1.802623E+02 2.906000E-03 + 8.206117E+01 8.391000E-03 + 3.929726E+01 1.919300E-02 + 1.941959E+01 3.156400E-02 + 9.828899E+00 3.341700E-02 + 5.016810E+00 -1.290700E-02 + 2.487091E+00 -9.365900E-02 + 1.198780E+00 -1.499770E-01 + 5.586950E-01 -6.723400E-02 + 2.089240E-01 2.707590E-01 + 8.460800E-02 5.758070E-01 +P 15 1.00 + 1.445420E+04 4.000000E-06 + 3.421676E+03 4.000000E-05 + 1.111387E+03 2.290000E-04 + 4.251918E+02 1.019000E-03 + 1.802623E+02 3.602000E-03 + 8.206117E+01 1.055000E-02 + 3.929726E+01 2.370200E-02 + 1.941959E+01 3.998800E-02 + 9.828899E+00 4.043700E-02 + 5.016810E+00 -1.207400E-02 + 2.487091E+00 -1.189390E-01 + 1.198780E+00 -1.781000E-01 + 5.586950E-01 -1.238650E-01 + 2.089240E-01 4.297220E-01 + 8.460800E-02 6.507860E-01 +P 1 1.00 + 3.325800E-02 1.0000000 +D 7 1.00 + 8.857680E+01 3.621000E-03 + 2.620450E+01 2.576600E-02 + 9.517470E+00 9.755600E-02 + 3.822480E+00 2.363120E-01 + 1.575120E+00 3.582860E-01 + 6.289280E-01 3.685430E-01 + 2.344240E-01 2.354940E-01 +D 7 1.00 + 8.857680E+01 -4.122000E-03 + 2.620450E+01 -2.930700E-02 + 9.517470E+00 -1.150620E-01 + 3.822480E+00 -2.730680E-01 + 1.575120E+00 -3.144230E-01 + 6.289280E-01 4.209700E-02 + 2.344240E-01 5.914030E-01 +D 1 1.00 + 7.681500E-02 1.0000000 +F 2 1.00 + 2.221100E+00 4.235450E-01 + 5.231000E-01 7.741140E-01 +S 1 1.00 + 1.247000E-02 1.0000000 +P 1 1.00 + 1.307000E-02 1.0000000 +D 1 1.00 + 2.517000E-02 1.0000000 +F 1 1.00 + 1.763600E-01 1.0000000 +**** +Mn 0 +S 19 1.00 + 3.960805E+06 8.242127E-06 + 5.931155E+05 6.408587E-05 + 1.349768E+05 3.369253E-04 + 3.823067E+04 1.420648E-03 + 1.247154E+04 5.143683E-03 + 4.501743E+03 1.648569E-02 + 1.755212E+03 4.698560E-02 + 7.273039E+02 1.162437E-01 + 3.163678E+02 2.335277E-01 + 1.430098E+02 3.292837E-01 + 6.621805E+01 2.440304E-01 + 2.991896E+01 7.219806E-02 + 1.430318E+01 7.687806E-02 + 6.839451E+00 7.852235E-02 + 3.012374E+00 1.294109E-02 + 1.418808E+00 -3.784873E-04 + 6.236240E-01 -2.503203E-05 + 1.340980E-01 -2.421517E-05 + 6.554800E-02 3.462071E-05 +S 19 1.00 + 3.960805E+06 -3.936095E-06 + 5.931155E+05 -3.060481E-05 + 1.349768E+05 -1.609626E-04 + 3.823067E+04 -6.792348E-04 + 1.247154E+04 -2.466182E-03 + 4.501743E+03 -7.957629E-03 + 1.755212E+03 -2.307248E-02 + 7.273039E+02 -5.932956E-02 + 3.163678E+02 -1.299451E-01 + 1.430098E+02 -2.212352E-01 + 6.621805E+01 -2.292550E-01 + 2.991896E+01 3.580733E-02 + 1.430318E+01 5.107602E-01 + 6.839451E+00 5.008307E-01 + 3.012374E+00 9.011830E-02 + 1.418808E+00 -6.909909E-03 + 6.236240E-01 -1.912925E-04 + 1.340980E-01 -6.032312E-04 + 6.554800E-02 5.621608E-04 +S 19 1.00 + 3.960805E+06 9.462709E-07 + 5.931155E+05 7.360584E-06 + 1.349768E+05 3.869935E-05 + 3.823067E+04 1.635110E-04 + 1.247154E+04 5.941775E-04 + 4.501743E+03 1.927737E-03 + 1.755212E+03 5.641731E-03 + 7.273039E+02 1.487848E-02 + 3.163678E+02 3.414783E-02 + 1.430098E+02 6.405794E-02 + 6.621805E+01 7.557659E-02 + 2.991896E+01 -1.946070E-02 + 1.430318E+01 -2.957874E-01 + 6.839451E+00 -4.521170E-01 + 3.012374E+00 1.224531E-01 + 1.418808E+00 7.169756E-01 + 6.236240E-01 4.092712E-01 + 1.340980E-01 2.221969E-02 + 6.554800E-02 -9.011202E-03 +S 19 1.00 + 3.960805E+06 -2.095391E-07 + 5.931155E+05 -1.629439E-06 + 1.349768E+05 -8.570592E-06 + 3.823067E+04 -3.619272E-05 + 1.247154E+04 -1.316146E-04 + 4.501743E+03 -4.266810E-04 + 1.755212E+03 -1.250270E-03 + 7.273039E+02 -3.294665E-03 + 3.163678E+02 -7.581860E-03 + 1.430098E+02 -1.422864E-02 + 6.621805E+01 -1.693796E-02 + 2.991896E+01 4.454298E-03 + 1.430318E+01 6.867042E-02 + 6.839451E+00 1.113335E-01 + 3.012374E+00 -3.900820E-02 + 1.418808E+00 -2.215755E-01 + 6.236240E-01 -2.544359E-01 + 1.340980E-01 2.865866E-01 + 6.554800E-02 5.755741E-01 +S 19 1.00 + 3.960805E+06 -4.121231E-07 + 5.931155E+05 -3.282099E-06 + 1.349768E+05 -1.667433E-05 + 3.823067E+04 -7.369999E-05 + 1.247154E+04 -2.529495E-04 + 4.501743E+03 -8.801425E-04 + 1.755212E+03 -2.365482E-03 + 7.273039E+02 -6.926354E-03 + 3.163678E+02 -1.393851E-02 + 1.430098E+02 -3.143840E-02 + 6.621805E+01 -2.625749E-02 + 2.991896E+01 -1.048313E-02 + 1.430318E+01 1.856472E-01 + 6.839451E+00 1.524839E-01 + 3.012374E+00 7.411368E-02 + 1.418808E+00 -1.018097E+00 + 6.236240E-01 2.980372E-01 + 1.340980E-01 1.971989E+00 + 6.554800E-02 -1.179253E+00 +S 1 1.00 + 2.958400E-02 1.0000000 +P 15 1.00 + 1.620586E+04 4.200000E-05 + 3.836274E+03 3.730000E-04 + 1.246048E+03 2.149000E-03 + 4.767535E+02 9.445000E-03 + 2.021895E+02 3.329700E-02 + 9.209487E+01 9.475900E-02 + 4.414720E+01 2.081440E-01 + 2.185468E+01 3.318050E-01 + 1.108596E+01 3.331750E-01 + 5.674108E+00 1.576010E-01 + 2.823170E+00 2.144500E-02 + 1.368621E+00 -2.558000E-03 + 6.444310E-01 -2.027000E-03 + 2.483820E-01 -3.600000E-04 + 9.725500E-02 3.400000E-05 +P 15 1.00 + 1.620586E+04 -1.500000E-05 + 3.836274E+03 -1.290000E-04 + 1.246048E+03 -7.480000E-04 + 4.767535E+02 -3.308000E-03 + 2.021895E+02 -1.181100E-02 + 9.209487E+01 -3.453300E-02 + 4.414720E+01 -7.878500E-02 + 2.185468E+01 -1.321830E-01 + 1.108596E+01 -1.371950E-01 + 5.674108E+00 2.707500E-02 + 2.823170E+00 3.288910E-01 + 1.368621E+00 4.572800E-01 + 6.444310E-01 2.889080E-01 + 2.483820E-01 4.743300E-02 + 9.725500E-02 -3.522000E-03 +P 15 1.00 + 1.620586E+04 3.000000E-06 + 3.836274E+03 3.000000E-05 + 1.246048E+03 1.720000E-04 + 4.767535E+02 7.620000E-04 + 2.021895E+02 2.726000E-03 + 9.209487E+01 7.976000E-03 + 4.414720E+01 1.828700E-02 + 2.185468E+01 3.077600E-02 + 1.108596E+01 3.237300E-02 + 5.674108E+00 -9.978000E-03 + 2.823170E+00 -9.052900E-02 + 1.368621E+00 -1.380040E-01 + 6.444310E-01 -7.796500E-02 + 2.483820E-01 2.295600E-01 + 9.725500E-02 5.761220E-01 +P 15 1.00 + 1.620586E+04 4.000000E-06 + 3.836274E+03 4.000000E-05 + 1.246048E+03 2.260000E-04 + 4.767535E+02 1.013000E-03 + 2.021895E+02 3.575000E-03 + 9.209487E+01 1.061200E-02 + 4.414720E+01 2.390200E-02 + 2.185468E+01 4.127900E-02 + 1.108596E+01 4.147500E-02 + 5.674108E+00 -9.458000E-03 + 2.823170E+00 -1.236950E-01 + 1.368621E+00 -1.743920E-01 + 6.444310E-01 -1.291700E-01 + 2.483820E-01 4.003480E-01 + 9.725500E-02 6.696460E-01 +P 1 1.00 + 3.663300E-02 1.0000000 +D 7 1.00 + 1.006630E+02 3.579000E-03 + 2.983360E+01 2.582700E-02 + 1.088940E+01 9.855900E-02 + 4.393580E+00 2.383270E-01 + 1.817820E+00 3.587070E-01 + 7.278270E-01 3.650920E-01 + 2.712950E-01 2.337380E-01 +D 7 1.00 + 1.006630E+02 -3.454000E-03 + 2.983360E+01 -2.492500E-02 + 1.088940E+01 -9.763500E-02 + 4.393580E+00 -2.366920E-01 + 1.817820E+00 -2.923500E-01 + 7.278270E-01 -4.973000E-03 + 2.712950E-01 5.065880E-01 +D 1 1.00 + 8.830900E-02 1.0000000 +F 2 1.00 + 2.703200E+00 4.267760E-01 + 6.438000E-01 7.697990E-01 +S 1 1.00 + 1.335000E-02 1.0000000 +P 1 1.00 + 1.380000E-02 1.0000000 +D 1 1.00 + 2.875000E-02 1.0000000 +F 1 1.00 + 2.226000E-01 1.0000000 +**** +Fe 0 +S 19 1.00 + 4.316265E+06 8.048803E-06 + 6.463424E+05 6.258306E-05 + 1.470897E+05 3.290239E-04 + 4.166152E+04 1.387355E-03 + 1.359077E+04 5.023256E-03 + 4.905750E+03 1.610140E-02 + 1.912746E+03 4.590034E-02 + 7.926043E+02 1.136154E-01 + 3.448065E+02 2.283869E-01 + 1.558999E+02 3.221159E-01 + 7.223091E+01 2.383661E-01 + 3.272506E+01 7.404667E-02 + 1.566762E+01 9.214197E-02 + 7.503483E+00 9.339790E-02 + 3.312223E+00 1.573965E-02 + 1.558471E+00 -4.186682E-04 + 6.839140E-01 5.376318E-05 + 1.467570E-01 -3.816654E-05 + 7.058300E-02 4.319603E-05 +S 19 1.00 + 4.316265E+06 -4.155954E-06 + 6.463424E+05 -3.231401E-05 + 1.470897E+05 -1.699525E-04 + 4.166152E+04 -7.171369E-04 + 1.359077E+04 -2.603625E-03 + 4.905750E+03 -8.399109E-03 + 1.912746E+03 -2.434109E-02 + 7.926043E+02 -6.251948E-02 + 3.448065E+02 -1.365929E-01 + 1.558999E+02 -2.312707E-01 + 7.223091E+01 -2.383734E-01 + 3.272506E+01 3.123837E-02 + 1.566762E+01 5.086818E-01 + 7.503483E+00 4.987695E-01 + 3.312223E+00 9.033552E-02 + 1.558471E+00 -6.005337E-03 + 6.839140E-01 2.312454E-04 + 1.467570E-01 -5.643680E-04 + 7.058300E-02 4.992260E-04 +S 19 1.00 + 4.316265E+06 9.532178E-07 + 6.463424E+05 7.414605E-06 + 1.470897E+05 3.898393E-05 + 4.166152E+04 1.647152E-04 + 1.359077E+04 5.985980E-04 + 4.905750E+03 1.942390E-03 + 1.912746E+03 5.687237E-03 + 7.926043E+02 1.501329E-02 + 3.448065E+02 3.452455E-02 + 1.558999E+02 6.495820E-02 + 7.223091E+01 7.716194E-02 + 3.272506E+01 -1.873411E-02 + 1.566762E+01 -3.009185E-01 + 7.503483E+00 -4.554661E-01 + 3.312223E+00 1.286463E-01 + 1.558471E+00 7.183316E-01 + 6.839140E-01 4.051743E-01 + 1.467570E-01 2.168227E-02 + 7.058300E-02 -8.343566E-03 +S 19 1.00 + 4.316265E+06 -2.063008E-07 + 6.463424E+05 -1.604169E-06 + 1.470897E+05 -8.438437E-06 + 4.166152E+04 -3.563151E-05 + 1.359077E+04 -1.295998E-04 + 4.905750E+03 -4.201534E-04 + 1.912746E+03 -1.231954E-03 + 7.926043E+02 -3.248922E-03 + 3.448065E+02 -7.493717E-03 + 1.558999E+02 -1.410102E-02 + 7.223091E+01 -1.691600E-02 + 3.272506E+01 4.218996E-03 + 1.566762E+01 6.833810E-02 + 7.503483E+00 1.098201E-01 + 3.312223E+00 -4.009005E-02 + 1.558471E+00 -2.174739E-01 + 6.839140E-01 -2.465135E-01 + 1.467570E-01 2.731435E-01 + 7.058300E-02 5.748321E-01 +S 19 1.00 + 4.316265E+06 -4.009367E-07 + 6.463424E+05 -3.189255E-06 + 1.470897E+05 -1.623079E-05 + 4.166152E+04 -7.157920E-05 + 1.359077E+04 -2.463958E-04 + 4.905750E+03 -8.544907E-04 + 1.912746E+03 -2.307593E-03 + 7.926043E+02 -6.728292E-03 + 3.448065E+02 -1.366165E-02 + 1.558999E+02 -3.062240E-02 + 7.223091E+01 -2.631137E-02 + 3.272506E+01 -9.760183E-03 + 1.566762E+01 1.801906E-01 + 7.503483E+00 1.529634E-01 + 3.312223E+00 5.505413E-02 + 1.558471E+00 -9.551364E-01 + 6.839140E-01 2.586813E-01 + 1.467570E-01 1.834049E+00 + 7.058300E-02 -9.333240E-01 +S 1 1.00 + 3.144900E-02 1.0000000 +P 15 1.00 + 1.774569E+04 4.100000E-05 + 4.200721E+03 3.690000E-04 + 1.364429E+03 2.129000E-03 + 5.220806E+02 9.369000E-03 + 2.214595E+02 3.309700E-02 + 1.009096E+02 9.443100E-02 + 4.840115E+01 2.080770E-01 + 2.398536E+01 3.323330E-01 + 1.218250E+01 3.329870E-01 + 6.242298E+00 1.568430E-01 + 3.110944E+00 2.154900E-02 + 1.509958E+00 -2.095000E-03 + 7.108450E-01 -1.739000E-03 + 2.731900E-01 -3.000000E-04 + 1.042330E-01 2.900000E-05 +P 15 1.00 + 1.774569E+04 -1.500000E-05 + 4.200721E+03 -1.300000E-04 + 1.364429E+03 -7.510000E-04 + 5.220806E+02 -3.329000E-03 + 2.214595E+02 -1.191200E-02 + 1.009096E+02 -3.493300E-02 + 4.840115E+01 -7.998900E-02 + 2.398536E+01 -1.346360E-01 + 1.218250E+01 -1.385980E-01 + 6.242298E+00 3.027800E-02 + 3.110944E+00 3.332160E-01 + 1.509958E+00 4.561530E-01 + 7.108450E-01 2.850510E-01 + 2.731900E-01 4.614400E-02 + 1.042330E-01 -3.249000E-03 +P 15 1.00 + 1.774569E+04 3.000000E-06 + 4.200721E+03 2.900000E-05 + 1.364429E+03 1.650000E-04 + 5.220806E+02 7.340000E-04 + 2.214595E+02 2.626000E-03 + 1.009096E+02 7.725000E-03 + 4.840115E+01 1.773300E-02 + 2.398536E+01 3.005500E-02 + 1.218250E+01 3.109400E-02 + 6.242298E+00 -1.004800E-02 + 3.110944E+00 -8.830600E-02 + 1.509958E+00 -1.298240E-01 + 7.108450E-01 -7.693700E-02 + 2.731900E-01 2.126610E-01 + 1.042330E-01 5.730610E-01 +P 15 1.00 + 1.774569E+04 5.000000E-06 + 4.200721E+03 4.200000E-05 + 1.364429E+03 2.410000E-04 + 5.220806E+02 1.085000E-03 + 2.214595E+02 3.831000E-03 + 1.009096E+02 1.142300E-02 + 4.840115E+01 2.579200E-02 + 2.398536E+01 4.481800E-02 + 1.218250E+01 4.459800E-02 + 6.242298E+00 -1.117700E-02 + 3.110944E+00 -1.381340E-01 + 1.509958E+00 -1.882850E-01 + 7.108450E-01 -1.073990E-01 + 2.731900E-01 4.448630E-01 + 1.042330E-01 6.402390E-01 +P 1 1.00 + 3.829100E-02 1.0000000 +D 7 1.00 + 1.133440E+02 3.530000E-03 + 3.364140E+01 2.578400E-02 + 1.233100E+01 9.911900E-02 + 4.994780E+00 2.390730E-01 + 2.072800E+00 3.571990E-01 + 8.307530E-01 3.621880E-01 + 3.091780E-01 2.364610E-01 +D 7 1.00 + 1.133440E+02 -3.890000E-03 + 3.364140E+01 -2.844200E-02 + 1.233100E+01 -1.124290E-01 + 4.994780E+00 -2.742570E-01 + 2.072800E+00 -3.155460E-01 + 8.307530E-01 5.710900E-02 + 3.091780E-01 5.636040E-01 +D 1 1.00 + 1.001300E-01 1.0000000 +F 2 1.00 + 3.224300E+00 4.222490E-01 + 7.758000E-01 7.714680E-01 +S 1 1.00 + 1.401000E-02 1.0000000 +P 1 1.00 + 1.407000E-02 1.0000000 +D 1 1.00 + 3.243000E-02 1.0000000 +F 1 1.00 + 2.749000E-01 1.0000000 +**** +Co 0 +S 19 1.00 + 4.675675E+06 7.979026E-06 + 7.001615E+05 6.204071E-05 + 1.593373E+05 3.261735E-04 + 4.513046E+04 1.375360E-03 + 1.472238E+04 4.979997E-03 + 5.314222E+03 1.596434E-02 + 2.072018E+03 4.552086E-02 + 8.586188E+02 1.127385E-01 + 3.735497E+02 2.268262E-01 + 1.689229E+02 3.203074E-01 + 7.829639E+01 2.374021E-01 + 3.552123E+01 7.477686E-02 + 1.704144E+01 9.581872E-02 + 8.173000E+00 9.649911E-02 + 3.610318E+00 1.623362E-02 + 1.697047E+00 -4.535497E-04 + 7.435320E-01 5.113519E-05 + 1.583440E-01 -4.174508E-05 + 7.503600E-02 4.027577E-05 +S 19 1.00 + 4.675675E+06 -4.200240E-06 + 7.001615E+05 -3.265831E-05 + 1.593373E+05 -1.717644E-04 + 4.513046E+04 -7.247853E-04 + 1.472238E+04 -2.631462E-03 + 5.314222E+03 -8.489272E-03 + 2.072018E+03 -2.460619E-02 + 8.586188E+02 -6.322059E-02 + 3.735497E+02 -1.381957E-01 + 1.689229E+02 -2.340680E-01 + 7.829639E+01 -2.415002E-01 + 3.552123E+01 3.035312E-02 + 1.704144E+01 5.101341E-01 + 8.173000E+00 4.974939E-01 + 3.610318E+00 8.970746E-02 + 1.697047E+00 -5.941034E-03 + 7.435320E-01 2.175362E-04 + 1.583440E-01 -5.480155E-04 + 7.503600E-02 4.525804E-04 +S 19 1.00 + 4.675675E+06 9.592692E-07 + 7.001615E+05 7.461851E-06 + 1.593373E+05 3.923137E-05 + 4.513046E+04 1.657706E-04 + 1.472238E+04 6.024335E-04 + 5.314222E+03 1.955217E-03 + 2.072018E+03 5.726326E-03 + 8.586188E+02 1.512984E-02 + 3.735497E+02 3.483973E-02 + 1.689229E+02 6.570351E-02 + 7.829639E+01 7.831503E-02 + 3.552123E+01 -1.877037E-02 + 1.704144E+01 -3.062663E-01 + 8.173000E+00 -4.566429E-01 + 3.610318E+00 1.378169E-01 + 1.697047E+00 7.193676E-01 + 7.435320E-01 3.992579E-01 + 1.583440E-01 2.079933E-02 + 7.503600E-02 -7.820663E-03 +S 19 1.00 + 4.675675E+06 -2.028840E-07 + 7.001615E+05 -1.577580E-06 + 1.593373E+05 -8.298813E-06 + 4.513046E+04 -3.504154E-05 + 1.472238E+04 -1.274655E-04 + 5.314222E+03 -4.132695E-04 + 2.072018E+03 -1.212261E-03 + 8.586188E+02 -3.199318E-03 + 3.735497E+02 -7.390972E-03 + 1.689229E+02 -1.393649E-02 + 7.829639E+01 -1.678575E-02 + 3.552123E+01 4.149856E-03 + 1.704144E+01 6.797646E-02 + 8.173000E+00 1.075807E-01 + 3.610318E+00 -4.166022E-02 + 1.697047E+00 -2.128044E-01 + 7.435320E-01 -2.381360E-01 + 1.583440E-01 2.650788E-01 + 7.503600E-02 5.722774E-01 +S 19 1.00 + 4.675675E+06 -3.863053E-07 + 7.001615E+05 -3.068788E-06 + 1.593373E+05 -1.564826E-05 + 4.513046E+04 -6.883588E-05 + 1.472238E+04 -2.377367E-04 + 5.314222E+03 -8.213173E-04 + 2.072018E+03 -2.229630E-03 + 8.586188E+02 -6.467841E-03 + 3.735497E+02 -1.325463E-02 + 1.689229E+02 -2.946686E-02 + 7.829639E+01 -2.599066E-02 + 3.552123E+01 -8.499807E-03 + 1.704144E+01 1.727316E-01 + 8.173000E+00 1.512189E-01 + 3.610318E+00 3.554509E-02 + 1.697047E+00 -8.829353E-01 + 7.435320E-01 2.143530E-01 + 1.583440E-01 1.711865E+00 + 7.503600E-02 -7.140037E-01 +S 1 1.00 + 3.309100E-02 1.0000000 +P 15 1.00 + 1.926778E+04 4.100000E-05 + 4.560986E+03 3.690000E-04 + 1.481436E+03 2.128000E-03 + 5.668671E+02 9.372000E-03 + 2.404910E+02 3.315500E-02 + 1.096105E+02 9.475200E-02 + 5.259491E+01 2.090930E-01 + 2.608361E+01 3.337220E-01 + 1.326143E+01 3.322080E-01 + 6.799778E+00 1.546130E-01 + 3.393414E+00 2.090200E-02 + 1.648766E+00 -2.024000E-03 + 7.762820E-01 -1.697000E-03 + 2.980030E-01 -2.800000E-04 + 1.136180E-01 2.600000E-05 +P 15 1.00 + 1.926778E+04 -1.500000E-05 + 4.560986E+03 -1.310000E-04 + 1.481436E+03 -7.580000E-04 + 5.668671E+02 -3.363000E-03 + 2.404910E+02 -1.205400E-02 + 1.096105E+02 -3.542400E-02 + 5.259491E+01 -8.128700E-02 + 2.608361E+01 -1.369080E-01 + 1.326143E+01 -1.390190E-01 + 6.799778E+00 3.546800E-02 + 3.393414E+00 3.384980E-01 + 1.648766E+00 4.544330E-01 + 7.762820E-01 2.797930E-01 + 2.980030E-01 4.477600E-02 + 1.136180E-01 -3.151000E-03 +P 15 1.00 + 1.926778E+04 -3.000000E-06 + 4.560986E+03 -2.900000E-05 + 1.481436E+03 -1.670000E-04 + 5.668671E+02 -7.420000E-04 + 2.404910E+02 -2.662000E-03 + 1.096105E+02 -7.841000E-03 + 5.259491E+01 -1.805100E-02 + 2.608361E+01 -3.058000E-02 + 1.326143E+01 -3.131200E-02 + 6.799778E+00 1.131100E-02 + 3.393414E+00 8.999000E-02 + 1.648766E+00 1.307330E-01 + 7.762820E-01 7.180800E-02 + 2.980030E-01 -2.216580E-01 + 1.136180E-01 -5.710250E-01 +P 15 1.00 + 1.926778E+04 5.000000E-06 + 4.560986E+03 4.500000E-05 + 1.481436E+03 2.550000E-04 + 5.668671E+02 1.144000E-03 + 2.404910E+02 4.061000E-03 + 1.096105E+02 1.209500E-02 + 5.259491E+01 2.747600E-02 + 2.608361E+01 4.755700E-02 + 1.326143E+01 4.730200E-02 + 6.799778E+00 -1.441800E-02 + 3.393414E+00 -1.500620E-01 + 1.648766E+00 -1.990920E-01 + 7.762820E-01 -7.978300E-02 + 2.980030E-01 4.590350E-01 + 1.136180E-01 6.174950E-01 +P 1 1.00 + 4.162400E-02 1.0000000 +D 7 1.00 + 1.262640E+02 3.510000E-03 + 3.752260E+01 2.588400E-02 + 1.380210E+01 1.000580E-01 + 5.609270E+00 2.405470E-01 + 2.333690E+00 3.568430E-01 + 9.364150E-01 3.595790E-01 + 3.482370E-01 2.366290E-01 +D 7 1.00 + 1.262640E+02 -4.067000E-03 + 3.752260E+01 -3.005300E-02 + 1.380210E+01 -1.196200E-01 + 5.609270E+00 -2.915130E-01 + 2.333690E+00 -3.180480E-01 + 9.364150E-01 9.169800E-02 + 3.482370E-01 5.608230E-01 +D 1 1.00 + 1.123530E-01 1.0000000 +F 2 1.00 + 3.772400E+00 4.239660E-01 + 9.170000E-01 7.684290E-01 +S 1 1.00 + 1.459000E-02 1.0000000 +P 1 1.00 + 1.525000E-02 1.0000000 +D 1 1.00 + 3.625000E-02 1.0000000 +F 1 1.00 + 3.271500E-01 1.0000000 +**** +Ni 0 +S 19 1.00 + 5.045991E+06 8.208996E-06 + 7.556142E+05 6.382884E-05 + 1.719568E+05 3.355800E-04 + 4.870479E+04 1.415075E-03 + 1.588841E+04 5.124444E-03 + 5.735123E+03 1.643256E-02 + 2.236137E+03 4.689398E-02 + 9.266468E+02 1.163534E-01 + 4.031743E+02 2.350511E-01 + 1.823476E+02 3.350184E-01 + 8.454885E+01 2.534779E-01 + 3.839634E+01 7.300901E-02 + 1.845859E+01 6.184244E-02 + 8.863548E+00 6.302956E-02 + 3.916227E+00 1.008063E-02 + 1.838870E+00 -2.244528E-04 + 8.043620E-01 -5.932767E-05 + 1.697970E-01 -1.158562E-05 + 7.930600E-02 8.115109E-06 +S 19 1.00 + 5.045991E+06 -3.657849E-06 + 7.556142E+05 -2.844094E-05 + 1.719568E+05 -1.495928E-04 + 4.870479E+04 -6.313009E-04 + 1.588841E+04 -2.293052E-03 + 5.735123E+03 -7.405123E-03 + 2.236137E+03 -2.152032E-02 + 9.266468E+02 -5.560974E-02 + 4.031743E+02 -1.230176E-01 + 1.823476E+02 -2.130104E-01 + 8.454885E+01 -2.265837E-01 + 3.839634E+01 3.546796E-02 + 1.845859E+01 5.181697E-01 + 8.863548E+00 5.025630E-01 + 3.916227E+00 8.955674E-02 + 1.838870E+00 -7.031311E-03 + 8.043620E-01 -4.339167E-04 + 1.697970E-01 -5.831711E-04 + 7.930600E-02 4.228788E-04 +S 19 1.00 + 5.045991E+06 9.594149E-07 + 7.556142E+05 7.462614E-06 + 1.719568E+05 3.923843E-05 + 4.870479E+04 1.657868E-04 + 1.588841E+04 6.025905E-04 + 5.735123E+03 1.955662E-03 + 2.236137E+03 5.730391E-03 + 9.266468E+02 1.514756E-02 + 4.031743E+02 3.493499E-02 + 1.823476E+02 6.598072E-02 + 8.454885E+01 7.893083E-02 + 3.839634E+01 -1.906249E-02 + 1.845859E+01 -3.095921E-01 + 8.863548E+00 -4.558610E-01 + 3.916227E+00 1.482931E-01 + 1.838870E+00 7.134039E-01 + 8.043620E-01 3.976063E-01 + 1.697970E-01 2.295523E-02 + 7.930600E-02 -9.151758E-03 +S 19 1.00 + 5.045991E+06 -2.013753E-07 + 7.556142E+05 -1.565832E-06 + 1.719568E+05 -8.237182E-06 + 4.870479E+04 -3.478105E-05 + 1.588841E+04 -1.265265E-04 + 5.735123E+03 -4.102589E-04 + 2.236137E+03 -1.203834E-03 + 9.266468E+02 -3.179062E-03 + 4.031743E+02 -7.353828E-03 + 1.823476E+02 -1.389022E-02 + 8.454885E+01 -1.677875E-02 + 3.839634E+01 4.163378E-03 + 1.845859E+01 6.814703E-02 + 8.863548E+00 1.061029E-01 + 3.916227E+00 -4.339980E-02 + 1.838870E+00 -2.094950E-01 + 8.043620E-01 -2.310271E-01 + 1.697970E-01 2.590532E-01 + 7.930600E-02 5.691426E-01 +S 19 1.00 + 5.045991E+06 -3.924245E-07 + 7.556142E+05 -3.113909E-06 + 1.719568E+05 -1.590447E-05 + 4.870479E+04 -6.981394E-05 + 1.588841E+04 -2.417848E-04 + 5.735123E+03 -8.326195E-04 + 2.236137E+03 -2.270294E-03 + 9.266468E+02 -6.557427E-03 + 4.031743E+02 -1.354288E-02 + 1.823476E+02 -2.989768E-02 + 8.454885E+01 -2.693106E-02 + 3.839634E+01 -7.827693E-03 + 1.845859E+01 1.741667E-01 + 8.863548E+00 1.595468E-01 + 3.916227E+00 1.995550E-02 + 1.838870E+00 -8.897000E-01 + 8.043620E-01 2.486892E-01 + 1.697970E-01 1.613012E+00 + 7.930600E-02 -5.990277E-01 +S 1 1.00 + 3.467700E-02 1.0000000 +P 15 1.00 + 2.102792E+04 4.100000E-05 + 4.977560E+03 3.630000E-04 + 1.616740E+03 2.097000E-03 + 6.186718E+02 9.250000E-03 + 2.625183E+02 3.279600E-02 + 1.196907E+02 9.400400E-02 + 5.746585E+01 2.082800E-01 + 2.852829E+01 3.336540E-01 + 1.452148E+01 3.329040E-01 + 7.453850E+00 1.553720E-01 + 3.723553E+00 2.085900E-02 + 1.809813E+00 -2.440000E-03 + 8.513360E-01 -1.998000E-03 + 3.248140E-01 -3.380000E-04 + 1.195220E-01 3.500000E-05 +P 15 1.00 + 2.102792E+04 -1.500000E-05 + 4.977560E+03 -1.290000E-04 + 1.616740E+03 -7.490000E-04 + 6.186718E+02 -3.328000E-03 + 2.625183E+02 -1.194700E-02 + 1.196907E+02 -3.524200E-02 + 5.746585E+01 -8.120400E-02 + 2.852829E+01 -1.374930E-01 + 1.452148E+01 -1.392260E-01 + 7.453850E+00 3.601600E-02 + 3.723553E+00 3.391280E-01 + 1.809813E+00 4.504720E-01 + 8.513360E-01 2.817830E-01 + 3.248140E-01 4.789800E-02 + 1.195220E-01 -2.987000E-03 +P 15 1.00 + 2.102792E+04 3.000000E-06 + 4.977560E+03 2.600000E-05 + 1.616740E+03 1.520000E-04 + 6.186718E+02 6.780000E-04 + 2.625183E+02 2.427000E-03 + 1.196907E+02 7.201000E-03 + 5.746585E+01 1.657800E-02 + 2.852829E+01 2.839200E-02 + 1.452148E+01 2.859900E-02 + 7.453850E+00 -1.013200E-02 + 3.723553E+00 -8.291200E-02 + 1.809813E+00 -1.159980E-01 + 8.513360E-01 -7.279500E-02 + 3.248140E-01 1.956400E-01 + 1.195220E-01 5.670990E-01 +P 15 1.00 + 2.102792E+04 6.000000E-06 + 4.977560E+03 5.300000E-05 + 1.616740E+03 3.050000E-04 + 6.186718E+02 1.364000E-03 + 2.625183E+02 4.876000E-03 + 1.196907E+02 1.450300E-02 + 5.746585E+01 3.329600E-02 + 2.852829E+01 5.748200E-02 + 1.452148E+01 5.870200E-02 + 7.453850E+00 -1.990400E-02 + 3.723553E+00 -1.946950E-01 + 1.809813E+00 -2.396130E-01 + 8.513360E-01 -2.232000E-03 + 3.248140E-01 5.214350E-01 + 1.195220E-01 5.455400E-01 +P 1 1.00 + 4.236600E-02 1.0000000 +D 7 1.00 + 1.402527E+02 3.376000E-03 + 4.172610E+01 2.514100E-02 + 1.539810E+01 9.774600E-02 + 6.277100E+00 2.347090E-01 + 2.618500E+00 3.469450E-01 + 1.052600E+00 3.510680E-01 + 3.916000E-01 2.502550E-01 +D 7 1.00 + 1.402527E+02 -3.495000E-03 + 4.172610E+01 -2.601500E-02 + 1.539810E+01 -1.038760E-01 + 6.277100E+00 -2.520700E-01 + 2.618500E+00 -2.945800E-01 + 1.052600E+00 1.152000E-03 + 3.916000E-01 4.385890E-01 +D 1 1.00 + 1.262000E-01 1.0000000 +F 2 1.00 + 4.345500E+00 4.174290E-01 + 1.068000E+00 7.714830E-01 +S 1 1.00 + 1.516000E-02 1.0000000 +P 1 1.00 + 1.502000E-02 1.0000000 +D 1 1.00 + 4.067000E-02 1.0000000 +F 1 1.00 + 4.083000E-01 1.0000000 +**** +Cu 0 +S 19 1.00 + 5.430321E+06 7.801026E-06 + 8.131665E+05 6.065666E-05 + 1.850544E+05 3.188964E-04 + 5.241466E+04 1.344687E-03 + 1.709868E+04 4.869050E-03 + 6.171994E+03 1.561013E-02 + 2.406481E+03 4.452077E-02 + 9.972584E+02 1.103111E-01 + 4.339289E+02 2.220342E-01 + 1.962869E+02 3.133739E-01 + 9.104280E+01 2.315121E-01 + 4.138425E+01 7.640920E-02 + 1.993278E+01 1.103818E-01 + 9.581891E+00 1.094372E-01 + 4.234516E+00 1.836311E-02 + 1.985814E+00 -6.043084E-04 + 8.670830E-01 5.092245E-05 + 1.813390E-01 -5.540730E-05 + 8.365700E-02 3.969482E-05 +S 19 1.00 + 5.430321E+06 -4.404706E-06 + 8.131665E+05 -3.424801E-05 + 1.850544E+05 -1.801238E-04 + 5.241466E+04 -7.600455E-04 + 1.709868E+04 -2.759348E-03 + 6.171994E+03 -8.900970E-03 + 2.406481E+03 -2.579378E-02 + 9.972584E+02 -6.623861E-02 + 4.339289E+02 -1.445927E-01 + 1.962869E+02 -2.440110E-01 + 9.104280E+01 -2.504837E-01 + 4.138425E+01 2.852577E-02 + 1.993278E+01 5.115874E-01 + 9.581891E+00 4.928061E-01 + 4.234516E+00 8.788437E-02 + 1.985814E+00 -5.820281E-03 + 8.670830E-01 2.013508E-04 + 1.813390E-01 -5.182553E-04 + 8.365700E-02 3.731503E-04 +S 19 1.00 + 5.430321E+06 9.704682E-07 + 8.131665E+05 7.549245E-06 + 1.850544E+05 3.968892E-05 + 5.241466E+04 1.677200E-04 + 1.709868E+04 6.095101E-04 + 6.171994E+03 1.978846E-03 + 2.406481E+03 5.798049E-03 + 9.972584E+02 1.534158E-02 + 4.339289E+02 3.540484E-02 + 1.962869E+02 6.702098E-02 + 9.104280E+01 8.026945E-02 + 4.138425E+01 -1.927231E-02 + 1.993278E+01 -3.160129E-01 + 9.581891E+00 -4.573162E-01 + 4.234516E+00 1.550841E-01 + 1.985814E+00 7.202872E-01 + 8.670830E-01 3.885122E-01 + 1.813390E-01 1.924326E-02 + 8.365700E-02 -7.103807E-03 +S 19 1.00 + 5.430321E+06 -1.959354E-07 + 8.131665E+05 -1.523472E-06 + 1.850544E+05 -8.014808E-06 + 5.241466E+04 -3.383992E-05 + 1.709868E+04 -1.231191E-04 + 6.171994E+03 -3.992085E-04 + 2.406481E+03 -1.171900E-03 + 9.972584E+02 -3.096141E-03 + 4.339289E+02 -7.171993E-03 + 1.962869E+02 -1.356621E-02 + 9.104280E+01 -1.643989E-02 + 4.138425E+01 4.107628E-03 + 1.993278E+01 6.693964E-02 + 9.581891E+00 1.028221E-01 + 4.234516E+00 -4.422945E-02 + 1.985814E+00 -2.031191E-01 + 8.670830E-01 -2.230022E-01 + 1.813390E-01 2.517975E-01 + 8.365700E-02 5.650091E-01 +S 19 1.00 + 5.430321E+06 -3.532229E-07 + 8.131665E+05 -2.798812E-06 + 1.850544E+05 -1.432517E-05 + 5.241466E+04 -6.270946E-05 + 1.709868E+04 -2.179490E-04 + 6.171994E+03 -7.474316E-04 + 2.406481E+03 -2.049271E-03 + 9.972584E+02 -5.885203E-03 + 4.339289E+02 -1.226885E-02 + 1.962869E+02 -2.683147E-02 + 9.104280E+01 -2.479261E-02 + 4.138425E+01 -5.984746E-03 + 1.993278E+01 1.557124E-01 + 9.581891E+00 1.436683E-01 + 4.234516E+00 8.374103E-03 + 1.985814E+00 -7.460711E-01 + 8.670830E-01 1.244367E-01 + 1.813390E-01 1.510110E+00 + 8.365700E-02 -3.477122E-01 +S 1 1.00 + 3.626700E-02 1.0000000 +P 15 1.00 + 2.276057E+04 4.000000E-05 + 5.387679E+03 3.610000E-04 + 1.749945E+03 2.083000E-03 + 6.696653E+02 9.197000E-03 + 2.841948E+02 3.266000E-02 + 1.296077E+02 9.379500E-02 + 6.225415E+01 2.082740E-01 + 3.092964E+01 3.339930E-01 + 1.575827E+01 3.324930E-01 + 8.094211E+00 1.547280E-01 + 4.046921E+00 2.127100E-02 + 1.967869E+00 -1.690000E-03 + 9.252950E-01 -1.516000E-03 + 3.529920E-01 -2.420000E-04 + 1.273070E-01 2.300000E-05 +P 15 1.00 + 2.276057E+04 -1.500000E-05 + 5.387679E+03 -1.310000E-04 + 1.749945E+03 -7.550000E-04 + 6.696653E+02 -3.359000E-03 + 2.841948E+02 -1.208100E-02 + 1.296077E+02 -3.570300E-02 + 6.225415E+01 -8.250200E-02 + 3.092964E+01 -1.398900E-01 + 1.575827E+01 -1.407290E-01 + 8.094211E+00 3.876600E-02 + 4.046921E+00 3.426950E-01 + 1.967869E+00 4.523100E-01 + 9.252950E-01 2.770540E-01 + 3.529920E-01 4.388500E-02 + 1.273070E-01 -2.802000E-03 +P 15 1.00 + 2.276057E+04 3.000000E-06 + 5.387679E+03 2.500000E-05 + 1.749945E+03 1.470000E-04 + 6.696653E+02 6.560000E-04 + 2.841948E+02 2.351000E-03 + 1.296077E+02 7.004000E-03 + 6.225415E+01 1.613100E-02 + 3.092964E+01 2.777000E-02 + 1.575827E+01 2.756700E-02 + 8.094211E+00 -1.011500E-02 + 4.046921E+00 -8.100900E-02 + 1.967869E+00 -1.104090E-01 + 9.252950E-01 -7.173200E-02 + 3.529920E-01 1.879300E-01 + 1.273070E-01 5.646290E-01 +P 15 1.00 + 2.276057E+04 5.000000E-06 + 5.387679E+03 4.900000E-05 + 1.749945E+03 2.780000E-04 + 6.696653E+02 1.253000E-03 + 2.841948E+02 4.447000E-03 + 1.296077E+02 1.337000E-02 + 6.225415E+01 3.046900E-02 + 3.092964E+01 5.344700E-02 + 1.575827E+01 5.263900E-02 + 8.094211E+00 -1.688100E-02 + 4.046921E+00 -1.794480E-01 + 1.967869E+00 -2.095880E-01 + 9.252950E-01 -3.963300E-02 + 3.529920E-01 5.021300E-01 + 1.273070E-01 5.811110E-01 +P 1 1.00 + 4.435600E-02 1.0000000 +D 7 1.00 + 1.738970E+02 2.700000E-03 + 5.188690E+01 2.090900E-02 + 1.934190E+01 8.440800E-02 + 7.975720E+00 2.139990E-01 + 3.398230E+00 3.359800E-01 + 1.409320E+00 3.573010E-01 + 5.488580E-01 2.645780E-01 +D 7 1.00 + 1.738970E+02 -3.363000E-03 + 5.188690E+01 -2.607900E-02 + 1.934190E+01 -1.082310E-01 + 7.975720E+00 -2.822170E-01 + 3.398230E+00 -3.471900E-01 + 1.409320E+00 2.671100E-02 + 5.488580E-01 4.920470E-01 +D 1 1.00 + 1.901990E-01 1.0000000 +F 2 1.00 + 5.028600E+00 4.242800E-01 + 1.259400E+00 7.630250E-01 +S 1 1.00 + 1.572000E-02 1.0000000 +P 1 1.00 + 1.545000E-02 1.0000000 +D 1 1.00 + 6.591000E-02 1.0000000 +F 1 1.00 + 4.617200E-01 1.0000000 +**** +Zn 0 +S 19 1.00 + 5.820021E+06 8.549241E-06 + 8.715234E+05 6.647410E-05 + 1.983350E+05 3.494962E-04 + 5.617631E+04 1.473832E-03 + 1.832582E+04 5.338330E-03 + 6.614955E+03 1.712708E-02 + 2.579199E+03 4.894085E-02 + 1.068849E+03 1.217934E-01 + 4.651045E+02 2.476589E-01 + 2.104130E+02 3.582431E-01 + 9.761629E+01 2.798174E-01 + 4.438020E+01 6.857491E-02 + 2.142308E+01 -1.311092E-03 + 1.030891E+01 1.914001E-03 + 4.553645E+00 -8.759220E-04 + 2.132821E+00 3.740096E-04 + 9.296970E-01 -1.401399E-04 + 1.921470E-01 4.757132E-05 + 8.759500E-02 -3.642711E-05 +S 19 1.00 + 5.820021E+06 -2.640069E-06 + 8.715234E+05 -2.052720E-05 + 1.983350E+05 -1.079859E-04 + 5.617631E+04 -4.558577E-04 + 1.832582E+04 -1.657758E-03 + 6.614955E+03 -5.368492E-03 + 2.579199E+03 -1.571249E-02 + 1.068849E+03 -4.122558E-02 + 4.651045E+02 -9.406459E-02 + 2.104130E+02 -1.719954E-01 + 9.761629E+01 -1.958523E-01 + 4.438020E+01 4.532907E-02 + 2.142308E+01 5.244442E-01 + 1.030891E+01 5.006142E-01 + 4.553645E+00 8.945527E-02 + 2.132821E+00 -2.146262E-03 + 9.296970E-01 2.112113E-03 + 1.921470E-01 -4.133980E-04 + 8.759500E-02 3.209752E-04 +S 19 1.00 + 5.820021E+06 9.967103E-07 + 8.715234E+05 7.754163E-06 + 1.983350E+05 4.076019E-05 + 5.617631E+04 1.722811E-04 + 1.832582E+04 6.259370E-04 + 6.614955E+03 2.032855E-03 + 2.579199E+03 5.954646E-03 + 1.068849E+03 1.576640E-02 + 4.651045E+02 3.637638E-02 + 2.104130E+02 6.892343E-02 + 9.761629E+01 8.238093E-02 + 4.438020E+01 -2.011360E-02 + 2.142308E+01 -3.252526E-01 + 1.030891E+01 -4.602899E-01 + 4.553645E+00 1.635546E-01 + 2.132821E+00 7.297118E-01 + 9.296970E-01 3.769751E-01 + 1.921470E-01 1.433224E-02 + 8.759500E-02 -6.671210E-03 +S 19 1.00 + 5.820021E+06 1.995818E-07 + 8.715234E+05 1.552973E-06 + 1.983350E+05 8.161259E-06 + 5.617631E+04 3.450747E-05 + 1.832582E+04 1.253275E-04 + 6.614955E+03 4.072990E-04 + 2.579199E+03 1.192734E-03 + 1.068849E+03 3.163140E-03 + 4.651045E+02 7.303942E-03 + 2.104130E+02 1.391279E-02 + 9.761629E+01 1.670620E-02 + 4.438020E+01 -4.035586E-03 + 2.142308E+01 -6.968861E-02 + 1.030891E+01 -1.030105E-01 + 4.553645E+00 4.471442E-02 + 2.132821E+00 2.150027E-01 + 9.296970E-01 2.220163E-01 + 1.921470E-01 -3.114776E-01 + 8.759500E-02 -5.693429E-01 +S 19 1.00 + 5.820021E+06 -5.435910E-07 + 8.715234E+05 -4.336894E-06 + 1.983350E+05 -2.197572E-05 + 5.617631E+04 -9.747392E-05 + 1.832582E+04 -3.331615E-04 + 6.614955E+03 -1.166192E-03 + 2.579199E+03 -3.119308E-03 + 1.068849E+03 -9.239504E-03 + 4.651045E+02 -1.855471E-02 + 2.104130E+02 -4.281189E-02 + 9.761629E+01 -3.571095E-02 + 4.438020E+01 -1.638350E-02 + 2.142308E+01 2.644664E-01 + 1.030891E+01 2.086588E-01 + 4.553645E+00 -1.774382E-02 + 2.132821E+00 -1.353873E+00 + 9.296970E-01 8.182926E-01 + 1.921470E-01 1.695036E+00 + 8.759500E-02 -1.388656E+00 +S 1 1.00 + 3.770200E-02 1.0000000 +P 15 1.00 + 2.441198E+04 4.100000E-05 + 5.778518E+03 3.610000E-04 + 1.876862E+03 2.088000E-03 + 7.182361E+02 9.221000E-03 + 3.048327E+02 3.277300E-02 + 1.390453E+02 9.417900E-02 + 6.680417E+01 2.091320E-01 + 3.320699E+01 3.345690E-01 + 1.692816E+01 3.303590E-01 + 8.696229E+00 1.523470E-01 + 4.350510E+00 2.298400E-02 + 2.116523E+00 1.607000E-03 + 9.953870E-01 4.680000E-04 + 3.781120E-01 6.600000E-05 + 1.345790E-01 -2.000000E-06 +P 15 1.00 + 2.441198E+04 -1.500000E-05 + 5.778518E+03 -1.350000E-04 + 1.876862E+03 -7.820000E-04 + 7.182361E+02 -3.478000E-03 + 3.048327E+02 -1.252000E-02 + 1.390453E+02 -3.701600E-02 + 6.680417E+01 -8.555900E-02 + 3.320699E+01 -1.447180E-01 + 1.692816E+01 -1.434420E-01 + 8.696229E+00 4.359500E-02 + 4.350510E+00 3.488880E-01 + 2.116523E+00 4.538650E-01 + 9.953870E-01 2.685940E-01 + 3.781120E-01 3.886800E-02 + 1.345790E-01 -2.492000E-03 +P 15 1.00 + 2.441198E+04 3.000000E-06 + 5.778518E+03 2.500000E-05 + 1.876862E+03 1.440000E-04 + 7.182361E+02 6.450000E-04 + 3.048327E+02 2.311000E-03 + 1.390453E+02 6.898000E-03 + 6.680417E+01 1.588200E-02 + 3.320699E+01 2.735000E-02 + 1.692816E+01 2.662100E-02 + 8.696229E+00 -1.085800E-02 + 4.350510E+00 -7.985300E-02 + 2.116523E+00 -1.061270E-01 + 9.953870E-01 -6.888300E-02 + 3.781120E-01 1.843850E-01 + 1.345790E-01 5.617880E-01 +P 15 1.00 + 2.441198E+04 5.000000E-06 + 5.778518E+03 4.200000E-05 + 1.876862E+03 2.380000E-04 + 7.182361E+02 1.088000E-03 + 3.048327E+02 3.821000E-03 + 1.390453E+02 1.164400E-02 + 6.680417E+01 2.616700E-02 + 3.320699E+01 4.675000E-02 + 1.692816E+01 4.330900E-02 + 8.696229E+00 -1.342900E-02 + 4.350510E+00 -1.538970E-01 + 2.116523E+00 -1.674130E-01 + 9.953870E-01 -8.499500E-02 + 3.781120E-01 4.508130E-01 + 1.345790E-01 6.408690E-01 +P 1 1.00 + 4.628200E-02 1.0000000 +D 7 1.00 + 2.056177E+02 2.342000E-03 + 6.144981E+01 1.860600E-02 + 2.305689E+01 7.710200E-02 + 9.577739E+00 2.020260E-01 + 4.133734E+00 3.294540E-01 + 1.747518E+00 3.609760E-01 + 6.995600E-01 2.716570E-01 +D 7 1.00 + 2.056177E+02 3.279000E-03 + 6.144981E+01 2.617600E-02 + 2.305689E+01 1.113670E-01 + 9.577739E+00 3.045810E-01 + 4.133734E+00 3.862990E-01 + 1.747518E+00 -5.837500E-02 + 6.995600E-01 -5.388760E-01 +D 1 1.00 + 2.516080E-01 1.0000000 +F 2 1.00 + 5.734400E+00 4.311320E-01 + 1.461500E+00 7.546420E-01 +S 1 1.00 + 1.623000E-02 1.0000000 +P 1 1.00 + 1.592000E-02 1.0000000 +D 1 1.00 + 9.049000E-02 1.0000000 +F 1 1.00 + 5.486100E-01 1.0000000 +**** +Ga 0 +S 13 1.00 + 485130.0000000 0.0002068 + 72719.0000000 0.0016047 + 16552.0000000 0.0083402 + 4687.8000000 0.0340248 + 1529.1000000 0.1111699 + 551.8100000 0.2753930 + 215.1800000 0.4212628 + 88.1740000 0.2738906 + 27.1540000 0.0283720 + 11.5030000 -0.0062931 + 3.3018000 0.0020606 + 1.3314000 -0.0009269 + 0.1931600 0.0002273 +S 13 1.00 + 485130.0000000 -0.0000643 + 72719.0000000 -0.0004954 + 16552.0000000 -0.0026208 + 4687.8000000 -0.0106839 + 1529.1000000 -0.0374123 + 551.8100000 -0.1009636 + 215.1800000 -0.2145141 + 88.1740000 -0.1752297 + 27.1540000 0.4831599 + 11.5030000 0.6323677 + 3.3018000 0.0684942 + 1.3314000 -0.0118712 + 0.1931600 0.0026652 +S 13 1.00 + 485130.0000000 0.0000245 + 72719.0000000 0.0001895 + 16552.0000000 0.0009964 + 4687.8000000 0.0041082 + 1529.1000000 0.0142938 + 551.8100000 0.0398034 + 215.1800000 0.0855940 + 88.1740000 0.0796305 + 27.1540000 -0.2939107 + 11.5030000 -0.5263914 + 3.3018000 0.5864249 + 1.3314000 0.6726347 + 0.1931600 0.0276123 +S 13 1.00 + 485130.0000000 -0.0000057 + 72719.0000000 -0.0000440 + 16552.0000000 -0.0002305 + 4687.8000000 -0.0009544 + 1529.1000000 -0.0033055 + 551.8100000 -0.0092888 + 215.1800000 -0.0198644 + 88.1740000 -0.0190888 + 27.1540000 0.0732356 + 11.5030000 0.1341526 + 3.3018000 -0.1831929 + 1.3314000 -0.3571308 + 0.1931600 0.6246013 +S 1 1.00 + 0.0708950 1.0000000 +P 10 1.00 + 3248.6000000 0.0015260 + 769.9700000 0.0127486 + 248.2000000 0.0633742 + 93.3640000 0.2065775 + 38.2510000 0.4092963 + 16.4220000 0.3919183 + 6.7918000 0.1029441 + 2.8336000 -0.0007203 + 1.1062000 0.0020950 + 0.2225000 -0.0003290 +P 10 1.00 + 3248.6000000 -0.0005803 + 769.9700000 -0.0048647 + 248.2000000 -0.0248394 + 93.3640000 -0.0841759 + 38.2510000 -0.1800885 + 16.4220000 -0.1585555 + 6.7918000 0.2355376 + 2.8336000 0.5820587 + 1.1062000 0.3366619 + 0.2225000 0.0171912 +P 10 1.00 + 3248.6000000 0.0000950 + 769.9700000 0.0007832 + 248.2000000 0.0040855 + 93.3640000 0.0135987 + 38.2510000 0.0302695 + 16.4220000 0.0241790 + 6.7918000 -0.0423777 + 2.8336000 -0.1265661 + 1.1062000 -0.0499444 + 0.2225000 0.4494199 +P 1 1.00 + 0.0617720 1.0000000 +D 5 1.00 + 65.3370000 0.0273825 + 18.4970000 0.1510805 + 6.3150000 0.3749217 + 2.1635000 0.4750799 + 0.6667500 0.2982750 +D 1 1.00 + 0.1884000 1.0000000 +S 1 1.00 + 0.0243480 1.0000000 +P 1 1.00 + 0.0151640 1.0000000 +D 1 1.00 + 0.0537000 1.0000000 +**** +Ge 0 +S 13 1.00 + 521800.0000000 0.0002045 + 78214.0000000 0.0015868 + 17803.0000000 0.0082480 + 5041.9000000 0.0336649 + 1644.5000000 0.1101249 + 593.4300000 0.2735607 + 231.3600000 0.4210670 + 94.7620000 0.2766791 + 29.2740000 0.0292180 + 12.4500000 -0.0065903 + 3.6463000 0.0022430 + 1.5025000 -0.0010382 + 0.2450300 0.0002695 +S 13 1.00 + 521800.0000000 -0.0000638 + 78214.0000000 -0.0004916 + 17803.0000000 -0.0026002 + 5041.9000000 -0.0106080 + 1644.5000000 -0.0371602 + 593.4300000 -0.1005790 + 231.3600000 -0.2143977 + 94.7620000 -0.1782617 + 29.2740000 0.4777404 + 12.4500000 0.6355983 + 3.6463000 0.0722174 + 1.5025000 -0.0127265 + 0.2450300 0.0029608 +S 13 1.00 + 521800.0000000 0.0000246 + 78214.0000000 0.0001900 + 17803.0000000 0.0009993 + 5041.9000000 0.0041200 + 1644.5000000 0.0143557 + 593.4300000 0.0400375 + 231.3600000 0.0865794 + 94.7620000 0.0815861 + 29.2740000 -0.2934770 + 12.4500000 -0.5367983 + 3.6463000 0.5637985 + 1.5025000 0.6947182 + 0.2450300 0.0315730 +S 13 1.00 + 521800.0000000 -0.0000063 + 78214.0000000 -0.0000486 + 17803.0000000 -0.0002553 + 5041.9000000 -0.0010560 + 1644.5000000 -0.0036674 + 593.4300000 -0.0103053 + 231.3600000 -0.0222200 + 94.7620000 -0.0215275 + 29.2740000 0.0806752 + 12.4500000 0.1524958 + 3.6463000 -0.1980528 + 1.5025000 -0.4073954 + 0.2450300 0.6477288 +S 1 1.00 + 0.0915940 1.0000000 +P 10 1.00 + 3568.1000000 0.0014591 + 845.7200000 0.0122176 + 272.7400000 0.0610490 + 102.6800000 0.2008039 + 42.1480000 0.4038942 + 18.1490000 0.3970027 + 7.5934000 0.1105481 + 3.1964000 0.0000768 + 1.2743000 0.0021263 + 0.2825800 -0.0003744 +P 10 1.00 + 3568.1000000 -0.0005630 + 845.7200000 -0.0047354 + 272.7400000 -0.0242643 + 102.6800000 -0.0830900 + 42.1480000 -0.1800247 + 18.1490000 -0.1663295 + 7.5934000 0.2193717 + 3.1964000 0.5820239 + 1.2743000 0.3477720 + 0.2825800 0.0192455 +P 10 1.00 + 3568.1000000 0.0001115 + 845.7200000 0.0009212 + 272.7400000 0.0048273 + 102.6800000 0.0162272 + 42.1480000 0.0366354 + 18.1490000 0.0307867 + 7.5934000 -0.0480643 + 3.1964000 -0.1559804 + 1.2743000 -0.0632370 + 0.2825800 0.5040819 +P 1 1.00 + 0.0840900 1.0000000 +D 5 1.00 + 74.7620000 0.0257684 + 21.3020000 0.1454421 + 7.3436000 0.3713721 + 2.5651000 0.4800002 + 0.8197000 0.2896800 +D 1 1.00 + 0.2470000 1.0000000 +S 1 1.00 + 0.0339610 1.0000000 +P 1 1.00 + 0.0239450 1.0000000 +D 1 1.00 + 0.0771000 1.0000000 +**** +As 0 +S 13 1.00 + 559583.7900000 0.0002024 + 83879.3300000 0.0015709 + 19092.6680000 0.0081662 + 5407.3925000 0.0333399 + 1763.7559000 0.1091726 + 636.4567200 0.2718853 + 248.0884300 0.4208509 + 101.5785100 0.2792257 + 31.4755130 0.0300301 + 13.4372820 -0.0068804 + 4.0086900 0.0024240 + 1.6849290 -0.0011491 + 0.3000190 0.0003095 +S 13 1.00 + 559583.7900000 -0.0000634 + 83879.3300000 -0.0004883 + 19092.6680000 -0.0025821 + 5407.3925000 -0.0105402 + 1763.7559000 -0.0369325 + 636.4567200 -0.1002355 + 248.0884300 -0.2142948 + 101.5785100 -0.1810526 + 31.4755130 0.4725410 + 13.4372820 0.6386194 + 4.0086900 0.0758107 + 1.6849290 -0.0135278 + 0.3000190 0.0031970 +S 13 1.00 + 559583.7900000 0.0000246 + 83879.3300000 0.0001907 + 19092.6680000 0.0010031 + 5407.3925000 0.0041353 + 1763.7559000 0.0144259 + 636.4567200 0.0402962 + 248.0884300 0.0875670 + 101.5785100 0.0835178 + 31.4755130 -0.2932935 + 13.4372820 -0.5470520 + 4.0086900 0.5438738 + 1.6849290 0.7143591 + 0.3000190 0.0353443 +S 13 1.00 + 559583.7900000 -0.0000068 + 83879.3300000 -0.0000525 + 19092.6680000 -0.0002756 + 5407.3925000 -0.0011389 + 1763.7559000 -0.0039646 + 636.4567200 -0.0111423 + 248.0884300 -0.0241991 + 101.5785100 -0.0236339 + 31.4755130 0.0866317 + 13.4372820 0.1685839 + 4.0086900 -0.2091425 + 1.6849290 -0.4500918 + 0.3000190 0.6603978 +S 1 1.00 + 0.1135870 1.0000000 +P 10 1.00 + 3886.3564000 0.0014097 + 921.2020100 0.0118277 + 297.1931900 0.0593280 + 111.9750800 0.1965115 + 46.0346210 0.3997891 + 19.8741940 0.4004653 + 8.3860880 0.1164196 + 3.5587280 0.0006918 + 1.4472820 0.0021633 + 0.3477790 -0.0004150 +P 10 1.00 + 3886.3564000 -0.0005519 + 921.2020100 -0.0046550 + 297.1931900 -0.0239176 + 111.9750800 -0.0825627 + 46.0346210 -0.1806791 + 19.8741940 -0.1724848 + 8.3860880 0.2086700 + 3.5587280 0.5823622 + 1.4472820 0.3537465 + 0.3477790 0.0206439 +P 10 1.00 + 3886.3564000 0.0001236 + 921.2020100 0.0010240 + 297.1931900 0.0053805 + 111.9750800 0.0182443 + 46.0346210 0.0415979 + 19.8741940 0.0362998 + 8.3860880 -0.0523569 + 3.5587280 -0.1791667 + 1.4472820 -0.0740477 + 0.3477790 0.5358094 +P 1 1.00 + 0.1076990 1.0000000 +D 5 1.00 + 84.4242340 0.0245288 + 24.1815890 0.1411340 + 8.4017770 0.3687579 + 2.9805020 0.4840626 + 0.9790030 0.2824434 +D 1 1.00 + 0.3098000 1.0000000 +S 1 1.00 + 0.0411520 1.0000000 +P 1 1.00 + 0.0312680 1.0000000 +D 1 1.00 + 0.1078000 1.0000000 +**** +Se 0 +S 13 1.00 + 598990.0000000 0.0002004 + 89783.0000000 0.0015554 + 20435.0000000 0.0080872 + 5786.9000000 0.0330344 + 1887.3000000 0.1082924 + 680.9700000 0.2703361 + 265.3900000 0.4206236 + 108.6300000 0.2815922 + 33.7600000 0.0308110 + 14.4650000 -0.0071617 + 4.3890000 0.0026022 + 1.8783000 -0.0012583 + 0.3585900 0.0003465 +S 13 1.00 + 598990.0000000 -0.0000629 + 89783.0000000 -0.0004850 + 20435.0000000 -0.0025644 + 5786.9000000 -0.0104761 + 1887.3000000 -0.0367223 + 680.9700000 -0.0999225 + 265.3900000 -0.2141973 + 108.6300000 -0.1836593 + 33.7600000 0.4675454 + 14.4650000 0.6414740 + 4.3890000 0.0792569 + 1.8783000 -0.0142697 + 0.3585900 0.0033792 +S 13 1.00 + 598990.0000000 0.0000247 + 89783.0000000 0.0001913 + 20435.0000000 0.0010068 + 5786.9000000 0.0041514 + 1887.3000000 0.0144991 + 680.9700000 0.0405658 + 265.3900000 0.0885364 + 108.6300000 0.0854212 + 33.7600000 -0.2932581 + 14.4650000 -0.5570727 + 4.3890000 0.5261436 + 1.8783000 0.7320371 + 0.3585900 0.0388246 +S 13 1.00 + 598990.0000000 -0.0000072 + 89783.0000000 -0.0000559 + 20435.0000000 -0.0002938 + 5786.9000000 -0.0012136 + 1887.3000000 -0.0042340 + 680.9700000 -0.0119035 + 265.3900000 -0.0260206 + 108.6300000 -0.0256148 + 33.7600000 0.0919427 + 14.4650000 0.1838700 + 4.3890000 -0.2188461 + 1.8783000 -0.4896524 + 0.3585900 0.6775818 +S 1 1.00 + 0.1364900 1.0000000 +P 10 1.00 + 4135.6000000 0.0014127 + 980.3400000 0.0118588 + 316.3500000 0.0595153 + 119.2500000 0.1972201 + 49.0680000 0.4007439 + 21.2120000 0.3994740 + 8.9462000 0.1153364 + 3.8236000 0.0002219 + 1.5883000 0.0022838 + 0.4096900 -0.0004756 +P 10 1.00 + 4135.6000000 -0.0005610 + 980.3400000 -0.0047340 + 316.3500000 -0.0243504 + 119.2500000 -0.0841071 + 49.0680000 -0.1841384 + 21.2120000 -0.1735004 + 8.9462000 0.2167263 + 3.8236000 0.5850099 + 1.5883000 0.3416816 + 0.4096900 0.0199125 +P 10 1.00 + 4135.6000000 0.0001366 + 980.3400000 0.0011308 + 316.3500000 0.0059581 + 119.2500000 0.0201866 + 49.0680000 0.0461939 + 21.2120000 0.0394050 + 8.9462000 -0.0592846 + 3.8236000 -0.2014663 + 1.5883000 -0.0687821 + 0.4096900 0.5595944 +P 1 1.00 + 0.1245900 1.0000000 +D 5 1.00 + 94.4720000 0.0234982 + 27.1800000 0.1375183 + 9.5068000 0.3664824 + 3.4168000 0.4874717 + 1.1479000 0.2765769 +D 1 1.00 + 0.3682000 1.0000000 +S 1 1.00 + 0.0487470 1.0000000 +P 1 1.00 + 0.0354920 1.0000000 +D 1 1.00 + 0.1283000 1.0000000 +**** +Br 0 +S 13 1.00 + 640100.0000000 0.0001984 + 95938.0000000 0.0015400 + 21833.0000000 0.0080096 + 6181.9000000 0.0327341 + 2015.7000000 0.1074480 + 727.1000000 0.2688946 + 283.2800000 0.4204411 + 115.9100000 0.2838041 + 36.1240000 0.0315455 + 15.5320000 -0.0074268 + 4.7857000 0.0027728 + 2.0817000 -0.0013635 + 0.4202800 0.0003812 +S 13 1.00 + 640100.0000000 -0.0000625 + 95938.0000000 -0.0004816 + 21833.0000000 -0.0025466 + 6181.9000000 -0.0104112 + 2015.7000000 -0.0365179 + 727.1000000 -0.0996295 + 283.2800000 -0.2141310 + 115.9100000 -0.1860911 + 36.1240000 0.4628261 + 15.5320000 0.6441141 + 4.7857000 0.0825502 + 2.0817000 -0.0149694 + 0.4202800 0.0035288 +S 13 1.00 + 640100.0000000 0.0000248 + 95938.0000000 0.0001919 + 21833.0000000 0.0010100 + 6181.9000000 0.0041659 + 2015.7000000 0.0145683 + 727.1000000 0.0408345 + 283.2800000 0.0894859 + 115.9100000 0.0872786 + 36.1240000 -0.2933644 + 15.5320000 -0.5667109 + 4.7857000 0.5105658 + 2.0817000 0.7477214 + 0.4202800 0.0421512 +S 13 1.00 + 640100.0000000 -0.0000076 + 95938.0000000 -0.0000588 + 21833.0000000 -0.0003092 + 6181.9000000 -0.0012766 + 2015.7000000 -0.0044634 + 727.1000000 -0.0125575 + 283.2800000 -0.0276145 + 115.9100000 -0.0273945 + 36.1240000 0.0964094 + 15.5320000 0.1976871 + 4.7857000 -0.2266693 + 2.0817000 -0.5241165 + 0.4202800 0.6889865 +S 1 1.00 + 0.1606900 1.0000000 +P 10 1.00 + 4340.8000000 0.0014448 + 1028.9000000 0.0121288 + 332.0200000 0.0608077 + 125.1600000 0.2009358 + 51.5110000 0.4047419 + 22.2810000 0.3957151 + 9.3417000 0.1102213 + 4.0132000 -0.0009090 + 1.7002000 0.0024832 + 0.4719400 -0.0005744 +P 10 1.00 + 4340.8000000 -0.0005819 + 1028.9000000 -0.0049065 + 332.0200000 -0.0252514 + 125.1600000 -0.0869445 + 51.5110000 -0.1893422 + 22.2810000 -0.1710882 + 9.3417000 0.2368755 + 4.0132000 0.5898400 + 1.7002000 0.3171944 + 0.4719400 0.0179833 +P 10 1.00 + 4340.8000000 0.0001518 + 1028.9000000 0.0012563 + 332.0200000 0.0066224 + 125.1600000 0.0223816 + 51.5110000 0.0509717 + 22.2810000 0.0414009 + 9.3417000 -0.0703970 + 4.0132000 -0.2232540 + 1.7002000 -0.0564179 + 0.4719400 0.5808079 +P 1 1.00 + 0.1442100 1.0000000 +D 5 1.00 + 104.8300000 0.0226583 + 30.2720000 0.1345895 + 10.6490000 0.3647181 + 3.8696000 0.4904196 + 1.3239000 0.2713885 +D 1 1.00 + 0.4098000 1.0000000 +S 1 1.00 + 0.0569460 1.0000000 +P 1 1.00 + 0.0410490 1.0000000 +D 1 1.00 + 0.1719000 1.0000000 +**** +Kr 0 +S 13 1.00 + 681358.8200000 0.0001969 + 102126.4800000 0.0015286 + 23243.7100000 0.0079500 + 6582.0073000 0.0324938 + 2146.4286000 0.1067240 + 774.3378200 0.2675701 + 301.6702000 0.4201851 + 123.4118400 0.2858015 + 38.5675510 0.0322461 + 16.6373790 -0.0076828 + 5.1987950 0.0029393 + 2.2948140 -0.0014662 + 0.4852110 0.0004144 +S 13 1.00 + 681358.8200000 -0.0000622 + 102126.4800000 -0.0004794 + 23243.7100000 -0.0025341 + 6582.0073000 -0.0103636 + 2146.4286000 -0.0363516 + 774.3378200 -0.0993737 + 301.6702000 -0.2140610 + 123.4118400 -0.1883192 + 38.5675510 0.4583816 + 16.6373790 0.6465664 + 5.1987950 0.0856579 + 2.2948140 -0.0156123 + 0.4852110 0.0036490 +S 13 1.00 + 681358.8200000 0.0000249 + 102126.4800000 0.0001928 + 23243.7100000 0.0010149 + 6582.0073000 0.0041857 + 2146.4286000 0.0146459 + 774.3378200 0.0411070 + 301.6702000 0.0903955 + 123.4118400 0.0890623 + 38.5675510 -0.2935718 + 16.6373790 -0.5759698 + 5.1987950 0.4968578 + 2.2948140 0.7616895 + 0.4852110 0.0453267 +S 13 1.00 + 681358.8200000 -0.0000079 + 102126.4800000 -0.0000614 + 23243.7100000 -0.0003230 + 6582.0073000 -0.0013330 + 2146.4286000 -0.0046672 + 774.3378200 -0.0131352 + 301.6702000 -0.0290342 + 123.4118400 -0.0290173 + 38.5675510 0.1002664 + 16.6373790 0.2103818 + 5.1987950 -0.2332471 + 2.2948140 -0.5546497 + 0.4852110 0.6969522 +S 1 1.00 + 0.1862700 1.0000000 +P 10 1.00 + 4474.2699000 0.0015195 + 1060.5790000 0.0127424 + 342.2081200 0.0636465 + 128.9984200 0.2085635 + 53.0872220 0.4122423 + 22.9594250 0.3878103 + 9.5073000 0.1003820 + 4.0830550 -0.0025078 + 1.7504460 0.0027139 + 0.5291900 -0.0006977 +P 10 1.00 + 4474.2699000 -0.0006208 + 1060.5790000 -0.0052212 + 342.2081200 -0.0268463 + 128.9984200 -0.0915823 + 53.0872220 -0.1968164 + 22.9594250 -0.1634750 + 9.5073000 0.2738204 + 4.0830550 0.5981592 + 1.7504460 0.2750453 + 0.5291900 0.0127706 +P 10 1.00 + 4474.2699000 0.0001701 + 1060.5790000 0.0014064 + 342.2081200 0.0073963 + 128.9984200 0.0248254 + 53.0872220 0.0557155 + 22.9594250 0.0412132 + 9.5073000 -0.0876057 + 4.0830550 -0.2440586 + 1.7504460 -0.0295007 + 0.5291900 0.6012295 +P 1 1.00 + 0.1643690 1.0000000 +D 5 1.00 + 115.5253200 0.0219557 + 33.4652460 0.1321620 + 11.8304590 0.3633484 + 4.3397710 0.4929582 + 1.5075240 0.2667560 +D 1 1.00 + 0.5030000 1.0000000 +S 1 1.00 + 0.0651450 1.0000000 +P 1 1.00 + 0.0466060 1.0000000 +D 1 1.00 + 0.2155000 1.0000000 +**** diff --git a/basis/cc-pvdz.gbf b/basis/cc-pvdz.gbf new file mode 100644 index 0000000..7156814 --- /dev/null +++ b/basis/cc-pvdz.gbf @@ -0,0 +1,3391 @@ +spherical + +! +! cc-pVDZ EMSL Basis Set Exchange Library 5/17/11 11:50 AM +! Elements References +! -------- ---------- +! H : T.H. Dunning, Jr. J. Chem. Phys. 90, 1007 (1989). +! He : D.E. Woon and T.H. Dunning, Jr. J. Chem. Phys. 100, 2975 (1994). +! Li - Ne: T.H. Dunning, Jr. J. Chem. Phys. 90, 1007 (1989). +! Na - Mg: D.E. Woon and T.H. Dunning, Jr. (to be published) +! Al - Ar: D.E. Woon and T.H. Dunning, Jr. J. Chem. Phys. 98, 1358 (1993). +! Sc - Zn: N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 123, 064107 (2005), +! N.B. Balabanov and K.A. Peterson, J. Chem. Phys. 125, 074110 (2006) +! Ca : J. Koput and K.A. Peterson, J. Phys. Chem. A, 106, 9595 (2002). +! + + + +**** +H 0 +S 3 1.00 + 13.0100000 0.0196850 + 1.9620000 0.1379770 + 0.4446000 0.4781480 +S 1 1.00 + 0.1220000 1.0000000 +P 1 1.00 + 0.7270000 1.0000000 +**** +He 0 +S 3 1.00 + 38.3600000 0.0238090 + 5.7700000 0.1548910 + 1.2400000 0.4699870 +S 1 1.00 + 0.2976000 1.0000000 +P 1 1.00 + 1.2750000 1.0000000 +**** +Li 0 +S 8 1.00 + 1469.0000000 0.0007660 + 220.5000000 0.0058920 + 50.2600000 0.0296710 + 14.2400000 0.1091800 + 4.5810000 0.2827890 + 1.5800000 0.4531230 + 0.5640000 0.2747740 + 0.0734500 0.0097510 +S 8 1.00 + 1469.0000000 -0.0001200 + 220.5000000 -0.0009230 + 50.2600000 -0.0046890 + 14.2400000 -0.0176820 + 4.5810000 -0.0489020 + 1.5800000 -0.0960090 + 0.5640000 -0.1363800 + 0.0734500 0.5751020 +S 1 1.00 + 0.0280500 1.0000000 +P 3 1.00 + 1.5340000 0.0227840 + 0.2749000 0.1391070 + 0.0736200 0.5003750 +P 1 1.00 + 0.0240300 1.0000000 +D 1 1.00 + 0.1239000 1.0000000 +**** +Be 0 +S 8 1.00 + 2940.0000000 0.0006800 + 441.2000000 0.0052360 + 100.5000000 0.0266060 + 28.4300000 0.0999930 + 9.1690000 0.2697020 + 3.1960000 0.4514690 + 1.1590000 0.2950740 + 0.1811000 0.0125870 +S 8 1.00 + 2940.0000000 -0.0001230 + 441.2000000 -0.0009660 + 100.5000000 -0.0048310 + 28.4300000 -0.0193140 + 9.1690000 -0.0532800 + 3.1960000 -0.1207230 + 1.1590000 -0.1334350 + 0.1811000 0.5307670 +S 1 1.00 + 0.0589000 1.0000000 +P 3 1.00 + 3.6190000 0.0291110 + 0.7110000 0.1693650 + 0.1951000 0.5134580 +P 1 1.00 + 0.0601800 1.0000000 +D 1 1.00 + 0.2380000 1.0000000 +**** +B 0 +S 8 1.00 + 4570.0000000 0.0006960 + 685.9000000 0.0053530 + 156.5000000 0.0271340 + 44.4700000 0.1013800 + 14.4800000 0.2720550 + 5.1310000 0.4484030 + 1.8980000 0.2901230 + 0.3329000 0.0143220 +S 8 1.00 + 4570.0000000 -0.0001390 + 685.9000000 -0.0010970 + 156.5000000 -0.0054440 + 44.4700000 -0.0219160 + 14.4800000 -0.0597510 + 5.1310000 -0.1387320 + 1.8980000 -0.1314820 + 0.3329000 0.5395260 +S 1 1.00 + 0.1043000 1.0000000 +P 3 1.00 + 6.0010000 0.0354810 + 1.2410000 0.1980720 + 0.3364000 0.5052300 +P 1 1.00 + 0.0953800 1.0000000 +D 1 1.00 + 0.3430000 1.0000000 +**** +C 0 +S 8 1.00 + 6665.0000000 0.0006920 + 1000.0000000 0.0053290 + 228.0000000 0.0270770 + 64.7100000 0.1017180 + 21.0600000 0.2747400 + 7.4950000 0.4485640 + 2.7970000 0.2850740 + 0.5215000 0.0152040 +S 8 1.00 + 6665.0000000 -0.0001460 + 1000.0000000 -0.0011540 + 228.0000000 -0.0057250 + 64.7100000 -0.0233120 + 21.0600000 -0.0639550 + 7.4950000 -0.1499810 + 2.7970000 -0.1272620 + 0.5215000 0.5445290 +S 1 1.00 + 0.1596000 1.0000000 +P 3 1.00 + 9.4390000 0.0381090 + 2.0020000 0.2094800 + 0.5456000 0.5085570 +P 1 1.00 + 0.1517000 1.0000000 +D 1 1.00 + 0.5500000 1.0000000 +**** +N 0 +S 8 1.00 + 9046.0000000 0.0007000 + 1357.0000000 0.0053890 + 309.3000000 0.0274060 + 87.7300000 0.1032070 + 28.5600000 0.2787230 + 10.2100000 0.4485400 + 3.8380000 0.2782380 + 0.7466000 0.0154400 +S 8 1.00 + 9046.0000000 -0.0001530 + 1357.0000000 -0.0012080 + 309.3000000 -0.0059920 + 87.7300000 -0.0245440 + 28.5600000 -0.0674590 + 10.2100000 -0.1580780 + 3.8380000 -0.1218310 + 0.7466000 0.5490030 +S 1 1.00 + 0.2248000 1.0000000 +P 3 1.00 + 13.5500000 0.0399190 + 2.9170000 0.2171690 + 0.7973000 0.5103190 +P 1 1.00 + 0.2185000 1.0000000 +D 1 1.00 + 0.8170000 1.0000000 +**** +O 0 +S 8 1.00 + 11720.0000000 0.0007100 + 1759.0000000 0.0054700 + 400.8000000 0.0278370 + 113.7000000 0.1048000 + 37.0300000 0.2830620 + 13.2700000 0.4487190 + 5.0250000 0.2709520 + 1.0130000 0.0154580 +S 8 1.00 + 11720.0000000 -0.0001600 + 1759.0000000 -0.0012630 + 400.8000000 -0.0062670 + 113.7000000 -0.0257160 + 37.0300000 -0.0709240 + 13.2700000 -0.1654110 + 5.0250000 -0.1169550 + 1.0130000 0.5573680 +S 1 1.00 + 0.3023000 1.0000000 +P 3 1.00 + 17.7000000 0.0430180 + 3.8540000 0.2289130 + 1.0460000 0.5087280 +P 1 1.00 + 0.2753000 1.0000000 +D 1 1.00 + 1.1850000 1.0000000 +**** +F 0 +S 8 1.00 + 14710.0000000 0.0007210 + 2207.0000000 0.0055530 + 502.8000000 0.0282670 + 142.6000000 0.1064440 + 46.4700000 0.2868140 + 16.7000000 0.4486410 + 6.3560000 0.2647610 + 1.3160000 0.0153330 +S 8 1.00 + 14710.0000000 -0.0001650 + 2207.0000000 -0.0013080 + 502.8000000 -0.0064950 + 142.6000000 -0.0266910 + 46.4700000 -0.0736900 + 16.7000000 -0.1707760 + 6.3560000 -0.1123270 + 1.3160000 0.5628140 +S 1 1.00 + 0.3897000 1.0000000 +P 3 1.00 + 22.6700000 0.0448780 + 4.9770000 0.2357180 + 1.3470000 0.5085210 +P 1 1.00 + 0.3471000 1.0000000 +D 1 1.00 + 1.6400000 1.0000000 +**** +Ne 0 +S 8 1.00 + 17880.0000000 0.0007380 + 2683.0000000 0.0056770 + 611.5000000 0.0288830 + 173.5000000 0.1085400 + 56.6400000 0.2909070 + 20.4200000 0.4483240 + 7.8100000 0.2580260 + 1.6530000 0.0150630 +S 8 1.00 + 17880.0000000 -0.0001720 + 2683.0000000 -0.0013570 + 611.5000000 -0.0067370 + 173.5000000 -0.0276630 + 56.6400000 -0.0762080 + 20.4200000 -0.1752270 + 7.8100000 -0.1070380 + 1.6530000 0.5670500 +S 1 1.00 + 0.4869000 1.0000000 +P 3 1.00 + 28.3900000 0.0460870 + 6.2700000 0.2401810 + 1.6950000 0.5087440 +P 1 1.00 + 0.4317000 1.0000000 +D 1 1.00 + 2.2020000 1.0000000 +**** +Na 0 +S 11 1.00 + 31700.0000000 0.458878D-03 + 4755.0000000 0.355070D-02 + 1082.0000000 0.182618D-01 + 306.4000000 0.716650D-01 + 99.5300000 0.212346D+00 + 35.4200000 0.416203D+00 + 13.3000000 0.373020D+00 + 4.3920000 0.625054D-01 + 1.6760000 -0.624532D-02 + 0.5889000 0.243374D-02 + 0.0564000 -0.442381D-03 +S 11 1.00 + 31700.0000000 -0.112162D-03 + 4755.0000000 -0.868512D-03 + 1082.0000000 -0.451330D-02 + 306.4000000 -0.181436D-01 + 99.5300000 -0.580799D-01 + 35.4200000 -0.137653D+00 + 13.3000000 -0.193908D+00 + 4.3920000 0.858009D-01 + 1.6760000 0.604419D+00 + 0.5889000 0.441719D+00 + 0.0564000 0.130547D-01 +S 11 1.00 + 31700.0000000 0.170160D-04 + 4755.0000000 0.130693D-03 + 1082.0000000 0.687784D-03 + 306.4000000 0.272359D-02 + 99.5300000 0.895529D-02 + 35.4200000 0.207832D-01 + 13.3000000 0.319380D-01 + 4.3920000 -0.191368D-01 + 1.6760000 -0.102595D+00 + 0.5889000 -0.198945D+00 + 0.0564000 0.655952D+00 +S 1 1.00 + 0.0230700 1.0000000 +P 7 1.00 + 138.1000000 0.579641D-02 + 32.2400000 0.415756D-01 + 9.9850000 0.162873D+00 + 3.4840000 0.359401D+00 + 1.2310000 0.449988D+00 + 0.4177000 0.227507D+00 + 0.0651300 0.808247D-02 +P 7 1.00 + 138.1000000 -0.581531D-03 + 32.2400000 -0.407306D-02 + 9.9850000 -0.167937D-01 + 3.4840000 -0.353268D-01 + 1.2310000 -0.521971D-01 + 0.4177000 -0.168359D-01 + 0.0651300 0.434613D+00 +P 1 1.00 + 0.0205300 1.0000000 +D 1 1.00 + 0.0973000 1.0000000 +**** +Mg 0 +S 11 1.00 + 47390.0000000 0.346023D-03 + 7108.0000000 0.268077D-02 + 1618.0000000 0.138367D-01 + 458.4000000 0.551767D-01 + 149.3000000 0.169660D+00 + 53.5900000 0.364703D+00 + 20.7000000 0.406856D+00 + 8.3840000 0.135089D+00 + 2.5420000 0.490884D-02 + 0.8787000 0.286460D-03 + 0.1077000 0.264590D-04 +S 11 1.00 + 47390.0000000 -0.877839D-04 + 7108.0000000 -0.674725D-03 + 1618.0000000 -0.355603D-02 + 458.4000000 -0.142154D-01 + 149.3000000 -0.476748D-01 + 53.5900000 -0.114892D+00 + 20.7000000 -0.200676D+00 + 8.3840000 -0.341224D-01 + 2.5420000 0.570454D+00 + 0.8787000 0.542309D+00 + 0.1077000 0.218128D-01 +S 11 1.00 + 47390.0000000 0.169628D-04 + 7108.0000000 0.129865D-03 + 1618.0000000 0.688831D-03 + 458.4000000 0.273533D-02 + 149.3000000 0.931224D-02 + 53.5900000 0.223265D-01 + 20.7000000 0.411195D-01 + 8.3840000 0.545642D-02 + 2.5420000 -0.134012D+00 + 0.8787000 -0.256176D+00 + 0.1077000 0.605856D+00 +S 1 1.00 + 0.0399900 1.0000000 +P 7 1.00 + 179.9000000 0.538161D-02 + 42.1400000 0.392418D-01 + 13.1300000 0.157445D+00 + 4.6280000 0.358535D+00 + 1.6700000 0.457226D+00 + 0.5857000 0.215918D+00 + 0.1311000 0.664948D-02 +P 7 1.00 + 179.9000000 -0.865948D-03 + 42.1400000 -0.615978D-02 + 13.1300000 -0.261519D-01 + 4.6280000 -0.570647D-01 + 1.6700000 -0.873906D-01 + 0.5857000 -0.122990D-01 + 0.1311000 0.502085D+00 +P 1 1.00 + 0.0411200 1.0000000 +D 1 1.00 + 0.1870000 1.0000000 +**** +Al 0 +S 11 1.00 + 64150.0000000 0.290250D-03 + 9617.0000000 0.225064D-02 + 2189.0000000 0.116459D-01 + 620.5000000 0.467377D-01 + 202.7000000 0.146299D+00 + 73.1500000 0.330283D+00 + 28.5500000 0.415861D+00 + 11.7700000 0.189253D+00 + 3.3000000 0.115889D-01 + 1.1730000 -0.128385D-02 + 0.1752000 0.425883D-03 +S 11 1.00 + 64150.0000000 -0.758048D-04 + 9617.0000000 -0.581791D-03 + 2189.0000000 -0.308113D-02 + 620.5000000 -0.123112D-01 + 202.7000000 -0.419781D-01 + 73.1500000 -0.103371D+00 + 28.5500000 -0.196308D+00 + 11.7700000 -0.830002D-01 + 3.3000000 0.541040D+00 + 1.1730000 0.578796D+00 + 0.1752000 0.288147D-01 +S 11 1.00 + 64150.0000000 0.175078D-04 + 9617.0000000 0.134208D-03 + 2189.0000000 0.712442D-03 + 620.5000000 0.284330D-02 + 202.7000000 0.976842D-02 + 73.1500000 0.241850D-01 + 28.5500000 0.474993D-01 + 11.7700000 0.203621D-01 + 3.3000000 -0.158788D+00 + 1.1730000 -0.311694D+00 + 0.1752000 0.620147D+00 +S 1 1.00 + 0.0647300 1.0000000 +P 7 1.00 + 258.8000000 0.406847D-02 + 60.8900000 0.306815D-01 + 19.1400000 0.129149D+00 + 6.8810000 0.320831D+00 + 2.5740000 0.453815D+00 + 0.9572000 0.275066D+00 + 0.2099000 0.190807D-01 +P 7 1.00 + 258.8000000 -0.748053D-03 + 60.8900000 -0.545796D-02 + 19.1400000 -0.245371D-01 + 6.8810000 -0.582138D-01 + 2.5740000 -0.983756D-01 + 0.9572000 -0.260064D-01 + 0.2099000 0.464020D+00 +P 1 1.00 + 0.0598600 1.0000000 +D 1 1.00 + 0.1890000 1.0000000 +**** +Si 0 +S 11 1.00 + 78860.0000000 0.270443D-03 + 11820.0000000 0.209717D-02 + 2692.0000000 0.108506D-01 + 763.4000000 0.436754D-01 + 249.6000000 0.137653D+00 + 90.2800000 0.316644D+00 + 35.2900000 0.418581D+00 + 14.5100000 0.210212D+00 + 4.0530000 0.144952D-01 + 1.4820000 -0.203590D-02 + 0.2517000 0.624186D-03 +S 11 1.00 + 78860.0000000 -0.723177D-04 + 11820.0000000 -0.555116D-03 + 2692.0000000 -0.293805D-02 + 763.4000000 -0.117687D-01 + 249.6000000 -0.402907D-01 + 90.2800000 -0.100609D+00 + 35.2900000 -0.196528D+00 + 14.5100000 -0.102382D+00 + 4.0530000 0.527190D+00 + 1.4820000 0.593251D+00 + 0.2517000 0.332652D-01 +S 11 1.00 + 78860.0000000 0.185113D-04 + 11820.0000000 0.142236D-03 + 2692.0000000 0.752185D-03 + 763.4000000 0.302279D-02 + 249.6000000 0.103677D-01 + 90.2800000 0.262563D-01 + 35.2900000 0.523989D-01 + 14.5100000 0.290959D-01 + 4.0530000 -0.178003D+00 + 1.4820000 -0.346874D+00 + 0.2517000 0.623020D+00 +S 1 1.00 + 0.0924300 1.0000000 +P 7 1.00 + 315.9000000 0.392656D-02 + 74.4200000 0.298811D-01 + 23.4800000 0.127212D+00 + 8.4880000 0.320943D+00 + 3.2170000 0.455429D+00 + 1.2290000 0.268563D+00 + 0.2964000 0.188336D-01 +P 7 1.00 + 315.9000000 -0.858302D-03 + 74.4200000 -0.630328D-02 + 23.4800000 -0.288255D-01 + 8.4880000 -0.694560D-01 + 3.2170000 -0.119493D+00 + 1.2290000 -0.199581D-01 + 0.2964000 0.510268D+00 +P 1 1.00 + 0.0876800 1.0000000 +D 1 1.00 + 0.2750000 1.0000000 +**** +P 0 +S 11 1.00 + 94840.0000000 0.255509D-03 + 14220.0000000 0.198193D-02 + 3236.0000000 0.102760D-01 + 917.1000000 0.414823D-01 + 299.5000000 0.131984D+00 + 108.1000000 0.308662D+00 + 42.1800000 0.420647D+00 + 17.2800000 0.222878D+00 + 4.8580000 0.164035D-01 + 1.8180000 -0.254255D-02 + 0.3372000 0.748050D-03 +S 11 1.00 + 94840.0000000 -0.696939D-04 + 14220.0000000 -0.535266D-03 + 3236.0000000 -0.283709D-02 + 917.1000000 -0.113983D-01 + 299.5000000 -0.392929D-01 + 108.1000000 -0.996364D-01 + 42.1800000 -0.197983D+00 + 17.2800000 -0.114860D+00 + 4.8580000 0.518595D+00 + 1.8180000 0.601847D+00 + 0.3372000 0.368612D-01 +S 11 1.00 + 94840.0000000 0.191199D-04 + 14220.0000000 0.147223D-03 + 3236.0000000 0.777912D-03 + 917.1000000 0.314546D-02 + 299.5000000 0.108200D-01 + 108.1000000 0.279957D-01 + 42.1800000 0.563978D-01 + 17.2800000 0.358190D-01 + 4.8580000 -0.193387D+00 + 1.8180000 -0.372097D+00 + 0.3372000 0.624246D+00 +S 1 1.00 + 0.1232000 1.0000000 +P 7 1.00 + 370.5000000 0.395005D-02 + 87.3300000 0.302492D-01 + 27.5900000 0.129554D+00 + 10.0000000 0.327594D+00 + 3.8250000 0.456992D+00 + 1.4940000 0.253086D+00 + 0.3921000 0.168798D-01 +P 7 1.00 + 370.5000000 -0.959832D-03 + 87.3300000 -0.711177D-02 + 27.5900000 -0.327122D-01 + 10.0000000 -0.795784D-01 + 3.8250000 -0.135016D+00 + 1.4940000 -0.910585D-02 + 0.3921000 0.537802D+00 +P 1 1.00 + 0.1186000 1.0000000 +D 1 1.00 + 0.3730000 1.0000000 +**** +S 0 +S 11 1.00 + 110800.0000000 0.247635D-03 + 16610.0000000 0.192026D-02 + 3781.0000000 0.996192D-02 + 1071.0000000 0.402975D-01 + 349.8000000 0.128604D+00 + 126.3000000 0.303480D+00 + 49.2600000 0.421432D+00 + 20.1600000 0.230781D+00 + 5.7200000 0.178971D-01 + 2.1820000 -0.297516D-02 + 0.4327000 0.849522D-03 +S 11 1.00 + 110800.0000000 -0.687039D-04 + 16610.0000000 -0.527681D-03 + 3781.0000000 -0.279671D-02 + 1071.0000000 -0.112651D-01 + 349.8000000 -0.388834D-01 + 126.3000000 -0.995025D-01 + 49.2600000 -0.199740D+00 + 20.1600000 -0.123360D+00 + 5.7200000 0.513194D+00 + 2.1820000 0.607120D+00 + 0.4327000 0.396753D-01 +S 11 1.00 + 110800.0000000 0.199077D-04 + 16610.0000000 0.153483D-03 + 3781.0000000 0.809503D-03 + 1071.0000000 0.328974D-02 + 349.8000000 0.112967D-01 + 126.3000000 0.296385D-01 + 49.2600000 0.599851D-01 + 20.1600000 0.413248D-01 + 5.7200000 -0.207474D+00 + 2.1820000 -0.392889D+00 + 0.4327000 0.632840D+00 +S 1 1.00 + 0.1570000 1.0000000 +P 7 1.00 + 399.7000000 0.447541D-02 + 94.1900000 0.341708D-01 + 29.7500000 0.144250D+00 + 10.7700000 0.353928D+00 + 4.1190000 0.459085D+00 + 1.6250000 0.206383D+00 + 0.4726000 0.102141D-01 +P 7 1.00 + 399.7000000 -0.116251D-02 + 94.1900000 -0.865664D-02 + 29.7500000 -0.390886D-01 + 10.7700000 -0.934625D-01 + 4.1190000 -0.147994D+00 + 1.6250000 0.301904D-01 + 0.4726000 0.561573D+00 +P 1 1.00 + 0.1407000 1.0000000 +D 1 1.00 + 0.4790000 1.0000000 +**** +Cl 0 +S 11 1.00 + 127900.0000000 0.241153D-03 + 19170.0000000 0.187095D-02 + 4363.0000000 0.970827D-02 + 1236.0000000 0.393153D-01 + 403.6000000 0.125932D+00 + 145.7000000 0.299341D+00 + 56.8100000 0.421886D+00 + 23.2300000 0.237201D+00 + 6.6440000 0.191531D-01 + 2.5750000 -0.334792D-02 + 0.5371000 0.929883D-03 +S 11 1.00 + 127900.0000000 -0.678922D-04 + 19170.0000000 -0.521836D-03 + 4363.0000000 -0.276513D-02 + 1236.0000000 -0.111537D-01 + 403.6000000 -0.385919D-01 + 145.7000000 -0.994848D-01 + 56.8100000 -0.201392D+00 + 23.2300000 -0.130313D+00 + 6.6440000 0.509443D+00 + 2.5750000 0.610725D+00 + 0.5371000 0.421549D-01 +S 11 1.00 + 127900.0000000 0.204986D-04 + 19170.0000000 0.158298D-03 + 4363.0000000 0.833639D-03 + 1236.0000000 0.339880D-02 + 403.6000000 0.116738D-01 + 145.7000000 0.309622D-01 + 56.8100000 0.629533D-01 + 23.2300000 0.460257D-01 + 6.6440000 -0.219312D+00 + 2.5750000 -0.408773D+00 + 0.5371000 0.638465D+00 +S 1 1.00 + 0.1938000 1.0000000 +P 7 1.00 + 417.6000000 0.525982D-02 + 98.3300000 0.398332D-01 + 31.0400000 0.164655D+00 + 11.1900000 0.387322D+00 + 4.2490000 0.457072D+00 + 1.6240000 0.151636D+00 + 0.5322000 0.181615D-02 +P 7 1.00 + 417.6000000 -0.143570D-02 + 98.3300000 -0.107796D-01 + 31.0400000 -0.470075D-01 + 11.1900000 -0.111030D+00 + 4.2490000 -0.153275D+00 + 1.6240000 0.894609D-01 + 0.5322000 0.579444D+00 +P 1 1.00 + 0.1620000 1.0000000 +D 1 1.00 + 0.6000000 1.0000000 +**** +Ar 0 +S 11 1.00 + 145700.0000000 0.236700D-03 + 21840.0000000 0.183523D-02 + 4972.0000000 0.952860D-02 + 1408.0000000 0.386283D-01 + 459.7000000 0.124081D+00 + 165.9000000 0.296471D+00 + 64.6900000 0.422068D+00 + 26.4400000 0.241711D+00 + 7.6280000 0.200509D-01 + 2.9960000 -0.361000D-02 + 0.6504000 0.975607D-03 +S 11 1.00 + 145700.0000000 -0.674910D-04 + 21840.0000000 -0.518522D-03 + 4972.0000000 -0.274825D-02 + 1408.0000000 -0.111007D-01 + 459.7000000 -0.384820D-01 + 165.9000000 -0.997599D-01 + 64.6900000 -0.203088D+00 + 26.4400000 -0.135608D+00 + 7.6280000 0.507195D+00 + 2.9960000 0.612898D+00 + 0.6504000 0.442968D-01 +S 11 1.00 + 145700.0000000 0.210457D-04 + 21840.0000000 0.162565D-03 + 4972.0000000 0.855463D-03 + 1408.0000000 0.349745D-02 + 459.7000000 0.120156D-01 + 165.9000000 0.321368D-01 + 64.6900000 0.655279D-01 + 26.4400000 0.499370D-01 + 7.6280000 -0.229769D+00 + 2.9960000 -0.421006D+00 + 0.6504000 0.642331D+00 +S 1 1.00 + 0.2337000 1.0000000 +P 7 1.00 + 453.7000000 0.570555D-02 + 106.8000000 0.430460D-01 + 33.7300000 0.176591D+00 + 12.1300000 0.406863D+00 + 4.5940000 0.452549D+00 + 1.6780000 0.122801D+00 + 0.5909000 -0.445996D-02 +P 7 1.00 + 453.7000000 -0.160655D-02 + 106.8000000 -0.121714D-01 + 33.7300000 -0.520789D-01 + 12.1300000 -0.123737D+00 + 4.5940000 -0.151619D+00 + 1.6780000 0.142425D+00 + 0.5909000 0.584501D+00 +P 1 1.00 + 0.1852000 1.0000000 +D 1 1.00 + 0.7380000 1.0000000 +**** +Ca 0 +S 13 1.00 + 190000.7000000 0.00022145 + 28481.4600000 0.00171830 + 6482.7010000 0.00892348 + 1835.8910000 0.03630183 + 598.7243000 0.11762223 + 215.8841000 0.28604352 + 84.0124200 0.42260708 + 34.2248800 0.25774366 + 10.0249700 0.02391893 + 4.0559200 -0.00495218 + 1.0202610 0.00171779 + 0.4268650 -0.00089209 + 0.0633470 0.00024510 +S 13 1.00 + 190000.7000000 -0.00006453 + 28481.4600000 -0.00049662 + 6482.7010000 -0.00262826 + 1835.8910000 -0.01066845 + 598.7243000 -0.03713509 + 215.8841000 -0.09804284 + 84.0124200 -0.20342692 + 34.2248800 -0.15244655 + 10.0249700 0.48279406 + 4.0559200 0.62923839 + 1.0202610 0.06164842 + 0.4268650 -0.01479971 + 0.0633470 0.00361089 +S 13 1.00 + 190000.7000000 0.00002223 + 28481.4600000 0.00017170 + 6482.7010000 0.00090452 + 1835.8910000 0.00370343 + 598.7243000 0.01283750 + 215.8841000 0.03475459 + 84.0124200 0.07303491 + 34.2248800 0.06100083 + 10.0249700 -0.24292928 + 4.0559200 -0.48708500 + 1.0202610 0.56502804 + 0.4268650 0.65574386 + 0.0633470 0.02672894 +S 13 1.00 + 190000.7000000 0.00000531 + 28481.4600000 0.00004111 + 6482.7010000 0.00021568 + 1835.8910000 0.00088827 + 598.7243000 0.00305813 + 215.8841000 0.00837608 + 84.0124200 0.01741056 + 34.2248800 0.01515453 + 10.0249700 -0.06207919 + 4.0559200 -0.12611803 + 1.0202610 0.17360694 + 0.4268650 0.37822943 + 0.0633470 -0.65964698 +S 1 1.00 + 0.0263010 1.0000000 +P 10 1.00 + 1072.0430000 0.00198166 + 253.8439000 0.01612944 + 81.3162600 0.07657851 + 30.2418300 0.23269594 + 12.1011000 0.42445210 + 5.0225540 0.37326402 + 1.9092200 0.07868530 + 0.7713040 -0.00599927 + 0.3005700 0.00264257 + 0.0766490 -0.00085694 +P 10 1.00 + 1072.0430000 -0.00064891 + 253.8439000 -0.00527907 + 81.3162600 -0.02581131 + 30.2418300 -0.08062892 + 12.1011000 -0.15846552 + 5.0225540 -0.12816816 + 1.9092200 0.25610103 + 0.7713040 0.58724068 + 0.3005700 0.30372561 + 0.0766490 0.01416451 +P 10 1.00 + 1072.0430000 0.00013595 + 253.8439000 0.00109420 + 81.3162600 0.00542680 + 30.2418300 0.01674718 + 12.1011000 0.03389863 + 5.0225540 0.02531183 + 1.9092200 -0.05895713 + 0.7713040 -0.15876120 + 0.3005700 -0.08554523 + 0.0766490 0.54464665 +P 1 1.00 + 0.0277720 1.0000000 +D 4 1.00 + 10.3182000 0.03284900 + 2.5924200 0.14819200 + 0.7617000 0.31092100 + 0.2083800 0.45219500 +D 1 1.00 + 0.0537000 1.0000000 +**** +Sc 0 +S 19 1.00 + 2.715278E+06 8.147221E-06 + 4.065984E+05 6.334788E-05 + 9.253004E+04 3.330384E-04 + 2.620792E+04 1.404055E-03 + 8.549429E+03 5.081725E-03 + 3.085975E+03 1.626926E-02 + 1.203172E+03 4.624577E-02 + 4.984869E+02 1.137223E-01 + 2.167360E+02 2.257636E-01 + 9.787476E+01 3.106700E-01 + 4.520433E+01 2.191906E-01 + 2.021187E+01 7.215879E-02 + 9.574751E+00 1.187030E-01 + 4.540346E+00 1.220532E-01 + 1.995687E+00 2.136795E-02 + 9.422150E-01 -5.357246E-04 + 4.178450E-01 2.435774E-04 + 9.576100E-02 -8.796617E-05 + 5.135100E-02 7.878246E-05 +S 19 1.00 + 2.715278E+06 -4.722109E-06 + 4.065984E+05 -3.671829E-05 + 9.253004E+04 -1.930883E-04 + 2.620792E+04 -8.146870E-04 + 8.549429E+03 -2.955526E-03 + 3.085975E+03 -9.520035E-03 + 1.203172E+03 -2.746858E-02 + 4.984869E+02 -6.991528E-02 + 2.167360E+02 -1.499251E-01 + 9.787476E+01 -2.459153E-01 + 4.520433E+01 -2.401293E-01 + 2.021187E+01 3.567987E-02 + 9.574751E+00 4.915023E-01 + 4.540346E+00 4.911381E-01 + 1.995687E+00 9.120633E-02 + 9.422150E-01 -5.356723E-03 + 4.178450E-01 8.812836E-04 + 9.576100E-02 -7.605536E-04 + 5.135100E-02 6.340116E-04 +S 19 1.00 + 2.715278E+06 9.139905E-07 + 4.065984E+05 7.108513E-06 + 9.253004E+04 3.738126E-05 + 2.620792E+04 1.578828E-04 + 8.549429E+03 5.737686E-04 + 3.085975E+03 1.859244E-03 + 1.203172E+03 5.433182E-03 + 4.984869E+02 1.425387E-02 + 2.167360E+02 3.246144E-02 + 9.787476E+01 6.003454E-02 + 4.520433E+01 6.916105E-02 + 2.021187E+01 -2.113084E-02 + 9.574751E+00 -2.666832E-01 + 4.540346E+00 -4.367591E-01 + 1.995687E+00 6.498243E-02 + 9.422150E-01 7.009599E-01 + 4.178450E-01 4.515562E-01 + 9.576100E-02 3.011910E-02 + 5.135100E-02 -1.329480E-02 +S 19 1.00 + 2.715278E+06 -2.201951E-07 + 4.065984E+05 -1.711419E-06 + 9.253004E+04 -9.008469E-06 + 2.620792E+04 -3.799997E-05 + 8.549429E+03 -1.383227E-04 + 3.085975E+03 -4.473692E-04 + 1.203172E+03 -1.310691E-03 + 4.984869E+02 -3.429860E-03 + 2.167360E+02 -7.847579E-03 + 9.787476E+01 -1.447189E-02 + 4.520433E+01 -1.690669E-02 + 2.021187E+01 5.396115E-03 + 9.574751E+00 6.671062E-02 + 4.540346E+00 1.178356E-01 + 1.995687E+00 -2.738134E-02 + 9.422150E-01 -2.260149E-01 + 4.178450E-01 -3.073539E-01 + 9.576100E-02 2.544054E-01 + 5.135100E-02 5.981590E-01 +S 19 1.00 + 2.715278E+06 -3.757238E-07 + 4.065984E+05 -2.981907E-06 + 9.253004E+04 -1.522586E-05 + 2.620792E+04 -6.684686E-05 + 8.549429E+03 -2.313129E-04 + 3.085975E+03 -7.959729E-04 + 1.203172E+03 -2.161961E-03 + 4.984869E+02 -6.206459E-03 + 2.167360E+02 -1.261905E-02 + 9.787476E+01 -2.739459E-02 + 4.520433E+01 -2.336516E-02 + 2.021187E+01 -5.734627E-03 + 9.574751E+00 1.536025E-01 + 4.540346E+00 1.447100E-01 + 1.995687E+00 9.359699E-02 + 9.422150E-01 -8.687730E-01 + 4.178450E-01 2.114597E-02 + 9.576100E-02 2.275498E+00 + 5.135100E-02 -1.190770E+00 +S 1 1.00 + 2.387800E-02 1.0000000 +P 15 1.00 + 1.059219E+04 4.500000E-05 + 2.507533E+03 4.010000E-04 + 8.144571E+02 2.302000E-03 + 3.115195E+02 1.003700E-02 + 1.319617E+02 3.495400E-02 + 5.998718E+01 9.790900E-02 + 2.866250E+01 2.106800E-01 + 1.410851E+01 3.300930E-01 + 7.103706E+00 3.310270E-01 + 3.609200E+00 1.579600E-01 + 1.776070E+00 2.209900E-02 + 8.547600E-01 -1.605000E-03 + 4.022390E-01 -1.326000E-03 + 1.546650E-01 -2.800000E-04 + 6.494500E-02 3.400000E-05 +P 15 1.00 + 1.059219E+04 -1.500000E-05 + 2.507533E+03 -1.310000E-04 + 8.144571E+02 -7.570000E-04 + 3.115195E+02 -3.318000E-03 + 1.319617E+02 -1.170600E-02 + 5.998718E+01 -3.360400E-02 + 2.866250E+01 -7.487900E-02 + 1.410851E+01 -1.225480E-01 + 7.103706E+00 -1.302760E-01 + 3.609200E+00 1.459600E-02 + 1.776070E+00 3.091840E-01 + 8.547600E-01 4.629980E-01 + 4.022390E-01 3.049570E-01 + 1.546650E-01 5.087800E-02 + 6.494500E-02 -4.493000E-03 +P 15 1.00 + 1.059219E+04 -4.000000E-06 + 2.507533E+03 -3.200000E-05 + 8.144571E+02 -1.850000E-04 + 3.115195E+02 -8.080000E-04 + 1.319617E+02 -2.870000E-03 + 5.998718E+01 -8.207000E-03 + 2.866250E+01 -1.847300E-02 + 1.410851E+01 -3.010100E-02 + 7.103706E+00 -3.294300E-02 + 3.609200E+00 7.958000E-03 + 1.776070E+00 8.799300E-02 + 8.547600E-01 1.523770E-01 + 4.022390E-01 9.717000E-02 + 1.546650E-01 -2.569380E-01 + 6.494500E-02 -5.878150E-01 +P 15 1.00 + 1.059219E+04 4.000000E-06 + 2.507533E+03 3.900000E-05 + 8.144571E+02 2.210000E-04 + 3.115195E+02 9.840000E-04 + 1.319617E+02 3.423000E-03 + 5.998718E+01 9.993000E-03 + 2.866250E+01 2.191600E-02 + 1.410851E+01 3.700800E-02 + 7.103706E+00 3.779400E-02 + 3.609200E+00 -4.379000E-03 + 1.776070E+00 -1.101640E-01 + 8.547600E-01 -1.610170E-01 + 4.022390E-01 -1.824820E-01 + 1.546650E-01 3.886110E-01 + 6.494500E-02 6.911000E-01 +P 1 1.00 + 2.635900E-02 1.0000000 +D 7 1.00 + 5.051380E+01 4.266000E-03 + 1.474050E+01 2.770800E-02 + 5.195000E+00 1.000010E-01 + 2.028460E+00 2.315810E-01 + 8.040860E-01 3.460330E-01 + 3.076890E-01 3.733740E-01 + 1.113920E-01 2.642880E-01 +D 7 1.00 + 5.051380E+01 -4.389000E-03 + 1.474050E+01 -2.836300E-02 + 5.195000E+00 -1.051370E-01 + 2.028460E+00 -2.348540E-01 + 8.040860E-01 -3.246090E-01 + 3.076890E-01 -6.428900E-02 + 1.113920E-01 6.017490E-01 +D 1 1.00 + 3.735200E-02 1.0000000 +F 2 1.00 + 7.126000E-01 3.617450E-01 + 1.636000E-01 8.218680E-01 +**** +Ti 0 +S 19 1.00 + 3.014643E+06 8.060782E-06 + 4.514329E+05 6.267518E-05 + 1.027338E+05 3.295006E-04 + 2.909817E+04 1.389203E-03 + 9.492330E+03 5.028469E-03 + 3.426346E+03 1.610419E-02 + 1.335896E+03 4.581232E-02 + 5.535026E+02 1.128613E-01 + 2.406925E+02 2.248193E-01 + 1.087293E+02 3.114571E-01 + 5.026457E+01 2.224995E-01 + 2.258004E+01 7.293128E-02 + 1.071432E+01 1.160683E-01 + 5.093546E+00 1.194774E-01 + 2.244183E+00 2.097868E-02 + 1.059570E+00 -5.091715E-04 + 4.688490E-01 2.217859E-04 + 1.061430E-01 -7.636896E-05 + 5.526200E-02 7.719539E-05 +S 19 1.00 + 3.014643E+06 -4.630486E-06 + 4.514329E+05 -3.600451E-05 + 1.027338E+05 -1.893420E-04 + 2.909817E+04 -7.988781E-04 + 9.492330E+03 -2.898698E-03 + 3.426346E+03 -9.339701E-03 + 1.335896E+03 -2.697464E-02 + 5.535026E+02 -6.878913E-02 + 2.406925E+02 -1.481037E-01 + 1.087293E+02 -2.445253E-01 + 5.026457E+01 -2.419916E-01 + 2.258004E+01 3.183790E-02 + 1.071432E+01 4.932686E-01 + 5.093546E+00 4.939655E-01 + 2.244183E+00 9.196313E-02 + 1.059570E+00 -5.316992E-03 + 4.688490E-01 8.085624E-04 + 1.061430E-01 -6.918459E-04 + 5.526200E-02 6.086512E-04 +S 19 1.00 + 3.014643E+06 9.230559E-07 + 4.514329E+05 7.178974E-06 + 1.027338E+05 3.775134E-05 + 2.909817E+04 1.594532E-04 + 9.492330E+03 5.795150E-04 + 3.426346E+03 1.878414E-03 + 1.335896E+03 5.492747E-03 + 5.535026E+02 1.443297E-02 + 2.406925E+02 3.296408E-02 + 1.087293E+02 6.125493E-02 + 5.026457E+01 7.134113E-02 + 2.258004E+01 -1.973150E-02 + 1.071432E+01 -2.741869E-01 + 5.093546E+00 -4.440977E-01 + 2.244183E+00 7.776084E-02 + 1.059570E+00 7.068444E-01 + 4.688490E-01 4.413892E-01 + 1.061430E-01 2.799769E-02 + 5.526200E-02 -1.210790E-02 +S 19 1.00 + 3.014643E+06 -2.180323E-07 + 4.514329E+05 -1.694860E-06 + 1.027338E+05 -8.919208E-06 + 2.909817E+04 -3.763633E-05 + 9.492330E+03 -1.369575E-04 + 3.426346E+03 -4.432894E-04 + 1.335896E+03 -1.298868E-03 + 5.535026E+02 -3.406752E-03 + 2.406925E+02 -7.810829E-03 + 1.087293E+02 -1.449245E-02 + 5.026457E+01 -1.708136E-02 + 2.258004E+01 4.897666E-03 + 1.071432E+01 6.753108E-02 + 5.093546E+00 1.173318E-01 + 2.244183E+00 -2.985025E-02 + 1.059570E+00 -2.277634E-01 + 4.688490E-01 -2.928115E-01 + 1.061430E-01 2.665300E-01 + 5.526200E-02 5.912406E-01 +S 19 1.00 + 3.014643E+06 -3.975126E-07 + 4.514329E+05 -3.161080E-06 + 1.027338E+05 -1.609375E-05 + 2.909817E+04 -7.092947E-05 + 9.492330E+03 -2.442710E-04 + 3.426346E+03 -8.457892E-04 + 1.335896E+03 -2.282208E-03 + 5.535026E+02 -6.619873E-03 + 2.406925E+02 -1.335024E-02 + 1.087293E+02 -2.955830E-02 + 5.026457E+01 -2.477039E-02 + 2.258004E+01 -8.414624E-03 + 1.071432E+01 1.693855E-01 + 5.093546E+00 1.500787E-01 + 2.244183E+00 9.787777E-02 + 1.059570E+00 -9.653608E-01 + 4.688490E-01 1.489721E-01 + 1.061430E-01 2.191179E+00 + 5.526200E-02 -1.243325E+00 +S 1 1.00 + 2.546500E-02 1.0000000 +P 15 1.00 + 1.191203E+04 4.400000E-05 + 2.819947E+03 3.910000E-04 + 9.159479E+02 2.248000E-03 + 3.503842E+02 9.823000E-03 + 1.484825E+02 3.433800E-02 + 6.753944E+01 9.666600E-02 + 3.230332E+01 2.094170E-01 + 1.592786E+01 3.301890E-01 + 8.038035E+00 3.319360E-01 + 4.093916E+00 1.584880E-01 + 2.022390E+00 2.231000E-02 + 9.761020E-01 -1.566000E-03 + 4.595950E-01 -1.324000E-03 + 1.771520E-01 -2.710000E-04 + 7.351700E-02 3.200000E-05 +P 15 1.00 + 1.191203E+04 -1.500000E-05 + 2.819947E+03 -1.310000E-04 + 9.159479E+02 -7.550000E-04 + 3.503842E+02 -3.319000E-03 + 1.484825E+02 -1.175000E-02 + 6.753944E+01 -3.392200E-02 + 3.230332E+01 -7.616400E-02 + 1.592786E+01 -1.257020E-01 + 8.038035E+00 -1.330980E-01 + 4.093916E+00 1.740600E-02 + 2.022390E+00 3.151650E-01 + 9.761020E-01 4.618140E-01 + 4.595950E-01 2.998560E-01 + 1.771520E-01 5.000000E-02 + 7.351700E-02 -4.230000E-03 +P 15 1.00 + 1.191203E+04 4.000000E-06 + 2.819947E+03 3.100000E-05 + 9.159479E+02 1.820000E-04 + 3.503842E+02 7.950000E-04 + 1.484825E+02 2.833000E-03 + 6.753944E+01 8.154000E-03 + 3.230332E+01 1.847200E-02 + 1.592786E+01 3.040000E-02 + 8.038035E+00 3.304700E-02 + 4.093916E+00 -8.251000E-03 + 2.022390E+00 -8.855400E-02 + 9.761020E-01 -1.496120E-01 + 4.595950E-01 -9.422700E-02 + 1.771520E-01 2.508460E-01 + 7.351700E-02 5.866430E-01 +P 15 1.00 + 1.191203E+04 4.000000E-06 + 2.819947E+03 3.900000E-05 + 9.159479E+02 2.230000E-04 + 3.503842E+02 9.920000E-04 + 1.484825E+02 3.476000E-03 + 6.753944E+01 1.017200E-02 + 3.230332E+01 2.257600E-02 + 1.592786E+01 3.823800E-02 + 8.038035E+00 3.933700E-02 + 4.093916E+00 -6.106000E-03 + 2.022390E+00 -1.129620E-01 + 9.761020E-01 -1.681140E-01 + 4.595950E-01 -1.659320E-01 + 1.771520E-01 3.914030E-01 + 7.351700E-02 6.818400E-01 +P 1 1.00 + 2.940100E-02 1.0000000 +D 7 1.00 + 6.401300E+01 3.887000E-03 + 1.881790E+01 2.639900E-02 + 6.728700E+00 9.751100E-02 + 2.664130E+00 2.328480E-01 + 1.078680E+00 3.531520E-01 + 4.232090E-01 3.721860E-01 + 1.559990E-01 2.476720E-01 +D 7 1.00 + 6.401300E+01 -3.970000E-03 + 1.881790E+01 -2.687300E-02 + 6.728700E+00 -1.022750E-01 + 2.664130E+00 -2.377280E-01 + 1.078680E+00 -3.121140E-01 + 4.232090E-01 -4.237800E-02 + 1.559990E-01 5.886580E-01 +D 1 1.00 + 5.188400E-02 1.0000000 +F 2 1.00 + 1.227400E+00 3.581580E-01 + 2.788000E-01 8.257940E-01 +**** +V 0 +S 19 1.00 + 3.321857E+06 8.039999E-06 + 4.974356E+05 6.251402E-05 + 1.132027E+05 3.286553E-04 + 3.206333E+04 1.385697E-03 + 1.045962E+04 5.016217E-03 + 3.775506E+03 1.606931E-02 + 1.472040E+03 4.574242E-02 + 6.099331E+02 1.128544E-01 + 2.652634E+02 2.254344E-01 + 1.198607E+02 3.140461E-01 + 5.544891E+01 2.267819E-01 + 2.498372E+01 7.334069E-02 + 1.188056E+01 1.102474E-01 + 5.660311E+00 1.131358E-01 + 2.495703E+00 1.971295E-02 + 1.177866E+00 -4.719088E-04 + 5.200440E-01 1.861606E-04 + 1.159650E-01 -6.208598E-05 + 5.893800E-02 7.295314E-05 +S 19 1.00 + 3.321857E+06 -4.503003E-06 + 4.974356E+05 -3.501295E-05 + 1.132027E+05 -1.841339E-04 + 3.206333E+04 -7.769216E-04 + 1.045962E+04 -2.819505E-03 + 3.775506E+03 -9.087486E-03 + 1.472040E+03 -2.627134E-02 + 6.099331E+02 -6.712726E-02 + 2.652634E+02 -1.451130E-01 + 1.198607E+02 -2.412483E-01 + 5.544891E+01 -2.416314E-01 + 2.498372E+01 3.067362E-02 + 1.188056E+01 4.970415E-01 + 5.660311E+00 4.958875E-01 + 2.495703E+00 9.181868E-02 + 1.177866E+00 -5.392514E-03 + 5.200440E-01 7.102380E-04 + 1.159650E-01 -6.363128E-04 + 5.893800E-02 5.979932E-04 +S 19 1.00 + 3.321857E+06 9.320648E-07 + 4.974356E+05 7.249306E-06 + 1.132027E+05 3.811967E-05 + 3.206333E+04 1.610238E-04 + 1.045962E+04 5.852210E-04 + 3.775506E+03 1.897502E-03 + 1.472040E+03 5.550909E-03 + 6.099331E+02 1.460584E-02 + 2.652634E+02 3.342974E-02 + 1.198607E+02 6.235722E-02 + 5.544891E+01 7.312435E-02 + 2.498372E+01 -1.911472E-02 + 1.188056E+01 -2.817249E-01 + 5.660311E+00 -4.488151E-01 + 2.495703E+00 9.202696E-02 + 1.177866E+00 7.110117E-01 + 5.200440E-01 4.309274E-01 + 1.159650E-01 2.604589E-02 + 5.893800E-02 -1.101049E-02 +S 19 1.00 + 3.321857E+06 -2.158944E-07 + 4.974356E+05 -1.678519E-06 + 1.132027E+05 -8.831213E-06 + 3.206333E+04 -3.727769E-05 + 1.045962E+04 -1.356099E-04 + 3.775506E+03 -4.392351E-04 + 1.472040E+03 -1.286948E-03 + 6.099331E+02 -3.382149E-03 + 2.652634E+02 -7.765646E-03 + 1.198607E+02 -1.447985E-02 + 5.544891E+01 -1.715502E-02 + 2.498372E+01 4.610101E-03 + 1.188056E+01 6.827831E-02 + 5.660311E+00 1.161368E-01 + 2.495703E+00 -3.277049E-02 + 1.177866E+00 -2.280000E-01 + 5.200440E-01 -2.793991E-01 + 1.159650E-01 2.771165E-01 + 5.893800E-02 5.852999E-01 +S 19 1.00 + 3.321857E+06 -4.093416E-07 + 4.974356E+05 -3.258956E-06 + 1.132027E+05 -1.656390E-05 + 3.206333E+04 -7.316689E-05 + 1.045962E+04 -2.512784E-04 + 3.775506E+03 -8.732657E-04 + 1.472040E+03 -2.347654E-03 + 6.099331E+02 -6.853150E-03 + 2.652634E+02 -1.376420E-02 + 1.198607E+02 -3.084679E-02 + 5.544891E+01 -2.562208E-02 + 2.498372E+01 -1.005123E-02 + 1.188056E+01 1.795330E-01 + 5.660311E+00 1.522400E-01 + 2.495703E+00 9.483887E-02 + 1.177866E+00 -1.014876E+00 + 5.200440E-01 2.308810E-01 + 1.159650E-01 2.113321E+00 + 5.893800E-02 -1.253048E+00 +S 1 1.00 + 2.694600E-02 1.0000000 +P 15 1.00 + 1.327320E+04 4.300000E-05 + 3.142126E+03 3.840000E-04 + 1.020588E+03 2.210000E-03 + 3.904407E+02 9.678000E-03 + 1.655043E+02 3.393600E-02 + 7.532006E+01 9.591700E-02 + 3.605503E+01 2.088530E-01 + 1.780436E+01 3.306600E-01 + 9.002929E+00 3.323120E-01 + 4.594544E+00 1.581880E-01 + 2.276760E+00 2.225200E-02 + 1.101178E+00 -1.565000E-03 + 5.186380E-01 -1.353000E-03 + 2.005650E-01 -2.650000E-04 + 8.129100E-02 2.900000E-05 +P 15 1.00 + 1.327320E+04 -1.500000E-05 + 3.142126E+03 -1.310000E-04 + 1.020588E+03 -7.550000E-04 + 3.904407E+02 -3.325000E-03 + 1.655043E+02 -1.181100E-02 + 7.532006E+01 -3.425600E-02 + 3.605503E+01 -7.736300E-02 + 1.780436E+01 -1.284560E-01 + 9.002929E+00 -1.350780E-01 + 4.594544E+00 2.083800E-02 + 2.276760E+00 3.204990E-01 + 1.101178E+00 4.602600E-01 + 5.186380E-01 2.953460E-01 + 2.005650E-01 4.904600E-02 + 8.129100E-02 -3.824000E-03 +P 15 1.00 + 1.327320E+04 4.000000E-06 + 3.142126E+03 3.200000E-05 + 1.020588E+03 1.830000E-04 + 3.904407E+02 8.020000E-04 + 1.655043E+02 2.862000E-03 + 7.532006E+01 8.287000E-03 + 3.605503E+01 1.887000E-02 + 1.780436E+01 3.130700E-02 + 9.002929E+00 3.366000E-02 + 4.594544E+00 -9.479000E-03 + 2.276760E+00 -9.231300E-02 + 1.101178E+00 -1.489890E-01 + 5.186380E-01 -8.364400E-02 + 2.005650E-01 2.493390E-01 + 8.129100E-02 5.805150E-01 +P 15 1.00 + 1.327320E+04 4.000000E-06 + 3.142126E+03 3.900000E-05 + 1.020588E+03 2.230000E-04 + 3.904407E+02 9.960000E-04 + 1.655043E+02 3.498000E-03 + 7.532006E+01 1.029600E-02 + 3.605503E+01 2.296200E-02 + 1.780436E+01 3.920800E-02 + 9.002929E+00 3.994300E-02 + 4.594544E+00 -7.121000E-03 + 2.276760E+00 -1.162250E-01 + 1.101178E+00 -1.694960E-01 + 5.186380E-01 -1.553740E-01 + 2.005650E-01 3.950220E-01 + 8.129100E-02 6.789080E-01 +P 1 1.00 + 3.179500E-02 1.0000000 +D 7 1.00 + 7.761150E+01 3.595000E-03 + 2.291590E+01 2.521000E-02 + 8.279540E+00 9.478600E-02 + 3.309930E+00 2.303630E-01 + 1.358630E+00 3.528940E-01 + 5.413500E-01 3.704140E-01 + 2.023560E-01 2.457180E-01 +D 7 1.00 + 7.761150E+01 -3.818000E-03 + 2.291590E+01 -2.671700E-02 + 8.279540E+00 -1.036900E-01 + 3.309930E+00 -2.476890E-01 + 1.358630E+00 -3.115230E-01 + 5.413500E-01 -2.282700E-02 + 2.023560E-01 5.697260E-01 +D 1 1.00 + 6.756800E-02 1.0000000 +F 2 1.00 + 1.748800E+00 3.900680E-01 + 4.057000E-01 8.008410E-01 +**** +Cr 0 +S 19 1.00 + 6.177194E+06 4.128667E-06 + 9.249295E+05 3.210767E-05 + 2.104865E+05 1.688416E-04 + 5.962005E+04 7.128520E-04 + 1.945076E+04 2.589325E-03 + 7.022056E+03 8.377350E-03 + 2.738763E+03 2.441725E-02 + 1.135814E+03 6.365135E-02 + 4.950923E+02 1.427618E-01 + 2.247487E+02 2.541275E-01 + 1.053836E+02 3.009512E-01 + 5.019359E+01 1.766513E-01 + 2.224957E+01 6.936709E-02 + 1.098265E+01 1.179579E-01 + 5.383665E+00 8.916187E-02 + 2.343685E+00 1.103630E-02 + 1.105202E+00 -3.546048E-04 + 4.878480E-01 1.057311E-04 + 8.959900E-02 1.114640E-05 +S 19 1.00 + 6.177194E+06 -2.301772E-06 + 9.249295E+05 -1.789536E-05 + 2.104865E+05 -9.416174E-05 + 5.962005E+04 -3.975074E-04 + 1.945076E+04 -1.447025E-03 + 7.022056E+03 -4.694622E-03 + 2.738763E+03 -1.382387E-02 + 1.135814E+03 -3.674643E-02 + 4.950923E+02 -8.647185E-02 + 2.247487E+02 -1.696735E-01 + 1.053836E+02 -2.507089E-01 + 5.019359E+01 -1.961156E-01 + 2.224957E+01 1.457244E-01 + 1.098265E+01 5.466706E-01 + 5.383665E+00 3.979434E-01 + 2.343685E+00 5.277007E-02 + 1.105202E+00 -4.374537E-03 + 4.878480E-01 3.204035E-04 + 8.959900E-02 -5.142077E-05 +S 19 1.00 + 6.177194E+06 4.862957E-07 + 9.249295E+05 3.776645E-06 + 2.104865E+05 1.990664E-05 + 5.962005E+04 8.389164E-05 + 1.945076E+04 3.065706E-04 + 7.022056E+03 9.944107E-04 + 2.738763E+03 2.961959E-03 + 1.135814E+03 7.969473E-03 + 4.950923E+02 1.955017E-02 + 2.247487E+02 4.085035E-02 + 1.053836E+02 6.929003E-02 + 5.019359E+01 6.146984E-02 + 2.224957E+01 -6.981302E-02 + 1.098265E+01 -3.517597E-01 + 5.383665E+00 -3.828629E-01 + 2.343685E+00 2.676401E-01 + 1.105202E+00 7.175950E-01 + 4.878480E-01 3.020814E-01 + 8.959900E-02 7.749514E-03 +S 19 1.00 + 6.177194E+06 -1.102451E-07 + 9.249295E+05 -8.530233E-07 + 2.104865E+05 -4.520358E-06 + 5.962005E+04 -1.891612E-05 + 1.945076E+04 -6.974344E-05 + 7.022056E+03 -2.237867E-04 + 2.738763E+03 -6.754503E-04 + 1.135814E+03 -1.789346E-03 + 4.950923E+02 -4.477858E-03 + 2.247487E+02 -9.140144E-03 + 1.053836E+02 -1.610562E-02 + 5.019359E+01 -1.334870E-02 + 2.224957E+01 1.426027E-02 + 1.098265E+01 8.931690E-02 + 5.383665E+00 8.885279E-02 + 2.343685E+00 -6.368776E-02 + 1.105202E+00 -2.783262E-01 + 4.878480E-01 -1.830071E-01 + 8.959900E-02 6.790937E-01 +S 19 1.00 + 6.177194E+06 2.179893E-07 + 9.249295E+05 1.612940E-06 + 2.104865E+05 9.111842E-06 + 5.962005E+04 3.500645E-05 + 1.945076E+04 1.435315E-04 + 7.022056E+03 4.035896E-04 + 2.738763E+03 1.425177E-03 + 1.135814E+03 3.114009E-03 + 4.950923E+02 9.814449E-03 + 2.247487E+02 1.474698E-02 + 1.053836E+02 3.911512E-02 + 5.019359E+01 9.170888E-03 + 2.224957E+01 1.559878E-02 + 1.098265E+01 -2.816844E-01 + 5.383665E+00 -6.895261E-03 + 2.343685E+00 -1.769781E-01 + 1.105202E+00 1.443061E+00 + 4.878480E-01 -1.029318E+00 + 8.959900E-02 -1.307667E+00 +S 1 1.00 + 3.342300E-02 1.0000000 +P 15 1.00 + 1.445420E+04 4.400000E-05 + 3.421676E+03 3.890000E-04 + 1.111387E+03 2.241000E-03 + 4.251918E+02 9.821000E-03 + 1.802623E+02 3.447100E-02 + 8.206117E+01 9.746000E-02 + 3.929726E+01 2.119850E-01 + 1.941959E+01 3.339900E-01 + 9.828899E+00 3.301370E-01 + 5.016810E+00 1.522270E-01 + 2.487091E+00 2.042500E-02 + 1.198780E+00 -1.360000E-03 + 5.586950E-01 -1.195000E-03 + 2.089240E-01 -1.970000E-04 + 8.460800E-02 2.300000E-05 +P 15 1.00 + 1.445420E+04 -1.500000E-05 + 3.421676E+03 -1.350000E-04 + 1.111387E+03 -7.770000E-04 + 4.251918E+02 -3.427000E-03 + 1.802623E+02 -1.218900E-02 + 8.206117E+01 -3.538800E-02 + 3.929726E+01 -7.991500E-02 + 1.941959E+01 -1.323350E-01 + 9.828899E+00 -1.354010E-01 + 5.016810E+00 3.200800E-02 + 2.487091E+00 3.338490E-01 + 1.198780E+00 4.617730E-01 + 5.586950E-01 2.812900E-01 + 2.089240E-01 4.184300E-02 + 8.460800E-02 -4.002000E-03 +P 15 1.00 + 1.445420E+04 4.000000E-06 + 3.421676E+03 3.200000E-05 + 1.111387E+03 1.850000E-04 + 4.251918E+02 8.100000E-04 + 1.802623E+02 2.906000E-03 + 8.206117E+01 8.391000E-03 + 3.929726E+01 1.919300E-02 + 1.941959E+01 3.156400E-02 + 9.828899E+00 3.341700E-02 + 5.016810E+00 -1.290700E-02 + 2.487091E+00 -9.365900E-02 + 1.198780E+00 -1.499770E-01 + 5.586950E-01 -6.723400E-02 + 2.089240E-01 2.707590E-01 + 8.460800E-02 5.758070E-01 +P 15 1.00 + 1.445420E+04 4.000000E-06 + 3.421676E+03 4.000000E-05 + 1.111387E+03 2.290000E-04 + 4.251918E+02 1.019000E-03 + 1.802623E+02 3.602000E-03 + 8.206117E+01 1.055000E-02 + 3.929726E+01 2.370200E-02 + 1.941959E+01 3.998800E-02 + 9.828899E+00 4.043700E-02 + 5.016810E+00 -1.207400E-02 + 2.487091E+00 -1.189390E-01 + 1.198780E+00 -1.781000E-01 + 5.586950E-01 -1.238650E-01 + 2.089240E-01 4.297220E-01 + 8.460800E-02 6.507860E-01 +P 1 1.00 + 3.325800E-02 1.0000000 +D 7 1.00 + 8.857680E+01 3.621000E-03 + 2.620450E+01 2.576600E-02 + 9.517470E+00 9.755600E-02 + 3.822480E+00 2.363120E-01 + 1.575120E+00 3.582860E-01 + 6.289280E-01 3.685430E-01 + 2.344240E-01 2.354940E-01 +D 7 1.00 + 8.857680E+01 -4.122000E-03 + 2.620450E+01 -2.930700E-02 + 9.517470E+00 -1.150620E-01 + 3.822480E+00 -2.730680E-01 + 1.575120E+00 -3.144230E-01 + 6.289280E-01 4.209700E-02 + 2.344240E-01 5.914030E-01 +D 1 1.00 + 7.681500E-02 1.0000000 +F 2 1.00 + 2.221100E+00 4.235450E-01 + 5.231000E-01 7.741140E-01 +**** +Mn 0 +S 19 1.00 + 3.960805E+06 8.242127E-06 + 5.931155E+05 6.408587E-05 + 1.349768E+05 3.369253E-04 + 3.823067E+04 1.420648E-03 + 1.247154E+04 5.143683E-03 + 4.501743E+03 1.648569E-02 + 1.755212E+03 4.698560E-02 + 7.273039E+02 1.162437E-01 + 3.163678E+02 2.335277E-01 + 1.430098E+02 3.292837E-01 + 6.621805E+01 2.440304E-01 + 2.991896E+01 7.219806E-02 + 1.430318E+01 7.687806E-02 + 6.839451E+00 7.852235E-02 + 3.012374E+00 1.294109E-02 + 1.418808E+00 -3.784873E-04 + 6.236240E-01 -2.503203E-05 + 1.340980E-01 -2.421517E-05 + 6.554800E-02 3.462071E-05 +S 19 1.00 + 3.960805E+06 -3.936095E-06 + 5.931155E+05 -3.060481E-05 + 1.349768E+05 -1.609626E-04 + 3.823067E+04 -6.792348E-04 + 1.247154E+04 -2.466182E-03 + 4.501743E+03 -7.957629E-03 + 1.755212E+03 -2.307248E-02 + 7.273039E+02 -5.932956E-02 + 3.163678E+02 -1.299451E-01 + 1.430098E+02 -2.212352E-01 + 6.621805E+01 -2.292550E-01 + 2.991896E+01 3.580733E-02 + 1.430318E+01 5.107602E-01 + 6.839451E+00 5.008307E-01 + 3.012374E+00 9.011830E-02 + 1.418808E+00 -6.909909E-03 + 6.236240E-01 -1.912925E-04 + 1.340980E-01 -6.032312E-04 + 6.554800E-02 5.621608E-04 +S 19 1.00 + 3.960805E+06 9.462709E-07 + 5.931155E+05 7.360584E-06 + 1.349768E+05 3.869935E-05 + 3.823067E+04 1.635110E-04 + 1.247154E+04 5.941775E-04 + 4.501743E+03 1.927737E-03 + 1.755212E+03 5.641731E-03 + 7.273039E+02 1.487848E-02 + 3.163678E+02 3.414783E-02 + 1.430098E+02 6.405794E-02 + 6.621805E+01 7.557659E-02 + 2.991896E+01 -1.946070E-02 + 1.430318E+01 -2.957874E-01 + 6.839451E+00 -4.521170E-01 + 3.012374E+00 1.224531E-01 + 1.418808E+00 7.169756E-01 + 6.236240E-01 4.092712E-01 + 1.340980E-01 2.221969E-02 + 6.554800E-02 -9.011202E-03 +S 19 1.00 + 3.960805E+06 -2.095391E-07 + 5.931155E+05 -1.629439E-06 + 1.349768E+05 -8.570592E-06 + 3.823067E+04 -3.619272E-05 + 1.247154E+04 -1.316146E-04 + 4.501743E+03 -4.266810E-04 + 1.755212E+03 -1.250270E-03 + 7.273039E+02 -3.294665E-03 + 3.163678E+02 -7.581860E-03 + 1.430098E+02 -1.422864E-02 + 6.621805E+01 -1.693796E-02 + 2.991896E+01 4.454298E-03 + 1.430318E+01 6.867042E-02 + 6.839451E+00 1.113335E-01 + 3.012374E+00 -3.900820E-02 + 1.418808E+00 -2.215755E-01 + 6.236240E-01 -2.544359E-01 + 1.340980E-01 2.865866E-01 + 6.554800E-02 5.755741E-01 +S 19 1.00 + 3.960805E+06 -4.121231E-07 + 5.931155E+05 -3.282099E-06 + 1.349768E+05 -1.667433E-05 + 3.823067E+04 -7.369999E-05 + 1.247154E+04 -2.529495E-04 + 4.501743E+03 -8.801425E-04 + 1.755212E+03 -2.365482E-03 + 7.273039E+02 -6.926354E-03 + 3.163678E+02 -1.393851E-02 + 1.430098E+02 -3.143840E-02 + 6.621805E+01 -2.625749E-02 + 2.991896E+01 -1.048313E-02 + 1.430318E+01 1.856472E-01 + 6.839451E+00 1.524839E-01 + 3.012374E+00 7.411368E-02 + 1.418808E+00 -1.018097E+00 + 6.236240E-01 2.980372E-01 + 1.340980E-01 1.971989E+00 + 6.554800E-02 -1.179253E+00 +S 1 1.00 + 2.958400E-02 1.0000000 +P 15 1.00 + 1.620586E+04 4.200000E-05 + 3.836274E+03 3.730000E-04 + 1.246048E+03 2.149000E-03 + 4.767535E+02 9.445000E-03 + 2.021895E+02 3.329700E-02 + 9.209487E+01 9.475900E-02 + 4.414720E+01 2.081440E-01 + 2.185468E+01 3.318050E-01 + 1.108596E+01 3.331750E-01 + 5.674108E+00 1.576010E-01 + 2.823170E+00 2.144500E-02 + 1.368621E+00 -2.558000E-03 + 6.444310E-01 -2.027000E-03 + 2.483820E-01 -3.600000E-04 + 9.725500E-02 3.400000E-05 +P 15 1.00 + 1.620586E+04 -1.500000E-05 + 3.836274E+03 -1.290000E-04 + 1.246048E+03 -7.480000E-04 + 4.767535E+02 -3.308000E-03 + 2.021895E+02 -1.181100E-02 + 9.209487E+01 -3.453300E-02 + 4.414720E+01 -7.878500E-02 + 2.185468E+01 -1.321830E-01 + 1.108596E+01 -1.371950E-01 + 5.674108E+00 2.707500E-02 + 2.823170E+00 3.288910E-01 + 1.368621E+00 4.572800E-01 + 6.444310E-01 2.889080E-01 + 2.483820E-01 4.743300E-02 + 9.725500E-02 -3.522000E-03 +P 15 1.00 + 1.620586E+04 3.000000E-06 + 3.836274E+03 3.000000E-05 + 1.246048E+03 1.720000E-04 + 4.767535E+02 7.620000E-04 + 2.021895E+02 2.726000E-03 + 9.209487E+01 7.976000E-03 + 4.414720E+01 1.828700E-02 + 2.185468E+01 3.077600E-02 + 1.108596E+01 3.237300E-02 + 5.674108E+00 -9.978000E-03 + 2.823170E+00 -9.052900E-02 + 1.368621E+00 -1.380040E-01 + 6.444310E-01 -7.796500E-02 + 2.483820E-01 2.295600E-01 + 9.725500E-02 5.761220E-01 +P 15 1.00 + 1.620586E+04 4.000000E-06 + 3.836274E+03 4.000000E-05 + 1.246048E+03 2.260000E-04 + 4.767535E+02 1.013000E-03 + 2.021895E+02 3.575000E-03 + 9.209487E+01 1.061200E-02 + 4.414720E+01 2.390200E-02 + 2.185468E+01 4.127900E-02 + 1.108596E+01 4.147500E-02 + 5.674108E+00 -9.458000E-03 + 2.823170E+00 -1.236950E-01 + 1.368621E+00 -1.743920E-01 + 6.444310E-01 -1.291700E-01 + 2.483820E-01 4.003480E-01 + 9.725500E-02 6.696460E-01 +P 1 1.00 + 3.663300E-02 1.0000000 +D 7 1.00 + 1.006630E+02 3.579000E-03 + 2.983360E+01 2.582700E-02 + 1.088940E+01 9.855900E-02 + 4.393580E+00 2.383270E-01 + 1.817820E+00 3.587070E-01 + 7.278270E-01 3.650920E-01 + 2.712950E-01 2.337380E-01 +D 7 1.00 + 1.006630E+02 -3.454000E-03 + 2.983360E+01 -2.492500E-02 + 1.088940E+01 -9.763500E-02 + 4.393580E+00 -2.366920E-01 + 1.817820E+00 -2.923500E-01 + 7.278270E-01 -4.973000E-03 + 2.712950E-01 5.065880E-01 +D 1 1.00 + 8.830900E-02 1.0000000 +F 2 1.00 + 2.703200E+00 4.267760E-01 + 6.438000E-01 7.697990E-01 +**** +Fe 0 +S 19 1.00 + 4.316265E+06 8.048803E-06 + 6.463424E+05 6.258306E-05 + 1.470897E+05 3.290239E-04 + 4.166152E+04 1.387355E-03 + 1.359077E+04 5.023256E-03 + 4.905750E+03 1.610140E-02 + 1.912746E+03 4.590034E-02 + 7.926043E+02 1.136154E-01 + 3.448065E+02 2.283869E-01 + 1.558999E+02 3.221159E-01 + 7.223091E+01 2.383661E-01 + 3.272506E+01 7.404667E-02 + 1.566762E+01 9.214197E-02 + 7.503483E+00 9.339790E-02 + 3.312223E+00 1.573965E-02 + 1.558471E+00 -4.186682E-04 + 6.839140E-01 5.376318E-05 + 1.467570E-01 -3.816654E-05 + 7.058300E-02 4.319603E-05 +S 19 1.00 + 4.316265E+06 -4.155954E-06 + 6.463424E+05 -3.231401E-05 + 1.470897E+05 -1.699525E-04 + 4.166152E+04 -7.171369E-04 + 1.359077E+04 -2.603625E-03 + 4.905750E+03 -8.399109E-03 + 1.912746E+03 -2.434109E-02 + 7.926043E+02 -6.251948E-02 + 3.448065E+02 -1.365929E-01 + 1.558999E+02 -2.312707E-01 + 7.223091E+01 -2.383734E-01 + 3.272506E+01 3.123837E-02 + 1.566762E+01 5.086818E-01 + 7.503483E+00 4.987695E-01 + 3.312223E+00 9.033552E-02 + 1.558471E+00 -6.005337E-03 + 6.839140E-01 2.312454E-04 + 1.467570E-01 -5.643680E-04 + 7.058300E-02 4.992260E-04 +S 19 1.00 + 4.316265E+06 9.532178E-07 + 6.463424E+05 7.414605E-06 + 1.470897E+05 3.898393E-05 + 4.166152E+04 1.647152E-04 + 1.359077E+04 5.985980E-04 + 4.905750E+03 1.942390E-03 + 1.912746E+03 5.687237E-03 + 7.926043E+02 1.501329E-02 + 3.448065E+02 3.452455E-02 + 1.558999E+02 6.495820E-02 + 7.223091E+01 7.716194E-02 + 3.272506E+01 -1.873411E-02 + 1.566762E+01 -3.009185E-01 + 7.503483E+00 -4.554661E-01 + 3.312223E+00 1.286463E-01 + 1.558471E+00 7.183316E-01 + 6.839140E-01 4.051743E-01 + 1.467570E-01 2.168227E-02 + 7.058300E-02 -8.343566E-03 +S 19 1.00 + 4.316265E+06 -2.063008E-07 + 6.463424E+05 -1.604169E-06 + 1.470897E+05 -8.438437E-06 + 4.166152E+04 -3.563151E-05 + 1.359077E+04 -1.295998E-04 + 4.905750E+03 -4.201534E-04 + 1.912746E+03 -1.231954E-03 + 7.926043E+02 -3.248922E-03 + 3.448065E+02 -7.493717E-03 + 1.558999E+02 -1.410102E-02 + 7.223091E+01 -1.691600E-02 + 3.272506E+01 4.218996E-03 + 1.566762E+01 6.833810E-02 + 7.503483E+00 1.098201E-01 + 3.312223E+00 -4.009005E-02 + 1.558471E+00 -2.174739E-01 + 6.839140E-01 -2.465135E-01 + 1.467570E-01 2.731435E-01 + 7.058300E-02 5.748321E-01 +S 19 1.00 + 4.316265E+06 -4.009367E-07 + 6.463424E+05 -3.189255E-06 + 1.470897E+05 -1.623079E-05 + 4.166152E+04 -7.157920E-05 + 1.359077E+04 -2.463958E-04 + 4.905750E+03 -8.544907E-04 + 1.912746E+03 -2.307593E-03 + 7.926043E+02 -6.728292E-03 + 3.448065E+02 -1.366165E-02 + 1.558999E+02 -3.062240E-02 + 7.223091E+01 -2.631137E-02 + 3.272506E+01 -9.760183E-03 + 1.566762E+01 1.801906E-01 + 7.503483E+00 1.529634E-01 + 3.312223E+00 5.505413E-02 + 1.558471E+00 -9.551364E-01 + 6.839140E-01 2.586813E-01 + 1.467570E-01 1.834049E+00 + 7.058300E-02 -9.333240E-01 +S 1 1.00 + 3.144900E-02 1.0000000 +P 15 1.00 + 1.774569E+04 4.100000E-05 + 4.200721E+03 3.690000E-04 + 1.364429E+03 2.129000E-03 + 5.220806E+02 9.369000E-03 + 2.214595E+02 3.309700E-02 + 1.009096E+02 9.443100E-02 + 4.840115E+01 2.080770E-01 + 2.398536E+01 3.323330E-01 + 1.218250E+01 3.329870E-01 + 6.242298E+00 1.568430E-01 + 3.110944E+00 2.154900E-02 + 1.509958E+00 -2.095000E-03 + 7.108450E-01 -1.739000E-03 + 2.731900E-01 -3.000000E-04 + 1.042330E-01 2.900000E-05 +P 15 1.00 + 1.774569E+04 -1.500000E-05 + 4.200721E+03 -1.300000E-04 + 1.364429E+03 -7.510000E-04 + 5.220806E+02 -3.329000E-03 + 2.214595E+02 -1.191200E-02 + 1.009096E+02 -3.493300E-02 + 4.840115E+01 -7.998900E-02 + 2.398536E+01 -1.346360E-01 + 1.218250E+01 -1.385980E-01 + 6.242298E+00 3.027800E-02 + 3.110944E+00 3.332160E-01 + 1.509958E+00 4.561530E-01 + 7.108450E-01 2.850510E-01 + 2.731900E-01 4.614400E-02 + 1.042330E-01 -3.249000E-03 +P 15 1.00 + 1.774569E+04 3.000000E-06 + 4.200721E+03 2.900000E-05 + 1.364429E+03 1.650000E-04 + 5.220806E+02 7.340000E-04 + 2.214595E+02 2.626000E-03 + 1.009096E+02 7.725000E-03 + 4.840115E+01 1.773300E-02 + 2.398536E+01 3.005500E-02 + 1.218250E+01 3.109400E-02 + 6.242298E+00 -1.004800E-02 + 3.110944E+00 -8.830600E-02 + 1.509958E+00 -1.298240E-01 + 7.108450E-01 -7.693700E-02 + 2.731900E-01 2.126610E-01 + 1.042330E-01 5.730610E-01 +P 15 1.00 + 1.774569E+04 5.000000E-06 + 4.200721E+03 4.200000E-05 + 1.364429E+03 2.410000E-04 + 5.220806E+02 1.085000E-03 + 2.214595E+02 3.831000E-03 + 1.009096E+02 1.142300E-02 + 4.840115E+01 2.579200E-02 + 2.398536E+01 4.481800E-02 + 1.218250E+01 4.459800E-02 + 6.242298E+00 -1.117700E-02 + 3.110944E+00 -1.381340E-01 + 1.509958E+00 -1.882850E-01 + 7.108450E-01 -1.073990E-01 + 2.731900E-01 4.448630E-01 + 1.042330E-01 6.402390E-01 +P 1 1.00 + 3.829100E-02 1.0000000 +D 7 1.00 + 1.133440E+02 3.530000E-03 + 3.364140E+01 2.578400E-02 + 1.233100E+01 9.911900E-02 + 4.994780E+00 2.390730E-01 + 2.072800E+00 3.571990E-01 + 8.307530E-01 3.621880E-01 + 3.091780E-01 2.364610E-01 +D 7 1.00 + 1.133440E+02 -3.890000E-03 + 3.364140E+01 -2.844200E-02 + 1.233100E+01 -1.124290E-01 + 4.994780E+00 -2.742570E-01 + 2.072800E+00 -3.155460E-01 + 8.307530E-01 5.710900E-02 + 3.091780E-01 5.636040E-01 +D 1 1.00 + 1.001300E-01 1.0000000 +F 2 1.00 + 3.224300E+00 4.222490E-01 + 7.758000E-01 7.714680E-01 +**** +Co 0 +S 19 1.00 + 4.675675E+06 7.979026E-06 + 7.001615E+05 6.204071E-05 + 1.593373E+05 3.261735E-04 + 4.513046E+04 1.375360E-03 + 1.472238E+04 4.979997E-03 + 5.314222E+03 1.596434E-02 + 2.072018E+03 4.552086E-02 + 8.586188E+02 1.127385E-01 + 3.735497E+02 2.268262E-01 + 1.689229E+02 3.203074E-01 + 7.829639E+01 2.374021E-01 + 3.552123E+01 7.477686E-02 + 1.704144E+01 9.581872E-02 + 8.173000E+00 9.649911E-02 + 3.610318E+00 1.623362E-02 + 1.697047E+00 -4.535497E-04 + 7.435320E-01 5.113519E-05 + 1.583440E-01 -4.174508E-05 + 7.503600E-02 4.027577E-05 +S 19 1.00 + 4.675675E+06 -4.200240E-06 + 7.001615E+05 -3.265831E-05 + 1.593373E+05 -1.717644E-04 + 4.513046E+04 -7.247853E-04 + 1.472238E+04 -2.631462E-03 + 5.314222E+03 -8.489272E-03 + 2.072018E+03 -2.460619E-02 + 8.586188E+02 -6.322059E-02 + 3.735497E+02 -1.381957E-01 + 1.689229E+02 -2.340680E-01 + 7.829639E+01 -2.415002E-01 + 3.552123E+01 3.035312E-02 + 1.704144E+01 5.101341E-01 + 8.173000E+00 4.974939E-01 + 3.610318E+00 8.970746E-02 + 1.697047E+00 -5.941034E-03 + 7.435320E-01 2.175362E-04 + 1.583440E-01 -5.480155E-04 + 7.503600E-02 4.525804E-04 +S 19 1.00 + 4.675675E+06 9.592692E-07 + 7.001615E+05 7.461851E-06 + 1.593373E+05 3.923137E-05 + 4.513046E+04 1.657706E-04 + 1.472238E+04 6.024335E-04 + 5.314222E+03 1.955217E-03 + 2.072018E+03 5.726326E-03 + 8.586188E+02 1.512984E-02 + 3.735497E+02 3.483973E-02 + 1.689229E+02 6.570351E-02 + 7.829639E+01 7.831503E-02 + 3.552123E+01 -1.877037E-02 + 1.704144E+01 -3.062663E-01 + 8.173000E+00 -4.566429E-01 + 3.610318E+00 1.378169E-01 + 1.697047E+00 7.193676E-01 + 7.435320E-01 3.992579E-01 + 1.583440E-01 2.079933E-02 + 7.503600E-02 -7.820663E-03 +S 19 1.00 + 4.675675E+06 -2.028840E-07 + 7.001615E+05 -1.577580E-06 + 1.593373E+05 -8.298813E-06 + 4.513046E+04 -3.504154E-05 + 1.472238E+04 -1.274655E-04 + 5.314222E+03 -4.132695E-04 + 2.072018E+03 -1.212261E-03 + 8.586188E+02 -3.199318E-03 + 3.735497E+02 -7.390972E-03 + 1.689229E+02 -1.393649E-02 + 7.829639E+01 -1.678575E-02 + 3.552123E+01 4.149856E-03 + 1.704144E+01 6.797646E-02 + 8.173000E+00 1.075807E-01 + 3.610318E+00 -4.166022E-02 + 1.697047E+00 -2.128044E-01 + 7.435320E-01 -2.381360E-01 + 1.583440E-01 2.650788E-01 + 7.503600E-02 5.722774E-01 +S 19 1.00 + 4.675675E+06 -3.863053E-07 + 7.001615E+05 -3.068788E-06 + 1.593373E+05 -1.564826E-05 + 4.513046E+04 -6.883588E-05 + 1.472238E+04 -2.377367E-04 + 5.314222E+03 -8.213173E-04 + 2.072018E+03 -2.229630E-03 + 8.586188E+02 -6.467841E-03 + 3.735497E+02 -1.325463E-02 + 1.689229E+02 -2.946686E-02 + 7.829639E+01 -2.599066E-02 + 3.552123E+01 -8.499807E-03 + 1.704144E+01 1.727316E-01 + 8.173000E+00 1.512189E-01 + 3.610318E+00 3.554509E-02 + 1.697047E+00 -8.829353E-01 + 7.435320E-01 2.143530E-01 + 1.583440E-01 1.711865E+00 + 7.503600E-02 -7.140037E-01 +S 1 1.00 + 3.309100E-02 1.0000000 +P 15 1.00 + 1.926778E+04 4.100000E-05 + 4.560986E+03 3.690000E-04 + 1.481436E+03 2.128000E-03 + 5.668671E+02 9.372000E-03 + 2.404910E+02 3.315500E-02 + 1.096105E+02 9.475200E-02 + 5.259491E+01 2.090930E-01 + 2.608361E+01 3.337220E-01 + 1.326143E+01 3.322080E-01 + 6.799778E+00 1.546130E-01 + 3.393414E+00 2.090200E-02 + 1.648766E+00 -2.024000E-03 + 7.762820E-01 -1.697000E-03 + 2.980030E-01 -2.800000E-04 + 1.136180E-01 2.600000E-05 +P 15 1.00 + 1.926778E+04 -1.500000E-05 + 4.560986E+03 -1.310000E-04 + 1.481436E+03 -7.580000E-04 + 5.668671E+02 -3.363000E-03 + 2.404910E+02 -1.205400E-02 + 1.096105E+02 -3.542400E-02 + 5.259491E+01 -8.128700E-02 + 2.608361E+01 -1.369080E-01 + 1.326143E+01 -1.390190E-01 + 6.799778E+00 3.546800E-02 + 3.393414E+00 3.384980E-01 + 1.648766E+00 4.544330E-01 + 7.762820E-01 2.797930E-01 + 2.980030E-01 4.477600E-02 + 1.136180E-01 -3.151000E-03 +P 15 1.00 + 1.926778E+04 -3.000000E-06 + 4.560986E+03 -2.900000E-05 + 1.481436E+03 -1.670000E-04 + 5.668671E+02 -7.420000E-04 + 2.404910E+02 -2.662000E-03 + 1.096105E+02 -7.841000E-03 + 5.259491E+01 -1.805100E-02 + 2.608361E+01 -3.058000E-02 + 1.326143E+01 -3.131200E-02 + 6.799778E+00 1.131100E-02 + 3.393414E+00 8.999000E-02 + 1.648766E+00 1.307330E-01 + 7.762820E-01 7.180800E-02 + 2.980030E-01 -2.216580E-01 + 1.136180E-01 -5.710250E-01 +P 15 1.00 + 1.926778E+04 5.000000E-06 + 4.560986E+03 4.500000E-05 + 1.481436E+03 2.550000E-04 + 5.668671E+02 1.144000E-03 + 2.404910E+02 4.061000E-03 + 1.096105E+02 1.209500E-02 + 5.259491E+01 2.747600E-02 + 2.608361E+01 4.755700E-02 + 1.326143E+01 4.730200E-02 + 6.799778E+00 -1.441800E-02 + 3.393414E+00 -1.500620E-01 + 1.648766E+00 -1.990920E-01 + 7.762820E-01 -7.978300E-02 + 2.980030E-01 4.590350E-01 + 1.136180E-01 6.174950E-01 +P 1 1.00 + 4.162400E-02 1.0000000 +D 7 1.00 + 1.262640E+02 3.510000E-03 + 3.752260E+01 2.588400E-02 + 1.380210E+01 1.000580E-01 + 5.609270E+00 2.405470E-01 + 2.333690E+00 3.568430E-01 + 9.364150E-01 3.595790E-01 + 3.482370E-01 2.366290E-01 +D 7 1.00 + 1.262640E+02 -4.067000E-03 + 3.752260E+01 -3.005300E-02 + 1.380210E+01 -1.196200E-01 + 5.609270E+00 -2.915130E-01 + 2.333690E+00 -3.180480E-01 + 9.364150E-01 9.169800E-02 + 3.482370E-01 5.608230E-01 +D 1 1.00 + 1.123530E-01 1.0000000 +F 2 1.00 + 3.772400E+00 4.239660E-01 + 9.170000E-01 7.684290E-01 +**** +Ni 0 +S 19 1.00 + 5.045991E+06 8.208996E-06 + 7.556142E+05 6.382884E-05 + 1.719568E+05 3.355800E-04 + 4.870479E+04 1.415075E-03 + 1.588841E+04 5.124444E-03 + 5.735123E+03 1.643256E-02 + 2.236137E+03 4.689398E-02 + 9.266468E+02 1.163534E-01 + 4.031743E+02 2.350511E-01 + 1.823476E+02 3.350184E-01 + 8.454885E+01 2.534779E-01 + 3.839634E+01 7.300901E-02 + 1.845859E+01 6.184244E-02 + 8.863548E+00 6.302956E-02 + 3.916227E+00 1.008063E-02 + 1.838870E+00 -2.244528E-04 + 8.043620E-01 -5.932767E-05 + 1.697970E-01 -1.158562E-05 + 7.930600E-02 8.115109E-06 +S 19 1.00 + 5.045991E+06 -3.657849E-06 + 7.556142E+05 -2.844094E-05 + 1.719568E+05 -1.495928E-04 + 4.870479E+04 -6.313009E-04 + 1.588841E+04 -2.293052E-03 + 5.735123E+03 -7.405123E-03 + 2.236137E+03 -2.152032E-02 + 9.266468E+02 -5.560974E-02 + 4.031743E+02 -1.230176E-01 + 1.823476E+02 -2.130104E-01 + 8.454885E+01 -2.265837E-01 + 3.839634E+01 3.546796E-02 + 1.845859E+01 5.181697E-01 + 8.863548E+00 5.025630E-01 + 3.916227E+00 8.955674E-02 + 1.838870E+00 -7.031311E-03 + 8.043620E-01 -4.339167E-04 + 1.697970E-01 -5.831711E-04 + 7.930600E-02 4.228788E-04 +S 19 1.00 + 5.045991E+06 9.594149E-07 + 7.556142E+05 7.462614E-06 + 1.719568E+05 3.923843E-05 + 4.870479E+04 1.657868E-04 + 1.588841E+04 6.025905E-04 + 5.735123E+03 1.955662E-03 + 2.236137E+03 5.730391E-03 + 9.266468E+02 1.514756E-02 + 4.031743E+02 3.493499E-02 + 1.823476E+02 6.598072E-02 + 8.454885E+01 7.893083E-02 + 3.839634E+01 -1.906249E-02 + 1.845859E+01 -3.095921E-01 + 8.863548E+00 -4.558610E-01 + 3.916227E+00 1.482931E-01 + 1.838870E+00 7.134039E-01 + 8.043620E-01 3.976063E-01 + 1.697970E-01 2.295523E-02 + 7.930600E-02 -9.151758E-03 +S 19 1.00 + 5.045991E+06 -2.013753E-07 + 7.556142E+05 -1.565832E-06 + 1.719568E+05 -8.237182E-06 + 4.870479E+04 -3.478105E-05 + 1.588841E+04 -1.265265E-04 + 5.735123E+03 -4.102589E-04 + 2.236137E+03 -1.203834E-03 + 9.266468E+02 -3.179062E-03 + 4.031743E+02 -7.353828E-03 + 1.823476E+02 -1.389022E-02 + 8.454885E+01 -1.677875E-02 + 3.839634E+01 4.163378E-03 + 1.845859E+01 6.814703E-02 + 8.863548E+00 1.061029E-01 + 3.916227E+00 -4.339980E-02 + 1.838870E+00 -2.094950E-01 + 8.043620E-01 -2.310271E-01 + 1.697970E-01 2.590532E-01 + 7.930600E-02 5.691426E-01 +S 19 1.00 + 5.045991E+06 -3.924245E-07 + 7.556142E+05 -3.113909E-06 + 1.719568E+05 -1.590447E-05 + 4.870479E+04 -6.981394E-05 + 1.588841E+04 -2.417848E-04 + 5.735123E+03 -8.326195E-04 + 2.236137E+03 -2.270294E-03 + 9.266468E+02 -6.557427E-03 + 4.031743E+02 -1.354288E-02 + 1.823476E+02 -2.989768E-02 + 8.454885E+01 -2.693106E-02 + 3.839634E+01 -7.827693E-03 + 1.845859E+01 1.741667E-01 + 8.863548E+00 1.595468E-01 + 3.916227E+00 1.995550E-02 + 1.838870E+00 -8.897000E-01 + 8.043620E-01 2.486892E-01 + 1.697970E-01 1.613012E+00 + 7.930600E-02 -5.990277E-01 +S 1 1.00 + 3.467700E-02 1.0000000 +P 15 1.00 + 2.102792E+04 4.100000E-05 + 4.977560E+03 3.630000E-04 + 1.616740E+03 2.097000E-03 + 6.186718E+02 9.250000E-03 + 2.625183E+02 3.279600E-02 + 1.196907E+02 9.400400E-02 + 5.746585E+01 2.082800E-01 + 2.852829E+01 3.336540E-01 + 1.452148E+01 3.329040E-01 + 7.453850E+00 1.553720E-01 + 3.723553E+00 2.085900E-02 + 1.809813E+00 -2.440000E-03 + 8.513360E-01 -1.998000E-03 + 3.248140E-01 -3.380000E-04 + 1.195220E-01 3.500000E-05 +P 15 1.00 + 2.102792E+04 -1.500000E-05 + 4.977560E+03 -1.290000E-04 + 1.616740E+03 -7.490000E-04 + 6.186718E+02 -3.328000E-03 + 2.625183E+02 -1.194700E-02 + 1.196907E+02 -3.524200E-02 + 5.746585E+01 -8.120400E-02 + 2.852829E+01 -1.374930E-01 + 1.452148E+01 -1.392260E-01 + 7.453850E+00 3.601600E-02 + 3.723553E+00 3.391280E-01 + 1.809813E+00 4.504720E-01 + 8.513360E-01 2.817830E-01 + 3.248140E-01 4.789800E-02 + 1.195220E-01 -2.987000E-03 +P 15 1.00 + 2.102792E+04 3.000000E-06 + 4.977560E+03 2.600000E-05 + 1.616740E+03 1.520000E-04 + 6.186718E+02 6.780000E-04 + 2.625183E+02 2.427000E-03 + 1.196907E+02 7.201000E-03 + 5.746585E+01 1.657800E-02 + 2.852829E+01 2.839200E-02 + 1.452148E+01 2.859900E-02 + 7.453850E+00 -1.013200E-02 + 3.723553E+00 -8.291200E-02 + 1.809813E+00 -1.159980E-01 + 8.513360E-01 -7.279500E-02 + 3.248140E-01 1.956400E-01 + 1.195220E-01 5.670990E-01 +P 15 1.00 + 2.102792E+04 6.000000E-06 + 4.977560E+03 5.300000E-05 + 1.616740E+03 3.050000E-04 + 6.186718E+02 1.364000E-03 + 2.625183E+02 4.876000E-03 + 1.196907E+02 1.450300E-02 + 5.746585E+01 3.329600E-02 + 2.852829E+01 5.748200E-02 + 1.452148E+01 5.870200E-02 + 7.453850E+00 -1.990400E-02 + 3.723553E+00 -1.946950E-01 + 1.809813E+00 -2.396130E-01 + 8.513360E-01 -2.232000E-03 + 3.248140E-01 5.214350E-01 + 1.195220E-01 5.455400E-01 +P 1 1.00 + 4.236600E-02 1.0000000 +D 7 1.00 + 1.402527E+02 3.376000E-03 + 4.172610E+01 2.514100E-02 + 1.539810E+01 9.774600E-02 + 6.277100E+00 2.347090E-01 + 2.618500E+00 3.469450E-01 + 1.052600E+00 3.510680E-01 + 3.916000E-01 2.502550E-01 +D 7 1.00 + 1.402527E+02 -3.495000E-03 + 4.172610E+01 -2.601500E-02 + 1.539810E+01 -1.038760E-01 + 6.277100E+00 -2.520700E-01 + 2.618500E+00 -2.945800E-01 + 1.052600E+00 1.152000E-03 + 3.916000E-01 4.385890E-01 +D 1 1.00 + 1.262000E-01 1.0000000 +F 2 1.00 + 4.345500E+00 4.174290E-01 + 1.068000E+00 7.714830E-01 +**** +Cu 0 +S 19 1.00 + 5.430321E+06 7.801026E-06 + 8.131665E+05 6.065666E-05 + 1.850544E+05 3.188964E-04 + 5.241466E+04 1.344687E-03 + 1.709868E+04 4.869050E-03 + 6.171994E+03 1.561013E-02 + 2.406481E+03 4.452077E-02 + 9.972584E+02 1.103111E-01 + 4.339289E+02 2.220342E-01 + 1.962869E+02 3.133739E-01 + 9.104280E+01 2.315121E-01 + 4.138425E+01 7.640920E-02 + 1.993278E+01 1.103818E-01 + 9.581891E+00 1.094372E-01 + 4.234516E+00 1.836311E-02 + 1.985814E+00 -6.043084E-04 + 8.670830E-01 5.092245E-05 + 1.813390E-01 -5.540730E-05 + 8.365700E-02 3.969482E-05 +S 19 1.00 + 5.430321E+06 -4.404706E-06 + 8.131665E+05 -3.424801E-05 + 1.850544E+05 -1.801238E-04 + 5.241466E+04 -7.600455E-04 + 1.709868E+04 -2.759348E-03 + 6.171994E+03 -8.900970E-03 + 2.406481E+03 -2.579378E-02 + 9.972584E+02 -6.623861E-02 + 4.339289E+02 -1.445927E-01 + 1.962869E+02 -2.440110E-01 + 9.104280E+01 -2.504837E-01 + 4.138425E+01 2.852577E-02 + 1.993278E+01 5.115874E-01 + 9.581891E+00 4.928061E-01 + 4.234516E+00 8.788437E-02 + 1.985814E+00 -5.820281E-03 + 8.670830E-01 2.013508E-04 + 1.813390E-01 -5.182553E-04 + 8.365700E-02 3.731503E-04 +S 19 1.00 + 5.430321E+06 9.704682E-07 + 8.131665E+05 7.549245E-06 + 1.850544E+05 3.968892E-05 + 5.241466E+04 1.677200E-04 + 1.709868E+04 6.095101E-04 + 6.171994E+03 1.978846E-03 + 2.406481E+03 5.798049E-03 + 9.972584E+02 1.534158E-02 + 4.339289E+02 3.540484E-02 + 1.962869E+02 6.702098E-02 + 9.104280E+01 8.026945E-02 + 4.138425E+01 -1.927231E-02 + 1.993278E+01 -3.160129E-01 + 9.581891E+00 -4.573162E-01 + 4.234516E+00 1.550841E-01 + 1.985814E+00 7.202872E-01 + 8.670830E-01 3.885122E-01 + 1.813390E-01 1.924326E-02 + 8.365700E-02 -7.103807E-03 +S 19 1.00 + 5.430321E+06 -1.959354E-07 + 8.131665E+05 -1.523472E-06 + 1.850544E+05 -8.014808E-06 + 5.241466E+04 -3.383992E-05 + 1.709868E+04 -1.231191E-04 + 6.171994E+03 -3.992085E-04 + 2.406481E+03 -1.171900E-03 + 9.972584E+02 -3.096141E-03 + 4.339289E+02 -7.171993E-03 + 1.962869E+02 -1.356621E-02 + 9.104280E+01 -1.643989E-02 + 4.138425E+01 4.107628E-03 + 1.993278E+01 6.693964E-02 + 9.581891E+00 1.028221E-01 + 4.234516E+00 -4.422945E-02 + 1.985814E+00 -2.031191E-01 + 8.670830E-01 -2.230022E-01 + 1.813390E-01 2.517975E-01 + 8.365700E-02 5.650091E-01 +S 19 1.00 + 5.430321E+06 -3.532229E-07 + 8.131665E+05 -2.798812E-06 + 1.850544E+05 -1.432517E-05 + 5.241466E+04 -6.270946E-05 + 1.709868E+04 -2.179490E-04 + 6.171994E+03 -7.474316E-04 + 2.406481E+03 -2.049271E-03 + 9.972584E+02 -5.885203E-03 + 4.339289E+02 -1.226885E-02 + 1.962869E+02 -2.683147E-02 + 9.104280E+01 -2.479261E-02 + 4.138425E+01 -5.984746E-03 + 1.993278E+01 1.557124E-01 + 9.581891E+00 1.436683E-01 + 4.234516E+00 8.374103E-03 + 1.985814E+00 -7.460711E-01 + 8.670830E-01 1.244367E-01 + 1.813390E-01 1.510110E+00 + 8.365700E-02 -3.477122E-01 +S 1 1.00 + 3.626700E-02 1.0000000 +P 15 1.00 + 2.276057E+04 4.000000E-05 + 5.387679E+03 3.610000E-04 + 1.749945E+03 2.083000E-03 + 6.696653E+02 9.197000E-03 + 2.841948E+02 3.266000E-02 + 1.296077E+02 9.379500E-02 + 6.225415E+01 2.082740E-01 + 3.092964E+01 3.339930E-01 + 1.575827E+01 3.324930E-01 + 8.094211E+00 1.547280E-01 + 4.046921E+00 2.127100E-02 + 1.967869E+00 -1.690000E-03 + 9.252950E-01 -1.516000E-03 + 3.529920E-01 -2.420000E-04 + 1.273070E-01 2.300000E-05 +P 15 1.00 + 2.276057E+04 -1.500000E-05 + 5.387679E+03 -1.310000E-04 + 1.749945E+03 -7.550000E-04 + 6.696653E+02 -3.359000E-03 + 2.841948E+02 -1.208100E-02 + 1.296077E+02 -3.570300E-02 + 6.225415E+01 -8.250200E-02 + 3.092964E+01 -1.398900E-01 + 1.575827E+01 -1.407290E-01 + 8.094211E+00 3.876600E-02 + 4.046921E+00 3.426950E-01 + 1.967869E+00 4.523100E-01 + 9.252950E-01 2.770540E-01 + 3.529920E-01 4.388500E-02 + 1.273070E-01 -2.802000E-03 +P 15 1.00 + 2.276057E+04 3.000000E-06 + 5.387679E+03 2.500000E-05 + 1.749945E+03 1.470000E-04 + 6.696653E+02 6.560000E-04 + 2.841948E+02 2.351000E-03 + 1.296077E+02 7.004000E-03 + 6.225415E+01 1.613100E-02 + 3.092964E+01 2.777000E-02 + 1.575827E+01 2.756700E-02 + 8.094211E+00 -1.011500E-02 + 4.046921E+00 -8.100900E-02 + 1.967869E+00 -1.104090E-01 + 9.252950E-01 -7.173200E-02 + 3.529920E-01 1.879300E-01 + 1.273070E-01 5.646290E-01 +P 15 1.00 + 2.276057E+04 5.000000E-06 + 5.387679E+03 4.900000E-05 + 1.749945E+03 2.780000E-04 + 6.696653E+02 1.253000E-03 + 2.841948E+02 4.447000E-03 + 1.296077E+02 1.337000E-02 + 6.225415E+01 3.046900E-02 + 3.092964E+01 5.344700E-02 + 1.575827E+01 5.263900E-02 + 8.094211E+00 -1.688100E-02 + 4.046921E+00 -1.794480E-01 + 1.967869E+00 -2.095880E-01 + 9.252950E-01 -3.963300E-02 + 3.529920E-01 5.021300E-01 + 1.273070E-01 5.811110E-01 +P 1 1.00 + 4.435600E-02 1.0000000 +D 7 1.00 + 1.738970E+02 2.700000E-03 + 5.188690E+01 2.090900E-02 + 1.934190E+01 8.440800E-02 + 7.975720E+00 2.139990E-01 + 3.398230E+00 3.359800E-01 + 1.409320E+00 3.573010E-01 + 5.488580E-01 2.645780E-01 +D 7 1.00 + 1.738970E+02 -3.363000E-03 + 5.188690E+01 -2.607900E-02 + 1.934190E+01 -1.082310E-01 + 7.975720E+00 -2.822170E-01 + 3.398230E+00 -3.471900E-01 + 1.409320E+00 2.671100E-02 + 5.488580E-01 4.920470E-01 +D 1 1.00 + 1.901990E-01 1.0000000 +F 2 1.00 + 5.028600E+00 4.242800E-01 + 1.259400E+00 7.630250E-01 +**** +Zn 0 +S 19 1.00 + 5.820021E+06 8.549241E-06 + 8.715234E+05 6.647410E-05 + 1.983350E+05 3.494962E-04 + 5.617631E+04 1.473832E-03 + 1.832582E+04 5.338330E-03 + 6.614955E+03 1.712708E-02 + 2.579199E+03 4.894085E-02 + 1.068849E+03 1.217934E-01 + 4.651045E+02 2.476589E-01 + 2.104130E+02 3.582431E-01 + 9.761629E+01 2.798174E-01 + 4.438020E+01 6.857491E-02 + 2.142308E+01 -1.311092E-03 + 1.030891E+01 1.914001E-03 + 4.553645E+00 -8.759220E-04 + 2.132821E+00 3.740096E-04 + 9.296970E-01 -1.401399E-04 + 1.921470E-01 4.757132E-05 + 8.759500E-02 -3.642711E-05 +S 19 1.00 + 5.820021E+06 -2.640069E-06 + 8.715234E+05 -2.052720E-05 + 1.983350E+05 -1.079859E-04 + 5.617631E+04 -4.558577E-04 + 1.832582E+04 -1.657758E-03 + 6.614955E+03 -5.368492E-03 + 2.579199E+03 -1.571249E-02 + 1.068849E+03 -4.122558E-02 + 4.651045E+02 -9.406459E-02 + 2.104130E+02 -1.719954E-01 + 9.761629E+01 -1.958523E-01 + 4.438020E+01 4.532907E-02 + 2.142308E+01 5.244442E-01 + 1.030891E+01 5.006142E-01 + 4.553645E+00 8.945527E-02 + 2.132821E+00 -2.146262E-03 + 9.296970E-01 2.112113E-03 + 1.921470E-01 -4.133980E-04 + 8.759500E-02 3.209752E-04 +S 19 1.00 + 5.820021E+06 9.967103E-07 + 8.715234E+05 7.754163E-06 + 1.983350E+05 4.076019E-05 + 5.617631E+04 1.722811E-04 + 1.832582E+04 6.259370E-04 + 6.614955E+03 2.032855E-03 + 2.579199E+03 5.954646E-03 + 1.068849E+03 1.576640E-02 + 4.651045E+02 3.637638E-02 + 2.104130E+02 6.892343E-02 + 9.761629E+01 8.238093E-02 + 4.438020E+01 -2.011360E-02 + 2.142308E+01 -3.252526E-01 + 1.030891E+01 -4.602899E-01 + 4.553645E+00 1.635546E-01 + 2.132821E+00 7.297118E-01 + 9.296970E-01 3.769751E-01 + 1.921470E-01 1.433224E-02 + 8.759500E-02 -6.671210E-03 +S 19 1.00 + 5.820021E+06 1.995818E-07 + 8.715234E+05 1.552973E-06 + 1.983350E+05 8.161259E-06 + 5.617631E+04 3.450747E-05 + 1.832582E+04 1.253275E-04 + 6.614955E+03 4.072990E-04 + 2.579199E+03 1.192734E-03 + 1.068849E+03 3.163140E-03 + 4.651045E+02 7.303942E-03 + 2.104130E+02 1.391279E-02 + 9.761629E+01 1.670620E-02 + 4.438020E+01 -4.035586E-03 + 2.142308E+01 -6.968861E-02 + 1.030891E+01 -1.030105E-01 + 4.553645E+00 4.471442E-02 + 2.132821E+00 2.150027E-01 + 9.296970E-01 2.220163E-01 + 1.921470E-01 -3.114776E-01 + 8.759500E-02 -5.693429E-01 +S 19 1.00 + 5.820021E+06 -5.435910E-07 + 8.715234E+05 -4.336894E-06 + 1.983350E+05 -2.197572E-05 + 5.617631E+04 -9.747392E-05 + 1.832582E+04 -3.331615E-04 + 6.614955E+03 -1.166192E-03 + 2.579199E+03 -3.119308E-03 + 1.068849E+03 -9.239504E-03 + 4.651045E+02 -1.855471E-02 + 2.104130E+02 -4.281189E-02 + 9.761629E+01 -3.571095E-02 + 4.438020E+01 -1.638350E-02 + 2.142308E+01 2.644664E-01 + 1.030891E+01 2.086588E-01 + 4.553645E+00 -1.774382E-02 + 2.132821E+00 -1.353873E+00 + 9.296970E-01 8.182926E-01 + 1.921470E-01 1.695036E+00 + 8.759500E-02 -1.388656E+00 +S 1 1.00 + 3.770200E-02 1.0000000 +P 15 1.00 + 2.441198E+04 4.100000E-05 + 5.778518E+03 3.610000E-04 + 1.876862E+03 2.088000E-03 + 7.182361E+02 9.221000E-03 + 3.048327E+02 3.277300E-02 + 1.390453E+02 9.417900E-02 + 6.680417E+01 2.091320E-01 + 3.320699E+01 3.345690E-01 + 1.692816E+01 3.303590E-01 + 8.696229E+00 1.523470E-01 + 4.350510E+00 2.298400E-02 + 2.116523E+00 1.607000E-03 + 9.953870E-01 4.680000E-04 + 3.781120E-01 6.600000E-05 + 1.345790E-01 -2.000000E-06 +P 15 1.00 + 2.441198E+04 -1.500000E-05 + 5.778518E+03 -1.350000E-04 + 1.876862E+03 -7.820000E-04 + 7.182361E+02 -3.478000E-03 + 3.048327E+02 -1.252000E-02 + 1.390453E+02 -3.701600E-02 + 6.680417E+01 -8.555900E-02 + 3.320699E+01 -1.447180E-01 + 1.692816E+01 -1.434420E-01 + 8.696229E+00 4.359500E-02 + 4.350510E+00 3.488880E-01 + 2.116523E+00 4.538650E-01 + 9.953870E-01 2.685940E-01 + 3.781120E-01 3.886800E-02 + 1.345790E-01 -2.492000E-03 +P 15 1.00 + 2.441198E+04 3.000000E-06 + 5.778518E+03 2.500000E-05 + 1.876862E+03 1.440000E-04 + 7.182361E+02 6.450000E-04 + 3.048327E+02 2.311000E-03 + 1.390453E+02 6.898000E-03 + 6.680417E+01 1.588200E-02 + 3.320699E+01 2.735000E-02 + 1.692816E+01 2.662100E-02 + 8.696229E+00 -1.085800E-02 + 4.350510E+00 -7.985300E-02 + 2.116523E+00 -1.061270E-01 + 9.953870E-01 -6.888300E-02 + 3.781120E-01 1.843850E-01 + 1.345790E-01 5.617880E-01 +P 15 1.00 + 2.441198E+04 5.000000E-06 + 5.778518E+03 4.200000E-05 + 1.876862E+03 2.380000E-04 + 7.182361E+02 1.088000E-03 + 3.048327E+02 3.821000E-03 + 1.390453E+02 1.164400E-02 + 6.680417E+01 2.616700E-02 + 3.320699E+01 4.675000E-02 + 1.692816E+01 4.330900E-02 + 8.696229E+00 -1.342900E-02 + 4.350510E+00 -1.538970E-01 + 2.116523E+00 -1.674130E-01 + 9.953870E-01 -8.499500E-02 + 3.781120E-01 4.508130E-01 + 1.345790E-01 6.408690E-01 +P 1 1.00 + 4.628200E-02 1.0000000 +D 7 1.00 + 2.056177E+02 2.342000E-03 + 6.144981E+01 1.860600E-02 + 2.305689E+01 7.710200E-02 + 9.577739E+00 2.020260E-01 + 4.133734E+00 3.294540E-01 + 1.747518E+00 3.609760E-01 + 6.995600E-01 2.716570E-01 +D 7 1.00 + 2.056177E+02 3.279000E-03 + 6.144981E+01 2.617600E-02 + 2.305689E+01 1.113670E-01 + 9.577739E+00 3.045810E-01 + 4.133734E+00 3.862990E-01 + 1.747518E+00 -5.837500E-02 + 6.995600E-01 -5.388760E-01 +D 1 1.00 + 2.516080E-01 1.0000000 +F 2 1.00 + 5.734400E+00 4.311320E-01 + 1.461500E+00 7.546420E-01 +**** +Ga 0 +S 13 1.00 + 485130.0000000 0.0002068 + 72719.0000000 0.0016047 + 16552.0000000 0.0083402 + 4687.8000000 0.0340248 + 1529.1000000 0.1111699 + 551.8100000 0.2753930 + 215.1800000 0.4212628 + 88.1740000 0.2738906 + 27.1540000 0.0283720 + 11.5030000 -0.0062931 + 3.3018000 0.0020606 + 1.3314000 -0.0009269 + 0.1931600 0.0002273 +S 13 1.00 + 485130.0000000 -0.0000643 + 72719.0000000 -0.0004954 + 16552.0000000 -0.0026208 + 4687.8000000 -0.0106839 + 1529.1000000 -0.0374123 + 551.8100000 -0.1009636 + 215.1800000 -0.2145141 + 88.1740000 -0.1752297 + 27.1540000 0.4831599 + 11.5030000 0.6323677 + 3.3018000 0.0684942 + 1.3314000 -0.0118712 + 0.1931600 0.0026652 +S 13 1.00 + 485130.0000000 0.0000245 + 72719.0000000 0.0001895 + 16552.0000000 0.0009964 + 4687.8000000 0.0041082 + 1529.1000000 0.0142938 + 551.8100000 0.0398034 + 215.1800000 0.0855940 + 88.1740000 0.0796305 + 27.1540000 -0.2939107 + 11.5030000 -0.5263914 + 3.3018000 0.5864249 + 1.3314000 0.6726347 + 0.1931600 0.0276123 +S 13 1.00 + 485130.0000000 -0.0000057 + 72719.0000000 -0.0000440 + 16552.0000000 -0.0002305 + 4687.8000000 -0.0009544 + 1529.1000000 -0.0033055 + 551.8100000 -0.0092888 + 215.1800000 -0.0198644 + 88.1740000 -0.0190888 + 27.1540000 0.0732356 + 11.5030000 0.1341526 + 3.3018000 -0.1831929 + 1.3314000 -0.3571308 + 0.1931600 0.6246013 +S 1 1.00 + 0.0708950 1.0000000 +P 10 1.00 + 3248.6000000 0.0015260 + 769.9700000 0.0127486 + 248.2000000 0.0633742 + 93.3640000 0.2065775 + 38.2510000 0.4092963 + 16.4220000 0.3919183 + 6.7918000 0.1029441 + 2.8336000 -0.0007203 + 1.1062000 0.0020950 + 0.2225000 -0.0003290 +P 10 1.00 + 3248.6000000 -0.0005803 + 769.9700000 -0.0048647 + 248.2000000 -0.0248394 + 93.3640000 -0.0841759 + 38.2510000 -0.1800885 + 16.4220000 -0.1585555 + 6.7918000 0.2355376 + 2.8336000 0.5820587 + 1.1062000 0.3366619 + 0.2225000 0.0171912 +P 10 1.00 + 3248.6000000 0.0000950 + 769.9700000 0.0007832 + 248.2000000 0.0040855 + 93.3640000 0.0135987 + 38.2510000 0.0302695 + 16.4220000 0.0241790 + 6.7918000 -0.0423777 + 2.8336000 -0.1265661 + 1.1062000 -0.0499444 + 0.2225000 0.4494199 +P 1 1.00 + 0.0617720 1.0000000 +D 5 1.00 + 65.3370000 0.0273825 + 18.4970000 0.1510805 + 6.3150000 0.3749217 + 2.1635000 0.4750799 + 0.6667500 0.2982750 +D 1 1.00 + 0.1884000 1.0000000 +**** +Ge 0 +S 13 1.00 + 521800.0000000 0.0002045 + 78214.0000000 0.0015868 + 17803.0000000 0.0082480 + 5041.9000000 0.0336649 + 1644.5000000 0.1101249 + 593.4300000 0.2735607 + 231.3600000 0.4210670 + 94.7620000 0.2766791 + 29.2740000 0.0292180 + 12.4500000 -0.0065903 + 3.6463000 0.0022430 + 1.5025000 -0.0010382 + 0.2450300 0.0002695 +S 13 1.00 + 521800.0000000 -0.0000638 + 78214.0000000 -0.0004916 + 17803.0000000 -0.0026002 + 5041.9000000 -0.0106080 + 1644.5000000 -0.0371602 + 593.4300000 -0.1005790 + 231.3600000 -0.2143977 + 94.7620000 -0.1782617 + 29.2740000 0.4777404 + 12.4500000 0.6355983 + 3.6463000 0.0722174 + 1.5025000 -0.0127265 + 0.2450300 0.0029608 +S 13 1.00 + 521800.0000000 0.0000246 + 78214.0000000 0.0001900 + 17803.0000000 0.0009993 + 5041.9000000 0.0041200 + 1644.5000000 0.0143557 + 593.4300000 0.0400375 + 231.3600000 0.0865794 + 94.7620000 0.0815861 + 29.2740000 -0.2934770 + 12.4500000 -0.5367983 + 3.6463000 0.5637985 + 1.5025000 0.6947182 + 0.2450300 0.0315730 +S 13 1.00 + 521800.0000000 -0.0000063 + 78214.0000000 -0.0000486 + 17803.0000000 -0.0002553 + 5041.9000000 -0.0010560 + 1644.5000000 -0.0036674 + 593.4300000 -0.0103053 + 231.3600000 -0.0222200 + 94.7620000 -0.0215275 + 29.2740000 0.0806752 + 12.4500000 0.1524958 + 3.6463000 -0.1980528 + 1.5025000 -0.4073954 + 0.2450300 0.6477288 +S 1 1.00 + 0.0915940 1.0000000 +P 10 1.00 + 3568.1000000 0.0014591 + 845.7200000 0.0122176 + 272.7400000 0.0610490 + 102.6800000 0.2008039 + 42.1480000 0.4038942 + 18.1490000 0.3970027 + 7.5934000 0.1105481 + 3.1964000 0.0000768 + 1.2743000 0.0021263 + 0.2825800 -0.0003744 +P 10 1.00 + 3568.1000000 -0.0005630 + 845.7200000 -0.0047354 + 272.7400000 -0.0242643 + 102.6800000 -0.0830900 + 42.1480000 -0.1800247 + 18.1490000 -0.1663295 + 7.5934000 0.2193717 + 3.1964000 0.5820239 + 1.2743000 0.3477720 + 0.2825800 0.0192455 +P 10 1.00 + 3568.1000000 0.0001115 + 845.7200000 0.0009212 + 272.7400000 0.0048273 + 102.6800000 0.0162272 + 42.1480000 0.0366354 + 18.1490000 0.0307867 + 7.5934000 -0.0480643 + 3.1964000 -0.1559804 + 1.2743000 -0.0632370 + 0.2825800 0.5040819 +P 1 1.00 + 0.0840900 1.0000000 +D 5 1.00 + 74.7620000 0.0257684 + 21.3020000 0.1454421 + 7.3436000 0.3713721 + 2.5651000 0.4800002 + 0.8197000 0.2896800 +D 1 1.00 + 0.2470000 1.0000000 +**** +As 0 +S 13 1.00 + 559583.7900000 0.0002024 + 83879.3300000 0.0015709 + 19092.6680000 0.0081662 + 5407.3925000 0.0333399 + 1763.7559000 0.1091726 + 636.4567200 0.2718853 + 248.0884300 0.4208509 + 101.5785100 0.2792257 + 31.4755130 0.0300301 + 13.4372820 -0.0068804 + 4.0086900 0.0024240 + 1.6849290 -0.0011491 + 0.3000190 0.0003095 +S 13 1.00 + 559583.7900000 -0.0000634 + 83879.3300000 -0.0004883 + 19092.6680000 -0.0025821 + 5407.3925000 -0.0105402 + 1763.7559000 -0.0369325 + 636.4567200 -0.1002355 + 248.0884300 -0.2142948 + 101.5785100 -0.1810526 + 31.4755130 0.4725410 + 13.4372820 0.6386194 + 4.0086900 0.0758107 + 1.6849290 -0.0135278 + 0.3000190 0.0031970 +S 13 1.00 + 559583.7900000 0.0000246 + 83879.3300000 0.0001907 + 19092.6680000 0.0010031 + 5407.3925000 0.0041353 + 1763.7559000 0.0144259 + 636.4567200 0.0402962 + 248.0884300 0.0875670 + 101.5785100 0.0835178 + 31.4755130 -0.2932935 + 13.4372820 -0.5470520 + 4.0086900 0.5438738 + 1.6849290 0.7143591 + 0.3000190 0.0353443 +S 13 1.00 + 559583.7900000 -0.0000068 + 83879.3300000 -0.0000525 + 19092.6680000 -0.0002756 + 5407.3925000 -0.0011389 + 1763.7559000 -0.0039646 + 636.4567200 -0.0111423 + 248.0884300 -0.0241991 + 101.5785100 -0.0236339 + 31.4755130 0.0866317 + 13.4372820 0.1685839 + 4.0086900 -0.2091425 + 1.6849290 -0.4500918 + 0.3000190 0.6603978 +S 1 1.00 + 0.1135870 1.0000000 +P 10 1.00 + 3886.3564000 0.0014097 + 921.2020100 0.0118277 + 297.1931900 0.0593280 + 111.9750800 0.1965115 + 46.0346210 0.3997891 + 19.8741940 0.4004653 + 8.3860880 0.1164196 + 3.5587280 0.0006918 + 1.4472820 0.0021633 + 0.3477790 -0.0004150 +P 10 1.00 + 3886.3564000 -0.0005519 + 921.2020100 -0.0046550 + 297.1931900 -0.0239176 + 111.9750800 -0.0825627 + 46.0346210 -0.1806791 + 19.8741940 -0.1724848 + 8.3860880 0.2086700 + 3.5587280 0.5823622 + 1.4472820 0.3537465 + 0.3477790 0.0206439 +P 10 1.00 + 3886.3564000 0.0001236 + 921.2020100 0.0010240 + 297.1931900 0.0053805 + 111.9750800 0.0182443 + 46.0346210 0.0415979 + 19.8741940 0.0362998 + 8.3860880 -0.0523569 + 3.5587280 -0.1791667 + 1.4472820 -0.0740477 + 0.3477790 0.5358094 +P 1 1.00 + 0.1076990 1.0000000 +D 5 1.00 + 84.4242340 0.0245288 + 24.1815890 0.1411340 + 8.4017770 0.3687579 + 2.9805020 0.4840626 + 0.9790030 0.2824434 +D 1 1.00 + 0.3098000 1.0000000 +**** +Se 0 +S 13 1.00 + 598990.0000000 0.0002004 + 89783.0000000 0.0015554 + 20435.0000000 0.0080872 + 5786.9000000 0.0330344 + 1887.3000000 0.1082924 + 680.9700000 0.2703361 + 265.3900000 0.4206236 + 108.6300000 0.2815922 + 33.7600000 0.0308110 + 14.4650000 -0.0071617 + 4.3890000 0.0026022 + 1.8783000 -0.0012583 + 0.3585900 0.0003465 +S 13 1.00 + 598990.0000000 -0.0000629 + 89783.0000000 -0.0004850 + 20435.0000000 -0.0025644 + 5786.9000000 -0.0104761 + 1887.3000000 -0.0367223 + 680.9700000 -0.0999225 + 265.3900000 -0.2141973 + 108.6300000 -0.1836593 + 33.7600000 0.4675454 + 14.4650000 0.6414740 + 4.3890000 0.0792569 + 1.8783000 -0.0142697 + 0.3585900 0.0033792 +S 13 1.00 + 598990.0000000 0.0000247 + 89783.0000000 0.0001913 + 20435.0000000 0.0010068 + 5786.9000000 0.0041514 + 1887.3000000 0.0144991 + 680.9700000 0.0405658 + 265.3900000 0.0885364 + 108.6300000 0.0854212 + 33.7600000 -0.2932581 + 14.4650000 -0.5570727 + 4.3890000 0.5261436 + 1.8783000 0.7320371 + 0.3585900 0.0388246 +S 13 1.00 + 598990.0000000 -0.0000072 + 89783.0000000 -0.0000559 + 20435.0000000 -0.0002938 + 5786.9000000 -0.0012136 + 1887.3000000 -0.0042340 + 680.9700000 -0.0119035 + 265.3900000 -0.0260206 + 108.6300000 -0.0256148 + 33.7600000 0.0919427 + 14.4650000 0.1838700 + 4.3890000 -0.2188461 + 1.8783000 -0.4896524 + 0.3585900 0.6775818 +S 1 1.00 + 0.1364900 1.0000000 +P 10 1.00 + 4135.6000000 0.0014127 + 980.3400000 0.0118588 + 316.3500000 0.0595153 + 119.2500000 0.1972201 + 49.0680000 0.4007439 + 21.2120000 0.3994740 + 8.9462000 0.1153364 + 3.8236000 0.0002219 + 1.5883000 0.0022838 + 0.4096900 -0.0004756 +P 10 1.00 + 4135.6000000 -0.0005610 + 980.3400000 -0.0047340 + 316.3500000 -0.0243504 + 119.2500000 -0.0841071 + 49.0680000 -0.1841384 + 21.2120000 -0.1735004 + 8.9462000 0.2167263 + 3.8236000 0.5850099 + 1.5883000 0.3416816 + 0.4096900 0.0199125 +P 10 1.00 + 4135.6000000 0.0001366 + 980.3400000 0.0011308 + 316.3500000 0.0059581 + 119.2500000 0.0201866 + 49.0680000 0.0461939 + 21.2120000 0.0394050 + 8.9462000 -0.0592846 + 3.8236000 -0.2014663 + 1.5883000 -0.0687821 + 0.4096900 0.5595944 +P 1 1.00 + 0.1245900 1.0000000 +D 5 1.00 + 94.4720000 0.0234982 + 27.1800000 0.1375183 + 9.5068000 0.3664824 + 3.4168000 0.4874717 + 1.1479000 0.2765769 +D 1 1.00 + 0.3682000 1.0000000 +**** +Br 0 +S 13 1.00 + 640100.0000000 0.0001984 + 95938.0000000 0.0015400 + 21833.0000000 0.0080096 + 6181.9000000 0.0327341 + 2015.7000000 0.1074480 + 727.1000000 0.2688946 + 283.2800000 0.4204411 + 115.9100000 0.2838041 + 36.1240000 0.0315455 + 15.5320000 -0.0074268 + 4.7857000 0.0027728 + 2.0817000 -0.0013635 + 0.4202800 0.0003812 +S 13 1.00 + 640100.0000000 -0.0000625 + 95938.0000000 -0.0004816 + 21833.0000000 -0.0025466 + 6181.9000000 -0.0104112 + 2015.7000000 -0.0365179 + 727.1000000 -0.0996295 + 283.2800000 -0.2141310 + 115.9100000 -0.1860911 + 36.1240000 0.4628261 + 15.5320000 0.6441141 + 4.7857000 0.0825502 + 2.0817000 -0.0149694 + 0.4202800 0.0035288 +S 13 1.00 + 640100.0000000 0.0000248 + 95938.0000000 0.0001919 + 21833.0000000 0.0010100 + 6181.9000000 0.0041659 + 2015.7000000 0.0145683 + 727.1000000 0.0408345 + 283.2800000 0.0894859 + 115.9100000 0.0872786 + 36.1240000 -0.2933644 + 15.5320000 -0.5667109 + 4.7857000 0.5105658 + 2.0817000 0.7477214 + 0.4202800 0.0421512 +S 13 1.00 + 640100.0000000 -0.0000076 + 95938.0000000 -0.0000588 + 21833.0000000 -0.0003092 + 6181.9000000 -0.0012766 + 2015.7000000 -0.0044634 + 727.1000000 -0.0125575 + 283.2800000 -0.0276145 + 115.9100000 -0.0273945 + 36.1240000 0.0964094 + 15.5320000 0.1976871 + 4.7857000 -0.2266693 + 2.0817000 -0.5241165 + 0.4202800 0.6889865 +S 1 1.00 + 0.1606900 1.0000000 +P 10 1.00 + 4340.8000000 0.0014448 + 1028.9000000 0.0121288 + 332.0200000 0.0608077 + 125.1600000 0.2009358 + 51.5110000 0.4047419 + 22.2810000 0.3957151 + 9.3417000 0.1102213 + 4.0132000 -0.0009090 + 1.7002000 0.0024832 + 0.4719400 -0.0005744 +P 10 1.00 + 4340.8000000 -0.0005819 + 1028.9000000 -0.0049065 + 332.0200000 -0.0252514 + 125.1600000 -0.0869445 + 51.5110000 -0.1893422 + 22.2810000 -0.1710882 + 9.3417000 0.2368755 + 4.0132000 0.5898400 + 1.7002000 0.3171944 + 0.4719400 0.0179833 +P 10 1.00 + 4340.8000000 0.0001518 + 1028.9000000 0.0012563 + 332.0200000 0.0066224 + 125.1600000 0.0223816 + 51.5110000 0.0509717 + 22.2810000 0.0414009 + 9.3417000 -0.0703970 + 4.0132000 -0.2232540 + 1.7002000 -0.0564179 + 0.4719400 0.5808079 +P 1 1.00 + 0.1442100 1.0000000 +D 5 1.00 + 104.8300000 0.0226583 + 30.2720000 0.1345895 + 10.6490000 0.3647181 + 3.8696000 0.4904196 + 1.3239000 0.2713885 +D 1 1.00 + 0.4098000 1.0000000 +**** +Kr 0 +S 13 1.00 + 681358.8200000 0.0001969 + 102126.4800000 0.0015286 + 23243.7100000 0.0079500 + 6582.0073000 0.0324938 + 2146.4286000 0.1067240 + 774.3378200 0.2675701 + 301.6702000 0.4201851 + 123.4118400 0.2858015 + 38.5675510 0.0322461 + 16.6373790 -0.0076828 + 5.1987950 0.0029393 + 2.2948140 -0.0014662 + 0.4852110 0.0004144 +S 13 1.00 + 681358.8200000 -0.0000622 + 102126.4800000 -0.0004794 + 23243.7100000 -0.0025341 + 6582.0073000 -0.0103636 + 2146.4286000 -0.0363516 + 774.3378200 -0.0993737 + 301.6702000 -0.2140610 + 123.4118400 -0.1883192 + 38.5675510 0.4583816 + 16.6373790 0.6465664 + 5.1987950 0.0856579 + 2.2948140 -0.0156123 + 0.4852110 0.0036490 +S 13 1.00 + 681358.8200000 0.0000249 + 102126.4800000 0.0001928 + 23243.7100000 0.0010149 + 6582.0073000 0.0041857 + 2146.4286000 0.0146459 + 774.3378200 0.0411070 + 301.6702000 0.0903955 + 123.4118400 0.0890623 + 38.5675510 -0.2935718 + 16.6373790 -0.5759698 + 5.1987950 0.4968578 + 2.2948140 0.7616895 + 0.4852110 0.0453267 +S 13 1.00 + 681358.8200000 -0.0000079 + 102126.4800000 -0.0000614 + 23243.7100000 -0.0003230 + 6582.0073000 -0.0013330 + 2146.4286000 -0.0046672 + 774.3378200 -0.0131352 + 301.6702000 -0.0290342 + 123.4118400 -0.0290173 + 38.5675510 0.1002664 + 16.6373790 0.2103818 + 5.1987950 -0.2332471 + 2.2948140 -0.5546497 + 0.4852110 0.6969522 +S 1 1.00 + 0.1862700 1.0000000 +P 10 1.00 + 4474.2699000 0.0015195 + 1060.5790000 0.0127424 + 342.2081200 0.0636465 + 128.9984200 0.2085635 + 53.0872220 0.4122423 + 22.9594250 0.3878103 + 9.5073000 0.1003820 + 4.0830550 -0.0025078 + 1.7504460 0.0027139 + 0.5291900 -0.0006977 +P 10 1.00 + 4474.2699000 -0.0006208 + 1060.5790000 -0.0052212 + 342.2081200 -0.0268463 + 128.9984200 -0.0915823 + 53.0872220 -0.1968164 + 22.9594250 -0.1634750 + 9.5073000 0.2738204 + 4.0830550 0.5981592 + 1.7504460 0.2750453 + 0.5291900 0.0127706 +P 10 1.00 + 4474.2699000 0.0001701 + 1060.5790000 0.0014064 + 342.2081200 0.0073963 + 128.9984200 0.0248254 + 53.0872220 0.0557155 + 22.9594250 0.0412132 + 9.5073000 -0.0876057 + 4.0830550 -0.2440586 + 1.7504460 -0.0295007 + 0.5291900 0.6012295 +P 1 1.00 + 0.1643690 1.0000000 +D 5 1.00 + 115.5253200 0.0219557 + 33.4652460 0.1321620 + 11.8304590 0.3633484 + 4.3397710 0.4929582 + 1.5075240 0.2667560 +D 1 1.00 + 0.5030000 1.0000000 +**** + + diff --git a/basis/dz.gbf b/basis/dz.gbf new file mode 100644 index 0000000..a971c54 --- /dev/null +++ b/basis/dz.gbf @@ -0,0 +1,333 @@ +cartesian + +! DZ (Dunning) EMSL Basis Set Exchange Library 2/9/11 8:30 AM +! T.H. DUNNING, JR., J. CHEM. PHYS. 53, 2823 (1970). +! T.H. DUNNING, JR. AND P.J. HAY, IN METHODS OF ELECTRONIC STRUCTURE THEORY, +! VOL. 2, H.F. SCHAEFER III, ED., PLENUM PRESS (1977). +! + + +**** +H 0 +S 3 1.00 + 19.2406000 0.0328280 + 2.8992000 0.2312080 + 0.6534000 0.8172380 +S 1 1.00 + 0.1776000 1.0000000 +**** +Li 0 +S 6 1.00 + 921.3000000 0.0013670 + 138.7000000 0.0104250 + 31.9400000 0.0498590 + 9.3530000 0.1607010 + 3.1580000 0.3446040 + 1.1570000 0.4251970 +S 1 1.00 + 0.4446000 1.0000000 +S 1 1.00 + 0.0766600 1.0000000 +S 1 1.00 + 0.0286400 1.0000000 +P 3 1.00 + 1.4880000 0.0387700 + 0.2667000 0.2362570 + 0.0720100 0.8304480 +P 1 1.00 + 0.0237000 1.0000000 +**** +B 0 +S 6 1.00 + 2788.4100000 0.0021220 + 419.0390000 0.0161710 + 96.4683000 0.0783560 + 28.0694000 0.2632500 + 9.3760000 0.5967290 + 1.3057000 0.2303970 +S 1 1.00 + 3.4062000 1.0000000 +S 1 1.00 + 0.3245000 1.0000000 +S 1 1.00 + 0.1022000 1.0000000 +P 4 1.00 + 11.3413000 0.0179870 + 2.4360000 0.1103390 + 0.6836000 0.3831110 + 0.2134000 0.6478600 +P 1 1.00 + 0.0701000 1.0000000 +**** +C 0 +S 6 1.00 + 4232.6100000 0.0020290 + 634.8820000 0.0155350 + 146.0970000 0.0754110 + 42.4974000 0.2571210 + 14.1892000 0.5965550 + 1.9666000 0.2425170 +S 1 1.00 + 5.1477000 1.0000000 +S 1 1.00 + 0.4962000 1.0000000 +S 1 1.00 + 0.1533000 1.0000000 +P 4 1.00 + 18.1557000 0.0185340 + 3.9864000 0.1154420 + 1.1429000 0.3862060 + 0.3594000 0.6400890 +P 1 1.00 + 0.1146000 1.0000000 +**** +N 0 +S 6 1.00 + 5909.4400000 0.0020040 + 887.4510000 0.0153100 + 204.7490000 0.0742930 + 59.8376000 0.2533640 + 19.9981000 0.6005760 + 2.6860000 0.2451110 +S 1 1.00 + 7.1927000 1.0000000 +S 1 1.00 + 0.7000000 1.0000000 +S 1 1.00 + 0.2133000 1.0000000 +P 4 1.00 + 26.7860000 0.0182570 + 5.9564000 0.1164070 + 1.7074000 0.3901110 + 0.5314000 0.6372210 +P 1 1.00 + 0.1654000 1.0000000 +**** +O 0 +S 6 1.00 + 7816.5400000 0.0020310 + 1175.8200000 0.0154360 + 273.1880000 0.0737710 + 81.1696000 0.2476060 + 27.1836000 0.6118320 + 3.4136000 0.2412050 +S 1 1.00 + 9.5322000 1.0000000 +S 1 1.00 + 0.9398000 1.0000000 +S 1 1.00 + 0.2846000 1.0000000 +P 4 1.00 + 35.1832000 0.0195800 + 7.9040000 0.1241890 + 2.3051000 0.3947270 + 0.7171000 0.6273750 +P 1 1.00 + 0.2137000 1.0000000 +**** +F 0 +S 6 1.00 + 9994.7900000 0.0020170 + 1506.0300000 0.0152950 + 350.2690000 0.0731100 + 104.0530000 0.2464200 + 34.8432000 0.6125930 + 4.3688000 0.2424890 +S 1 1.00 + 12.2164000 1.0000000 +S 1 1.00 + 1.2078000 1.0000000 +S 1 1.00 + 0.3634000 1.0000000 +P 4 1.00 + 44.3555000 0.0208680 + 10.0820000 0.1300920 + 2.9959000 0.3962190 + 0.9383000 0.6203680 +P 1 1.00 + 0.2733000 1.0000000 +**** +Ne 0 +S 7 1.00 + 12100.0000000 0.0012000 + 1821.0000000 0.0090920 + 432.8000000 0.0413050 + 132.5000000 0.1378670 + 43.7700000 0.3624330 + 14.9100000 0.4722470 + 5.1270000 0.1300350 +S 1 1.00 + 14.9100000 1.0000000 +S 1 1.00 + 1.4910000 1.0000000 +S 1 1.00 + 0.4468000 1.0000000 +P 4 1.00 + 56.4500000 0.0208750 + 12.9200000 0.1300320 + 3.8650000 0.3956790 + 1.2030000 0.6214500 +P 1 1.00 + 0.3444000 1.0000000 +**** +Al 0 +S 5 1.00 + 23490.0000000 0.0025090 + 3548.0000000 0.0189860 + 823.5000000 0.0929140 + 237.7000000 0.3359350 + 78.6000000 0.6473910 +S 3 1.00 + 78.6000000 0.1119370 + 29.0500000 0.6559760 + 11.6200000 0.2833490 +S 1 1.00 + 3.4650000 1.0000000 +S 1 1.00 + 1.2330000 1.0000000 +S 1 1.00 + 0.2018000 1.0000000 +S 1 1.00 + 0.0780500 1.0000000 +P 4 1.00 + 141.5000000 0.0178820 + 33.2200000 0.1203750 + 10.3900000 0.4115800 + 3.5930000 0.5953530 +P 2 1.00 + 3.5930000 0.2117580 + 1.2420000 0.8377950 +P 1 1.00 + 0.3040000 1.0000000 +P 1 1.00 + 0.0762900 1.0000000 +**** +Si 0 +S 5 1.00 + 26740.0000000 0.0025830 + 4076.0000000 0.0192370 + 953.3000000 0.0938430 + 274.6000000 0.3412350 + 90.6800000 0.6416750 +S 3 1.00 + 90.6800000 0.1214390 + 33.5300000 0.6531430 + 13.4600000 0.2776240 +S 1 1.00 + 4.0510000 1.0000000 +S 1 1.00 + 1.4840000 1.0000000 +S 1 1.00 + 0.2704000 1.0000000 +S 1 1.00 + 0.0993200 1.0000000 +P 4 1.00 + 163.7000000 0.0114980 + 38.3500000 0.0777260 + 12.0200000 0.2635950 + 4.1850000 0.7582690 +P 2 1.00 + 4.1850000 -1.1730450 + 1.4830000 1.4383350 +P 1 1.00 + 0.3350000 1.0000000 +P 1 1.00 + 0.0969900 1.0000000 +**** +P 0 +S 5 1.00 + 30630.0000000 0.0026190 + 4684.0000000 0.0194790 + 1094.0000000 0.0952070 + 315.3000000 0.3457420 + 104.1000000 0.6362880 +S 3 1.00 + 104.1000000 0.1307060 + 38.4200000 0.6502740 + 15.4500000 0.2723080 +S 1 1.00 + 4.6560000 1.0000000 +S 1 1.00 + 1.7590000 1.0000000 +S 1 1.00 + 0.3409000 1.0000000 +S 1 1.00 + 0.1238000 1.0000000 +P 4 1.00 + 187.7000000 0.0131580 + 43.6300000 0.0904940 + 13.6000000 0.3050540 + 4.7660000 0.7135790 +P 2 1.00 + 4.7660000 -0.7925730 + 1.7430000 1.4299870 +P 1 1.00 + 0.4192000 1.0000000 +P 1 1.00 + 0.1245000 1.0000000 +**** +S 0 +S 5 1.00 + 35710.0000000 0.0025650 + 5397.0000000 0.0194050 + 1250.0000000 0.0955950 + 359.9000000 0.3457930 + 119.2000000 0.6357940 +S 3 1.00 + 119.2000000 0.1300960 + 43.9800000 0.6513010 + 17.6300000 0.2719550 +S 1 1.00 + 5.4200000 1.0000000 +S 1 1.00 + 2.0740000 1.0000000 +S 1 1.00 + 0.4246000 1.0000000 +S 1 1.00 + 0.1519000 1.0000000 +P 4 1.00 + 212.9000000 0.0140910 + 49.6000000 0.0966850 + 15.5200000 0.3238740 + 5.4760000 0.6917560 +P 2 1.00 + 5.4760000 -0.6267370 + 2.0440000 1.3770510 +P 1 1.00 + 0.5218000 1.0000000 +P 1 1.00 + 0.1506000 1.0000000 +**** +Cl 0 +S 5 1.00 + 40850.0000000 0.0025320 + 6179.0000000 0.0192070 + 1425.0000000 0.0952570 + 409.2000000 0.3455890 + 135.5000000 0.6364010 +S 3 1.00 + 135.5000000 0.1209560 + 50.1300000 0.6485110 + 20.2100000 0.2754870 +S 1 1.00 + 6.2830000 1.0000000 +S 1 1.00 + 2.4600000 1.0000000 +S 1 1.00 + 0.5271000 1.0000000 +S 1 1.00 + 0.1884000 1.0000000 +P 4 1.00 + 240.8000000 0.0145950 + 56.5600000 0.0990470 + 17.8500000 0.3305620 + 6.3500000 0.6828740 +P 2 1.00 + 6.3500000 -0.5617850 + 2.4030000 1.3519010 +P 1 1.00 + 0.6410000 1.0000000 +P 1 1.00 + 0.1838000 1.0000000 +**** + diff --git a/basis/sto-3g.gbf b/basis/sto-3g.gbf new file mode 100644 index 0000000..e3133e1 --- /dev/null +++ b/basis/sto-3g.gbf @@ -0,0 +1,1142 @@ + + +spherical + +!---------------------------------------------------------------------- +! Basis Set Exchange +! Version v0.8.12 +! https://www.basissetexchange.org +!---------------------------------------------------------------------- +! Basis set: STO-3G +! Description: STO-3G Minimal Basis (3 functions/AO) +! Role: orbital +! Version: 1 (Data from Gaussian09) +!---------------------------------------------------------------------- + + +**** +H 0 +S 3 1.00 + 0.3425250914D+01 0.1543289673D+00 + 0.6239137298D+00 0.5353281423D+00 + 0.1688554040D+00 0.4446345422D+00 +**** +He 0 +S 3 1.00 + 0.6362421394D+01 0.1543289673D+00 + 0.1158922999D+01 0.5353281423D+00 + 0.3136497915D+00 0.4446345422D+00 +**** +Li 0 +S 3 1.00 + 0.1611957475D+02 0.1543289673D+00 + 0.2936200663D+01 0.5353281423D+00 + 0.7946504870D+00 0.4446345422D+00 +SP 3 1.00 + 0.6362897469D+00 -0.9996722919D-01 0.1559162750D+00 + 0.1478600533D+00 0.3995128261D+00 0.6076837186D+00 + 0.4808867840D-01 0.7001154689D+00 0.3919573931D+00 +**** +Be 0 +S 3 1.00 + 0.3016787069D+02 0.1543289673D+00 + 0.5495115306D+01 0.5353281423D+00 + 0.1487192653D+01 0.4446345422D+00 +SP 3 1.00 + 0.1314833110D+01 -0.9996722919D-01 0.1559162750D+00 + 0.3055389383D+00 0.3995128261D+00 0.6076837186D+00 + 0.9937074560D-01 0.7001154689D+00 0.3919573931D+00 +**** +B 0 +S 3 1.00 + 0.4879111318D+02 0.1543289673D+00 + 0.8887362172D+01 0.5353281423D+00 + 0.2405267040D+01 0.4446345422D+00 +SP 3 1.00 + 0.2236956142D+01 -0.9996722919D-01 0.1559162750D+00 + 0.5198204999D+00 0.3995128261D+00 0.6076837186D+00 + 0.1690617600D+00 0.7001154689D+00 0.3919573931D+00 +**** +C 0 +S 3 1.00 + 0.7161683735D+02 0.1543289673D+00 + 0.1304509632D+02 0.5353281423D+00 + 0.3530512160D+01 0.4446345422D+00 +SP 3 1.00 + 0.2941249355D+01 -0.9996722919D-01 0.1559162750D+00 + 0.6834830964D+00 0.3995128261D+00 0.6076837186D+00 + 0.2222899159D+00 0.7001154689D+00 0.3919573931D+00 +**** +N 0 +S 3 1.00 + 0.9910616896D+02 0.1543289673D+00 + 0.1805231239D+02 0.5353281423D+00 + 0.4885660238D+01 0.4446345422D+00 +SP 3 1.00 + 0.3780455879D+01 -0.9996722919D-01 0.1559162750D+00 + 0.8784966449D+00 0.3995128261D+00 0.6076837186D+00 + 0.2857143744D+00 0.7001154689D+00 0.3919573931D+00 +**** +O 0 +S 3 1.00 + 0.1307093214D+03 0.1543289673D+00 + 0.2380886605D+02 0.5353281423D+00 + 0.6443608313D+01 0.4446345422D+00 +SP 3 1.00 + 0.5033151319D+01 -0.9996722919D-01 0.1559162750D+00 + 0.1169596125D+01 0.3995128261D+00 0.6076837186D+00 + 0.3803889600D+00 0.7001154689D+00 0.3919573931D+00 +**** +F 0 +S 3 1.00 + 0.1666791340D+03 0.1543289673D+00 + 0.3036081233D+02 0.5353281423D+00 + 0.8216820672D+01 0.4446345422D+00 +SP 3 1.00 + 0.6464803249D+01 -0.9996722919D-01 0.1559162750D+00 + 0.1502281245D+01 0.3995128261D+00 0.6076837186D+00 + 0.4885884864D+00 0.7001154689D+00 0.3919573931D+00 +**** +Ne 0 +S 3 1.00 + 0.2070156070D+03 0.1543289673D+00 + 0.3770815124D+02 0.5353281423D+00 + 0.1020529731D+02 0.4446345422D+00 +SP 3 1.00 + 0.8246315120D+01 -0.9996722919D-01 0.1559162750D+00 + 0.1916266291D+01 0.3995128261D+00 0.6076837186D+00 + 0.6232292721D+00 0.7001154689D+00 0.3919573931D+00 +**** +Na 0 +S 3 1.00 + 0.2507724300D+03 0.1543289673D+00 + 0.4567851117D+02 0.5353281423D+00 + 0.1236238776D+02 0.4446345422D+00 +SP 3 1.00 + 0.1204019274D+02 -0.9996722919D-01 0.1559162750D+00 + 0.2797881859D+01 0.3995128261D+00 0.6076837186D+00 + 0.9099580170D+00 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1478740622D+01 -0.2196203690D+00 0.1058760429D-01 + 0.4125648801D+00 0.2255954336D+00 0.5951670053D+00 + 0.1614750979D+00 0.9003984260D+00 0.4620010120D+00 +**** +Mg 0 +S 3 1.00 + 0.2992374137D+03 0.1543289673D+00 + 0.5450646845D+02 0.5353281423D+00 + 0.1475157752D+02 0.4446345422D+00 +SP 3 1.00 + 0.1512182352D+02 -0.9996722919D-01 0.1559162750D+00 + 0.3513986579D+01 0.3995128261D+00 0.6076837186D+00 + 0.1142857498D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1395448293D+01 -0.2196203690D+00 0.1058760429D-01 + 0.3893265318D+00 0.2255954336D+00 0.5951670053D+00 + 0.1523797659D+00 0.9003984260D+00 0.4620010120D+00 +**** +Al 0 +S 3 1.00 + 0.3514214767D+03 0.1543289673D+00 + 0.6401186067D+02 0.5353281423D+00 + 0.1732410761D+02 0.4446345422D+00 +SP 3 1.00 + 0.1889939621D+02 -0.9996722919D-01 0.1559162750D+00 + 0.4391813233D+01 0.3995128261D+00 0.6076837186D+00 + 0.1428353970D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1395448293D+01 -0.2196203690D+00 0.1058760429D-01 + 0.3893265318D+00 0.2255954336D+00 0.5951670053D+00 + 0.1523797659D+00 0.9003984260D+00 0.4620010120D+00 +**** +Si 0 +S 3 1.00 + 0.4077975514D+03 0.1543289673D+00 + 0.7428083305D+02 0.5353281423D+00 + 0.2010329229D+02 0.4446345422D+00 +SP 3 1.00 + 0.2319365606D+02 -0.9996722919D-01 0.1559162750D+00 + 0.5389706871D+01 0.3995128261D+00 0.6076837186D+00 + 0.1752899952D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1478740622D+01 -0.2196203690D+00 0.1058760429D-01 + 0.4125648801D+00 0.2255954336D+00 0.5951670053D+00 + 0.1614750979D+00 0.9003984260D+00 0.4620010120D+00 +**** +P 0 +S 3 1.00 + 0.4683656378D+03 0.1543289673D+00 + 0.8531338559D+02 0.5353281423D+00 + 0.2308913156D+02 0.4446345422D+00 +SP 3 1.00 + 0.2803263958D+02 -0.9996722919D-01 0.1559162750D+00 + 0.6514182577D+01 0.3995128261D+00 0.6076837186D+00 + 0.2118614352D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1743103231D+01 -0.2196203690D+00 0.1058760429D-01 + 0.4863213771D+00 0.2255954336D+00 0.5951670053D+00 + 0.1903428909D+00 0.9003984260D+00 0.4620010120D+00 +**** +S 0 +S 3 1.00 + 0.5331257359D+03 0.1543289673D+00 + 0.9710951830D+02 0.5353281423D+00 + 0.2628162542D+02 0.4446345422D+00 +SP 3 1.00 + 0.3332975173D+02 -0.9996722919D-01 0.1559162750D+00 + 0.7745117521D+01 0.3995128261D+00 0.6076837186D+00 + 0.2518952599D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2029194274D+01 -0.2196203690D+00 0.1058760429D-01 + 0.5661400518D+00 0.2255954336D+00 0.5951670053D+00 + 0.2215833792D+00 0.9003984260D+00 0.4620010120D+00 +**** +Cl 0 +S 3 1.00 + 0.6013456136D+03 0.1543289673D+00 + 0.1095358542D+03 0.5353281423D+00 + 0.2964467686D+02 0.4446345422D+00 +SP 3 1.00 + 0.3896041889D+02 -0.9996722919D-01 0.1559162750D+00 + 0.9053563477D+01 0.3995128261D+00 0.6076837186D+00 + 0.2944499834D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2129386495D+01 -0.2196203690D+00 0.1058760429D-01 + 0.5940934274D+00 0.2255954336D+00 0.5951670053D+00 + 0.2325241410D+00 0.9003984260D+00 0.4620010120D+00 +**** +Ar 0 +S 3 1.00 + 0.6744465184D+03 0.1543289673D+00 + 0.1228512753D+03 0.5353281423D+00 + 0.3324834945D+02 0.4446345422D+00 +SP 3 1.00 + 0.4516424392D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1049519900D+02 0.3995128261D+00 0.6076837186D+00 + 0.3413364448D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2621366518D+01 -0.2196203690D+00 0.1058760429D-01 + 0.7313546050D+00 0.2255954336D+00 0.5951670053D+00 + 0.2862472356D+00 0.9003984260D+00 0.4620010120D+00 +**** +K 0 +S 3 1.00 + 0.7715103681D+03 0.1543289673D+00 + 0.1405315766D+03 0.5353281423D+00 + 0.3803332899D+02 0.4446345422D+00 +SP 3 1.00 + 0.5240203979D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1217710710D+02 0.3995128261D+00 0.6076837186D+00 + 0.3960373165D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.3651583985D+01 -0.2196203690D+00 0.1058760429D-01 + 0.1018782663D+01 0.2255954336D+00 0.5951670053D+00 + 0.3987446295D+00 0.9003984260D+00 0.4620010120D+00 +SP 3 1.00 + 0.5039822505D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.1860011465D+00 0.1960641165D-01 0.5715227604D+00 + 0.8214006743D-01 0.1131034442D+01 0.5498949471D+00 +**** +Ca 0 +S 3 1.00 + 0.8540324951D+03 0.1543289673D+00 + 0.1555630851D+03 0.5353281423D+00 + 0.4210144179D+02 0.4446345422D+00 +SP 3 1.00 + 0.5956029944D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1384053270D+02 0.3995128261D+00 0.6076837186D+00 + 0.4501370797D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4374706256D+01 -0.2196203690D+00 0.1058760429D-01 + 0.1220531941D+01 0.2255954336D+00 0.5951670053D+00 + 0.4777079296D+00 0.9003984260D+00 0.4620010120D+00 +SP 3 1.00 + 0.4558489757D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.1682369410D+00 0.1960641165D-01 0.5715227604D+00 + 0.7429520696D-01 0.1131034442D+01 0.5498949471D+00 +**** +Sc 0 +S 3 1.00 + 0.9416624250D+03 0.1543289673D+00 + 0.1715249862D+03 0.5353281423D+00 + 0.4642135516D+02 0.4446345422D+00 +SP 3 1.00 + 0.6717668771D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1561041754D+02 0.3995128261D+00 0.6076837186D+00 + 0.5076992278D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4698159231D+01 -0.2277635023D+00 0.4951511155D-02 + 0.1433088313D+01 0.2175436044D+00 0.5777664691D+00 + 0.5529300235D+00 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6309328384D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2328538976D+00 0.1960641165D-01 0.5715227604D+00 + 0.1028307363D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.5517000679D+00 0.2197679508D+00 + 0.1682861055D+00 0.6555473627D+00 + 0.6493001120D-01 0.2865732590D+00 +**** +Ti 0 +S 3 1.00 + 0.1033571245D+04 0.1543289673D+00 + 0.1882662926D+03 0.5353281423D+00 + 0.5095220601D+02 0.4446345422D+00 +SP 3 1.00 + 0.7525120460D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1748676162D+02 0.3995128261D+00 0.6076837186D+00 + 0.5687237606D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.5395535474D+01 -0.2277635023D+00 0.4951511155D-02 + 0.1645810296D+01 0.2175436044D+00 0.5777664691D+00 + 0.6350047773D+00 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7122640246D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2628702203D+00 0.1960641165D-01 0.5715227604D+00 + 0.1160862609D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1645981194D+01 0.2197679508D+00 + 0.5020767279D+00 0.6555473627D+00 + 0.1937168103D+00 0.2865732590D+00 +**** +V 0 +S 3 1.00 + 0.1130762517D+04 0.1543289673D+00 + 0.2059698041D+03 0.5353281423D+00 + 0.5574346711D+02 0.4446345422D+00 +SP 3 1.00 + 0.8378385011D+02 -0.9996722919D-01 0.1559162750D+00 + 0.1946956493D+02 0.3995128261D+00 0.6076837186D+00 + 0.6332106784D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.6141151276D+01 -0.2277635023D+00 0.4951511155D-02 + 0.1873246881D+01 0.2175436044D+00 0.5777664691D+00 + 0.7227568825D+00 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7122640246D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2628702203D+00 0.1960641165D-01 0.5715227604D+00 + 0.1160862609D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.2964817927D+01 0.2197679508D+00 + 0.9043639676D+00 0.6555473627D+00 + 0.3489317337D+00 0.2865732590D+00 +**** +Cr 0 +S 3 1.00 + 0.1232320450D+04 0.1543289673D+00 + 0.2244687082D+03 0.5353281423D+00 + 0.6074999251D+02 0.4446345422D+00 +SP 3 1.00 + 0.9277462423D+02 -0.9996722919D-01 0.1559162750D+00 + 0.2155882749D+02 0.3995128261D+00 0.6076837186D+00 + 0.7011599810D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.6899488096D+01 -0.2277635023D+00 0.4951511155D-02 + 0.2104563782D+01 0.2175436044D+00 0.5777664691D+00 + 0.8120061343D+00 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7547780537D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2785605708D+00 0.1960641165D-01 0.5715227604D+00 + 0.1230152851D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.4241479241D+01 0.2197679508D+00 + 0.1293786360D+01 0.6555473627D+00 + 0.4991829993D+00 0.2865732590D+00 +**** +Mn 0 +S 3 1.00 + 0.1337153266D+04 0.1543289673D+00 + 0.2435641365D+03 0.5353281423D+00 + 0.6591796062D+02 0.4446345422D+00 +SP 3 1.00 + 0.1020220021D+03 -0.9996722919D-01 0.1559162750D+00 + 0.2370771923D+02 0.3995128261D+00 0.6076837186D+00 + 0.7710486098D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.7701960922D+01 -0.2277635023D+00 0.4951511155D-02 + 0.2349343572D+01 0.2175436044D+00 0.5777664691D+00 + 0.9064497869D+00 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6709822861D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2476346626D+00 0.1960641165D-01 0.5715227604D+00 + 0.1093580779D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.5426950461D+01 0.2197679508D+00 + 0.1655392868D+01 0.6555473627D+00 + 0.6387020316D+00 0.2865732590D+00 +**** +Fe 0 +S 3 1.00 + 0.1447400411D+04 0.1543289673D+00 + 0.2636457916D+03 0.5353281423D+00 + 0.7135284019D+02 0.4446345422D+00 +SP 3 1.00 + 0.1119194891D+03 -0.9996722919D-01 0.1559162750D+00 + 0.2600768236D+02 0.3995128261D+00 0.6076837186D+00 + 0.8458505490D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.8548569754D+01 -0.2277635023D+00 0.4951511155D-02 + 0.2607586250D+01 0.2175436044D+00 0.5777664691D+00 + 0.1006087840D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5921156814D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2185279254D+00 0.1960641165D-01 0.5715227604D+00 + 0.9650423590D-01 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.6411803475D+01 0.2197679508D+00 + 0.1955804428D+01 0.6555473627D+00 + 0.7546101508D+00 0.2865732590D+00 +**** +Co 0 +S 3 1.00 + 0.1560834670D+04 0.1543289673D+00 + 0.2843079835D+03 0.5353281423D+00 + 0.7694483567D+02 0.4446345422D+00 +SP 3 1.00 + 0.1222751047D+03 -0.9996722919D-01 0.1559162750D+00 + 0.2841410473D+02 0.3995128261D+00 0.6076837186D+00 + 0.9241148731D+01 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.9439314590D+01 -0.2277635023D+00 0.4951511155D-02 + 0.2879291816D+01 0.2175436044D+00 0.5777664691D+00 + 0.1110920295D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5921156814D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2185279254D+00 0.1960641165D-01 0.5715227604D+00 + 0.9650423590D-01 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.7664527389D+01 0.2197679508D+00 + 0.2337925151D+01 0.6555473627D+00 + 0.9020442052D+00 0.2865732590D+00 +**** +Ni 0 +S 3 1.00 + 0.1679771028D+04 0.1543289673D+00 + 0.3059723896D+03 0.5353281423D+00 + 0.8280806943D+02 0.4446345422D+00 +SP 3 1.00 + 0.1328588899D+03 -0.9996722919D-01 0.1559162750D+00 + 0.3087354878D+02 0.3995128261D+00 0.6076837186D+00 + 0.1004103627D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1033074335D+02 -0.2277635023D+00 0.4951511155D-02 + 0.3151206003D+01 0.2175436044D+00 0.5777664691D+00 + 0.1215833241D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6309328384D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2328538976D+00 0.1960641165D-01 0.5715227604D+00 + 0.1028307363D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.8627722755D+01 0.2197679508D+00 + 0.2631730438D+01 0.6555473627D+00 + 0.1015403419D+01 0.2865732590D+00 +**** +Cu 0 +S 3 1.00 + 0.1801806730D+04 0.1543289673D+00 + 0.3282013450D+03 0.5353281423D+00 + 0.8882409228D+02 0.4446345422D+00 +SP 3 1.00 + 0.1441212184D+03 -0.9996722919D-01 0.1559162750D+00 + 0.3349067173D+02 0.3995128261D+00 0.6076837186D+00 + 0.1089220588D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1130775402D+02 -0.2277635023D+00 0.4951511155D-02 + 0.3449225397D+01 0.2175436044D+00 0.5777664691D+00 + 0.1330818388D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6309328384D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2328538976D+00 0.1960641165D-01 0.5715227604D+00 + 0.1028307363D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.9647911930D+01 0.2197679508D+00 + 0.2942920654D+01 0.6555473627D+00 + 0.1135470278D+01 0.2865732590D+00 +**** +Zn 0 +S 3 1.00 + 0.1929432301D+04 0.1543289673D+00 + 0.3514485021D+03 0.5353281423D+00 + 0.9511568021D+02 0.4446345422D+00 +SP 3 1.00 + 0.1558416755D+03 -0.9996722919D-01 0.1559162750D+00 + 0.3621425391D+02 0.3995128261D+00 0.6076837186D+00 + 0.1177799934D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1228152744D+02 -0.2277635023D+00 0.4951511155D-02 + 0.3746257327D+01 0.2175436044D+00 0.5777664691D+00 + 0.1445422541D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.8897138854D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.3283603790D+00 0.1960641165D-01 0.5715227604D+00 + 0.1450074055D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1094737077D+02 0.2197679508D+00 + 0.3339297018D+01 0.6555473627D+00 + 0.1288404602D+01 0.2865732590D+00 +**** +Ga 0 +S 3 1.00 + 0.2061424532D+04 0.1543289673D+00 + 0.3754910517D+03 0.5353281423D+00 + 0.1016225324D+03 0.4446345422D+00 +SP 3 1.00 + 0.1677618680D+03 -0.9996722919D-01 0.1559162750D+00 + 0.3898425028D+02 0.3995128261D+00 0.6076837186D+00 + 0.1267888813D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1261505520D+02 -0.2277635023D+00 0.4951511155D-02 + 0.3847993927D+01 0.2175436044D+00 0.5777664691D+00 + 0.1484675684D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7985243736D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.2947057141D+00 0.1960641165D-01 0.5715227604D+00 + 0.1301451506D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1261505520D+02 0.2197679508D+00 + 0.3847993927D+01 0.6555473627D+00 + 0.1484675684D+01 0.2865732590D+00 +**** +Ge 0 +S 3 1.00 + 0.2196384229D+04 0.1543289673D+00 + 0.4000741292D+03 0.5353281423D+00 + 0.1082756726D+03 0.4446345422D+00 +SP 3 1.00 + 0.1803890380D+03 -0.9996722919D-01 0.1559162750D+00 + 0.4191853304D+02 0.3995128261D+00 0.6076837186D+00 + 0.1363320795D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1419665619D+02 -0.2277635023D+00 0.4951511155D-02 + 0.4330432640D+01 0.2175436044D+00 0.5777664691D+00 + 0.1670815538D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.9858325600D+00 -0.3088441214D+00 -0.1215468600D+00 + 0.3638342150D+00 0.1960641165D-01 0.5715227604D+00 + 0.1606730254D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1419665619D+02 0.2197679508D+00 + 0.4330432640D+01 0.6555473627D+00 + 0.1670815538D+01 0.2865732590D+00 +**** +As 0 +S 3 1.00 + 0.2337065673D+04 0.1543289673D+00 + 0.4256994298D+03 0.5353281423D+00 + 0.1152108790D+03 0.4446345422D+00 +SP 3 1.00 + 0.1931970535D+03 -0.9996722919D-01 0.1559162750D+00 + 0.4489484040D+02 0.3995128261D+00 0.6076837186D+00 + 0.1460119548D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1587163584D+02 -0.2277635023D+00 0.4951511155D-02 + 0.4841354819D+01 0.2175436044D+00 0.5777664691D+00 + 0.1867945198D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.1107681464D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.4088041239D+00 0.1960641165D-01 0.5715227604D+00 + 0.1805322114D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1587163584D+02 0.2197679508D+00 + 0.4841354819D+01 0.6555473627D+00 + 0.1867945198D+01 0.2865732590D+00 +**** +Se 0 +S 3 1.00 + 0.2480626814D+04 0.1543289673D+00 + 0.4518492708D+03 0.5353281423D+00 + 0.1222880464D+03 0.4446345422D+00 +SP 3 1.00 + 0.2061578780D+03 -0.9996722919D-01 0.1559162750D+00 + 0.4790665727D+02 0.3995128261D+00 0.6076837186D+00 + 0.1558073180D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1763999414D+02 -0.2277635023D+00 0.4951511155D-02 + 0.5380760465D+01 0.2175436044D+00 0.5777664691D+00 + 0.2076064666D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.1214644297D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.4482801363D+00 0.1960641165D-01 0.5715227604D+00 + 0.1979652346D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1763999414D+02 0.2197679508D+00 + 0.5380760465D+01 0.6555473627D+00 + 0.2076064666D+01 0.2865732590D+00 +**** +Br 0 +S 3 1.00 + 0.2629997471D+04 0.1543289673D+00 + 0.4790573224D+03 0.5353281423D+00 + 0.1296516070D+03 0.4446345422D+00 +SP 3 1.00 + 0.2198350255D+03 -0.9996722919D-01 0.1559162750D+00 + 0.5108493222D+02 0.3995128261D+00 0.6076837186D+00 + 0.1661440546D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.1950173109D+02 -0.2277635023D+00 0.4951511155D-02 + 0.5948649577D+01 0.2175436044D+00 0.5777664691D+00 + 0.2295173940D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.1396037488D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.5152256318D+00 0.1960641165D-01 0.5715227604D+00 + 0.2275290713D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.1950173109D+02 0.2197679508D+00 + 0.5948649577D+01 0.6555473627D+00 + 0.2295173940D+01 0.2865732590D+00 +**** +Kr 0 +S 3 1.00 + 0.2782160055D+04 0.1543289673D+00 + 0.5067739270D+03 0.5353281423D+00 + 0.1371528019D+03 0.4446345422D+00 +SP 3 1.00 + 0.2339514118D+03 -0.9996722919D-01 0.1559162750D+00 + 0.5436527681D+02 0.3995128261D+00 0.6076837186D+00 + 0.1768127533D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2145684671D+02 -0.2277635023D+00 0.4951511155D-02 + 0.6545022156D+01 0.2175436044D+00 0.5777664691D+00 + 0.2525273021D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.1590049336D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.5868282053D+00 0.1960641165D-01 0.5715227604D+00 + 0.2591495227D+00 0.1131034442D+01 0.5498949471D+00 +D 3 1.00 + 0.2145684671D+02 0.2197679508D+00 + 0.6545022156D+01 0.6555473627D+00 + 0.2525273021D+01 0.2865732590D+00 +**** +Rb 0 +S 3 1.00 + 0.2938601529D+04 0.1543289673D+00 + 0.5352699368D+03 0.5353281423D+00 + 0.1448649342D+03 0.4446345422D+00 +SP 3 1.00 + 0.2485070369D+03 -0.9996722919D-01 0.1559162750D+00 + 0.5774769105D+02 0.3995128261D+00 0.6076837186D+00 + 0.1878134142D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2350534097D+02 -0.2277635023D+00 0.4951511155D-02 + 0.7169878201D+01 0.2175436044D+00 0.5777664691D+00 + 0.2766361909D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.2247796820D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.8295783935D+00 0.1960641165D-01 0.5715227604D+00 + 0.3663505653D+00 0.1131034442D+01 0.5498949471D+00 +SP 3 1.00 + 0.4869939919D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2622161565D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1158254875D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.2350534097D+02 0.2197679508D+00 + 0.7169878201D+01 0.6555473627D+00 + 0.2766361909D+01 0.2865732590D+00 +**** +Sr 0 +S 3 1.00 + 0.3100983951D+04 0.1543289673D+00 + 0.5648480978D+03 0.5353281423D+00 + 0.1528699389D+03 0.4446345422D+00 +SP 3 1.00 + 0.2635019007D+03 -0.9996722919D-01 0.1559162750D+00 + 0.6123217493D+02 0.3995128261D+00 0.6076837186D+00 + 0.1991460372D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2557886692D+02 -0.2277635023D+00 0.4951511155D-02 + 0.7802369707D+01 0.2175436044D+00 0.5777664691D+00 + 0.3010396794D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.2461032403D+01 -0.3088441214D+00 -0.1215468600D+00 + 0.9082757342D+00 0.1960641165D-01 0.5715227604D+00 + 0.4011041407D+00 0.1131034442D+01 0.5498949471D+00 +SP 3 1.00 + 0.4370804803D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2353408164D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1039541771D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.2557886692D+02 0.2197679508D+00 + 0.7802369707D+01 0.6555473627D+00 + 0.3010396794D+01 0.2865732590D+00 +**** +Y 0 +S 3 1.00 + 0.3266026869D+04 0.1543289673D+00 + 0.5949108712D+03 0.5353281423D+00 + 0.1610060986D+03 0.4446345422D+00 +SP 3 1.00 + 0.2779377244D+03 -0.9996722919D-01 0.1559162750D+00 + 0.6458674989D+02 0.3995128261D+00 0.6076837186D+00 + 0.2100561561D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.2896238417D+02 -0.2277635023D+00 0.4951511155D-02 + 0.8834450311D+01 0.2175436044D+00 0.5777664691D+00 + 0.3408605577D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.2527274884D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.9841077401D+00 0.5761095338D-01 0.5852047641D+00 + 0.4332066499D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4370804803D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2353408164D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1039541771D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.2896238417D+02 0.2197679508D+00 + 0.8834450311D+01 0.6555473627D+00 + 0.3408605577D+01 0.2865732590D+00 +D 3 1.00 + 0.4576323918D+00 0.1250662138D+00 + 0.1781996813D+00 0.6686785577D+00 + 0.7844393842D-01 0.3052468245D+00 +**** +Zr 0 +S 3 1.00 + 0.3435348677D+04 0.1543289673D+00 + 0.6257530498D+03 0.5353281423D+00 + 0.1693531958D+03 0.4446345422D+00 +SP 3 1.00 + 0.2937830292D+03 -0.9996722919D-01 0.1559162750D+00 + 0.6826885797D+02 0.3995128261D+00 0.6076837186D+00 + 0.2220315144D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.3073293103D+02 -0.2277635023D+00 0.4951511155D-02 + 0.9374523538D+01 0.2175436044D+00 0.5777664691D+00 + 0.3616982618D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.2827607815D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1101055827D+01 0.5761095338D-01 0.5852047641D+00 + 0.4846874856D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4869939919D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2622161565D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1158254875D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.3073293103D+02 0.2197679508D+00 + 0.9374523538D+01 0.6555473627D+00 + 0.3616982618D+01 0.2865732590D+00 +D 3 1.00 + 0.8878301887D+00 0.1250662138D+00 + 0.3457164736D+00 0.6686785577D+00 + 0.1521852428D+00 0.3052468245D+00 +**** +Nb 0 +S 3 1.00 + 0.3610742864D+04 0.1543289673D+00 + 0.6577013201D+03 0.5353281423D+00 + 0.1779996445D+03 0.4446345422D+00 +SP 3 1.00 + 0.3100675728D+03 -0.9996722919D-01 0.1559162750D+00 + 0.7205303569D+02 0.3995128261D+00 0.6076837186D+00 + 0.2343388348D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.3301997858D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1007214594D+02 0.2175436044D+00 0.5777664691D+00 + 0.3886147028D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.3144798430D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1224568208D+01 0.5761095338D-01 0.5852047641D+00 + 0.5390579399D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4869939919D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2622161565D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1158254875D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.3301997858D+02 0.2197679508D+00 + 0.1007214594D+02 0.6555473627D+00 + 0.3886147028D+01 0.2865732590D+00 +D 3 1.00 + 0.1344878866D+01 0.1250662138D+00 + 0.5236888594D+00 0.6686785577D+00 + 0.2305291251D+00 0.3052468245D+00 +**** +Mo 0 +S 3 1.00 + 0.3788666115D+04 0.1543289673D+00 + 0.6901102623D+03 0.5353281423D+00 + 0.1867707691D+03 0.4446345422D+00 +SP 3 1.00 + 0.3264309567D+03 -0.9996722919D-01 0.1559162750D+00 + 0.7585553420D+02 0.3995128261D+00 0.6076837186D+00 + 0.2467057401D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.3546948129D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1081932234D+02 0.2175436044D+00 0.5777664691D+00 + 0.4174430912D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.3496895188D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1361672861D+01 0.5761095338D-01 0.5852047641D+00 + 0.5994117456D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.5129625081D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2761985970D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1220017773D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.3546948129D+02 0.2197679508D+00 + 0.1081932234D+02 0.6555473627D+00 + 0.4174430912D+01 0.2865732590D+00 +D 3 1.00 + 0.1702112315D+01 0.1250662138D+00 + 0.6627937127D+00 0.6686785577D+00 + 0.2917634240D+00 0.3052468245D+00 +**** +Tc 0 +S 3 1.00 + 0.3970868257D+04 0.1543289673D+00 + 0.7232986098D+03 0.5353281423D+00 + 0.1957528311D+03 0.4446345422D+00 +SP 3 1.00 + 0.3435846323D+03 -0.9996722919D-01 0.1559162750D+00 + 0.7984167952D+02 0.3995128261D+00 0.6076837186D+00 + 0.2596699219D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.3808991983D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1161863962D+02 0.2175436044D+00 0.5777664691D+00 + 0.4482832367D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.3829752708D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1491285854D+01 0.5761095338D-01 0.5852047641D+00 + 0.6564677040D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4616999826D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2485968963D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1098096207D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.3808991983D+02 0.2197679508D+00 + 0.1161863962D+02 0.6555473627D+00 + 0.4482832367D+01 0.2865732590D+00 +D 3 1.00 + 0.2101373228D+01 0.1250662138D+00 + 0.8182638428D+00 0.6686785577D+00 + 0.3602017580D+00 0.3052468245D+00 +**** +Ru 0 +S 3 1.00 + 0.4159274210D+04 0.1543289673D+00 + 0.7576169894D+03 0.5353281423D+00 + 0.2050407239D+03 0.4446345422D+00 +SP 3 1.00 + 0.3607986561D+03 -0.9996722919D-01 0.1559162750D+00 + 0.8384184843D+02 0.3995128261D+00 0.6076837186D+00 + 0.2726797127D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4071751678D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1242014044D+02 0.2175436044D+00 0.5777664691D+00 + 0.4792076302D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.4197516371D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1634491118D+01 0.5761095338D-01 0.5852047641D+00 + 0.7195070139D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4131354848D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2224479167D+00 -0.1972567438D+00 0.6290323690D+00 + 0.9825915662D-01 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.4071751678D+02 0.2197679508D+00 + 0.1242014044D+02 0.6555473627D+00 + 0.4792076302D+01 0.2865732590D+00 +D 3 1.00 + 0.2390895761D+01 0.1250662138D+00 + 0.9310024167D+00 0.6686785577D+00 + 0.4098295558D+00 0.3052468245D+00 +**** +Rh 0 +S 3 1.00 + 0.4350077794D+04 0.1543289673D+00 + 0.7923721005D+03 0.5353281423D+00 + 0.2144468133D+03 0.4446345422D+00 +SP 3 1.00 + 0.3784334264D+03 -0.9996722919D-01 0.1559162750D+00 + 0.8793978981D+02 0.3995128261D+00 0.6076837186D+00 + 0.2860074899D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4352179455D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1327553454D+02 0.2175436044D+00 0.5777664691D+00 + 0.5122113939D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.4540857408D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1768186338D+01 0.5761095338D-01 0.5852047641D+00 + 0.7783599789D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4131354848D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2224479167D+00 -0.1972567438D+00 0.6290323690D+00 + 0.9825915662D-01 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.4352179455D+02 0.2197679508D+00 + 0.1327553454D+02 0.6555473627D+00 + 0.5122113939D+01 0.2865732590D+00 +D 3 1.00 + 0.2779066094D+01 0.1250662138D+00 + 0.1082153932D+01 0.6686785577D+00 + 0.4763668250D+00 0.3052468245D+00 +**** +Pd 0 +S 3 1.00 + 0.4545160269D+04 0.1543289673D+00 + 0.8279066168D+03 0.5353281423D+00 + 0.2240638402D+03 0.4446345422D+00 +SP 3 1.00 + 0.3964889433D+03 -0.9996722919D-01 0.1559162750D+00 + 0.9213550365D+02 0.3995128261D+00 0.6076837186D+00 + 0.2996532535D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4641945097D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1415941211D+02 0.2175436044D+00 0.5777664691D+00 + 0.5463141383D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.4919104589D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1915473830D+01 0.5761095338D-01 0.5852047641D+00 + 0.8431962954D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4370804803D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2353408164D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1039541771D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.4641945097D+02 0.2197679508D+00 + 0.1415941211D+02 0.6555473627D+00 + 0.5463141383D+01 0.2865732590D+00 +D 3 1.00 + 0.3025977448D+01 0.1250662138D+00 + 0.1178299934D+01 0.6686785577D+00 + 0.5186905316D+00 0.3052468245D+00 +**** +Ag 0 +S 3 1.00 + 0.4744521634D+04 0.1543289673D+00 + 0.8642205383D+03 0.5353281423D+00 + 0.2338918045D+03 0.4446345422D+00 +SP 3 1.00 + 0.4149652069D+03 -0.9996722919D-01 0.1559162750D+00 + 0.9642898995D+02 0.3995128261D+00 0.6076837186D+00 + 0.3136170035D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.4941048605D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1507177314D+02 0.2175436044D+00 0.5777664691D+00 + 0.5815158634D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5290230450D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2059988316D+01 0.5761095338D-01 0.5852047641D+00 + 0.9068119281D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.4370804803D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.2353408164D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1039541771D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.4941048605D+02 0.2197679508D+00 + 0.1507177314D+02 0.6555473627D+00 + 0.5815158634D+01 0.2865732590D+00 +D 3 1.00 + 0.3283395668D+01 0.1250662138D+00 + 0.1278537254D+01 0.6686785577D+00 + 0.5628152469D+00 0.3052468245D+00 +**** +Cd 0 +S 3 1.00 + 0.4950261905D+04 0.1543289673D+00 + 0.9016963856D+03 0.5353281423D+00 + 0.2440342313D+03 0.4446345422D+00 +SP 3 1.00 + 0.4334469385D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1007237469D+03 0.3995128261D+00 0.6076837186D+00 + 0.3275848861D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.5259279235D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1604247800D+02 0.2175436044D+00 0.5777664691D+00 + 0.6189686744D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5674851796D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2209757875D+01 0.5761095338D-01 0.5852047641D+00 + 0.9727408566D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.5949150981D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.3203250000D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1414931855D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.5259279235D+02 0.2197679508D+00 + 0.1604247800D+02 0.6555473627D+00 + 0.6189686744D+01 0.2865732590D+00 +D 3 1.00 + 0.3642963976D+01 0.1250662138D+00 + 0.1418551290D+01 0.6686785577D+00 + 0.6244497700D+00 0.3052468245D+00 +**** +In 0 +S 3 1.00 + 0.5158224714D+04 0.1543289673D+00 + 0.9395770707D+03 0.5353281423D+00 + 0.2542862231D+03 0.4446345422D+00 +SP 3 1.00 + 0.4523313223D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1051120716D+03 0.3995128261D+00 0.6076837186D+00 + 0.3418570799D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.5597539769D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1707428044D+02 0.2175436044D+00 0.5777664691D+00 + 0.6587788204D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5048549180D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.1965878882D+01 0.5761095338D-01 0.5852047641D+00 + 0.8653847237D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.5669230612D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.3052530187D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1348356264D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.5597539769D+02 0.2197679508D+00 + 0.1707428044D+02 0.6555473627D+00 + 0.6587788204D+01 0.2865732590D+00 +D 3 1.00 + 0.5048549180D+01 0.1250662138D+00 + 0.1965878882D+01 0.6686785577D+00 + 0.8653847237D+00 0.3052468245D+00 +**** +Sn 0 +S 3 1.00 + 0.5370466413D+04 0.1543289673D+00 + 0.9782371611D+03 0.5353281423D+00 + 0.2647491522D+03 0.4446345422D+00 +SP 3 1.00 + 0.4720515322D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1096946243D+03 0.3995128261D+00 0.6076837186D+00 + 0.3567609636D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.5915141188D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1804306600D+02 0.2175436044D+00 0.5777664691D+00 + 0.6961575790D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.5583138529D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2174045204D+01 0.5761095338D-01 0.5852047641D+00 + 0.9570200509D+00 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.6235816420D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.3357601616D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1483111678D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.5915141188D+02 0.2197679508D+00 + 0.1804306600D+02 0.6555473627D+00 + 0.6961575790D+01 0.2865732590D+00 +D 3 1.00 + 0.5583138529D+01 0.1250662138D+00 + 0.2174045204D+01 0.6686785577D+00 + 0.9570200509D+00 0.3052468245D+00 +**** +Sb 0 +S 3 1.00 + 0.5586987002D+04 0.1543289673D+00 + 0.1017676657D+04 0.5353281423D+00 + 0.2754230189D+03 0.4446345422D+00 +SP 3 1.00 + 0.4921924888D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1143749494D+03 0.3995128261D+00 0.6076837186D+00 + 0.3719828336D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.6252179775D+02 -0.2277635023D+00 0.4951511155D-02 + 0.1907114112D+02 0.2175436044D+00 0.5777664691D+00 + 0.7358239131D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6120693149D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2383366187D+01 0.5761095338D-01 0.5852047641D+00 + 0.1049163663D+01 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.6529226928D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.3515585034D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1552895732D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.6252179775D+02 0.2197679508D+00 + 0.1907114112D+02 0.6555473627D+00 + 0.7358239131D+01 0.2865732590D+00 +D 3 1.00 + 0.6120693149D+01 0.1250662138D+00 + 0.2383366187D+01 0.6686785577D+00 + 0.1049163663D+01 0.3052468245D+00 +**** +Te 0 +S 3 1.00 + 0.5810061591D+04 0.1543289673D+00 + 0.1058309972D+04 0.5353281423D+00 + 0.2864199797D+03 0.4446345422D+00 +SP 3 1.00 + 0.5127541920D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1191530471D+03 0.3995128261D+00 0.6076837186D+00 + 0.3875226900D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.6598556227D+02 -0.2277635023D+00 0.4951511155D-02 + 0.2012769970D+02 0.2175436044D+00 0.5777664691D+00 + 0.7765892279D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.6707956921D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2612043655D+01 0.5761095338D-01 0.5852047641D+00 + 0.1149828048D+01 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.7012713483D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.3775912653D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1667887020D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.6598556227D+02 0.2197679508D+00 + 0.2012769970D+02 0.6555473627D+00 + 0.7765892279D+01 0.2865732590D+00 +D 3 1.00 + 0.6707956921D+01 0.1250662138D+00 + 0.2612043655D+01 0.6686785577D+00 + 0.1149828048D+01 0.3052468245D+00 +**** +I 0 +S 3 1.00 + 0.6035183623D+04 0.1543289673D+00 + 0.1099316231D+04 0.5353281423D+00 + 0.2975178737D+03 0.4446345422D+00 +SP 3 1.00 + 0.5337366418D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1240289171D+03 0.3995128261D+00 0.6076837186D+00 + 0.4033805328D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.6954270545D+02 -0.2277635023D+00 0.4951511155D-02 + 0.2121274175D+02 0.2175436044D+00 0.5777664691D+00 + 0.8184535234D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7295991196D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.2841021154D+01 0.5761095338D-01 0.5852047641D+00 + 0.1250624506D+01 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.7900364582D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.4253857892D+00 -0.1972567438D+00 0.6290323690D+00 + 0.1879003836D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.6954270545D+02 0.2197679508D+00 + 0.2121274175D+02 0.6555473627D+00 + 0.8184535234D+01 0.2865732590D+00 +D 3 1.00 + 0.7295991196D+01 0.1250662138D+00 + 0.2841021154D+01 0.6686785577D+00 + 0.1250624506D+01 0.3052468245D+00 +**** +Xe 0 +S 3 1.00 + 0.6264584546D+04 0.1543289673D+00 + 0.1141101895D+04 0.5353281423D+00 + 0.3088267052D+03 0.4446345422D+00 +SP 3 1.00 + 0.5551398381D+03 -0.9996722919D-01 0.1559162750D+00 + 0.1290025597D+03 0.3995128261D+00 0.6076837186D+00 + 0.4195563620D+02 0.7001154689D+00 0.3919573931D+00 +SP 3 1.00 + 0.7307773504D+02 -0.2277635023D+00 0.4951511155D-02 + 0.2229103845D+02 0.2175436044D+00 0.5777664691D+00 + 0.8600575622D+01 0.9166769611D+00 0.4846460366D+00 +SP 3 1.00 + 0.7908728280D+01 -0.3306100626D+00 -0.1283927634D+00 + 0.3079617799D+01 0.5761095338D-01 0.5852047641D+00 + 0.1355655337D+01 0.1115578745D+01 0.5439442040D+00 +SP 3 1.00 + 0.8910101433D+00 -0.3842642608D+00 -0.3481691526D+00 + 0.4797538759D+00 -0.1972567438D+00 0.6290323690D+00 + 0.2119157236D+00 0.1375495512D+01 0.6662832743D+00 +D 3 1.00 + 0.7307773504D+02 0.2197679508D+00 + 0.2229103845D+02 0.6555473627D+00 + 0.8600575622D+01 0.2865732590D+00 +D 3 1.00 + 0.7908728280D+01 0.1250662138D+00 + 0.3079617799D+01 0.6686785577D+00 + 0.1355655337D+01 0.3052468245D+00 +**** + diff --git a/codes/cc2.py b/codes/cc2.py new file mode 100644 index 0000000..3bcfcf6 --- /dev/null +++ b/codes/cc2.py @@ -0,0 +1,133 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [2] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # -0.50000 * t1(a,j) t1(b,i) + T += -0.50000 * einsum('ijab,aj,bi->' ,g[o,o,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [2] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 1.0000 * t1(a,k) t1(b,j) + T += 1.0000 * einsum('jkib,ak,bj->ai' ,g[o,o,o,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(b,j) t2(a,c,i,k) + T += 1.0000 * einsum('jkbc,bj,acik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * f(j,b) t1(a,j) t1(b,i) + T += -1.0000 * einsum('jb,aj,bi->ai' ,f[o,v] ,t1 ,t1, optimize=True) + + # -1.0000 * t1(b,j) t1(c,i) + T += -1.0000 * einsum('ajbc,bj,ci->ai' ,g[v,o,v,v] ,t1 ,t1, optimize=True) + + # -0.50000 * t1(a,j) t2(b,c,i,k) + T += -0.50000 * einsum('jkbc,aj,bcik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -0.50000 * t1(b,i) t2(a,c,j,k) + T += -0.50000 * einsum('jkbc,bi,acjk->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(a,k) t1(b,j) t1(c,i) + T += -1.0000 * einsum('jkbc,ak,bj,ci->ai' ,g[o,o,v,v] ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [2] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T = t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(c,i) t1(d,j) + T += 1.0000 * einsum('abcd,ci,dj->abij' ,g[v,v,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(a,k) t1(b,l) + T += 1.0000 * einsum('klij,ak,bl->abij' ,g[o,o,o,o] ,t1 ,t1, optimize=True) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(a,k) t1(b,l) t1(c,j) + t = 1.0000 * einsum('klic,ak,bl,cj->abij' ,g[o,o,o,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(a,k) t1(b,l) t1(c,i) t1(d,j) + T += 1.0000 * einsum('klcd,ak,bl,ci,dj->abij' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t1, optimize=True) + + # -1.0000 * P(a,b)P(i,j) t1(b,k) t1(c,j) + t = -1.0000 * einsum('akic,bk,cj->abij' ,g[v,o,o,v] ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b) t1(b,k) t1(c,i) t1(d,j) + t = -1.0000 * einsum('akcd,bk,ci,dj->abij' ,g[v,o,v,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + diff --git a/codes/cc3.py b/codes/cc3.py new file mode 100644 index 0000000..7f56bea --- /dev/null +++ b/codes/cc3.py @@ -0,0 +1,502 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [3] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # -0.50000 * t1(a,j) t1(b,i) + T += -0.50000 * einsum('ijab,aj,bi->' ,g[o,o,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [3] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 0.2500 * t3(a,b,c,i,j,k) + T += 0.2500 * einsum('jkbc,abcijk->ai' ,g[o,o,v,v] ,t3, optimize=True) + + # 1.0000 * t1(a,k) t1(b,j) + T += 1.0000 * einsum('jkib,ak,bj->ai' ,g[o,o,o,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(b,j) t2(a,c,i,k) + T += 1.0000 * einsum('jkbc,bj,acik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * f(j,b) t1(a,j) t1(b,i) + T += -1.0000 * einsum('jb,aj,bi->ai' ,f[o,v] ,t1 ,t1, optimize=True) + + # -1.0000 * t1(b,j) t1(c,i) + T += -1.0000 * einsum('ajbc,bj,ci->ai' ,g[v,o,v,v] ,t1 ,t1, optimize=True) + + # -0.50000 * t1(a,j) t2(b,c,i,k) + T += -0.50000 * einsum('jkbc,aj,bcik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -0.50000 * t1(b,i) t2(a,c,j,k) + T += -0.50000 * einsum('jkbc,bi,acjk->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(a,k) t1(b,j) t1(c,i) + T += -1.0000 * einsum('jkbc,ak,bj,ci->ai' ,g[o,o,v,v] ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [3] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(k,c) t3(a,b,c,i,j,k) + T = 1.0000 * einsum('kc,abcijk->abij' ,f[o,v] ,t3, optimize=True) + + # 0.5000 * t2(c,d,i,j) + T += 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(c,i) t1(d,j) + T += 1.0000 * einsum('abcd,ci,dj->abij' ,g[v,v,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(a,k) t1(b,l) + T += 1.0000 * einsum('klij,ak,bl->abij' ,g[o,o,o,o] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(c,k) t3(a,b,d,i,j,l) + T += 1.0000 * einsum('klcd,ck,abdijl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + + # 0.5000 * P(i,j) t3(a,b,c,j,k,l) + t = 0.5000 * einsum('klic,abcjkl->abij' ,g[o,o,o,v] ,t3, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t3(b,c,d,i,j,k) + t = -0.50000 * einsum('akcd,bcdijk->abij' ,g[v,o,v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) + T += 0.2500 * einsum('klcd,abkl,cdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) f(k,c) t1(a,k) t2(b,c,i,j) + t = 1.0000 * einsum('kc,ak,bcij->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) f(k,c) t1(c,i) t2(a,b,j,k) + t = 1.0000 * einsum('kc,ci,abjk->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(a,b) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('akcd,ck,bdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) + t = 1.0000 * einsum('klcd,acik,bdjl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t1(c,j) t2(a,b,k,l) + t = 0.5000 * einsum('klic,cj,abkl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * t1(a,k) t1(b,l) t2(c,d,i,j) + T += 0.5000 * einsum('klcd,ak,bl,cdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(a,b) t1(a,k) t3(b,c,d,i,j,l) + t = 0.5000 * einsum('klcd,ak,bcdijl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * t1(c,i) t1(d,j) t2(a,b,k,l) + T += 0.5000 * einsum('klcd,ci,dj,abkl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(i,j) t1(c,i) t3(a,b,d,j,k,l) + t = 0.5000 * einsum('klcd,ci,abdjkl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(c,d,j,k) + t = 0.5000 * einsum('klcd,abil,cdjk->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(i,j) t1(c,k) t2(a,b,j,l) + t = -1.0000 * einsum('klic,ck,abjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) t1(b,k) t2(c,d,i,j) + t = -0.50000 * einsum('akcd,bk,cdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t2(a,c,i,j) t2(b,d,k,l) + t = -0.50000 * einsum('klcd,acij,bdkl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(c,i) t2(b,d,j,k) + t = 1.0000 * einsum('akcd,ci,bdjk->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(a,k) t1(b,l) t1(c,j) + t = 1.0000 * einsum('klic,ak,bl,cj->abij' ,g[o,o,o,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(a,k) t1(b,l) t1(c,i) t1(d,j) + T += 1.0000 * einsum('klcd,ak,bl,ci,dj->abij' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * P(a,b) t1(a,l) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('klcd,al,ck,bdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,k) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('klcd,ck,di,abjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(b,k) t1(c,j) + t = -1.0000 * einsum('akic,bk,cj->abij' ,g[v,o,o,v] ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b) t1(b,k) t1(c,i) t1(d,j) + t = -1.0000 * einsum('akcd,bk,ci,dj->abij' ,g[v,o,v,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t2(b,c,j,l) + t = -1.0000 * einsum('klic,ak,bcjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t1(c,i) t2(b,d,j,l) + t = -1.0000 * einsum('klcd,ak,ci,bdjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + +def cc_triples(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [3] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(c,d) t3(a,b,d,i,j,k) + T = 1.0000 * einsum('cd,abdijk->abcijk' ,f[v,v] ,t3, optimize=True) + + # 1.0000 * t2(a,b,k,l) + T += 1.0000 * einsum('clij,abkl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + + # -1.0000 * f(l,k) t3(a,b,c,i,j,l) + T += -1.0000 * einsum('lk,abcijl->abcijk' ,f[o,o] ,t3, optimize=True) + + # -1.0000 * t2(c,d,i,j) + T += -1.0000 * einsum('abkd,cdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + + # 1.0000 * P(a,b) f(a,d) t3(b,c,d,i,j,k) + t = 1.0000 * einsum('ad,bcdijk->abcijk' ,f[v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * f(l,d) t2(a,b,k,l) t2(c,d,i,j) + T += 1.0000 * einsum('ld,abkl,cdij->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) t2(b,d,i,j) + t = 1.0000 * einsum('ackd,bdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t2(b,c,k,l) + t = 1.0000 * einsum('alij,bckl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) f(l,i) t3(a,b,c,j,k,l) + t = -1.0000 * einsum('li,abcjkl->abcijk' ,f[o,o] ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * f(l,d) t1(c,l) t3(a,b,d,i,j,k) + T += -1.0000 * einsum('ld,cl,abdijk->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + + # -1.0000 * f(l,d) t1(d,k) t3(a,b,c,i,j,l) + T += -1.0000 * einsum('ld,dk,abcijl->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + + # -1.0000 * P(i,j) t2(c,d,j,k) + t = -1.0000 * einsum('abid,cdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(d,k) t2(c,e,i,j) + T += -1.0000 * einsum('abde,dk,ceij->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * P(i,j) t2(a,b,j,l) + t = -1.0000 * einsum('clik,abjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(c,l) t2(a,b,k,m) + T += -1.0000 * einsum('lmij,cl,abkm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + + # 1.0000 * P(a,b) f(l,d) t2(a,d,i,j) t2(b,c,k,l) + t = 1.0000 * einsum('ld,adij,bckl->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t2(b,d,j,k) + t = 1.0000 * einsum('acid,bdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('acde,dk,beij->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t1(b,l) t2(c,d,i,j) + t = 1.0000 * einsum('alkd,bl,cdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(d,j) t2(a,b,k,l) + t = 1.0000 * einsum('clid,dj,abkl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t2(b,d,i,j) + t = 1.0000 * einsum('clkd,al,bdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('clkd,di,abjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * t1(d,i) t1(e,j) t2(a,b,k,l) + T += 1.0000 * einsum('clde,di,ej,abkl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 1.0000 * P(i,j) t1(c,l) t2(a,b,j,m) + t = 1.0000 * einsum('lmik,cl,abjm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) f(l,d) t1(a,l) t3(b,c,d,i,j,k) + t = -1.0000 * einsum('ld,al,bcdijk->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) f(l,d) t1(d,i) t3(a,b,c,j,k,l) + t = -1.0000 * einsum('ld,di,abcjkl->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) f(l,d) t2(a,d,i,k) t2(b,c,j,l) + t = -1.0000 * einsum('ld,adik,bcjl->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(d,i) t2(c,e,j,k) + t = -1.0000 * einsum('abde,di,cejk->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t2(b,c,j,l) + t = -1.0000 * einsum('alik,bcjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(c,l) t2(b,d,i,j) + t = -1.0000 * einsum('alkd,cl,bdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(d,k) t2(a,b,j,l) + t = -1.0000 * einsum('clid,dk,abjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(a,l) t2(b,c,k,m) + t = -1.0000 * einsum('lmij,al,bckm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * t1(a,l) t1(b,m) t2(c,d,i,j) + T += -1.0000 * einsum('lmkd,al,bm,cdij->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + + # 1.0000 * P(b,c)P(i,j) f(l,d) t2(a,b,i,l) t2(c,d,j,k) + t = 1.0000 * einsum('ld,abil,cdjk->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(2, 1) - t.swapaxes(4, 3) + t.swapaxes(2, 1).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('acde,di,bejk->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(b,l) t2(c,d,j,k) + t = 1.0000 * einsum('alid,bl,cdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,j) t2(b,c,k,l) + t = 1.0000 * einsum('alid,dj,bckl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t2(b,c,j,l) + t = 1.0000 * einsum('alkd,di,bcjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(b,l) t1(d,k) t2(c,e,i,j) + t = 1.0000 * einsum('alde,bl,dk,ceij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t1(d,i) t1(e,j) t2(b,c,k,l) + t = 1.0000 * einsum('alde,di,ej,bckl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,d,j,k) + t = 1.0000 * einsum('clid,al,bdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('clde,al,dk,beij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,c,j,m) + t = 1.0000 * einsum('lmik,al,bcjm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(c,l) t1(d,k) t2(a,b,j,m) + t = 1.0000 * einsum('lmid,cl,dk,abjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(c,m) t2(b,d,i,j) + t = 1.0000 * einsum('lmkd,al,cm,bdij->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(c,l) t2(b,d,j,k) + t = -1.0000 * einsum('alid,cl,bdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(d,k) t2(b,c,j,l) + t = -1.0000 * einsum('alid,dk,bcjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(c,l) t1(d,k) t2(b,e,i,j) + t = -1.0000 * einsum('alde,cl,dk,beij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(d,i) t1(e,k) t2(a,b,j,l) + t = -1.0000 * einsum('clde,di,ek,abjl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(a,l) t1(b,m) t2(c,d,j,k) + t = -1.0000 * einsum('lmid,al,bm,cdjk->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(c,l) t1(d,j) t2(a,b,k,m) + t = -1.0000 * einsum('lmid,cl,dj,abkm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(c,l) t1(d,i) t2(a,b,j,m) + t = -1.0000 * einsum('lmkd,cl,di,abjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(a,l) t1(b,m) t1(d,k) t2(c,e,i,j) + T += -1.0000 * einsum('lmde,al,bm,dk,ceij->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + + # -1.0000 * t1(c,l) t1(d,i) t1(e,j) t2(a,b,k,m) + T += -1.0000 * einsum('lmde,cl,di,ej,abkm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + + # 1.0000 * P(a,b)P(i,j) t1(b,l) t1(d,i) t2(c,e,j,k) + t = 1.0000 * einsum('alde,bl,di,cejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('clde,al,di,bejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(c,m) t2(b,d,j,k) + t = 1.0000 * einsum('lmid,al,cm,bdjk->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,k) t2(b,c,j,m) + t = 1.0000 * einsum('lmid,al,dk,bcjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(c,m) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('lmde,al,cm,dk,beij->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,l) t1(d,i) t1(e,k) t2(a,b,j,m) + t = 1.0000 * einsum('lmde,cl,di,ek,abjm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(c,l) t1(d,i) t2(b,e,j,k) + t = -1.0000 * einsum('alde,cl,di,bejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(d,i) t1(e,k) t2(b,c,j,l) + t = -1.0000 * einsum('alde,di,ek,bcjl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,j) t2(b,c,k,m) + t = -1.0000 * einsum('lmid,al,dj,bckm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t2(b,c,j,m) + t = -1.0000 * einsum('lmkd,al,di,bcjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(a,l) t1(b,m) t1(d,i) t2(c,e,j,k) + t = -1.0000 * einsum('lmde,al,bm,di,cejk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(a,l) t1(d,i) t1(e,j) t2(b,c,k,m) + t = -1.0000 * einsum('lmde,al,di,ej,bckm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(c,m) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('lmde,al,cm,di,bejk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t1(e,k) t2(b,c,j,m) + t = 1.0000 * einsum('lmde,al,di,ek,bcjm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + return T + diff --git a/codes/cc_rdm.py b/codes/cc_rdm.py new file mode 100644 index 0000000..aae8898 --- /dev/null +++ b/codes/cc_rdm.py @@ -0,0 +1,320 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_oprdm(o, v, t1=None, t2=None, l1=None, l2=None): + + ''' + COGUS generated level [CC] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes, eye, zeros + + ns = sum(t1.shape) + d = zeros((ns, ns)) + kd = eye(ns) + + # density matrix block [oo] + + # -1.0000 * l1(j,a) t1(a,i) + d[o,o] = -1.0000 * einsum('ja,ai->ij' ,l1 ,t1, optimize=True) + + # -0.50000 * l2(j,k,a,b) t2(a,b,i,k) + d[o,o] += -0.50000 * einsum('jkab,abik->ij' ,l2 ,t2, optimize=True) + + # 1.0000 * kd[o,o] + d[o,o] += 1.0000 * einsum('ij->ij' ,kd[o,o], optimize=True) + + # density matrix block [ov] + + # 1.0000 * l1(j,b) t2(a,b,i,j) + d[o,v] = 1.0000 * einsum('jb,abij->ia' ,l1 ,t2, optimize=True) + + # -1.0000 * l1(j,b) t1(a,j) t1(b,i) + d[o,v] += -1.0000 * einsum('jb,aj,bi->ia' ,l1 ,t1 ,t1, optimize=True) + + # -0.50000 * l2(j,k,b,c) t1(a,j) t2(b,c,i,k) + d[o,v] += -0.50000 * einsum('jkbc,aj,bcik->ia' ,l2 ,t1 ,t2, optimize=True) + + # -0.50000 * l2(j,k,b,c) t1(b,i) t2(a,c,j,k) + d[o,v] += -0.50000 * einsum('jkbc,bi,acjk->ia' ,l2 ,t1 ,t2, optimize=True) + + # 1.0000 * t1(a,i) + d[o,v] += 1.0000 * einsum('ai->ia' ,t1, optimize=True) + + # density matrix block [vo] + + # 1.0000 * l1(i,a) + d[v,o] = 1.0000 * einsum('ia->ai' ,l1, optimize=True) + + # density matrix block [vv] + + # 1.0000 * l1(i,a) t1(b,i) + d[v,v] = 1.0000 * einsum('ia,bi->ab' ,l1 ,t1, optimize=True) + + # 0.5000 * l2(i,j,a,c) t2(b,c,i,j) + d[v,v] += 0.5000 * einsum('ijac,bcij->ab' ,l2 ,t2, optimize=True) + + return d + +def cc_tprdm(o, v, t1=None, t2=None, l1=None, l2=None): + + ''' + COGUS generated level [CC] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes, eye, zeros + + ns = sum(t1.shape) + d = zeros((ns, ns, ns, ns)) + kd = eye(ns) + + # density matrix block [oooo] + + # 0.5000 * t2(a,b,i,j) l2(k,l,a,b) + d[o,o,o,o] = 0.5000 * einsum('abij,klab->ijkl' ,t2 ,l2, optimize=True) + + # -1.0000 * P(i,j) kd[o,o] kd[o,o] + t = -1.0000 * einsum('il,jk->ijkl' ,kd[o,o], kd[o,o], optimize=True) + d[o,o,o,o] += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t1(a,i) t1(b,j) l2(k,l,a,b) + t = 0.5000 * einsum('ai,bj,klab->ijkl' ,t1 ,t1 ,l2, optimize=True) + d[o,o,o,o] += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j)P(k,l) t1(a,i) l1(k,a) kd[o,o] + t = -1.0000 * einsum('ai,ka,jl->ijkl' ,t1 ,l1 ,kd[o,o], optimize=True) + d[o,o,o,o] += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -0.50000 * P(i,j)P(k,l) t2(a,b,i,m) l2(k,m,a,b) kd[o,o] + t = -0.50000 * einsum('abim,kmab,jl->ijkl' ,t2 ,l2 ,kd[o,o], optimize=True) + d[o,o,o,o] += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # density matrix block [ooov] + + # 1.0000 * t2(a,b,i,j) l1(k,b) + d[o,o,o,v] = 1.0000 * einsum('abij,kb->ijka' ,t2 ,l1, optimize=True) + + # 0.5000 * t1(a,l) t2(b,c,i,j) l2(k,l,b,c) + d[o,o,o,v] += 0.5000 * einsum('al,bcij,klbc->ijka' ,t1 ,t2 ,l2, optimize=True) + + # -1.0000 * P(i,j) t1(a,i) kd[o,o] + t = -1.0000 * einsum('ai,jk->ijka' ,t1 ,kd[o,o], optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(a,i) t1(b,j) l1(k,b) + t = 1.0000 * einsum('ai,bj,kb->ijka' ,t1 ,t1 ,l1, optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t1(a,i) t2(b,c,j,l) l2(k,l,b,c) + t = 0.5000 * einsum('ai,bcjl,klbc->ijka' ,t1 ,t2 ,l2, optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(b,i) t2(a,c,j,l) l2(k,l,b,c) + t = -1.0000 * einsum('bi,acjl,klbc->ijka' ,t1 ,t2 ,l2, optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t2(a,b,i,l) l1(l,b) kd[o,o] + t = -1.0000 * einsum('abil,lb,jk->ijka' ,t2 ,l1 ,kd[o,o], optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(a,l) t1(b,i) l1(l,b) kd[o,o] + t = 1.0000 * einsum('al,bi,lb,jk->ijka' ,t1 ,t1 ,l1 ,kd[o,o], optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t1(a,l) t1(b,i) t1(c,j) l2(k,l,b,c) + t = 0.5000 * einsum('al,bi,cj,klbc->ijka' ,t1 ,t1 ,t1 ,l2, optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t1(a,l) t2(b,c,i,m) l2(l,m,b,c) kd[o,o] + t = 0.5000 * einsum('al,bcim,lmbc,jk->ijka' ,t1 ,t2 ,l2 ,kd[o,o], optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t1(b,i) t2(a,c,l,m) l2(l,m,b,c) kd[o,o] + t = 0.5000 * einsum('bi,aclm,lmbc,jk->ijka' ,t1 ,t2 ,l2 ,kd[o,o], optimize=True) + d[o,o,o,v] += t - t.swapaxes(1, 0) + + # density matrix block [oovo] + d[o,o,v,o] -= d[o,o,o,v].swapaxes(3, 2) + + + # density matrix block [ovoo] + + # 1.0000 * t1(b,i) l2(k,l,a,b) + d[o,v,o,o] = 1.0000 * einsum('bi,klab->iakl' ,t1 ,l2, optimize=True) + + # -1.0000 * P(k,l) l1(k,a) kd[o,o] + t = -1.0000 * einsum('ka,il->iakl' ,l1 ,kd[o,o], optimize=True) + d[o,v,o,o] += t - t.swapaxes(3, 2) + + # density matrix block [vooo] + d[v,o,o,o] -= d[o,v,o,o].swapaxes(1, 0) + + + # density matrix block [vvvv] + + # 0.5000 * t2(c,d,i,j) l2(i,j,a,b) + d[v,v,v,v] = 0.5000 * einsum('cdij,ijab->abcd' ,t2 ,l2, optimize=True) + + # 0.5000 * P(a,b) t1(c,i) t1(d,j) l2(i,j,a,b) + t = 0.5000 * einsum('ci,dj,ijab->abcd' ,t1 ,t1 ,l2, optimize=True) + d[v,v,v,v] += t - t.swapaxes(1, 0) + + # density matrix block [vvvo] + + # -1.0000 * t1(c,j) l2(i,j,a,b) + d[v,v,v,o] = -1.0000 * einsum('cj,ijab->abci' ,t1 ,l2, optimize=True) + + # density matrix block [vvov] + d[v,v,o,v] -= d[v,v,v,o].swapaxes(3, 2) + + + # density matrix block [vovv] + + # -1.0000 * t2(c,d,i,j) l1(j,a) + d[v,o,v,v] = -1.0000 * einsum('cdij,ja->aicd' ,t2 ,l1, optimize=True) + + # -0.50000 * t1(b,i) t2(c,d,j,k) l2(j,k,a,b) + d[v,o,v,v] += -0.50000 * einsum('bi,cdjk,jkab->aicd' ,t1 ,t2 ,l2, optimize=True) + + # 1.0000 * P(c,d) t1(c,j) t2(d,b,i,k) l2(j,k,a,b) + t = 1.0000 * einsum('cj,dbik,jkab->aicd' ,t1 ,t2 ,l2, optimize=True) + d[v,o,v,v] += t - t.swapaxes(3, 2) + + # -1.0000 * P(c,d) t1(c,i) t1(d,j) l1(j,a) + t = -1.0000 * einsum('ci,dj,ja->aicd' ,t1 ,t1 ,l1, optimize=True) + d[v,o,v,v] += t - t.swapaxes(3, 2) + + # -0.50000 * P(c,d) t1(c,i) t2(d,b,j,k) l2(j,k,a,b) + t = -0.50000 * einsum('ci,dbjk,jkab->aicd' ,t1 ,t2 ,l2, optimize=True) + d[v,o,v,v] += t - t.swapaxes(3, 2) + + # -0.50000 * P(c,d) t1(c,j) t1(d,k) t1(b,i) l2(j,k,a,b) + t = -0.50000 * einsum('cj,dk,bi,jkab->aicd' ,t1 ,t1 ,t1 ,l2, optimize=True) + d[v,o,v,v] += t - t.swapaxes(3, 2) + + # density matrix block [ovvv] + d[o,v,v,v] -= d[v,o,v,v].swapaxes(1, 0) + + + # density matrix block [oovv] + + # 1.0000 * P(i,j) t1(a,i) t1(b,j) + t = 1.0000 * einsum('ai,bj->ijab' ,t1 ,t1, optimize=True) + d[o,o,v,v] = t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) l2(k,l,c,d) + d[o,o,v,v] += 0.2500 * einsum('abkl,cdij,klcd->ijab' ,t2 ,t2 ,l2, optimize=True) + + # 1.0000 * P(a,b) t1(a,k) t2(b,c,i,j) l1(k,c) + t = 1.0000 * einsum('ak,bcij,kc->ijab' ,t1 ,t2 ,l1, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,i) t2(a,b,j,k) l1(k,c) + t = 1.0000 * einsum('ci,abjk,kc->ijab' ,t1 ,t2 ,l1, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) l2(k,l,c,d) + t = 1.0000 * einsum('acik,bdjl,klcd->ijab' ,t2 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # -0.25000 * P(i,j) t2(a,c,i,j) t2(b,d,k,l) l2(k,l,c,d) + t = -0.25000 * einsum('acij,bdkl,klcd->ijab' ,t2 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # -0.25000 * P(i,j) t2(a,c,k,l) t2(b,d,i,j) l2(k,l,c,d) + t = -0.25000 * einsum('ackl,bdij,klcd->ijab' ,t2 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,i) t2(b,c,j,k) l1(k,c) + t = 1.0000 * einsum('ai,bcjk,kc->ijab' ,t1 ,t2 ,l1, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 0.2500 * P(i,j) t1(a,k) t1(b,l) t2(c,d,i,j) l2(k,l,c,d) + t = 0.2500 * einsum('ak,bl,cdij,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # 0.2500 * P(i,j) t1(c,i) t1(d,j) t2(a,b,k,l) l2(k,l,c,d) + t = 0.2500 * einsum('ci,dj,abkl,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(1, 0) + + # 0.2500 * P(a,b)P(i,j) t2(a,b,i,l) t2(c,d,j,k) l2(k,l,c,d) + t = 0.2500 * einsum('abil,cdjk,klcd->ijab' ,t2 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,i) t1(b,k) t1(c,j) l1(k,c) + t = -1.0000 * einsum('ai,bk,cj,kc->ijab' ,t1 ,t1 ,t1 ,l1, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t1(c,i) t2(b,d,j,l) l2(k,l,c,d) + t = -1.0000 * einsum('ak,ci,bdjl,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -0.50000 * P(a,b)P(i,j) t1(a,i) t1(c,j) t2(b,d,k,l) l2(k,l,c,d) + t = -0.50000 * einsum('ai,cj,bdkl,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -0.25000 * P(a,b)P(i,j) t1(a,i) t1(b,k) t2(c,d,j,l) l2(k,l,c,d) + t = -0.25000 * einsum('ai,bk,cdjl,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 0.2500 * P(a,b)P(i,j) t1(a,k) t1(b,i) t2(c,d,j,l) l2(k,l,c,d) + t = 0.2500 * einsum('ak,bi,cdjl,klcd->ijab' ,t1 ,t1 ,t2 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 0.2500 * P(a,b)P(i,j) t1(a,k) t1(b,l) t1(c,i) t1(d,j) l2(k,l,c,d) + t = 0.2500 * einsum('ak,bl,ci,dj,klcd->ijab' ,t1 ,t1 ,t1 ,t1 ,l2, optimize=True) + d[o,o,v,v] += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 1.0000 * t2(a,b,i,j) + d[o,o,v,v] += 1.0000 * einsum('abij->ijab' ,t2, optimize=True) + + # density matrix block [vvoo] + + # 1.0000 * l2(i,j,a,b) + d[v,v,o,o] = 1.0000 * einsum('ijab->abij' ,l2, optimize=True) + + # density matrix block [ovov] + + # -1.0000 * t1(b,i) l1(j,a) + d[o,v,o,v] = -1.0000 * einsum('bi,ja->iajb' ,t1 ,l1, optimize=True) + + # -1.0000 * t2(b,d,i,k) l2(j,k,a,d) + d[o,v,o,v] += -1.0000 * einsum('bdik,jkad->iajb' ,t2 ,l2, optimize=True) + + # 1.0000 * t1(b,k) t1(d,i) l2(j,k,a,d) + d[o,v,o,v] += 1.0000 * einsum('bk,di,jkad->iajb' ,t1 ,t1 ,l2, optimize=True) + + # 1.0000 * t1(b,k) l1(k,a) kd[o,o] + d[o,v,o,v] += 1.0000 * einsum('bk,ka,ij->iajb' ,t1 ,l1 ,kd[o,o], optimize=True) + + # 0.5000 * t2(b,d,k,l) l2(k,l,a,d) kd[o,o] + d[o,v,o,v] += 0.5000 * einsum('bdkl,klad,ij->iajb' ,t2 ,l2 ,kd[o,o], optimize=True) + + # density matrix block [voov] + d[v,o,o,v] -= d[o,v,o,v].swapaxes(1, 0) + + + # density matrix block [ovvo] + + # 1.0000 * t1(b,i) l1(j,a) + d[o,v,v,o] = 1.0000 * einsum('bi,ja->iabj' ,t1 ,l1, optimize=True) + + # 1.0000 * t2(b,d,i,k) l2(j,k,a,d) + d[o,v,v,o] += 1.0000 * einsum('bdik,jkad->iabj' ,t2 ,l2, optimize=True) + + # -1.0000 * t1(b,k) t1(d,i) l2(j,k,a,d) + d[o,v,v,o] += -1.0000 * einsum('bk,di,jkad->iabj' ,t1 ,t1 ,l2, optimize=True) + + # -1.0000 * t1(b,k) l1(k,a) kd[o,o] + d[o,v,v,o] += -1.0000 * einsum('bk,ka,ij->iabj' ,t1 ,l1 ,kd[o,o], optimize=True) + + # -0.50000 * t2(b,d,k,l) l2(k,l,a,d) kd[o,o] + d[o,v,v,o] += -0.50000 * einsum('bdkl,klad,ij->iabj' ,t2 ,l2 ,kd[o,o], optimize=True) + + # density matrix block [vovo] + d[v,o,v,o] -= d[o,v,v,o].swapaxes(1, 0) + + + return d + diff --git a/codes/ccd.py b/codes/ccd.py new file mode 100644 index 0000000..9b03537 --- /dev/null +++ b/codes/ccd.py @@ -0,0 +1,71 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [D] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [D] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * t2(c,d,i,j) + T = 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) + T += 0.2500 * einsum('klcd,abkl,cdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) + t = 1.0000 * einsum('klcd,acik,bdjl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(c,d,j,k) + t = 0.5000 * einsum('klcd,abil,cdjk->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) t2(a,c,k,l) t2(b,d,i,j) + t = -0.50000 * einsum('klcd,ackl,bdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + diff --git a/codes/ccsd.py b/codes/ccsd.py new file mode 100644 index 0000000..50fdb3f --- /dev/null +++ b/codes/ccsd.py @@ -0,0 +1,208 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # -0.50000 * t1(a,j) t1(b,i) + T += -0.50000 * einsum('ijab,aj,bi->' ,g[o,o,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 1.0000 * t1(a,k) t1(b,j) + T += 1.0000 * einsum('jkib,ak,bj->ai' ,g[o,o,o,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(b,j) t2(a,c,i,k) + T += 1.0000 * einsum('jkbc,bj,acik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * f(j,b) t1(a,j) t1(b,i) + T += -1.0000 * einsum('jb,aj,bi->ai' ,f[o,v] ,t1 ,t1, optimize=True) + + # -1.0000 * t1(b,j) t1(c,i) + T += -1.0000 * einsum('ajbc,bj,ci->ai' ,g[v,o,v,v] ,t1 ,t1, optimize=True) + + # -0.50000 * t1(a,j) t2(b,c,i,k) + T += -0.50000 * einsum('jkbc,aj,bcik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -0.50000 * t1(b,i) t2(a,c,j,k) + T += -0.50000 * einsum('jkbc,bi,acjk->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(a,k) t1(b,j) t1(c,i) + T += -1.0000 * einsum('jkbc,ak,bj,ci->ai' ,g[o,o,v,v] ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * t2(c,d,i,j) + T = 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(c,i) t1(d,j) + T += 1.0000 * einsum('abcd,ci,dj->abij' ,g[v,v,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(a,k) t1(b,l) + T += 1.0000 * einsum('klij,ak,bl->abij' ,g[o,o,o,o] ,t1 ,t1, optimize=True) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) + T += 0.2500 * einsum('klcd,abkl,cdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) f(k,c) t1(a,k) t2(b,c,i,j) + t = 1.0000 * einsum('kc,ak,bcij->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) f(k,c) t1(c,i) t2(a,b,j,k) + t = 1.0000 * einsum('kc,ci,abjk->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(a,b) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('akcd,ck,bdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) + t = 1.0000 * einsum('klcd,acik,bdjl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t1(c,j) t2(a,b,k,l) + t = 0.5000 * einsum('klic,cj,abkl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * t1(a,k) t1(b,l) t2(c,d,i,j) + T += 0.5000 * einsum('klcd,ak,bl,cdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * t1(c,i) t1(d,j) t2(a,b,k,l) + T += 0.5000 * einsum('klcd,ci,dj,abkl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(c,d,j,k) + t = 0.5000 * einsum('klcd,abil,cdjk->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(i,j) t1(c,k) t2(a,b,j,l) + t = -1.0000 * einsum('klic,ck,abjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) t1(b,k) t2(c,d,i,j) + t = -0.50000 * einsum('akcd,bk,cdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t2(a,c,i,j) t2(b,d,k,l) + t = -0.50000 * einsum('klcd,acij,bdkl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(c,i) t2(b,d,j,k) + t = 1.0000 * einsum('akcd,ci,bdjk->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(a,k) t1(b,l) t1(c,j) + t = 1.0000 * einsum('klic,ak,bl,cj->abij' ,g[o,o,o,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(a,k) t1(b,l) t1(c,i) t1(d,j) + T += 1.0000 * einsum('klcd,ak,bl,ci,dj->abij' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * P(a,b) t1(a,l) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('klcd,al,ck,bdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,k) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('klcd,ck,di,abjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(b,k) t1(c,j) + t = -1.0000 * einsum('akic,bk,cj->abij' ,g[v,o,o,v] ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b) t1(b,k) t1(c,i) t1(d,j) + t = -1.0000 * einsum('akcd,bk,ci,dj->abij' ,g[v,o,v,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t2(b,c,j,l) + t = -1.0000 * einsum('klic,ak,bcjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t1(c,i) t2(b,d,j,l) + t = -1.0000 * einsum('klcd,ak,ci,bdjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + diff --git a/codes/ccsd_lambda.py b/codes/ccsd_lambda.py new file mode 100644 index 0000000..f279244 --- /dev/null +++ b/codes/ccsd_lambda.py @@ -0,0 +1,298 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + + +def cc_lambda_lagrangian_energy(f, g, o, v, t1=None, t2=None, l1=None, l2=None): + + ''' + COGUS generated level [SD] on 29 Jul 2021 + ''' + + from numpy import einsum + + T = cc_energy(f, g, o, v, t1, t2, t3=None) + + T += einsum('ia,ai->', l1, cc_singles(f, g, o, v, t1, t2, t3=None)) + + T += einsum('ijab,abij->', l2, cc_doubles(f, g, o, v, t1, t2, t3=None)) + + + return T + +def cc_lambda_singles(f, g, o, v, t1=None, t2=None, l1=None, l2=None): + + ''' + COGUS generated level [SD] on 29 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(b,a) l1(i,b) + T = 1.0000 * einsum('ba,ib->ia' ,f[v,v] ,l1, optimize=True) + + # 1.0000 * l1(j,b) + T += 1.0000 * einsum('ibaj,jb->ia' ,g[o,v,v,o] ,l1, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ijab,bj->ia' ,g[o,o,v,v] ,t1, optimize=True) + + # 0.5000 * l2(i,j,b,c) + T += 0.5000 * einsum('bcaj,ijbc->ia' ,g[v,v,v,o] ,l2, optimize=True) + + # -1.0000 * f(i,j) l1(j,a) + T += -1.0000 * einsum('ij,ja->ia' ,f[o,o] ,l1, optimize=True) + + # -0.50000 * l2(j,k,a,b) + T += -0.50000 * einsum('ibjk,jkab->ia' ,g[o,v,o,o] ,l2, optimize=True) + + # 1.0000 * l1(j,b) t1(c,j) + T += 1.0000 * einsum('ibac,jb,cj->ia' ,g[o,v,v,v] ,l1 ,t1, optimize=True) + + # 1.0000 * l2(j,k,a,b) t1(c,k) + T += 1.0000 * einsum('ibcj,jkab,ck->ia' ,g[o,v,v,o] ,l2 ,t1, optimize=True) + + # 1.0000 * l1(k,c) t2(b,c,j,k) + T += 1.0000 * einsum('ijab,kc,bcjk->ia' ,g[o,o,v,v] ,l1 ,t2, optimize=True) + + # 1.0000 * l1(j,a) t1(b,k) + T += 1.0000 * einsum('ikbj,ja,bk->ia' ,g[o,o,v,o] ,l1 ,t1, optimize=True) + + # 1.0000 * l2(j,l,a,c) t2(b,c,k,l) + T += 1.0000 * einsum('ikbj,jlac,bckl->ia' ,g[o,o,v,o] ,l2 ,t2, optimize=True) + + # 1.0000 * l1(i,b) t1(c,j) + T += 1.0000 * einsum('bjac,ib,cj->ia' ,g[v,o,v,v] ,l1 ,t1, optimize=True) + + # 1.0000 * l2(i,k,b,d) t2(c,d,j,k) + T += 1.0000 * einsum('bjac,ikbd,cdjk->ia' ,g[v,o,v,v] ,l2 ,t2, optimize=True) + + # 0.5000 * l2(j,k,b,d) t2(c,d,j,k) + T += 0.5000 * einsum('ibac,jkbd,cdjk->ia' ,g[o,v,v,v] ,l2 ,t2, optimize=True) + + # 0.5000 * l1(k,a) t2(b,c,j,k) + T += 0.5000 * einsum('ijbc,ka,bcjk->ia' ,g[o,o,v,v] ,l1 ,t2, optimize=True) + + # 0.5000 * l2(j,k,a,b) t1(b,l) + T += 0.5000 * einsum('iljk,jkab,bl->ia' ,g[o,o,o,o] ,l2 ,t1, optimize=True) + + # 0.5000 * l2(i,j,b,c) t1(d,j) + T += 0.5000 * einsum('bcad,ijbc,dj->ia' ,g[v,v,v,v] ,l2 ,t1, optimize=True) + + # 0.5000 * l1(i,c) t2(b,c,j,k) + T += 0.5000 * einsum('jkab,ic,bcjk->ia' ,g[o,o,v,v] ,l1 ,t2, optimize=True) + + # -1.0000 * f(i,b) l1(j,a) t1(b,j) + T += -1.0000 * einsum('ib,ja,bj->ia' ,f[o,v] ,l1 ,t1, optimize=True) + + # -1.0000 * f(j,a) l1(i,b) t1(b,j) + T += -1.0000 * einsum('ja,ib,bj->ia' ,f[o,v] ,l1 ,t1, optimize=True) + + # -1.0000 * l1(j,b) t1(b,k) + T += -1.0000 * einsum('ikaj,jb,bk->ia' ,g[o,o,v,o] ,l1 ,t1, optimize=True) + + # -1.0000 * l2(i,j,b,c) t1(c,k) + T += -1.0000 * einsum('bkaj,ijbc,ck->ia' ,g[v,o,v,o] ,l2 ,t1, optimize=True) + + # -0.50000 * f(i,b) l2(j,k,a,c) t2(b,c,j,k) + T += -0.50000 * einsum('ib,jkac,bcjk->ia' ,f[o,v] ,l2 ,t2, optimize=True) + + # -0.50000 * f(j,a) l2(i,k,b,c) t2(b,c,j,k) + T += -0.50000 * einsum('ja,ikbc,bcjk->ia' ,f[o,v] ,l2 ,t2, optimize=True) + + # -0.50000 * l2(j,l,b,c) t2(b,c,k,l) + T += -0.50000 * einsum('ikaj,jlbc,bckl->ia' ,g[o,o,v,o] ,l2 ,t2, optimize=True) + + # -0.25000 * l2(j,k,a,b) t2(c,d,j,k) + T += -0.25000 * einsum('ibcd,jkab,cdjk->ia' ,g[o,v,v,v] ,l2 ,t2, optimize=True) + + # 0.2500 * l2(i,j,b,c) t2(b,c,k,l) + T += 0.2500 * einsum('klaj,ijbc,bckl->ia' ,g[o,o,v,o] ,l2 ,t2, optimize=True) + + # 1.0000 * l1(k,a) t1(b,j) t1(c,k) + T += 1.0000 * einsum('ijbc,ka,bj,ck->ia' ,g[o,o,v,v] ,l1 ,t1 ,t1, optimize=True) + + # 1.0000 * l1(i,c) t1(b,j) t1(c,k) + T += 1.0000 * einsum('jkab,ic,bj,ck->ia' ,g[o,o,v,v] ,l1 ,t1 ,t1, optimize=True) + + # 0.5000 * l2(j,k,a,b) t1(c,k) t1(d,j) + T += 0.5000 * einsum('ibcd,jkab,ck,dj->ia' ,g[o,v,v,v] ,l2 ,t1 ,t1, optimize=True) + + # 0.5000 * l2(k,l,a,d) t1(b,j) t2(c,d,k,l) + T += 0.5000 * einsum('ijbc,klad,bj,cdkl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # 0.5000 * l2(i,l,c,d) t1(b,j) t2(c,d,k,l) + T += 0.5000 * einsum('jkab,ilcd,bj,cdkl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -1.0000 * l1(k,c) t1(b,k) t1(c,j) + T += -1.0000 * einsum('ijab,kc,bk,cj->ia' ,g[o,o,v,v] ,l1 ,t1 ,t1, optimize=True) + + # -1.0000 * l2(k,l,a,d) t1(b,k) t2(c,d,j,l) + T += -1.0000 * einsum('ijbc,klad,bk,cdjl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -1.0000 * l2(j,l,a,c) t1(b,l) t1(c,k) + T += -1.0000 * einsum('ikbj,jlac,bl,ck->ia' ,g[o,o,v,o] ,l2 ,t1 ,t1, optimize=True) + + # -1.0000 * l2(i,k,b,d) t1(c,k) t1(d,j) + T += -1.0000 * einsum('bjac,ikbd,ck,dj->ia' ,g[v,o,v,v] ,l2 ,t1 ,t1, optimize=True) + + # -1.0000 * l2(i,l,c,d) t1(c,j) t2(b,d,k,l) + T += -1.0000 * einsum('jkab,ilcd,cj,bdkl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -0.50000 * l2(k,l,c,d) t1(b,k) t2(c,d,j,l) + T += -0.50000 * einsum('ijab,klcd,bk,cdjl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -0.50000 * l2(k,l,c,d) t1(c,j) t2(b,d,k,l) + T += -0.50000 * einsum('ijab,klcd,cj,bdkl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -0.50000 * l2(i,j,b,c) t1(b,l) t1(c,k) + T += -0.50000 * einsum('klaj,ijbc,bl,ck->ia' ,g[o,o,v,o] ,l2 ,t1 ,t1, optimize=True) + + # 0.2500 * l2(k,l,a,d) t1(d,j) t2(b,c,k,l) + T += 0.2500 * einsum('ijbc,klad,dj,bckl->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # 0.2500 * l2(i,l,c,d) t1(b,l) t2(c,d,j,k) + T += 0.2500 * einsum('jkab,ilcd,bl,cdjk->ia' ,g[o,o,v,v] ,l2 ,t1 ,t2, optimize=True) + + # -0.50000 * l2(k,l,a,d) t1(b,l) t1(c,k) t1(d,j) + T += -0.50000 * einsum('ijbc,klad,bl,ck,dj->ia' ,g[o,o,v,v] ,l2 ,t1 ,t1 ,t1, optimize=True) + + # -0.50000 * l2(i,l,c,d) t1(b,l) t1(c,k) t1(d,j) + T += -0.50000 * einsum('jkab,ilcd,bl,ck,dj->ia' ,g[o,o,v,v] ,l2 ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,a) + T += 1.0000 * einsum('ia->ia' ,f[o,v], optimize=True) + + return T + +def cc_lambda_doubles(f, g, o, v, t1=None, t2=None, l1=None, l2=None): + + ''' + COGUS generated level [SD] on 29 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * l2(k,l,a,b) + T = 0.5000 * einsum('ijkl,klab->ijab' ,g[o,o,o,o] ,l2, optimize=True) + + # 0.5000 * l2(i,j,c,d) + T += 0.5000 * einsum('cdab,ijcd->ijab' ,g[v,v,v,v] ,l2, optimize=True) + + # 1.0000 * P(i,j) f(i,k) l2(j,k,a,b) + t = 1.0000 * einsum('ik,jkab->ijab' ,f[o,o] ,l2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) l1(j,c) + t = 1.0000 * einsum('icab,jc->ijab' ,g[o,v,v,v] ,l1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) f(c,a) l2(i,j,b,c) + t = -1.0000 * einsum('ca,ijbc->ijab' ,f[v,v] ,l2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) l1(k,b) + t = -1.0000 * einsum('ijak,kb->ijab' ,g[o,o,v,o] ,l1, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * l2(k,l,a,b) t1(c,l) + T += -1.0000 * einsum('ijck,klab,cl->ijab' ,g[o,o,v,o] ,l2 ,t1, optimize=True) + + # -1.0000 * l2(i,j,c,d) t1(d,k) + T += -1.0000 * einsum('ckab,ijcd,dk->ijab' ,g[v,o,v,v] ,l2 ,t1, optimize=True) + + # 0.2500 * l2(k,l,a,b) t2(c,d,k,l) + T += 0.2500 * einsum('ijcd,klab,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + + # 0.2500 * l2(i,j,c,d) t2(c,d,k,l) + T += 0.2500 * einsum('klab,ijcd,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + + # 1.0000 * P(a,b)P(i,j) f(i,a) l1(j,b) + t = 1.0000 * einsum('ia,jb->ijab' ,f[o,v] ,l1, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 1.0000 * P(i,j) f(i,c) l2(j,k,a,b) t1(c,k) + t = 1.0000 * einsum('ic,jkab,ck->ijab' ,f[o,v] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) f(k,a) l2(i,j,b,c) t1(c,k) + t = 1.0000 * einsum('ka,ijbc,ck->ijab' ,f[o,v] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) l2(j,k,b,c) + t = 1.0000 * einsum('icak,jkbc->ijab' ,g[o,v,v,o] ,l2, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -1.0000 * P(a,b) l1(k,b) t1(c,k) + t = -1.0000 * einsum('ijac,kb,ck->ijab' ,g[o,o,v,v] ,l1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(i,j) l1(j,c) t1(c,k) + t = -1.0000 * einsum('ikab,jc,ck->ijab' ,g[o,o,v,v] ,l1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) l2(j,k,a,b) t1(c,l) + t = -1.0000 * einsum('ilck,jkab,cl->ijab' ,g[o,o,v,o] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) l2(i,j,b,c) t1(d,k) + t = -1.0000 * einsum('ckad,ijbc,dk->ijab' ,g[v,o,v,v] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) l2(k,l,b,d) t2(c,d,k,l) + t = -0.50000 * einsum('ijac,klbd,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * l2(k,l,a,b) t1(c,l) t1(d,k) + T += -0.50000 * einsum('ijcd,klab,cl,dk->ijab' ,g[o,o,v,v] ,l2 ,t1 ,t1, optimize=True) + + # -0.50000 * P(i,j) l2(j,l,c,d) t2(c,d,k,l) + t = -0.50000 * einsum('ikab,jlcd,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(i,j) l2(j,l,a,b) t2(c,d,k,l) + t = -0.50000 * einsum('ikcd,jlab,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * l2(i,j,c,d) t1(c,l) t1(d,k) + T += -0.50000 * einsum('klab,ijcd,cl,dk->ijab' ,g[o,o,v,v] ,l2 ,t1 ,t1, optimize=True) + + # -0.50000 * P(a,b) l2(i,j,b,d) t2(c,d,k,l) + t = -0.50000 * einsum('klac,ijbd,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) l2(j,k,b,c) t1(d,k) + t = 1.0000 * einsum('icad,jkbc,dk->ijab' ,g[o,v,v,v] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) l1(j,b) t1(c,k) + t = 1.0000 * einsum('ikac,jb,ck->ijab' ,g[o,o,v,v] ,l1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) l2(j,l,b,d) t2(c,d,k,l) + t = 1.0000 * einsum('ikac,jlbd,cdkl->ijab' ,g[o,o,v,v] ,l2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -1.0000 * P(i,j) l2(j,l,a,b) t1(c,k) t1(d,l) + t = -1.0000 * einsum('ikcd,jlab,ck,dl->ijab' ,g[o,o,v,v] ,l2 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) l2(j,k,b,c) t1(c,l) + t = -1.0000 * einsum('ilak,jkbc,cl->ijab' ,g[o,o,v,o] ,l2 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # -1.0000 * P(a,b) l2(i,j,b,d) t1(c,k) t1(d,l) + t = -1.0000 * einsum('klac,ijbd,ck,dl->ijab' ,g[o,o,v,v] ,l2 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) l2(j,l,b,d) t1(c,l) t1(d,k) + t = -1.0000 * einsum('ikac,jlbd,cl,dk->ijab' ,g[o,o,v,v] ,l2 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) - t.swapaxes(1, 0) + t.swapaxes(3, 2).swapaxes(1, 0) + + # 1.0000 * + T += 1.0000 * einsum('ijab->ijab' ,g[o,o,v,v], optimize=True) + + return T + diff --git a/codes/ccsd_t.py b/codes/ccsd_t.py new file mode 100644 index 0000000..cfe08cc --- /dev/null +++ b/codes/ccsd_t.py @@ -0,0 +1,281 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDt] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # -0.50000 * t1(a,j) t1(b,i) + T += -0.50000 * einsum('ijab,aj,bi->' ,g[o,o,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_perturbation_energy(f, g, o, v, l1=None, l2=None, t3=None): + + ''' + COGUS generated level [SDt] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.25000 * l2(j,k,a,d) t3(b,c,d,i,j,k) + T = -0.25000 * einsum('aibc,jkad,bcdijk->' ,g[v,o,v,v] ,l2 ,t3, optimize=True) + + # -0.25000 * l2(i,l,b,c) t3(a,b,c,j,k,l) + T += -0.25000 * einsum('jkai,ilbc,abcjkl->' ,g[o,o,v,o] ,l2 ,t3, optimize=True) + + # 0.2500 * l1(k,c) t3(a,b,c,i,j,k) + T += 0.2500 * einsum('ijab,kc,abcijk->' ,g[o,o,v,v] ,l1 ,t3, optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDt] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 1.0000 * t1(a,k) t1(b,j) + T += 1.0000 * einsum('jkib,ak,bj->ai' ,g[o,o,o,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(b,j) t2(a,c,i,k) + T += 1.0000 * einsum('jkbc,bj,acik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * f(j,b) t1(a,j) t1(b,i) + T += -1.0000 * einsum('jb,aj,bi->ai' ,f[o,v] ,t1 ,t1, optimize=True) + + # -1.0000 * t1(b,j) t1(c,i) + T += -1.0000 * einsum('ajbc,bj,ci->ai' ,g[v,o,v,v] ,t1 ,t1, optimize=True) + + # -0.50000 * t1(a,j) t2(b,c,i,k) + T += -0.50000 * einsum('jkbc,aj,bcik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -0.50000 * t1(b,i) t2(a,c,j,k) + T += -0.50000 * einsum('jkbc,bi,acjk->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(a,k) t1(b,j) t1(c,i) + T += -1.0000 * einsum('jkbc,ak,bj,ci->ai' ,g[o,o,v,v] ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDt] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * t2(c,d,i,j) + T = 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(c,i) t1(d,j) + T += 1.0000 * einsum('abcd,ci,dj->abij' ,g[v,v,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(a,k) t1(b,l) + T += 1.0000 * einsum('klij,ak,bl->abij' ,g[o,o,o,o] ,t1 ,t1, optimize=True) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) + T += 0.2500 * einsum('klcd,abkl,cdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) f(k,c) t1(a,k) t2(b,c,i,j) + t = 1.0000 * einsum('kc,ak,bcij->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) f(k,c) t1(c,i) t2(a,b,j,k) + t = 1.0000 * einsum('kc,ci,abjk->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(a,b) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('akcd,ck,bdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) + t = 1.0000 * einsum('klcd,acik,bdjl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t1(c,j) t2(a,b,k,l) + t = 0.5000 * einsum('klic,cj,abkl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * t1(a,k) t1(b,l) t2(c,d,i,j) + T += 0.5000 * einsum('klcd,ak,bl,cdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * t1(c,i) t1(d,j) t2(a,b,k,l) + T += 0.5000 * einsum('klcd,ci,dj,abkl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(c,d,j,k) + t = 0.5000 * einsum('klcd,abil,cdjk->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(i,j) t1(c,k) t2(a,b,j,l) + t = -1.0000 * einsum('klic,ck,abjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) t1(b,k) t2(c,d,i,j) + t = -0.50000 * einsum('akcd,bk,cdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t2(a,c,k,l) t2(b,d,i,j) + t = -0.50000 * einsum('klcd,ackl,bdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(c,i) t2(b,d,j,k) + t = 1.0000 * einsum('akcd,ci,bdjk->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(a,k) t1(b,l) t1(c,j) + t = 1.0000 * einsum('klic,ak,bl,cj->abij' ,g[o,o,o,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(a,k) t1(b,l) t1(c,i) t1(d,j) + T += 1.0000 * einsum('klcd,ak,bl,ci,dj->abij' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * P(a,b) t1(a,l) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('klcd,al,ck,bdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,k) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('klcd,ck,di,abjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(b,k) t1(c,j) + t = -1.0000 * einsum('akic,bk,cj->abij' ,g[v,o,o,v] ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b) t1(b,k) t1(c,i) t1(d,j) + t = -1.0000 * einsum('akcd,bk,ci,dj->abij' ,g[v,o,v,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t2(b,c,j,l) + t = -1.0000 * einsum('klic,ak,bcjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t1(c,i) t2(b,d,j,l) + t = -1.0000 * einsum('klcd,ak,ci,bdjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + +def cc_triples(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDt] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(c,d) t3(a,b,d,i,j,k) + T = 1.0000 * einsum('cd,abdijk->abcijk' ,f[v,v] ,t3, optimize=True) + + # 1.0000 * t2(a,b,k,l) + T += 1.0000 * einsum('clij,abkl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + + # -1.0000 * f(l,k) t3(a,b,c,i,j,l) + T += -1.0000 * einsum('lk,abcijl->abcijk' ,f[o,o] ,t3, optimize=True) + + # -1.0000 * t2(c,d,i,j) + T += -1.0000 * einsum('abkd,cdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + + # 1.0000 * P(a,b) f(a,d) t3(b,c,d,i,j,k) + t = 1.0000 * einsum('ad,bcdijk->abcijk' ,f[v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t2(b,d,i,j) + t = 1.0000 * einsum('ackd,bdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t2(b,c,k,l) + t = 1.0000 * einsum('alij,bckl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) f(l,i) t3(a,b,c,j,k,l) + t = -1.0000 * einsum('li,abcjkl->abcijk' ,f[o,o] ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t2(c,d,j,k) + t = -1.0000 * einsum('abid,cdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t2(a,b,j,l) + t = -1.0000 * einsum('clik,abjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t2(b,d,j,k) + t = 1.0000 * einsum('acid,bdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t2(b,c,j,l) + t = -1.0000 * einsum('alik,bcjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + return T + diff --git a/codes/ccsdt.py b/codes/ccsdt.py new file mode 100644 index 0000000..129f3d1 --- /dev/null +++ b/codes/ccsdt.py @@ -0,0 +1,894 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDT] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # -0.50000 * t1(a,j) t1(b,i) + T += -0.50000 * einsum('ijab,aj,bi->' ,g[o,o,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDT] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 0.2500 * t3(a,b,c,i,j,k) + T += 0.2500 * einsum('jkbc,abcijk->ai' ,g[o,o,v,v] ,t3, optimize=True) + + # 1.0000 * t1(a,k) t1(b,j) + T += 1.0000 * einsum('jkib,ak,bj->ai' ,g[o,o,o,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(b,j) t2(a,c,i,k) + T += 1.0000 * einsum('jkbc,bj,acik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * f(j,b) t1(a,j) t1(b,i) + T += -1.0000 * einsum('jb,aj,bi->ai' ,f[o,v] ,t1 ,t1, optimize=True) + + # -1.0000 * t1(b,j) t1(c,i) + T += -1.0000 * einsum('ajbc,bj,ci->ai' ,g[v,o,v,v] ,t1 ,t1, optimize=True) + + # -0.50000 * t1(a,j) t2(b,c,i,k) + T += -0.50000 * einsum('jkbc,aj,bcik->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -0.50000 * t1(b,i) t2(a,c,j,k) + T += -0.50000 * einsum('jkbc,bi,acjk->ai' ,g[o,o,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(a,k) t1(b,j) t1(c,i) + T += -1.0000 * einsum('jkbc,ak,bj,ci->ai' ,g[o,o,v,v] ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDT] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(k,c) t3(a,b,c,i,j,k) + T = 1.0000 * einsum('kc,abcijk->abij' ,f[o,v] ,t3, optimize=True) + + # 0.5000 * t2(c,d,i,j) + T += 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(c,i) t1(d,j) + T += 1.0000 * einsum('abcd,ci,dj->abij' ,g[v,v,v,v] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(a,k) t1(b,l) + T += 1.0000 * einsum('klij,ak,bl->abij' ,g[o,o,o,o] ,t1 ,t1, optimize=True) + + # 1.0000 * t1(c,k) t3(a,b,d,i,j,l) + T += 1.0000 * einsum('klcd,ck,abdijl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + + # 0.5000 * P(i,j) t3(a,b,c,j,k,l) + t = 0.5000 * einsum('klic,abcjkl->abij' ,g[o,o,o,v] ,t3, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t3(b,c,d,i,j,k) + t = -0.50000 * einsum('akcd,bcdijk->abij' ,g[v,o,v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.2500 * t2(a,b,k,l) t2(c,d,i,j) + T += 0.2500 * einsum('klcd,abkl,cdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) f(k,c) t1(a,k) t2(b,c,i,j) + t = 1.0000 * einsum('kc,ak,bcij->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) f(k,c) t1(c,i) t2(a,b,j,k) + t = 1.0000 * einsum('kc,ci,abjk->abij' ,f[o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(a,b) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('akcd,ck,bdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(a,c,i,k) t2(b,d,j,l) + t = 1.0000 * einsum('klcd,acik,bdjl->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t1(c,j) t2(a,b,k,l) + t = 0.5000 * einsum('klic,cj,abkl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * t1(a,k) t1(b,l) t2(c,d,i,j) + T += 0.5000 * einsum('klcd,ak,bl,cdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(a,b) t1(a,k) t3(b,c,d,i,j,l) + t = 0.5000 * einsum('klcd,ak,bcdijl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * t1(c,i) t1(d,j) t2(a,b,k,l) + T += 0.5000 * einsum('klcd,ci,dj,abkl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 0.5000 * P(i,j) t1(c,i) t3(a,b,d,j,k,l) + t = 0.5000 * einsum('klcd,ci,abdjkl->abij' ,g[o,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(3, 2) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(c,d,j,k) + t = 0.5000 * einsum('klcd,abil,cdjk->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(i,j) t1(c,k) t2(a,b,j,l) + t = -1.0000 * einsum('klic,ck,abjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -0.50000 * P(a,b) t1(b,k) t2(c,d,i,j) + t = -0.50000 * einsum('akcd,bk,cdij->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t2(a,c,k,l) t2(b,d,i,j) + t = -0.50000 * einsum('klcd,ackl,bdij->abij' ,g[o,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(c,i) t2(b,d,j,k) + t = 1.0000 * einsum('akcd,ci,bdjk->abij' ,g[v,o,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(a,k) t1(b,l) t1(c,j) + t = 1.0000 * einsum('klic,ak,bl,cj->abij' ,g[o,o,o,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * t1(a,k) t1(b,l) t1(c,i) t1(d,j) + T += 1.0000 * einsum('klcd,ak,bl,ci,dj->abij' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t1, optimize=True) + + # 1.0000 * P(a,b) t1(a,l) t1(c,k) t2(b,d,i,j) + t = 1.0000 * einsum('klcd,al,ck,bdij->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,k) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('klcd,ck,di,abjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(b,k) t1(c,j) + t = -1.0000 * einsum('akic,bk,cj->abij' ,g[v,o,o,v] ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b) t1(b,k) t1(c,i) t1(d,j) + t = -1.0000 * einsum('akcd,bk,ci,dj->abij' ,g[v,o,v,v] ,t1 ,t1 ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t2(b,c,j,l) + t = -1.0000 * einsum('klic,ak,bcjl->abij' ,g[o,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # -1.0000 * P(a,b)P(i,j) t1(a,k) t1(c,i) t2(b,d,j,l) + t = -1.0000 * einsum('klcd,ak,ci,bdjl->abij' ,g[o,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + +def cc_triples(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [SDT] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(c,d) t3(a,b,d,i,j,k) + T = 1.0000 * einsum('cd,abdijk->abcijk' ,f[v,v] ,t3, optimize=True) + + # 1.0000 * t2(a,b,k,l) + T += 1.0000 * einsum('clij,abkl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + + # 1.0000 * t3(a,b,d,i,j,l) + T += 1.0000 * einsum('clkd,abdijl->abcijk' ,g[v,o,o,v] ,t3, optimize=True) + + # 0.5000 * t3(c,d,e,i,j,k) + T += 0.5000 * einsum('abde,cdeijk->abcijk' ,g[v,v,v,v] ,t3, optimize=True) + + # 0.5000 * t3(a,b,c,k,l,m) + T += 0.5000 * einsum('lmij,abcklm->abcijk' ,g[o,o,o,o] ,t3, optimize=True) + + # -1.0000 * f(l,k) t3(a,b,c,i,j,l) + T += -1.0000 * einsum('lk,abcijl->abcijk' ,f[o,o] ,t3, optimize=True) + + # -1.0000 * t2(c,d,i,j) + T += -1.0000 * einsum('abkd,cdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + + # 1.0000 * P(a,b) f(a,d) t3(b,c,d,i,j,k) + t = 1.0000 * einsum('ad,bcdijk->abcijk' ,f[v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * f(l,d) t2(a,b,k,l) t2(c,d,i,j) + T += 1.0000 * einsum('ld,abkl,cdij->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) t2(b,d,i,j) + t = 1.0000 * einsum('ackd,bdij->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t2(b,c,k,l) + t = 1.0000 * einsum('alij,bckl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t3(b,c,d,i,j,l) + t = 1.0000 * einsum('alkd,bcdijl->abcijk' ,g[v,o,o,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t3(a,b,d,j,k,l) + t = 1.0000 * einsum('clid,abdjkl->abcijk' ,g[v,o,o,v] ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * t1(d,k) t3(a,b,e,i,j,l) + T += 1.0000 * einsum('clde,dk,abeijl->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + + # 1.0000 * t1(d,l) t3(a,b,c,i,j,m) + T += 1.0000 * einsum('lmkd,dl,abcijm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + + # 1.0000 * t2(c,d,k,l) t3(a,b,e,i,j,m) + T += 1.0000 * einsum('lmde,cdkl,abeijm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 0.5000 * t2(a,b,k,l) t2(d,e,i,j) + T += 0.5000 * einsum('clde,abkl,deij->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) t3(c,d,e,i,j,m) + T += 0.5000 * einsum('lmde,abkl,cdeijm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 0.5000 * t2(c,d,i,j) t3(a,b,e,k,l,m) + T += 0.5000 * einsum('lmde,cdij,abeklm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 0.5000 * t2(c,d,l,m) t3(a,b,e,i,j,k) + T += 0.5000 * einsum('lmde,cdlm,abeijk->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 0.5000 * t2(d,e,k,l) t3(a,b,c,i,j,m) + T += 0.5000 * einsum('lmde,dekl,abcijm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # -1.0000 * P(i,j) f(l,i) t3(a,b,c,j,k,l) + t = -1.0000 * einsum('li,abcjkl->abcijk' ,f[o,o] ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * f(l,d) t1(c,l) t3(a,b,d,i,j,k) + T += -1.0000 * einsum('ld,cl,abdijk->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + + # -1.0000 * f(l,d) t1(d,k) t3(a,b,c,i,j,l) + T += -1.0000 * einsum('ld,dk,abcijl->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + + # -1.0000 * P(i,j) t2(c,d,j,k) + t = -1.0000 * einsum('abid,cdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(d,k) t2(c,e,i,j) + T += -1.0000 * einsum('abde,dk,ceij->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + + # -1.0000 * P(i,j) t2(a,b,j,l) + t = -1.0000 * einsum('clik,abjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(d,l) t3(a,b,e,i,j,k) + T += -1.0000 * einsum('clde,dl,abeijk->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + + # -1.0000 * t1(c,l) t2(a,b,k,m) + T += -1.0000 * einsum('lmij,cl,abkm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + + # -1.0000 * t1(c,l) t3(a,b,d,i,j,m) + T += -1.0000 * einsum('lmkd,cl,abdijm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + + # -0.50000 * P(a,b) t3(b,d,e,i,j,k) + t = -0.50000 * einsum('acde,bdeijk->abcijk' ,g[v,v,v,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(i,j) t3(a,b,c,j,l,m) + t = -0.50000 * einsum('lmik,abcjlm->abcijk' ,g[o,o,o,o] ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * t2(a,b,l,m) t2(c,d,i,j) + T += -0.50000 * einsum('lmkd,ablm,cdij->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + + # 0.2500 * t2(a,b,l,m) t3(c,d,e,i,j,k) + T += 0.2500 * einsum('lmde,ablm,cdeijk->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 0.2500 * t2(d,e,i,j) t3(a,b,c,k,l,m) + T += 0.2500 * einsum('lmde,deij,abcklm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + + # 1.0000 * P(a,b) f(l,d) t2(a,d,i,j) t2(b,c,k,l) + t = 1.0000 * einsum('ld,adij,bckl->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t2(b,d,j,k) + t = 1.0000 * einsum('acid,bdjk->abcijk' ,g[v,v,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('acde,dk,beij->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t3(b,c,d,j,k,l) + t = 1.0000 * einsum('alid,bcdjkl->abcijk' ,g[v,o,o,v] ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(b,l) t2(c,d,i,j) + t = 1.0000 * einsum('alkd,bl,cdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t1(d,k) t3(b,c,e,i,j,l) + t = 1.0000 * einsum('alde,dk,bceijl->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(d,j) t2(a,b,k,l) + t = 1.0000 * einsum('clid,dj,abkl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t2(b,d,i,j) + t = 1.0000 * einsum('clkd,al,bdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(d,i) t2(a,b,j,l) + t = 1.0000 * einsum('clkd,di,abjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * t1(d,i) t1(e,j) t2(a,b,k,l) + T += 1.0000 * einsum('clde,di,ej,abkl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + + # 1.0000 * P(i,j) t1(d,i) t3(a,b,e,j,k,l) + t = 1.0000 * einsum('clde,di,abejkl->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t2(a,d,i,k) t2(b,e,j,l) + t = 1.0000 * einsum('clde,adik,bejl->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(c,l) t2(a,b,j,m) + t = 1.0000 * einsum('lmik,cl,abjm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(d,l) t3(a,b,c,j,k,m) + t = 1.0000 * einsum('lmid,dl,abcjkm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t2(a,b,j,l) t2(c,d,k,m) + t = 1.0000 * einsum('lmid,abjl,cdkm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t2(a,d,i,l) t2(b,c,j,m) + t = 1.0000 * einsum('lmkd,adil,bcjm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * t1(d,l) t2(a,b,k,m) t2(c,e,i,j) + T += 1.0000 * einsum('lmde,dl,abkm,ceij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + + # 1.0000 * P(a,b) t2(a,d,k,l) t3(b,c,e,i,j,m) + t = 1.0000 * einsum('lmde,adkl,bceijm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t2(c,d,i,l) t3(a,b,e,j,k,m) + t = 1.0000 * einsum('lmde,cdil,abejkm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 0.5000 * P(a,b) t1(c,l) t3(b,d,e,i,j,k) + t = 0.5000 * einsum('alde,cl,bdeijk->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * P(a,b) t2(b,c,k,l) t2(d,e,i,j) + t = 0.5000 * einsum('alde,bckl,deij->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t2(a,b,i,l) t2(d,e,j,k) + t = 0.5000 * einsum('clde,abil,dejk->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 0.5000 * P(i,j) t1(d,j) t3(a,b,c,k,l,m) + t = 0.5000 * einsum('lmid,dj,abcklm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 0.5000 * P(i,j) t1(d,i) t3(a,b,c,j,l,m) + t = 0.5000 * einsum('lmkd,di,abcjlm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 0.5000 * t1(a,l) t1(b,m) t3(c,d,e,i,j,k) + T += 0.5000 * einsum('lmde,al,bm,cdeijk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + + # 0.5000 * t1(d,i) t1(e,j) t3(a,b,c,k,l,m) + T += 0.5000 * einsum('lmde,di,ej,abcklm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + + # 0.5000 * P(i,j) t2(a,b,i,l) t3(c,d,e,j,k,m) + t = 0.5000 * einsum('lmde,abil,cdejkm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 0.5000 * P(a,b) t2(a,d,i,j) t3(b,c,e,k,l,m) + t = 0.5000 * einsum('lmde,adij,bceklm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * P(a,b) t2(a,d,l,m) t3(b,c,e,i,j,k) + t = 0.5000 * einsum('lmde,adlm,bceijk->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # 0.5000 * P(i,j) t2(d,e,i,l) t3(a,b,c,j,k,m) + t = 0.5000 * einsum('lmde,deil,abcjkm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) f(l,d) t1(a,l) t3(b,c,d,i,j,k) + t = -1.0000 * einsum('ld,al,bcdijk->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) f(l,d) t1(d,i) t3(a,b,c,j,k,l) + t = -1.0000 * einsum('ld,di,abcjkl->abcijk' ,f[o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) f(l,d) t2(a,d,i,k) t2(b,c,j,l) + t = -1.0000 * einsum('ld,adik,bcjl->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(d,i) t2(c,e,j,k) + t = -1.0000 * einsum('abde,di,cejk->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t2(b,c,j,l) + t = -1.0000 * einsum('alik,bcjl->abcijk' ,g[v,o,o,o] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(c,l) t2(b,d,i,j) + t = -1.0000 * einsum('alkd,cl,bdij->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(d,l) t3(b,c,e,i,j,k) + t = -1.0000 * einsum('alde,dl,bceijk->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t2(b,d,i,j) t2(c,e,k,l) + t = -1.0000 * einsum('alde,bdij,cekl->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t2(b,d,k,l) t2(c,e,i,j) + t = -1.0000 * einsum('alde,bdkl,ceij->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(d,k) t2(a,b,j,l) + t = -1.0000 * einsum('clid,dk,abjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t2(a,d,i,j) t2(b,e,k,l) + t = -1.0000 * einsum('clde,adij,bekl->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t2(a,d,i,l) t2(b,e,j,k) + t = -1.0000 * einsum('clde,adil,bejk->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(a,l) t2(b,c,k,m) + t = -1.0000 * einsum('lmij,al,bckm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(c,l) t3(a,b,d,j,k,m) + t = -1.0000 * einsum('lmid,cl,abdjkm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t2(a,b,k,l) t2(c,d,j,m) + t = -1.0000 * einsum('lmid,abkl,cdjm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(a,l) t1(b,m) t2(c,d,i,j) + T += -1.0000 * einsum('lmkd,al,bm,cdij->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + + # -1.0000 * P(a,b) t1(a,l) t3(b,c,d,i,j,m) + t = -1.0000 * einsum('lmkd,al,bcdijm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * t1(c,l) t1(d,k) t3(a,b,e,i,j,m) + T += -1.0000 * einsum('lmde,cl,dk,abeijm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + + # -1.0000 * t1(c,m) t1(d,l) t3(a,b,e,i,j,k) + T += -1.0000 * einsum('lmde,cm,dl,abeijk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + + # -1.0000 * t1(d,l) t1(e,k) t3(a,b,c,i,j,m) + T += -1.0000 * einsum('lmde,dl,ek,abcijm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + + # -0.50000 * P(a,b) t1(b,l) t3(c,d,e,i,j,k) + t = -0.50000 * einsum('alde,bl,cdeijk->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t1(a,l) t3(b,d,e,i,j,k) + t = -0.50000 * einsum('clde,al,bdeijk->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(i,j) t1(d,k) t3(a,b,c,j,l,m) + t = -0.50000 * einsum('lmid,dk,abcjlm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(i,j) t2(a,b,l,m) t2(c,d,j,k) + t = -0.50000 * einsum('lmid,ablm,cdjk->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(a,b) t2(a,d,i,j) t2(b,c,l,m) + t = -0.50000 * einsum('lmkd,adij,bclm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * t1(c,l) t2(a,b,k,m) t2(d,e,i,j) + T += -0.50000 * einsum('lmde,cl,abkm,deij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + + # -0.50000 * t1(d,k) t2(a,b,l,m) t2(c,e,i,j) + T += -0.50000 * einsum('lmde,dk,ablm,ceij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + + # -0.50000 * P(a,b) t2(a,c,k,l) t3(b,d,e,i,j,m) + t = -0.50000 * einsum('lmde,ackl,bdeijm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(i,j) t2(c,d,i,k) t3(a,b,e,j,l,m) + t = -0.50000 * einsum('lmde,cdik,abejlm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.25000 * P(a,b) t2(a,c,l,m) t3(b,d,e,i,j,k) + t = -0.25000 * einsum('lmde,aclm,bdeijk->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.25000 * P(i,j) t2(d,e,i,k) t3(a,b,c,j,l,m) + t = -0.25000 * einsum('lmde,deik,abcjlm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(b,c)P(i,j) f(l,d) t2(a,b,i,l) t2(c,d,j,k) + t = 1.0000 * einsum('ld,abil,cdjk->abcijk' ,f[o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(2, 1) - t.swapaxes(4, 3) + t.swapaxes(2, 1).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('acde,di,bejk->abcijk' ,g[v,v,v,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(b,l) t2(c,d,j,k) + t = 1.0000 * einsum('alid,bl,cdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,j) t2(b,c,k,l) + t = 1.0000 * einsum('alid,dj,bckl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t2(b,c,j,l) + t = 1.0000 * einsum('alkd,di,bcjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(b,l) t1(d,k) t2(c,e,i,j) + t = 1.0000 * einsum('alde,bl,dk,ceij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t1(d,i) t1(e,j) t2(b,c,k,l) + t = 1.0000 * einsum('alde,di,ej,bckl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t3(b,c,e,j,k,l) + t = 1.0000 * einsum('alde,di,bcejkl->abcijk' ,g[v,o,v,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t2(b,d,i,k) t2(c,e,j,l) + t = 1.0000 * einsum('alde,bdik,cejl->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,d,j,k) + t = 1.0000 * einsum('clid,al,bdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('clde,al,dk,beij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,c,j,m) + t = 1.0000 * einsum('lmik,al,bcjm->abcijk' ,g[o,o,o,o] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(c,l) t1(d,k) t2(a,b,j,m) + t = 1.0000 * einsum('lmid,cl,dk,abjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t2(a,d,j,l) t2(b,c,k,m) + t = 1.0000 * einsum('lmid,adjl,bckm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(c,m) t2(b,d,i,j) + t = 1.0000 * einsum('lmkd,al,cm,bdij->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(b,c)P(i,j) t2(a,b,i,l) t2(c,d,j,m) + t = 1.0000 * einsum('lmkd,abil,cdjm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(2, 1) - t.swapaxes(4, 3) + t.swapaxes(2, 1).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t2(b,d,i,j) t2(c,e,k,m) + t = 1.0000 * einsum('lmde,al,bdij,cekm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b) t1(a,l) t2(b,d,k,m) t2(c,e,i,j) + t = 1.0000 * einsum('lmde,al,bdkm,ceij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(c,l) t2(a,d,i,m) t2(b,e,j,k) + t = 1.0000 * einsum('lmde,cl,adim,bejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(c,l) t2(a,d,k,m) t2(b,e,i,j) + t = 1.0000 * einsum('lmde,cl,adkm,beij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(i,j) t1(d,i) t2(a,b,j,l) t2(c,e,k,m) + t = 1.0000 * einsum('lmde,di,abjl,cekm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(d,k) t2(a,e,i,l) t2(b,c,j,m) + t = 1.0000 * einsum('lmde,dk,aeil,bcjm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t2(a,d,i,l) t3(b,c,e,j,k,m) + t = 1.0000 * einsum('lmde,adil,bcejkm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 0.5000 * P(a,b)P(i,j) t2(b,c,i,l) t2(d,e,j,k) + t = 0.5000 * einsum('alde,bcil,dejk->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(c,l) t2(b,d,j,k) + t = -1.0000 * einsum('alid,cl,bdjk->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(d,k) t2(b,c,j,l) + t = -1.0000 * einsum('alid,dk,bcjl->abcijk' ,g[v,o,o,v] ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(c,l) t1(d,k) t2(b,e,i,j) + t = -1.0000 * einsum('alde,cl,dk,beij->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t2(b,d,i,l) t2(c,e,j,k) + t = -1.0000 * einsum('alde,bdil,cejk->abcijk' ,g[v,o,v,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(d,i) t1(e,k) t2(a,b,j,l) + t = -1.0000 * einsum('clde,di,ek,abjl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(a,l) t1(b,m) t2(c,d,j,k) + t = -1.0000 * einsum('lmid,al,bm,cdjk->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t3(b,c,d,j,k,m) + t = -1.0000 * einsum('lmid,al,bcdjkm->abcijk' ,g[o,o,o,v] ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(c,l) t1(d,j) t2(a,b,k,m) + t = -1.0000 * einsum('lmid,cl,dj,abkm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t2(a,d,k,l) t2(b,c,j,m) + t = -1.0000 * einsum('lmid,adkl,bcjm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(c,l) t1(d,i) t2(a,b,j,m) + t = -1.0000 * einsum('lmkd,cl,di,abjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * t1(a,l) t1(b,m) t1(d,k) t2(c,e,i,j) + T += -1.0000 * einsum('lmde,al,bm,dk,ceij->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + + # -1.0000 * P(a,b) t1(a,l) t1(d,k) t3(b,c,e,i,j,m) + t = -1.0000 * einsum('lmde,al,dk,bceijm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(a,m) t1(d,l) t3(b,c,e,i,j,k) + t = -1.0000 * einsum('lmde,am,dl,bceijk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * t1(c,l) t1(d,i) t1(e,j) t2(a,b,k,m) + T += -1.0000 * einsum('lmde,cl,di,ej,abkm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + + # -1.0000 * P(i,j) t1(c,l) t1(d,i) t3(a,b,e,j,k,m) + t = -1.0000 * einsum('lmde,cl,di,abejkm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(c,l) t2(a,d,i,k) t2(b,e,j,m) + t = -1.0000 * einsum('lmde,cl,adik,bejm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(d,i) t2(a,b,k,l) t2(c,e,j,m) + t = -1.0000 * einsum('lmde,di,abkl,cejm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(d,l) t1(e,i) t3(a,b,c,j,k,m) + t = -1.0000 * einsum('lmde,dl,ei,abcjkm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(d,l) t2(a,c,k,m) t2(b,e,i,j) + t = -1.0000 * einsum('lmde,dl,ackm,beij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(i,j) t1(d,l) t2(a,e,i,k) t2(b,c,j,m) + t = -1.0000 * einsum('lmde,dl,aeik,bcjm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(a,b)P(i,j) t2(a,d,j,k) t2(b,c,l,m) + t = -0.50000 * einsum('lmid,adjk,bclm->abcijk' ,g[o,o,o,v] ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -0.50000 * P(a,b) t1(a,l) t1(c,m) t3(b,d,e,i,j,k) + t = -0.50000 * einsum('lmde,al,cm,bdeijk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b) t1(a,l) t2(b,c,k,m) t2(d,e,i,j) + t = -0.50000 * einsum('lmde,al,bckm,deij->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(i,j) t1(c,l) t2(a,b,i,m) t2(d,e,j,k) + t = -0.50000 * einsum('lmde,cl,abim,dejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(i,j) t1(d,i) t1(e,k) t3(a,b,c,j,l,m) + t = -0.50000 * einsum('lmde,di,ek,abcjlm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(i,j) t1(d,i) t2(a,b,l,m) t2(c,e,j,k) + t = -0.50000 * einsum('lmde,di,ablm,cejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -0.50000 * P(a,b) t1(d,k) t2(a,e,i,j) t2(b,c,l,m) + t = -0.50000 * einsum('lmde,dk,aeij,bclm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -0.50000 * P(a,b)P(i,j) t2(a,c,i,l) t3(b,d,e,j,k,m) + t = -0.50000 * einsum('lmde,acil,bdejkm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -0.50000 * P(a,b)P(i,j) t2(a,d,i,k) t3(b,c,e,j,l,m) + t = -0.50000 * einsum('lmde,adik,bcejlm->abcijk' ,g[o,o,v,v] ,t2 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(b,l) t1(d,i) t2(c,e,j,k) + t = 1.0000 * einsum('alde,bl,di,cejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('clde,al,di,bejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(c,m) t2(b,d,j,k) + t = 1.0000 * einsum('lmid,al,cm,bdjk->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,k) t2(b,c,j,m) + t = 1.0000 * einsum('lmid,al,dk,bcjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b) t1(a,l) t1(c,m) t1(d,k) t2(b,e,i,j) + t = 1.0000 * einsum('lmde,al,cm,dk,beij->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,d,i,m) t2(c,e,j,k) + t = 1.0000 * einsum('lmde,al,bdim,cejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(i,j) t1(c,l) t1(d,i) t1(e,k) t2(a,b,j,m) + t = 1.0000 * einsum('lmde,cl,di,ek,abjm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(d,i) t2(a,e,j,l) t2(b,c,k,m) + t = 1.0000 * einsum('lmde,di,aejl,bckm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(b,c)P(i,j) t1(d,k) t2(a,b,i,l) t2(c,e,j,m) + t = 1.0000 * einsum('lmde,dk,abil,cejm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(2, 1) - t.swapaxes(4, 3) + t.swapaxes(2, 1).swapaxes(4, 3) + + # 1.0000 * P(b,c)P(i,j) t1(d,l) t2(a,b,i,m) t2(c,e,j,k) + t = 1.0000 * einsum('lmde,dl,abim,cejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(2, 1) - t.swapaxes(4, 3) + t.swapaxes(2, 1).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(c,l) t1(d,i) t2(b,e,j,k) + t = -1.0000 * einsum('alde,cl,di,bejk->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(d,i) t1(e,k) t2(b,c,j,l) + t = -1.0000 * einsum('alde,di,ek,bcjl->abcijk' ,g[v,o,v,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,j) t2(b,c,k,m) + t = -1.0000 * einsum('lmid,al,dj,bckm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t2(b,c,j,m) + t = -1.0000 * einsum('lmkd,al,di,bcjm->abcijk' ,g[o,o,o,v] ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(i,j) t1(a,l) t1(b,m) t1(d,i) t2(c,e,j,k) + t = -1.0000 * einsum('lmde,al,bm,di,cejk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(4, 3) + + # -1.0000 * P(a,b) t1(a,l) t1(d,i) t1(e,j) t2(b,c,k,m) + t = -1.0000 * einsum('lmde,al,di,ej,bckm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t3(b,c,e,j,k,m) + t = -1.0000 * einsum('lmde,al,di,bcejkm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t3, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(a,l) t2(b,d,i,k) t2(c,e,j,m) + t = -1.0000 * einsum('lmde,al,bdik,cejm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -1.0000 * P(a,b)P(i,j) t1(d,i) t2(a,e,k,l) t2(b,c,j,m) + t = -1.0000 * einsum('lmde,di,aekl,bcjm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -0.50000 * P(a,b)P(i,j) t1(a,l) t2(b,c,i,m) t2(d,e,j,k) + t = -0.50000 * einsum('lmde,al,bcim,dejk->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # -0.50000 * P(a,b)P(i,j) t1(d,i) t2(a,e,j,k) t2(b,c,l,m) + t = -0.50000 * einsum('lmde,di,aejk,bclm->abcijk' ,g[o,o,v,v] ,t1 ,t2 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(c,m) t1(d,i) t2(b,e,j,k) + t = 1.0000 * einsum('lmde,al,cm,di,bejk->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + # 1.0000 * P(a,b)P(i,j) t1(a,l) t1(d,i) t1(e,k) t2(b,c,j,m) + t = 1.0000 * einsum('lmde,al,di,ek,bcjm->abcijk' ,g[o,o,v,v] ,t1 ,t1 ,t1 ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(4, 3) + t.swapaxes(1, 0).swapaxes(4, 3) + + return T + diff --git a/codes/lccd.py b/codes/lccd.py new file mode 100644 index 0000000..ad09d25 --- /dev/null +++ b/codes/lccd.py @@ -0,0 +1,56 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [LD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [LD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * t2(c,d,i,j) + T = 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + diff --git a/codes/lccsd.py b/codes/lccsd.py new file mode 100644 index 0000000..cc87b82 --- /dev/null +++ b/codes/lccsd.py @@ -0,0 +1,98 @@ + +'''s - spin orbitals, o - occupied spin orbitals, v - virtual spin orbitals +t1[v,o] - singles amplitudes, t2[v,v,o,o] - doubles amplitudes +l1[o,v] - singles lambda, l2[o,o,v,v] - doubles lambda +''' + +def cc_energy(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [LSD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # -0.50000 * + T = -0.50000 * einsum('ijij->' ,g[o,o,o,o], optimize=True) + + # 1.0000 * f(i,a) t1(a,i) + T += 1.0000 * einsum('ia,ai->' ,f[o,v] ,t1, optimize=True) + + # 0.2500 * t2(a,b,i,j) + T += 0.2500 * einsum('ijab,abij->' ,g[o,o,v,v] ,t2, optimize=True) + + # 1.0000 * f(i,i) + T += 1.0000 * einsum('ii->' ,f[o,o], optimize=True) + + return T + +def cc_singles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [LSD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 1.0000 * f(a,b) t1(b,i) + T = 1.0000 * einsum('ab,bi->ai' ,f[v,v] ,t1, optimize=True) + + # 1.0000 * f(j,b) t2(a,b,i,j) + T += 1.0000 * einsum('jb,abij->ai' ,f[o,v] ,t2, optimize=True) + + # 1.0000 * t1(b,j) + T += 1.0000 * einsum('ajib,bj->ai' ,g[v,o,o,v] ,t1, optimize=True) + + # 0.5000 * t2(b,c,i,j) + T += 0.5000 * einsum('ajbc,bcij->ai' ,g[v,o,v,v] ,t2, optimize=True) + + # -1.0000 * f(j,i) t1(a,j) + T += -1.0000 * einsum('ji,aj->ai' ,f[o,o] ,t1, optimize=True) + + # -0.50000 * t2(a,b,j,k) + T += -0.50000 * einsum('jkib,abjk->ai' ,g[o,o,o,v] ,t2, optimize=True) + + # 1.0000 * f(a,i) + T += 1.0000 * einsum('ai->ai' ,f[v,o], optimize=True) + + return T + +def cc_doubles(f, g, o, v, t1=None, t2=None, t3=None): + + ''' + COGUS generated level [LSD] on 28 Jul 2021 + ''' + from numpy import einsum, swapaxes + + + # 0.5000 * t2(c,d,i,j) + T = 0.5000 * einsum('abcd,cdij->abij' ,g[v,v,v,v] ,t2, optimize=True) + + # 0.5000 * t2(a,b,k,l) + T += 0.5000 * einsum('klij,abkl->abij' ,g[o,o,o,o] ,t2, optimize=True) + + # 1.0000 * P(i,j) f(k,i) t2(a,b,j,k) + t = 1.0000 * einsum('ki,abjk->abij' ,f[o,o] ,t2, optimize=True) + T += t - t.swapaxes(3, 2) + + # 1.0000 * P(i,j) t1(c,j) + t = 1.0000 * einsum('abic,cj->abij' ,g[v,v,o,v] ,t1, optimize=True) + T += t - t.swapaxes(3, 2) + + # -1.0000 * P(a,b) f(a,c) t2(b,c,i,j) + t = -1.0000 * einsum('ac,bcij->abij' ,f[v,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) + + # -1.0000 * P(a,b) t1(b,k) + t = -1.0000 * einsum('akij,bk->abij' ,g[v,o,o,o] ,t1, optimize=True) + T += t - t.swapaxes(1, 0) + + # 1.0000 * P(a,b)P(i,j) t2(b,c,j,k) + t = 1.0000 * einsum('akic,bcjk->abij' ,g[v,o,o,v] ,t2, optimize=True) + T += t - t.swapaxes(1, 0) - t.swapaxes(3, 2) + t.swapaxes(1, 0).swapaxes(3, 2) + + # 1.0000 * + T += 1.0000 * einsum('abij->abij' ,g[v,v,o,o], optimize=True) + + return T + diff --git a/document/CCSDT-n.ipynb b/document/CCSDT-n.ipynb new file mode 100644 index 0000000..2152f2b --- /dev/null +++ b/document/CCSDT-n.ipynb @@ -0,0 +1,244 @@ +{ + "cells": [ + { + "attachments": { + "1.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "627a4314", + "metadata": {}, + "source": [ + "### The CCSDT-n Equations\n", + "\n", + "__CCSD__ and __CCSDT__\n", + "\n", + "The CCSD equations are\n", + "\n", + "$\\langle 0| \\hat{H}_N (\\hat{T}_1+\\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1) | 0 \\rangle_C = \\Delta E$...[1]\n", + "\n", + "$\\langle ^a_i| \\hat{H}_N (1+\\hat{T}_1+\\hat{T}_2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1 + \\frac{1}{(3!)^2} \\hat{T}^3_1) | 0 \\rangle_C = 0$...[2]\n", + "\n", + "$\\langle ^{ab}_{ij}| \\hat{H}_N (1+\\hat{T}_1+\\hat{T}_2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1+ \\frac{1}{2}\\hat{T}^2_2 + \\frac{1}{2}\\hat{T}^2_1 \\hat{T}_2 + \\frac{1}{(3!)^2} \\hat{T}^3_1 + \\frac{1}{(4!)^2}\\hat{T}^4_1) | 0 \\rangle_C = 0$...[3]\n", + "\n", + "The CCSDT equations are\n", + "\n", + "$\\langle 0| \\hat{H}_N (\\hat{T}_1+\\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1) | 0 \\rangle_C = \\Delta E$\n", + "\n", + "$\\langle ^a_i| \\hat{H}_N (1+\\hat{T}_1+\\hat{T}_2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1 + \\frac{1}{(3!)^2} \\hat{T}^3_1 ~~~~+\\boldsymbol{\\hat{T}_3~~~~})| 0 \\rangle_C = 0$...[4]\n", + "\n", + "$\\langle ^{ab}_{ij}| \\hat{H}_N (1+\\hat{T}_1+\\hat{T}_2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}^2_1+ \\frac{1}{2}\\hat{T}^2_2 + \\frac{1}{2}\\hat{T}^2_1 \\hat{T}_2 + \\frac{1}{(3!)^2} \\hat{T}^3_1 + \\frac{1}{(4!)^2}\\hat{T}^4_1~~~~+\\boldsymbol{\\hat{T}_3 + \\hat{T}_1\\hat{T}_3~~~~}) | 0 \\rangle_C = 0$...[5]\n", + "\n", + "$\\langle ^{abc}_{ijk} | \\hat{T}_2 + \\hat{T}_3 +\\frac{1}{2}\\hat{T}^2_2 + \\hat{T}_1 \\hat{T}_2 + \\hat{T}_2 \\hat{T}_3 + \\hat{T}_1 \\hat{T}_3 + \\frac{1}{2}\\hat{T}^2_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}_1 \\hat{T}^2_2 + \\frac{1}{2}\\hat{T}^2_1 \\hat{T}_3 + \\frac{1}{(3!)^2} \\hat{T}^3_1 \\hat{T}_2 |0 \\rangle_C=0$...[6]\n", + "\n", + "The energy equation is the same in CCSD and CCSDT although the amplitudes will be different.\n", + "\n", + "__CCSDT-1a__\n", + "\n", + "This model uses [1] for the energy. \n", + "\n", + "The singles use [4] which is [2] with addition of \n", + "![1.png](attachment:1.png)\n", + "which is $\\frac{1}{4} \\displaystyle \\sum_{mnef} \\langle mn||ef \\rangle t^{aef}_{imn}$\n", + "\n", + "The doubles use [3] with the addition of diagrams ($\\hat{T}_3$)" + ] + }, + { + "attachments": { + "2.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "dd704d26", + "metadata": {}, + "source": [ + "![2.png](attachment:2.png)\n", + "which are $+\\displaystyle \\sum_{me} f^e_m t^{abe}_{ijm}~~~~~~+\\frac{1}{2} \\boldsymbol{P}(ab) \\displaystyle \\sum_{mef}\\langle bm||ef \\rangle t^{aef}_{ijm}~~~~~ - \\frac{1}{2} \\boldsymbol{P}(ij) \\displaystyle \\sum_{mne} \\langle mn||je \\rangle t^{abe}_{imn}$\n", + "\n", + "The triples use diagrams($\\hat{T}_2$)" + ] + }, + { + "attachments": { + "3.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "63f96c67", + "metadata": {}, + "source": [ + "![3.png](attachment:3.png)\n", + "which are $+\\boldsymbol{P}(k/ij)\\boldsymbol{P}(a/bc) \\displaystyle \\sum_{d}\\langle bc||dk \\rangle t^{ad}_{ij}~~~-\\boldsymbol{P}(i/jk)\\boldsymbol{P}(c/ab) \\displaystyle \\sum_{l}\\langle lc||jk \\rangle t^{ab}_{il}~~~~~+\\boldsymbol{P}(c/ab)\\displaystyle \\sum_{d} f^c_d t^{abd}_{ijk}~~~~~-\\boldsymbol{P}(k/ij)\\displaystyle \\sum_{l} f^k_l t^{abc}_{ijl}$\n", + "\n", + "where $\\boldsymbol{P}(i/jk) \\rightarrow 1 - \\boldsymbol{P}(ij) - \\boldsymbol{P}(ik)$\n", + "\n", + "__CCSDT-1b__\n", + "\n", + "In addition to the additions of the CCSDT-1a model we now add to the doubles ($\\hat{T}_1 \\hat{T}_3$)" + ] + }, + { + "attachments": { + "4.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "25086961", + "metadata": {}, + "source": [ + "![4.png](attachment:4.png)\n", + "which are $+\\displaystyle \\sum_{mnef} \\langle mn||ef \\rangle t^e_m t^{fab}_{nij}~~~~~-\\frac{1}{2}\\boldsymbol{P}(ab) \\displaystyle \\sum_{mnef} \\langle mn||ef \\rangle t^a_m t^{efb}_{inj}-\\frac{1}{2}\\boldsymbol{P}(ij) \\displaystyle \\sum_{mnef} \\langle mn||ef \\rangle t^e_i t^{afb}_{mnj}$" + ] + }, + { + "attachments": { + "5.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "720541e9", + "metadata": {}, + "source": [ + "__CCSDT-2__\n", + "\n", + "In addition to the CCSDT-1b diagrams we additionally add to the triples ($\\hat{T}^2_2$)\n", + "![5.png](attachment:5.png)\n", + "which are $-\\boldsymbol{P}(k/ij)\\boldsymbol{P}(a/bc) \\displaystyle \\sum_{ld} f^d_l t^{ad}_{ij} t^{bc}_{lk}~~~~~+\\boldsymbol{P}(i/jk) \\boldsymbol{P}(abc) \\displaystyle \\sum_{lde} \\langle lb||de \\rangle t^{ad}_{il} t^{ec}_{jk}~~~~~~-\\boldsymbol{P}(ijk) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lmd} \\langle lm||dj \\rangle t^{ad}_{il} t^{bc}_{mk}$\n", + "$~~~~~~~~~~~~~~-\\frac{1}{2} \\boldsymbol{P}(i/jk) \\boldsymbol{P}(c/ab) \\displaystyle \\sum_{lde} \\langle lc||de \\rangle t^{ab}_{il} t^{de}_{jk}~~~~~+\\frac{1}{2} \\boldsymbol{P}(k/ij) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lmd} \\langle lm||dk \\rangle t^{ad}_{ij} t^{bc}_{lm}$\n", + "\n", + "where $\\boldsymbol{P}(abc) \\rightarrow a\\boldsymbol{P}(bc) + b\\boldsymbol{P}(ca) + c\\boldsymbol{P}(ab)$\n", + "\n", + "__CCSDT-3__\n", + "\n", + "In addition to CCSDT-2 diagrams we additionally add to the triples (other $\\hat{T}_1 \\hat{T}_2$, $\\hat{T}_1^2 \\hat{T}_2$ and $\\hat{T}_1 \\hat{T}_2^2$ contributions)" + ] + }, + { + "attachments": { + "6.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "326f7e40", + "metadata": {}, + "source": [ + "![6.png](attachment:6.png)\n", + "which are $+\\boldsymbol{P}(i/jk)\\boldsymbol{P}(c/ab) \\displaystyle \\sum_{de} \\langle ab||de \\rangle t^d_i t^{ec}_{jk}~~~~~+\\boldsymbol{P}(k/ij)\\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lm} \\langle lm||ij \\rangle t^a_l t^{bc}_{mk}~~~~~-\\boldsymbol{P}(ijk)\\boldsymbol{P}(a/bc) \\displaystyle \\sum_{ld} \\langle al||id \\rangle t^d_j t^{bc}_{lk}$\n", + "$~~~~~~~~~~~~~-\\boldsymbol{P}(i/jk)\\boldsymbol{P}(abc) \\displaystyle \\sum_{ld} \\langle al||id \\rangle t^b_l t^{dc}_{jk}$" + ] + }, + { + "attachments": { + "7.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "ab029150", + "metadata": {}, + "source": [ + "![7.png](attachment:7.png)\n", + "which are $-\\boldsymbol{P}(i/jk) \\boldsymbol{P}(abc) \\displaystyle \\sum_{lde} \\langle lb||de \\rangle t^d_i t^a_l t^{ec}_{jk}~~~~~+\\boldsymbol{P}(ijk) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lmd} \\langle lm||dj \\rangle t^d_i t^a_l t^{bc}_{mk}~~~~~-\\boldsymbol{P}(k/ij) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lde} \\langle al||de \\rangle t^d_i t^e_j t^{bc}_{lk}$\n", + "$~~~~~~~~~~~~~~+\\boldsymbol{P}(i/jk) \\boldsymbol{P}(c/ab) \\displaystyle \\sum_{lmd} \\langle lm||id \\rangle t^a_l t^b_m t^{dc}_{jk}$" + ] + }, + { + "attachments": { + "8.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAABTCAIAAADxzo8HAAAAA3NCSVQICAjb4U/gAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAIABJREFUeJztnXdAFNfa/8/u0qVIXZqAIERBpCwmKIolYtQrmlgSkxtFMepVo17vfRPSjBprTOKNGk1iElusMRo10URjbLEE3QV7QREURRAQkL5tfn88vzvvZGb3zJnZguSdz1/sYebMM8+ePfV7niOjKApJSEhISEi0ZeStbYCEhISEhISlSI2ZhISEhESbR2rMJCQkJCTaPFJjJiEhISHR5pEaMwkJCQmJNo/UmElISEhItHmkxkxCQkJCos0jNWYSEhISEm0eqTGTkJCQkGjzSI2ZhISEhESbR2rMJCQkJCTaPDZpzIxGY2FhIeHFZWVldXV13PSampqKigqr2sWmrq6urKyMm97S0nL37l3CTIqLi3U6ndBHFxYWEkbFrKysrK6uFpo/Qkin0xUXF4u4URzmnCbIjHv37jU3Nwt99N27d1taWkiurK2tffjwodD8EUIGg+H27dsibhSHuV+QIDMePHhQX18v9NHi7hKNue/uCTHDXO3Epamp6d69e0Kf29jYeP/+faF3icZcpdrU1NTmzCgqKtLr9X9KomzAunXrFApFfX09ycUTJkzo3r07Nz08PDwnJ8fapv2JTZs2yeXy2tpaVvr48eOffvppwkyioqL+9a9/CXruwYMHEUI3b94kuXjOnDlBQUGC8gfeeeedkJAQETeK48iRIwihq1evstLfe+89cvv79Onz0ksvCXru5cuXEULHjh0jufjzzz93cnJqbm4W9AiKolavXu3k5NTS0iL0RnFcv34dIXT48GFW+po1a8jtf+WVV3r16iXouVVVVTKZbNu2bYLusoTk5OTXXnuNlVhdXS2TybZs2WI3M1JSUrKzs1mJNTU1Mpls8+bNJDn89NNPCKHi4mJBzx02bNigQYME3WIJK1ascHV11el0rPThw4c/99xzdjNj5cqVLi4uXDOef/75gQMHEmbi5+f3wQcfMFNsMjJTqVQGgyE/P5/kYrVanZKSYjITjUZjbdPYj46JifH09GSlJycnX7x4kWS8VV1dffv2bZP2Y0hJSZHJZIRvZ84/vKhUqvv37z948EDEvSJQq9Xu7u5PPfUU14wHDx6Ulpby5mA0GvPz81UqlaDndu7cuV27duTOjI+Pd3Z2FvQIhJBKpdJqtZcuXRJ6ozjUarVMJktKSrLEDBElx8fHp2PHjrb+3dG0tLRcvnyZ+423b98+KirKbmaAS7lmeHl5derUibxo+fn5hYeHC3p0cnKyWq0WdIslqNXqxMREBwcHrhl28zbeDLVaTRFMWRUVFVVWVrKKt00as7i4ODc3NxLvNDY2Xrt2zWT9BY0ZyYuJRq1Wm3x0SkpKc3PzlStXeHMAC0VUGeHh4YSlJy8vT2j9DoBVeXl5Iu4VgUajSU5OlsvZJQrMIHnZgoKCx48fC3WmQqFITEwkr3HEOTMhIcHR0dFuP3iNRhMVFeXj4yPajMePH9+6dUvEy6pUKrtVrxcvXtRqteb6snYz49KlSy0tLRaaodFoRHQ6U1JSKisryRc1LART41VWVt65c6fVzXj06BGJGfATSE5OZibapDFTKBTdunUj+clduHBBr9eba8yqq6uLiopsYCBCCBkMhgsXLph8dEJCgoODA4n9Go3G09MzKipK6NMJx50lJSXl5eXi6t+wsDB/f3971r8m7QwNDQ0MDCR0psnhCC+Ezmxubr569ao4Z7q4uMTGxra6M52dnePi4kjMyMvLMxqN4hozuFfojSLQaDSOjo5du3ZtdTMcHBzi4+NNmpGfn09ihrmvDA95V89y6uvrCwoKzFW2djOjsbHxxo0b5hozQjM0Gk2HDh2USiUz0VZqRsL6RaPRwO/TZA7Ilv69fv16Q0ODSZ+6ubl17tyZ0H6TwxFeCMedYIO4+hfZcfagtra2sLDQnJ1JSUmEzoyKimrfvr3Qp6tUqoKCgtraWvxlMHUs2pl2mPcGjEbj+fPnzdlJ/styd3ePiYkR+nSVSvX48WNyAZclaDSarl27uri4mDSjvr7+5s2b9jEjLi7O1dXVnBkFBQX4HMrLy0tLS0UULaVSGRwcbJ9ydf78eYPBYNJIpVIZEhJiHzPy8/PNmeHv7x8aGkpYvLk52LAxu379Oq8eSaPRdOvWzdHRkfsvPz+/sLAw2/lXo9HI5fLExEST/yWvMsRVjiqVqra2lleZptFoAgMDg4KCRDwCIZSSkmKfAgoNM6b+JZmrscSZFEVduHCBN38nJyeT4wDCp8B8lLjbyYHpVowzL1++zGuGRqNJTExUKBRCn65SqWQymX2m+DDfOJhht9Jrzozk5GQSM8Bdokuv3V7T1dW1S5curW6Gi4uLhWaYXHyxYWNmNBpJ6hfMRLNN62KNRmNS/QGoVCpeDQjMgope0CKpMjQaTffu3UXkD9hNA4IfB6hUqrKyMrwGBD8cwUOoAdFoNOLUHwCIL0A8aVNgupW1HsAyg1cDIm4JByHk7e1tHw2IVqu9cuWKuW/cy8vLPhoQ+E4xZpBoQED9ERYWJsIAu60OQv+GK7ugzbBbY5aYmGhyAIP+6w38lFVRUVFVVZX9GjPQgOC/JIz6A7CpBgSvBSDRgIhTfwCEGhDR6g8A7rWDBgQ/3UoyFY4fjuAh1ICIVn8AdtOA4KdbScwQrf4A7FOvXbhwQavV4n/+dqjlMeoPcjNEdx2QHTUgvDWefTQgvGbwakBMqj+Q7RozEg0IRv0B2E4DglF/ACQaENHqD4C3yrBE/QHYTQOCnyEk0YDghyO88NY4lqg/ALtpQPDOJNGAiFZ/APYRX4D6w6Tsws5mmFN/0GbwakBEz5Aje2lAMOoPwD4aEIz6AyDxhkn1B7JpOCveyhqj/qBzQLbxL0b9AZBoQESrPwDecaeF6g/ADhoQvPoD4NWAiFZ/ACqV6ubNm48fPzZ3gYXqD/optnYmyXQryS9LnPqDzt8OGhCM+oM2ww4aEIz6g2kGRgMiWv0B2EcDglF/0GbYQQOCUX8AJBoQc10H2zZmeA2IRqOBORNzF9hOA4JXfwAkVYaFc4B4DYiF6g/ADhoQvPqDNgM/crLcmdAMYPK3RP1BP8XWGhCS6VZeDYhGo0lKShKh/qDzt4MGhPcbt48GhNcMXg2IJeoPwA6dJLz6w55mYNQfhGaYW3yxbWOG14CQrGHYqC7Gqz8AvAbEEvUHwKsBsVD9AdhBA0IyDsBrQCxRfwC8GhAL1R+AHTQgJNOtKSkpeA2IhauDdtCA4NUfgB00IHj1B20GXgNiifoDsMPqIF79QZthh8YMo/6gzcBoQMypP5BNGzO8BqSxsfH69eu8PzkbaUAI21GMBsQS9QfAqwGxUP0B2EEDQjLdip8xtkT9AfBqQCys3wE7aEBIplthN4s5M2CG8AmfUIXYHyQ/f5vW8rzqDxIzLFF/AHbQgBDWeLbWgBCagdGAmFN/IJs2ZngNCK/6A7CFBoRX/QHgNSAWqj8ATJVhufoDsIMGhGSGEK8BsVD9AWBqHMvVH4AdNCAkzsRrQCxUfwC2Fl+o1Wq8+sM+ZvCqP2gzMBoQC2fIke01ILzqD8DWGhBe9QeA94Y59Qey9XlmmMqaV/1B54Cs7V9e9QeA14BYqP4AMONOq6g/mE+xPB+TkKg/AIwGxEL1B4DRgFhF/UE/xXbOJJ9uxf+yLFF/0PmDvt+STDDwqj9oM2yqAeFVfzDNMKkBsVD9AdhaA8Kr/qDNsKkGhFf9AeA1IJiug+C6uKamZu/evfv37yc5bQijAeFVfwDkGpBr165t3bqVMNIEr/oDwFcZVpkDNKcBIVd/XL16devWrRgXCZqrKS8v/+677w4fPkx4SBv5dCtGA2ItZ5rTgJCrP27fvr19+/aTJ0+am9kWpAGpqqr64Ycffv7558bGRpLryUMtYzQgFqo/6PzJxRdGo/HYsWM7duwgnygj/MaFmnH8+PHt27eTT5QRmoHRgFiu/gAEdZJu3ry5bdu2M2fOEF5Pov4QYcatW7e2bdt2+vRpcjN41R+8ZuAWXwSdQwM1LNwYERFx48YN/PWg/oCqgUXXrl2nTp1K8tARI0YMGDAAf83cuXPpQVJWVpbRaMRcPHPmzM6dO5M8Gs7d0Wq1rPRHjx7JZLKtW7eSZIIBjo/avn0791+DBw/OzMzkzWHOnDkymQxenHsgE7B7926EUGlpKW9uBw4coEUxiYmJlZWVvLcsW7bM3d3dYDDwXrlnzx6E0P3791npBoPB09Nz2bJlvDng0ev17dq1W758OfdfEydOVKlUvDmsWbOG7l0NHjyY+71TFPXHH38ghGCBGs+pU6f8/Pwgt+joaJKTrjZv3iyTyaqrq3mvPHv2LELo3Llz3H9FR0f/85//5M2Bl8jIyH//+9+8lzU0NPTu3Rte08XFheT0r5aWFicnp88//5zEjE6dOpGcF9jU1NSvXz8ww9nZecOGDSRmODs7r169msSM6Ojo2bNnc9PnzZvn5+dHkgMe8nw++eQTWsfxwgsv6PV63lvGjh3bo0cPksznz59PaMbKlStpMzIzM7mHk3EZN25camoqSeYffPCBj48PtxqHfv+BAwdM3iWsMWP1GXmPldPr9W5ubp9++ikrvaGhwcHB4euvvyZ56KJFi7y9vTHtE6y4MA37/vvvMRn27Nnz73//O8mjodORn5/PSv/1118RQgUFBSSZ4ImIiHjjjTe46Uqlct68efh7z549y3rxH374gXsZdFR/+uknfG46nS4gIICZ27Rp03jtf+mll9LT03kvoyiqpKQEIbRv3z5W+rVr1xBCv/32G0kmeMx9swkJCZMnT8bfe/fuXScnJ+brr1y5kntZU1OTo6Pjl19+yWtM586dmbmNHDmS95bZs2d36tSJ9zKKopqbmx0dHb/44gtWem1trVwu//bbb0kywTN69Oi+ffvyXjZv3jzma7Zr1+7Ro0f4W86dO4cQOnv2LIkZhAVs0aJFTDPc3NwqKirwt8CgKjc3l8SMMWPG9O7dm5uemZlpldM14WzPO3fu4C8rKChgjblJatEuXbq8/vrrJGbs378fERwxevv2bZYwkqRrEhsbO336dBIzDhw4gBAqKipipe/cuRMhVFZWZvIuAY1ZS0sL7xIRaxCWk5ODuTgvL4++cubMmeYuW7t2LUKosLAQrpw8eTLeBoQQpisH/fdPPvmE5JXNNboffvihp6cnyXCEl5EjR/bv35+VaK7eZ7Fq1SpeVyCEJk+e7O/vP3/+fPrGbdu2kdyYlJTEa3+nTp1M9lhNEhgYOHfuXFYiDEd4a0ASTI65ofnh1vssYOBI4kxW00jozODgYF7709PTyQ/aTkxMnDRpEivx6NGjyNR53yJYunSpl5cXfpKDoqhBgwbhX5zZTSkvLzd5DaulHzlypMnLmLXYb7/9hn/ur7/+irf8yy+/dHBwaGxsJPHGRx99ZHIGIjg4+N133yXJAQ/sWtm9ezf+sq1btz6Z3h43bhze8oaGBoVCsW7dOhJvPHz4EJkak7z11lsdOnQwd5ewkVloaCjzBUgqu+nTp8fFxbESP/vsM2dnZ8JD6CsqKhBC3333nbkLfv75Z5ZnP/vsM3MXwyahY8eOkTyaoqj4+HjudOiLL77Yp08fwhzwLF68uH379qwqw9yMHAvozTEx1z8aNGjQsGHD8LnV19ezljDpQm9uDkHQufIURQ0ePHjo0KGsRPLhCC8bN26Uy+WPHz9mJubm5iIzM3JMuBsi33nnHZNXZmdnYyYtwVdGo5F1tGavXr3wBgidbp04cWJycjIr8eOPP3Z3dyeZeuIFph94lxKmTp3KfE2ZTEYPL8wVm0mTJpFUHQBUo9evXzf5X/oR3N4w3f01B/RLCM04cuQIQujatWvMxLKyMkTQAhGCaRfp1+Suky1cuBCf7e+//44QunjxIqEZISEh5ko+DXfxm+6kmvvST548iRC6cOECoRmhoaFvv/02KzEjI+P55583d4swAci///1v1q+d9xbQgDQ0NDATNRpNt27dWLM65oDDyDHLkgMHDuzZsyf9sUOHDhMmTDB3Mag/yE+ANBkOyiqCBUClUtXU1LBCB2k0mqCgoODgYPy9gwcP7tixI/3R29s7KyvL3FN413XbtWs3Y8YM+qNCoXj//ffhb26rSdtJCdlsZ1IDYl1nGo3G/Px8ZmJeXp6TkxOv/Lpbt249evSgP7q4uMyaNcvcUy5fvqzVarn/Kioqgo2JMpnsvffeo9NlMtncuXPxBgg9aNukBsQq6g86fxLxRU5ODnMr+qhRo2D7sF6vP3TokMlbBO35w5tBl8w33niDacYLL7wQGRmJz1lQwQPpMqv0wnypFUsv72umpqampaXR6Z6entOmTcNnS67+4DWDeU2fPn3ojx4eHnTVgakrCNUfADdcBkVR+K23whqzO3futG/ffurUqVOmTHFyciouLua9RaVSGQwGlsZMaP2F969cLo+JifHy8srKyoqIiFAqlW5ubuYu1mg00dHR+NgfTFJSUlhxQKqrq2/fvm3FEow4ew8I/aPVauvr6/v27TthwoTMzMyGhoaamhpzT7l//z50JDHcvHkzICAgOzt7zJgxBoPh+vXrkP7DDz9UVVVxrwcVeHR0NK+ptBmsOCCWx/5gYjIOiFqt7tq1K2/sD4qiampqunfvPnHixNGjR7e0tJibpVGpVC0tLSYDcKjVarqoFxQUuLu7Z2dnZ2VlyeVykkNbBB20bTIOiFX2hgOEcUBKSkq0Wu3w4cMnTpwYERFRVFQE+7GuXr166tQp7vUksT+YeHl5RUZGmjTDYDBs3LgR/i4uLqbNiIyMLCkpwe9OI4n9wTKDG45Eo9FYGPuDCUZ1/NNPP8GPV6vVVlZWdunSZeLEic8991xjYyOvghR04/jYHywzeL90rVZbXl4eExMDZjQ1Nd27dw/+BatC5szgla8zzWDFASkuLq6qqsL19ggHfRRF1dbWenp6zpkzBz5mZ2eHhYXxilh0Op2rq+uKFSvolMbGRgcHh6+++or80XgNSGFhoaOjI8hMYG7k559/NpdVWlraK6+8Qv5o+EEyNSCHDx9G5uc9RMDVgCiVSu7aEpevv/5aoVDAdAp8O++9957JK0k0ID/++CNizJmMGDEiNDS0rq6OoqiuXbseOnSIewu5+gPgrgVCe2kV9QeQlpbG0oAkJSVx15a4wJrz6dOnKYrS6XRhYWHm1KGNjY3mNCA5OTmzZs2iKOrcuXNyuZye7p4xY4aHhwd+3ljodCtXA2JF9QfAqwHR6XTdunVLS0uD3+apU6dkMhn8tDds2DBw4EDuLYLUH8BLL71kclb/4sWLvr6+YEZCQkLPnj3BjLNnz8rl8rVr12LyhGbjjz/+IDeDqwGxlvoDgB+gSQ1IQkIC1GmLFi1ycnKCNVGdThcfH9+rVy/8umZsbCyh+gOAoRVeA7J48WIHBweYumSaAQJRk8LpuLg4QvUHwNWAgPqjvLzc3C0CGjPIq6SkBD7CUgT8+PGkpqYylwdh2pep/uDll19+QeYnwbOzs4OCguiF3LS0tGeeecbklYLUHwBXA2JF9QfA0oAQqj8oiho0aNBzzz1Hf5wyZQpmywFLA8KiqakpMDCQmdvdu3fbtWuXk5MDAoolS5Zw7yKUTTNhaUBA/VFVVSUoEwwzZsxgOoFQ/UFRVHZ2dnx8PP1x/vz53t7e5hafzMkjBwwYkJ6ebjAYnnnmmaSkJPr22tpaf39//F6L9PT0MWPG8NrJhKUBsaL6A1i6dCm+qH/wwQdyuZzZ1Rs/fryPj09FRcWsWbOgpWHxxRdfODo6NjU1kZthbvvH+vXroUZavny5QqFgmjFhwgR3d3eMoFGQ+gPgakCspf4AzK3AQRlevHgx/ZOk/3X8+HGZTIYRNNbV1SkUivXr1ws1Y9euXeYuuHv3rouLy5tvvkmnnDhxQiaTffvttzDD/+OPP7JuEaT+ALgaELz6gxLUmE2dOrVLly70R71e7+3tvWjRIt4bp0+fHhsbS39ctWqVs7OzyU085sBoQIqLi52cnJjqf5ipNzk4A/XH8ePHyR9NcbbEEUqWyVm8eDFTNvbDDz8ggm1hOp3Ow8Pjo48+olOgt2Gu+z9o0CBzlanRaBwwYIBMJrt+/fqxY8fOnz8P6dAN/O677xBCo0aNYt0F6o8tW7aQvCMNSwNiRfUHsGHDBrlcXltbCx+hy0WyLSwiIoLZMMOIHBYFuZjTgPj6+np5eX355ZcymQyKmU6nO3z48I0bN1auXInML9cbDAbWt0kCSwNiRfUHAJMQ5jQgp06dksvlw4cPf/jw4b59++rr6ymKKi8v9/b2njp1KqypcDv4kyZNSkxMFGSGOQ0IrNNs2rTJy8trxowZkHjjxo2DBw9WVFQ4OjrGxsaaq2cEqT8AlgbEuuoPwGTrCHsKR48ezZwsqamp2bNnT3V1dWpqqoODgzlhhVD1B4DRgDQ3N4eHh7u4uFRXV+/fv//27duQ/vLLLyuVytWrVyOEuHuKhKo/AJYGBK/+oAQ1ZomJiVOmTGGmDB069G9/+xvvjevWrVMoFFDWKYqaMGFC9+7dyZ8LhIeHM7skNKxhGWBucAZqN7qmI2T8+PFPP/00/TEqKkrocATPwYMHEUI3b96Ej3PmzAkKCuK9C+a1mdM15vSswLvvvhsSEsJNb2pqev755xFC3bp1oyhKp9PNnDkzPDx88uTJu3fvjomJgf1SHTt2ZN2Il5mZY86cOYGBgfRHQWJ0EmANie6vrFmzxsnJqbm5GX8XnCqwZ88eOkWr1bq6uq5atcrk9atXr+bKcelILt7e3mPHjt23b9/kyZM7dOjwzTffUBRlNBph3Y6eqGcCm+2OHDki6GVZb/fyyy+b3AslGkxwgP3798P6B5TbkydPhoeHDxgw4NNPP124cKFcLnd3dzfZwU9OTn7ttdcEmWGu2wSCnYSEhICAgDNnzsydO1elUo0aNQqqmoyMDIRQUlLSw4cPuXmqVCpz08gYM5izuJhZQdGYnLdcs2YNQgjkYF999dXGjRuHDh0aGRkJAt1jx44hhFxcXEzO1X/66aeurq4kO5qZDBs2jDlJQ1NaWgq1wauvvkpRVG1tbWZmZmxsbE5Ozt69e728vCCsErfTvGLFCpPRJ/A8//zz9Ey10Wj09fVdsGAB5noBjVlAQMDixYuZKdOnTyeR2LLigJDH/mAyYsSIZ599lpXIHZYB5gZnrDkoQphDSfh5b9u2TWgmGFhxQDBDKCbwW2LNILu5uZnc6kuZiQNy7949ekH1448/ptNXr14NVRWtlOFOBn700UceHh5Cp1uZuw5AjP7hhx8KygEPKw4IXkZPAz0D1u74qKgorjgYgDggrHEbjIwRQnK5HNotpVLJ3HlJh6gYM2YMq/tFHvuDCSsOiLVifzDhxgExGo1Lly6FLafMaBFFRUXdunVjvj7ibG+A2B9r1qwRagZ3QhsCMsBTvLy8oIjOnz+fnuHYvn07/DcqKury5cssM8hjfzBhethasT+YmMzztddegxdxc3ODIAlpaWn0JjCDwQDeVigUTGkCMHbsWMKgG0xMxgHJz8/v0KEDWEL3uvR6/ezZsyGRriu4WyqzsrLMLf1gWLBgAT1TDbHm9+/fj7meVM1oNBofPXrk7+/PTPT394fRAB44CwbqC8KTX7hA/GzqzxHzIOoJdxt1RkZG7969oQvMTBenAgf1GkiuNQQHUQqFdRYM4ckvDx8+lMlkrM1M/v7+MCXLhXsWzOnTp5laeaYwfdq0aUeOHAkICKDj9lL/rfFpQAUuNNQyU70JcYGt60yFQpGQkECbSviNQzFmFe+AgABzxRt0WSztGf1QWAlPSEjIzc1lCqn79+8Pf2zfvj0tLQ0WR4G8vDwRoZbj4+Pps2Dg5BcLTx7gwtK2NTc3jx8//q233gKtYHp6Ov2viIiI06dPjxw5El4fElll5tKlS1qtVoSRXInd1atX6YiXtbW17dq127lz5/vvv0/HxHn66afhj8LCwtTUVOameNjSYKEZVjmhiZs/9ywYuphBB+jvf//74cOH6bDxcrkczDAYDLNmzZoyZQpTei3OSDCDGeJyx44ddIllam4VCsXy5cu3bNni6upK1xWlpaWsAxRFV7xVVVWgmScJvC6sJqJEnSvGPAuG8OQXLtyzYO7cubN58+a33nrLZNDrOXPmqNVqmMEDCE9+4cI8C8YqJ79woX8kJSUlDx8+JDGSFcgKoCjKZDpCKCwsLCAggP5hbNmy5dlnn6XF+tAGMK/v1avXmTNnmMF5xe0fYBEaGqpUKmlnWn7yCxfameQnv4DTWMUb40yTZ8GATg8YPXr06dOnw8PDWYbRf+fn56empsLQCol1pouLS9euXelhpeUnv3BhHsJSWlqanp6+adMm5n+ZF0OLQo/b0J99ghDSaDSOjo6skkZoBusQFqbzQ0NDjx8/zopkERER4evrC3/X19ePGDEC1nLQf09+EWfG+fPnwQwr7o+kgcN4Wb0H+jBYhUKxdOnSzZs3s04bYKrV165d279/f+iENTQ0iB450GZQFDVv3ryXX36Z7jpER0ezel2vvPLKb7/9RoftZb1CY2PjtWvXLDRDo9FA1YG5nrQxk8vlPj4+lZWVzMSKigpWND+MWVCNqtVqFxcX3pNfTOaA/uwjc8MygDs4Izz5hQvzLBirnPzChT4LhvzkF39/f4qiHj16xEysrKxkDS+YwAZwvV7/z3/+89VXX21ubqYnamCHFuv6yMjIM2fOvPDCC/ARxHJAbW3trVu3xJ1JSDc2arU6KirK29tbRCb4/GEDMvnJL+A0QcWbNVag/jv3KJPJcnJytm/fzt3syLQEFMx9+vTZsmULbPQWVzPSZsCev6eeekpEJhhSUlLgLJgzZ86oVKpz5845ODjQbTy3IwKvv2PHDnh91imLarU6Li6O9+QXLnAkDfMsGJA2IITS0tJM7q6B84fzAAAR20lEQVRj9pNcXV1h9uzVV19tamrSaDSxsbG8J7+YNKOuru7GjRtlZWX379+3emPGPQvm4sWLer0eIeTh4bFnzx6TAQJpM+RyuVwuP3nyZI8ePS5fvkx48guXwMBAOAvm8ePHw4cPBxU07S6Tvc8ePXqo1WpojBFCzC2GcPKLiLoiICCAPgtGrVbz5iCgUg4KCmJOjCCESkpKmK0xBpVKdePGjYaGhry8PJgbIX8uwIoDcvv27W+//dbcsAx4//331Wo1yPqRkJNfuNDb0fPy8qw+kkD/PQumsLAwLy8vKCiI5OQX8DxzRqKysrKxsRHzjUBlNGTIkB9//HHmzJmwlB0bG4v+3Llj4u7uvmvXroULFyJG9YEsm24FM5Bt+raIcRYM+ckv4DRm8dbr9Q8ePMD0BFlxQM6fP9/Q0ODo6Pj9998zhyZMAgICYNUhOjo6Kirq559/njx58htvvDF+/HjR0610HBCNRpOYmGiV2B9M4PSTVatWDR06NCUl5csvvxw+fDjd/zBn86hRo86cOQNz4KCGBUR/49w4ILBmnJWVdeTIEXNfEzwrOjq6paVl69atS5cuvXPnTlpaGjTMIsygz4Ih73QKhdVJ2rx5M0IoKCjo7NmzQ4cONXkL/eN1c3ObPHnyxo0bVSrVgAED1q9f7+rqCj9wEWb8/vvvPXv2LCwsnDt37urVq5uamqD0mqsrQkJCTpw4MWrUKMT50gXF/mACFS/FF/vj/0O+HDdlyhRmlEWDweDr6/vBBx+Q3EtrQMSpPwCmBiQ7OzswMJB3m0jv3r1TUlJgTVic+gMADUh5ebnV1R8ArQEhVH9QFNXS0sI68WTXrl0IoXv37pm7BRQKJ06cgI+ZmZkdOnRYsGABQoi7dMzi3XffRQiBMI8ScvILF1i9KCkp8fLysvzkFy60BoRQ/QGEh4f/z//8D/0RdkNiIjqyNCAZGRlyufzgwYP4p4BwdOvWrQ4ODv/5z3/AWjjHR6j6A6A1ILZQfwChoaEvvPAC/NZ+//132Njk6OgYFhaGv7GsrMzd3T0oKAjKCcguRKg/AKaK+Pjx4wih0aNH42+BAj9z5szu3btDKCKKom7cuEHHWBAB+NkW6g+AmXNLS4uXl5evry++bECB9/X1XbZsmYODA2ytqaur69Onj9BdEDTvvPOOh4cH7CpuaWnp3Llzenr62LFjEZ/m1mg0DhkyBCFE7/AZN26cCPUHsGDBAh8fH4j2hwmFAQhozLZv3y6TyWg5HEwb/v777yT3QhyQJUuWCI39wYSOA8IM+YEHAoLA+TdCY38wgbNgPv74Y2TV2B9MIA4IYewPICMjg7k1Ytq0aTExMZjrYcIHtjTCPv/du3fDsuKpU6d4H9e/f3+lUgnbXMwFZSABBkDLli1DVo39wQTOgjEZV94cWVlZTGnuwoULvby8MHu2mHFAzp07J5PJli5dyvuUBQsWODg4NDU1vf7663RMkNmzZ0dHRxPayQLigCxbtsy6sT+YvPjii7CxEgJtQLyP+Pj4ESNG8N577NgxOiaIiNgfTOgip9PpYmNj4+LieCP6w2aJjRs3MmOCiIj9wQTigFg39gcTpuJ/0aJFDg4Oly5d4r0rLS1twIABrJggQmN/MGHGAaHjfXzyySckvS6dThcREZGamgpmCI39wQTigEBdgYn9AQhozKqrq93d3emh2JQpU0JCQsi3DqSmpsJR7oJifzCh44CY3Ftmjl69ej3zzDMiYn8wgTggMTEx1o39wWTkyJHgH5LYH8AXX3zh4OAABa6urs7b2/utt97C3+Lv7z9v3rympqaoqCj4NVZUVDB3AWJgBiAwd1YhIUqlMiYmxlonv3CZMWNGx44dCWN/AHv37qWrWr1eHxkZyXuqBcQB4cb7wHDgwAGIM1JbWxsUFDR27FiKovr06WPJZrukpCQoOVeuXBGdCQY65M0nn3xCB9oYN24cScAEihETRETsDyb0ZAA33oc5YHMSbBmeMGECmLF27VqhsT+YwI6U4OBg3tDy4qD3YsPPjRloA8OsWbMgJB4E49i8ebOI2B9cM3bt2nX37l13d3fI/MiRI/juMg0dEwRif9AzOkKB+KgxMTGhoaG8Fws7Aub1118PDAxsbm6uqKhwdXVlbTvDM336dISQ0NgfTEB0vmTJEkGzBDA4g0EV+ckvXCDsunVjfzBZvHgxTPzynvxC09DQ4OvrC9uAVq5c6ejoSAcbMwdMY86fP9/Z2Zk+XJS8j7lw4UInJ6fc3FwRsT+YwESEdWN/MNmwYQM4k/fkFxqDwRAdHf3yyy9TFPX999+T9LpgGvOrr76SyWQkQ1uKoioqKug2cv369TKZ7MiRIyJifzCBfUjWjf3BBOKAHD9+3MvLa+bMmZC4fPly3jlVgI4JIiL2BxPYpA9m0PE+eBk6dChUOJWVlb6+vv/4xz9ExP5gAnFAkLVjfzCBOCDMeB+8bNq0if49jhkzRqlUQtdfaOwPJhAHZOTIkYGBgRBoorq6mnxyC2KCgBlCY38wgXPH8LE/AGGN2a1bt5ycnObMmZOdne3l5SUopN66desQQiJifzAJDw93dnYmH5YBvXr1cnZ2FhH7g8n48eMRQiQHyYsDpvtIYn8wmTdvnouLy4kTJ/z9/bOysnivf/fdd318fFxdXZlRc3bu3En4uJaWlqeeegokMJZMt86ZMwchZN3YH0wgDghJ7A8ma9euhXWvTp06ZWRk8F4PcUD8/PwmTJhA/hTa20ajMT09vVOnTrzrEHg+//xzhJB1Y38wgUABwcHBSqWSnmI6evSoycgaJlm1apVcLu/cubPQoBtMqqurwYyAgADy9UVm2f7ss88sNwPigCBrx/5gkpmZCfE+duzYQXjLlStX6JicDx488PT07Nu3r4jYH0yGDRsGZtDxHCghdcWDBw+8vLz69u0rIvYHE1hmxsf+AIjOBbh48SK9e3TIkCGLFy82Go3Z2dn0DtwOHTrwaoJ79Ojh5OTk4+MDHT1xBAYG3rlzJycnR5Csdu7cuRkZGYGBgfS2HhE4OzvLZDLmKT7WJSUlxd3dvXPnzoL8071794CAgH79+vn4+Hz00UfcC/R6PQS8ARwdHR89eqRUKnv06EE/iI5MwYuTk9OqVasGDhyoUCju3LnDUreSQ1EU+vOWW+vSpUsXf3//oKAgpgKTl4iIiLi4uCFDhjg7O3NPfAWOHj1qMBjgb9gd7OjoOGTIENqZiYmJfn5+mKcMGzYM/pDJZJ999hnsP62qqhL9u2hubkbWdua1a9fu379PfwwMDCwtLX3zzTfpfYq+vr6YTSAspk6d+s0331y4cCEjI8OSn39QUFBpaemGDRvId5fT3gYzNmzYoNFo+vTpY4kZ/v7+bm5u1jr5BSFUU1PD3IDv7e1dWlqalJTErC2fffZZc7seEULM6jcwMPC9997Lycnp2LEj87cvFDAjPT39xRdfpBOZ/sQDZrz55puwC1C0Ge3atZPL5UTFm6RtBLUlBsJlxm+++Ub0K9FMnTpVxLT70qVLLX+0dUMycoFlGxF07drV3KSHuRPOmJgLp2uOadOmidijw+LFF1+0hs/Mwox1IojIyEiMRglCDmLghgzH8/bbb+MbPxIgVL/FPvtfJk2ahH+iUC3VsWPHRGxS5pKTk8Or+8Bw/Phxq+jp8SekCIWkyyVojKXVaslbHQyDBw+2ZCFWq9XSu1QtgVAzL6MIgno0NDSYPFeXxtnZGXMeJo1Op6uvrxfwEqbw8PAgP2iOhiKr1vG4urqK2O9JjsFgoEPCCALjf5IX9/T0FLo/qaamhqTkYCAsM6IR/Y07OTlx94/T8L64u7u70G2Ujx8/pkd74sDbLILGxkbWGdaWP7G5ubmpqckyu5DlW+ytYkb79u0x4ySh6PX6uro6/DVCX9xoNNbW1lpgFEIIubm58Z5q++SYQdSYSUhISEhIPMlYOSyThISEhISE/ZEaMwkJCQmJNo/UmElISEhItHmkxkxCQkJCos0jNWYSEhISEm0eqTGTkJCQkGjzSI2ZhISEhESbR2rMJCQkJCTaPFJjJiEhISHR5hEcF8rW7Nu3b9WqVcHBwb6+vgqF4vz5825ubjExMXV1dffv39fpdOvWrYNYzhLkSF61LpI/bYHkVTvzV3O46CCSNiIzM/P48ePwd1VVFUIITpenKEqn06WmplpyjMv/WSSvWhfJn7ZA8qqd+Ys5/MmaZnzw4EG/fv3oaP8nTpxACA0dOhQ+Ojg4ZGRkeHp6tpp9bRPJq9ZF8qctkLxqZ/56Dn+yGrMDBw5kZWXRH48ePRocHAynFwLkRyhJ0EhetS6SP22B5FU789dz+JMVNV+r1To5OdEfExIS4uPjN2/eTKfodDqh52tISF61LpI/bYHkVTvz13P4kzUyYzq3qqrq0qVLffv2ZV4AztXr9XY2rE0jwqvFxcVbtmy5cuWKvWxsS0il1BZY6NWzZ89u3LhR3HGA/zf56xXjJ07NSAMrkyz//vHHH/n5+R4eHmVlZampqb169Wol69oqhF719PTcu3dvTU1NXFxcK1naNpBKqS0Q4VV/f/8xY8ZA0bWrrX8J/hrF+MltzI4dOxYSEsKcw0UIrVu3bu3atfD32LFjn3z/PmkQetXHx0dqxkiQSqktEOHVjh07hoSE2M/EvxZ/jWL8ZE0zMjl69Gi/fv1Yibm5ucuXL9fr9SUlJR07doTE2traX3/9dceOHaAulcBA7lWEEEVReXl5+/fvr6ystK+ZbQZB/tRoNBs3bjx06JDRaLSvmW0MQV4tLCzct2/fnTt37GvjXwpyh1MUdfTo0R07dhQXF9vbSl5ab1cAjoqKCplM9vXXX7PS8/Pzo6KinnrqqYkTJ+r1ekhMS0u7du3avXv3evfuXVxcbHdj2wyCvDpv3ryBAwdevHjx4cOHkyZNOnjwoN3tfdIR5M+pU6du2LBBq9Xm5OSsWbPG7sa2GQR59e233169enVjY+OhQ4cCAgJu3bpld3vbPOQO1+v1I0aMOHr0aGNj46RJk3Jzc1vDXrM8odOMhw4doiiqT58+rPT8/PzZs2dXV1cvXbrU399/yZIlCKGPP/44IiKipKQkODj40KFDkyZNag2T2wCCvIoQ6t+/f3x8PELo7bff7tu3r9T5ZUHuz5MnT6rV6jVr1iCEZs+ezVx7l2BB7tXc3NxDhw6p1WqEUEZGRlBQUGvY2+Yhd/jOnTvr6+vj4+MbGxsHDRq0du3ap59+ulVsNsmT1Zg1NzcvWrTo4cOHv/32m5ub25IlS/z9/bOzs2NiYhBCly9fPnHixPr16xFC48aN69ev34wZM4KDg3Nzc3ft2jVs2DBPT0+tVtvaL/HEIc6rzByUSmVJSUljY6Obm1vrvMOThAh/FhQUBAYGwu1KpbI1rX9SEeHVK1euhIWF0TnIZLJWs74NIsLhRUVFzs7O169fRwgplcqcnJxWfoc/82Q1Zi4uLgsWLDD330ePHkVGRsLfYWFhmZmZCKHc3NytW7fm5uYihDZt2kRR1N69e4cPH24fg9sEIrwK0D0DtVrds2dPqSUDRPizV69eixcvpnf2nD59umfPnvaxtq0gwqtpaWkrVqygr2lqaqKepF2zTzgiHD5gwIDvvvsuLS0N0k+dOhUdHW0HUwlRzJs3r7VtIKVDhw4//vhjeXm5wWDYs2dPSEhIenq6k5PTzp073dzcbty44ebm9ssvv8TExHTr1q21jW0zmPQqQujEiRPOzs4FBQXFxcW7d+9esWKFl5dXaxvbBjDpT19fX6VSuWrVKr1e/9NPPyUmJvr5+bW2pW0Jk1718/Pz9PTctm2bVqs9cODA0aNHy8rKhgwZolAoWtveNo9Jh4eEhLi4uGzYsKGxsfGXX35JTk728fFpbUv/lycrAggJpaWl9+7di46O9vb2phMfP37s7u4ul8sNBoNUlEVg0qsIIa1W29LS4uHh0VqGtVFM+pOiqEePHvn6+raiYW0ac16tra1t3759ZWVlu3btXF1dW9HCvxhtqxi3vcZMQkJCQkKCxZO7z0xCQkJCQoIQqTGTkJCQkGjzSI2ZhISEhESbR2rMJCQkJCTaPFJjJiEhISHR5vl/YDlptluVhyMAAAAASUVORK5CYII=" + } + }, + "cell_type": "markdown", + "id": "c6c87cde", + "metadata": {}, + "source": [ + "![8.png](attachment:8.png)\n", + "which are $-\\boldsymbol{P}(i/jk) \\boldsymbol{P}(c/ab) \\displaystyle \\sum_{lmde} \\langle lm||de \\rangle t^d_l t^{ab}_{im} t^{ec}_{jk}~~~~~-\\boldsymbol{P}(ijk) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lmde} \\langle lm||de \\rangle t^e_j t^{ad}_{il} t^{bc}_{mk}~~~~~-\\boldsymbol{P}(i/jk) \\boldsymbol{P}(abc) \\displaystyle \\sum_{lmde} \\langle lm||de \\rangle t^b_m t^{ad}_{il} t^{ec}_{jk}$\n", + "$~~~~~~~~~~~~~~+\\frac{1}{2}\\boldsymbol{P}(i/jk) \\boldsymbol{P}(c/ab) \\displaystyle \\sum_{lmde} \\langle lm||de \\rangle t^d_i t^{ab}_{lm} t^{ec}_{jk}~~~~~+\\frac{1}{2}\\boldsymbol{P}(k/ij) \\boldsymbol{P}(a/bc) \\displaystyle \\sum_{lmde} \\langle lm||de \\rangle t^a_l t^{de}_{ij} t^{bc}_{mk}$\n", + "\n", + "__CCSDT-4__\n", + "\n", + "In addition to the CCSDT_3 terms we now add the remaining terms linear in $T_3$." + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASQAAABfCAIAAADOCS0NAAAAA3NCSVQICAjb4U/gAAAZgElEQVR4Xu2dZ8yWNRfHXxAHKiriFhcKuCVuxYngwoE4ICpqQjCgGDQuRMToJ6MgkAiICQ4UUVEUcRIVgyjErbgF3OLErbjfnzl5+zbX6HXa67rv+3keywdyP71O/21Pezr+PW1b/f333/+J/6IGogZqr4HWtU8iphA1EDXwjwaiscV2EDVQJw1EY6uTomMyUQPR2GIbiBqokwaisdVJ0TGZqIFobLENRA3USQPR2Oqk6JhM1EA0ttgGogbqpIFiY3vssceuuOIK3+xce+219957b2asMMCxY8fmAT7++OMBOQRw5syZmTnUBE6fPn3ixIkaSSPz119/jRw58qmnnsqMFQZ42WWX5QHecccdATl0AGZm2w78888/p0yZcvPNNxdKXnfdddOmTSsU8xX45JNPRo8e/cILL3hFnDdv3rhx47766qt0LAF8/vnn058cIdQIrevLL79MyuBB4v43aNAg4nz66aduMfvrb7/91rZt2yOPPDIzSgDg77//DuARRxyRCXjmmWf65vCPP/5YffXVDz/88ExATeDee++93nrraSSNzOuvv04+L7744sxYAYBvvPEGgBdddFEm4D777OObwzfffBPACy+8MBNQE7jVVlt16tTJLYnyO3TosOeee7rFAr6KmV1++eVecc8++2xK/eGHH6Zjvfjii3zyBRw6dCixPvjggwRg8ci22267EVNS5YfmH63ql19+kYhp+RoBevVn5PDnn3/Oy2E6z+kQ4tIXUkPm0/fff58Ws0Mkh3mJ1giQKnfnSp9DDU7v3r2XLl0qRpsnT8f/9ddfH3300XkCweE77rjjqquu6tUSSIuBi15ps802S6cL4GqrreY7sgng5ptvngDUGptXAQpbFZloyoBppadDxGZMKZgiTp06NS1mh3ipBcBbbrmlQkA3lHx151CDICb0wAMPOITlay2MbZVVVsE8vGyDYfbVV1/dfffdMzO88sor+wIylwYws0stNradd96ZMlRoG5UD7rTTTr79WVir+uGHH0yVJIztxhtvXL58eWaFmUASbd++PRMtE+IAvOmmm7755ptCwLXXXptpW6ZYIoeZMolAcgjg1ltvrRHOlDnooIPatWs3e/bszK8SyFeGEZqBQyb4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" + } + }, + "cell_type": "markdown", + "id": "7ff6635d", + "metadata": {}, + "source": [ + "![image.png](attachment:image.png)\n", + "\n", + "which are $+\\frac{1}{2} \\boldsymbol{P}(c/ab) \\displaystyle \\sum_{de} \\langle ab||de \\rangle t^{dec}_{ijk}\n", + "~~~~~+\\frac{1}{2} \\boldsymbol{P}(k/ij) \\displaystyle \\sum_{lm} \\langle lm||ij \\rangle t^{abc}_{lmk}~~~~~\n", + "+\\boldsymbol{P}(i/jk)\\boldsymbol{P}(a/bc) \\displaystyle \\sum_{ld} \\langle al||id \\rangle t^{dbc}_{ljk}$" + ] + }, + { + "cell_type": "markdown", + "id": "8a67cd78", + "metadata": {}, + "source": [ + "__summary__\n", + "\n", + "CCSDT-1a $~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~e^{\\hat{T}_1+\\hat{T}_2}+\\hat{T}_3~~~~~~~\\hat{T}_2$\n", + "\n", + "CCSDT-1b $~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~~~~~~\\hat{T}_2$\n", + "\n", + "CCSDT-2 $~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~~~~~~e^{\\hat{T}_2}$\n", + "\n", + "CCSDT-3 $~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~~~~~~e^{\\hat{T}_1+\\hat{T}_2}$\n", + "\n", + "CCSDT-4 $~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~e^{\\hat{T}_1+\\hat{T}_2+\\hat{T}_3}~~~~~~~~~~~e^{\\hat{T}_1+\\hat{T}_2} + T_3$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52a308b0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51771103", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/document/Coupled_Cluster.ipynb b/document/Coupled_Cluster.ipynb new file mode 100644 index 0000000..7d675f4 --- /dev/null +++ b/document/Coupled_Cluster.ipynb @@ -0,0 +1,875 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "33c3589b", + "metadata": {}, + "source": [ + "### Coupled-Cluster Equations" + ] + }, + { + "attachments": { + "ccs.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "2a905a99", + "metadata": {}, + "source": [ + "__Singles__\n", + "\n", + "From 'Many-Bodied Methods in Chemistry and Physics: MBPT and Coupled-Cluster Theory (Cambridge Molecular Science) Shavitt and Bartlett the following shows the diagrams for the Coupled-Cluster singles (CCS)\n", + "![ccs.png](attachment:ccs.png)" + ] + }, + { + "cell_type": "markdown", + "id": "81288735", + "metadata": {}, + "source": [ + "We interpret these diagrams below, defining $f^a_i$ as the canonical HF Fock matrix and $\\scriptsize{\\langle pq||rs \\rangle}$ as the anti-symmetrized 2-electron integrals in the molecular basis in physicists notation (see Appendix A for examples of interpreting diagrams),\n", + "\n", + "$\\boldsymbol{S_1}$ Labelling the spin-orbital diagram (left to right) with a down-arrow (hole) __i__ and an up-arrow (particle) __a__ we interpret this as $\\boldsymbol{f^a_i}$ We will assume that labels are assigned in alphabetical order, from left to right, within each class of lines (open particle lines, internal particle lines, open hole lines, internal hole lines) in keeping with our reference text.\n", + "\n", + "$\\boldsymbol{S_{2a}}$ As before but now labelling the down-loop __k__ and the up-loop __c__ and noting that the base line represents the cluster amplitude operator we write $\\scriptsize{\\boldsymbol{\\displaystyle \\sum_{kc} f^c_k t^{ac}_{ik}}}$\n", + "\n", + "$\\boldsymbol{S_{2b}}$ Labelling the arrow as __d__ we have two components (i) the amplitude operator $\\scriptsize{t^{cd}_{ik}}$ and (ii) the 2-particle operator $\\scriptsize{\\langle ak||cd \\rangle}$. The 2-particle operator order is determined as . Note the lines __a__ and __c__ are equivalent in that they connect the same two vertices going in the same direction, this leads to a factor of $\\frac{1}{2}$, giving overall $\\scriptsize{\\boldsymbol{\\frac{1}{2} \\displaystyle \\sum_{kc} \\langle ak||cd \\rangle t^{cd}_{ik}}}$\n", + "\n", + "$\\boldsymbol{S_{2c}}$ Labelling (left to right) as __a__, __i__ this time and the arrow as __l__ we again have two components (i) the amplitude operator $\\scriptsize{t^{ac}_{kl}}$ and (ii) the 2-particle operator $\\scriptsize{\\langle kl||ic \\rangle}$. The lines __i__ and __k__ are equivalant giving a factor of $\\frac{1}{2}$. This time there are 3 hole lines and 2 loops so a factor of $(-1)^{3-2}$ is included (note paired lines going to infinity are pseudo-loops) giving $\\scriptsize{\\boldsymbol{-\\frac{1}{2} \\displaystyle \\sum_{kc} \\langle kl||ic \\rangle t^{ac}_{kl}}}$\n", + "\n", + "$\\boldsymbol{S_{3a}}$ Labelling the arrow as __c__ there are two components (i) a Fock operator component $\\scriptsize{f^a_c}$ and (ii) an amplitude component $\\scriptsize{t^c_i}$ giving $\\scriptsize{\\boldsymbol{\\displaystyle \\sum_c f^a_c t^c_i}}$\n", + "\n", + "$\\boldsymbol{S_{3b}}$ Labelling (left to right) as __a__, __i__ and the arrow as __k__ there are two components (i) a Fock operator component $\\scriptsize{f^k_i}$ and (ii) an amplitude component $\\scriptsize{t^a_k}$ giving $\\scriptsize{\\boldsymbol{-\\displaystyle \\sum_k f^k_i t^a_k}}$\n", + "\n", + "$\\boldsymbol{S_{3c}}$ There are two components (i) a 2-particle operator component $\\scriptsize{\\langle ak||ic \\rangle}$ and (ii) the amplitude operator component $\\scriptsize{t^{c}_{k}}$ giving overall $\\scriptsize{\\boldsymbol{\\displaystyle \\sum_{kc} \\langle ak||ic \\rangle t^c_k}}$\n", + "\n", + "$\\boldsymbol{S_{4a}}$ Labelling from left to right as __i__, __c__, __k__, __a__, __d__ and __l__ we have three components. (i) a amplitude operator $\\scriptsize{t^c_i}$, (ii) a second amplitude operator $\\scriptsize{t^{ad}_{kl}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. __k__ and __l__ are equivalent lines and there are 3 hole lines and 2 loops so the final contribution is $\\scriptsize{-\\frac{1}{2}\\boldsymbol{\\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_i t^{ad}_{kl}}}$\n", + "\n", + "$\\boldsymbol{S_{4b}}$ Labelling from left to right as __a__, __k__, __c__, __i__, __d__ and __l__ we have three components. (i) a amplitude operator $\\scriptsize{t^a_k}$, (ii) a second amplitude operator $\\scriptsize{t^{cd}_{il}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. __c__ and __d__ are equivalent lines and there are 3 hole lines and 2 loops so the final contribution is $\\scriptsize{-\\frac{1}{2}\\boldsymbol{\\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^a_k t^{cd}_{il}}}$\n", + "\n", + "$\\boldsymbol{S_{4c}}$ Labelling from left to right as __c__, __k__, __d__, __l__, __a__ and __i__ we have three components. (i) a amplitude operator $\\scriptsize{t^c_k}$, (ii) a second amplitude operator $\\scriptsize{t^{da}_{li}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are no equivalent lines and there are 3 hole lines and 3 loops so the final contribution is $\\scriptsize{\\boldsymbol{\\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_k t^{da}_{li}}}$\n", + "\n", + "$\\boldsymbol{S_{5a}}$ Labelling from left to right as __i__, __c__, __k__ and __a__ we have three components. (i) a amplitude operator $\\scriptsize{t^c_i}$, (ii) a second amplitude operator $\\scriptsize{t^a_k}$ and (iii) a Fock operator contribution of $\\scriptsize{f^c_k}$. There are no equivalent lines and there are 2 hole lines and 1 loop so the final contribution is $\\scriptsize{\\boldsymbol{-\\displaystyle \\sum_{kc} t^c_i t^a_k f^c_k}}$\n", + "\n", + "$\\boldsymbol{S_{5b}}$ Labelling from left to right as __i__, __c__, __a__, __d__ and __k__ with the shown arrow as __a__. We have three components. (i) a amplitude operator $\\scriptsize{t^c_i}$, (ii) a second amplitude operator $\\scriptsize{t^d_k}$ and (iii) a 2-particle operator contribution of $\\scriptsize{\\langle ak||cd \\rangle}$. There are no equivalent lines and there are 2 hole lines and 2 loops so the final contribution is $\\scriptsize{\\boldsymbol{\\displaystyle \\sum_{kcd} t^c_i t^d_k \\langle ak||cd \\rangle}}$\n", + "\n", + "$\\boldsymbol{S_{5c}}$ Labelling from left to right as __a__, __k__, __i__, __c__ and __l__ with the shown arrow as __i__. We have three components. (i) a amplitude operator $\\scriptsize{t^a_k}$, (ii) a second amplitude operator $\\scriptsize{t^c_l}$ and (iii) a 2-particle operator contribution of $\\scriptsize{\\langle kl||ic \\rangle}$. There are no equivalent lines and there are 3 hole lines and 2 loops so the final contribution is $\\scriptsize{\\boldsymbol{-\\displaystyle \\sum_{klc} t^a_k t^c_l \\langle kl||ic \\rangle}}$\n", + "\n", + "$\\boldsymbol{S_{6}}$ Labelling from left to right as __i__, __c__, __k__, __a__, __d__ and __l__. We have four components. (i) a amplitude operator $\\scriptsize{t^c_i}$, (ii) a second amplitude operator $\\scriptsize{t^a_k}$, (iii) a third amplitude operator $\\scriptsize{t^d_l}$ and (iv) a 2-particle operator contribution of $\\scriptsize{\\langle kl||cd \\rangle}$. There are no equivalent lines and there are 3 hole lines and 2 loops so the final contribution is $\\scriptsize{\\boldsymbol{-\\displaystyle \\sum_{klcd} t^a_k t^c_l t^d_l \\langle kl||cd \\rangle}}$\n" + ] + }, + { + "cell_type": "markdown", + "id": "858749fa", + "metadata": {}, + "source": [ + "__singles intermediates__\n", + "\n", + "It is convenient to construct the so called 'intermediates' (effective Hamiltonian elements). We can combine $\\boldsymbol{S_{2a}}$ and $\\boldsymbol{S_{4c}}$ as $\\scriptsize{\\displaystyle \\sum_{kc} f^c_k t^{ac}_{ik} + \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_k t^{da}_{li}}$. In the second term we can interchange $cd$ and $kl$ as they are dummy indices and noting the symmetries of $t^{ab}_{ij}$ we have\n", + "\n", + "$\\displaystyle \\sum_{kc} f^c_k t^{ac}_{ik} + \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^d_l t^{ca}_{ki} = t^{ac}_{ik} \\big( f^c_k + \\langle kl||cd \\rangle t^d_l \\big) = t^{ac}_{ik} F_{ck}$ where $F_{ck}$ is an intermediate. \n", + "- - -\n", + "A good reference for CCSD expressions is 'J. Gauss and J. F. Stanton: Coupled-cluster calculations of nuclear magnetic resonance chemical shifts J. Chem. Phys. 103 (9), 1 September 1995' This reference uses $mn$ and $ef$ rather than $kl$ and $cd$ so above equation is written as $F_{em} = f^e_m + t^f_n \\langle mn||ef \\rangle$ (see reference Table IIIa). Using Einstein repeated index summation convention.\n", + "- - -\n", + "If we now define $F_{ac} = f^c_a - \\frac{1}{2}\\displaystyle \\sum_{k} f^c_k t^a_k + \\displaystyle \\sum_{kd} t^d_k \\langle ak||cd \\rangle - \\frac{1}{2}\\displaystyle \\sum_{kld} \\langle kl||cd \\rangle \\big [ t^{ad}_{kl} + \\frac{1}{2}\\big (t^a_k t^d_l - t^d_k t^a_l \\big ) \\big]$\n", + "\n", + "It is usual to define the last expression $ t^{ad}_{kl} + \\frac{1}{2}\\big (t^a_k t^d_l - t^d_k t^a_l \\big )$ as $\\tilde{\\tau}^{ad}_{kl}$\n", + "\n", + "Similarly we define $F_{ki} = f^k_i + \\frac{1}{2}\\displaystyle \\sum_{c} f^c_k t^c_i + \\displaystyle \\sum_{lc} t^c_l \\langle kl||ic \\rangle + \\frac{1}{2}\\displaystyle \\sum_{lcd} \\langle kl||cd \\rangle \\big [ t^{cd}_{il} + \\frac{1}{2}\\big (t^c_i t^d_l - t^d_i t^c_l \\big ) \\big]$\n", + "\n", + "We have now defined the intermediates $\\boldsymbol{F_{ck}~~F_{ac}~~F_{ki}}$" + ] + }, + { + "cell_type": "markdown", + "id": "e6e3924d", + "metadata": {}, + "source": [ + "__singles amplitudes__\n", + "\n", + "Consider the expression $f^a_i + \\boldsymbol{F}^a_c t^c_i - \\boldsymbol{F}^k_i t^a_k + \\boldsymbol{F}^e_k t^{ac}_{ik} + t^c_k \\langle ak||ic \\rangle - \\frac{1}{2} t^{ac}_{kl} \\langle kl||ic \\rangle + \\frac{1}{2} t^{cd}_{ik} \\langle ak||cd \\rangle$. We note that we can immediately write this expression as $S_1 + \\boldsymbol{F}^a_c t^c_i - \\boldsymbol{F}^k_i t^a_k + \\boldsymbol{F}^e_k t^{ac}_{ik} + S_{3c} + S_{2c} + S_{2b}$\n", + "\n", + "$\\boldsymbol{F}^e_k t^{ac}_{ik} = t^{ac}_{ik} f^c_k + t^{ac}_{ik} t^d_l \\langle kl||cd \\rangle = S_{2a} + t^{ad}_{il} t^c_k \\langle lk||dc \\rangle$ swapping dummy indices which can be seen to be $S_{2a} + S_{4c}$\n", + "\n", + "$\\boldsymbol{F}^a_c t^c_i = f^c_a t^c_i - \\frac{1}{2}\\displaystyle \\sum_{k} f^c_k t^a_k t^c_i + \\displaystyle \\sum_{kd} t^d_k \\langle ak||cd \\rangle t^c_i - \\frac{1}{2} t^c_i \\displaystyle \\sum_{kld} \\langle kl||cd \\rangle \\big [ t^{ad}_{kl} + \\frac{1}{2}\\big (t^a_k t^d_l - t^d_k t^a_l \\big ) \\big]$\n", + "\n", + "The first three terms are respectively $S_{3a}~~ \\frac{1}{2}S_{5a}~~ S_{5b}$ and the $t^{ad}_{kl}$ term is $S_{4a}$\n", + "\n", + "$\\boldsymbol-{F}^k_i t^a_k = -f^k_i t^a_k - \\frac{1}{2}\\displaystyle \\sum_{c} f^c_k t^c_i t^a_k - \\displaystyle \\sum_{lc} t^c_l \\langle kl||ic \\rangle t^a_k - \\frac{1}{2} t^a_k \\displaystyle \\sum_{lcd} \\langle kl||cd \\rangle \\big [ t^{cd}_{il} + \\frac{1}{2}\\big (t^c_i t^d_l - t^d_i t^c_l \\big ) \\big]$\n", + "\n", + "This time the first three terms are $S_{3b}~~\\frac{1}{2}S_{5a}~~S_{5c}$ and the $t^{cd}_{il}$ term is $S_{4b}$\n", + "\n", + "The remaining terms are $-\\langle kl||cd \\rangle\\frac{1}{4}\\big( t^a_k t^d_l t^c_i - t^d_k t^a_l t^c_i + t^c_i t^d_l t^a_k - t^d_i t^c_l t^a_k \\big) = -\\langle kl||cd \\rangle \\frac{1}{4} \\big( 2 t^a_k t^d_l t^c_i - t^d_k t^a_l t^c_i - t^d_i t^c_l t^a_k \\big) = -\\frac{1}{2}\\langle kl||cd \\rangle t^a_k t^d_l t^c_i -\\frac{1}{4} \\langle kl||cd \\rangle t^d_k t^a_l t^c_i -\\frac{1}{4} \\langle kl||cd \\rangle t^d_i t^c_l t^a_k$ swapping dummy indices on last term we get $-\\frac{1}{2}\\langle kl||cd \\rangle t^a_k t^d_l t^c_i -\\frac{1}{4} \\langle kl||cd \\rangle t^d_k t^a_l t^c_i -\\frac{1}{4} \\langle lk||dc \\rangle t^c_i t^d_k t^a_l$ and using symmetries of 2-electron integral gives $-\\langle kl||cd \\rangle t^a_k t^d_l t^c_i = S_6$\n", + "\n", + "Hence we see our original expression $f^a_i + \\boldsymbol{F}^a_c t^c_i - \\boldsymbol{F}^k_i t^a_k + \\boldsymbol{F}^e_k t^{ac}_{ik} + t^c_k \\langle ak||ic \\rangle - \\frac{1}{2} t^{ac}_{kl} \\langle kl||ic \\rangle + \\frac{1}{2} t^{cd}_{ik} \\langle ak||cd \\rangle$ includes all contributions of the singles and is our singles amplitudes equation." + ] + }, + { + "cell_type": "markdown", + "id": "157d1e29", + "metadata": {}, + "source": [ + "- - -\n", + "__summary__\n", + "\n", + "The singles amplitudes are given by the solution to\n", + "\n", + "$t^a_b \\epsilon^a_b = f^a_i + \\boldsymbol{F}^a_c t^c_i - \\boldsymbol{F}^k_i t^a_k + \\boldsymbol{F}^e_k t^{ac}_{ik} + t^c_k \\langle ak||ic \\rangle - \\frac{1}{2} t^{ac}_{kl} \\langle kl||ic \\rangle + \\frac{1}{2} t^{cd}_{ik} \\langle ak||cd \\rangle$\n", + "\n", + "with\n", + "\n", + "$F_{ck} = f^c_k + \\displaystyle \\sum_{ld} \\langle kl||cd \\rangle t^d_l$\n", + "\n", + "$F_{ac} = f^c_a - \\frac{1}{2}\\displaystyle \\sum_{k} f^c_k t^a_k + \\displaystyle \\sum_{kd} t^d_k \\langle ak||cd \\rangle - \\frac{1}{2}\\displaystyle \\sum_{kld} \\langle kl||cd \\rangle \\big [ t^{ad}_{kl} + \\frac{1}{2}\\big (t^a_k t^d_l - t^d_k t^a_l \\big ) \\big]$\n", + " \n", + "$F_{ki} = f^k_i + \\frac{1}{2}\\displaystyle \\sum_{c} f^c_k t^c_i + \\displaystyle \\sum_{lc} t^c_l \\langle kl||ic \\rangle + \\frac{1}{2}\\displaystyle \\sum_{lcd} \\langle kl||cd \\rangle \\big [ t^{cd}_{il} + \\frac{1}{2}\\big (t^c_i t^d_l - t^d_i t^c_l \\big ) \\big]$" + ] + }, + { + "attachments": { + "2.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "a25b4c0b", + "metadata": {}, + "source": [ + "__the CCD doubles__\n", + "\n", + "The diagrams from Shavitt and Bartlett for the doubles contributions to CCD are \n", + "![2.png](attachment:2.png)\n", + "\n", + "$\\boldsymbol{D_1}$ Labelling left to right as __i__,__a__,__j__ and __b__ we have one contribution from the 2-particle operator $\\scriptsize{\\boldsymbol{\\langle ab||ij \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{2a}}$ Labelling the arrow __b__ there are two contributions (i) the amplitude operator $\\scriptsize{t^{ac}_{ij}}$ and (ii) the Fock operator $f^c_b$. There are 2 holes and 2 loops so sign is +ve.\n", + "\n", + "- - -\n", + "Sum over all distinct permutations P̂ of labels of inequivalent external particle lines and of inequivalent external hole lines.\n", + "- - -\n", + "The final contribution is $\\scriptsize{\\boldsymbol{P(ab) \\displaystyle \\sum_c \\big\\{t^{ac}_{ij} f^c_b \\big\\}}}$\n", + "\n", + "$\\boldsymbol{D_{2b}}$ Labelling the arrow __j__ there are two contributions (i) the amplitude operator $\\scriptsize{t^{ab}_{ik}}$ and (ii) the Fock operator $f^j_k$. There are 3 holes and 2 loops so sign is -ve and we can permute over __i__ and __j__ giving $\\scriptsize{\\boldsymbol{-P(ij)\\displaystyle \\sum_k \\big\\{t^{ab}_{ik} f^j_k \\big\\}}}$\n", + "\n", + "$\\boldsymbol{D_{2c}}$ Labelling the arrows __a__ and __b__ (left to right as usual). There are two contributions (i) the amplitude operator $\\scriptsize{t^{cd}_{ij}}$ and (ii) the 2-particle operator contribution of $\\scriptsize{\\langle ab||cd \\rangle}$. There are 2 hole lines and 2 loops so sign is +ve, __c__ and __d__ are equivalent lines so factor of $\\frac{1}{2}$ giving overall $\\scriptsize{\\boldsymbol{\\frac{1}{2} \\displaystyle \\sum_{cd}t^{cd}_{ij} \\langle ab||cd \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{2d}}$ Labelling the arrows __i__ and __j__ . There are two contributions (i) the amplitude operator $\\scriptsize{t^{ab}_{kl}}$ and (ii) the 2-particle operator contribution of $\\scriptsize{\\langle kl||ij \\rangle}$. There are 4 hole lines and 2 loops so sign is +ve, __k__ and __l__ are equivalent lines so factor of $\\frac{1}{2}$ giving overall $\\scriptsize{\\boldsymbol{\\frac{1}{2} \\displaystyle \\sum_{kl} t^{ab}_{kl} \\langle kl||ij \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{2e}}$ Labelling __i__, __a__, __k__, __c__, __j__ and __b__ we have two contributions (i) the amplitude operator $\\scriptsize{t^{ac}_{ik}}$ and (ii) the 2-particle operator contribution of $\\scriptsize{\\langle kb||cj \\rangle}$. We have 3 hole lines and 3 loops giving a +ve sign and there are no equivalent lines.We can anti-symmetrize on __a__ __b__ and __i__ __j__ giving overall $\\scriptsize{\\boldsymbol{P(ab)~P(ij) \\displaystyle \\sum_{kc} \\big\\{t^{ac}_{ik} \\langle kb||cj \\rangle \\big\\}}}$\n", + "\n", + "$\\boldsymbol{D_{3a}}$ Labelling arrows __c__, __k__, __d__ and __l__ we have we have three contributions (i) the amplitude operator $\\scriptsize{t^{cd}_{ij}}$ , (ii) the amplitude operator $\\scriptsize{t^{ab}_{kl}}$ and (iii) the 2-particle operator contribution of $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 hole lines and no loops giving a +ve sign, the lines __c__ __d__ and __k__ __l__ are equivalent giving a factor of $\\frac{1}{4}$ with no permutations we have $\\scriptsize{\\boldsymbol{ \\frac{1}{4} \\displaystyle \\sum_{klcd} t^{cd}_{ij} t^{ab}_{kl} \\langle kl||cd \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{3b}}$ Labelling __i__, __a__, __k__, __c__, __l__, __d__, __j__ and __b__ we have we have three contributions (i) the amplitude operator $\\scriptsize{t^{ac}_{ik}}$ , (ii) the amplitude operator $\\scriptsize{t^{bd}_{jl}}$ and (iii) the 2-particle operator contribution of $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 hole lines and 4 loops giving a +ve sign, no equivalent lines and a factor $\\frac{1}{2}$ from a pair of equivalent vertices\n", + "- - -\n", + "Associate a factor $\\frac{1}{2}$with each pair of equivalent $\\hat{T}^m$ vertices. (Two vertices are considered equivalent if they have the same number of line pairs and are connected in equivalent ways to the interaction vertex. See Shavitt and Bartlett pg 296 Fig 10.1\n", + "- - -\n", + "This gives us $\\scriptsize{\\frac{1}{2} P(ij) P(ab) t^{ac}_{ik} t^{bd}_{jl} \\langle kl||cd \\rangle}$ because we can permute the external lines. Noting $P(ij) P(ab) \\big \\{ t^{ac}_{ik} t^{bd}_{jl} \\big \\} = t^{ac}_{ik} t^{bd}_{jl} - t^{bc}_{ik} t^{ad}_{jl} - t^{ac}_{jk} t^{bd}_{il} + t^{bc}_{jk} t^{ad}_{il}$ pairing terms 1&3 and 2&4 $= P(ij) \\big \\{ t^{ac}_{ik} t^{bd}_{jl} \\big \\} - P(ab) \\big \\{ t^{bc}_{ik} t^{ad}_{jl} \\big \\}$ remembering $klcd$ are dummy indices we can write $= P(ij) \\big \\{ t^{ac}_{ik} t^{bd}_{jl} \\big \\} - P(ab) \\big \\{ t^{bd}_{il} t^{ac}_{jk} \\big \\} = 2P(ij) \\big \\{ t^{ac}_{ik} t^{bd}_{jl} \\big \\}$ and finally $S_{3b}$ is $\\scriptsize{\\boldsymbol{ P(ij) \\displaystyle \\sum_{klcd} t^{ac}_{ik} t^{bd}_{jl} \\langle kl||cd \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{3c}}$ Labelling arrows __d__ and __l__ we have we have three contributions (i) the amplitude operator $\\scriptsize{t^{cd}_{ki}}$ , (ii) the amplitude operator $\\scriptsize{t^{ab}_{lj}}$ and (iii) the 2-particle operator contribution of $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 hole lines and 3 loops giving a -ve sign, __c__ and __d__ are equivalent lines so a factor of $\\frac{1}{2}$ and we can permute __i__ and __j__ giving $\\scriptsize{\\boldsymbol{ - \\frac{1}{2}P(ij) \\displaystyle \\sum_{klcd} t^{cd}_{ki} t^{ab}_{lj} \\langle kl||cd \\rangle}}$\n", + "\n", + "$\\boldsymbol{D_{3d}}$ Labelling arrows __l__ and __d__ we have we have three contributions (i) the amplitude operator $\\scriptsize{t^{ac}_{lk}}$ , (ii) the amplitude operator $\\scriptsize{t^{db}_{ij}}$ and (iii) the 2-particle operator contribution of $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 hole lines and 3 loops giving a -ve sign, __k__ and __l__ are equivalent lines so a factor of $\\frac{1}{2}$ and we can permute __a__ and __b__ giving $\\scriptsize{\\boldsymbol{ - \\frac{1}{2}P(ab) \\displaystyle \\sum_{klcd} t^{ac}_{lk} t^{db}_{ij} \\langle kl||cd \\rangle}}$\n", + "\n", + "CCD amplitudes are given by $\\displaystyle \\sum_{n} D_n = 0$" + ] + }, + { + "cell_type": "markdown", + "id": "5a330ebd", + "metadata": {}, + "source": [ + "__doubles intermediates__\n", + "\n", + "Define $W_{klij} = \\langle kl||ij \\rangle + P(ij) \\big\\{t^c_j \\langle kl||ic \\rangle \\big \\}+ \\frac{1}{4} \\langle kl||cd \\rangle \\big[ t^{cd}_{ij} + \\big( t^c_i t^d_j - t^d_i t^c_j \\big) \\big]$\n", + "\n", + "it is usual to define the last expression $ t^{cd}_{ij} + \\big( t^c_i t^d_j - t^d_i t^c_j \\big)$ as $\\tau^{cd}_{ij}$\n", + "\n", + "Define $W_{abcd} = \\langle ab||cd \\rangle - P(ab) \\big\\{t^b_k \\langle ak||cd \\rangle \\big \\}+ \\frac{1}{4} \\langle kl||cd \\rangle \\big[ t^{ab}_{kl} + \\big( t^a_k t^b_l - t^b_k t^a_l \\big) \\big]$\n", + "\n", + "and define $W_{kbcj} = \\langle kb||cj \\rangle + t^d_j \\langle kb||cd \\rangle - t^b_l \\langle kl||cj\\rangle - \\frac{1}{2} \\langle kl||cd \\rangle \\big(t^{db}_{jl} + 2t^d_j t^b_l \\big)$" + ] + }, + { + "attachments": { + "fyne.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "4393ab4b", + "metadata": {}, + "source": [ + "__summary__\n", + "\n", + "The doubles intermediates are \n", + "\n", + "$W_{klij} = \\langle kl||ij \\rangle + P(ij) \\big\\{t^c_j \\langle kl||ic \\rangle \\big \\}+ \\frac{1}{4} \\langle kl||cd \\rangle \\big[ t^{cd}_{ij} + \\big( t^c_i t^d_j - t^d_i t^c_j \\big) \\big]$\n", + " \n", + "$W_{abcd} = \\langle ab||cd \\rangle - P(ab) \\big\\{t^b_k \\langle ak||cd \\rangle \\big \\}+ \\frac{1}{4} \\langle kl||cd \\rangle \\big[ t^{ab}_{kl} + \\big( t^a_k t^b_l - t^b_k t^a_l \\big) \\big]$\n", + "\n", + "$W_{kbcj} = \\langle kb||cj \\rangle + t^d_j \\langle kb||cd \\rangle - t^b_l \\langle kl||cj\\rangle - \\frac{1}{2} \\langle kl||cd \\rangle \\big(t^{db}_{jl} + 2t^d_j t^b_l \\big)$\n", + "\n", + "The CCD (doubles) amplitudes are given by\n", + "\n", + "$\\langle ab||ij \\rangle + \\boldsymbol{P}(ab) \\big \\{\\displaystyle \\sum_{c} f^c_b t^{ac}_{ij}\\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{k} f^k_j t^{ab}_{ik} \\big \\} + \\frac{1}{2} \\displaystyle \\sum_{cd} \\langle ab||cd \\rangle t^{cd}_{ij} + \\frac{1}{2} \\displaystyle \\sum_{kl} \\langle kl||ij \\rangle t^{ab}_{kl} + \\boldsymbol{P}(ij) \\boldsymbol{P}(ab) \\big \\{\\displaystyle \\sum_{kc} \\langle kb||cj \\rangle t^{ac}_{ik} \\big \\}$\n", + "$+ \\frac{1}{4} \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^{cd}_{ij} t^{ab}_{kl} + \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^{ac}_{ik} t^{bd}_{jl} \\big \\} - \\frac{1}{2} \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^{dc}_{ik} t^{ab}_{lj} \\big \\} - \\frac{1}{2} \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^{ac}_{lk} t^{db}_{ij} \\big \\} = t^{ab}_{ij} \\epsilon^{ab}_{ij}$\n", + "\n", + "alternatively we can use the intermediates\n", + "\n", + "$\\langle ab||ij \\rangle + \\frac{1}{2} \\tau^{ab}_{kl} W_{klij} + \\frac{1}{2} \\tau^{cd}_{ij} W_{abcd} + \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ t^{ac}_{ik} W_{kbcj} \\big \\} + \\boldsymbol{P}(ab) \\big \\{ t^{ac}_{ij} F_{bc} \\big \\} - \\boldsymbol{P}(ij) \\big \\{ t^{ab}_{ik} F_{kj} \\big \\} = t^{ab}_{ij} \\epsilon^{ab}_{ij}$\n", + "\n", + "The intermediate expression terms represent diagrams $[D_1] + [D_{2d}+\\frac{1}{2}D_{3a}] + [D_{2c}+\\frac{1}{2}D_{3a}] + [D_{2e} + D_{3b}] + [D_{2a} + D_{3d}] + [D_{2b} + D_{3c}]$ respectively.\n", + "\n", + "The equations are solved iteratively with initial guess $t^a_i = 0$ and $t^{ab}_{ij} = \\frac{\\langle ij||ab \\rangle}{\\epsilon_i + \\epsilon_j - \\epsilon_a - \\epsilon_b}$ where $\\epsilon_i = f_{ii}$ The intermediate solution is a bit inefficient as it implicitly includes $t^a_i$ terms (which are set to zero) but is easier to program if the intermediates have already been coded.\n", + "\n", + "Since we are usually interested in the coupled-cluster correction we subtract the Hartree-Fock energy by using $f^p_q = f^p_q - f^p_p$, in other words we subtract out the diagonal.\n", + "\n", + "The equations are solved iteratively. An initial guess is made for the amplitudes, that guess is substituted into the amplitude equations and an energy computed. The resulting amplitudes are then substituted into the amplitude equations to get another new set of amplitudes and a new energy is computed. This preocedure is repeated until the difference in energy and in amplitudes are below a specified threshold for two consecutives cycles.\n", + "\n", + "__the cluster energy__\n", + "\n", + "The coupled-cluster energy is given by the diagrams\n", + "\n", + "![fyne.png](attachment:fyne.png)\n", + "\n", + "The first diagram is the CCD energy $\\frac{1}{4} \\displaystyle \\sum_{ijab} t^{ab}_{ij} \\langle ij||ab \\rangle$. The second and third diagrams are the singles contributions $\\displaystyle \\sum_{ia} f^a_i t^a_i$ and $\\frac{1}{2} \\displaystyle \\sum_{ijab} \\langle ij||ab \\rangle t^a_i t^{ab}_{ij}$\n", + "are\n", + "\n", + "__CCD benchmark__\n", + "\n", + "Hirata gives benchmarks for various computational methods https://hirata-lab.chemistry.illinois.edu/cc_data.out. His reference $H_2O$ molecule has O-H bonds of 1.827 au and an angle of 107.6$^\\circ$, the basis is STO-3G. We have code for CCD calculated without intermediates and using computed for-loops in https://github.com/pwborthwick/harpy/blob/main/source/cc/scc.py and for a version using intermediates and einsum in https://github.com/pwborthwick/harpy/blob/main/source/cc/fcc.py. The results are\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|__Hirata CCD__ | -0.0498521356 |\n", + "|Harpy scc | -0.04985214 |\n", + "|Harpy fcc | -0.04985214 |\n", + "\n", + "Code for CCD generated by symbolic methods (sympy) derived through second quantization can be found at https://github.com/pwborthwick/cogus/blob/main/codes/ccd.py (-0.0498521364)." + ] + }, + { + "attachments": { + "3.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "ee5a6030", + "metadata": {}, + "source": [ + "__singles contributions to doubles__\n", + "\n", + "![3.png](attachment:3.png)\n", + "\n", + "$\\boldsymbol{D_{4a}}$ The arrow is labelled __a__. So from left to right the labelling is __i__, __c__, __a__, __k__ and __b__. There are two contributions (i) a singles amplitude operator $\\scriptsize{t^c_i}$, (ii) a 2-particle operator $\\scriptsize{\\langle ab||cj\\rangle}$. There are 2 holes and 2 loops giving a +ve sign, no equivalent lines and we can permute the external lines __i__ and __j__ giving $\\scriptsize{\\boldsymbol{P(ij) \\displaystyle \\sum_c \\big \\{ t^c_i \\langle ab||cj \\rangle \\big \\}}}$\n", + "\n", + "$\\boldsymbol{D_{4b}}$ The arrow is labelled __i__. So from left to right the labelling is __a__, __k__, __i__, __j__ and __b__. There are two contributions (i) a singles amplitude operator $\\scriptsize{t^a_k}$, (ii) a 2-particle operator $\\scriptsize{\\langle ij||kb\\rangle}$. There are 3 holes and 2 loops giving a -ve sign, no equivalent lines and we can permute the external lines __a__ and __b__ giving $\\scriptsize{\\boldsymbol{-P(ab) \\displaystyle \\sum_k \\big \\{ t^a_k \\langle ij||kb \\rangle \\big \\}}}$\n", + "\n", + "$\\boldsymbol{D_{5a}}$ The arrows are labelled __c__ and __k__ giving an overall labelling of __i__, __c__, __k__, __a__, __j__ and __b__. There are three contributions (i) a singles amplitude $\\scriptsize{t^c_i}$, (ii) a Fock operator $\\scriptsize{f^c_k}$ and (iii) a doubles amplitude $\\scriptsize{t^{ab}_{kj}}$. There are 3 holes and 2 loops giving a -ve sign, no equivalent lines and we can permute __i__ and __j__ giving $\\scriptsize{\\boldsymbol{-P(ij) \\displaystyle \\sum_{kc} \\big \\{ t^c_i f^c_k t^{ab}_{kj} \\big \\}}}$\n", + "\n", + "$\\boldsymbol{D_{5b}}$ The arrows are labelled __k__ and __c__ giving an overall labelling of __a__, __k__, __c__, __i__, __j__ and __b__. There are three contributions (i) a singles amplitude $\\scriptsize{t^a_k}$, (ii) a Fock operator $\\scriptsize{f^c_k}$ and (iii) a doubles amplitude $\\scriptsize{t^{cb}_{ij}}$. There are 3 holes and 2 loops giving a -ve sign, no equivalent lines and we can permute __a__ and __b__ giving $\\scriptsize{\\boldsymbol{-P(ab) \\displaystyle \\sum_{kc}\\big \\{ t^a_k f^c_k t^{cb}_{ij} \\big \\}}}$\n", + "\n", + "$\\boldsymbol{D_{5c}}$ The arrow is labelled __a__ giving a labelling of __i__, __c__, __a__, __k__, __d__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a double amplitude $\\scriptsize{t^{db}_{kj}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle ak||cd \\rangle}$. There are 3 holes and 3 loops giving a +ve sign, no equivalent lines and we can permute __i__, __j__ and __a__, __b__ giving $\\scriptsize{\\boldsymbol{P(ij)P(ab) \\displaystyle \\sum_{kcd}\\big \\{ t^c_i t^{db}_{kj} \\langle ak||cd \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{5d}}$ The arrow is labelled __i__ giving a labelling of __a__, __k__, __i__, __l__, __c__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^a_k}$, (ii) a double amplitude $\\scriptsize{t^{cb}_{lj}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||ic \\rangle}$. There are 4 holes and 3 loops giving a -ve sign, no equivalent lines and we can permute __i__, __j__ and __a__, __b__ giving $\\scriptsize{\\boldsymbol{-P(ij)P(ab) \\displaystyle \\sum_{klc}\\big \\{ t^a_k t^{cb}_{lj} \\langle kl||ic \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{5e}}$ The arrows are labelled __k__, __c__ and __b__ giving a labelling of __a__, __k__, __c__, __i__, __b__ and __j__. There are three contributions (i) a single amplitude $\\scriptsize{t^a_k}$, (ii) a double amplitude $\\scriptsize{t^{cd}_{ij}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kb||cd \\rangle}$. There are 3 holes and 2 loops giving a -ve sign, the lines __c__ and __d__ are equivalent giving a factor of $\\frac{1}{2}$ and we can permute __a__, __b__ giving $\\scriptsize{\\boldsymbol{- \\frac{1}{2} P(ab) \\displaystyle \\sum_{kcd}\\big \\{ t^a_k t^{cd}_{ij} \\langle kb||cd \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{5f}}$ The arrows are labelled __c__, __k__ and __j__ giving a labelling of __i__, __c__, __k__, __a__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a double amplitude $\\scriptsize{t^{ab}_{kl}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||cj \\rangle}$. There are 4 holes and 2 loops giving a +ve sign, the lines __k__ and __l__ are equivalent giving a factor of $\\frac{1}{2}$ and we can permute __i__, __j__ giving $\\scriptsize{\\boldsymbol{ \\frac{1}{2} P(ij) \\displaystyle \\sum_{klc}\\big \\{ t^c_i t^{ab}_{kl} \\langle kl||cj \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{5g}}$ The arrow is labelled __a__ giving a labelling of __k__, __c__, __a__, __d__, __i__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_k}$, (ii) a double amplitude $\\scriptsize{t^{db}_{ij}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle ka||cd \\rangle}$. There are 3 holes and 3 loops giving a +ve sign, there are no equivalent lines and we can permute __a__, __b__ giving $\\scriptsize{\\boldsymbol{ P(ab) \\displaystyle \\sum_{kcd}\\big \\{ t^c_k t^{db}_{ij} \\langle ka||cd \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{5h}}$ The arrow is labelled __i__ giving a labelling of __k__, __c__, __i__, __l__, __a__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_k}$, (ii) a double amplitude $\\scriptsize{t^{ab}_{lj}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||ci \\rangle}$. There are 4 holes and 3 loops giving a -ve sign, there are no equivalent lines and we can permute __i__, __j__ giving $\\scriptsize{\\boldsymbol{- P(ij) \\displaystyle \\sum_{klc}\\big \\{ t^c_k t^{ab}_{lj} \\langle kl||ci \\rangle} \\big \\}}$\n", + "\n", + "$\\boldsymbol{D_{6a}}$ The arrows are labelled __a__ and __b__ giving a labelling of __i__, __c__, __a__, __b__, __d__ and __j__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{d}_{j}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle ab||cd \\rangle}$. There are 2 holes and 2 loops giving a +ve sign, there are a pair of equivalent vertices (__i__,__c__ and __d__,__j__) giving a factor of $\\frac{1}{2}$, we can permute by __i__ and __j__. Overall we have $\\scriptsize{\\boldsymbol{\\frac{1}{2} P(ij)\\displaystyle \\sum_{cd} \\big \\{ t^c_i t^d_j \\langle ab||cd \\rangle \\big \\} = \\displaystyle \\sum_{cd} t^c_i t^d_j \\langle ab||cd \\rangle} }$\n", + "\n", + "$\\boldsymbol{D_{6b}}$ The arrows are labelled __i__ and __j__ giving a labelling of __a__, __k__, __i__, __j__, __l__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^a_k}$, (ii) a single amplitude $\\scriptsize{t^{b}_{l}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kl||ij \\rangle}$. There are 4 holes and 2 loops giving a +ve sign, there are a pair of equivalent vertices (__a__,__k__ and __l__,__b__) giving a factor of $\\frac{1}{2}$, we can permute by __a__ and __b__. Overall we have $\\scriptsize{\\boldsymbol{\\frac{1}{2} P(ab)\\displaystyle \\sum_{kl} \\big \\{ t^a_k t^b_l \\langle kl||ij \\rangle \\big \\} = \\displaystyle \\sum_{kl} t^a_k t^b_l \\langle kl||ij \\rangle} }$\n", + "\n", + "$\\boldsymbol{D_{6c}}$ The arrows are labelled __c__ and __k__ giving a labelling of __i__, __c__, __k__, __a__, __j__ and __b__. There are three contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{a}_{k}}$ and (iii) a 2-particle operator $\\scriptsize{\\langle kb||cj \\rangle}$. There are 3 holes and 2 loops giving a -ve sign, we can permute by __a__, __b__ and __i__,__j__. Overall we have $\\scriptsize{\\boldsymbol{-P(ij)P(ab)\\displaystyle \\sum_{kl} \\big \\{ t^a_k t^b_l \\langle kb||cj \\rangle \\big \\} = -\\displaystyle \\sum_{kc} t^a_k t^c_i \\langle kb||cj \\rangle} }$\n", + "\n", + "$\\boldsymbol{D_{7a}}$ The arrows are labelled __c__, __k__, __l__ and __d__ giving a labelling of __i__, __c__, __k__, __a__, __b__ ,__l__, __d__and __j__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{d}_{j}}$, (iii) a doubles amplitude operator $\\scriptsize{t^{ab}_{kl}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 2 loops giving a +ve sign, there is an equivalent pair of lines __k__, __l__ and equivalent vertices __c__,__k__ and __d__,__j__ giving a factor of $\\frac{1}{4}$ we can also permute by __i__,__j__. Overall we have $\\scriptsize{\\boldsymbol{\\frac{1}{4} P(ij)\\displaystyle \\sum_{klcd} \\big \\{ t^c_i t^d_j t^{ab}_{kl} \\langle kl||cd \\rangle \\big \\} = \\frac{1}{2}\\displaystyle \\sum_{klcd} t^c_i t^d_j t^{ab}_{kl} \\langle kl||cd \\rangle} }$\n", + "\n", + "$\\boldsymbol{D_{7b}}$ The arrows are labelled __k__, __c__, __d__ and __l__ giving a labelling of __a__, __k__, __c__, __i__, __j__ ,__d__, __l__and __b__. There are four contributions (i) a single amplitude $\\scriptsize{t^a_k}$, (ii) a single amplitude $\\scriptsize{t^{b}_{l}}$, (iii) a doubles amplitude operator $\\scriptsize{t^{cd}_{ij}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 2 loops giving a +ve sign, there is an equivalent pair of lines __c__, __d__ and equivalent vertices __k__,__c__ and __l__,__b__ giving a factor of $\\frac{1}{4}$ we can also permute by __a__,__b__. Overall we have $\\scriptsize{\\boldsymbol{\\frac{1}{4} P(ab)\\displaystyle \\sum_{klcd} \\big \\{ t^a_k t^b_l t^{cd}_{ij} \\langle kl||cd \\rangle \\big \\} = \\frac{1}{2}\\displaystyle \\sum_{klcd} t^a_k t^b_l t^{cd}_{ij} \\langle kl||cd \\rangle} }$\n", + "\n", + "$\\boldsymbol{D_{7c}}$ The arrows are labelled __c__ and __k__ giving a labelling of __i__, __c__, __k__, __a__, __l__, __d__ ,__j__ and __b__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{a}_{k}}$, (iii) a doubles amplitude operator $\\scriptsize{t^{db}_{lj}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 3 loops giving a -ve sign, there are no equivalent lines but we can permute by __i__, __j__ and __a__,__b__. Overall we have $\\scriptsize{\\boldsymbol{-P(ij)P(ab) \\displaystyle \\sum_{klcd} \\big \\{ t^c_i t^a_k t^{db}_{lj} \\langle kl||cd \\rangle \\big \\}} }$\n", + "\n", + "$\\boldsymbol{D_{7d}}$ The arrows are labelled __d__ and __l__ giving a labelling of __k__, __c__, __i__, __d__, __l__, __a__ ,__j__ and __b__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_k}$, (ii) a single amplitude $\\scriptsize{t^{b}_{j}}$, (iii) a doubles amplitude operator $\\scriptsize{t^{ab}_{lj}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 3 loops giving a -ve sign, there are no equivalent lines but we can permute by __i__, __j__. Overall we have $\\scriptsize{\\boldsymbol{-P(ij) \\displaystyle \\sum_{klcd} \\big \\{ t^c_k t^b_j t^{ab}_{lj} \\langle kl||cd \\rangle \\big \\}} }$\n", + "\n", + "$\\boldsymbol{D_{7e}}$ The arrows are labelled __l__ and __d__ giving a labelling of __k__, __c__, __a__, __l__, __d__, __i__ ,__j__ and __b__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_k}$, (ii) a single amplitude $\\scriptsize{t^{a}_{l}}$, (iii) a doubles amplitude operator $\\scriptsize{t^{db}_{ij}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 3 loops giving a -ve sign, there are no equivalent lines but we can permute by __a__, __b__. Overall we have $\\scriptsize{\\boldsymbol{-P(ab) \\displaystyle \\sum_{klcd} \\big \\{ t^c_k t^a_l t^{db}_{ij} \\langle kl||cd \\rangle \\big \\}} }$\n", + "\n", + "$\\boldsymbol{D_{8a}}$ The arrow is labelled __b__ giving a labelling of __i__, __c__, __k__, __a__, __b__, __d__ and __j__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{a}_{k}}$, (iii) a single amplitude operator $\\scriptsize{t^{d}_{j}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kb||cd \\rangle}$. There are 3 holes and 1 loop giving a +ve sign, the vertices __k__,__a__ and __d__,__j__ are equivalent giving a factor of $\\frac{1}{2}$ and we can permute by __i__, __j__ and __a__, __b__. Overall we have $\\scriptsize{\\boldsymbol{P(ij)P(ab) \\frac{1}{2}\\displaystyle \\sum_{kcd} \\big \\{ t^c_i t^a_k t^{d}_{j} \\langle kb||cd \\rangle \\big \\} = P(ab)\\displaystyle \\sum_{kcd} \\big \\{ t^c_i t^a_k t^{d}_{j} \\langle kb||cd \\rangle \\big \\} } }$\n", + "\n", + "$\\boldsymbol{D_{8b}}$ The arrow is labelled __j__ giving a labelling of __i__, __c__, __k__, __a__, __j__, __l__ and __b__. There are four contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{a}_{k}}$, (iii) a single amplitude operator $\\scriptsize{t^{b}_{l}}$ and (iv) a 2-particle operator $\\scriptsize{\\langle kl||cj \\rangle}$. There are 4 holes and 0 loops giving a +ve sign, the vetices __k__,__a__ and __l__,__b__ are equivalent giving a factor of $\\frac{1}{2}$ and we can permute by __i__, __j__ and __a__, __b__. Overall we have $\\scriptsize{\\boldsymbol{P(ij)P(ab) \\frac{1}{2}\\displaystyle \\sum_{klc} \\big \\{ t^c_i t^a_k t^{b}_{l} \\langle kl||cj \\rangle \\big \\} = P(ij)\\displaystyle \\sum_{klc} \\big \\{ t^c_i t^a_k t^{b}_{l} \\langle kl||cj \\rangle \\big \\} } }$\n", + "\n", + "$\\boldsymbol{D_{9}}$ The labelling is __i__, __c__, __k__, __a__, __j__,__d__, __l__ and __b__. There are five contributions (i) a single amplitude $\\scriptsize{t^c_i}$, (ii) a single amplitude $\\scriptsize{t^{a}_{k}}$, (iii) a single amplitude operator $\\scriptsize{t^{d}_{j}}$,(iv) a single amplitude $t^b_l$ and (v) a 2-particle operator $\\scriptsize{\\langle kl||cd \\rangle}$. There are 4 holes and 0 loops giving a +ve sign, the vetices __k__,__a__ and __l__,__b__ and __i__, __c__ and __j__, __d__ are equivalent giving a factor of $\\frac{1}{4}$ and we can permute by __i__, __j__ and __a__, __b__. Overall we have $\\scriptsize{\\boldsymbol{P(ij)P(ab) \\frac{1}{4}\\displaystyle \\sum_{klcd} \\big \\{ t^c_i t^a_k t^d_j t^{b}_{l} \\langle kl||cd \\rangle \\big \\} = \\displaystyle \\sum_{klcd} \\big \\{ t^c_i t^a_k t^d_j t^{b}_{l} \\langle kl||cj \\rangle \\big \\} } }$\n" + ] + }, + { + "cell_type": "markdown", + "id": "98a1ccac", + "metadata": {}, + "source": [ + "__summary__\n", + "\n", + "The total singles contribution to the $\\hat{T}_2$ amplitudes are \n", + "\n", + "$\\boldsymbol{P}(ij)\\big \\{ \\displaystyle \\sum_{c} \\langle ab||cj \\rangle t^c_i \\big \\} - \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_k \\langle kb||ij \\rangle t^a_k \\big \\} - \\boldsymbol{P}(ij) \\big \\{\\displaystyle \\sum_{kc}f^c_k t^c_i t^{ab}_{kj} \\big \\} - \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kc} f^c_k t^a_k t^{cb}_{ij}\\big \\} + \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kcd} \\langle ak||cd \\rangle t^c_i t^{db}_{kj}\\big \\} - $\n", + "$\\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{klc} \\langle kl||ic \\rangle t^a_k t^{cb}_{lj}\\big \\} - \\frac{1}{2} \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kcd} \\langle kb||cd \\rangle t^a_k t^{cd}_{ij} \\big \\} + \\frac{1}{2} \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} \\langle kl||cj \\rangle t^c_i t^{ab}_{kl} \\big \\} + \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kcd} \\langle ka||cd \\rangle t^c_k t^{db}_{ij} \\big \\} - $\n", + "$\\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} \\langle kl||ci \\rangle t^c_k t^{ab}_{lj} \\big \\} + \\displaystyle \\sum_{cd} \\langle ab||cd \\rangle t^c_i t^d_j + \\displaystyle \\sum_{kl} \\langle kl||ij \\rangle t^a_k t^b_l - \\boldsymbol{P}(ij) \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kc} \\langle kb||cj \\rangle t^c_i t^a_k \\big \\} + \\frac{1}{2} \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_i t^d_j t^{ab}_{kl} + \\frac{1}{2} \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^a_k t^b_l t^{cd}_{ij} - $\n", + "$\\boldsymbol{P}(ij) \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_i t^a_k t^{db}_{lj}\\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_k t^d_i t^{ab}_{lj} \\big \\} - \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_k t^a_l t^{db}_{ij} \\big \\} + \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kcd} \\langle kb||cd \\rangle t^c_i t^a_k t^d_j \\big \\} + $\n", + "$ \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} \\langle kl||cj \\rangle t^c_i t^a_k t^b_l \\big \\} + \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_i t^d_j t^a_k t^b_l$\n", + "\n", + "Add these to the CCD (doubles) amplitudes to get the CCSD $\\hat{T}_2$ amplitude equation.\n", + "\n", + "For the intermediate style form of the CCSD $\\hat{T}_2$ amplitudes add to the CCD equation\n", + "\n", + "$\\boldsymbol{P}(ij) \\big \\{\\langle ab||cj \\rangle t^c_i \\big \\} - \\boldsymbol{P}(ab) \\big \\{\\langle ib||cj \\rangle t^a_k \\big \\} - \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\langle kb||cj \\rangle t^c_i t^a_k \\big \\} - \\frac{1}{2} \\boldsymbol{P}(ab) \\big \\{ t^{ac}_{ij} t^b_k f^c_k \\big \\} - \\frac{1}{2} \\boldsymbol{P}(ij) \\big \\{ t^{ab}_{ik} t^c_j f^c_k \\big \\} $" + ] + }, + { + "cell_type": "markdown", + "id": "de7bf227", + "metadata": {}, + "source": [ + "__CCSD benchmark__\n", + "\n", + "The CCSD expressions above are coded in _harpy_ modules 'cc/scc' (explicit loops) and 'cc/fcc' (einsum and intermediates) with comparison to Hirata given below\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|__Hirata CCSD__ | -0.0501273286 |\n", + "|Harpy scc | -0.05012733|\n", + "|Harpy fcc | -0.05012733 |\n", + "\n", + "Code for CCSD generated by symbolic methods (sympy) derived through second quantization can be found at https://github.com/pwborthwick/cogus/blob/main/codes/ccsd.py (-0.0501273292). CCSDT code is also available.\n", + "\n", + "__linear CCD and linear CCSD__\n", + "\n", + "For linear CCD (LCCD) we only use diagrams that are linear in $t^{ab}_{ij}$, explicitly that is\n", + "\n", + "$D_1$, $D_{2a}$, $D_{2b}$, $D_{2c}$, $D_{2d}$ and $D_{2e}$.\n", + "\n", + "For linear CCSD (LCCSD) we additionally use diagrams linear in $t^a_i$, explicitly that is\n", + "\n", + "$D_1$, $D_{2a}$, $D_{2b}$, $D_{2c}$, $D_{2d}$, $D_{2e}$, $D_{4a}$ and $D_{4b}$. $S_1$, $S_{2a}$, $S_{2b}$, $S_{2c}$, $S_{3a}$, $S_{3b}$ and $S_{3c}$ \n", + "\n", + "The linear versions are coded in _harpy_ 'cc/scc' (explicit loops) and 'cc/fcc' (einsum and intermediates) with comparison to Hirata given below\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|__Hirata LCCD__ | -0.0505753360 |\n", + "|Harpy scc | -0.05057534|\n", + "|Harpy fcc | -0.05057534 |\n", + "|__Hirata LCCSD__ | -0.0508915694|\n", + "|Harpy scc | -0.05089157|\n", + "|Harpy fcc | -0.05089157 |\n", + "\n", + "Codes for linear methods generated by symbolic methods (sympy) derived through second quantization can be found at https://github.com/pwborthwick/cogus/blob/main/codes/lccd.py and https://github.com/pwborthwick/cogus/blob/main/codes/lccsd.py (-0.0505753368 and 0.0508915702)." + ] + }, + { + "cell_type": "markdown", + "id": "3e05b438", + "metadata": {}, + "source": [ + "__The CC2 Approximation__\n", + "\n", + "The coupled-cluster wavefunction is written as $\\Psi = e^{\\hat{T}} \\Phi_0$, $\\Phi_0 = |0 \\rangle$ is the reference (ground-state) and $\\hat{T} =\\displaystyle \\sum_n \\hat{T}_n$. Here $\\hat{T}_n$ are the n-body cluster operators defined by $\\hat{T}_n = \\frac{1}{(n!)^2} \\displaystyle \\sum_{ij...ab...} t^{ab...}_{ij...} \\big \\{a^\\dagger i b^\\dagger j... \\big \\}$\n", + "\n", + "$\\big \\{ \\big \\}$ denotes normal-ordering and $^\\dagger$ denotes a creation operator.\n", + "\n", + "For CCSD we truncate $\\hat{T} = \\hat{T}_1 + \\hat{T}_2$ The equations we are solving are then\n", + "\n", + "$\\langle 0| \\hat{H}_N (\\hat{T}_1 + \\hat{T}_2 + \\frac{1}{2}\\hat{T}_1^2)|0 \\rangle_c = \\Delta E$ (energy)\n", + "\n", + "$\\langle ^a_i | \\hat{H}_N(1 + \\hat{T}_1 + \\hat{T}_2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}_1^2 + \\frac{1}{3!}\\hat{T}_1^3)|0 \\rangle_c = 0$ (singles amplitudes)\n", + "\n", + "$\\langle ^{ab}_{ij} | \\hat{H}_N(1 + \\hat{T}_1 + \\hat{T}_2 + \\frac{1}{2}\\hat{T}_1^2 + \\frac{1}{2}\\hat{T}_2^2 + \\hat{T}_1 \\hat{T}_2 + \\frac{1}{2}\\hat{T}_1^2 \\hat{T}_2+ \\frac{1}{3!}\\hat{T}_1^3 + \\frac{1}{4!}\\hat{T}_1^4))|0 \\rangle_c = 0$ (doubles amplitudes)\n", + "\n", + "Here c in $\\langle \\rangle_c$ indicates we are restricted to connected diagrams and $H_N$ the normal ordered Hamiltonian $= F_N + V_N$\n", + "\n", + "In the CC2 approximation the singles amplitudes are the same as above ie CCSD, however the doubles amplitudes are given by $\\langle ^{ab}_{ij}|\\hat{H}_N e^{\\hat{T}_1} + \\hat{F}_N e^{\\hat{T}_2} |0 \\rangle = 0$ In practice this means we use only diagrams that have (i) only single amplitudes and (ii) only Fock operator acting on a double amplitude ie (i) $D_1$, $D_{4a}$, $D_{4b}$, $D_{6a}$, $D_{6b}$, $D_{6c}$, $D_{8a}$, $D_{8b}$ and $D_9$ (ii) $D_{2a}$ and $D_{2b}$.\n", + "\n", + "The doubles are then\n", + "\n", + "$\\langle ab||ij \\rangle + \\boldsymbol{P}(ij)\\big \\{ \\displaystyle \\sum_{c} \\langle ab||cj \\rangle t^c_i \\big \\} - \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_k \\langle kb||ij \\rangle t^a_k \\big \\}+ \\boldsymbol{P}(ab) \\big \\{\\displaystyle \\sum_{c} f^c_b t^{ac}_{ij}\\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{k} f^k_j t^{ab}_{ik} \\big \\} + \\displaystyle \\sum_{cd} \\langle ab||cd \\rangle t^c_i t^d_j$\n", + "\n", + "$+\\displaystyle \\sum_{kl} \\langle kl||ij \\rangle t^a_k t^b_l - \\boldsymbol{P}(ij) \\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kc} \\langle kb||cj \\rangle t^c_i t^a_k \\big \\} +\\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kcd} \\langle kb||cd \\rangle t^c_i t^a_k t^d_j \\big \\}+\\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} \\langle kl||cj \\rangle t^c_i t^a_k t^b_l \\big \\} + \\displaystyle \\sum_{klcd} \\langle kl||cd \\rangle t^c_i t^d_j t^a_k t^b_l = 0$\n", + "\n", + "CC2 is coded in _harpy_ 'cc/scc' (explicit loops) and 'cc/fcc' (einsum) \n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|Harpy scc | -0.03633142|\n", + "|Harpy fcc | -0.03633142 |\n", + "\n", + "Code for CC2 generated by symbolic methods (sympy) derived through second quantization can be found at https://github.com/pwborthwick/cogus/blob/main/codes/cc2.py (-0.0360000096). CC3 code is also available." + ] + }, + { + "cell_type": "markdown", + "id": "e8dec093", + "metadata": {}, + "source": [ + "__perturbative triples ccsd(T)__\n", + "\n", + "The perturbative triples correction is a non-iterative triples addition to the CCSD energy. There are two parts \n", + "\n", + "(i) disconnected triples - $ \\boldsymbol{P}(i/jk) \\boldsymbol{P}(a/bc) \\big \\{\\langle jk||bc \\rangle t^a_i \\big \\}$\n", + "\n", + "(ii) connected triples - $ \\boldsymbol{P}(i/jk) \\boldsymbol{P}(a/bc) \\big \\{ \\displaystyle \\sum_e \\langle ei||bc \\rangle t^{ae}_{jk} - \\displaystyle \\sum_m \\langle ma||jk \\rangle t^{bc}_{im} \\big \\}$\n", + "\n", + "where $\\boldsymbol{P}(p/qr) = f(pqr) - f(qpr) - f(rqp)$. The total (T) energy correction is\n", + "\n", + "$\\scriptsize{\\frac{1}{(3!)^2}\\displaystyle \\sum_{ijkabc} \\big [ \\big (\\boldsymbol{P}(i/jk) \\boldsymbol{P}(a/bc) \\big \\{\\langle jk||bc \\rangle t^a_i \\big \\} + \\boldsymbol{P}(i/jk) \\boldsymbol{P}(a/bc) \\big \\{ \\displaystyle \\sum_e \\langle ei||bc \\rangle t^{ae}_{jk} - \\displaystyle \\sum_m \\langle ma||jk \\rangle t^{bc}_{im} \\big \\} \\big ) \\big(\\boldsymbol{P}(i/jk) \\boldsymbol{P}(a/bc) \\big \\{ \\displaystyle \\sum_e \\langle ei||bc \\rangle t^{ae}_{jk} - \\displaystyle \\sum_m \\langle ma||jk \\rangle t^{bc}_{im} \\big \\} \\big )\\frac{1}{\\epsilon_i + \\epsilon_j + \\epsilon_k - \\epsilon_a - \\epsilon_b - \\epsilon_c} }$\n", + "\n", + "That is $\\frac{1}{36}$th times the sum of the connected and disconnected triples times the connected triples divided by the triples orbital energies.\n", + "\n", + "CCSD(T) is coded in _harpy_ 'cc/scc' (explicit loops) and 'cc/fcc' (einsum) (there is no Hirata benchmark), these are the _harpy_ values for Hirata $H_2O$ in STO-3G\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|Harpy scc | -0.00007504|\n", + "|Harpy fcc | -0.00007504 |\n", + "\n", + "Code for CCSD(T) generated by symbolic methods (sympy) derived through second quantization can be found at https://github.com/pwborthwick/cogus/blob/main/codes/ccsd_t.py (-7.50413e-05)." + ] + }, + { + "cell_type": "markdown", + "id": "1f475f21", + "metadata": {}, + "source": [ + "__Quadratic Configuration Interaction Single and Doubles (QCISD)__\n", + "\n", + "This is defined as\n", + "\n", + "$$E_{qcisd} = \\langle \\Phi_0 \\vert \\hat{H} \\vert (1 + T_2) \\vert \\Phi_0 \\rangle_C$$\n", + "$$0 = \\langle \\Phi^a_i \\vert \\hat{H} \\vert (T_1 + T_2 + T_1 T_2) \\vert \\Phi_0 \\rangle_C$$\n", + "$$0 = \\langle \\Phi^{ab}_{ij} \\vert \\hat{H} \\vert (1 + T_1 + T_2 + \\frac{1}{2}T_2^2) \\vert \\Phi_0 \\rangle_C$$\n", + "\n", + "The singles uses diagrams $S_{2a-2c}$, $S_{3a-3c}$ and $S_{4a-4c}$, the doubles using diagrams $D_1$, $D_{2a-2e}$, $D_{3a-3c}$ and $D_{4a-4b}$\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|__Hirata QCISD__ | -0.05014527 |\n", + "|Harpy fcc | -0.05014527 |\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "30085416", + "metadata": {}, + "source": [ + "__ΛCCSD__\n", + "\n", + "The $\\Lambda$ de-excitation operators are defined $\\Lambda_n = \\frac{1}{(n!)^2} \\displaystyle \\sum_{ij...ab...} \\lambda^{ij...}_{ab...} \\{i^\\dagger a j^\\dagger b... \\}$\n", + "\n", + "The $\\Lambda$ amplitudes are given by\n", + "\n", + "$\\langle 0|\\hat{H}_N e^{\\hat{T}} | ^a_i \\rangle_c + \\langle 0|\\Lambda(\\hat{H}_N e^{\\hat{T}})_c|^a_i \\rangle_c =0~~~$ and $~~~\\langle 0|\\hat{H}_N e^{\\hat{T}} | ^{ab}_{ij} \\rangle_c + \\langle 0|\\Lambda\\hat{H}_N e^{\\hat{T}}|^{ab}_{ij} \\rangle_c + \\displaystyle \\sum_{c=a,b~~k=i,j} \\langle 0|\\hat{H}_N e^{\\hat{T}}|^c_k \\rangle \\langle ^c_k|\\Lambda|^{ab}_{ij} \\rangle = 0$\n", + "\n", + "The intermediates for $\\Lambda$ are modified to\n", + "\n", + "$F^\\lambda_{ac} = F_{ac} - \\frac{1}{2} t^a_k F_{ck}$\n", + "\n", + "$F^\\lambda_{ki} = F_{ki} + \\frac{1}{2} t^c_i F_{ck}$\n", + "\n", + "$F^\\lambda_{ck} = F_{ck}$\n", + "\n", + "$W^\\lambda_{klij} = W_{klij} + \\frac{1}{4} \\tau^{cd}_{ij} \\langle kl||cd\\rangle$\n", + "\n", + "$W^\\lambda_{abcd} = W_{abcd} + \\frac{1}{4} \\tau^{ab}_{kl} \\langle kl||cd\\rangle$\n", + "\n", + "$W^\\lambda_{kbcj} = W_{kbcj} - \\frac{1}{2} t^{db}_{jl} \\langle kl||cd\\rangle$\n", + "\n", + "additionally we define\n", + "\n", + "$W^\\lambda_{klic} = \\langle kl||ic \\rangle + t^d_i \\langle kl||dc \\rangle$\n", + "\n", + "$W^\\lambda_{akcd} = \\langle ak||cd \\rangle - t^a_l \\langle kl||dc \\rangle$\n", + "\n", + "$W^\\lambda_{kbij} = \\langle kb||ij \\rangle - F^\\lambda_{ck}t^{bc}_{ij}-t^b_l W^\\lambda_{klij}+\\frac{1}{2}\\langle kb||cd \\rangle \\tau^{cd}_{ij} + \\boldsymbol{P}(ij)\\big \\{\\langle kl||ic \\rangle t^{bc}_{jl} \\big \\} + \\boldsymbol{P}(ij)\\big \\{ t^c_i \\big ( \\langle kb||cj \\rangle - t^{bd}_{lj}\\langle kl||cd \\rangle \\big) \\big \\}$\n", + "\n", + "$W^\\lambda_{abci} = \\langle ab||ci \\rangle - F^\\lambda_{ck}t^{ab}_{ki} + t^d_i W^\\lambda_{abcd}+\\frac{1}{2}\\langle kl||ci \\rangle \\tau^{ab}_{kl} - \\boldsymbol{P}(ab)\\big \\{\\langle kb||cd \\rangle t^{ad}_{ki} \\big \\} - \\boldsymbol{P}(ab)\\big \\{ t^a_k \\big ( \\langle kb||ci \\rangle - t^{bd}_{li}\\langle kl||cd \\rangle \\big) \\big \\}$ \n", + "\n", + "$G^\\lambda_{ac} = -\\frac{1}{2}t^{cd}_{kl} \\lambda^{kl}_{ad}$\n", + "\n", + "$G^\\lambda_{ki} = \\frac{1}{2}t^{cd}_{kl} \\lambda^{il}_{cd}$\n", + "\n", + "with these the $\\Lambda$ amplitudes are given by\n", + "\n", + "$F^\\lambda_{ia} + \\lambda^i_c F^\\lambda_{ca} - \\lambda^k_a F^\\lambda_{ik} + \\lambda^k_c W^\\lambda_{icak} + \\frac{1}{2}\\lambda^{ik}_{cd} W^\\lambda_{cdak} - \\frac{1}{2}\\lambda^{kl}_{ac} W^\\lambda_{ickl} - G^\\lambda_{cd} W^\\lambda_{cida} - G^\\lambda_{kl} W^\\lambda_{kila} = 0$\n", + "\n", + "$\\langle ij||ab \\rangle + \\boldsymbol{P}(ab)\\big\\{ \\lambda^{ij}_{ac} F^\\lambda_{cb} \\big \\} - \\boldsymbol{P}(ij)\\big\\{ \\lambda^{ik}_{ab} F^\\lambda_{jk} \\big \\} + \\frac{1}{2} \\lambda^{kl}_{ab} W^\\lambda_{ijkl} + \\frac{1}{2} \\lambda^{ij}_{cd} W^\\lambda_{cdab} + \\boldsymbol{P}(ij) \\big \\{ \\lambda^i_c W^\\lambda_{cjab} \\big \\} - \\boldsymbol{P}(ab) \\big \\{ \\lambda^k_a W^\\lambda_{ijkb} \\big \\} + \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\lambda^{ik}_{ac} W^\\lambda_{jcbk} \\big \\} +$\n", + "$\\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\lambda^{i}_{a} F^\\lambda_{jb} \\big \\} + \\boldsymbol{P}(ab) \\big \\{\\langle ij||ac \\rangle G^\\lambda_{bc}\\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\langle ik||ab \\rangle G^\\lambda_{kj}\\big \\} = 0$\n", + "\n", + "The $\\Lambda$ psuedo-energy is given by $E_\\lambda = \\lambda^i_a f^a_i + \\frac{1}{4} \\lambda^{ij}_{ab} \\langle ab ||ij \\rangle$\n", + "\n", + "The initial $t^a_i$ and $t^{ab}_{ij}$ amplitudes for a $\\Lambda$ computation are those from a converged CCSD computation, $\\lambda^i_a=(t^a_i)^T$ and $\\lambda^{ij}_{ab} = (t^{ab}_{ij})^T$\n", + "\n", + "$\\Lambda$CCSD is coded in _harpy_ 'cc/scc' (explicit loops) and 'cc/fcc' (einsum) (there is no Hirata benchmark), these are the pseudo-energy _harpy_ values for Hirata $H_2O$ in STO-3G\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|Harpy scc | -0.04938752|\n", + "|Harpy fcc | -0.04938753 |\n", + "\n", + "Code for $\\Lambda$CCSD generated by symbolic methods (sympy) derived through second quantization can be found at location given below (-0.049387528749).\n", + "\n", + "The Lagrangian energy for $\\Lambda$CCSD is given by $\\epsilon_{cc} + \\lambda^i_a t^a_i \\epsilon^{ia} + \\lambda^{ij}_{ab} \\epsilon^{ijab}$ (the $f^p_p$ are replaced for the calculation of $\\boldsymbol{F}_{ac}$ and $\\boldsymbol{F}_{ki}$ in the t-amplitudes - see code in _harpy/cc/fcc_). The _harpy/cc/fcc_ code has been tested against _harpy/cogus/ccsd_lambda_ which in turn has been tested against code from _pdaggerq_ (https://github.com/edeprince3/pdaggerq). " + ] + }, + { + "cell_type": "markdown", + "id": "124ca388", + "metadata": {}, + "source": [ + "__the $\\Lambda$CCSD(T) correction__\n", + "\n", + "In a similar way to CCSD a perturbative triples correction can be made to $\\Lambda$CCSD as follows\n", + "\n", + "Defining $\\lambda^{ijk}_{abc} = \\boldsymbol{P}(k/ij)\\boldsymbol{P}(a/bc) \\big \\{\\displaystyle \\sum_d \\langle dk||bc \\rangle \\lambda^{ij}_{ad}\\big \\} - \\boldsymbol{P}(i/jk)\\boldsymbol{P}(c/ab)\\big \\{\\displaystyle \\sum_k \\langle jk||lc \\rangle \\lambda^{il}_{ab}\\big \\} + \\boldsymbol{P}(i/ij)\\boldsymbol{P}(a/bc) \\big \\{ \\langle bc||jk \\rangle \\lambda^i_a \\big \\} + \\boldsymbol{P}(i/ij)\\boldsymbol{P}(a/bc) \\big \\{\\lambda^{jk}_{bc} f^i_a \\big \\} $\n", + "and $~~~~~~~t^{abc}_{ijk} = \\boldsymbol{P}(k/ij)\\boldsymbol{P}(a/bc) \\big \\{\\displaystyle \\sum_d \\langle bc|dk \\rangle t^{ad}_{ij}\\big \\} - \\boldsymbol{P}(i/jk)\\boldsymbol{P}(c/ab)\\big \\{\\displaystyle \\sum_k \\langle lc||jk \\rangle \\lambda^{ab}_{il} \\big \\} $\n", + "\n", + "The $\\Lambda$CCSD(T) correction is $\\Delta E^{\\Lambda CCSD(T)} = \\frac{1}{(3!)^2} \\lambda^{ijk}_{abc} t^{abc}_{ijk} \\frac{1}{\\epsilon^{ijk}_{abc}}$\n", + "\n", + "$\\boldsymbol{P}(i/jk)$ is defined as $ijk - jik - kji$" + ] + }, + { + "attachments": { + "fynl.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "4b26c32c", + "metadata": {}, + "source": [ + "__Λ-diagrams__\n", + "The singles $\\lambda$ are\n", + "![fynl.png](attachment:fynl.png)\n", + "which are interpreted as (the superscript numerals refer to the line in the symbolically generated code (https://github.com/pwborthwick/cogus/blob/main/codes/ccsd_lambda.pycorresponding) corresponding to that diagram). __j__ and __b__ have been used to label internal (summed) lines in some diagrams to keep the label set minimal. Repeated indices are summed.\n", + "\n", + "$1~~f^a_i~^{166}~~~~~2~~t^c_k \\langle ik||ac \\rangle~^{40}~~~~~3~~\\lambda^i_c f^a_c~^{34}~~4~~~~~\\lambda^k_a f^k_i~~^{46}~~~~~5~~\\lambda^k_c \\langle ci||ka \\rangle~~^{37}~~~~~6~~-\\lambda^k_a t^c_k f^c_i~~^{88}~~~~~7~~-\\lambda^i_c t^c_k f^a_k~~^{91}~~~~~8~~\\lambda^i_c t^d_k \\langle ck||ad \\rangle~~^{67}$\n", + "$9~~-\\lambda^k_a t^c_l \\langle il||kc \\rangle~~^{61}~~~~~10~~\\lambda^k_d t^c_k \\langle da||ci \\rangle ~~^{52}~~~~~11~~-\\lambda^k_c t^c_l \\langle li||ka \\rangle~~^{94}~~~~~12~~\\lambda^k_c t^{cd}_{kl} \\langle li||da \\rangle~~^{58}~~~~~13~~-\\frac{1}{2}\\lambda^k_a t^{cd}_{kl} \\langle il||cd \\rangle~~^{76}$\n", + "$14~~-\\frac{1}{2} \\lambda^i_c t^{cd}_{kl} \\langle kl||ad \\rangle~~^{85}~~~~~15~~-\\lambda^l_c t^c_k t^d_l \\langle ki||da \\rangle~~^{130}~~~~~16~~-\\lambda^k_a t^c_k t^d_l \\langle il||cd \\rangle ~~^{115}~~~~~17~~-\\lambda^i_c t^c_k t^d_l \\langle kl||ad \\rangle~~^{118}~~~~~18~~\\frac{1}{2}^{il}_{cd}\\langle cd||al \\rangle~~^{43}$\n", + "$19~~-\\frac{1}{2}\\lambda^{kl}_{ad} \\langle id||kl \\rangle~~^{49}~~~~~20~~ \\frac{1}{2} \\lambda^{ij}_{bc} t^d_j \\langle bc||ad \\rangle~~^{82}~~~~~21~~\\frac{1}{2}\\lambda^{jk}_{ab} t^b_l \\langle il||jk \\rangle~~^{79}~~~~~22~~-\\lambda^{kl}_{ad} t^c_k \\langle id||cl \\rangle~~^{55}~~~~~23~~-\\lambda^{il}_{cd} t^c_k \\langle kd||al \\rangle~~^{97}$\n", + "$24~~-\\frac{1}{2}\\lambda^{kl}_{ca} t^{cd}_{kl} f^d_i~~^{100}~~~~~25~~-\\frac{1}{2}\\lambda^{ki}_{cd} t^{cd}_{kl} f^a_l~~^{103}~~~~~26~~\\frac{1}{2} \\lambda^{ki}_{cd} t^{ca}_{ki} \\langle dl||ab \\rangle~~^{73}~~~~~27~~-\\frac{1}{2} \\lambda^{ki}_{ca} t^{ca}_{kl} \\langle lj||ib \\rangle~~^{106}~~~~~28~~\\lambda^{kj}_{cb} t^{cd}_{kl} \\langle lb||da \\rangle~~^{70}~~~~~$\n", + "$29~~-\\lambda^{ki}_{cb} t^{cd}_{kl} \\langle lj||di \\rangle~~^{64}~~~~~30~~-\\frac{1}{4}\\lambda^{kl}_{ab} t^{cd}_{kl} \\langle ib||cd \\rangle~~^{109}~~~~~31~~\\frac{1}{4} \\lambda^{il}_{cd} t^{cd}_{kj} \\langle kj||al \\rangle ~~^{112}~~~~~32~~-\\lambda^{ij}_{cd} t^d_k t^b_j \\langle ck||ab \\rangle~~^{139}~~~~~33~~\\lambda^{kj}_{ab} t^b_l t^d_j \\langle il||kd \\rangle~~^{136}$\n", + "$34~~\\frac{1}{2} \\lambda^{kl}_{ab} t^c_k t^d_l \\langle ib||cd \\rangle~~^{121}~~~~~35~~-\\frac{1}{2}\\lambda^{ij}_{cd}t^c_k t^d_l \\langle kl||aj \\rangle~~^{151}~~~~~36~~-\\frac{1}{2}\\lambda^{kj}_{ca} t^{cb}_{kj} t^d_l \\langle il||bd \\rangle~~^{124}~~~~~37~~-\\frac{1}{2}\\lambda^{ki}_{cb} t^{cb}_{kj} t^d_l \\langle jl||ad \\rangle~~^{127}$\n", + "$38~~-\\lambda^{jl}_{ad} t^{cd}_{kl} t^b_j \\langle ik||bc \\rangle~~^{133}~~~~~39~~-\\lambda^{il}_{bd} t^{cd}_{kl} t^b_j \\langle jk||ac \\rangle~~^{142}~~~~~40~~\\frac{1}{4}\\lambda^{jk}_{ad} t^{bc}_{jk} t^d_l \\langle il||bc \\rangle~~^{154}~~~~~41~~\\frac{1}{4}\\lambda^{il}_{bc} t^{bc}_{jk} t^d_l \\langle jk||ad \\rangle~~^{157}$\n", + "$42~~-\\frac{1}{2} \\lambda^{kj}_{cb} t^{cd}_{kj} t^b_l \\langle li||da \\rangle~~^{148}~~~~~43~~-\\frac{1}{2}\\lambda^{kj}_{cb} t^{cb}_{kl} t^d_j \\langle li||da \\rangle~~^{145}~~~~~44~~\\frac{1}{2}\\lambda^{kj}_{ab} t^c_k t^d_j t^b_l \\langle il||cd \\rangle~~^{160}~~~~~45~~\\frac{1}{2}\\lambda^{ij}_{cb}t^c_k t^d_j t^b_l \\langle kl||ad \\rangle~~^{163}$" + ] + }, + { + "attachments": { + "fynd.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "38aa4673", + "metadata": {}, + "source": [ + "The doubles $\\lambda$ are (not diagram 33)\n", + "![fynd.png](attachment:fynd.png)\n", + "$1~~\\langle ij||ab \\rangle~~^{295}~~~~~2~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\{f^a_i \\lambda^j_b\\}~~^{213}~~~~~3~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\{\\lambda^j_b t^c_k \\langle ik||ac \\rangle \\}~~^{271}~~~~~4~~\\boldsymbol{P}(ij)\\{\\lambda^i_c \\langle cj||ab \\rangle\\}~~^{189}~~~~~5~~\\boldsymbol{P}(ab)\\{-\\lambda^k_a \\langle ij||kb \\rangle \\}~~^{197}$\n", + "$6~~\\boldsymbol{P}(ij)\\{-\\lambda^i_c t^c_k \\langle kj||ab \\rangle \\}~~^{233}~~~~~7~~\\boldsymbol{P}(ab)\\{-\\lambda^k_a t^c_k \\langle ij||cb \\rangle \\}~~^{229}~~~~~8~~\\boldsymbol{P}(ab) \\{\\lambda^{ij}_{ac} f^b_c \\}~~^{193}~~~~~9~~\\boldsymbol{P}(ij)\\{-\\lambda^{ik}_{ab} f^k_j \\}~~^{185}$\n", + "$10~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\{\\lambda^{ik}_{ac} \\langle cj||kb \\rangle \\}~~^{225}~~~~~11~~\\frac{1}{2}\\lambda^{ij}_{cd} \\langle cd||ab \\rangle~~^{182}~~~~~12~~\\frac{1}{2}\\lambda^{kl}_{ab} \\langle ij||kl \\rangle~~^{179}~~~~~13~~\\boldsymbol{P}(ij)\\{-\\lambda^{ik}_{ab} t^c_k f^c_j \\}~~^{217}~~~~~14~~\\boldsymbol{P}(ab)\\{ -\\lambda^{ij}_{ac} t^c_k f^b_k \\}~~^{221}$\n", + "$15~~\\boldsymbol{P}(ab)\\{\\lambda^{ij}_{ac} t^d_k\\langle ck||bd \\rangle \\}~~^{241}~~~~~16~~\\boldsymbol{P}(ij)\\{-\\lambda^{ik}_{ab} t^c_l \\langle jl||kc \\rangle \\}~~^{237}~~~~~~17~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\{\\lambda^{ik}_{ac} t^d_k \\langle cj||db \\rangle \\}~~^{267}~~~~~18~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\{-\\lambda^{ik}_{ac}t^c_l \\langle lj||kb \\rangle \\}~~^{283} $\n", + "$19~~ -\\lambda^{ij}_{cd} t^c_k \\langle kd||ab \\rangle ~~^{204}~~~~~20~~\\lambda^{kl}_{ab} t^c_k \\langle ij||cl \\rangle ~~^{201}~~~~~21~~\\boldsymbol{P}(ij)\\big \\{-\\frac{1}{2}\\lambda^{ik}_{ab} t^{cd}_{kl}\\langle jl||cd \\rangle \\big \\}~~^{256}~~22~~\\boldsymbol{P}(ab)\\big \\{-\\frac{1}{2}\\lambda^{ij}_{ac} t^{cd}_{kl}\\langle kl||bd \\rangle \\big \\}~~^{263}$\n", + "$23~~\\boldsymbol{P}(ab) \\big \\{ -\\frac{1}{2} \\lambda^{kl}_{ca} t^{cd}_{kl} \\langle ij||db \\rangle \\big \\}~~^{245}~~~~~24~~\\boldsymbol{P}(ij) \\big \\{ -\\frac{1}{2} \\lambda^{ki}_{cd} t^{cd}_{kl} \\langle lj||ab \\rangle \\big \\}~~^{252}~~25~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{\\lambda^{ik}_{ac} t^{cd}_{kl} \\langle lj||db \\rangle \\big \\}~~^{275}~~~~~26~~\\frac{1}{4}\\lambda^{kl}_{ab}t^{cd}_{kl} \\langle ij||cd \\rangle~~^{207}$\n", + "$27~~\\frac{1}{4}\\lambda^{ij}_{cd}t^{cd}_{kl} \\langle kl||ab \\rangle~~^{210}~~~~~28~~\\boldsymbol{P}(ij)\\big \\{-\\lambda^{ik}_{ab} t^c_k t^d_l \\langle jl||cd \\rangle \\big \\}~~^{279}~~~~~29~~\\boldsymbol{P}(ab)\\big \\{-\\lambda^{ij}_{ac} t^c_k t^d_l \\langle kl||bd \\rangle \\big \\}~~^{287}~~~~~30~~\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{-\\lambda^{ik}_{ad}t^c_k t^d_l \\langle lj||cb \\rangle \\big \\}~~^{291}$\n", + "$31~~\\frac{1}{2}\\lambda^{kl}_{ab} t^c_k t^d_l \\langle ij||cd \\rangle~~^{249}~~~~~32~~\\frac{1}{2}\\lambda^{ij}_{cd} t^c_k t^d_l \\langle kl||ab \\rangle~~^{260}$" + ] + }, + { + "attachments": { + "feynd1.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "d62ff623", + "metadata": {}, + "source": [ + "__the CCSD one-body response density matrix__\n", + "\n", + "An element of the n-body response density matrix is defined as $(\\gamma^{(n)})_{pq} = \\langle0 |(1 + \\Lambda) e^{T} \\{p^\\dagger q \\} e^T|0 \\rangle$. Diagrammatically at CCSD level for $\\gamma_{ab}$ we have\n", + "![feynd1.png](attachment:feynd1.png)\n", + "$20~~\\displaystyle \\sum_k \\lambda^k_a t^b_k~~~~~21~~\\frac{1}{2}\\displaystyle \\sum_{klc} \\lambda^{kl}_{ac} t^{bc}_{kl}$\n", + "\n", + "The diagrams for $\\gamma_{ij}$ are inverted versions of $\\gamma_{ab}$ above giving $\\displaystyle \\sum_c -\\lambda^i_c t^c_j$ and $-\\frac{1}{2}\\displaystyle \\sum_{kcd} \\lambda^{ik}_{ab} t^{ab}_{jk}$\n", + "\n", + "For $\\gamma_{ia}$ the diagrams are" + ] + }, + { + "attachments": { + "fynd2-3.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "dabe066c", + "metadata": {}, + "source": [ + "![fynd2-3.png](attachment:fynd2-3.png)\n", + "$1~~t^a_i~~~~~2~~\\displaystyle \\sum_{kc} \\lambda^k_c t^{ac}_{ik}~~~~~3~~-\\displaystyle \\sum_{kc} \\lambda^k_c t^c_i t^a_k~~~~~4~~-\\frac{1}{2}\\displaystyle \\sum_{kc} \\lambda^{jk}_{bc} t^{bc}_{ik} t^a_j~~~~~5~~-\\frac{1}{2}\\displaystyle \\sum_{kc} \\lambda^{jk}_{bc} t^{ac}_{jk} t^b_i$\n", + "\n", + "and $\\gamma_{ai} = \\lambda^i_a$\n", + "\n", + "The one-electron energy is then $\\epsilon^1 = h^c_{ij} \\gamma_{ij}$ where $h^c$ is the core Hamiltonian (j+k) in the molecular spin basis." + ] + }, + { + "cell_type": "markdown", + "id": "2f40d917", + "metadata": {}, + "source": [ + "__EOM-CCSD__\n", + "\n", + "The equation-of-motion version of CCSD is defined for electron excitation as\n", + "\n", + "Define an excitation operator $~~R_k = \\hat{R}_k = \\frac{1}{(k!)^2} \\displaystyle \\sum_{ij...ab...}R^{ab...}_{ij...}a^\\dagger i b^\\dagger j... $ then $R_k |\\psi_o \\rangle = |\\psi_k \\rangle$ and the principle equation is $[\\hat{H}, \\hat{R}_k] |\\psi_0 \\rangle = \\omega_k \\hat{R}_k |\\psi_0 \\rangle$ with $\\omega_k = E_k - E_0$ and $\\hat{H} = e^{-\\hat{T}}H_N e^{\\hat{T}}$ ($H_N$ is normal-ordered Hamiltonian). The equations for $\\hat{H}$ are given below\n", + "\n", + "+ The singles-singles block $\\hat{H}_{\\scriptsize {SS}}$\n", + "\n", + " $[\\hat{H}_{\\scriptsize {SS}}~C]^a_i = \\displaystyle \\sum_c F_{ac} C^c_i - \\displaystyle \\sum_k F_{ki} C^a_k + \\displaystyle \\sum_{kc} W_{akic} C^c_k = \\displaystyle \\sum_c F_{ac} C^c_k \\delta_{ik} - \\displaystyle \\sum_k F_{ki} C^c_k \\delta_{ac} + \\displaystyle \\sum_{kc} W_{akic} C^c_k$\n", + "\n", + " $~~\\boldsymbol{F_{ac} \\delta_{ik}}$ \n", + " \n", + " $f^a_c \\delta_{ik}~~~~~-t^a_m f^c_m \\delta_{ik}~~~~~+t^e_m \\langle ma||ec \\rangle \\delta_{ik}~~~~~-\\frac{1}{2}t^{ea}_{nm} \\langle mn||ce \\rangle \\delta_{ik}~~~~~-t^e_n t^a_m \\langle mn||ce \\rangle \\delta_{ik}$\n", + "\n", + " $\\boldsymbol{-F_{ki} \\delta_{ac}}$ \n", + " \n", + " $-f^k_i \\delta_{ac}~~~~~-t^e_i f^e_k \\delta_{ac}~~~~~-t^e_m \\langle km||ie \\rangle \\delta_{ac}~~~~~-\\frac{1}{2}t^{ef}_{im} \\langle km||ef \\rangle \\delta_{ac}~~~~~-t^e_i t^f_m \\langle km||ef \\rangle \\delta_{ac}$\n", + " \n", + " $~~~\\boldsymbol{W_{akic}}$ \n", + " \n", + " $+\\langle ak||ic \\rangle~~~~~+t^e_i \\langle ak||ec \\rangle~~~~~-t^a_m \\langle mk||ic \\rangle~~~~~-t^{ea}_{im}\\langle mk||ec \\rangle~~~~~-t^e_i t^a_m \\langle mk||ec \\rangle$\n", + " \n", + "+ The singles-doubles block $\\hat{H}_{\\scriptsize {SD}}$\n", + "\n", + " $[\\hat{H}_{\\scriptsize {SD}}~C]^a_i = \\displaystyle \\sum_{kc} F_{kc} C^{ac}_{ik} + \\frac{1}{2} \\displaystyle \\sum_{kcd} W_{akcd} C^{cd}_{ik} - \\frac{1}{2} \\displaystyle \\sum_{klc} W_{klic} C^{ac}_{kl}= \\displaystyle \\sum_{ld} F_{ld} C^{cd}_{kl} \\delta_{ac}\\delta_{ik} + \\frac{1}{2} \\displaystyle \\sum_{lcd} W_{alcd} C^{cd}_{kl}\\delta_{ik} - \\frac{1}{2} \\displaystyle \\sum_{kld} W_{klid} C^{cd}_{kl} \\delta_{ac}$\n", + " \n", + " $~~~\\boldsymbol{F_{ld} \\delta_{ac} \\delta_{ik}}$ \n", + " \n", + " $+f^d_l \\delta_{ac} \\delta_{ik}~~~~~+t^e_m \\langle lm||de \\rangle \\delta_{ac} \\delta_{ik}$\n", + " \n", + " $~~~\\boldsymbol{\\frac{1}{2}W_{alcd} \\delta_{ik}}$ \n", + " \n", + " $+\\frac{1}{2} \\langle al||cd \\rangle \\delta_{ik}~~~~~-\\frac{1}{2}t^a_m \\langle ml||cd \\rangle \\delta_{ik}$\n", + " \n", + " $\\boldsymbol{-\\frac{1}{2}W_{klid} \\delta_{ac}}$ \n", + " \n", + " $-\\frac{1}{2} \\langle kl||id \\rangle \\delta_{ac}~~~~~-\\frac{1}{2}t^e_i \\langle kl||ed \\rangle \\delta_{ac}$\n", + " \n", + "+ The doubles-singles block $\\hat{H}_{\\scriptsize {DS}}$\n", + "\n", + " $[\\hat{H}_{\\scriptsize {DS}}~C]^{ab}_{ij} = \\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{k} W_{kaij} C^b_k \\big \\} + \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_c W_{abcj} C^c_i \\big \\} + \\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{kcd} W_{bkdc}t^{ad}_{ij} C^c_k \\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} W_{lkjc} t^{ab}_{il} C^c_k \\big \\}$\n", + " $=\\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{k} W_{kaij} C^c_k \\delta_{bc}\\big \\} + \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_c W_{abcj} C^c_k \\delta_{ik}\\big \\} + \\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{kcd} W_{bkdc}t^{ad}_{ij} C^c_k \\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{klc} W_{lkjc} t^{ab}_{il} C^c_k \\big \\}$\n", + " \n", + " $~~~\\boldsymbol{P(ab)\\big \\{ W_{kaij} \\big \\} \\delta_{bc}}$ \n", + " \n", + " $+P(ab)\\big \\{ \\langle ka||ij \\rangle \\delta_{bc} \\big \\}~~~~~+P(ab)P(ij) \\big \\{\\langle km||ie \\rangle t^{ea}_{mj} \\delta_{bc} \\big \\}~~~~~+P(ab) \\big \\{\\frac{1}{2} \\langle ka||ef \\rangle t^{ef}_{ij} \\delta_{bc} \\big \\}~~~~~+P(ab) \\big \\{ \\langle ka||ef \\rangle t^e_i t^f_j \\delta_{bc} \\big \\}$\n", + " $-P(ab) \\big \\{ \\langle km||ij \\rangle t^a_m \\delta_{bc} \\big \\}~~~~~+P(ab)P(ij) \\big \\{ \\langle km||ei \\rangle t^a_m t^e_j \\delta_{bc} \\big \\}~~~~~-P(ab) \\big \\{ \\frac{1}{2} \\langle km||ef \\rangle t^a_m t^{ef}_{ij} \\delta_{bc} \\big \\}~~~~~-P(ab) \\big \\{ \\langle km||ef \\rangle t^a_m t^e_i t^f_j\\delta_{bc} \\big \\}$\n", + " $+P(ij)P(ab) \\big \\{ \\langle ka||ej \\rangle t^e_i \\delta_{bc} \\big \\}~~~~~-P(ij)P(ab) \\big \\{ \\langle km||ef \\rangle t^e_i t^{af}_{mj} \\delta_{bc} \\big \\}~~~~~-P(ab) \\big \\{ f^e_k t^{ae}_{ij} \\delta_{bc} \\big \\}~~~~~-P(ab) \\big \\{ \\langle km||ef \\rangle t^f_m t^{ae}_{ij} \\delta_{bc} \\big \\}$\n", + " \n", + " $~~~\\boldsymbol{P(ij)\\big \\{ W_{abcj} \\big \\} \\delta_{ik}}$ \n", + " \n", + " $+P(ij) \\big \\{ \\langle ab||cj \\rangle \\delta_{ik} \\big \\}~~~~~-P(ij)P(ab) \\big \\{ \\langle bm||ce \\rangle t^{ea}_{mj} \\delta_{ik} \\big \\}~~~~~+P(ij) \\big \\{ \\frac{1}{2} \\langle mn||cj \\rangle t^{ab}_{mn} \\delta_{ik} \\big \\}~~~~~+P(ij) \\big \\{ \\langle mn||cj \\rangle t^a_m t^b_n \\delta_{ik} \\big \\}$\n", + " $+P(ij) \\big \\{ \\langle ab||ce \\rangle t^e_j \\delta_{ik} \\big \\}~~~~~+P(ij)P(ab) \\big \\{ \\langle ma||ce \\rangle t^e_j t^b_m \\delta_{ik} \\big \\}~~~~~+P(ij) \\big \\{ \\frac{1}{2} \\langle mn||ce \\rangle t^{ab}_{mn} t^e_j \\delta_{ik} \\big \\}~~~~~+P(ij) \\big \\{ \\langle mn||ce \\rangle t^a_m t^b_n t^e_j \\delta_{ik} \\big \\}$\n", + " $-P(ij)P(ab) \\big \\{ \\langle mb||cj \\rangle t^a_m \\delta_{ik} \\big \\}~~~~~-P(ij)P(ab) \\big \\{ \\langle mn||ce \\rangle t^{eb}_{nj} t^a_m \\delta_{ik} \\big \\}~~~~~-P(ij) \\big \\{f^c_m t^{ab}_{mj} \\delta_{ik} \\big \\}~~~~~-P(ij) \\big \\{ \\langle mn||ce \\rangle t^{ab}_{mj} t^e_n \\delta_{ik} \\big \\}$\n", + " \n", + " $~~~\\boldsymbol{P(ab) \\big \\{ W_{bkec} t^{ae}_{ij} \\big \\}}$ \n", + " \n", + " $+P(ab) \\big \\{ \\langle bk||ec \\rangle t^{ae}_{ij} \\big \\}~~~~~-P(ab) \\big \\{\\langle mk||ec \\rangle t^{ae}_{ij} t^b_m \\big \\}$\n", + " \n", + " $~~~\\boldsymbol{-P(ij) \\big \\{ W_{mkjc} t^{ab}_{im} \\big \\}}$ \n", + " \n", + " $-P(ij) \\big \\{ \\langle mk||jc \\rangle t^{ab}_{im} \\big \\}~~~~~-P(ij) \\big \\{\\langle mk||ec \\rangle t^{ab}_{im} t^e_j \\big \\}$\n", + " \n", + "+ The doubles-doubles block $\\hat{H}_{\\scriptsize {DD}}$\n", + "\n", + " $[\\hat{H}_{\\scriptsize {DD}}~C]^{ab}_{ij} = \\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{c} F_{bc} C^{ac}_{ij} \\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{k} F_{kj} C^{ab}_{ik} \\big \\} + \\frac{1}{2} \\displaystyle \\sum_{cd} W_{abcd} C^{cd}_{ij} + \\frac{1}{2} \\displaystyle \\sum_{kl} W_{klij} C^{ab}_{kl} + \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kc}W_{bkjc} C^{ac}_{ik} \\big \\}$\n", + " $~~~~~~~~~~~~~~~~~-\\boldsymbol{P}(ab) \\big \\{ \\frac{1}{2}\\displaystyle \\sum_{klcd} W_{lkdc} t^{db}_{ij} C^{ca}_{kl} \\big \\} +\\boldsymbol{P}(ij) \\big \\{ \\frac{1}{2}\\displaystyle \\sum_{klcd} W_{mkdc} t^{ab}_{jm} C^{dc}_{ik} \\big \\} = \\boldsymbol{P}(ab)\\big \\{ \\displaystyle \\sum_{c} F_{bc} C^{cd}_{kl} \\delta_{ad} \\delta_{il} \\delta_{jk}\\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_{k} F_{kj} C^{cd}_{kl} \\delta_{bc} \\delta_{il} \\delta_{jk} \\big \\}$\n", + " $~~~~~~~~~~~~~~~~~+ \\frac{1}{2} \\displaystyle \\sum_{cd} W_{abcd} C^{cd}_{kl} \\delta_{ik} \\delta_{jl} + \\frac{1}{2} \\displaystyle \\sum_{kl} W_{klij} C^{cd}_{kl} \\delta_{ac} \\delta_{bd} + \\boldsymbol{P}(ij)\\boldsymbol{P}(ab) \\big \\{ \\displaystyle \\sum_{kc}W_{bkjc} C^{cd}_{kl} \\delta_{ad} \\delta_{il} \\big \\}-\\boldsymbol{P}(ab) \\big \\{ \\frac{1}{2}\\displaystyle \\sum_{klce} W_{lkec} t^{eb}_{ij} C^{cd}_{kl} \\delta_{ad}\\big \\}$\n", + " $~~~~~~~~~~~~~~~~~+\\boldsymbol{P}(ij) \\big \\{ \\frac{1}{2}\\displaystyle \\sum_{klcd} W_{mkdc} t^{ab}_{jm} C^{cd}_{kl} \\delta_{il}\\big \\}$\n", + " \n", + " $\\boldsymbol{P(ab)\\big \\{ F_{bc} \\delta_{ad} \\delta_{il} \\delta_{jk} \\big \\}}$ \n", + " \n", + " $+\\boldsymbol{P}(ab) \\big \\{ f^b_c \\delta_{jk} \\delta_{il} \\delta_{ad} \\big \\}~~~~~-\\boldsymbol{P}(ab) \\big \\{ f^c_m t^b_m \\delta_{jk} \\delta_{il} \\delta_{ad} \\big \\}~~~~~+\\boldsymbol{P}(ab) \\big \\{ \\langle mb||ec \\rangle t^e_m \\delta_{jk} \\delta_{il} \\delta_{ad} \\big \\}~~~~~-\\boldsymbol{P}(ab) \\big \\{ \\frac{1}{2} \\langle mn||ec \\rangle t^{eb}_{mn} \\delta_{jk} \\delta_{il} \\delta_{ad} \\big \\} \\big \\}$\n", + " $-\\boldsymbol{P}(ab) \\big \\{ \\langle mn||ec \\rangle t^e_m t^b_n \\delta_{jk} \\delta_{il} \\delta_{ad} \\big \\}$\n", + " \n", + " $-\\boldsymbol{P(ij)\\big \\{ F_{jk} \\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}}$ \n", + " \n", + " $-\\boldsymbol{P}(ij) \\big \\{f^k_j \\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}~~~~~-\\boldsymbol{P}(ij) \\big \\{f^e_k t^e_j \\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}~~~~~-\\boldsymbol{P}(ij)\\big\\{\\langle km||je \\rangle t^e_m \\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}~~~~~+\\boldsymbol{P}(ij) \\big\\{ \\frac{1}{2} \\langle km||ef \\rangle t^{fe}_{jm}\\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}$\n", + " $+\\boldsymbol{P}(ij) \\big \\{ \\langle km||ef \\rangle t^f_j t^e_m \\delta_{ad} \\delta_{il} \\delta_{bc} \\big \\}$\n", + " \n", + " $+\\boldsymbol{\\frac{1}{2}W_{abcd} \\delta_{ik} \\delta_{jl}}$ \n", + " \n", + " $\\frac{1}{2}\\langle ab||cd \\rangle \\delta_{ik} \\delta_{jl}~~~~~-\\boldsymbol{P}(ab) \\big \\{\\frac{1}{2} \\langle am||cd \\rangle t^b_m \\delta_{ik} \\delta_{jl} \\big \\}~~~~~+\\frac{1}{4} \\langle mn||cd \\rangle t^{ab}_{mn}\\delta_{ik} \\delta_{jl}~~~~~+\\frac{1}{2}\\langle mn||cd \\rangle t^a_m t^b_n \\delta_{ik} \\delta_{jl}$\n", + " \n", + " $+\\boldsymbol{\\frac{1}{2}W_{klij} \\delta_{ac} \\delta_{bd}}$ \n", + " \n", + " $\\frac{1}{2}\\langle kl||ij \\rangle \\delta_{ac} \\delta_{bd}~~~~~+\\boldsymbol{P}(ij) \\big \\{\\frac{1}{2} \\langle kl||ij \\rangle t^e_j \\delta_{ac} \\delta_{bd} \\big \\}~~~~~+\\frac{1}{4} \\langle kl||ef \\rangle t^{ef}_{ij}\\delta_{ac} \\delta_{bd}~~~~~+\\frac{1}{2}\\langle kl||ef \\rangle t^e_i t_j \\delta_{ac} \\delta_{bd}$\n", + " \n", + " $\\boldsymbol{+P(ij)P(ab)\\big \\{ W_{akic} \\delta_{jl} \\delta_{db} \\big \\}}$ \n", + " \n", + " $+\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{ \\langle ak||ic \\rangle \\delta_{jl} \\delta_{db} \\big \\}~~~~~+\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{ \\langle ak||ec \\rangle t^e_i \\delta_{jl} \\delta_{db} \\big \\}~~~~~-\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{ \\langle mk||ic \\rangle t^a_m \\delta_{jl} \\delta_{db} \\big \\}$\n", + " $-\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{ \\langle mk||ec \\rangle t^{ea}_{im} \\delta_{jl} \\delta_{db} \\big \\}~~~~~-\\boldsymbol{P}(ij)\\boldsymbol{P}(ab)\\big \\{ \\langle mk||ec \\rangle t^e_i t^a_m \\delta_{jl} \\delta_{db} \\big \\}$\n", + " \n", + " $\\boldsymbol{-\\frac{1}{2}P(ab) \\big \\{W_{lkec} t^{eb}_{ij} \\delta_{ad} \\big \\}}$ \n", + " \n", + " $-\\frac{1}{2} \\langle lk||ec \\rangle t^{eb}_{ij} \\delta_{ad}$\n", + " \n", + " $\\boldsymbol{+\\frac{1}{2}P(ij) \\big \\{ W_{mkdc} t^{ab}_{jm} \\delta_{il} \\big \\}}$ \n", + " \n", + " $-\\frac{1}{2} \\langle km||cd \\rangle t^{ab}_{mj} \\delta_{il}$\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "d34660b5", + "metadata": {}, + "source": [ + "The above expressions are coded with explicit for-loops in _harpy.eom_ module. For $H_2 O$ in STO-3G using the Crawford geometry (O-H=2.079 bohr and $H\\hat{O}H = 104^\\circ$) we get for energies in range 5-15 eV and their multiplicities (values agree with Gaussian)\n", + "\n", + "| | | | | | | | | |\n", + "|----|:----:|:----:|:----:|:-----:|:-----:|:-----:|:-----:|:-----:|\n", + "| m | 3 | 1 | 3 | 3 | 1 | 3 | 1 | 3 |\n", + "| eV |7.4901|8.7859|9.8321|10.0122|10.7445|11.6803|13.5204|14.8390|\n", + "\n", + "and with Hirata geometry\n", + "\n", + "| | | | | | |\n", + "|----|:-----:|:-----:|:-----:|:-----:|:-----:|\n", + "| m | 3 | 1 | 3 | 3 | 1 |\n", + "| eV |10.3978|11.9916|13.0743|13.5682|14.5850|\n", + "\n", + "\n", + "__partitioned EOM-CCSD__\n", + "\n", + "In the partitioned-scheme the $H_{DD}$ block is replaced as $[H^0_{DD} C]^{ab}_{ij}=\\boldsymbol{P}(ab) \\big \\{\\displaystyle \\sum_c f^b_c C^{ac}_{ij} \\big \\} - \\boldsymbol{P}(ij) \\big \\{ \\displaystyle \\sum_k f^k_j C^{ab}_{ik}\\big \\}$\n", + "\n", + "With Crawford geometry EOM-CCSD(P)\n", + "\n", + "| | | | | | | | | \n", + "|----|:----:|:----:|:-----:|:-----:|:-----:|:-----:|:-----:|\n", + "| m | 3 | 1 | 3 | 3 | 1 | 3 | 1 | \n", + "| eV |8.1562|9.7465|10.2026|10.4751|11.6287|11.7939|14.2558|\n", + "\n", + "and Hirata geometry\n", + "\n", + "| | | | | |\n", + "|----|:-----:|:-----:|:-----:|:-----:|\n", + "| m | 3 | 1 | 3 | 3 |\n", + "| eV |10.8686|12.6844|13.3042|13.9999|\n" + ] + }, + { + "cell_type": "markdown", + "id": "40098e11", + "metadata": {}, + "source": [ + "__unitary coupled-cluster__\n", + "\n", + "The difference in unitary theory is that instead of $e^{T_n}$ ansatz we use a $e^{\\sigma}$ ansatz where $\\sigma$ is anti-hermitian or $\\sigma^\\dagger = - \\sigma$. This is usually taken to be $\\sigma= \\hat{S} - \\hat{S}^\\dagger$ where $\\hat{S}$ is given by expressions similar to $\\hat{T}$ eg $S_1 = \\displaystyle \\sum_{ia} \\sigma^a_i a^\\dagger_a a_i$. The major difference with traditional coupled-cluster is that the Baker-Campbell-Hausdorff does not naturally terminate and approximate schemes must be made. Most schemes are based on using\n", + "\n", + "$\\bar{H} = \\bar{H}_0 + \\bar{H}_1 + \\bar{H}_2 + \\bar{H}_3$ with\n", + "\n", + "$\\bar{H}_0 = \\hat{F} + \\hat{V}$\n", + "\n", + "$\\bar{H}_1 = [\\hat{F}, \\hat{\\sigma}] + \\frac{1}{2}[\\hat{V}, \\hat{\\sigma}] + \\frac{1}{2}[\\hat{V}_R, \\hat{\\sigma}]$\n", + "\n", + "$\\bar{H}_2 = \\frac{1}{12}[[\\hat{V_{ND}}, \\hat{\\sigma}], \\hat{\\sigma}] + \\frac{1}{4}[[\\hat{V}, \\hat{\\sigma}]_R, \\hat{\\sigma}] + \\frac{1}{2}[[\\hat{V}_R, \\hat{\\sigma}]_R, \\hat{\\sigma}]$\n", + "\n", + "$\\bar{H}_3 = \\frac{1}{24}[[[\\hat{V_{ND}}, \\hat{\\sigma}]_R, \\hat{\\sigma}], \\hat{\\sigma}] + \\frac{1}{8}[[[\\hat{V}_R, \\hat{\\sigma}]_R, \\hat{\\sigma}]_R, \\hat{\\sigma}] + \\frac{1}{8}[[[\\hat{V}, \\hat{\\sigma}]_R, \\hat{\\sigma}]_R, \\hat{\\sigma}] - \\frac{1}{24}[[[\\hat{V}, \\hat{\\sigma}]_R, \\hat{\\sigma}], \\hat{\\sigma}] - \\frac{1}{24}[[[\\hat{V}_R, \\hat{\\sigma}]_R, \\hat{\\sigma}], \\hat{\\sigma}] $\n", + "\n", + "The **UCC2** method is $$\\bar{H}_{ucc2} = \\hat{H}_0 + [\\hat{F}, \\hat{\\sigma_1} + \\hat{\\sigma_2}] + \\frac{1}{2}[\\hat{V}, \\hat{\\sigma_2}] + \\frac{1}{2}[\\hat{V}_R, \\hat{\\sigma_2}]$$\n", + "\n", + "The **UCC3** method is $$\\bar{H}_{ucc3} = \\bar{H}_{ucc2} + \\hat{H}_0 + \\frac{1}{2}[\\hat{V}, \\hat{\\sigma_1}] + \\frac{1}{2}[\\hat{V}_R, \\hat{\\sigma_1}] + \\frac{1}{12}[[\\hat{V}_{ND}, \\hat{\\sigma}_2], \\hat{\\sigma}_2]+ \\frac{1}{4}[[\\hat{V}, \\hat{\\sigma}_2]_R, \\hat{\\sigma}_2] + \\frac{1}{4}[[\\hat{V}_R, \\hat{\\sigma}_2]_R, \\hat{\\sigma}_2] $$\n", + "\n", + "Here the subscript $_ND$ means non-diagonal elements so Fock elements with excitation levels of +1 and -1 and 2-body Hamiltonians with excitation levels +2 and -2. $_R$ are the 'rest' of the Hamilitonians.\n", + "\n", + "Using Hirata geometry in sto-3g basis the ucc values calculated by harpy are\n", + "\n", + "| | |\n", + "|:--|:--|\n", + "|Harpy ucc2 | -0.05057534 |\n", + "|Harpy ucc3 | -0.04988577 |\n", + "|Harpy ccsd | -0.05012733 |\n", + "|Harpy ccsdt | -0.05023226 |\n" + ] + }, + { + "attachments": { + "fyn1-4.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "3f7dbe77", + "metadata": {}, + "source": [ + "__Appendix A - Interpreting the Diagrams__\n", + "\n", + "As an example consider diagram $D_{5a}$. We start by noting that there are two lines with pre-defined direction arrows - these are internal lines. They are the first internal lines we encounter moving from left to right so we label the upward particle line using the set $\\{c, d\\}$, as it is the first internal particle we assign the line the label __c__. The downward hole line we label from the set $\\{k, l\\}$ and so we assign the label __k__. If the pre-defined arrows constrain other arrow directions we must allow for that - in this case the first external line must be a down arrow and the second external line must be an up arrow (at each vertex there must be an incoming and outgoing line). External particles are labelled from the set $\\{a, b \\}$ and external holes from the set $\\{i, j \\}$ so we label the first external __i__ and the second __a__. That leaves a pair of external lines to be labelled - we choose (arbitrarily) the leftmost external line to be a hole and so label it __j__ and the last external line is thus a particle and labelled __b__. The final labelling is shown below\n", + "![fyn1-4.png](attachment:fyn1-4.png)\n", + "The diagram can be separated into three contributions as shown to the right of the original labelled diagram. The first sub-diagram represents a single amplitude operator which we write $t^{out}_{in} = t^c_i$. The second sub-diagram respresents a doubles amplitude operator which we write tleft out, right outleft in,right in = $t^{ab}_{kj}$. The third sub-diagram is a Fock operator term $f^c_k$. There are three hole lines __i__, __j__ and __k__ 2 loops - the external lines __j__, __b__ and __i__, __a__ are considered to be joined at infinity - thus the sign of the diagram is $(-1)^{3+2}=-1$. There are no equivalent lines and no equivalent vertices so there is no factor. We can see from the sub-diagrams that if we swap __i__ and __j__ we get a different set of diagrams whereas if we swap __a__ and __b__ we get essentially the same diagram, therefore we must make a permutation $\\boldsymbol{P}(ij)$.\n", + "\n", + "As a second example look at $D_{4a}$. Again there are two lines with pre-defined directions and again these will be labelled __c__ and __k__ as the first internal lines encountered working from the left. labelling the rest of the diagram in order we have" + ] + }, + { + "attachments": { + "fyn2.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAB1CAIAAAAKp1rGAAAAA3NCSVQICAjb4U/gAAAAGXRFWHRTb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAIABJREFUeJztnXtcU1e2+DcQ3o8EFYyFyqNVUJFHFXzUNolKp/UqD6d+HPu5NuC0vVRrpZ+pvZ/efu4Q70zHGYdRdKYvX4SxY6uVAVvrWBETLthKVRIFofIwQZ5BMYdHIOT5+2PPzS+TFyHJeSTZ37/kJJ69zsnZa62z1tpr++j1eoBAIBAIBP40Nze3tLSMj48rFIqJiYnXX389KiqKbKEQZEIjWwAEAoFAeAtDQ0NNTU1isfjmzZtqtXrHjh1kS4QgGeSFIBAIBIIgli5dOmvWLF9f3ytXrixevDg6OppsiRAk40u2AAgEAoHwFqKjozMyMmg0GgCAxWL5+iIb5O2gJwCBQCAQhCIUCgEAa9euJVsQBPn4oOpUBAKBQBDGo0ePEhMT1Wp1Z2dnTEwM2eIgSAbFQhAIBAJBHDdu3BgbG0tKSnriiSfIlgVBPsgLQSAQCARxCAQCAACbzfbx8SFbFgT5oDUyCAQCYcrAwEBTU9Pg4GBgYKBWq2UwGCwWi8FgkC2Xm6FWq2/dunX37t2AgICpqanMzMy0tDTohXA4HLKlQ1ACVBeCQCAQ/x+VSnXp0qWamprIyMjY2NiQkBCtVjs1NTU2NrZr166goCCyBXQb+vv7v/jii3v37iUnJ0dFRU1OTspkMjab/eKLLwIAurq6mEwm2TIiyAfFQhAIBOKfKBSKkydPfv7552lpaRs3bly+fLmvr69CoTh48OCxY8c4HM4zzzxDtozuQU9Pz4EDB2pra99+++1t27bR6XS9Xl9ZWfnhhx9OTEwsW7YMuSAICKoLQSAQCAAA0Gq1x48f379/f1RU1AcffJCVlQW7WdTV1X3yySe9vb1DQ0Nky+gejI+Pl5aWHjt2bMuWLTt27KDT6QAAHx+fnJycjo4OgNIxCCOQF4JAIBAAAFBTU1NaWjo6Ovr+++/HxcUZjisUiuDgYDabvWjRIhLFcyO++uqrEydOzJ07t6ioKCAgwHDc398f9itDnUIQBlBGBoFAIMDIyMj+/ft7e3uzs7NXrVpl/BGLxeLxePPnzzd2TRDWkMlkf/rTnxQKxfbt2+fNm2f8UX9//4MHD8LCwjIzM8kSD0E1kBeCQCAQoK6u7tq1awCAwsJCk7bi0dHR27dvJ0ku96Ompqa1tdXX13fr1q0mHzU0NCiVypUrV86ZM4cU2RAUBGVkEAgEAlRWVmq12qioqOzsbLJlcW+qq6v1ej2TyTQPeNTW1gKUjkH8KzPwQg4ePDh79uwDBw7gJw0C4fGgeURNbt26BQBYvHgxek13kqamJgBAampqaGio8XGNRlNXVweMSlNRnwgEsN8LmZqaeu+99x4/fgx3IUIgEA6A5hFlmZqaAgAsWbKEbEHcnrGxMQDA0qVLTY5LJJL79+/T6fRly5YBAIaHhy9cuECCfAiKYa8XEhgY+NZbb+Xm5h46dAhXgRAIDwbNI8oCK09tNLEQCoVwlSnCNlFRUQCApKQkk+OVlZUajSYlJSUyMhIAUFdX19raSoJ8CIoxg+rUsrIy/ORAILwENI+oSX5+vkAg6O/vN/9Iq9VWV1ffvHlzx44dxAvmdrDZ7La2NpODN2/ePHfuHAAgPT0dHjl37tzevXuJFg5BPVB1KgKBQIDNmzdnZ2cLhcKWlhbDQZVKdePGjVOnTrW0tLDZ7AULFpAoobvA5XJjY2Nra2thkkutVtfW1l6+fHn16tU+Pj6wWKSlpUWtVqekpJAtLIJ80D4yCAQCAQAA33//fXl5+bx585KTk/38/LRarVarnZycDAwMXLZsGTKZdqLT6Y4ePXrx4sUNGzbQ6fSpqanJycmnnnpq8eLFv/rVr1Qq1ebNm7u7uzMzM3/2s5+RLSyCfJAXgkAgEP+kp6fn+vXrarUaeiF+fn5JSUmpqakmHUQQttFoNAKBoLe3NygoSKfTZWZmLly4EADQ2tpaX18fEhISHh6ek5OD7ioCTOuFKBSKvXv33r9/v7+/v6ioaOfOnYRJRmXGx8ePHj361VdfBQcHj42NvfPOO6+88kpXV5dSqUQ19ghz0DxCIBA28GqboreOTqd75ZVXrl69qtfrS0pKAADff/+9je97CY2NjYmJiWvWrJFKpXq9XqVScbnco0eP0mi0pKQksqVDUA40j9wUuVzO4/HkcjnZgrgB6F45g5fbFFtrZP7yl79kZWXBDjNwM8nr16+b7LDgbVy7du3FF19csGDBpUuXYJmVv79/WVnZ3LlzNRoNKl5DmIPmkZtSVla2b98+sVhcVVVFtixUp6Cg4Pz583q9nsfjkS2Lm4FsitVYiFqtTk1NnZychH/CrF5tbS1B3hEl6e/vj4qK8vHxuX37tslHK1euBAAcPHiQFMEQlAXNI/dFLpfDLemrqqrIloXSQC+NTqejWMhMQTZFr9dbLQ768ccfWSxWUFAQAODatWvt7e0MBmP16tWEuEYU5a233nr48OFzzz2XmppqfFyj0dy9excAsH79epJEQ1AUNI/cFwaDwefzAQCFhYUYhpEtDkXBMKywsBAAwOfzGQwG2eK4GcimAGA9FqLVajUaDfw3fMh2795NlG9ERW7fvu3j4wMA+PTTT00+gltxRkdH63Q6UmRDUBY0j9yd3NxcAEBeXh7ZglAUeH9yc3PJFsT9QDYFYjUW4uvr6+fnBwAYHx8/e/YsAOCXv/wl/k4RdTl16pRer6fRaC+//LLJR1euXAEArF27Fj5SCIQBNI/cHT6fT6fTq6urq6urLX5BKpV6cDEEj8eTSqXWPq2urj5//jydTodBI8SMQDYFMn0H9y+//FKhUCxfvjwtLY0AgSgLfCzS09Nnz55t8aN169aRIBbCTUDzyE2BeZn8/PzCwkI2m22SdIAVrAwGw1MdET6ff/jwYR6Pt2fPHpOPvCEX09vb29jYiGGYQqHw8fFJT09/7rnnXHVyEm1Kc3NzS0vL+Pi4QqGYmJh4/fXX4e4/eFBbW9vX16dQKBQKRWBg4O7du02/MW20BBbzf/zxx/BPtVqNa3CGssyaNQsAsGPHDpPjY2Nj/v7+AIDOzk54xBCBRyAMoHnk1pjnZSQSCZvNtl+RuimGC2Sz2RKJxPgjb8jF3L17t6SkJDc3NyYmZuHChX/+859deHISbcqVK1fefffd9evXMxiM0NDQgYEB157fmM8++2znzp1LliwJCwtbs2aN+RemaV33008//fDDD0FBQdu2bYNHXnjhBaVS6ZRr5J7QaDRgabvquro6tVodExPz1FNPAQDu3Lnzq1/9igT5EBQGzSN3xyQvU1ZWlpGRIRQKDV+wkbZwX4wvSigUZmRkHD58GP7pJbmY2NjYl19+mcVi+fj4REREJCYmuvDkJNqUpUuXvvLKK8888wyGYXFxcdHR0a49vzHr16/ncrkMBmN8fBwu/DFhGi8EZrLz8/NhwK2zszMiIgIW/HsbcKPqhIQEk+MfffQRAGDZsmXwzy+++ILFYhEsG4LioHnk7hjWy3C53Oeee+6dd94xWTXj8V4IAADDsOLiYg6Hc+fOHY/PxUAiIiKWLFkSExOjVCrnzp0LrYCrINGmREdHZ2RkQDeIxWLh2ko/MTExMzNzbGwMAADbJpkwzdhwg+ZNmzbBP3/zm98UFRXt27fPe9atYRgGr3fr1q0AAIlEYvzp4cOHf/zxRwAATPbr9fqLFy++9NJLpIiKoCxoHnkAeXl5KSkpo6OjDQ0N5p96gxcCEQqFy5cvxzAsNzc3Ly+PcKGIZnR0VCKRTExMPPnkk7GxsS48swM2xWCPXCIADOatXbvWJWezQX9/f3t7e1hYWGZmpvmn03ghMH4SGRkJAPj000+ffvrp69ev83g8Ty3FMgdebFlZ2X/8x3+sWLHi008/HR0dBQCMjY299957fX191dXVvr6+k5OTAIDy8vKcnBz0joswAc0jd0cqlXI4nJaWFhtfIFAcgrB2UWq1GgAwPDzskVdtgkwma2tri4yMfPrppwMDA114ZgdsisEeOT/6o0ePmpubg4KCCOjj/P333yuVypSUFMs1sLbrStRq9dtvv52WlsZms//nf/5Hp9OJRCIAQHx8PB5lLBQkPj4eACASifR6/eTk5LvvvrtmzZoXX3zxxRdf/Pbbb+F3vvjii/T0dA6Hs2PHDlSaijAHzSO35tChQ9PmHbhcLtliuh4ul2v7qhkMRllZGdli4otQKMzKylq2bNmFCxdcfvKZ2hRje+QkFy9eBACkpaUR0JKkqKgIAPD+++9b/NSR0u64uDhX3QiKA01FXFwc2YIgPBDvmUfui8lCGBuwWCyyhXU9dpYjmC+f8Ri0Wu3p06dnzZq1YcOGjo4OcoVxrT3au3cvAGDPnj0uOZsNtFrtokWLAACXL1+2+IXp+4WYk5eXd/jwYT6f75K4EJWB9WjekPtEEA/V5tHAwEBTU9Pg4GBgYKBWq2UwGCwWy7NrD20De4HYmYPv7u7GWx7isTPhApfPWOwp4u6MjIzcv39/YmIiNjbWUBSiUCja2tra29u1Wi2TyczKyoL7DeGNw/ZIrVbfunXr7t27AQEBU1NTmZmZaWlpAoEAWCkXdS0PHjzo6uqKiIgw1Nua4EhlbEFBAQDg/PnzzkjmFsBrhNeLQLgW6swjlUr19ddf/+53v2tsbNRqtfCgTCY7ceKE1y4nlkql1dXV9pcBemSFhP2uFYZhVVVVnncTBgcH29raZs2atWDBAlicMTg4eOXKlaamJrlc3tDQcPz48fr6emKEccwe9ff3Hzly5OTJkyMjIwAAnU739ddf19fXt7a2hoSErFixAg9Rjamvr1epVKmpqbA/ijmOeCHp6elxcXFSqVQsFjsnHqURi8VSqTQuLi49PZ1sWRAeCEXmkUKh+Oyzzz788MOpqamNGze+9tpr//7v//7yyy/LZLLDhw+3traSKBuJxMfHC4XC8vJymDizBw+zwfZfTlxcXHl5uVAohFULnsTAwEBbWxuTyYSragcGBq5evdrb25uZmZmamtrf39/U1NTU1ESAJI7Zo56env379584ceKZZ5755S9/uX379tdff33RokUffvjhxMTEokWLmEwmfjJDrl69CmyuxHFwlTAMCnl2vxqUjkHgDenzSKvVHj9+fP/+/VFRUR988EFWVhbsHFBXV/fJJ5/09vYODQ2RJRsVKCgoEIvFJSUlERER037ZC72QiIiIkpISsVjskQFjrVbb19fX1dU1d+7c5OTkgYEBgUAwPj6+fv36jIyMkZGRrq6uOXPmuLaJiDUcsEfj4+OlpaXHjh3bsmXLjh07YNrIx8cnJyeno6MDEJKO0Wg0MFZkayzH6k28ocLfhdXICIRFSJ9H//jHP2JjY0NDQxsaGoyPnz17NjExkcPhSKVSsmSjFBKJZNoFI+Xl5WSL6UrKy8ttXy+Xy/XUolTIo0ePeDxeYGDga6+91t7efvr06fLyckNXdYlEwufzq6qqZDIZAcI4YI9OnjwZGho6f/78/v5+4+M6nW7hwoUAgIsXL7paTFPu3bvn5+fHYDDkcrm17zi+/YFnV/ij1TEIYiBxHmEY9vzzzwMAsrOztVqt8Ucymeyvf/2rUCgkXiqNRjM2Nkb8uPYgEAhsLBspKSkhW0BXUlJSYu1KWSyWQCAgW0BTXP7ktLS0bN26lcFgbNmy5dixY2fPniXL63LAHg0ODi5ZsgQAUFRUZPJRb29vUFBQWFjYw4cPXSmlJY4ePQoA4HA4Nr7jeN9W0oPJuILSMQhiIHEe1dXVXbt2DQBQWFho0sI5Ojp6+/btpOxFcOvWLai5KAibzbZRLOINGRlDCYidC5iJxOVPzsDAQGtrq6+vb2dn58WLFzEMm5ycVKlULhzCThywRzU1NVB42KHVmIaGBthDbM6cOS4U0iLTFoUAh+tCAJUq/PEArY5BEAOJ86iyslKr1UZFRWVnZxM/ujVu3Lhx6tQpsqWwhaFYxGR9ZmdnJ1ki4YGJF0Kn0yleAuLaJ0ej0fT29kql0qeffvrVV19duXLl7du3//CHP5w+fZr4YikH7FF1dbVer2cymeZN02trawEhjdunpqbge47tAhTHvRCKVPjjAVod4zGUlZUZb3xKQUicR7du3QIALF68mIBXIvvRaDQajYZsKaaBwWDweDyxWGxcLALD5h6DsRfC5XLFYjGPx6Ny/xjXPjmPHz/u7OzU6XQrVqzYuXPnG2+8weFwHjx4UFpa+t1337lqFHtwzB7BlTupqamhoaHGxzUaTV1dHTDyDPR6veuE/Rfa29v7+vpmz56dmpoKB9LpdOZfc2onPU9NyqB0jGcgFArfeecdDofD4XCo7IuQNY+mpqYAADB5jHCA+Ph4Pp8vEAieffZZAMDExER1dTXZQrkM2CzEz8/vm2++4fP5nrcK1zawU0h0dPSiRYsCAgIYDAaHw2Gz2R0dHQ0NDdDdGRoaEovFw8PDuErimD2Ce9guXbrU5LhEIrl//z6dToc9xIaHhy9cuOAaQc0QCoU6nW758uXh4eEAgGvXrrW3t5t/zSkvxFOTMigd4xmw2WwYNhcKhVT2RciaR7C4wUbDAKFQCFf0IWzAZrMbGhp2794NACgsLPSMfZIxDIPv0OfOndu4cSPZ4pAA7BQyb948g5vu7+8fHBys1WoNEZd79+7V1tYaGv3hhGP2CO4bZ76KuLKyUqPRpKSkwM016+rq8OsJBHefhiXwAICTJ09arKpxygvxyKQMSsd4EjweTyqVUtwXIWse5efn+/r69vf3m3+k1WorKysJjjy7NUeOHMnNzcUwrLCwkGxZXEBBQYFCocjNzfXOkLBKpert7e3p6YmJiUlOToYHtVqtSqUKDQ2Nioqi0WhjY2N9fX00Gm327Nn4SeKwPbJYPnzz5s1z584BAAxnO3fu3AsvvOC0mJbp6ekBAMB0zPDwcHd3N1whbIJTXgjwxKQMSsd4GDCFT3FfhJR5tHnz5uzsbKFQaLxhvUqlglV+LS0tbDZ7wYIFRIrk1vD5fDqdXl1d7e55merq6vPnz9PpdE9S7DMCFoX4+fklJiYaqqaCg4OZTGZkZKS/v79Op+vo6BgaGlq1apWfnx9+kjhsj7hcbmxsbG1tLUy8qtXq2tray5cvr1692sfHBwa6Wlpa1Gp1SkqKq6X+JzASExISAgD4+9//np2dDbvgm+DH4/GcGYbJZH722Wcymay4uNiZ81CHN998E8OwTz/9lIDWtgjCCAoKYrPZRUVFQUFBYrH43r17FRUVdXV18fHxVEh4kzKPwsPDExMTHz9+/ODBA7go8c6dO83NzT09PTQabd26datXryZMGAONjY1NTU07d+4kfmgnCQoKSk5OPnPmzHfffQefNLIlcgQMwzgcjlKp/PLLL90rHuzCJ+fRo0f19fUTExO/+MUvFi9eDA/SaDQajYZh2MOHD8fHx/v6+mJjY1etWuXv7+/8iNZw2B498cQToaGhd+/eVSgUHR0dIpFIJpOlpKTk5eXBnshqtbqxsXHTpk0W4xMuYfbs2Z2dnZOTk3K5vLOz89VXX7VY3ezjfH1sfHx8d3e3SCRyr0fWImKxOCMjA4bHyZYFgRcYhpWVlZWVlcHtnWD5COn9D8iaRz09PdevX1er1X5+flqt1s/PLykpKTU11aSDCGEcPnz4+PHjzc3NpIzuPHl5eefPn8/Ly6uqqiJbFkeA8ufm5rpdRMeFT87o6OiNGzcePnzIYrHmzZtnOK5Sqdrb20UikY+Pz/z589PS0nDdTddJe6TRaAQCAexRptPpMjMzocPR2tpaX18fEhISHh6ek5OD30zX6/UCgaCjo4PBYCQlJVnTbC7wQoqLiw8fPrxnzx6KbFDuDJ50LQjbUM0X8Z5nT6PRwISxRcrLy8+cOXPp0iVrX2AwGLCwjppgGBYfHz8yMlJVVeV2id3q6ur8/Hw6nS6VSim4KNeznxxzvEQnuMALgf5afHy8RCJxiUwWaW5u3rx588aNGy3ODQaDweVyLX4klUorKiosnjM+Pt5kb4iEhASpVCoSiTAMg4uqzUlLS7OhXKqrq2/fvm3xIxaLZc3IVVRUWPN2uVyuxZQBhmEVFRXGBfkYhmEYNjg4qFQqV65cGRQUxGAwYOUjFZIOtjG/HGJQKpXXr19vamoaHR0FAJA44YmZRxiGQb1Goo25c+fOwYMHrWmetra2jo6OnJwca/89Kytr165duEnnAqAtp9Fob731lvl9tqGsxGKxtaVS1tSODYWTm5tr8e3T2lzDMOyTTz6ZmpqirP9EnSeHmHlksEcuiY+SNfenHZfm/BjGFf7mN0ssFmMY5vwrZnZ2tkwms2Eh0tLSLI7C4/GseSEAABaLZbDQe/fuNVQjs9lsa14IsNnmJT8/38ZYFisipVKpjVVYcM8k8+NisdhGDYHJQPHx8Ww2Oy8vLzc319p/IZeysrJ9+/aRNTqsnyIXYuZRcXFxRUWFXq93siDMGfz9/RMSEqx9OjQ01N3dnZiYaO0L1H+dzcvLCwsLGx8ft6avrCmr4uLimaodGwpHIBBYVDi2VQeTyaSmCwKo9ORAfWVNObsEY3vkkhMSILNFptU5LoiFAEuBI7FYXFFRUV1dLZVKBQKBk9pTKpUaHj6LLhWDwSgoKLAWC7F20+Pj4w3mv6CgADor8CqEQqG1NRTp6em2YyHW1luy2Wxr94HP51uLhRQUFFiMZHR3dxcVFV2/ft3wThMYGMhkMplMZlBQEIyFYBgmFovFYjFMOoD/u2RyX4UtgmEYn88nMhYCoyCNjY1KpRIAwGKxeDweudUhhM0jiURC2fCYu9eFgP+Lhfj5+e3evdu8bsCGshKLxdaqMaypHRsKJy8vz1osxOJcg1WQVI6F2IbIJwfvqWRij1xyTlKmv12DumTfPMMG5SKRqLi42GQw5/cLhXmTp556CgDA5XJdIbKF87tKWgLg8/kGLRYXF3fo0CHbYotEokOHDhm24GIwGHw+nzBpqYZcLjfuRU2dDUKJmUd4zCAXUlZWlpKSQrYUjiOXy+GjVVVVRbYsMwZW1Nreh52yEPzk4Deb8LNHxGsAe0Z0mRcCW7Ti4egY0uT19fXwH67dXtmkNITiXohcLje8EDtgPo23Jmez2e6oa5yBsv4HhJh5RNbu5Hbi7l4ITHrm5uaSLYiDQPnz8vLIFmTGEPzk4DShcLVHBCsBO4dzSrVZfGMzIS4uzpkh9P/qTLnclTP5yQEAlDJLJohEImhB6XS6M29aVVVVMFDMYDAo7nW5Cir7H8TPIypDcS+kpKTEhkqFsQQ6ne6+/r1cLofKwZqGkUgkJSUlxAplF8Q/Oe5oj4jUA3aO5YgXYo/SNMBisRwYwoCJM+VaV878JwcAUHOC6Y1cEBaL5byOk8vlaWlp3uCIUNb/IHEeURmKeyFxcXEMBqOsrMz8I7fOxRhjIy9z6NAhBoMRHx9PimC2If7JcUd7RJgqsH+gGXshJSUl9ihNA3v27HHwIvR6vSVnylWunMWf3HmBccLggrjWh4U3wYMdkZKSEgr6H3oKzCPKQnEvxPCLsNlsE/Xq7rkYY8zzMhKJxLg4mkTZrEHKk+OO9ogYbWD/KI48TNbul0WcceUsOlMuceVsXIKTL514YHjHwq8Syk3r0WwjEAgMvyl1/A8D5M4jykJlL8SklYtxUMQDcjHGmORlYAjE+Nop+CyR8uS4oz0iQCHMaAgHXVr7Fagz2t+aM+WkK2dbeAoGG+ErSFpaGk7nh/WqbDYbp/OTyKFDhyjofxggdx5REyp7IQa/1hg2m3379m3PyMUYA/2qiIiINWvWuPaBxAmynhx3tEd464QZnd/xwJqdCtThUL8NZ2paP8uG/2WP2I4JjBPl5eUA53csw3tPeXk5TkMgrEHiPKImfD6fgvFICJyM5sD9zDwjF2OMjd1WKagryHpy3NEe4aoWZnpyp64Q1zto25my9qlEIoGNyBwWGFBpsS5h9W5QvXpkXob6kDiPKEhbW9uZM2fIlsIytqt51qxZ4y6u3rSYVIGYQ8EqfhKfHHe0R/hphpme2dneqYYWbxZxbDNAsVi8adOm3t5eYL3hmnlHNqlUum/fPkObVPPrsi2qMc43qXQe2EJRLBbv27fPWut3Z+DxeD4+PsZHysvLu7u7WSwWh8Ox9r9mWlOJsBOy5hFiRkyrQxgMBo/H27NnD2Ei4QFs9W27kTGXyyW4ETiVcUd7ZJD522+/3bBhg0vO6aDOcZXjYxEH4mOHDh0y/HfbzpTB4TL4mzaui7BKQJdgiGjFxsYCfFKwM7oh9vwcCCchax4h7MfQ8c825stn3IVpQyDOPJOejTvaI3j+gIAAl+TXHNY5rsk5uWSVkVwuN9m8wPZMtr31qPE3CV4V6TzG99P5dlUWcWDjVjdVrG4EKfMIYT+GPRCmxVpPESpjvhDGBhSs4icXd7RHxqMUFBQ4nI53Uue4rPLFyY4rIpHIPHpj4/sW/U0b/1ckEu3Zs8dOJUKum2/yNP/3f/83TgPNyB9H79PEQPA8QswI++cLVCNu5P9JJBI7Iz3ouTLHTe2RyUDp6ekO1KA4r3Nc+SSZK1A7UwnGkZxpr2Ta39v2XbDn5yfXzTe5jZs2bcJpoBmFQ9xIn7o7xMwjxEyxf77ExcVRcAmJPZSXl9sf70E6Qe/m9sh8LAaDMaNH1yU6x8UaykSBTutYmUdybFyJnb+3nXdBJBJZ3PbagZvoQixqOvxmu53hEBQIIRhc5xHCMSw2CzEhIiKipKTErReayeXykpKSiIiIaS+Wgi1DiMQD7JG14ezJzrhQ57j+8owVqO1vWozkWLwSuVxu/+9t/12Ao3/55Zfm3ihZi3UtugX4OQF2vt6hlx7iwWMeIZzBWrMQ43nqMTNFIpFM+4ripvEe5/EYe2RDYNvZGdfqHFw0lOHxtXEZ1iI51q7Enu/P6C6IRCLwr7WfxsExUtx8Gz4BieEQFAilirMEAAASDUlEQVQhCzzmEcJhbBQVUnOLAOcRCAQ2ikVIX0tIIp5hj2zLbC0743Kdg5eGev7554GV4l7bkRwbVyISiezPWU4rIVzTb1FCkUhEik6x4RCQGA7xmNc7dwSPeYRwDIvT031LQOzHWrGIl7+feIA9skdy4+wMTjoHLw0FPTvzspppIzm2r0Qul8PNHp2/C1AM6rRJJdEbIMX7QdgDTvMI4QAmUQE6ne7uJSD2A4tF4D4PBp599lmy5SIZd7dHdioQmJ3BT+fgqKGgn2h8W10VxXI+ImQe/iIdEjMjpGSCEHaC3zxCzAjjF19PKgGxH5NikZCQELIlogTua4/s1yHBwcEzUTkz0zm+Mzr1jIChG0MLWwzDxGKxS85cXFw8o2iYOVAqO4NLBCCVSqft5ltRUeFAG297iI+Pt1YVi9p+kw5+8wgxI7q7uwEAfn5+33zzDZ/P98KpER8fz+fzBQLBs88+CwCYmJiAG014OZ5nj8yZnJzE8ew4OVl6K8Fke0qv7ZTNdjTM9v+lWjqG9BWzBK8QRtgP3vMIYQ9yuTw0NBTgv6+ku7B7926A9r80wh3tkZ0KBEb+8NM5+Goo82AyxM7rsWcIB7qmUC0dQ5HuYSa/CKoIoQ4EzCOEbaCByc3NJVsQCgHvSV5eHtmCUAj3skfTqg7zzCMeOgdfDWWj7ldvx/XYOYrFaJjDUhEPRTqpmzhDKBBCHYiZR15LT0/PuXPnjh8/fvjw4SNHjvzv//6vyReqqqoAAHQ6Hb33GyOXy2G96rTxoStXrlRUVHz88cd//OMfjxw5Qox4ZOFG9siG0vj5z39uwwS4Vufgq6GsVfgb8/Of/9z5KzGPhtn4MqXSMZTaVS4zMxMOgQIhlIKweeSd3L17t6SkJDc3NyYmZuHChX/+85+NP5XL5XCPN5SLMQf6Z9PmZT777LOdO3cuWbIkLCxszZo1hIlHFu5ijyyqi6eeespOE+AqnYO7hrIWTIYYbHB9fb25bzXTsYyjYdZMNdXSMTMKhEDwcxFiY2Nt3z0EWRA5j7yNkZGR5ubmgwcPxsbGLl++/NtvvzX+FOVibGNPXqarq6uxsRHWtL777ruEyUYu1LdH5pYF1n/YYwVcqHNw11C2w01QeoNZNYnzODCcSCSCRWTWTDXV0jElNoEBTy6Xa3IcD0ngNhlRUVHonY+CEDyPvA2dTnfmzJk5c+b827/9W2dnp+E4ysVMi515GZ1Ol5qaCgAwcfI8G4rbIxP/w3DcRJ9YxIU6B3cNZSOYbM3nMlyPYyPaduUolY6ZFtg0ms1mEzAWm80G3t2VmcoQP4+8CgzDfv/734eEhBQVFSmVSngQ5WLsxJ68TG9vb1BQUFhY2NDQEJGykQ6V7ZG5/wGZNhziWp1DhIayFky27XA5kxSwdmaqpWOmxf76LyeBO3Whdz4qQ/w88h7u3bvH5XJjYmJKS0sNB+E7AMrF2APMy9h4hzl79iwAYOXKlQQKRRUoa49sKAfbWsW1OocIL8Ri0MnO5JNjWDs51dIx9gD9A1zX5Rve+Tx+Rwy3hvh55D0IhcKsrKxly5ZduHDBcBC2LUd+uT1Me6+KiooAAO+//z6RUlEEd7RHNhSLy3UOEV6IxWCyPZknZ7B4fvdKxxiAG1ikp6fjdH6Yi2GxWDidH+ESSJlH3oBWqz19+vSsWbM2bNjQ0dFBtjgeiFarXbRoEQDg8uXLZMtCDu5oj6zpFpfrHIJyxibBZAJe4MyHID385TCGvExBQYHLT15QUIByMe4C8fPIG3j8+PFvf/vboKCgN954Y3JyEh4cHx+/cePG3/72t7/+9a+XL1/GMIxcId0aiUQSEBAQERExPDxMtizk4I72yKJ6wUPn4LiPjDEme2HweDyA8zYlhr1R4FjAHXr1W4PBYAiFQjqdzufzCwsLXXjmwsJCPp9Pp9OFQiFMyiCoDPHzyBsYHBxsa2ubNWvWggULgoKC4JErV640NTXJ5fKGhobjx4/X19eTLaYbU19fr1KpUlNTZ82aRbYs5OCO9shcZoCPzvHRz2RjPYcRi8UZGRnx8fESiUQqlSYkJAAAJBKJa7Vnb29vY2MjhmEKhcLHx2fu3Llbt241DJSQkCCVSkUiUXp6ugsHJYDm5uaWlpa2trY//vGPSqUyJSWlvr7eSacBwzAOhyMWi6ELYrgntbW1fX19CoVCoVAEBgbC3SIQFIGYeeRtXL16de/evQAAHo+3adOmgYEBgUAgl8tXr149Pj5+4MCBn376afv27b/+9a/JltRdgW87v/71r/ft20e2LKRhMmHdwh6ZyIyTziEoFpKenh4XFyeVSsViMX4vcKOjo83Nzd98882BAwf+8pe/DA0NGVw5sVgslUrj4uKo/JNbY2hoqKmp6YcffvD39wcAtLS0JCQkOLObZXV1dUJCgrkLAgCA/YU++uijffv2wbJ2BHUgZh55FVqttq+vr6ura+7cucnJydAFGR8fX79+fUZGxsjISFdX15w5c5KSksiW1F3RaDQwksThcMiWhUyMQwvuYo9MwiF46RxXpXamBdYDGxIKeGSyzXsgGpJYcFxqViNPi0wma2pqeu+99wAASUlJsFgVAMBmswUCwYxOJRAIYC0qAIDFYpnXgnhnl0M3goB55FU8evSIx+MFBga+9tpr7e3tp0+fLi8vNzQuk0gkfD6/qqpKJpORK6f7cu/ePT8/P7T7rt6oqMKN7JFxj1ScdA5xXggsxgkLCwN4lvSb90CErhwcl7LVyPbwX//1XwCAN998U6/Xl5eXw3pV6K6WlZXZvjSRSFRWVmZwYOl0uo1Fud7Z5dBdIGYeeQ8tLS1bt25lMBhbtmw5duzY2bNnkWPnWo4ePQoA4HA4ZAtCCdzRHkGZ7d9fZqbQXBJQMYBhWEVFBYZhFj8NDw8fGxsDAERGRlpLEO7Zs8eBigfDuEql8ubNmyMjIzKZjM/n02i0yMhIAMD4+Hh4ePj58+fPnz8/05NThFOnTgEAhoeH4a178803r1+/DiN7xcXFAICgoCAmk8lkMmGF3cqVK5VKpVgsFovFhl8kLi6uoKCguLjYxk3u7+9vb28PCwszbG6HIBiy5pEXMjAw0Nra6uvr29nZqdFoXnrppcnJSZVKFRAQQLZoHsLVq1cBAGvXriVbEErA4/EqKircyx5BG9rV1QX+tVLVZbjWqYHdBp3BscZZzo/r2cTFxXG5XDsbsHpzl0OKQNY88jbUanV5eXl4eHhWVtahQ4f+8Ic/7Nq1i8vllpeXoxSMS1AqlU8++SQAoKGhgWxZqMLcuXNdoNPJ4Mknn8Tjhrg4FgJfsq29w42MjFRVVeXn5xuyCeY4tnLJMG53d3dNTY1Op+NwOAsWLLB/XIrT2dn5t7/9be7cubAFoUUwDMMwbHBwUKlUAgBWrlzJZDLT09Pj4+NnVEwE3128vJSMXMiaR97G48ePOzs7dTrdihUrdu7cOTExUVtb+9FHH5WWlvr5+W3fvp1sAd2e9vb2vr6+2bNnwyQvtDq+vgStiqAmNTU1+fn5mzZtciN7hGFYdXX1N998g8vZ8XBtyMKDeyDClYQEVDOhLocI7+H27dubN29OSEj4+OOP4RGY8QwICHjjjTfUarVer5fJZCKR6NGjR6RK6q4cOXIEAPCzn/0M/llfX9/W1kauSAiq4eJYiMMMDAw0NTUNDg4GBgZqtVoGg8FisWaa2B4ZGbl///7ExERsbGxsbCw8qFAo2tra2tvbtVotk8nMysqiuAeqVqtv3bp19+7dgICAqampzMzMtLQ0gUAACIlPPHjwoKurKyIiYtmyZXiPhUCQy8DAQFtb27x585YsWQKP+Pv7BwcHa7VajUYDj9y7d+/HH39EcRHHaGhoAAA8//zz8M+TJ0/CIjYEwgD5XohKpbp06VJNTU1kZKTBdZDJZCdOnNi1axcstLQTiz0QGxsbZTKZWq2+c+cOhmFTU1MbN27E5UpcQX9//xdffHHv3r3k5OSoqCidTvf111+Pjo62traGhISsWLECbwFgl8OsrCyv7XKI8BJUKlVvb29PT09KSkpycjI8qNVqVSpVaGhoVFQUjUYbGxvr6+uj0WizZ88mV1o3paenBwAA0zHDw8Pd3d0LFy4kWygEtSDZC1EoFCdPnvz888/T0tI2bty4fPlyX19fhUJx8ODBY8eOcTicZ555xv6zwTcbJpMJWwyZ9EC8dOnSTz/9tGTJEsp6IT09PQcOHKitrX377be3bdtGp9P1en1lZeWHH344MTGxbNkyJpOJtwyooB3hJcCiED8/v8TExDlz5sCDwcHBTCYzMjLS399fp9N1dHQMDQ2tWrXKz8+PXGndlKSkpB9++CEkJAQA8Pe//z07O3tGL5YIb4DMKiGtVnv8+PH9+/dHRUV98MEHWVlZsGqprq7uk08+6e3tHRoamtHZ3LoH4vj4eGlp6bFjx7Zs2bJjxw6YNvLx8cnJyeno6ACEpGNQl0OE96BUKicmJhYsWGDQPACAwMDAzMzMl156qbu7+/PPPxeJRAkJCUuXLiVXVPdlx44dzz333D/+8Y8zZ8709PRs27aNbIkQlIPMWEhNTU1paeno6Oj7778PNwuFKBSK4OBgNpsNyyTtBMOw+/fvK5XKmJgYAIBQKFSpVOvWrYO9VlJSUv7zP/+TTqevXr3a5RfiEr766qsTJ07AVTDGvQr8/f1pNBogJD5x//59qVTKYDAo3lcYgXCeWbNm5eTkrFq1atWqVcbHk5OTd+3aJRKJfHx8FixYkJaWFhwcTJaQ7s6aNWt4PB58j9q8ebOxnkcgIKR5ISMjI/v37+/t7c3OzjbRAiwWi8fjzZ8/f0aPLCwKCQ4OHhkZqauro9Ppq1atMqxQnelqVYKRyWR/+tOfFArF9u3b582bZ/xRf3//gwcPiOkhVldXp9VqMzIyUMMrhMcTERGxbt068+MBAQEpKSkpKSnEi+R5+Pj4rF27FmV4ETYgzQupq6u7du0aAKCwsNBk+Xh0dLQDFelu3QOxpqYGCg83ATamoaFBqVSuXLnSkLrGD1QUgkAgEAgiIc0Lqays1Gq1UVFR2dnZzp9No9H09vZKpdJFixZt27ZNpVLdvn372rVrbDZ7w4YN0dHRzg+BK9XV1Xq9ft68eeYBj9raWkCIZzA1NQX9QlQUgkAgEAhiIK069datWwCAxYsXu+QV36QH4htvvMHhcB48eFBaWvrdd985f368aWpqAgCkpqaGhoYaH9doNHV1dcDIM9Dr9TjJYN7lUKfT4TQWAoFAIBCARC9kamoKAGBoFuQksCgkOjp60aJFAQEBDAaDw+Gw2eyOjo6GhgbYgGhoaEgsFg8PD7tkRNcCNyczL8WXSCT379+n0+mwh9jw8PCFCxdwkkEoFOp0uuXLl4eHhwMArl271t7ejtNYCAQCgUAAEr0QWHlqowGGUCiEldX2YGcPxNraWq1W65zguBAVFQUAMF9FXFlZqdFoUlJS4K6GdXV1ra2tOMlg3uVQpVLhNBYCgUAgEIBELyQ/P9/X17e/v9/8I61WW1lZaX8mxdADMSYmxk17ILLZbPODN2/ePHfuHADAsG723LlzL7zwAk4yoC6HCAQCgSAY0ryQzZs3Z2dnC4XClpYWw0GVSnXjxo1Tp061tLSw2WzDpri28YAeiFwuNzY2tra2Fiaq1Gp1bW3t5cuXV69e7ePjA4tFWlpa1Go1fgsIYSQGdTlEIBAIBGH48Xg8UgYODw9PTEx8/PjxgwcP4CLbO3fuNDc39/T00Gi0devW2d9e7NGjR/X19RMTE7/4xS8WL14MD9JoNBqNhmHYw4cPx8fH+/r6YmNjV61a5e/vj9s1Oc4TTzwRGhp69+5dhULR0dEhEolkMllKSkpeXh7sIatWqxsbGzdt2oRffGL27NmdnZ2Tk5Nyubyzs/PVV19FXUMQCAQCgSs++K25sIeenp7r16+r1Wo/Pz+tVuvn55eUlJSammrSQcQ2o6OjN27cePjwIYvFMm75pVKp2tvbYQ/E+fPnp6WlUXk3XY1GIxAIent7g4KCdDpdZmYmdDhaW1vr6+tDQkLCw8NzcnJmdGdmhF6vFwgEHR0dDAYjKSkJtU9FIBAIBN6Q7IUgEAgEAoHwWsjczQ6BQCAQCIQ3g7wQBAKBQCAQ5IC8EAQCgUAgEOTw/wDc12Zc1JdvUQAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "48155e24", + "metadata": {}, + "source": [ + "![fyn2.png](attachment:fyn2.png)\n", + "The first sub-diagram is a single amplitude operator $t^c_i$ and the second sub-diagram is a 2-particle operator which we label $\\langle$ left out, right out || left in , right in $\\rangle = \\langle kl||cd \\rangle$. The third sub-diagram is again a doubles amplitude operator $t^{ad}_{kl}$. There are 3 holes and 2 loop, so $(-1)^{3+2}=-1$. The lines __l__ and __k__ are in the same direction and connect the same nodes and so are equivalent giving a factor of $\\frac{1}{2}$. There are no external lines to swap so there are no possible permutations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b8f22a1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/document/adc.md b/document/adc.md new file mode 100644 index 0000000..9dc775b --- /dev/null +++ b/document/adc.md @@ -0,0 +1,269 @@ +### Algebraic Diagrammatic construction (2) + +This is a class illustrating ADC at the second-order level. Included is a Davidson solver which is essentially the one written by Ollie Backhouse used in the ADC folder of psi4Numpy. The EE equations are taken from ['Development and Implementation of Theoretical Methods for the Description of Electronically Core-Excited States' by Jan Wenzel](https://archiv.ub.uni-heidelberg.de/volltextserver/20514/1/Jan_Wenzel_Thesis.pdf) and [Development and Application of Hermitian Methods for Molecular Properties and Excited Electronic States by Manuel Hodecker](https://core.ac.uk/download/pdf/322693292.pdf). The IP and EA are discussed in [Reduced-cost second-order algebraic-diagrammatic construction method for excitation energies and transition moments, D Mester,P R. Nagy and M Kállay](https://core.ac.uk/download/pdf/154885128.pdf). + +This is an example of the code to run an ADC computation for electron excitation and the associated output for water in sto-3g. The solve parameter is [multiply roots by this factor for number of guess vectors, number of sub-space vectors per root]. + + import rhf + molAtom, molBasis, molData = rhf.mol([]) + e_scf = rhf.scf(molAtom, molBasis, molData, []) + + from basis import electronCount + + charge, electrons = [molData['charge'], electronCount(molAtom, molData['charge'])] + + adc = ADC('ee', rhf, electrons, roots=6, solve=[2, 10]) + + adc_a = adc_analyse(adc) + adc_a.summary() + adc_a.detail(0) + adc_a.detail(3) + adc_a.detail(4) + +and the output with the print threshold set at >0.1. This is a spin-treatment and we print, for the summary, only the first of a multiplicity of roots. However the details can ask for all roots so as we have a multiplicity of 3,1,2(of 3) to get the unique details we must ask for roots 0,3,4. + +``` +moller-plesset(2) energy summary +rhf total energy -74.9420799540 +mp2 correlation energy -0.0491496367 +mp2 corrected energy -74.9912295907 + + n m energy 1h-1p:-----------------------> 2h-2p:----> + Hr eV norm i a norm +-------------------------------------------------------------------------- + 1 3 0.285509 7.769103 0.9847 [ 5, 6 ] 0.7017 0.0153 + 2 1 0.343916 9.358436 0.9784 [ 5, 6 ] 0.6994 0.0216 + 3 3 0.363627 9.894796 0.9949 [ 4, 6 ] 0.6683 0.0051 + +-->state (root) 0 + polarization type = EE energy = 0.285509 eV + multiplicity = 3 +block type excitation +-------------------------------------- +1h-1p α->α [ 5, 6 ] 0.7017 + +-->state (root) 3 + polarization type = EE energy = 0.343916 eV + multiplicity = 1 +block type excitation +-------------------------------------- +1h-1p α->α [ 5, 6 ] 0.6994 + +-->state (root) 4 + polarization type = EE energy = 0.363627 eV + multiplicity = 3 +block type excitation +-------------------------------------- +1h-1p α->α [ 4, 6 ] 0.6683 +1h-1p α->α [ 3, 7 ] 0.2170 +``` + +We can compare with [ADCC](https://adc-connect.org/v0.15.13/index.html) output +``` ++--------------------------------------------------------------+ +| adc2 any , converged | ++--------------------------------------------------------------+ +| # excitation energy osc str |v1|^2 |v2|^2 | +| (au) (eV) | +| 0 0.2855092 7.769102 0.0000 0.9847 0.01528 | +| 1 0.3439185 9.3585 0.0021 0.9784 0.02158 | +| 2 0.3636277 9.894815 0.0000 0.9948 0.005164 | ++--------------------------------------------------------------+ ++---------------------------------------------------+ +| State 0 , 0.2855092 au, 7.769102 eV | ++---------------------------------------------------+ +| HOMO -> LUMO b ->b +0.702 | +| HOMO -> LUMO a ->a -0.702 | + ++---------------------------------------------------+ +| State 1 , 0.3439185 au, 9.3585 eV | ++---------------------------------------------------+ +| HOMO -> LUMO a ->a -0.699 | +| HOMO -> LUMO b ->b -0.699 | + ++---------------------------------------------------+ +| State 2 , 0.3636277 au, 9.894815 eV | ++---------------------------------------------------+ +| HOMO-1 -> LUMO a ->a -0.668 | +| HOMO-1 -> LUMO b ->b +0.668 | +| HOMO-2 -> LUMO+1 b ->b -0.217 | +| HOMO-2 -> LUMO+1 a ->a +0.217 | + +``` + +We can compare the IP and EA results with pySCF, for water sto-3g IP we get + +``` +moller-plesset(2) energy summary +rhf total energy -74.9420799540 +mp2 correlation energy -0.0491496367 +mp2 corrected energy -74.9912295907 + + n m energy 1h:-----------------------> 2h-1p:------------------------> + Hr eV norm i norm i j a +------------------------------------------------------------------------------------------- + 1 2 0.272050 7.402858 0.9125 [ 5 ] 0.9552 0.0875 [ 3, 5, 7 ] 0.1541 + 2 2 0.377743 10.278914 0.9415 [ 4 ] 0.9691 0.0585 [ 4, 4, 6 ] 0.1338 + 3 2 0.536346 14.594707 0.9719 [ 3 ] 0.9858 0.0281 + +-->state (root) 0 + polarization type = IP energy = 0.272050 eV + multiplicity = 2 +block type excitation +-------------------------------------- +1h α->α [ 5 ] 0.9552 +2h-1p αα->ββ [ 3, 5, 7 ] 0.1359 +2h-1p αα->ββ [ 4, 5, 6 ] 0.1322 +2h-1p αβ->αβ [ 3, 5, 7 ] 0.1541 +2h-1p αβ->αβ [ 4, 5, 6 ] 0.1369 + +``` +from pySCF +``` +adc(2) root 0 | Energy (Eh) = 0.2720500188 | Energy (eV) = 7.40286188 | Spec factors = 1.82390838 | conv = True +adc(2) root 1 | Energy (Eh) = 0.3777431275 | Energy (eV) = 10.27891934 | Spec factors = 1.86951116 | conv = True +adc(2) root 2 | Energy (Eh) = 0.5363456124 | Energy (eV) = 14.59471500 | Spec factors = 1.92335906 | conv = True + +adc(2) | root 0 | norm(1h) = 0.9125 | norm(2h1p) = 0.0875 + +1h block: + i U(i) +------------------ + 5 0.9552 + +2h1p(alpha|beta|alpha) block: + i j a U(i,j,a) +------------------------------- + 3 5 7 0.1541 + 4 5 6 0.1369 + +2h1p(beta|beta|beta) block: + i j a U(i,j,a) +------------------------------- + 3 5 7 0.1359 + 5 3 7 -0.1359 + 5 4 6 -0.1322 + 4 5 6 0.1322 +``` + +There is a hf_reference class which is just a holder for rhf, molAtom and molBasis objects to have the ground state quantities all in one place. The mp2_property class has functions to calculate the mp2 level density correction, both relaxed and unrelaxed and to calculate the dipole moment in ground state, unrelaxed and relaxed levels. +``` +mp_prop = mp2_properties(hf_reference(rhf, molAtom, molBasis), adc) +dipoles = mp_prop.dipoles() + +print() +caption = ['hf reference dipole', 'mp2 unrelaxed dipole', 'mp2 relaxed dipole'] +for i, mu in enumerate(['hf', 'mpu', 'mpr']): + x , y, z = dipoles[mu] * getConstant('au->debye') + print('{:<20s} x= {:<8.4f} y= {:<8.4f} z= {:<8.4f} D'.format(caption[i], x, y, z)) +``` +will return for H2O in 3-21g basis +``` +hf reference dipole x= 0.0000 y= 2.4137 z= -0.0000 D +mp2 unrelaxed dipole x= 0.0000 y= 2.3782 z= -0.0000 D +mp2 relaxed dipole x= 0.0000 y= 2.2881 z= -0.0000 D +``` +The adc_analyse class has a method transition_density which can be used to compute transition properties (for electron excitation). This is an example of it's use to get oscillator strengths, further examples of calculating transition properties are to be found in the adc(1) code +``` + adc = ADC('ee', rhf, electrons, roots=20, solve=[2, 10]) + adc_a = adc_analyse(adc) + + root = 14 + dm = adc_a.transition_density(root, mp_prop.mp2_density(type='relaxed')) + + from post import dipoleComponent + mu_component = [dipoleComponent(mp_prop.hf.atoms, mp_prop.hf.basis, x, 'origin') for x in ['x','y','z']] + charges = [a.number for a in mp_prop.hf.atoms] + centers = [a.center for a in mp_prop.hf.atoms] + + #ao->mo + mu_mo = np.kron(np.einsum('rp,xrs,sq->xpq', mp_prop.hf.rhf.C, mu_component, mp_prop.hf.rhf.C, optimize=True), np.eye(2)) + + #get transition dipole moment + tdm = np.einsum('ia,xia->x', dm, mu_mo, optimize=True) + + #oscillator strength + os = (2/3) * adc.eig_energy[root] * np.einsum('x,x->', tdm, tdm, optimize=True) + print('electric length gauge oscillator strength = {:<8.6f} for excitation {:<8.6f} eV'. + format(os , adc.eig_energy[root]*getConstant('hartree->eV'))) + +``` +which returns +``` +electric length gauge oscillator strength = 0.062968 for excitation 13.719527 eV + +``` +The ADC code is in a sepaerate directory 'adc', to run use 'python adc/adc.py' from 'harpy/source/' directory. + +### Algebraic Diagrammatic Construction (1) + +The module adc(1) contains the class first_order_adc. This is an implementation of ADC at the first order level which is formally equivalent to CIS. The code includes examples of calculating transition properties in both CIS and ADC formalisms. Transition dipoles are computed for electric in length and velcity gauges and for magnetic in length gauge. Oscillator strengths and cross-sections are also computed. Typical usage would be + ++ do general ADC calculation with 0 roots to initialise the class ie +``` +adc = ADC('ee', rhf, electrons, roots=0, solve=[2, 10]) +adc.roots = 20 +``` ++ create a ground state reference class instance +``` +hf = hf_reference(rhf, molAtom, molBasis) +``` ++ run the ADC(1) class. Note you use either the ADC moludes Davidson solver or a Python direct solver (solver='eigh') +``` +adc_1 = first_order_adc(adc, hf, solver='davidson') +``` +The results are written to a cache property which can either be accessed as \'adc_1.cache[\'kw\']\' or by \'energy, v, converged = adc_1.get()\'. The cache has keywords\ ++ 'e' for energies (au). ++ 'u' for eigenvectors returned as an [nocc\*nvir, roots] array. ++ 'c' is a boolean flag indicating the converged status of the diagonalisation (True = converged OK) + +You can further use +``` +adc_1.get_transition_properties() +``` +This will give the follow cache options ++ 'dipole:electric:length:CIS' ++ 'oscillator:electric:length:CIS' ++ 'dipole:electric:length:ADC' ++ 'oscillator:electric:length:ADC' ++ 'dipole:electric:velocity:CIS' ++ 'oscillator:electric:velocity:CIS' ++ 'dipole:electric:velocity:ADC' ++ 'oscillator:electric:velocity:ADC' ++ 'dipole:magnetic:length:CIS' ++ 'dipole:magnetic:length:ADC' ++ 'cross-section:CIS' ++ 'cross-section:ADC' + +where appropriate all units are atomic. Examples of obtaining output are given in the main section of the module, as an example for water in STO-3G using the above code we get +``` +ADC(1) Excited States +----------------------------------------------------------------------------------------------- +root energy excitation osc. (CIS) (ADC) +----------------------------------------------------------------------------------------------- + 1 [3] 0.287256 7.816620 0.7071 HOMO -> LUMO + 2 [3] 0.344425 9.372282 0.6283 HOMO-1 -> LUMO + 3 [1] 0.356462 9.699819 0.7071 HOMO -> LUMO 0.0023 0.0022 + 4 [3] 0.365989 9.959068 0.7071 HOMO -> LUMO+1 + 5 [3] 0.394514 10.735267 0.4179 HOMO-1 -> LUMO+1 + 6 [1] 0.416072 11.321889 0.7071 HOMO -> LUMO+1 + 7 [1] 0.505628 13.758846 0.6202 HOMO-1 -> LUMO 0.0649 0.0485 + 8 [3] 0.514290 13.994543 0.4093 HOMO-2 -> LUMO + 9 [1] 0.555192 15.107540 0.4911 HOMO-1 -> LUMO+1 0.0155 0.0144 +``` +and for a designated state +``` +Excited state 7 root number 14 energy 0.505628 +------------------------------------ ------------------------------------------------------------------ + type gauge CIS ADC + dipole oscillator dipole oscillator +------------------------------------------------------------------------------------------------------ + electric length [ 0.0000 0.4389 0.0000] 0.0649 [ 0.0000 0.3795 0.0000] 0.0485 + electric velocity [ 0.0000 0.2735 -0.0000] 0.0252 [-0.0000 -0.3015 0.0000] 0.0306 + magnetic length [ 0.0000 0.0000 -0.0000] [-0.0000 -0.0000 0.0000] + +Cross-sections CIS 0.009352 ADC 0.006991 +``` +We can plot the oscillator strengths (or cross-sections or dipole norms) either as bars or with a broadening, an example is given in the module which will produce eg + +![image](https://user-images.githubusercontent.com/73105740/164206868-c4e9af64-6dd5-46a8-b626-3f90490c71c3.png) diff --git a/document/aello.html b/document/aello.html new file mode 100644 index 0000000..6f780e7 --- /dev/null +++ b/document/aello.html @@ -0,0 +1,4209 @@ + + + + + + Cython: aello.pyx + + + +

Generated by Cython 0.29.21

+

+ Yellow lines hint at Python interaction.
+ Click on a line that starts with a "+" to see the C code that Cython generated for it. +

+

Raw output: aello.c

+
+001: #cython: boundscheck=False, wraparound=False, nonecheck=False, initializedcheck=False, cdivision=True
+
  __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
 002: from libc.math cimport exp, pow, tgamma, sqrt, abs
+
 003: from scipy.special.cython_special cimport hyp1f1
+
+004: from atom import gaugeCenter
+
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(__pyx_n_s_gaugeCenter);
+  __Pyx_GIVEREF(__pyx_n_s_gaugeCenter);
+  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_gaugeCenter);
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_atom, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_gaugeCenter); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gaugeCenter, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
 005: 
+
+006: import numpy as np
+
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_2) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
 007: cimport numpy as np
+
 008: 
+
+009: cdef double pi = 3.141592653589793238462643383279
+
  __pyx_v_5aello_pi = 3.141592653589793238462643383279;
+
 010: 
+
 011: #from integral - e
+
+012: cdef double cye(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0):
+
static double __pyx_f_5aello_cye(int __pyx_v_ia, int __pyx_v_ja, int __pyx_v_type, double __pyx_v_r, double __pyx_v_ie, double __pyx_v_je, struct __pyx_opt_args_5aello_cye *__pyx_optional_args) {
+  int __pyx_v_n = ((int)0);
+  double __pyx_v_x = ((double)0.0);
+  double __pyx_v_p;
+  double __pyx_v_q;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cye", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_n = __pyx_optional_args->n;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_x = __pyx_optional_args->x;
+      }
+    }
+  }
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+/* … */
+struct __pyx_opt_args_5aello_cye {
+  int __pyx_n;
+  int n;
+  double x;
+};
+
 013: 
+
 014: 	cdef:
+
+015: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
+016: 		double q = ie*je / p
+
  __pyx_v_q = ((__pyx_v_ie * __pyx_v_je) / __pyx_v_p);
+
 017: 
+
+018: 	if n == 0:
+
  __pyx_t_1 = ((__pyx_v_n == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+019: 		if (type < 0) or (type > (ia + ja)):
+
    __pyx_t_2 = ((__pyx_v_type < 0) != 0);
+    if (!__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L5_bool_binop_done;
+    }
+    __pyx_t_2 = ((__pyx_v_type > (__pyx_v_ia + __pyx_v_ja)) != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L5_bool_binop_done:;
+    if (__pyx_t_1) {
+/* … */
+    }
+
+020: 			return 0.0
+
      __pyx_r = 0.0;
+      goto __pyx_L0;
+
+021: 		elif (ia + ja + type) == 0:
+
    __pyx_t_1 = ((((__pyx_v_ia + __pyx_v_ja) + __pyx_v_type) == 0) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+022: 			return exp(-q*r*r)
+
      __pyx_r = exp((((-__pyx_v_q) * __pyx_v_r) * __pyx_v_r));
+      goto __pyx_L0;
+
+023: 		elif ja == 0:
+
    __pyx_t_1 = ((__pyx_v_ja == 0) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+024: 			return (1/(2 * p)) * cye(ia-1,ja,type-1,r,ie,je) - (q*r/ie) * cye(ia-1,ja,type,r,ie,je) + \
+
      __pyx_r = ((((1.0 / (2.0 * __pyx_v_p)) * __pyx_f_5aello_cye((__pyx_v_ia - 1), __pyx_v_ja, (__pyx_v_type - 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)) - (((__pyx_v_q * __pyx_v_r) / __pyx_v_ie) * __pyx_f_5aello_cye((__pyx_v_ia - 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL))) + ((__pyx_v_type + 1) * __pyx_f_5aello_cye((__pyx_v_ia - 1), __pyx_v_ja, (__pyx_v_type + 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)));
+      goto __pyx_L0;
+
 025:                          (type+1) * cye(ia-1,ja,type+1,r,ie,je)
+
 026: 		else:
+
+027: 			return (1/(2 * p)) * cye(ia,ja-1,type-1,r,ie,je) + (q*r/je) * cye(ia,ja-1,type,r,ie,je) + \
+
    /*else*/ {
+/* … */
+      __pyx_r = ((((1.0 / (2.0 * __pyx_v_p)) * __pyx_f_5aello_cye(__pyx_v_ia, (__pyx_v_ja - 1), (__pyx_v_type - 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)) + (((__pyx_v_q * __pyx_v_r) / __pyx_v_je) * __pyx_f_5aello_cye(__pyx_v_ia, (__pyx_v_ja - 1), __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL))) + ((__pyx_v_type + 1) * __pyx_f_5aello_cye(__pyx_v_ia, (__pyx_v_ja - 1), (__pyx_v_type + 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)));
+      goto __pyx_L0;
+    }
+
 028:                          (type+1) * cye(ia,ja-1,type+1,r,ie,je)
+
 029: 	else:
+
+030: 		return cye(ia+1,ja,type,r,ie,je,n-1,x) + x * cye(ia,ja,type,r,ie,je,n-1,x)
+
  /*else*/ {
+    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n - 1);
+    __pyx_t_4.x = __pyx_v_x;
+    __pyx_t_3 = __pyx_f_5aello_cye((__pyx_v_ia + 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n - 1);
+    __pyx_t_4.x = __pyx_v_x;
+    __pyx_t_5 = __pyx_f_5aello_cye(__pyx_v_ia, __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_r = (__pyx_t_3 + (__pyx_v_x * __pyx_t_5));
+    goto __pyx_L0;
+  }
+
 031: 
+
+032: cdef double ovlp(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, int type, \
+
static double __pyx_f_5aello_ovlp(int __pyx_v_ia0, int __pyx_v_ia1, int __pyx_v_ia2, int __pyx_v_ja0, int __pyx_v_ja1, int __pyx_v_ja2, int __pyx_v_type, double __pyx_v_r0, double __pyx_v_r1, double __pyx_v_r2, double __pyx_v_ie, double __pyx_v_je) {
+  double __pyx_v_s;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ovlp", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 033:                            double r0, double r1, double r2, double ie, double je):
+
 034: 	cdef double s
+
+035: 	s =  cye(ia0, ja0, type, r0, ie, je)
+
  __pyx_v_s = __pyx_f_5aello_cye(__pyx_v_ia0, __pyx_v_ja0, __pyx_v_type, __pyx_v_r0, __pyx_v_ie, __pyx_v_je, NULL);
+
+036: 	s *= cye(ia1, ja1, type, r1, ie, je)
+
  __pyx_v_s = (__pyx_v_s * __pyx_f_5aello_cye(__pyx_v_ia1, __pyx_v_ja1, __pyx_v_type, __pyx_v_r1, __pyx_v_ie, __pyx_v_je, NULL));
+
+037: 	s *= cye(ia2, ja2, type, r2, ie, je)
+
  __pyx_v_s = (__pyx_v_s * __pyx_f_5aello_cye(__pyx_v_ia2, __pyx_v_ja2, __pyx_v_type, __pyx_v_r2, __pyx_v_ie, __pyx_v_je, NULL));
+
 038: 
+
+039: 	return s * pow(pi/(ie+je),1.5)
+
  __pyx_r = (__pyx_v_s * pow((__pyx_v_5aello_pi / (__pyx_v_ie + __pyx_v_je)), 1.5));
+  goto __pyx_L0;
+
 040: 
+
+041: cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2):
+
static double __pyx_f_5aello_clmb(int __pyx_v_l, int __pyx_v_m, int __pyx_v_n, int __pyx_v_bf, double __pyx_v_p, double __pyx_v_r0, double __pyx_v_r1, double __pyx_v_r2) {
+  double __pyx_v_t;
+  double __pyx_v_s;
+  double __pyx_v_nm;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clmb", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 042: 
+
 043: 	cdef double t, s, nm
+
+044: 	nm = sqrt(r0*r0 + r1*r1 + r2*r2)
+
  __pyx_v_nm = sqrt((((__pyx_v_r0 * __pyx_v_r0) + (__pyx_v_r1 * __pyx_v_r1)) + (__pyx_v_r2 * __pyx_v_r2)));
+
+045: 	t = p * nm * nm
+
  __pyx_v_t = ((__pyx_v_p * __pyx_v_nm) * __pyx_v_nm);
+
 046: 
+
+047: 	s = 0.0
+
  __pyx_v_s = 0.0;
+
+048: 	if (l+m+n)  == 0:
+
  __pyx_t_1 = ((((__pyx_v_l + __pyx_v_m) + __pyx_v_n) == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+049: 		s += pow(-2*p, bf) * boys(bf, t)
+
    __pyx_v_s = (__pyx_v_s + (pow((-2.0 * __pyx_v_p), __pyx_v_bf) * __pyx_f_5aello_boys(__pyx_v_bf, __pyx_v_t)));
+
+050: 	elif (l+m) == 0:
+
  __pyx_t_1 = (((__pyx_v_l + __pyx_v_m) == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+051: 		if n > 1:
+
    __pyx_t_1 = ((__pyx_v_n > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+052: 			s +=(n-1) * clmb(l,m,n-2,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_n - 1) * __pyx_f_5aello_clmb(__pyx_v_l, __pyx_v_m, (__pyx_v_n - 2), (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+053: 		s += r2 * clmb(l,m,n-1,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r2 * __pyx_f_5aello_clmb(__pyx_v_l, __pyx_v_m, (__pyx_v_n - 1), (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+054: 	elif l == 0:
+
  __pyx_t_1 = ((__pyx_v_l == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+055: 		if m > 1:
+
    __pyx_t_1 = ((__pyx_v_m > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+056: 			s +=(m-1) * clmb(l,m-2,n,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_m - 1) * __pyx_f_5aello_clmb(__pyx_v_l, (__pyx_v_m - 2), __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+057: 		s += r1 * clmb(l,m-1,n,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r1 * __pyx_f_5aello_clmb(__pyx_v_l, (__pyx_v_m - 1), __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
 058: 	else:
+
+059: 		if l > 1:
+
  /*else*/ {
+    __pyx_t_1 = ((__pyx_v_l > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+060: 			s +=(l-1) * clmb(l-2,m,n,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_l - 1) * __pyx_f_5aello_clmb((__pyx_v_l - 2), __pyx_v_m, __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+061: 		s += r0 * clmb(l-1,m,n,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r0 * __pyx_f_5aello_clmb((__pyx_v_l - 1), __pyx_v_m, __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+  }
+  __pyx_L3:;
+
 062: 
+
+063: 	return s
+
  __pyx_r = __pyx_v_s;
+  goto __pyx_L0;
+
 064: 
+
 065: 
+
 066: #boys function
+
+067: cdef double boys(double m,double T):
+
static double __pyx_f_5aello_boys(double __pyx_v_m, double __pyx_v_T) {
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("boys", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+068: 	return hyp1f1(m+0.5,m+1.5,-T)/(2.0*m+1.0)
+
  __pyx_r = (__pyx_fuse_1__pyx_f_5scipy_7special_14cython_special_hyp1f1((__pyx_v_m + 0.5), (__pyx_v_m + 1.5), (-__pyx_v_T), 0) / ((2.0 * __pyx_v_m) + 1.0));
+  goto __pyx_L0;
+
 069: 
+
+070: cdef double tei(int al0, int al1, int al2, int al3, short[:,:] aa, double[:,:] an, double[:,:] ac, \
+
static double __pyx_f_5aello_tei(int __pyx_v_al0, int __pyx_v_al1, int __pyx_v_al2, int __pyx_v_al3, __Pyx_memviewslice __pyx_v_aa, __Pyx_memviewslice __pyx_v_an, __Pyx_memviewslice __pyx_v_ac, __Pyx_memviewslice __pyx_v_ae, __Pyx_memviewslice __pyx_v_ao, int __pyx_v_i, int __pyx_v_j, int __pyx_v_k, int __pyx_v_l) {
+  double __pyx_v_s;
+  int __pyx_v_mu;
+  int __pyx_v_nu;
+  int __pyx_v_vu;
+  int __pyx_v_su;
+  int __pyx_v_tu;
+  int __pyx_v_psi;
+  int __pyx_v_phi;
+  int __pyx_v_chi;
+  int __pyx_v_alpha;
+  int __pyx_v_beta;
+  int __pyx_v_gamma;
+  double __pyx_v_f;
+  double __pyx_v_p;
+  double __pyx_v_q;
+  double __pyx_v_t1;
+  double __pyx_v_s1;
+  double __pyx_v_s2;
+  double __pyx_v_t2[3];
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("tei", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 071:                 double[:,:] ae, double[:,:] ao, int i, int j, int k, int l):
+
 072: 
+
 073: 	cdef:
+
+074: 		double s = 0.0
+
  __pyx_v_s = 0.0;
+
 075: 		int mu, nu, vu, su, tu, psi, phi, chi, alpha, beta, gamma
+
 076: 		double f, p, q, t1, s1, s2
+
 077: 		double t2[3]
+
 078: 
+
+079: 	for mu in range(0, al0):
+
  __pyx_t_1 = __pyx_v_al0;
+  __pyx_t_2 = __pyx_t_1;
+  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
+    __pyx_v_mu = __pyx_t_3;
+
+080: 		for nu in range(0, al1):
+
    __pyx_t_4 = __pyx_v_al1;
+    __pyx_t_5 = __pyx_t_4;
+    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+      __pyx_v_nu = __pyx_t_6;
+
+081: 			for vu in range(0, al2):
+
      __pyx_t_7 = __pyx_v_al2;
+      __pyx_t_8 = __pyx_t_7;
+      for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+        __pyx_v_vu = __pyx_t_9;
+
+082: 				for su in range(0, al3):
+
        __pyx_t_10 = __pyx_v_al3;
+        __pyx_t_11 = __pyx_t_10;
+        for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
+          __pyx_v_su = __pyx_t_12;
+
+083: 					f =  an[i,mu] * an[j,nu] * an[k,vu] * an[l,su] * ac[i,mu] * ac[j,nu] * ac[k,vu] * ac[l,su]
+
          __pyx_t_13 = __pyx_v_i;
+          __pyx_t_14 = __pyx_v_mu;
+          __pyx_t_15 = __pyx_v_j;
+          __pyx_t_16 = __pyx_v_nu;
+          __pyx_t_17 = __pyx_v_k;
+          __pyx_t_18 = __pyx_v_vu;
+          __pyx_t_19 = __pyx_v_l;
+          __pyx_t_20 = __pyx_v_su;
+          __pyx_t_21 = __pyx_v_i;
+          __pyx_t_22 = __pyx_v_mu;
+          __pyx_t_23 = __pyx_v_j;
+          __pyx_t_24 = __pyx_v_nu;
+          __pyx_t_25 = __pyx_v_k;
+          __pyx_t_26 = __pyx_v_vu;
+          __pyx_t_27 = __pyx_v_l;
+          __pyx_t_28 = __pyx_v_su;
+          __pyx_v_f = ((((((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_an.data + __pyx_t_13 * __pyx_v_an.strides[0]) ) + __pyx_t_14 * __pyx_v_an.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_an.data + __pyx_t_15 * __pyx_v_an.strides[0]) ) + __pyx_t_16 * __pyx_v_an.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_an.data + __pyx_t_17 * __pyx_v_an.strides[0]) ) + __pyx_t_18 * __pyx_v_an.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_an.data + __pyx_t_19 * __pyx_v_an.strides[0]) ) + __pyx_t_20 * __pyx_v_an.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ac.data + __pyx_t_21 * __pyx_v_ac.strides[0]) ) + __pyx_t_22 * __pyx_v_ac.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ac.data + __pyx_t_23 * __pyx_v_ac.strides[0]) ) + __pyx_t_24 * __pyx_v_ac.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ac.data + __pyx_t_25 * __pyx_v_ac.strides[0]) ) + __pyx_t_26 * __pyx_v_ac.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ac.data + __pyx_t_27 * __pyx_v_ac.strides[0]) ) + __pyx_t_28 * __pyx_v_ac.strides[1]) ))));
+
+084: 					p = ae[i,mu] + ae[j,nu]
+
          __pyx_t_28 = __pyx_v_i;
+          __pyx_t_27 = __pyx_v_mu;
+          __pyx_t_26 = __pyx_v_j;
+          __pyx_t_25 = __pyx_v_nu;
+          __pyx_v_p = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_28 * __pyx_v_ae.strides[0]) ) + __pyx_t_27 * __pyx_v_ae.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_26 * __pyx_v_ae.strides[0]) ) + __pyx_t_25 * __pyx_v_ae.strides[1]) ))));
+
+085: 					q = ae[k,vu] + ae[l,su]
+
          __pyx_t_25 = __pyx_v_k;
+          __pyx_t_26 = __pyx_v_vu;
+          __pyx_t_27 = __pyx_v_l;
+          __pyx_t_28 = __pyx_v_su;
+          __pyx_v_q = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_25 * __pyx_v_ae.strides[0]) ) + __pyx_t_26 * __pyx_v_ae.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_27 * __pyx_v_ae.strides[0]) ) + __pyx_t_28 * __pyx_v_ae.strides[1]) ))));
+
+086: 					t1 = p*q/(p+q)
+
          __pyx_v_t1 = ((__pyx_v_p * __pyx_v_q) / (__pyx_v_p + __pyx_v_q));
+
+087: 					for tu in range(0, 3):
+
          for (__pyx_t_29 = 0; __pyx_t_29 < 3; __pyx_t_29+=1) {
+            __pyx_v_tu = __pyx_t_29;
+
+088: 						t2[tu] = (ae[i,mu]*ao[i,tu] + ae[j,nu]*ao[j,tu])/p - (ae[k,vu]*ao[k,tu] + ae[l,su]*ao[l,tu])/q
+
            __pyx_t_28 = __pyx_v_i;
+            __pyx_t_27 = __pyx_v_mu;
+            __pyx_t_26 = __pyx_v_i;
+            __pyx_t_25 = __pyx_v_tu;
+            __pyx_t_24 = __pyx_v_j;
+            __pyx_t_23 = __pyx_v_nu;
+            __pyx_t_22 = __pyx_v_j;
+            __pyx_t_21 = __pyx_v_tu;
+            __pyx_t_20 = __pyx_v_k;
+            __pyx_t_19 = __pyx_v_vu;
+            __pyx_t_18 = __pyx_v_k;
+            __pyx_t_17 = __pyx_v_tu;
+            __pyx_t_16 = __pyx_v_l;
+            __pyx_t_15 = __pyx_v_su;
+            __pyx_t_14 = __pyx_v_l;
+            __pyx_t_13 = __pyx_v_tu;
+            (__pyx_v_t2[__pyx_v_tu]) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_28 * __pyx_v_ae.strides[0]) ) + __pyx_t_27 * __pyx_v_ae.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_26 * __pyx_v_ao.strides[0]) ) + __pyx_t_25 * __pyx_v_ao.strides[1]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_24 * __pyx_v_ae.strides[0]) ) + __pyx_t_23 * __pyx_v_ae.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_22 * __pyx_v_ao.strides[0]) ) + __pyx_t_21 * __pyx_v_ao.strides[1]) ))))) / __pyx_v_p) - ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_20 * __pyx_v_ae.strides[0]) ) + __pyx_t_19 * __pyx_v_ae.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_18 * __pyx_v_ao.strides[0]) ) + __pyx_t_17 * __pyx_v_ao.strides[1]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_16 * __pyx_v_ae.strides[0]) ) + __pyx_t_15 * __pyx_v_ae.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_14 * __pyx_v_ao.strides[0]) ) + __pyx_t_13 * __pyx_v_ao.strides[1]) ))))) / __pyx_v_q));
+          }
+
 089: 
+
+090: 					s1 = 0.0
+
          __pyx_v_s1 = 0.0;
+
+091: 					for psi in range(0, aa[i,0]+aa[j,0]+1):
+
          __pyx_t_13 = __pyx_v_i;
+          __pyx_t_14 = 0;
+          __pyx_t_15 = __pyx_v_j;
+          __pyx_t_16 = 0;
+          __pyx_t_30 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_13 * __pyx_v_aa.strides[0]) ) + __pyx_t_14 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_15 * __pyx_v_aa.strides[0]) ) + __pyx_t_16 * __pyx_v_aa.strides[1]) )))) + 1);
+          __pyx_t_31 = __pyx_t_30;
+          for (__pyx_t_29 = 0; __pyx_t_29 < __pyx_t_31; __pyx_t_29+=1) {
+            __pyx_v_psi = __pyx_t_29;
+
+092: 						for phi in range(0, aa[i,1]+aa[j,1]+1):
+
            __pyx_t_16 = __pyx_v_i;
+            __pyx_t_15 = 1;
+            __pyx_t_14 = __pyx_v_j;
+            __pyx_t_13 = 1;
+            __pyx_t_32 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_16 * __pyx_v_aa.strides[0]) ) + __pyx_t_15 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_14 * __pyx_v_aa.strides[0]) ) + __pyx_t_13 * __pyx_v_aa.strides[1]) )))) + 1);
+            __pyx_t_33 = __pyx_t_32;
+            for (__pyx_t_34 = 0; __pyx_t_34 < __pyx_t_33; __pyx_t_34+=1) {
+              __pyx_v_phi = __pyx_t_34;
+
+093: 							for chi in range(0, aa[i,2]+aa[j,2]+1):
+
              __pyx_t_13 = __pyx_v_i;
+              __pyx_t_14 = 2;
+              __pyx_t_15 = __pyx_v_j;
+              __pyx_t_16 = 2;
+              __pyx_t_35 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_13 * __pyx_v_aa.strides[0]) ) + __pyx_t_14 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_15 * __pyx_v_aa.strides[0]) ) + __pyx_t_16 * __pyx_v_aa.strides[1]) )))) + 1);
+              __pyx_t_36 = __pyx_t_35;
+              for (__pyx_t_37 = 0; __pyx_t_37 < __pyx_t_36; __pyx_t_37+=1) {
+                __pyx_v_chi = __pyx_t_37;
+
+094: 								for alpha in range(0, aa[k,0]+aa[l,0]+1):
+
                __pyx_t_16 = __pyx_v_k;
+                __pyx_t_15 = 0;
+                __pyx_t_14 = __pyx_v_l;
+                __pyx_t_13 = 0;
+                __pyx_t_38 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_16 * __pyx_v_aa.strides[0]) ) + __pyx_t_15 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_14 * __pyx_v_aa.strides[0]) ) + __pyx_t_13 * __pyx_v_aa.strides[1]) )))) + 1);
+                __pyx_t_39 = __pyx_t_38;
+                for (__pyx_t_40 = 0; __pyx_t_40 < __pyx_t_39; __pyx_t_40+=1) {
+                  __pyx_v_alpha = __pyx_t_40;
+
+095: 									for beta in range(0, aa[k,1]+aa[l,1]+1):
+
                  __pyx_t_13 = __pyx_v_k;
+                  __pyx_t_14 = 1;
+                  __pyx_t_15 = __pyx_v_l;
+                  __pyx_t_16 = 1;
+                  __pyx_t_41 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_13 * __pyx_v_aa.strides[0]) ) + __pyx_t_14 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_15 * __pyx_v_aa.strides[0]) ) + __pyx_t_16 * __pyx_v_aa.strides[1]) )))) + 1);
+                  __pyx_t_42 = __pyx_t_41;
+                  for (__pyx_t_43 = 0; __pyx_t_43 < __pyx_t_42; __pyx_t_43+=1) {
+                    __pyx_v_beta = __pyx_t_43;
+
+096: 										for gamma in range(0, aa[k,2]+aa[l,2]+1):
+
                    __pyx_t_16 = __pyx_v_k;
+                    __pyx_t_15 = 2;
+                    __pyx_t_14 = __pyx_v_l;
+                    __pyx_t_13 = 2;
+                    __pyx_t_44 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_16 * __pyx_v_aa.strides[0]) ) + __pyx_t_15 * __pyx_v_aa.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_14 * __pyx_v_aa.strides[0]) ) + __pyx_t_13 * __pyx_v_aa.strides[1]) )))) + 1);
+                    __pyx_t_45 = __pyx_t_44;
+                    for (__pyx_t_46 = 0; __pyx_t_46 < __pyx_t_45; __pyx_t_46+=1) {
+                      __pyx_v_gamma = __pyx_t_46;
+
 097: 
+
+098: 											s2 = cye(aa[i,0],aa[j,0],psi, ao[i,0]-ao[j,0],ae[i,mu],ae[j,nu]) * \
+
                      __pyx_t_13 = __pyx_v_i;
+                      __pyx_t_14 = 0;
+                      __pyx_t_15 = __pyx_v_j;
+                      __pyx_t_16 = 0;
+                      __pyx_t_17 = __pyx_v_i;
+                      __pyx_t_18 = 0;
+                      __pyx_t_19 = __pyx_v_j;
+                      __pyx_t_20 = 0;
+                      __pyx_t_21 = __pyx_v_i;
+                      __pyx_t_22 = __pyx_v_mu;
+                      __pyx_t_23 = __pyx_v_j;
+                      __pyx_t_24 = __pyx_v_nu;
+
+099: 									 			 cye(aa[i,1],aa[j,1],phi, ao[i,1]-ao[j,1],ae[i,mu],ae[j,nu]) * \
+
                      __pyx_t_25 = __pyx_v_i;
+                      __pyx_t_26 = 1;
+                      __pyx_t_27 = __pyx_v_j;
+                      __pyx_t_28 = 1;
+                      __pyx_t_47 = __pyx_v_i;
+                      __pyx_t_48 = 1;
+                      __pyx_t_49 = __pyx_v_j;
+                      __pyx_t_50 = 1;
+                      __pyx_t_51 = __pyx_v_i;
+                      __pyx_t_52 = __pyx_v_mu;
+                      __pyx_t_53 = __pyx_v_j;
+                      __pyx_t_54 = __pyx_v_nu;
+/* … */
+                      __pyx_v_s2 = ((__pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_13 * __pyx_v_aa.strides[0]) ) + __pyx_t_14 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_15 * __pyx_v_aa.strides[0]) ) + __pyx_t_16 * __pyx_v_aa.strides[1]) ))), __pyx_v_psi, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_17 * __pyx_v_ao.strides[0]) ) + __pyx_t_18 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_19 * __pyx_v_ao.strides[0]) ) + __pyx_t_20 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_21 * __pyx_v_ae.strides[0]) ) + __pyx_t_22 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_23 * __pyx_v_ae.strides[0]) ) + __pyx_t_24 * __pyx_v_ae.strides[1]) ))), NULL) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_25 * __pyx_v_aa.strides[0]) ) + __pyx_t_26 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_27 * __pyx_v_aa.strides[0]) ) + __pyx_t_28 * __pyx_v_aa.strides[1]) ))), __pyx_v_phi, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_47 * __pyx_v_ao.strides[0]) ) + __pyx_t_48 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_49 * __pyx_v_ao.strides[0]) ) + __pyx_t_50 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_51 * __pyx_v_ae.strides[0]) ) + __pyx_t_52 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_53 * __pyx_v_ae.strides[0]) ) + __pyx_t_54 * __pyx_v_ae.strides[1]) ))), NULL)) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_55 * __pyx_v_aa.strides[0]) ) + __pyx_t_56 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_57 * __pyx_v_aa.strides[0]) ) + __pyx_t_58 * __pyx_v_aa.strides[1]) ))), __pyx_v_chi, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_59 * __pyx_v_ao.strides[0]) ) + __pyx_t_60 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_61 * __pyx_v_ao.strides[0]) ) + __pyx_t_62 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_63 * __pyx_v_ae.strides[0]) ) + __pyx_t_64 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_65 * __pyx_v_ae.strides[0]) ) + __pyx_t_66 * __pyx_v_ae.strides[1]) ))), NULL));
+
+100: 									 			 cye(aa[i,2],aa[j,2],chi, ao[i,2]-ao[j,2],ae[i,mu],ae[j,nu])
+
                      __pyx_t_55 = __pyx_v_i;
+                      __pyx_t_56 = 2;
+                      __pyx_t_57 = __pyx_v_j;
+                      __pyx_t_58 = 2;
+                      __pyx_t_59 = __pyx_v_i;
+                      __pyx_t_60 = 2;
+                      __pyx_t_61 = __pyx_v_j;
+                      __pyx_t_62 = 2;
+                      __pyx_t_63 = __pyx_v_i;
+                      __pyx_t_64 = __pyx_v_mu;
+                      __pyx_t_65 = __pyx_v_j;
+                      __pyx_t_66 = __pyx_v_nu;
+
+101: 											s2*= cye(aa[k,0],aa[l,0],alpha, ao[k,0]-ao[l,0],ae[k,vu],ae[l,su]) * \
+
                      __pyx_t_66 = __pyx_v_k;
+                      __pyx_t_65 = 0;
+                      __pyx_t_64 = __pyx_v_l;
+                      __pyx_t_63 = 0;
+                      __pyx_t_62 = __pyx_v_k;
+                      __pyx_t_61 = 0;
+                      __pyx_t_60 = __pyx_v_l;
+                      __pyx_t_59 = 0;
+                      __pyx_t_58 = __pyx_v_k;
+                      __pyx_t_57 = __pyx_v_vu;
+                      __pyx_t_56 = __pyx_v_l;
+                      __pyx_t_55 = __pyx_v_su;
+/* … */
+                      __pyx_v_s2 = (__pyx_v_s2 * ((__pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_66 * __pyx_v_aa.strides[0]) ) + __pyx_t_65 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_64 * __pyx_v_aa.strides[0]) ) + __pyx_t_63 * __pyx_v_aa.strides[1]) ))), __pyx_v_alpha, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_62 * __pyx_v_ao.strides[0]) ) + __pyx_t_61 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_60 * __pyx_v_ao.strides[0]) ) + __pyx_t_59 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_58 * __pyx_v_ae.strides[0]) ) + __pyx_t_57 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_56 * __pyx_v_ae.strides[0]) ) + __pyx_t_55 * __pyx_v_ae.strides[1]) ))), NULL) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_54 * __pyx_v_aa.strides[0]) ) + __pyx_t_53 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_52 * __pyx_v_aa.strides[0]) ) + __pyx_t_51 * __pyx_v_aa.strides[1]) ))), __pyx_v_beta, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_50 * __pyx_v_ao.strides[0]) ) + __pyx_t_49 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_48 * __pyx_v_ao.strides[0]) ) + __pyx_t_47 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_28 * __pyx_v_ae.strides[0]) ) + __pyx_t_27 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_26 * __pyx_v_ae.strides[0]) ) + __pyx_t_25 * __pyx_v_ae.strides[1]) ))), NULL)) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_24 * __pyx_v_aa.strides[0]) ) + __pyx_t_23 * __pyx_v_aa.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_aa.data + __pyx_t_22 * __pyx_v_aa.strides[0]) ) + __pyx_t_21 * __pyx_v_aa.strides[1]) ))), __pyx_v_gamma, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_20 * __pyx_v_ao.strides[0]) ) + __pyx_t_19 * __pyx_v_ao.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ao.data + __pyx_t_18 * __pyx_v_ao.strides[0]) ) + __pyx_t_17 * __pyx_v_ao.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_16 * __pyx_v_ae.strides[0]) ) + __pyx_t_15 * __pyx_v_ae.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ae.data + __pyx_t_14 * __pyx_v_ae.strides[0]) ) + __pyx_t_13 * __pyx_v_ae.strides[1]) ))), NULL)));
+
+102: 									 		     cye(aa[k,1],aa[l,1],beta, ao[k,1]-ao[l,1],ae[k,vu],ae[l,su]) * \
+
                      __pyx_t_54 = __pyx_v_k;
+                      __pyx_t_53 = 1;
+                      __pyx_t_52 = __pyx_v_l;
+                      __pyx_t_51 = 1;
+                      __pyx_t_50 = __pyx_v_k;
+                      __pyx_t_49 = 1;
+                      __pyx_t_48 = __pyx_v_l;
+                      __pyx_t_47 = 1;
+                      __pyx_t_28 = __pyx_v_k;
+                      __pyx_t_27 = __pyx_v_vu;
+                      __pyx_t_26 = __pyx_v_l;
+                      __pyx_t_25 = __pyx_v_su;
+
+103: 									 		     cye(aa[k,2],aa[l,2],gamma, ao[k,2]-ao[l,2],ae[k,vu],ae[l,su])
+
                      __pyx_t_24 = __pyx_v_k;
+                      __pyx_t_23 = 2;
+                      __pyx_t_22 = __pyx_v_l;
+                      __pyx_t_21 = 2;
+                      __pyx_t_20 = __pyx_v_k;
+                      __pyx_t_19 = 2;
+                      __pyx_t_18 = __pyx_v_l;
+                      __pyx_t_17 = 2;
+                      __pyx_t_16 = __pyx_v_k;
+                      __pyx_t_15 = __pyx_v_vu;
+                      __pyx_t_14 = __pyx_v_l;
+                      __pyx_t_13 = __pyx_v_su;
+
+104: 											s2*= pow(-1, alpha+beta+gamma) * clmb(psi+alpha, phi+beta, chi+gamma, 0, t1, \
+
                      __pyx_v_s2 = (__pyx_v_s2 * (pow(-1.0, ((__pyx_v_alpha + __pyx_v_beta) + __pyx_v_gamma)) * __pyx_f_5aello_clmb((__pyx_v_psi + __pyx_v_alpha), (__pyx_v_phi + __pyx_v_beta), (__pyx_v_chi + __pyx_v_gamma), 0, __pyx_v_t1, (__pyx_v_t2[0]), (__pyx_v_t2[1]), (__pyx_v_t2[2]))));
+
 105: 									 		                                      t2[0],t2[1],t2[2])
+
+106: 											s1 += s2
+
                      __pyx_v_s1 = (__pyx_v_s1 + __pyx_v_s2);
+                    }
+                  }
+                }
+              }
+            }
+          }
+
+107: 					s1 *= 2 * pow(pi, 2.5) / ((p*q) * sqrt(p+q))
+
          __pyx_v_s1 = (__pyx_v_s1 * ((2.0 * pow(__pyx_v_5aello_pi, 2.5)) / ((__pyx_v_p * __pyx_v_q) * sqrt((__pyx_v_p + __pyx_v_q)))));
+
+108: 					s += s1 * f
+
          __pyx_v_s = (__pyx_v_s + (__pyx_v_s1 * __pyx_v_f));
+        }
+      }
+    }
+  }
+
+109: 	return s
+
  __pyx_r = __pyx_v_s;
+  goto __pyx_L0;
+
 110: 
+
 111: #|-------------------------------------dipole helper-------------------------------------|
+
 112: 
+
+113: cdef double mu(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction):
+
static double __pyx_f_5aello_mu(int *__pyx_v_ia, int *__pyx_v_ja, double __pyx_v_ie, double __pyx_v_je, double *__pyx_v_ir, double *__pyx_v_jr, double *__pyx_v_kr, int __pyx_v_direction) {
+  double __pyx_v_p;
+  double __pyx_v_q[3];
+  double __pyx_v_ijr[3];
+  int __pyx_v_i;
+  double __pyx_v_u;
+  double __pyx_v_v;
+  double __pyx_v_t;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("mu", 0);
+/* … */
+  /* function exit code */
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 114: 	# dipole moment
+
 115: 	cdef:
+
+116: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
 117: 		double[3] q, ijr
+
 118: 		int i
+
 119: 		double u, v, t
+
 120: 
+
+121: 	for i in range(3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+122: 		q[i] = ((ie*ir[i] + je*jr[i])/p) - kr[i]
+
    (__pyx_v_q[__pyx_v_i]) = ((((__pyx_v_ie * (__pyx_v_ir[__pyx_v_i])) + (__pyx_v_je * (__pyx_v_jr[__pyx_v_i]))) / __pyx_v_p) - (__pyx_v_kr[__pyx_v_i]));
+
+123: 		ijr[i] = ir[i] - jr[i]
+
    (__pyx_v_ijr[__pyx_v_i]) = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i]));
+  }
+
 124: 
+
+125: 	if direction == 1:
+
  __pyx_t_2 = ((__pyx_v_direction == 1) != 0);
+  if (__pyx_t_2) {
+/* … */
+  }
+
+126: 		u = cye(ia[0], ja[0], 1, ijr[0], ie, je) + q[0]* cye(ia[0], ja[0], 0, ijr[0], ie, je)
+
    __pyx_v_u = (__pyx_f_5aello_cye((__pyx_v_ia[0]), (__pyx_v_ja[0]), 1, (__pyx_v_ijr[0]), __pyx_v_ie, __pyx_v_je, NULL) + ((__pyx_v_q[0]) * __pyx_f_5aello_cye((__pyx_v_ia[0]), (__pyx_v_ja[0]), 0, (__pyx_v_ijr[0]), __pyx_v_ie, __pyx_v_je, NULL)));
+
+127: 		v = cye(ia[1], ja[1], 0, ijr[1], ie, je)
+
    __pyx_v_v = __pyx_f_5aello_cye((__pyx_v_ia[1]), (__pyx_v_ja[1]), 0, (__pyx_v_ijr[1]), __pyx_v_ie, __pyx_v_je, NULL);
+
+128: 		t = cye(ia[2], ja[2], 0, ijr[2], ie, je)
+
    __pyx_v_t = __pyx_f_5aello_cye((__pyx_v_ia[2]), (__pyx_v_ja[2]), 0, (__pyx_v_ijr[2]), __pyx_v_ie, __pyx_v_je, NULL);
+
+129: 		return u * v * t * pow(pi/p, 1.5)
+
    __pyx_r = (((__pyx_v_u * __pyx_v_v) * __pyx_v_t) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
+130: 	if direction == 2:
+
  __pyx_t_2 = ((__pyx_v_direction == 2) != 0);
+  if (__pyx_t_2) {
+/* … */
+  }
+
+131: 		u = cye(ia[0], ja[0], 0, ijr[0], ie, je)
+
    __pyx_v_u = __pyx_f_5aello_cye((__pyx_v_ia[0]), (__pyx_v_ja[0]), 0, (__pyx_v_ijr[0]), __pyx_v_ie, __pyx_v_je, NULL);
+
+132: 		v = cye(ia[1], ja[1], 1, ijr[1], ie, je) + q[1]* cye(ia[1], ja[1], 0, ijr[1], ie, je)
+
    __pyx_v_v = (__pyx_f_5aello_cye((__pyx_v_ia[1]), (__pyx_v_ja[1]), 1, (__pyx_v_ijr[1]), __pyx_v_ie, __pyx_v_je, NULL) + ((__pyx_v_q[1]) * __pyx_f_5aello_cye((__pyx_v_ia[1]), (__pyx_v_ja[1]), 0, (__pyx_v_ijr[1]), __pyx_v_ie, __pyx_v_je, NULL)));
+
+133: 		t = cye(ia[2], ja[2], 0, ijr[2], ie, je)
+
    __pyx_v_t = __pyx_f_5aello_cye((__pyx_v_ia[2]), (__pyx_v_ja[2]), 0, (__pyx_v_ijr[2]), __pyx_v_ie, __pyx_v_je, NULL);
+
+134: 		return u * v * t * pow(pi/p, 1.5)
+
    __pyx_r = (((__pyx_v_u * __pyx_v_v) * __pyx_v_t) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
+135: 	if direction == 3:
+
  __pyx_t_2 = ((__pyx_v_direction == 3) != 0);
+  if (__pyx_t_2) {
+/* … */
+  }
+
+136: 		u = cye(ia[0], ja[0], 0, ijr[0], ie, je)
+
    __pyx_v_u = __pyx_f_5aello_cye((__pyx_v_ia[0]), (__pyx_v_ja[0]), 0, (__pyx_v_ijr[0]), __pyx_v_ie, __pyx_v_je, NULL);
+
+137: 		v = cye(ia[1], ja[1], 0, ijr[1], ie, je)
+
    __pyx_v_v = __pyx_f_5aello_cye((__pyx_v_ia[1]), (__pyx_v_ja[1]), 0, (__pyx_v_ijr[1]), __pyx_v_ie, __pyx_v_je, NULL);
+
+138: 		t = cye(ia[2], ja[2], 1, ijr[2], ie, je) + q[2]* cye(ia[2], ja[2], 0, ijr[2], ie, je)
+
    __pyx_v_t = (__pyx_f_5aello_cye((__pyx_v_ia[2]), (__pyx_v_ja[2]), 1, (__pyx_v_ijr[2]), __pyx_v_ie, __pyx_v_je, NULL) + ((__pyx_v_q[2]) * __pyx_f_5aello_cye((__pyx_v_ia[2]), (__pyx_v_ja[2]), 0, (__pyx_v_ijr[2]), __pyx_v_ie, __pyx_v_je, NULL)));
+
+139: 		return u * v * t * pow(pi/p, 1.5)
+
    __pyx_r = (((__pyx_v_u * __pyx_v_v) * __pyx_v_t) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
 140: 
+
 141: #|---------------------------------end dipole helper-------------------------------------|
+
 142: 
+
 143: #|------------------------------------momentum helper------------------------------------|
+
+144: cdef double ang(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction):
+
static double __pyx_f_5aello_ang(int *__pyx_v_ia, int *__pyx_v_ja, double __pyx_v_ie, double __pyx_v_je, double *__pyx_v_ir, double *__pyx_v_jr, double *__pyx_v_kr, int __pyx_v_direction) {
+  double __pyx_v_p;
+  double __pyx_v_ijr[3];
+  int __pyx_v_i;
+  double __pyx_v_sd[3][3];
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ang", 0);
+/* … */
+  /* function exit code */
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 145: 	# angular momentum
+
 146: 	cdef:
+
+147: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
 148: 		double[3] ijr
+
 149: 		int i
+
 150: 		double u, v, t
+
 151: 		double sd[3][3]
+
 152: 
+
+153: 	for i in range(3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+154: 		ijr[i] = ir[i] - jr[i]
+
    (__pyx_v_ijr[__pyx_v_i]) = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i]));
+  }
+
 155: 
+
+156: 	for i in range(3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+157: 		sd[0][i] = cye(ia[i], ja[i], 0, ijr[i], ie, je)
+
    ((__pyx_v_sd[0])[__pyx_v_i]) = __pyx_f_5aello_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), 0, (__pyx_v_ijr[__pyx_v_i]), __pyx_v_ie, __pyx_v_je, NULL);
+
+158: 		sd[1][i] = cye(ia[i], ja[i], 0, ijr[i], ie, je, 1, ir[i]-kr[i])
+
    __pyx_t_3.__pyx_n = 2;
+    __pyx_t_3.n = 1;
+    __pyx_t_3.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_kr[__pyx_v_i]));
+    __pyx_t_2 = __pyx_f_5aello_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), 0, (__pyx_v_ijr[__pyx_v_i]), __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    ((__pyx_v_sd[1])[__pyx_v_i]) = __pyx_t_2;
+
+159: 		sd[2][i] = (ja[i] * cye(ia[i], ja[i]-1, 0, ijr[i], ie, je)) - (2.0 * je * cye(ia[i], ja[i]+1, 0, ijr[i], ie, je))
+
    ((__pyx_v_sd[2])[__pyx_v_i]) = (((__pyx_v_ja[__pyx_v_i]) * __pyx_f_5aello_cye((__pyx_v_ia[__pyx_v_i]), ((__pyx_v_ja[__pyx_v_i]) - 1), 0, (__pyx_v_ijr[__pyx_v_i]), __pyx_v_ie, __pyx_v_je, NULL)) - ((2.0 * __pyx_v_je) * __pyx_f_5aello_cye((__pyx_v_ia[__pyx_v_i]), ((__pyx_v_ja[__pyx_v_i]) + 1), 0, (__pyx_v_ijr[__pyx_v_i]), __pyx_v_ie, __pyx_v_je, NULL)));
+  }
+
 160: 
+
+161: 	if direction == 1:
+
  switch (__pyx_v_direction) {
+    case 1:
+/* … */
+    break;
+    case 2:
+
+162: 		return -sd[0][0] * (sd[1][1] * sd[2][2] - sd[1][2] * sd[2][1]) * pow(pi/p, 1.5)
+
    __pyx_r = (((-((__pyx_v_sd[0])[0])) * ((((__pyx_v_sd[1])[1]) * ((__pyx_v_sd[2])[2])) - (((__pyx_v_sd[1])[2]) * ((__pyx_v_sd[2])[1])))) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
+163: 	elif direction == 2:
+
    break;
+    case 3:
+
+164: 		return -sd[0][1] * (sd[1][2] * sd[2][0] - sd[1][0] * sd[2][2]) * pow(pi/p, 1.5)
+
    __pyx_r = (((-((__pyx_v_sd[0])[1])) * ((((__pyx_v_sd[1])[2]) * ((__pyx_v_sd[2])[0])) - (((__pyx_v_sd[1])[0]) * ((__pyx_v_sd[2])[2])))) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
+165: 	elif direction == 3:
+
    break;
+    default: break;
+  }
+
+166: 		return -sd[0][2] * (sd[1][0] * sd[2][1] - sd[1][1] * sd[2][0]) * pow(pi/p, 1.5)
+
    __pyx_r = (((-((__pyx_v_sd[0])[2])) * ((((__pyx_v_sd[1])[0]) * ((__pyx_v_sd[2])[1])) - (((__pyx_v_sd[1])[1]) * ((__pyx_v_sd[2])[0])))) * pow((__pyx_v_5aello_pi / __pyx_v_p), 1.5));
+    goto __pyx_L0;
+
 167: 
+
 168: #|--------------------------------end momentum helper------------------------------------|
+
 169: 
+
 170: #get the atom and basis classes
+
+171: def aello(molAtom, molBasis, mode = 'scf', density = None, gauge = None):
+
/* Python wrapper */
+static PyObject *__pyx_pw_5aello_1aello(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_5aello_1aello = {"aello", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5aello_1aello, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_5aello_1aello(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_molAtom = 0;
+  PyObject *__pyx_v_molBasis = 0;
+  PyObject *__pyx_v_mode = 0;
+  PyObject *__pyx_v_density = 0;
+  PyObject *__pyx_v_gauge = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aello (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_molAtom,&__pyx_n_s_molBasis,&__pyx_n_s_mode,&__pyx_n_s_density,&__pyx_n_s_gauge,0};
+    PyObject* values[5] = {0,0,0,0,0};
+    values[2] = ((PyObject *)__pyx_n_s_scf);
+    values[3] = ((PyObject *)Py_None);
+    values[4] = ((PyObject *)Py_None);
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molAtom)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molBasis)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aello", 0, 2, 5, 1); __PYX_ERR(0, 171, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mode);
+          if (value) { values[2] = value; kw_args--; }
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_density);
+          if (value) { values[3] = value; kw_args--; }
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (kw_args > 0) {
+          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_gauge);
+          if (value) { values[4] = value; kw_args--; }
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "aello") < 0)) __PYX_ERR(0, 171, __pyx_L3_error)
+      }
+    } else {
+      switch (PyTuple_GET_SIZE(__pyx_args)) {
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+    }
+    __pyx_v_molAtom = values[0];
+    __pyx_v_molBasis = values[1];
+    __pyx_v_mode = values[2];
+    __pyx_v_density = values[3];
+    __pyx_v_gauge = values[4];
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("aello", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 171, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("aello.aello", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5aello_aello(__pyx_self, __pyx_v_molAtom, __pyx_v_molBasis, __pyx_v_mode, __pyx_v_density, __pyx_v_gauge);
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5aello_aello(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_molAtom, PyObject *__pyx_v_molBasis, PyObject *__pyx_v_mode, PyObject *__pyx_v_density, PyObject *__pyx_v_gauge) {
+  int __pyx_v_na;
+  int __pyx_v_nb;
+  int __pyx_v_ng;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_k;
+  int __pyx_v_l;
+  int __pyx_v_m;
+  int __pyx_v_n;
+  int __pyx_v_p;
+  int __pyx_v_q;
+  PyObject *__pyx_v_mx = NULL;
+  PyObject *__pyx_v_mz = NULL;
+  __Pyx_memviewslice __pyx_v_alo_x = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_z = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_v_me = NULL;
+  PyObject *__pyx_v_mc = NULL;
+  PyObject *__pyx_v_mn = NULL;
+  PyObject *__pyx_v_ma = NULL;
+  PyObject *__pyx_v_mo = NULL;
+  PyObject *__pyx_v_ml = NULL;
+  __Pyx_memviewslice __pyx_v_alo_e = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_c = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_n = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_a = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_o = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_v_S = NULL;
+  __Pyx_memviewslice __pyx_v_overlap = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_s;
+  double __pyx_v_f;
+  PyObject *__pyx_v_K = NULL;
+  __Pyx_memviewslice __pyx_v_kinetic = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_t1;
+  double __pyx_v_t2;
+  double __pyx_v_t3;
+  PyObject *__pyx_v_J = NULL;
+  __Pyx_memviewslice __pyx_v_coulomb = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_r[3];
+  double __pyx_v_cp;
+  PyObject *__pyx_v_I = NULL;
+  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_eri = { 0, 0, { 0 }, { 0 }, { 0 } };
+  int __pyx_v_idx;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aello", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_125, 1);
+  __Pyx_AddTraceback("aello.aello", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_mx);
+  __Pyx_XDECREF(__pyx_v_mz);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_x, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_z, 1);
+  __Pyx_XDECREF(__pyx_v_me);
+  __Pyx_XDECREF(__pyx_v_mc);
+  __Pyx_XDECREF(__pyx_v_mn);
+  __Pyx_XDECREF(__pyx_v_ma);
+  __Pyx_XDECREF(__pyx_v_mo);
+  __Pyx_XDECREF(__pyx_v_ml);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_e, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_c, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_n, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_a, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_o, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo, 1);
+  __Pyx_XDECREF(__pyx_v_S);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_overlap, 1);
+  __Pyx_XDECREF(__pyx_v_K);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_kinetic, 1);
+  __Pyx_XDECREF(__pyx_v_J);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_coulomb, 1);
+  __Pyx_XDECREF(__pyx_v_I);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_eri, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+/* … */
+  __pyx_tuple__21 = PyTuple_Pack(48, __pyx_n_s_molAtom, __pyx_n_s_molBasis, __pyx_n_s_mode, __pyx_n_s_density, __pyx_n_s_gauge, __pyx_n_s_na, __pyx_n_s_nb, __pyx_n_s_ng, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_l, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_p, __pyx_n_s_q, __pyx_n_s_mx, __pyx_n_s_mz, __pyx_n_s_alo_x, __pyx_n_s_alo_z, __pyx_n_s_me, __pyx_n_s_mc, __pyx_n_s_mn, __pyx_n_s_ma, __pyx_n_s_mo, __pyx_n_s_ml, __pyx_n_s_alo_e, __pyx_n_s_alo_c, __pyx_n_s_alo_n, __pyx_n_s_alo_a, __pyx_n_s_alo_o, __pyx_n_s_alo, __pyx_n_s_S, __pyx_n_s_overlap, __pyx_n_s_s, __pyx_n_s_f, __pyx_n_s_K, __pyx_n_s_kinetic, __pyx_n_s_t1, __pyx_n_s_t2, __pyx_n_s_t3, __pyx_n_s_J, __pyx_n_s_coulomb, __pyx_n_s_r, __pyx_n_s_cp, __pyx_n_s_I, __pyx_n_s_eri, __pyx_n_s_idx); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 171, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__21);
+  __Pyx_GIVEREF(__pyx_tuple__21);
+/* … */
+  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_5aello_1aello, NULL, __pyx_n_s_aello); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 171, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_aello, __pyx_t_2) < 0) __PYX_ERR(0, 171, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(5, 0, 48, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aello_pyx, __pyx_n_s_aello, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(0, 171, __pyx_L1_error)
+
 172: 
+
 173: 	cdef:
+
+174: 		int na = len(molAtom)
+
  __pyx_t_1 = PyObject_Length(__pyx_v_molAtom); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 174, __pyx_L1_error)
+  __pyx_v_na = __pyx_t_1;
+
+175: 		int nb = len(molBasis)
+
  __pyx_t_1 = PyObject_Length(__pyx_v_molBasis); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 175, __pyx_L1_error)
+  __pyx_v_nb = __pyx_t_1;
+
+176: 		int	ng = len(molBasis[0].co)
+
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_molBasis, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 176, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 176, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_ng = __pyx_t_1;
+
 177: 		int  i, j, k, l, m, n, p, q
+
 178: 
+
 179: 	#get largest primative length
+
+180: 	for i in range(nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_i = __pyx_t_6;
+
+181: 		j = len(molBasis[i].co)
+
    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_co); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 181, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 181, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_v_j = __pyx_t_1;
+
+182: 		if j > ng:
+
    __pyx_t_7 = ((__pyx_v_j > __pyx_v_ng) != 0);
+    if (__pyx_t_7) {
+/* … */
+    }
+  }
+
+183: 			ng = j
+
      __pyx_v_ng = __pyx_v_j;
+
 184: 
+
 185: 	#convert atom class properties to c views
+
+186: 	mx = np.empty([na,3], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_na); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_int_3);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_8); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 186, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_mx = __pyx_t_10;
+  __pyx_t_10 = 0;
+
+187: 	mz = np.empty([na], dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_na); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_short); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_10, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 187, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_mz = __pyx_t_9;
+  __pyx_t_9 = 0;
+
 188: 	cdef:
+
+189: 		double[:,:] alo_x = mx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 189, __pyx_L1_error)
+  __pyx_v_alo_x = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+190: 		short[:]   alo_z = mz
+
  __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_v_mz, PyBUF_WRITABLE); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 190, __pyx_L1_error)
+  __pyx_v_alo_z = __pyx_t_12;
+  __pyx_t_12.memview = NULL;
+  __pyx_t_12.data = NULL;
+
+191: 	for p in range(0, na):
+
  __pyx_t_4 = __pyx_v_na;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+192: 		for q in range(0, 3):
+
    for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+193: 			alo_x[p,q] = molAtom[p].center[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molAtom, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 193, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_center); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 193, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 193, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_15 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_x.strides[1]) )) = __pyx_t_14;
+    }
+
+194: 		alo_z[p] = molAtom[p].number
+
    __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molAtom, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 194, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_number); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 194, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_17 = __Pyx_PyInt_As_short(__pyx_t_2); if (unlikely((__pyx_t_17 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_16 = __pyx_v_p;
+    *((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_16 * __pyx_v_alo_z.strides[0]) )) = __pyx_t_17;
+  }
+
 195: 
+
 196: 	#convert basis class properties to c-variables
+
+197: 	me = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __pyx_t_2 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 197, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_me = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+198: 	mc = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_9, 1, __pyx_t_10);
+  __pyx_t_3 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_10, __pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 198, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_v_mc = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+199: 	mn = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __pyx_t_2 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 199, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_mn = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+200: 	ma = np.empty([nb,3],  dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_10 = PyList_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_10, 1, __pyx_int_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
+  __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_short); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_3, __pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 200, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_v_ma = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+201: 	mo = np.empty([nb,3],  dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_int_3);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 201, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_mo = __pyx_t_9;
+  __pyx_t_9 = 0;
+
+202: 	ml = np.empty([nb],    dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_short); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 202, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_ml = __pyx_t_8;
+  __pyx_t_8 = 0;
+
 203: 	cdef:
+
+204: 		double[:,:] alo_e = me
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_me, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 204, __pyx_L1_error)
+  __pyx_v_alo_e = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+205: 		double[:,:] alo_c = mc
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mc, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 205, __pyx_L1_error)
+  __pyx_v_alo_c = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+206: 		double[:,:] alo_n = mn
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mn, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 206, __pyx_L1_error)
+  __pyx_v_alo_n = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+207: 		short[:,:]  alo_a = ma
+
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dsds_short(__pyx_v_ma, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 207, __pyx_L1_error)
+  __pyx_v_alo_a = __pyx_t_18;
+  __pyx_t_18.memview = NULL;
+  __pyx_t_18.data = NULL;
+
+208: 		double[:,:] alo_o = mo
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mo, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 208, __pyx_L1_error)
+  __pyx_v_alo_o = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+209: 		short[:]    alo   = ml
+
  __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_v_ml, PyBUF_WRITABLE); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 209, __pyx_L1_error)
+  __pyx_v_alo = __pyx_t_12;
+  __pyx_t_12.memview = NULL;
+  __pyx_t_12.data = NULL;
+
 210: 
+
+211: 	for p in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+212: 		alo[p] = len(molBasis[p].co)
+
    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 212, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 212, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 212, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_16 = __pyx_v_p;
+    *((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_16 * __pyx_v_alo.strides[0]) )) = __pyx_t_1;
+
+213: 		for q in range(0, len(molBasis[p].co)):
+
    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 213, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 213, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 213, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __pyx_t_19 = __pyx_t_1;
+    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_19; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+214: 			alo_e[p,q] = molBasis[p].ex[q]
+
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 214, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_ex); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 214, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 214, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_8); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 214, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_16 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_e.strides[1]) )) = __pyx_t_14;
+
+215: 			alo_c[p,q] = molBasis[p].co[q]
+
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 215, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_co); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 215, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 215, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_8); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 215, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_15 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_c.strides[1]) )) = __pyx_t_14;
+
+216: 			alo_n[p,q] = molBasis[p].normal[q]
+
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 216, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_normal); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 216, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 216, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_8); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 216, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_16 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_n.strides[1]) )) = __pyx_t_14;
+    }
+
+217: 		for q in range(0, 3):
+
    for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+218: 			alo_a[p,q] = molBasis[p].momentum[q]
+
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 218, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_momentum); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 218, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_17 = __Pyx_PyInt_As_short(__pyx_t_8); if (unlikely((__pyx_t_17 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 218, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_15 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_a.strides[1]) )) = __pyx_t_17;
+
+219: 			alo_o[p,q] = molBasis[p].center[q]
+
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 219, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_center); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 219, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 219, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_8); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_16 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )) = __pyx_t_14;
+    }
+  }
+
 220: 
+
+221: 	if mode == 'dipole':
+
  __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_dipole, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 221, __pyx_L1_error)
+  if (__pyx_t_7) {
+/* … */
+  }
+
+222: 		return aelloDipole(alo_n, alo_c, alo_e, alo_a, alo_o, alo, alo_z, alo_x, na, nb, molAtom, density, gauge)
+
    __Pyx_XDECREF(__pyx_r);
+    __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_density, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 222, __pyx_L1_error)
+    if (!(likely(PyString_CheckExact(__pyx_v_gauge))||((__pyx_v_gauge) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_gauge)->tp_name), 0))) __PYX_ERR(0, 222, __pyx_L1_error)
+    __pyx_t_8 = __pyx_f_5aello_aelloDipole(__pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, __pyx_t_11, ((PyObject*)__pyx_v_gauge), 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 222, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
+    __pyx_t_11.memview = NULL;
+    __pyx_t_11.data = NULL;
+    __pyx_r = __pyx_t_8;
+    __pyx_t_8 = 0;
+    goto __pyx_L0;
+
 223: 
+
+224: 	if mode == 'angular':
+
  __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_angular, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 224, __pyx_L1_error)
+  if (__pyx_t_7) {
+/* … */
+  }
+
+225: 		return aelloAngular(alo_n, alo_c, alo_e, alo_a, alo_o, alo, alo_z, alo_x, na, nb, molAtom, gauge)
+
    __Pyx_XDECREF(__pyx_r);
+    if (!(likely(PyString_CheckExact(__pyx_v_gauge))||((__pyx_v_gauge) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_gauge)->tp_name), 0))) __PYX_ERR(0, 225, __pyx_L1_error)
+    __pyx_t_8 = __pyx_f_5aello_aelloAngular(__pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, ((PyObject*)__pyx_v_gauge), 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 225, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_r = __pyx_t_8;
+    __pyx_t_8 = 0;
+    goto __pyx_L0;
+
 226: 
+
 227: #-------------------------------------Begin Overlap---------------------------------------|
+
+228: 	S = np.empty([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
+  __pyx_t_8 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 228, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_S = __pyx_t_10;
+  __pyx_t_10 = 0;
+
 229: 	cdef:
+
+230: 		double [:,:] overlap  = S
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_S, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 230, __pyx_L1_error)
+  __pyx_v_overlap = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
 231: 		double s, f
+
 232: 
+
+233: 	for p in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+234: 		for q in range(p, nb):
+
    __pyx_t_13 = __pyx_v_nb;
+    __pyx_t_20 = __pyx_t_13;
+    for (__pyx_t_21 = __pyx_v_p; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
+      __pyx_v_q = __pyx_t_21;
+
 235: 
+
+236: 			s = 0.0
+
      __pyx_v_s = 0.0;
+
+237: 			for i in range(0, alo[p]):
+
      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+      __pyx_t_22 = __pyx_t_17;
+      for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_22; __pyx_t_23+=1) {
+        __pyx_v_i = __pyx_t_23;
+
+238: 				for j in range(0, alo[q]):
+
        __pyx_t_15 = __pyx_v_q;
+        __pyx_t_24 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+        __pyx_t_25 = __pyx_t_24;
+        for (__pyx_t_26 = 0; __pyx_t_26 < __pyx_t_25; __pyx_t_26+=1) {
+          __pyx_v_j = __pyx_t_26;
+
+239: 					f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
          __pyx_t_15 = __pyx_v_p;
+          __pyx_t_16 = __pyx_v_i;
+          __pyx_t_27 = __pyx_v_q;
+          __pyx_t_28 = __pyx_v_j;
+          __pyx_t_29 = __pyx_v_p;
+          __pyx_t_30 = __pyx_v_i;
+          __pyx_t_31 = __pyx_v_q;
+          __pyx_t_32 = __pyx_v_j;
+          __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_15 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_27 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_28 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_29 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_30 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_31 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_32 * __pyx_v_alo_c.strides[1]) ))));
+
+240: 					s += ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2],  \
+
          __pyx_t_32 = __pyx_v_p;
+          __pyx_t_31 = 0;
+          __pyx_t_30 = __pyx_v_p;
+          __pyx_t_29 = 1;
+          __pyx_t_28 = __pyx_v_p;
+          __pyx_t_27 = 2;
+          __pyx_t_16 = __pyx_v_q;
+          __pyx_t_15 = 0;
+          __pyx_t_33 = __pyx_v_q;
+          __pyx_t_34 = 1;
+          __pyx_t_35 = __pyx_v_q;
+          __pyx_t_36 = 2;
+/* … */
+          __pyx_v_s = (__pyx_v_s + (__pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_32 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_31 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_30 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_29 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_28 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_27 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_16 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_33 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_35 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_37 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_41 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_42 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_43 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_44 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_45 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_46 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_47 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_48 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_49 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_51 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_52 * __pyx_v_alo_e.strides[1]) )))) * __pyx_v_f));
+        }
+      }
+
+241:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_37 = __pyx_v_p;
+          __pyx_t_38 = 0;
+          __pyx_t_39 = __pyx_v_q;
+          __pyx_t_40 = 0;
+          __pyx_t_41 = __pyx_v_p;
+          __pyx_t_42 = 1;
+          __pyx_t_43 = __pyx_v_q;
+          __pyx_t_44 = 1;
+          __pyx_t_45 = __pyx_v_p;
+          __pyx_t_46 = 2;
+          __pyx_t_47 = __pyx_v_q;
+          __pyx_t_48 = 2;
+
+242:  						      alo_e[p,i], alo_e[q,j]) * f
+
          __pyx_t_49 = __pyx_v_p;
+          __pyx_t_50 = __pyx_v_i;
+          __pyx_t_51 = __pyx_v_q;
+          __pyx_t_52 = __pyx_v_j;
+
 243: 
+
+244: 			overlap[p,q] = s
+
      __pyx_t_52 = __pyx_v_p;
+      __pyx_t_51 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlap.data + __pyx_t_52 * __pyx_v_overlap.strides[0]) ) + __pyx_t_51 * __pyx_v_overlap.strides[1]) )) = __pyx_v_s;
+
+245: 			if p != q:
+
      __pyx_t_7 = ((__pyx_v_p != __pyx_v_q) != 0);
+      if (__pyx_t_7) {
+/* … */
+      }
+    }
+  }
+
+246: 				overlap[q,p] = overlap[p,q]
+
        __pyx_t_51 = __pyx_v_p;
+        __pyx_t_52 = __pyx_v_q;
+        __pyx_t_50 = __pyx_v_q;
+        __pyx_t_49 = __pyx_v_p;
+        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlap.data + __pyx_t_50 * __pyx_v_overlap.strides[0]) ) + __pyx_t_49 * __pyx_v_overlap.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlap.data + __pyx_t_51 * __pyx_v_overlap.strides[0]) ) + __pyx_t_52 * __pyx_v_overlap.strides[1]) )));
+
 247: #----------------------------------------End Overlap----------------------------------------|
+
 248: 
+
 249: #---------------------------------------Begin Kinetic---------------------------------------|
+
+250: 	K = np.empty([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_9);
+  __pyx_t_10 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_double); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 250, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_K = __pyx_t_8;
+  __pyx_t_8 = 0;
+
 251: 	cdef:
+
+252: 		double[:,:] kinetic = K
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_K, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 252, __pyx_L1_error)
+  __pyx_v_kinetic = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
 253: 		double t1, t2, t3
+
 254: 
+
+255: 	for p in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+256: 		for q in range(p, nb):
+
    __pyx_t_13 = __pyx_v_nb;
+    __pyx_t_20 = __pyx_t_13;
+    for (__pyx_t_21 = __pyx_v_p; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
+      __pyx_v_q = __pyx_t_21;
+
 257: 
+
+258: 			s = 0.0
+
      __pyx_v_s = 0.0;
+
+259: 			for i in range(0, alo[p]):
+
      __pyx_t_52 = __pyx_v_p;
+      __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_52 * __pyx_v_alo.strides[0]) )));
+      __pyx_t_22 = __pyx_t_17;
+      for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_22; __pyx_t_23+=1) {
+        __pyx_v_i = __pyx_t_23;
+
+260: 				for j in range(0, alo[q]):
+
        __pyx_t_52 = __pyx_v_q;
+        __pyx_t_24 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_52 * __pyx_v_alo.strides[0]) )));
+        __pyx_t_25 = __pyx_t_24;
+        for (__pyx_t_26 = 0; __pyx_t_26 < __pyx_t_25; __pyx_t_26+=1) {
+          __pyx_v_j = __pyx_t_26;
+
+261: 					f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
          __pyx_t_52 = __pyx_v_p;
+          __pyx_t_51 = __pyx_v_i;
+          __pyx_t_49 = __pyx_v_q;
+          __pyx_t_50 = __pyx_v_j;
+          __pyx_t_48 = __pyx_v_p;
+          __pyx_t_47 = __pyx_v_i;
+          __pyx_t_46 = __pyx_v_q;
+          __pyx_t_45 = __pyx_v_j;
+          __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_52 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_51 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_49 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_48 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_47 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_46 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_45 * __pyx_v_alo_c.strides[1]) ))));
+
+262: 					t1 = alo_e[q,j] * (2*(alo_a[q,0] + alo_a[q,1] + alo_a[q,2]) + 3) * \
+
          __pyx_t_45 = __pyx_v_q;
+          __pyx_t_46 = __pyx_v_j;
+          __pyx_t_47 = __pyx_v_q;
+          __pyx_t_48 = 0;
+          __pyx_t_50 = __pyx_v_q;
+          __pyx_t_49 = 1;
+          __pyx_t_51 = __pyx_v_q;
+          __pyx_t_52 = 2;
+/* … */
+          __pyx_v_t1 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_45 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_46 * __pyx_v_alo_e.strides[1]) ))) * ((2 * (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_47 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_48 * __pyx_v_alo_a.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_50 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_49 * __pyx_v_alo_a.strides[1]) )))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_51 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_52 * __pyx_v_alo_a.strides[1]) ))))) + 3)) * __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_44 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_43 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_42 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_41 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_40 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_38 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_34 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_27 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_28 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_29 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_30 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_31 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_32 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_53 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_54 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_55 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_56 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_57 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_58 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_59 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_60 * __pyx_v_alo_e.strides[1]) )))));
+
+263: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2],  \
+
          __pyx_t_44 = __pyx_v_p;
+          __pyx_t_43 = 0;
+          __pyx_t_42 = __pyx_v_p;
+          __pyx_t_41 = 1;
+          __pyx_t_40 = __pyx_v_p;
+          __pyx_t_39 = 2;
+          __pyx_t_38 = __pyx_v_q;
+          __pyx_t_37 = 0;
+          __pyx_t_36 = __pyx_v_q;
+          __pyx_t_35 = 1;
+          __pyx_t_34 = __pyx_v_q;
+          __pyx_t_33 = 2;
+
+264:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_15 = __pyx_v_p;
+          __pyx_t_16 = 0;
+          __pyx_t_27 = __pyx_v_q;
+          __pyx_t_28 = 0;
+          __pyx_t_29 = __pyx_v_p;
+          __pyx_t_30 = 1;
+          __pyx_t_31 = __pyx_v_q;
+          __pyx_t_32 = 1;
+          __pyx_t_53 = __pyx_v_p;
+          __pyx_t_54 = 2;
+          __pyx_t_55 = __pyx_v_q;
+          __pyx_t_56 = 2;
+
+265:  						      alo_e[p,i], alo_e[q,j])
+
          __pyx_t_57 = __pyx_v_p;
+          __pyx_t_58 = __pyx_v_i;
+          __pyx_t_59 = __pyx_v_q;
+          __pyx_t_60 = __pyx_v_j;
+
 266: 
+
+267: 					t2 = -2 * alo_e[q,j] * alo_e[q,j] * ( \
+
          __pyx_t_60 = __pyx_v_q;
+          __pyx_t_59 = __pyx_v_j;
+          __pyx_t_58 = __pyx_v_q;
+          __pyx_t_57 = __pyx_v_j;
+/* … */
+          __pyx_v_t2 = (((-2.0 * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_60 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_59 * __pyx_v_alo_e.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_58 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_57 * __pyx_v_alo_e.strides[1]) )))) * ((__pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_56 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_55 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_54 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_53 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_32 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_31 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_30 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_29 * __pyx_v_alo_a.strides[1]) ))) + 2), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_28 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_27 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_16 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_33 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_35 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_37 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_41 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_42 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_43 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_44 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_52 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_51 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_49 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_e.strides[1]) )))) + __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_48 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_47 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_46 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_45 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_61 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_62 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_63 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_64 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_65 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_66 * __pyx_v_alo_a.strides[1]) ))) + 2), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_67 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_68 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_69 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_70 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_71 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_72 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_73 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_74 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_75 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_76 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_77 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_78 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_79 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_80 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_81 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_82 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_83 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_84 * __pyx_v_alo_e.strides[1]) ))))) + __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_85 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_86 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_87 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_88 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_89 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_90 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_91 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_92 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_93 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_94 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_95 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_96 * __pyx_v_alo_a.strides[1]) ))) + 2), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_97 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_98 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_99 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_100 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_101 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_102 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_103 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_104 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_105 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_106 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_107 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_108 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_109 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_110 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_111 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_112 * __pyx_v_alo_e.strides[1]) ))))));
+
+268: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0]+2, alo_a[q,1], alo_a[q,2],  \
+
          __pyx_t_56 = __pyx_v_p;
+          __pyx_t_55 = 0;
+          __pyx_t_54 = __pyx_v_p;
+          __pyx_t_53 = 1;
+          __pyx_t_32 = __pyx_v_p;
+          __pyx_t_31 = 2;
+          __pyx_t_30 = __pyx_v_q;
+          __pyx_t_29 = 0;
+          __pyx_t_28 = __pyx_v_q;
+          __pyx_t_27 = 1;
+          __pyx_t_16 = __pyx_v_q;
+          __pyx_t_15 = 2;
+
+269:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_33 = __pyx_v_p;
+          __pyx_t_34 = 0;
+          __pyx_t_35 = __pyx_v_q;
+          __pyx_t_36 = 0;
+          __pyx_t_37 = __pyx_v_p;
+          __pyx_t_38 = 1;
+          __pyx_t_39 = __pyx_v_q;
+          __pyx_t_40 = 1;
+          __pyx_t_41 = __pyx_v_p;
+          __pyx_t_42 = 2;
+          __pyx_t_43 = __pyx_v_q;
+          __pyx_t_44 = 2;
+
+270:  						      alo_e[p,i], alo_e[q,j])	+ \
+
          __pyx_t_52 = __pyx_v_p;
+          __pyx_t_51 = __pyx_v_i;
+          __pyx_t_49 = __pyx_v_q;
+          __pyx_t_50 = __pyx_v_j;
+
+271: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1]+2, alo_a[q,2],  \
+
          __pyx_t_48 = __pyx_v_p;
+          __pyx_t_47 = 0;
+          __pyx_t_46 = __pyx_v_p;
+          __pyx_t_45 = 1;
+          __pyx_t_61 = __pyx_v_p;
+          __pyx_t_62 = 2;
+          __pyx_t_63 = __pyx_v_q;
+          __pyx_t_64 = 0;
+          __pyx_t_65 = __pyx_v_q;
+          __pyx_t_66 = 1;
+          __pyx_t_67 = __pyx_v_q;
+          __pyx_t_68 = 2;
+
+272:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_69 = __pyx_v_p;
+          __pyx_t_70 = 0;
+          __pyx_t_71 = __pyx_v_q;
+          __pyx_t_72 = 0;
+          __pyx_t_73 = __pyx_v_p;
+          __pyx_t_74 = 1;
+          __pyx_t_75 = __pyx_v_q;
+          __pyx_t_76 = 1;
+          __pyx_t_77 = __pyx_v_p;
+          __pyx_t_78 = 2;
+          __pyx_t_79 = __pyx_v_q;
+          __pyx_t_80 = 2;
+
+273:  						      alo_e[p,i], alo_e[q,j])	+ \
+
          __pyx_t_81 = __pyx_v_p;
+          __pyx_t_82 = __pyx_v_i;
+          __pyx_t_83 = __pyx_v_q;
+          __pyx_t_84 = __pyx_v_j;
+
+274: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2]+2,  \
+
          __pyx_t_85 = __pyx_v_p;
+          __pyx_t_86 = 0;
+          __pyx_t_87 = __pyx_v_p;
+          __pyx_t_88 = 1;
+          __pyx_t_89 = __pyx_v_p;
+          __pyx_t_90 = 2;
+          __pyx_t_91 = __pyx_v_q;
+          __pyx_t_92 = 0;
+          __pyx_t_93 = __pyx_v_q;
+          __pyx_t_94 = 1;
+          __pyx_t_95 = __pyx_v_q;
+          __pyx_t_96 = 2;
+
+275:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_97 = __pyx_v_p;
+          __pyx_t_98 = 0;
+          __pyx_t_99 = __pyx_v_q;
+          __pyx_t_100 = 0;
+          __pyx_t_101 = __pyx_v_p;
+          __pyx_t_102 = 1;
+          __pyx_t_103 = __pyx_v_q;
+          __pyx_t_104 = 1;
+          __pyx_t_105 = __pyx_v_p;
+          __pyx_t_106 = 2;
+          __pyx_t_107 = __pyx_v_q;
+          __pyx_t_108 = 2;
+
+276:  						      alo_e[p,i], alo_e[q,j])  )
+
          __pyx_t_109 = __pyx_v_p;
+          __pyx_t_110 = __pyx_v_i;
+          __pyx_t_111 = __pyx_v_q;
+          __pyx_t_112 = __pyx_v_j;
+
 277: 
+
 278: 
+
+279: 					t3 = alo_a[q,0] * (alo_a[q,0] - 1) * \
+
          __pyx_t_112 = __pyx_v_q;
+          __pyx_t_111 = 0;
+          __pyx_t_110 = __pyx_v_q;
+          __pyx_t_109 = 0;
+/* … */
+          __pyx_v_t3 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_112 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_111 * __pyx_v_alo_a.strides[1]) ))) * ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_110 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_109 * __pyx_v_alo_a.strides[1]) ))) - 1)) * __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_108 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_107 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_106 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_105 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_104 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_103 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_102 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_101 * __pyx_v_alo_a.strides[1]) ))) - 2), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_100 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_99 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_98 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_97 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_96 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_95 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_94 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_93 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_92 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_91 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_90 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_89 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_88 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_87 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_86 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_85 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_84 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_83 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_82 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_81 * __pyx_v_alo_e.strides[1]) )))));
+
+280: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0]-2, alo_a[q,1], alo_a[q,2],  \
+
          __pyx_t_108 = __pyx_v_p;
+          __pyx_t_107 = 0;
+          __pyx_t_106 = __pyx_v_p;
+          __pyx_t_105 = 1;
+          __pyx_t_104 = __pyx_v_p;
+          __pyx_t_103 = 2;
+          __pyx_t_102 = __pyx_v_q;
+          __pyx_t_101 = 0;
+          __pyx_t_100 = __pyx_v_q;
+          __pyx_t_99 = 1;
+          __pyx_t_98 = __pyx_v_q;
+          __pyx_t_97 = 2;
+
+281:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_96 = __pyx_v_p;
+          __pyx_t_95 = 0;
+          __pyx_t_94 = __pyx_v_q;
+          __pyx_t_93 = 0;
+          __pyx_t_92 = __pyx_v_p;
+          __pyx_t_91 = 1;
+          __pyx_t_90 = __pyx_v_q;
+          __pyx_t_89 = 1;
+          __pyx_t_88 = __pyx_v_p;
+          __pyx_t_87 = 2;
+          __pyx_t_86 = __pyx_v_q;
+          __pyx_t_85 = 2;
+
+282:  						      alo_e[p,i], alo_e[q,j])
+
          __pyx_t_84 = __pyx_v_p;
+          __pyx_t_83 = __pyx_v_i;
+          __pyx_t_82 = __pyx_v_q;
+          __pyx_t_81 = __pyx_v_j;
+
+283: 					t3 +=alo_a[q,1] * (alo_a[q,1] - 1) * \
+
          __pyx_t_81 = __pyx_v_q;
+          __pyx_t_82 = 1;
+          __pyx_t_83 = __pyx_v_q;
+          __pyx_t_84 = 1;
+/* … */
+          __pyx_v_t3 = (__pyx_v_t3 + (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_81 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_82 * __pyx_v_alo_a.strides[1]) ))) * ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_83 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_84 * __pyx_v_alo_a.strides[1]) ))) - 1)) * __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_85 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_86 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_87 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_88 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_89 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_90 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_91 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_92 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_93 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_94 * __pyx_v_alo_a.strides[1]) ))) - 2), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_95 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_96 * __pyx_v_alo_a.strides[1]) ))), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_97 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_98 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_99 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_100 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_101 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_102 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_103 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_104 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_105 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_106 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_107 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_108 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_109 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_110 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_111 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_112 * __pyx_v_alo_e.strides[1]) ))))));
+
+284: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1]-2, alo_a[q,2],  \
+
          __pyx_t_85 = __pyx_v_p;
+          __pyx_t_86 = 0;
+          __pyx_t_87 = __pyx_v_p;
+          __pyx_t_88 = 1;
+          __pyx_t_89 = __pyx_v_p;
+          __pyx_t_90 = 2;
+          __pyx_t_91 = __pyx_v_q;
+          __pyx_t_92 = 0;
+          __pyx_t_93 = __pyx_v_q;
+          __pyx_t_94 = 1;
+          __pyx_t_95 = __pyx_v_q;
+          __pyx_t_96 = 2;
+
+285:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_97 = __pyx_v_p;
+          __pyx_t_98 = 0;
+          __pyx_t_99 = __pyx_v_q;
+          __pyx_t_100 = 0;
+          __pyx_t_101 = __pyx_v_p;
+          __pyx_t_102 = 1;
+          __pyx_t_103 = __pyx_v_q;
+          __pyx_t_104 = 1;
+          __pyx_t_105 = __pyx_v_p;
+          __pyx_t_106 = 2;
+          __pyx_t_107 = __pyx_v_q;
+          __pyx_t_108 = 2;
+
+286:  						      alo_e[p,i], alo_e[q,j])
+
          __pyx_t_109 = __pyx_v_p;
+          __pyx_t_110 = __pyx_v_i;
+          __pyx_t_111 = __pyx_v_q;
+          __pyx_t_112 = __pyx_v_j;
+
+287: 					t3 +=alo_a[q,2] * (alo_a[q,2] - 1) * \
+
          __pyx_t_112 = __pyx_v_q;
+          __pyx_t_111 = 2;
+          __pyx_t_110 = __pyx_v_q;
+          __pyx_t_109 = 2;
+/* … */
+          __pyx_v_t3 = (__pyx_v_t3 + (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_112 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_111 * __pyx_v_alo_a.strides[1]) ))) * ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_110 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_109 * __pyx_v_alo_a.strides[1]) ))) - 1)) * __pyx_f_5aello_ovlp((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_108 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_107 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_106 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_105 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_104 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_103 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_102 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_101 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_100 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_99 * __pyx_v_alo_a.strides[1]) ))), ((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_98 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_97 * __pyx_v_alo_a.strides[1]) ))) - 2), 0, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_96 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_95 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_94 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_93 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_92 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_91 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_90 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_89 * __pyx_v_alo_o.strides[1]) )))), ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_88 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_87 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_86 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_85 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_84 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_83 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_82 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_81 * __pyx_v_alo_e.strides[1]) ))))));
+
+288: 						 ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2]-2,  \
+
          __pyx_t_108 = __pyx_v_p;
+          __pyx_t_107 = 0;
+          __pyx_t_106 = __pyx_v_p;
+          __pyx_t_105 = 1;
+          __pyx_t_104 = __pyx_v_p;
+          __pyx_t_103 = 2;
+          __pyx_t_102 = __pyx_v_q;
+          __pyx_t_101 = 0;
+          __pyx_t_100 = __pyx_v_q;
+          __pyx_t_99 = 1;
+          __pyx_t_98 = __pyx_v_q;
+          __pyx_t_97 = 2;
+
+289:  						      0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \
+
          __pyx_t_96 = __pyx_v_p;
+          __pyx_t_95 = 0;
+          __pyx_t_94 = __pyx_v_q;
+          __pyx_t_93 = 0;
+          __pyx_t_92 = __pyx_v_p;
+          __pyx_t_91 = 1;
+          __pyx_t_90 = __pyx_v_q;
+          __pyx_t_89 = 1;
+          __pyx_t_88 = __pyx_v_p;
+          __pyx_t_87 = 2;
+          __pyx_t_86 = __pyx_v_q;
+          __pyx_t_85 = 2;
+
+290:  						      alo_e[p,i], alo_e[q,j])
+
          __pyx_t_84 = __pyx_v_p;
+          __pyx_t_83 = __pyx_v_i;
+          __pyx_t_82 = __pyx_v_q;
+          __pyx_t_81 = __pyx_v_j;
+
 291: 
+
+292: 					s += (t1 + t2 - 0.5*t3) * f
+
          __pyx_v_s = (__pyx_v_s + (((__pyx_v_t1 + __pyx_v_t2) - (0.5 * __pyx_v_t3)) * __pyx_v_f));
+        }
+      }
+
 293: 
+
+294: 			kinetic[p,q] = s
+
      __pyx_t_81 = __pyx_v_p;
+      __pyx_t_82 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_kinetic.data + __pyx_t_81 * __pyx_v_kinetic.strides[0]) ) + __pyx_t_82 * __pyx_v_kinetic.strides[1]) )) = __pyx_v_s;
+
+295: 			if p != q:
+
      __pyx_t_7 = ((__pyx_v_p != __pyx_v_q) != 0);
+      if (__pyx_t_7) {
+/* … */
+      }
+    }
+  }
+
+296: 				kinetic[q,p] = kinetic[p,q]
+
        __pyx_t_82 = __pyx_v_p;
+        __pyx_t_81 = __pyx_v_q;
+        __pyx_t_83 = __pyx_v_q;
+        __pyx_t_84 = __pyx_v_p;
+        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_kinetic.data + __pyx_t_83 * __pyx_v_kinetic.strides[0]) ) + __pyx_t_84 * __pyx_v_kinetic.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_kinetic.data + __pyx_t_82 * __pyx_v_kinetic.strides[0]) ) + __pyx_t_81 * __pyx_v_kinetic.strides[1]) )));
+
 297: #----------------------------------------End Kinetic----------------------------------------|
+
 298: 
+
 299: #---------------------------------------Begin Coulomb---------------------------------------|
+
+300: 	J = np.empty([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_t_9);
+  __pyx_t_8 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 300, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_J = __pyx_t_10;
+  __pyx_t_10 = 0;
+
 301: 	cdef:
+
+302: 		double[:,:] coulomb = J
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_J, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 302, __pyx_L1_error)
+  __pyx_v_coulomb = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
 303: 		double r[3]
+
 304: 		double cp
+
 305: 
+
+306: 	for p in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+307: 		for q in range(p, nb):
+
    __pyx_t_13 = __pyx_v_nb;
+    __pyx_t_20 = __pyx_t_13;
+    for (__pyx_t_21 = __pyx_v_p; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
+      __pyx_v_q = __pyx_t_21;
+
 308: 
+
+309: 			t1 = 0.0
+
      __pyx_v_t1 = 0.0;
+
+310: 			for k in range(0, na):
+
      __pyx_t_23 = __pyx_v_na;
+      __pyx_t_26 = __pyx_t_23;
+      for (__pyx_t_113 = 0; __pyx_t_113 < __pyx_t_26; __pyx_t_113+=1) {
+        __pyx_v_k = __pyx_t_113;
+
 311: 
+
+312: 				s = 0.0
+
        __pyx_v_s = 0.0;
+
+313: 				for i in range(0, alo[p]):
+
        __pyx_t_81 = __pyx_v_p;
+        __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_81 * __pyx_v_alo.strides[0]) )));
+        __pyx_t_22 = __pyx_t_17;
+        for (__pyx_t_114 = 0; __pyx_t_114 < __pyx_t_22; __pyx_t_114+=1) {
+          __pyx_v_i = __pyx_t_114;
+
+314: 					for j in range(0, alo[q]):
+
          __pyx_t_81 = __pyx_v_q;
+          __pyx_t_24 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_81 * __pyx_v_alo.strides[0]) )));
+          __pyx_t_25 = __pyx_t_24;
+          for (__pyx_t_115 = 0; __pyx_t_115 < __pyx_t_25; __pyx_t_115+=1) {
+            __pyx_v_j = __pyx_t_115;
+
+315: 						f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
            __pyx_t_81 = __pyx_v_p;
+            __pyx_t_82 = __pyx_v_i;
+            __pyx_t_84 = __pyx_v_q;
+            __pyx_t_83 = __pyx_v_j;
+            __pyx_t_85 = __pyx_v_p;
+            __pyx_t_86 = __pyx_v_i;
+            __pyx_t_87 = __pyx_v_q;
+            __pyx_t_88 = __pyx_v_j;
+            __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_81 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_82 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_84 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_83 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_85 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_86 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_87 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_88 * __pyx_v_alo_c.strides[1]) ))));
+
+316: 						cp = alo_e[p,i] + alo_e[q,j]
+
            __pyx_t_88 = __pyx_v_p;
+            __pyx_t_87 = __pyx_v_i;
+            __pyx_t_86 = __pyx_v_q;
+            __pyx_t_85 = __pyx_v_j;
+            __pyx_v_cp = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_88 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_87 * __pyx_v_alo_e.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_86 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_85 * __pyx_v_alo_e.strides[1]) ))));
+
+317: 						for n in range(0, 3):
+
            for (__pyx_t_116 = 0; __pyx_t_116 < 3; __pyx_t_116+=1) {
+              __pyx_v_n = __pyx_t_116;
+
+318: 							r[n] = ((alo_e[p,i] * alo_o[p,n]) + (alo_e[q,j] * alo_o[q,n]))/cp - alo_x[k,n]
+
              __pyx_t_85 = __pyx_v_p;
+              __pyx_t_86 = __pyx_v_i;
+              __pyx_t_87 = __pyx_v_p;
+              __pyx_t_88 = __pyx_v_n;
+              __pyx_t_83 = __pyx_v_q;
+              __pyx_t_84 = __pyx_v_j;
+              __pyx_t_82 = __pyx_v_q;
+              __pyx_t_81 = __pyx_v_n;
+              __pyx_t_89 = __pyx_v_k;
+              __pyx_t_90 = __pyx_v_n;
+              (__pyx_v_r[__pyx_v_n]) = (((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_85 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_86 * __pyx_v_alo_e.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_87 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_88 * __pyx_v_alo_o.strides[1]) )))) + ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_83 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_84 * __pyx_v_alo_e.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_82 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_81 * __pyx_v_alo_o.strides[1]) ))))) / __pyx_v_cp) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_89 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_90 * __pyx_v_alo_x.strides[1]) ))));
+            }
+
 319: 
+
+320: 						t2 = 0.0
+
            __pyx_v_t2 = 0.0;
+
+321: 						for l in range(0, alo_a[p,0]+alo_a[q,0]+1):
+
            __pyx_t_90 = __pyx_v_p;
+            __pyx_t_89 = 0;
+            __pyx_t_81 = __pyx_v_q;
+            __pyx_t_82 = 0;
+            __pyx_t_117 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_90 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_89 * __pyx_v_alo_a.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_81 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_82 * __pyx_v_alo_a.strides[1]) )))) + 1);
+            __pyx_t_118 = __pyx_t_117;
+            for (__pyx_t_116 = 0; __pyx_t_116 < __pyx_t_118; __pyx_t_116+=1) {
+              __pyx_v_l = __pyx_t_116;
+
+322: 							for m in range(0, alo_a[p,1]+alo_a[q,1]+1):
+
              __pyx_t_82 = __pyx_v_p;
+              __pyx_t_81 = 1;
+              __pyx_t_89 = __pyx_v_q;
+              __pyx_t_90 = 1;
+              __pyx_t_119 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_82 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_81 * __pyx_v_alo_a.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_89 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_90 * __pyx_v_alo_a.strides[1]) )))) + 1);
+              __pyx_t_120 = __pyx_t_119;
+              for (__pyx_t_121 = 0; __pyx_t_121 < __pyx_t_120; __pyx_t_121+=1) {
+                __pyx_v_m = __pyx_t_121;
+
+323: 								for n in range(0, alo_a[p,2]+alo_a[q,2]+1):
+
                __pyx_t_90 = __pyx_v_p;
+                __pyx_t_89 = 2;
+                __pyx_t_81 = __pyx_v_q;
+                __pyx_t_82 = 2;
+                __pyx_t_122 = (((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_90 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_89 * __pyx_v_alo_a.strides[1]) ))) + (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_81 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_82 * __pyx_v_alo_a.strides[1]) )))) + 1);
+                __pyx_t_123 = __pyx_t_122;
+                for (__pyx_t_124 = 0; __pyx_t_124 < __pyx_t_123; __pyx_t_124+=1) {
+                  __pyx_v_n = __pyx_t_124;
+
+324: 									t2 += cye(alo_a[p,0], alo_a[q,0], l, alo_o[p,0]- alo_o[q,0], alo_e[p,i], alo_e[q,j]) * \
+
                  __pyx_t_82 = __pyx_v_p;
+                  __pyx_t_81 = 0;
+                  __pyx_t_89 = __pyx_v_q;
+                  __pyx_t_90 = 0;
+                  __pyx_t_84 = __pyx_v_p;
+                  __pyx_t_83 = 0;
+                  __pyx_t_88 = __pyx_v_q;
+                  __pyx_t_87 = 0;
+                  __pyx_t_86 = __pyx_v_p;
+                  __pyx_t_85 = __pyx_v_i;
+                  __pyx_t_91 = __pyx_v_q;
+                  __pyx_t_92 = __pyx_v_j;
+/* … */
+                  __pyx_v_t2 = (__pyx_v_t2 + (((__pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_82 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_81 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_89 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_90 * __pyx_v_alo_a.strides[1]) ))), __pyx_v_l, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_84 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_83 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_88 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_87 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_86 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_85 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_91 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_92 * __pyx_v_alo_e.strides[1]) ))), NULL) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_93 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_94 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_95 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_96 * __pyx_v_alo_a.strides[1]) ))), __pyx_v_m, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_97 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_98 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_99 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_100 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_101 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_102 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_103 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_104 * __pyx_v_alo_e.strides[1]) ))), NULL)) * __pyx_f_5aello_cye((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_105 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_106 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_107 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_108 * __pyx_v_alo_a.strides[1]) ))), __pyx_v_n, ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_109 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_110 * __pyx_v_alo_o.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_111 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_112 * __pyx_v_alo_o.strides[1]) )))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_80 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_79 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_78 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_77 * __pyx_v_alo_e.strides[1]) ))), NULL)) * __pyx_f_5aello_clmb(__pyx_v_l, __pyx_v_m, __pyx_v_n, 0, __pyx_v_cp, (__pyx_v_r[0]), (__pyx_v_r[1]), (__pyx_v_r[2]))));
+                }
+              }
+            }
+
+325: 										  cye(alo_a[p,1], alo_a[q,1], m, alo_o[p,1]- alo_o[q,1], alo_e[p,i], alo_e[q,j]) * \
+
                  __pyx_t_93 = __pyx_v_p;
+                  __pyx_t_94 = 1;
+                  __pyx_t_95 = __pyx_v_q;
+                  __pyx_t_96 = 1;
+                  __pyx_t_97 = __pyx_v_p;
+                  __pyx_t_98 = 1;
+                  __pyx_t_99 = __pyx_v_q;
+                  __pyx_t_100 = 1;
+                  __pyx_t_101 = __pyx_v_p;
+                  __pyx_t_102 = __pyx_v_i;
+                  __pyx_t_103 = __pyx_v_q;
+                  __pyx_t_104 = __pyx_v_j;
+
+326: 										  cye(alo_a[p,2], alo_a[q,2], n, alo_o[p,2]- alo_o[q,2], alo_e[p,i], alo_e[q,j]) * \
+
                  __pyx_t_105 = __pyx_v_p;
+                  __pyx_t_106 = 2;
+                  __pyx_t_107 = __pyx_v_q;
+                  __pyx_t_108 = 2;
+                  __pyx_t_109 = __pyx_v_p;
+                  __pyx_t_110 = 2;
+                  __pyx_t_111 = __pyx_v_q;
+                  __pyx_t_112 = 2;
+                  __pyx_t_80 = __pyx_v_p;
+                  __pyx_t_79 = __pyx_v_i;
+                  __pyx_t_78 = __pyx_v_q;
+                  __pyx_t_77 = __pyx_v_j;
+
 327: 										  clmb(l, m, n, 0, cp, r[0], r[1], r[2])
+
 328: 
+
+329: 						t2 = t2 * pi * 2.0 / cp
+
            __pyx_v_t2 = (((__pyx_v_t2 * __pyx_v_5aello_pi) * 2.0) / __pyx_v_cp);
+
+330: 						s += t2 * f
+
            __pyx_v_s = (__pyx_v_s + (__pyx_v_t2 * __pyx_v_f));
+          }
+        }
+
+331: 				t1 -= s * alo_z[k]
+
        __pyx_t_77 = __pyx_v_k;
+        __pyx_v_t1 = (__pyx_v_t1 - (__pyx_v_s * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_77 * __pyx_v_alo_z.strides[0]) )))));
+      }
+
+332: 			coulomb[p,q] = t1
+
      __pyx_t_77 = __pyx_v_p;
+      __pyx_t_78 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_coulomb.data + __pyx_t_77 * __pyx_v_coulomb.strides[0]) ) + __pyx_t_78 * __pyx_v_coulomb.strides[1]) )) = __pyx_v_t1;
+
+333: 			if p != q:
+
      __pyx_t_7 = ((__pyx_v_p != __pyx_v_q) != 0);
+      if (__pyx_t_7) {
+/* … */
+      }
+    }
+  }
+
+334: 				coulomb[q,p] = coulomb[p,q]
+
        __pyx_t_78 = __pyx_v_p;
+        __pyx_t_77 = __pyx_v_q;
+        __pyx_t_79 = __pyx_v_q;
+        __pyx_t_80 = __pyx_v_p;
+        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_coulomb.data + __pyx_t_79 * __pyx_v_coulomb.strides[0]) ) + __pyx_t_80 * __pyx_v_coulomb.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_coulomb.data + __pyx_t_78 * __pyx_v_coulomb.strides[0]) ) + __pyx_t_77 * __pyx_v_coulomb.strides[1]) )));
+
 335: 
+
 336: #----------------------------------------End Coulomb----------------------------------------|
+
 337: 
+
 338: #----------------------------------Begin electron repulsion---------------------------------|
+
+339: 	i = int(nb*(nb-1)/2 + nb)
+
  __pyx_v_i = ((int)(((__pyx_v_nb * (__pyx_v_nb - 1)) / 2) + __pyx_v_nb));
+
+340: 	j = (i*(i+1)/2)
+
  __pyx_v_j = ((__pyx_v_i * (__pyx_v_i + 1)) / 2);
+
+341: 	I = np.empty([j], dtype=np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_j); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_t_10);
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_10, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 341, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_v_I = __pyx_t_8;
+  __pyx_t_8 = 0;
+
 342: 	cdef:
+
+343: 		double[:] eri = I
+
  __pyx_t_125 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_I, PyBUF_WRITABLE); if (unlikely(!__pyx_t_125.memview)) __PYX_ERR(0, 343, __pyx_L1_error)
+  __pyx_v_eri = __pyx_t_125;
+  __pyx_t_125.memview = NULL;
+  __pyx_t_125.data = NULL;
+
 344: 		int idx
+
+345: 	for i in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_i = __pyx_t_6;
+
+346: 		for j in range(0, i+1):
+
    __pyx_t_117 = (__pyx_v_i + 1);
+    __pyx_t_118 = __pyx_t_117;
+    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_118; __pyx_t_13+=1) {
+      __pyx_v_j = __pyx_t_13;
+
+347: 			m = i * (i+1)/2 + j
+
      __pyx_v_m = (((__pyx_v_i * (__pyx_v_i + 1)) / 2) + __pyx_v_j);
+
+348: 			for k in range(0, nb):
+
      __pyx_t_20 = __pyx_v_nb;
+      __pyx_t_21 = __pyx_t_20;
+      for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_t_21; __pyx_t_23+=1) {
+        __pyx_v_k = __pyx_t_23;
+
+349: 				for l in range(0, k+1):
+
        __pyx_t_119 = (__pyx_v_k + 1);
+        __pyx_t_120 = __pyx_t_119;
+        for (__pyx_t_26 = 0; __pyx_t_26 < __pyx_t_120; __pyx_t_26+=1) {
+          __pyx_v_l = __pyx_t_26;
+
+350: 					n = k*(k+1)/2 + l
+
          __pyx_v_n = (((__pyx_v_k * (__pyx_v_k + 1)) / 2) + __pyx_v_l);
+
+351: 					if m >= n:
+
          __pyx_t_7 = ((__pyx_v_m >= __pyx_v_n) != 0);
+          if (__pyx_t_7) {
+/* … */
+          }
+        }
+      }
+    }
+  }
+
+352: 						idx = int(m*(m+1)/2 + n)
+
            __pyx_v_idx = ((int)(((__pyx_v_m * (__pyx_v_m + 1)) / 2) + __pyx_v_n));
+
+353: 						I[idx] = tei(alo[i], alo[j], alo[k], alo[l], alo_a, alo_n, alo_c, alo_e, alo_o, i, j, k, l)
+
            __pyx_t_77 = __pyx_v_i;
+            __pyx_t_78 = __pyx_v_j;
+            __pyx_t_80 = __pyx_v_k;
+            __pyx_t_79 = __pyx_v_l;
+            __pyx_t_8 = PyFloat_FromDouble(__pyx_f_5aello_tei((*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_77 * __pyx_v_alo.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_78 * __pyx_v_alo.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_80 * __pyx_v_alo.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_79 * __pyx_v_alo.strides[0]) ))), __pyx_v_alo_a, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_o, __pyx_v_i, __pyx_v_j, __pyx_v_k, __pyx_v_l)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 353, __pyx_L1_error)
+            __Pyx_GOTREF(__pyx_t_8);
+            if (unlikely(__Pyx_SetItemInt(__pyx_v_I, __pyx_v_idx, __pyx_t_8, int, 1, __Pyx_PyInt_From_int, 0, 0, 0) < 0)) __PYX_ERR(0, 353, __pyx_L1_error)
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+
 354: #|----------------------------------End electron repulsion----------------------------------|
+
 355: 
+
+356: 	return S, K, J, I
+
  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_INCREF(__pyx_v_S);
+  __Pyx_GIVEREF(__pyx_v_S);
+  PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_S);
+  __Pyx_INCREF(__pyx_v_K);
+  __Pyx_GIVEREF(__pyx_v_K);
+  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_K);
+  __Pyx_INCREF(__pyx_v_J);
+  __Pyx_GIVEREF(__pyx_v_J);
+  PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_v_J);
+  __Pyx_INCREF(__pyx_v_I);
+  __Pyx_GIVEREF(__pyx_v_I);
+  PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_v_I);
+  __pyx_r = __pyx_t_8;
+  __pyx_t_8 = 0;
+  goto __pyx_L0;
+
 357: 
+
 358: #---------------------------------------Begin Dipole----------------------------------------|
+
+359: cpdef aelloDipole(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, \
+
static PyObject *__pyx_pw_5aello_3aelloDipole(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5aello_aelloDipole(__Pyx_memviewslice __pyx_v_alo_n, __Pyx_memviewslice __pyx_v_alo_c, __Pyx_memviewslice __pyx_v_alo_e, __Pyx_memviewslice __pyx_v_alo_a, __Pyx_memviewslice __pyx_v_alo_o, __Pyx_memviewslice __pyx_v_alo, __Pyx_memviewslice __pyx_v_alo_z, __Pyx_memviewslice __pyx_v_alo_x, int __pyx_v_na, int __pyx_v_nb, PyObject *__pyx_v_molAtom, __Pyx_memviewslice __pyx_v_density, PyObject *__pyx_v_gauge, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_D = NULL;
+  __Pyx_memviewslice __pyx_v_dipole = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_gaugeOrigin[3];
+  int __pyx_v_direction;
+  int __pyx_v_p;
+  int __pyx_v_q;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  double __pyx_v_s;
+  double __pyx_v_f;
+  double __pyx_v_dipoleComponent[3];
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloDipole", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
+  __Pyx_AddTraceback("aello.aelloDipole", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_D);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_dipole, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5aello_3aelloDipole(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5aello_3aelloDipole(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  __Pyx_memviewslice __pyx_v_alo_n = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_c = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_e = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_a = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_o = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_z = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_x = { 0, 0, { 0 }, { 0 }, { 0 } };
+  int __pyx_v_na;
+  int __pyx_v_nb;
+  PyObject *__pyx_v_molAtom = 0;
+  __Pyx_memviewslice __pyx_v_density = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_v_gauge = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloDipole (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_alo_n,&__pyx_n_s_alo_c,&__pyx_n_s_alo_e,&__pyx_n_s_alo_a,&__pyx_n_s_alo_o,&__pyx_n_s_alo,&__pyx_n_s_alo_z,&__pyx_n_s_alo_x,&__pyx_n_s_na,&__pyx_n_s_nb,&__pyx_n_s_molAtom,&__pyx_n_s_density,&__pyx_n_s_gauge,0};
+    PyObject* values[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
+        CYTHON_FALLTHROUGH;
+        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+        CYTHON_FALLTHROUGH;
+        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+        CYTHON_FALLTHROUGH;
+        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+        CYTHON_FALLTHROUGH;
+        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+        CYTHON_FALLTHROUGH;
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_n)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_c)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 1); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_e)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 2); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_a)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 3); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_o)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 4); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 5); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  6:
+        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_z)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 6); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  7:
+        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_x)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 7); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  8:
+        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_na)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 8); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  9:
+        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nb)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 9); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case 10:
+        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molAtom)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 10); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case 11:
+        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_density)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 11); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case 12:
+        if (likely((values[12] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_gauge)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, 12); __PYX_ERR(0, 359, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "aelloDipole") < 0)) __PYX_ERR(0, 359, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 13) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+      values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+      values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+      values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
+    }
+    __pyx_v_alo_n = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_n.memview)) __PYX_ERR(0, 359, __pyx_L3_error)
+    __pyx_v_alo_c = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_c.memview)) __PYX_ERR(0, 359, __pyx_L3_error)
+    __pyx_v_alo_e = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_e.memview)) __PYX_ERR(0, 359, __pyx_L3_error)
+    __pyx_v_alo_a = __Pyx_PyObject_to_MemoryviewSlice_dsds_short(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_a.memview)) __PYX_ERR(0, 359, __pyx_L3_error)
+    __pyx_v_alo_o = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_o.memview)) __PYX_ERR(0, 359, __pyx_L3_error)
+    __pyx_v_alo = __Pyx_PyObject_to_MemoryviewSlice_ds_short(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo.memview)) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_alo_z = __Pyx_PyObject_to_MemoryviewSlice_ds_short(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_z.memview)) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_alo_x = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_x.memview)) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_na = __Pyx_PyInt_As_int(values[8]); if (unlikely((__pyx_v_na == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_nb = __Pyx_PyInt_As_int(values[9]); if (unlikely((__pyx_v_nb == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_molAtom = values[10];
+    __pyx_v_density = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[11], PyBUF_WRITABLE); if (unlikely(!__pyx_v_density.memview)) __PYX_ERR(0, 360, __pyx_L3_error)
+    __pyx_v_gauge = ((PyObject*)values[12]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("aelloDipole", 1, 13, 13, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 359, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("aello.aelloDipole", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gauge), (&PyString_Type), 1, "gauge", 1))) __PYX_ERR(0, 360, __pyx_L1_error)
+  __pyx_r = __pyx_pf_5aello_2aelloDipole(__pyx_self, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, __pyx_v_density, __pyx_v_gauge);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5aello_2aelloDipole(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_alo_n, __Pyx_memviewslice __pyx_v_alo_c, __Pyx_memviewslice __pyx_v_alo_e, __Pyx_memviewslice __pyx_v_alo_a, __Pyx_memviewslice __pyx_v_alo_o, __Pyx_memviewslice __pyx_v_alo, __Pyx_memviewslice __pyx_v_alo_z, __Pyx_memviewslice __pyx_v_alo_x, int __pyx_v_na, int __pyx_v_nb, PyObject *__pyx_v_molAtom, __Pyx_memviewslice __pyx_v_density, PyObject *__pyx_v_gauge) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloDipole", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5aello_aelloDipole(__pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, __pyx_v_density, __pyx_v_gauge, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("aello.aelloDipole", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_n, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_c, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_e, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_a, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_o, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_z, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_x, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_density, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 360: 	                    short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, double[:,:] density, str gauge):
+
 361: 
+
+362: 	D = np.empty([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+  __pyx_t_1 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 362, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_v_D = __pyx_t_5;
+  __pyx_t_5 = 0;
+
 363: 	cdef:
+
+364: 		double[:,:] dipole = D
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_D, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 364, __pyx_L1_error)
+  __pyx_v_dipole = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
+365: 		double[3] gaugeOrigin = gaugeCenter(molAtom, gauge)
+
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_gaugeCenter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 365, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_3 = NULL;
+  __pyx_t_7 = 0;
+  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_7 = 1;
+    }
+  }
+  #if CYTHON_FAST_PYCALL
+  if (PyFunction_Check(__pyx_t_4)) {
+    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_molAtom, __pyx_v_gauge};
+    __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 365, __pyx_L1_error)
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_5);
+  } else
+  #endif
+  #if CYTHON_FAST_PYCCALL
+  if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
+    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_molAtom, __pyx_v_gauge};
+    __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 365, __pyx_L1_error)
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_5);
+  } else
+  #endif
+  {
+    __pyx_t_2 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 365, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (__pyx_t_3) {
+      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __pyx_t_3 = NULL;
+    }
+    __Pyx_INCREF(__pyx_v_molAtom);
+    __Pyx_GIVEREF(__pyx_v_molAtom);
+    PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_7, __pyx_v_molAtom);
+    __Pyx_INCREF(__pyx_v_gauge);
+    __Pyx_GIVEREF(__pyx_v_gauge);
+    PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_7, __pyx_v_gauge);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 365, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (unlikely(__Pyx_carray_from_py_double(__pyx_t_5, __pyx_t_8, 3) < 0)) __PYX_ERR(0, 365, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  memcpy(&(__pyx_v_gaugeOrigin[0]), __pyx_t_8, sizeof(__pyx_v_gaugeOrigin[0]) * (3));
+
 366: 		int direction, p, q, i, j
+
 367: 		double s, f
+
 368: 		double[3] dipoleComponent
+
 369: 
+
+370: 	for direction in range(1,4):
+
  for (__pyx_t_7 = 1; __pyx_t_7 < 4; __pyx_t_7+=1) {
+    __pyx_v_direction = __pyx_t_7;
+
 371: 		#electronic component
+
+372: 		for p in range(0, nb):
+
    __pyx_t_9 = __pyx_v_nb;
+    __pyx_t_10 = __pyx_t_9;
+    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+      __pyx_v_p = __pyx_t_11;
+
+373: 			for q in range(p, -1, -1):
+
      for (__pyx_t_12 = __pyx_v_p; __pyx_t_12 > -1; __pyx_t_12-=1) {
+        __pyx_v_q = __pyx_t_12;
+
 374: 
+
+375: 				s = 0.0
+
        __pyx_v_s = 0.0;
+
+376: 				for i in range(0, alo[p]):
+
        __pyx_t_13 = __pyx_v_p;
+        __pyx_t_14 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_13 * __pyx_v_alo.strides[0]) )));
+        __pyx_t_15 = __pyx_t_14;
+        for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) {
+          __pyx_v_i = __pyx_t_16;
+
+377: 					for j in range(0, alo[q]):
+
          __pyx_t_13 = __pyx_v_q;
+          __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_13 * __pyx_v_alo.strides[0]) )));
+          __pyx_t_18 = __pyx_t_17;
+          for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
+            __pyx_v_j = __pyx_t_19;
+
+378: 						f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
            __pyx_t_13 = __pyx_v_p;
+            __pyx_t_20 = __pyx_v_i;
+            __pyx_t_21 = __pyx_v_q;
+            __pyx_t_22 = __pyx_v_j;
+            __pyx_t_23 = __pyx_v_p;
+            __pyx_t_24 = __pyx_v_i;
+            __pyx_t_25 = __pyx_v_q;
+            __pyx_t_26 = __pyx_v_j;
+            __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_13 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_20 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_21 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_22 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_23 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_25 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_26 * __pyx_v_alo_c.strides[1]) ))));
+
+379: 						s += mu([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
            __pyx_t_26 = __pyx_v_p;
+            __pyx_t_25 = 0;
+            __pyx_t_24 = __pyx_v_p;
+            __pyx_t_23 = 1;
+            __pyx_t_22 = __pyx_v_p;
+            __pyx_t_21 = 2;
+            __pyx_t_27[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_26 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_25 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_27[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_24 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_23 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_27[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_22 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_21 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_21 = __pyx_v_q;
+            __pyx_t_22 = 0;
+            __pyx_t_23 = __pyx_v_q;
+            __pyx_t_24 = 1;
+            __pyx_t_25 = __pyx_v_q;
+            __pyx_t_26 = 2;
+            __pyx_t_28[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_21 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_22 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_28[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_23 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_28[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_25 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_26 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+            __pyx_v_s = (__pyx_v_s + (__pyx_f_5aello_mu(__pyx_t_27, __pyx_t_28, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_26 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_25 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_24 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_23 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_31, __pyx_t_32, __pyx_v_gaugeOrigin, __pyx_v_direction) * __pyx_v_f));
+          }
+        }
+
+380: 							     alo_e[p,i], alo_e[q,j], \
+
            __pyx_t_26 = __pyx_v_p;
+            __pyx_t_25 = __pyx_v_i;
+            __pyx_t_24 = __pyx_v_q;
+            __pyx_t_23 = __pyx_v_j;
+
+381: 	 						      [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
            __pyx_t_22 = __pyx_v_p;
+            __pyx_t_21 = 0;
+            __pyx_t_20 = __pyx_v_p;
+            __pyx_t_13 = 1;
+            __pyx_t_29 = __pyx_v_p;
+            __pyx_t_30 = 2;
+            __pyx_t_31[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_22 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_21 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_31[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_20 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_13 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_31[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_29 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_30 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_30 = __pyx_v_q;
+            __pyx_t_29 = 0;
+            __pyx_t_13 = __pyx_v_q;
+            __pyx_t_20 = 1;
+            __pyx_t_21 = __pyx_v_q;
+            __pyx_t_22 = 2;
+            __pyx_t_32[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_30 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_29 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_32[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_13 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_20 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_32[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_21 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_22 * __pyx_v_alo_o.strides[1]) )));
+
 382: 	 						      gaugeOrigin, direction) * f
+
 383: 
+
+384: 				dipole[p, q] = s
+
        __pyx_t_23 = __pyx_v_p;
+        __pyx_t_24 = __pyx_v_q;
+        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_dipole.data + __pyx_t_23 * __pyx_v_dipole.strides[0]) ) + __pyx_t_24 * __pyx_v_dipole.strides[1]) )) = __pyx_v_s;
+
+385: 				if p != q:
+
        __pyx_t_33 = ((__pyx_v_p != __pyx_v_q) != 0);
+        if (__pyx_t_33) {
+/* … */
+        }
+      }
+    }
+
+386: 					dipole[q,p] = dipole[p,q]
+
          __pyx_t_24 = __pyx_v_p;
+          __pyx_t_23 = __pyx_v_q;
+          __pyx_t_25 = __pyx_v_q;
+          __pyx_t_26 = __pyx_v_p;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_dipole.data + __pyx_t_25 * __pyx_v_dipole.strides[0]) ) + __pyx_t_26 * __pyx_v_dipole.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_dipole.data + __pyx_t_24 * __pyx_v_dipole.strides[0]) ) + __pyx_t_23 * __pyx_v_dipole.strides[1]) )));
+
 387: 
+
+388: 		s =0.0
+
    __pyx_v_s = 0.0;
+
+389: 		for p in range(0, nb):
+
    __pyx_t_9 = __pyx_v_nb;
+    __pyx_t_10 = __pyx_t_9;
+    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+      __pyx_v_p = __pyx_t_11;
+
+390: 			for i in range(0, nb):
+
      __pyx_t_12 = __pyx_v_nb;
+      __pyx_t_16 = __pyx_t_12;
+      for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_16; __pyx_t_19+=1) {
+        __pyx_v_i = __pyx_t_19;
+
+391: 				s += -2.0 * density[p,i] * dipole[i,p]
+
        __pyx_t_23 = __pyx_v_p;
+        __pyx_t_24 = __pyx_v_i;
+        __pyx_t_26 = __pyx_v_i;
+        __pyx_t_25 = __pyx_v_p;
+        __pyx_v_s = (__pyx_v_s + ((-2.0 * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_density.data + __pyx_t_23 * __pyx_v_density.strides[0]) ) + __pyx_t_24 * __pyx_v_density.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_dipole.data + __pyx_t_26 * __pyx_v_dipole.strides[0]) ) + __pyx_t_25 * __pyx_v_dipole.strides[1]) )))));
+      }
+    }
+
 392: 
+
 393: 		#nuclear component and charge center adjustment
+
+394: 		for i in range(0, na):
+
    __pyx_t_9 = __pyx_v_na;
+    __pyx_t_10 = __pyx_t_9;
+    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+      __pyx_v_i = __pyx_t_11;
+
+395: 				s += alo_z[i] * (alo_x[i, direction-1] - gaugeOrigin[direction-1])
+
      __pyx_t_25 = __pyx_v_i;
+      __pyx_t_26 = __pyx_v_i;
+      __pyx_t_24 = (__pyx_v_direction - 1);
+      __pyx_v_s = (__pyx_v_s + ((*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_25 * __pyx_v_alo_z.strides[0]) ))) * ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_26 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_x.strides[1]) ))) - (__pyx_v_gaugeOrigin[(__pyx_v_direction - 1)]))));
+    }
+
 396: 
+
+397: 		dipoleComponent[direction-1] = s
+
    (__pyx_v_dipoleComponent[(__pyx_v_direction - 1)]) = __pyx_v_s;
+  }
+
 398: 
+
+399: 	return dipoleComponent
+
  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_5 = __Pyx_carray_to_py_double(__pyx_v_dipoleComponent, 3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 399, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_r = __pyx_t_5;
+  __pyx_t_5 = 0;
+  goto __pyx_L0;
+
 400: #|-----------------------------------------End Dipole---------------------------------------|
+
 401: 
+
 402: #----------------------------------------Begin Angular--------------------------------------|
+
 403: 
+
+404: cpdef aelloAngular(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, \
+
static PyObject *__pyx_pw_5aello_5aelloAngular(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5aello_aelloAngular(__Pyx_memviewslice __pyx_v_alo_n, __Pyx_memviewslice __pyx_v_alo_c, __Pyx_memviewslice __pyx_v_alo_e, __Pyx_memviewslice __pyx_v_alo_a, __Pyx_memviewslice __pyx_v_alo_o, __Pyx_memviewslice __pyx_v_alo, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_alo_z, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_alo_x, CYTHON_UNUSED int __pyx_v_na, int __pyx_v_nb, PyObject *__pyx_v_molAtom, PyObject *__pyx_v_gauge, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_A = NULL;
+  __Pyx_memviewslice __pyx_v_angular = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_gaugeOrigin[3];
+  int __pyx_v_direction;
+  int __pyx_v_p;
+  int __pyx_v_q;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  double __pyx_v_s;
+  double __pyx_v_f;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloAngular", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
+  __Pyx_AddTraceback("aello.aelloAngular", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_A);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_angular, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5aello_5aelloAngular(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5aello_5aelloAngular(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  __Pyx_memviewslice __pyx_v_alo_n = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_c = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_e = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_a = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_o = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_z = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_x = { 0, 0, { 0 }, { 0 }, { 0 } };
+  int __pyx_v_na;
+  int __pyx_v_nb;
+  PyObject *__pyx_v_molAtom = 0;
+  PyObject *__pyx_v_gauge = 0;
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloAngular (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_alo_n,&__pyx_n_s_alo_c,&__pyx_n_s_alo_e,&__pyx_n_s_alo_a,&__pyx_n_s_alo_o,&__pyx_n_s_alo,&__pyx_n_s_alo_z,&__pyx_n_s_alo_x,&__pyx_n_s_na,&__pyx_n_s_nb,&__pyx_n_s_molAtom,&__pyx_n_s_gauge,0};
+    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+        CYTHON_FALLTHROUGH;
+        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+        CYTHON_FALLTHROUGH;
+        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+        CYTHON_FALLTHROUGH;
+        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+        CYTHON_FALLTHROUGH;
+        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+        CYTHON_FALLTHROUGH;
+        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+        CYTHON_FALLTHROUGH;
+        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+        CYTHON_FALLTHROUGH;
+        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+        CYTHON_FALLTHROUGH;
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_n)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_c)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 1); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_e)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 2); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_a)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 3); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  4:
+        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_o)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 4); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  5:
+        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 5); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  6:
+        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_z)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 6); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  7:
+        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alo_x)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 7); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  8:
+        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_na)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 8); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  9:
+        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nb)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 9); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case 10:
+        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molAtom)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 10); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case 11:
+        if (likely((values[11] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_gauge)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, 11); __PYX_ERR(0, 404, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "aelloAngular") < 0)) __PYX_ERR(0, 404, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 12) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+      values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+      values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+    }
+    __pyx_v_alo_n = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_n.memview)) __PYX_ERR(0, 404, __pyx_L3_error)
+    __pyx_v_alo_c = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_c.memview)) __PYX_ERR(0, 404, __pyx_L3_error)
+    __pyx_v_alo_e = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_e.memview)) __PYX_ERR(0, 404, __pyx_L3_error)
+    __pyx_v_alo_a = __Pyx_PyObject_to_MemoryviewSlice_dsds_short(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_a.memview)) __PYX_ERR(0, 404, __pyx_L3_error)
+    __pyx_v_alo_o = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_o.memview)) __PYX_ERR(0, 404, __pyx_L3_error)
+    __pyx_v_alo = __Pyx_PyObject_to_MemoryviewSlice_ds_short(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo.memview)) __PYX_ERR(0, 405, __pyx_L3_error)
+    __pyx_v_alo_z = __Pyx_PyObject_to_MemoryviewSlice_ds_short(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_z.memview)) __PYX_ERR(0, 405, __pyx_L3_error)
+    __pyx_v_alo_x = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_alo_x.memview)) __PYX_ERR(0, 405, __pyx_L3_error)
+    __pyx_v_na = __Pyx_PyInt_As_int(values[8]); if (unlikely((__pyx_v_na == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 405, __pyx_L3_error)
+    __pyx_v_nb = __Pyx_PyInt_As_int(values[9]); if (unlikely((__pyx_v_nb == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 405, __pyx_L3_error)
+    __pyx_v_molAtom = values[10];
+    __pyx_v_gauge = ((PyObject*)values[11]);
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("aelloAngular", 1, 12, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 404, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("aello.aelloAngular", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_gauge), (&PyString_Type), 1, "gauge", 1))) __PYX_ERR(0, 405, __pyx_L1_error)
+  __pyx_r = __pyx_pf_5aello_4aelloAngular(__pyx_self, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, __pyx_v_gauge);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* function exit code */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5aello_4aelloAngular(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_alo_n, __Pyx_memviewslice __pyx_v_alo_c, __Pyx_memviewslice __pyx_v_alo_e, __Pyx_memviewslice __pyx_v_alo_a, __Pyx_memviewslice __pyx_v_alo_o, __Pyx_memviewslice __pyx_v_alo, __Pyx_memviewslice __pyx_v_alo_z, __Pyx_memviewslice __pyx_v_alo_x, int __pyx_v_na, int __pyx_v_nb, PyObject *__pyx_v_molAtom, PyObject *__pyx_v_gauge) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloAngular", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5aello_aelloAngular(__pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_alo, __pyx_v_alo_z, __pyx_v_alo_x, __pyx_v_na, __pyx_v_nb, __pyx_v_molAtom, __pyx_v_gauge, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 404, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("aello.aelloAngular", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_n, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_c, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_e, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_a, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_o, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_z, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_x, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 405: 	                    short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, str gauge):
+
 406: 
+
+407: 	A = np.empty([3,nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = PyList_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_int_3);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_4, 2, __pyx_t_3);
+  __pyx_t_1 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 407, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_v_A = __pyx_t_5;
+  __pyx_t_5 = 0;
+
 408: 	cdef:
+
+409: 		double[:,:,:] angular = A
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_v_A, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 409, __pyx_L1_error)
+  __pyx_v_angular = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
+410: 		double[3] gaugeOrigin = gaugeCenter(molAtom, gauge)
+
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_gaugeCenter); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 410, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_3 = NULL;
+  __pyx_t_7 = 0;
+  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
+    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
+    if (likely(__pyx_t_3)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
+      __Pyx_INCREF(__pyx_t_3);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_4, function);
+      __pyx_t_7 = 1;
+    }
+  }
+  #if CYTHON_FAST_PYCALL
+  if (PyFunction_Check(__pyx_t_4)) {
+    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_molAtom, __pyx_v_gauge};
+    __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 410, __pyx_L1_error)
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_5);
+  } else
+  #endif
+  #if CYTHON_FAST_PYCCALL
+  if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
+    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_molAtom, __pyx_v_gauge};
+    __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 410, __pyx_L1_error)
+    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_5);
+  } else
+  #endif
+  {
+    __pyx_t_2 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 410, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    if (__pyx_t_3) {
+      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __pyx_t_3 = NULL;
+    }
+    __Pyx_INCREF(__pyx_v_molAtom);
+    __Pyx_GIVEREF(__pyx_v_molAtom);
+    PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_7, __pyx_v_molAtom);
+    __Pyx_INCREF(__pyx_v_gauge);
+    __Pyx_GIVEREF(__pyx_v_gauge);
+    PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_7, __pyx_v_gauge);
+    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 410, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (unlikely(__Pyx_carray_from_py_double(__pyx_t_5, __pyx_t_8, 3) < 0)) __PYX_ERR(0, 410, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  memcpy(&(__pyx_v_gaugeOrigin[0]), __pyx_t_8, sizeof(__pyx_v_gaugeOrigin[0]) * (3));
+
 411: 		int direction, p, q, i, j
+
 412: 		double s, f
+
 413: 
+
+414: 	for direction in range(0, 3):
+
  for (__pyx_t_7 = 0; __pyx_t_7 < 3; __pyx_t_7+=1) {
+    __pyx_v_direction = __pyx_t_7;
+
 415: 		#electronic component
+
+416: 		for p in range(0, nb):
+
    __pyx_t_9 = __pyx_v_nb;
+    __pyx_t_10 = __pyx_t_9;
+    for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+      __pyx_v_p = __pyx_t_11;
+
+417: 			for q in range(0, p+1):
+
      __pyx_t_12 = (__pyx_v_p + 1);
+      __pyx_t_13 = __pyx_t_12;
+      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
+        __pyx_v_q = __pyx_t_14;
+
 418: 
+
+419: 				s = 0.0
+
        __pyx_v_s = 0.0;
+
+420: 				for i in range(0, alo[p]):
+
        __pyx_t_15 = __pyx_v_p;
+        __pyx_t_16 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+        __pyx_t_17 = __pyx_t_16;
+        for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) {
+          __pyx_v_i = __pyx_t_18;
+
+421: 					for j in range(0, alo[q]):
+
          __pyx_t_15 = __pyx_v_q;
+          __pyx_t_19 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+          __pyx_t_20 = __pyx_t_19;
+          for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
+            __pyx_v_j = __pyx_t_21;
+
+422: 						f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
            __pyx_t_15 = __pyx_v_p;
+            __pyx_t_22 = __pyx_v_i;
+            __pyx_t_23 = __pyx_v_q;
+            __pyx_t_24 = __pyx_v_j;
+            __pyx_t_25 = __pyx_v_p;
+            __pyx_t_26 = __pyx_v_i;
+            __pyx_t_27 = __pyx_v_q;
+            __pyx_t_28 = __pyx_v_j;
+            __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_15 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_22 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_23 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_25 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_26 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_27 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_28 * __pyx_v_alo_c.strides[1]) ))));
+
+423: 						s += ang([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
            __pyx_t_28 = __pyx_v_p;
+            __pyx_t_27 = 0;
+            __pyx_t_26 = __pyx_v_p;
+            __pyx_t_25 = 1;
+            __pyx_t_24 = __pyx_v_p;
+            __pyx_t_23 = 2;
+            __pyx_t_29[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_28 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_27 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_29[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_26 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_25 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_29[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_24 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_23 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_23 = __pyx_v_q;
+            __pyx_t_24 = 0;
+            __pyx_t_25 = __pyx_v_q;
+            __pyx_t_26 = 1;
+            __pyx_t_27 = __pyx_v_q;
+            __pyx_t_28 = 2;
+            __pyx_t_30[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_23 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_30[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_25 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_26 * __pyx_v_alo_a.strides[1]) )));
+            __pyx_t_30[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_27 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_28 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+            __pyx_v_s = (__pyx_v_s + (__pyx_f_5aello_ang(__pyx_t_29, __pyx_t_30, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_28 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_27 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_26 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_25 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_33, __pyx_t_34, __pyx_v_gaugeOrigin, (__pyx_v_direction + 1)) * __pyx_v_f));
+          }
+        }
+
+424: 							     alo_e[p,i], alo_e[q,j], \
+
            __pyx_t_28 = __pyx_v_p;
+            __pyx_t_27 = __pyx_v_i;
+            __pyx_t_26 = __pyx_v_q;
+            __pyx_t_25 = __pyx_v_j;
+
+425: 	 						      [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
            __pyx_t_24 = __pyx_v_p;
+            __pyx_t_23 = 0;
+            __pyx_t_22 = __pyx_v_p;
+            __pyx_t_15 = 1;
+            __pyx_t_31 = __pyx_v_p;
+            __pyx_t_32 = 2;
+            __pyx_t_33[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_24 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_23 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_33[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_22 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_33[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_31 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_32 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_32 = __pyx_v_q;
+            __pyx_t_31 = 0;
+            __pyx_t_15 = __pyx_v_q;
+            __pyx_t_22 = 1;
+            __pyx_t_23 = __pyx_v_q;
+            __pyx_t_24 = 2;
+            __pyx_t_34[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_32 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_31 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_34[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_22 * __pyx_v_alo_o.strides[1]) )));
+            __pyx_t_34[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_23 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_24 * __pyx_v_alo_o.strides[1]) )));
+
 426: 	 						      gaugeOrigin, direction+1) * f
+
 427: 
+
+428: 				angular[direction, p, q] = s
+
        __pyx_t_25 = __pyx_v_direction;
+        __pyx_t_26 = __pyx_v_p;
+        __pyx_t_27 = __pyx_v_q;
+        *((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angular.data + __pyx_t_25 * __pyx_v_angular.strides[0]) ) + __pyx_t_26 * __pyx_v_angular.strides[1]) ) + __pyx_t_27 * __pyx_v_angular.strides[2]) )) = __pyx_v_s;
+
+429: 				if p != q:
+
        __pyx_t_35 = ((__pyx_v_p != __pyx_v_q) != 0);
+        if (__pyx_t_35) {
+/* … */
+        }
+      }
+    }
+  }
+
+430: 					angular[direction,q,p] = -angular[direction,p,q]
+
          __pyx_t_27 = __pyx_v_direction;
+          __pyx_t_26 = __pyx_v_p;
+          __pyx_t_25 = __pyx_v_q;
+          __pyx_t_28 = __pyx_v_direction;
+          __pyx_t_24 = __pyx_v_q;
+          __pyx_t_23 = __pyx_v_p;
+          *((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angular.data + __pyx_t_28 * __pyx_v_angular.strides[0]) ) + __pyx_t_24 * __pyx_v_angular.strides[1]) ) + __pyx_t_23 * __pyx_v_angular.strides[2]) )) = (-(*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_angular.data + __pyx_t_27 * __pyx_v_angular.strides[0]) ) + __pyx_t_26 * __pyx_v_angular.strides[1]) ) + __pyx_t_25 * __pyx_v_angular.strides[2]) ))));
+
 431: 
+
 432: 
+
 433: 
+
+434: 	return A
+
  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_A);
+  __pyx_r = __pyx_v_A;
+  goto __pyx_L0;
+
 435: 
+
 436: #|----------------------------------------End Angular---------------------------------------|
+
 437: 
+
 438: #|---------------------------------------fock build-----------------------------------------|
+
+439: cdef long iEri(long i, long j, long k, long l):
+
static long __pyx_f_5aello_iEri(long __pyx_v_i, long __pyx_v_j, long __pyx_v_k, long __pyx_v_l) {
+  long __pyx_v_p;
+  long __pyx_v_q;
+  long __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("iEri", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_WriteUnraisable("aello.iEri", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 440: 	#eri indexing
+
 441: 	cdef:
+
+442: 		long p = max(i*(i+1)//2 + j, j*(j+1)//2 + i)
+
  __pyx_t_1 = (((__pyx_v_j * (__pyx_v_j + 1)) / 2) + __pyx_v_i);
+  __pyx_t_2 = (((__pyx_v_i * (__pyx_v_i + 1)) / 2) + __pyx_v_j);
+  if (((__pyx_t_1 > __pyx_t_2) != 0)) {
+    __pyx_t_3 = __pyx_t_1;
+  } else {
+    __pyx_t_3 = __pyx_t_2;
+  }
+  __pyx_v_p = __pyx_t_3;
+
+443: 		long q = max(k*(k+1)//2 + l, l*(l+1)//2 + k)
+
  __pyx_t_3 = (((__pyx_v_l * (__pyx_v_l + 1)) / 2) + __pyx_v_k);
+  __pyx_t_1 = (((__pyx_v_k * (__pyx_v_k + 1)) / 2) + __pyx_v_l);
+  if (((__pyx_t_3 > __pyx_t_1) != 0)) {
+    __pyx_t_2 = __pyx_t_3;
+  } else {
+    __pyx_t_2 = __pyx_t_1;
+  }
+  __pyx_v_q = __pyx_t_2;
+
 444: 
+
+445: 	return  long(max(p*(p+1)//2 + q, q*(q+1)//2 + p))
+
  __pyx_t_2 = (((__pyx_v_q * (__pyx_v_q + 1)) / 2) + __pyx_v_p);
+  __pyx_t_3 = (((__pyx_v_p * (__pyx_v_p + 1)) / 2) + __pyx_v_q);
+  if (((__pyx_t_2 > __pyx_t_3) != 0)) {
+    __pyx_t_1 = __pyx_t_2;
+  } else {
+    __pyx_t_1 = __pyx_t_3;
+  }
+  __pyx_t_4 = __Pyx_PyInt_From_long(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 445, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyLong_Type)), __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 445, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_1 = __Pyx_PyInt_As_long(__pyx_t_5); if (unlikely((__pyx_t_1 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 445, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_r = __pyx_t_1;
+  goto __pyx_L0;
+
 446: 
+
 447: 
+
+448: cpdef aelloFock(long n, double[:,:] H, double[:] eri, double[:,:] D):
+
static PyObject *__pyx_pw_5aello_7aelloFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5aello_aelloFock(long __pyx_v_n, __Pyx_memviewslice __pyx_v_H, __Pyx_memviewslice __pyx_v_eri, __Pyx_memviewslice __pyx_v_D, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_fock = NULL;
+  PyObject *__pyx_v_g = NULL;
+  long __pyx_v_i;
+  long __pyx_v_m;
+  long __pyx_v_k;
+  long __pyx_v_l;
+  __Pyx_memviewslice __pyx_v_F = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_G = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloFock", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
+  __Pyx_AddTraceback("aello.aelloFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_fock);
+  __Pyx_XDECREF(__pyx_v_g);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_F, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_G, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5aello_7aelloFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5aello_7aelloFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  long __pyx_v_n;
+  __Pyx_memviewslice __pyx_v_H = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_eri = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_D = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloFock (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_n,&__pyx_n_s_H,&__pyx_n_s_eri,&__pyx_n_s_D,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_H)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloFock", 1, 4, 4, 1); __PYX_ERR(0, 448, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_eri)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloFock", 1, 4, 4, 2); __PYX_ERR(0, 448, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_D)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("aelloFock", 1, 4, 4, 3); __PYX_ERR(0, 448, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "aelloFock") < 0)) __PYX_ERR(0, 448, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+    }
+    __pyx_v_n = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_n == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 448, __pyx_L3_error)
+    __pyx_v_H = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_H.memview)) __PYX_ERR(0, 448, __pyx_L3_error)
+    __pyx_v_eri = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_eri.memview)) __PYX_ERR(0, 448, __pyx_L3_error)
+    __pyx_v_D = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_D.memview)) __PYX_ERR(0, 448, __pyx_L3_error)
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("aelloFock", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 448, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("aello.aelloFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5aello_6aelloFock(__pyx_self, __pyx_v_n, __pyx_v_H, __pyx_v_eri, __pyx_v_D);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5aello_6aelloFock(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_n, __Pyx_memviewslice __pyx_v_H, __Pyx_memviewslice __pyx_v_eri, __Pyx_memviewslice __pyx_v_D) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("aelloFock", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5aello_aelloFock(__pyx_v_n, __pyx_v_H, __pyx_v_eri, __pyx_v_D, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 448, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("aello.aelloFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __PYX_XDEC_MEMVIEW(&__pyx_v_H, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_eri, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_D, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 449: 	#fast Fock build
+
+450: 	fock = np.empty([n,n], dtype=np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+  __pyx_t_1 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 450, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_v_fock = __pyx_t_5;
+  __pyx_t_5 = 0;
+
+451: 	g    = np.empty([n,n], dtype=np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_5);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_5);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
+  __pyx_t_5 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 451, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_g = __pyx_t_1;
+  __pyx_t_1 = 0;
+
 452: 	cdef:
+
 453: 		long i, m, k, l
+
+454: 		double[:,:] F = fock
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fock, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 454, __pyx_L1_error)
+  __pyx_v_F = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
+455: 		double[:,:] G = g
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_g, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 455, __pyx_L1_error)
+  __pyx_v_G = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
 456: 
+
+457: 	for i in range(0, n):
+
  __pyx_t_7 = __pyx_v_n;
+  __pyx_t_8 = __pyx_t_7;
+  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+    __pyx_v_i = __pyx_t_9;
+
+458: 		for m in range(0, n):
+
    __pyx_t_10 = __pyx_v_n;
+    __pyx_t_11 = __pyx_t_10;
+    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
+      __pyx_v_m = __pyx_t_12;
+
+459: 			G[i,m] = 0.0
+
      __pyx_t_13 = __pyx_v_i;
+      __pyx_t_14 = __pyx_v_m;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_13 * __pyx_v_G.strides[0]) ) + __pyx_t_14 * __pyx_v_G.strides[1]) )) = 0.0;
+
+460: 			for k in range(0, n):
+
      __pyx_t_15 = __pyx_v_n;
+      __pyx_t_16 = __pyx_t_15;
+      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
+        __pyx_v_k = __pyx_t_17;
+
+461: 				for l in range(0, n):
+
        __pyx_t_18 = __pyx_v_n;
+        __pyx_t_19 = __pyx_t_18;
+        for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
+          __pyx_v_l = __pyx_t_20;
+
+462: 					G[i,m] += D[k,l] * ( 2* eri[iEri(i,m,k,l)] - eri[iEri(i,k,m,l)])
+
          __pyx_t_14 = __pyx_v_k;
+          __pyx_t_13 = __pyx_v_l;
+          __pyx_t_21 = __pyx_f_5aello_iEri(__pyx_v_i, __pyx_v_m, __pyx_v_k, __pyx_v_l);
+          __pyx_t_22 = __pyx_f_5aello_iEri(__pyx_v_i, __pyx_v_k, __pyx_v_m, __pyx_v_l);
+          __pyx_t_23 = __pyx_v_i;
+          __pyx_t_24 = __pyx_v_m;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_23 * __pyx_v_G.strides[0]) ) + __pyx_t_24 * __pyx_v_G.strides[1]) )) += ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_D.data + __pyx_t_14 * __pyx_v_D.strides[0]) ) + __pyx_t_13 * __pyx_v_D.strides[1]) ))) * ((2.0 * (*((double *) ( /* dim=0 */ (__pyx_v_eri.data + __pyx_t_21 * __pyx_v_eri.strides[0]) )))) - (*((double *) ( /* dim=0 */ (__pyx_v_eri.data + __pyx_t_22 * __pyx_v_eri.strides[0]) )))));
+        }
+      }
+
+463: 			F[i,m] = H[i,m] + G[i,m]
+
      __pyx_t_22 = __pyx_v_i;
+      __pyx_t_21 = __pyx_v_m;
+      __pyx_t_13 = __pyx_v_i;
+      __pyx_t_14 = __pyx_v_m;
+      __pyx_t_24 = __pyx_v_i;
+      __pyx_t_23 = __pyx_v_m;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_F.data + __pyx_t_24 * __pyx_v_F.strides[0]) ) + __pyx_t_23 * __pyx_v_F.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_H.data + __pyx_t_22 * __pyx_v_H.strides[0]) ) + __pyx_t_21 * __pyx_v_H.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_13 * __pyx_v_G.strides[0]) ) + __pyx_t_14 * __pyx_v_G.strides[1]) ))));
+    }
+  }
+
 464: 
+
+465: 	return fock, G
+
  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_G, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 465, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_v_fock);
+  __Pyx_GIVEREF(__pyx_v_fock);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fock);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_2;
+  __pyx_t_2 = 0;
+  goto __pyx_L0;
+
 466: 
+
 467: #|------------------------------------End Fock Build-------------------------------------|
+
 468: 
+
 469: #|----------------------------------Complex Fock Build-----------------------------------|
+
+470: cpdef tdhfFock(long n, double complex[:,:] D, double complex[:,:] H, double complex[:] eri):
+
static PyObject *__pyx_pw_5aello_9tdhfFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_5aello_tdhfFock(long __pyx_v_n, __Pyx_memviewslice __pyx_v_D, __Pyx_memviewslice __pyx_v_H, __Pyx_memviewslice __pyx_v_eri, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  PyObject *__pyx_v_fock = NULL;
+  PyObject *__pyx_v_g = NULL;
+  long __pyx_v_i;
+  long __pyx_v_m;
+  long __pyx_v_k;
+  long __pyx_v_l;
+  __Pyx_memviewslice __pyx_v_F = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_G = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("tdhfFock", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
+  __Pyx_AddTraceback("aello.tdhfFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_fock);
+  __Pyx_XDECREF(__pyx_v_g);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_F, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_G, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_5aello_9tdhfFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_5aello_9tdhfFock(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  long __pyx_v_n;
+  __Pyx_memviewslice __pyx_v_D = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_H = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_eri = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("tdhfFock (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_n,&__pyx_n_s_D,&__pyx_n_s_H,&__pyx_n_s_eri,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_D)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("tdhfFock", 1, 4, 4, 1); __PYX_ERR(0, 470, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_H)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("tdhfFock", 1, 4, 4, 2); __PYX_ERR(0, 470, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_eri)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("tdhfFock", 1, 4, 4, 3); __PYX_ERR(0, 470, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tdhfFock") < 0)) __PYX_ERR(0, 470, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+    }
+    __pyx_v_n = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_n == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L3_error)
+    __pyx_v_D = __Pyx_PyObject_to_MemoryviewSlice_dsds___pyx_t_double_complex(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_D.memview)) __PYX_ERR(0, 470, __pyx_L3_error)
+    __pyx_v_H = __Pyx_PyObject_to_MemoryviewSlice_dsds___pyx_t_double_complex(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_H.memview)) __PYX_ERR(0, 470, __pyx_L3_error)
+    __pyx_v_eri = __Pyx_PyObject_to_MemoryviewSlice_ds___pyx_t_double_complex(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_eri.memview)) __PYX_ERR(0, 470, __pyx_L3_error)
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("tdhfFock", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 470, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("aello.tdhfFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_5aello_8tdhfFock(__pyx_self, __pyx_v_n, __pyx_v_D, __pyx_v_H, __pyx_v_eri);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_5aello_8tdhfFock(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_n, __Pyx_memviewslice __pyx_v_D, __Pyx_memviewslice __pyx_v_H, __Pyx_memviewslice __pyx_v_eri) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("tdhfFock", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_5aello_tdhfFock(__pyx_v_n, __pyx_v_D, __pyx_v_H, __pyx_v_eri, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("aello.tdhfFock", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __PYX_XDEC_MEMVIEW(&__pyx_v_D, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_H, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_eri, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 471: 	#complex fock build for tdhf
+
+472: 	fock = np.empty([n,n], dtype=np.cdouble)
+
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GIVEREF(__pyx_t_1);
+  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+  __pyx_t_1 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_4);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
+  __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_cdouble); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 472, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_v_fock = __pyx_t_5;
+  __pyx_t_5 = 0;
+
+473: 	g    = np.empty([n,n], dtype=np.cdouble)
+
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_n); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_5);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_5);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
+  __pyx_t_5 = 0;
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_cdouble); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 473, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_g = __pyx_t_1;
+  __pyx_t_1 = 0;
+
 474: 	cdef:
+
 475: 		long i, m, k, l
+
+476: 		double complex[:,:] F = fock
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds___pyx_t_double_complex(__pyx_v_fock, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 476, __pyx_L1_error)
+  __pyx_v_F = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
+477: 		double complex[:,:] G = g
+
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds___pyx_t_double_complex(__pyx_v_g, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 477, __pyx_L1_error)
+  __pyx_v_G = __pyx_t_6;
+  __pyx_t_6.memview = NULL;
+  __pyx_t_6.data = NULL;
+
 478: 
+
+479: 	for i in range(0, n):
+
  __pyx_t_7 = __pyx_v_n;
+  __pyx_t_8 = __pyx_t_7;
+  for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
+    __pyx_v_i = __pyx_t_9;
+
+480: 		for m in range(0, n):
+
    __pyx_t_10 = __pyx_v_n;
+    __pyx_t_11 = __pyx_t_10;
+    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
+      __pyx_v_m = __pyx_t_12;
+
+481: 			G[i,m] = 0.0
+
      __pyx_t_13 = __pyx_v_i;
+      __pyx_t_14 = __pyx_v_m;
+      *((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_13 * __pyx_v_G.strides[0]) ) + __pyx_t_14 * __pyx_v_G.strides[1]) )) = __pyx_t_double_complex_from_parts(0.0, 0);
+
+482: 			for k in range(0, n):
+
      __pyx_t_15 = __pyx_v_n;
+      __pyx_t_16 = __pyx_t_15;
+      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
+        __pyx_v_k = __pyx_t_17;
+
+483: 				for l in range(0, n):
+
        __pyx_t_18 = __pyx_v_n;
+        __pyx_t_19 = __pyx_t_18;
+        for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
+          __pyx_v_l = __pyx_t_20;
+
+484: 					G[i,m] = G[i,m] + D[k,l] * ( 2.0 * eri[iEri(i,m,k,l)] - eri[iEri(i,k,m,l)])
+
          __pyx_t_14 = __pyx_v_i;
+          __pyx_t_13 = __pyx_v_m;
+          __pyx_t_21 = __pyx_v_k;
+          __pyx_t_22 = __pyx_v_l;
+          __pyx_t_23 = __pyx_f_5aello_iEri(__pyx_v_i, __pyx_v_m, __pyx_v_k, __pyx_v_l);
+          __pyx_t_24 = __pyx_f_5aello_iEri(__pyx_v_i, __pyx_v_k, __pyx_v_m, __pyx_v_l);
+          __pyx_t_25 = __pyx_v_i;
+          __pyx_t_26 = __pyx_v_m;
+          *((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_25 * __pyx_v_G.strides[0]) ) + __pyx_t_26 * __pyx_v_G.strides[1]) )) = __Pyx_c_sum_double((*((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_14 * __pyx_v_G.strides[0]) ) + __pyx_t_13 * __pyx_v_G.strides[1]) ))), __Pyx_c_prod_double((*((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_D.data + __pyx_t_21 * __pyx_v_D.strides[0]) ) + __pyx_t_22 * __pyx_v_D.strides[1]) ))), __Pyx_c_diff_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(2.0, 0), (*((__pyx_t_double_complex *) ( /* dim=0 */ (__pyx_v_eri.data + __pyx_t_23 * __pyx_v_eri.strides[0]) )))), (*((__pyx_t_double_complex *) ( /* dim=0 */ (__pyx_v_eri.data + __pyx_t_24 * __pyx_v_eri.strides[0]) ))))));
+        }
+      }
+
+485: 			F[i,m] = H[i,m] + G[i,m]
+
      __pyx_t_24 = __pyx_v_i;
+      __pyx_t_23 = __pyx_v_m;
+      __pyx_t_22 = __pyx_v_i;
+      __pyx_t_21 = __pyx_v_m;
+      __pyx_t_13 = __pyx_v_i;
+      __pyx_t_14 = __pyx_v_m;
+      *((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_F.data + __pyx_t_13 * __pyx_v_F.strides[0]) ) + __pyx_t_14 * __pyx_v_F.strides[1]) )) = __Pyx_c_sum_double((*((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_H.data + __pyx_t_24 * __pyx_v_H.strides[0]) ) + __pyx_t_23 * __pyx_v_H.strides[1]) ))), (*((__pyx_t_double_complex *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_G.data + __pyx_t_22 * __pyx_v_G.strides[0]) ) + __pyx_t_21 * __pyx_v_G.strides[1]) ))));
+    }
+  }
+
 486: 
+
+487: 	return fock
+
  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_fock);
+  __pyx_r = __pyx_v_fock;
+  goto __pyx_L0;
+
 488: 
+
 489: 
+
 490: 
+
 491: 
+
diff --git a/document/aello.md b/document/aello.md new file mode 100644 index 0000000..2fdb5a9 --- /dev/null +++ b/document/aello.md @@ -0,0 +1,79 @@ +# aello Module - cython fast integrals + +This project was not designed to be fast, the emphasis was on clarity rather than conciseness or speed. However this is an exercise on speeding up an implementation. Note it is a *bolt-on* to existing code and not how perhaps one would design a cython project from the beginning. The module is called *aello* who was one of the Harpies in Greek mythology the name means *storm-swift*. The aim of any python-to-cython project is to reduce as much as possible the python interaction with the code leaving c to do the most work possible. The approach I took here was to convert the python basis and atom class arrays (numpy) to c-memory views and use those. This is done by the following method... + + me = np.empty([nb,ng], dtype = np.double) #define a variable, in this case for the exponent array + cdef double[:,:] alo_e = me #equate it to a memory view + +Then populate the view and use it for all calculations. Use np.empty rather than np.zeros, it save a bit of time and helps with debugging. I've also reduced the function calls by expanding some of the integral module functions in-line. (Because the exponent, coefficient and normal array length varies within a basis set there is an extra array which holds the number of primatives for each basis function.) If you compile aello via **cython aello.pyx -a** and get an html file it shows how the code is interacting with the python interpreter you will see that most of the calculation is in white (good) with only the python->c code in yellow (bad). The loops are free of yellow which is key to a successful conversion. The routines are + +1. **cdef double cye(int ia, int ja, int type, double r, double ie, double je)** + + parameters - *ia, ja* are momenta values, *type* determines the calculation mode, *r* is the seperation vector between + atoms i and j, and *ie, je* are the exponents of atom centers i and j. Cython version of e from integral module. + +2. **cdef double ovlp(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, int type, double r0, double r1, double r2, double ie, double je):** + + parameters - *ia0-ja2* are momenta values of atoms i and j, *type* as before, *r0-r2* are components of vector between + atoms i and j, and *ie, je* are the exponents of atom centers i and j, Cython version of overlap from integral module. + +3. **cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2)** + + parameters - *l, m, n* components of sum of momenta on atoms i and j plus 1, *bf* Boys function parameter, *r0-r2* + components of vector from atom i to atom j. Cython version of j from integral module. + +4. **cdef double boys(double m,double T)** + + Direct copy of similar routine from integral module. Use *from scipy.special.cython_special cimport hyp1f1* + +5. **cdef double tei(int al0, int al1, int al2, int al3, short[:,:] aa, double[:,:] an, double[:,:] ac,double[:,:] ae, double[:,:] ao, int i, int j, int k, int l):** + + parameters - *al0-al3* number of primatives on basis on atoms i,j,k and l, *aa* array of primative lengths, *an* array + of normals, *ac* array of coefficients, *ae* array of exponents, *ao* array of basis atom centers and *i,j,k,l* basis + numbers ie . Note by array is meant a memory view. + +6. **cdef double mu(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction):** + + parameters - *ia, ja* are momenta on atoms i and j, *ie, je* are expononts, *ir, jr* are atom centers, *kr* is charge center and *direction* the cartesian axis being computed. + +7. **cdef double ang(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction):** + + parameters - *ia, ja* are momenta on atoms i and j, *ie, je* are expononts, *ir, jr* are atom centers, *kr* is charge center and *direction* the cartesian axis being computed. + + +8. **def aello(molAtom, molBasis, mode = 'scf', density = None, gauge = None):** + + parameters - *molAtom* array of atom objects, *molBasis* array of basis objects. *mode* is type of integrals returned, either ['scf'|'dipole']. Returns S, K, J and I (overlap,kinetic, coulomb and eri) in 'scf' mode, dipole component matrices in 'dipole' mode. + +Does it work? Water DZ basis without aello - 1m 42s, with aello - 11s and\ +                         Water 6-31g       without aello - 1m 16s, with aello - 9s\ +so yes it's faster but still quite slow because speed has not been a consideration in writing the code. +The integral routines are quite efficient, eg a aug-cc-pvdz integral comparison with McMurchie-Davidson (Josh Goings)...\ +                        harpy            McMurchie-Davidson\ +1-electron       0.046                             3.164\ +2-electron       30.147                        35.482 + + 9. **cpdef aelloDipole(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, double[:,:] density):** + + parameters - *alo* \_n, \_c, \_e, \_o are basis normal, coefficients, exponents and centers. *alo* is the number of primatives, *alo* \_z and \_x are the atomic numbers and centers. *na* and *nb* the number of atoms and bases, *molAtom* is the molecular atom object and *density* the converged final density matrix. Returns a vector of dipole components. + +10. **cpdef aelloAngular(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, gauge):** + + parameters - *alo* \_n, \_c, \_e, \_o are basis normal, coefficients, exponents and centers. *alo* is the number of primatives, *alo* \_z and \_x are the atomic numbers and centers. *na* and *nb* the number of atoms and bases, *molAtom* is the molecular atom object and *gauge* is the gauge type as string. Returns a vector of angular components. + +The other major bottleneck is the construction of the fock matrix. There are two aello cython routines to accelerate this. + +11. **iEri(long i, long j, long k, long l)** + + parameters - *i,j,k,l* are indexes into the eri tensor. + +12. **aelloFock(long n, double[:,:] H, double[:] eri, double[:,:] D))** + + parameters - *n* is the number of basis functions, *H* the core hamiltonian, *eri* the 2-electron repulsion integrals and *D* the density matrix. + +13. **tdhfFock(long n, double complex[:,:] D, double complex[:,:] H, double complex[:] eri):** + + parameters - *n* is the number of basis functions, *H* the core hamiltonian, *eri* the 2-electron repulsion integrals and *D* the density matrix. This is a complex arithmetic version of **aelloFock** above. Especially written for the TDHF module. It is an example of how to use complex with Cython. + + +It's still not fast but it is a lot faster. The file *aello.html* produced by *cython aello.pyx -a* is included in document directory. diff --git a/document/atom.md b/document/atom.md new file mode 100644 index 0000000..f61b506 --- /dev/null +++ b/document/atom.md @@ -0,0 +1,149 @@ +# Atom Module - basic geometry + +Much of this module follows the properties considered in +[Crawford projects] (https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2301) + +1. weight - list of atomic weights (H - Xe) +2. covalentRadius - list of covalent radii (H - Xe). Used to infer joins +3. symbol - list of atomic symbols (H - Xe) +4. __init__ - instantiate atom class object.\ +            id - identifier, eg *H1*\ +            number - atomic number, eg *4*\ +            center - atomic center, \[x,y,z]\ +            joins - connected atoms, \[] + +5. **seperation(atoms, i, j, unit=*b*)** + + parameters - *atoms* is array of atom class objects, *i*, *j* are atom objects, *unit = b* for Bohr + *a* for Angstrom. Returns the interatom distance between atoms i and j. + +6. **angle(atoms, i, j, k)** + + parameters - *atoms* is array of atom class objects, *i*, *j*, *k* are atom objects. Returns the + angle between vectors **ji** and **jk** calculated as arccos of the dot product of + the normalised vectors. Angle is in degrees. + +7. **oopAngle(atoms, i, j, k, l)** + + parameters - *atoms* is array of atom class objects, *i*, *j*, *k*, *l* are atom objects. Returns + the angle between **ik** and normal to plane **jkl**, this is the out-of-plane angle. + Calculated as arcsin of dot product of **ik** and the cross-product **jk** X **lk**. + Angle is in degrees. + +8. **dihedral(atoms, i, j, k, l)** + + parameters - *atoms* is array of atom class objects, *i*, *j*, *k*, *l* are atom objects. Returns + the angle planes **ijk** and **jkl**, this is the dihedral or torsional angle. Angle + is in degrees. + +10. **massCenter(atoms)** + + parameters - *atoms* is array of atom class objects. Calculates the coordinates of the center of mass + of the system. Needs weight list. Returns a list [x,y,z]. + +11. **isBond(atoms, i,j)** + + parameters - *atoms* is array of atom class objects, *i*, *j* are atom objects. Using the covalent + radii determines if atom i is within bond range of atom j. Factor 1.6 is to give a bit + of leeway in distance. Returns a boolean. Returns **False** if *i* equals **j**. + +12. **bondMatrix(atoms)** + + parameters - *atoms* is array of atom class objects. Returns a connection matrix. Cell \[i,j] is 0 if no + connection, 1 otherwise. + +13. **inertiaTensor(atoms)** + + parameters - *atoms* is array of atom class objects.. Returns a matrix of the inertia Tensor. Uses + massCenter function. + +14. **principalMoments(atoms)** + + parameters - *atoms* is array of atom class objects. Returns the principal moments of inertia. Uses + inertiaTensor function which is diagonalised by numpy.eig. Returns list of principal + moments sorted by argsort in ascending order. + +15. **rotor(atoms)** + + parameters - *atoms* is array of atom class objects. Returns the rotor type as a string. Uses + principalMoments function. + +16. **rotationalConstants(atoms)** + + parameters - *atoms* is array of atom class objects. Returns the rotational constants, uses principalMoments + function. Returns [A,B,C] + +17. **nuclearRepulsion(atoms, charge)** + + parameters - *atoms* is array of atom class objects, and *charge* is the molecular charge (remember closed shell + only for RHF. Uses *atoms*.number property. Returns the nuclear repulsion energy as a float. + +18. **nuclearChargeCenter(atoms)** + + parameters - *atoms* is array of atom class objects. Returns the center of the molecules nuclear charges as list + [x,y,z], Uses *atoms*.number property. + +19. **getMass(atoms, atom)** + + parameters - *atoms* is array of atom class objects and *atom* is a member of the atom class. Returns the atomic weight of *atom*. + +20. **getNumber(atomicSymbol)** + + parameters - *atomicSymbol* is the recognised symbol for the atom type. Return the atomic number corresponding to the symbol. + +21. **gaugeCenter(atoms, mode = 'origin')** + + parameters - *atoms* is array of atom class objects and *mode* is the type of gauge center +['origin' | 'mass' | 'nuclear charge']. 'origin' is the origin of the Cartesian coordinate system, 'mass' is center of molecular mass and 'nuclear charge' is the center of the positive molecular charges. Default is 'origin'. If *mode* is passed as an array then the routine will pass this point on and evaluation will occur at that point rather than at a named origin. + +22. **getConstant(unit):** + + parameters - *unit* is a string representing the conversions. *unit* can be | 'bohr->angstom' | 'picometre->bohr' | 'radian->degree' | 'planck' | 'bohr->cm' | 'c' | 'dalton->gm' | 'em2->amu' | 'atu->femtosecond' | 'hartree-eV' | 'au->debye' | 'alpha' | 'eV[-1]->nm' | 'Eh' | 'avogardo' | 'electric constant' | 'e' | 'bohr magneton' |. Returns the value of the constant. The constants are + +| mnemonic | value | description | +|-------------|-----------|-----------------| +| *bohr->angstrom* | 0.52917721092 | conversion factor atomic units to Angstrom | +| *picometre->bohr* | 0.018897261339213 | 10-12 metres in atomic units | +| *radian->degree* | 180/π | radian angles to degrees | +| *planck* | 6.62607015e-34 | Plancks constant (*h*) | +| *bohr->cm* | 0.529177249e-10 | atomic units to centimetres | +| *c* | 2.99792458e10 | speed of light in cm | +| *dalton->gm* | 1.6605402e-27 | unified mass units to gm | +| *em2->amu* | 1822.8884850 | electron mass2 to atomic mass units | +| *atu->femtosecond* | 0.02418884254 | atomic time units to 10-15 seconds | +| *hartree->eV* | 27.21138505 | atomic energy units to electron volts | +| *au->debye* | 2.541580253 | atomic electric dipole moment units to Debye | +| *alpha* | 0.00729735256 | fine-structure constant | +| *Ev[-1]->nm* | 1239.841701 | reciprocal electron volts to nanometres (10-9) | +| *Eh* | 4.359744722207e-18 | atomic unit of energy in Joules | +| *avogadro* | 6.022140857e+23 | Avogadros's number mol-1 | +| *electric constant* | 8.854187817e-12 | electric constant (ε0) Fm-1 | +| *e* | 1.6021766208e-19 | elementary charge in Coulombs | +| *bohr megneton* | 9.274009994e-24 | bohr magneton μB JT-1 | +| *rydberg->eV* | 13.6056980659 | 1 Rydberg in electron volts | + +23. **zMatrix(input)** + + parameters - *input* is a list of lines representing the z-matrix input. Dummy atoms represented by **X** are supported and symbolic stretches, bends and dihedrals are allowed. Contains subroutines: + + + rodriguez(axis, theta) - generates rotation matrix for rotation about axis (unit) vector by angle theta (radians). + + + getSymbolValue(s, input) - finds the corresponding numeric value of symbol *s* in input stream *input*. + + + isSymbol(s) - determines if input stream item *s* is a symbol. Returns boolean. + + + getValue(item, type, input) - returns the numeric value of *item* of *type* stretch, bend or dihedral in *input* stream. Angles on input are degrees and are converted to radians by this routine. Calls isSymbol and getSymbolValue for symbolic representations. + + + clean(val, mode) - in mode 1 removes dummy atoms (X) from final coordinate list, in mode 2 strips leading and trailing blank lines from input stream. Internal blank lines are left as delimiters between atoms and symbols. + + + processAtom(atom, input, geo=None) - processes a line of *input* stream representing *atom*. *geo* is the current list of coordinates (needed for number of atoms > 2). + Returns tuple of atomic number of *atom* and coordinate list. + + The *input* stream is processed for each atom, dummy atoms are removed and list [id, Z, x, y, z] is returned. *id* is a sequence number base 1. + +24. **atomList(molAtom):** + + parameters - *molAtom* is an array of atom objects. Returns a list of the atomic numbers of the atoms in the molecule. + + + diff --git a/document/basis.md b/document/basis.md new file mode 100644 index 0000000..a3976d6 --- /dev/null +++ b/document/basis.md @@ -0,0 +1,67 @@ +# Basis Module - set up the molcular basis + + +1. subShell - dictionary of subShell momenta {s:p:d:f} +2. __init__ - instantiate basis class object.\ +          atom            - atomic center of orbital\ +          symbol        - subShell designation of orbitals\ +          center          - atomic center, \[x,y,z]\ +          momentum - subShell item for the orbital\ +          ex                 - list of Gaussian exponents\ +          co                 - list of Gaussian coefficients\ +          normal         - list of normalisation factors for coefficients + +3. **electronCount(atoms, charge)** + + parameters - *atoms* is array of atom class objects, *charge* is molecular charge. Calculated as sum of + atom numbers minus the charge. Returns an integer. + +4. **species(atoms)** + + parameters - *atoms* is array of atom class objects. Constructs a list of unique atom types contained in + the molecule. The returned list is sorted in ascending order so that basis file can be searched + sequentially. Returns list. + +5. **checkBasis(name, atoms)** + + parameters - *name* is the name of the basis eg *6-32g*, *atoms* is array of atom class objects. Firstly the + routine checks for a file *name*.gbf (Gaussian Basis Functions). Then the atom types returned by species are then checked against the range covered by the basis. If all checks are passed returns True else False. + +6. **principalQuantumNumber(basis)** + + parameters - *basis* is a basis object. Determines the principal quantum number (n) of the orbital. This is + the sum of the momentum components of the orbital. Returns an integer. + +7. **basisNormalise(basis)** + + parameters - *basis* is a basis object. Calulates the normalisation factor for *basis* and populates + *basis*.normal. Returns the basis object. Uses principalQuantumNumber function. + [see for details of calculation](https://content.wolfram.com/uploads/sites/19/2012/02/Ho.pdf) + +8. **buildBasis(atoms, name)** + + parameters - *atoms* is array of atom class objects, name is the string containing name of basis. Open basis + file (uses psi4 format) and cycle through unique atom list from species function. Note each atom + is in file seperated with ******, followed by an atom header eg *Br     0*. File is read + sequentially to locate relevant atom header then reads blocks of exponents and coefficients eg + *SP 3 1.0*. Routine constructs an atomic basis set for the atom type then copies to every instance of that + type in molecule. Returns a molecular basis. + +9. **orbitalType(subShell)** + + parameters - *subShell* is an element from subShell list eg \[0,1,0]. Returns a subshell type eg for \[0,1,0] + returns *py*. Returns a string. + +10. **aufbau(atom)** + + parameters - *atom* is an object. Returns the aufbau occupancy of the atom object. So for eg Oxygen returns + *1s2 2s2 2p4* but formatted for HTML output. so 1s22s22p6. + +11. **orbitalShell(molBasis)** + + parameters - *molBasis* is the molecular basis array of basis objects. Prefixes the orbital type with the shell ie px->2px and writes result back to symbol property of the basis object. + + + + + diff --git a/document/bomd.md b/document/bomd.md new file mode 100644 index 0000000..675c4b8 --- /dev/null +++ b/document/bomd.md @@ -0,0 +1,154 @@ +# Born-Oppenheimer Molecular Dynamics + +The module describes the time development of a molecule using Born-Oppenheimer molecular dynamics. + +1. **mdBornOppenheimer(timeIncrement, iterations, integrator = 'velocity-verlet', out=['plot','file']):** + + parameters - *timeIncrement* is the basic step of time in atomic time units, *iterations* are the number of timeIncrement steps to be made, *integrator* is the method used to propogate the dynamics, default is the *velocity-verlet* method, *out* is a list which can be 'plot'|'file'. If 'plot' is specified a diagram of energy against time is displayed, if 'file' is specified the results are written to a file (local directory) for post-processing. Note that the RHF density is passed to the next cycle. Don't push these algorithms too far or the errors will accumulate. The output file has the following format + + h2o sto-3g velocity-verlet + 3 200 10 + 0.00 -74.94207995 0.000 + 0.000000 -0.143226 0.000000 0.000000 0.000000 0.000000 0.000000 0.097441 0.000000 + 1.638037 1.136549 -0.000000 0.000000 0.000000 0.000000 -0.086300 -0.048721 0.000000 + -1.638037 1.136549 -0.000000 0.000000 0.000000 0.000000 0.086300 -0.048721 0.000000 + 10.00 -74.94221751 3.293 + 0.000000 -0.143184 0.000000 0.000000 0.000017 0.000000 0.000000 0.097192 0.000000 + 1.637450 1.136217 0.000000 -0.000235 -0.000132 0.000000 -0.086111 -0.048596 0.000000 + -1.637450 1.136217 0.000000 0.000235 -0.000132 0.000000 0.086111 -0.048596 0.000000 + +That is\ +line 1 {'molecule name'} {'basis name'} {'integrator'}\ +line 2 {number of atoms} {number of steps} {step size}\ +followed by {number of steps} blocks of...\ +    {time elapsed in simulation} {energy at this step} {real time elapsed}\ +and {number of atoms} lines of triples (x,y,z)\ +    {position} {velocity} {force}\ + + +2. **mdVisualise(type)** + + parameters - *type* is either 'bond{*n*:*m*}' or 'angle{*l*:*n*:*m*}', where *l, m, n* are atom designators. Will use the saved file from mdBornOppenheimer to plot the energy against time and either the bond or angle specified. If type = '' then just the energy will be plotted. Internally all units are atomic units, mdVisualise plots time as femtoseconds. + + Details of the velocity-verlet can be found [here](https://en.wikipedia.org/wiki/Verlet_integration). It is the most common of the symplectic integrators. + The Beeman algorithm can be found [here](https://en.wikipedia.org/wiki/Beeman%27s_algorithm). + +Dynamics can be run as (set molecule data in project.hpf) then +```python + from bomd import mdBornOppenheimer, mdVisualise + + mdBornOppenheimer(5, 200, 'velocity-verlet', ['plot', 'file']) + mdVisualise('bond{0:1}') + +``` +**Example 1. Hydrogen Molecule** + +These are the results for the energy variation and bond-length changes in the sto-3g basis. ![](/media/h2-sto-3g.png). + +You can see the dynamics over a period of 20 femtoseconds. The period of the bond vibration is twice that of the energy vibration. The minimum of the energy occurs when the bond length is about 1.35 bohr, and extrema of the bond length occur when the energy is a maximum. The frequency of bond vibration is \~5472 cm-1. The results in different bases are + +| basis | frequency (cm-1) | +|-----------------|-------------------| +| sto-3g | 5472 | +| 3-21g | 4659 | +| 6-31g | 4643 | +| dz | 4643 | +| cc-pvdz | 4597 | +| expt. | 4342 | [](chem,perdue.edu/gchelp/vibs/h2/html) + +**Example 2. Water Molecule** + +These are the results for the water molecule in sto-3g basis. ![](/media/h2o-sto-3g.png). + + +The molecular vibrations are a symmetric stretch with a bend. At minimum energy the bond length is about 1.9 bohr and again maxima of the energy correspond to the extrema of the bond length. The profile of curves for the other OH bond are identical indicating a symmetric stretch. The frequency of the stretch is 4116 cm-1. The bend is depicted below ![](/media/h2o-sto-3g-a.png) + +The frequency of the bend is 2206 cm-1. The frequency of the bend is about half that of the stretch so the energy profile is not a simple oscillation. The results for different bases are + +| basis | stretch | bend | +|-----------------|-------------------|--------------| +| sto-3g | 4116 | 2206 | +| 3-21g | 3727 | 1802 | +| 6-31 | 3778 | 1692 | +| dz | 3830 | 1671 | +| cc-pvdz | 3884 | 1839 | +| expt. | 3657 | 1595 | + + + +Methods currently available are the **velocity-verlet** + +r(t + *dt*) = r(t)*dt* + a(t)*dt*2/2 +v(t + *dt*) = v(t) + [a(t) + a(t+*dt*)] *dt*/2 + +**Beeman** algorithm + +r(t + *dt*) = r(t)*dt* + v(t)*dt* + 2a(t)*dt*2/3 - a(t-*dt*)*dt*2/6 +v(t + *dt*) = v(*dt*) + (2a(t+*dt*) + 5a(t) - a(t-*dt*))*dt*/6 + +and **adams-moulton** algorithm + +r(t + *dt*) = r(t)*dt* + v(t)*dt* + 2a(t)*dt*2/3 - a(t-*dt*)*dt*2/6 +v(t + *dt*) = v(*dt*) + (5a(t+*dt*) + 8a(t) - a(t-*dt*))*dt*/12 + +- - - +## Velocity Autocorrelation Function +An autocorrelation function is the similarity of a function with a time lagged version of itself. Details can be found [here](https://en.wikipedia.org/wiki/Autocorrelation). It's useful to us because of the Wiener–Khinchin theorem which states that the autocorrelation function has a spectral decomposition given by the power spectrum. This means by calculating the autocorrelation function and then doing a discrete FFT on it will give us an intensity spectrum. The routine **velocityAutocorrelation** works as follows ++ A BOMD calculation is performed to produce an output file containing atom displacements. Remember the BOMD uses atomic time and length measurements, as a rough guide to convert atu to femtoseconds divide by 40. The more points you can get the better, I used ammonia with 10000 steps and a step of 10 atu's as a test (overnight run!). ++ Having got the displacements from the BOMD (**BOMDfileRead**) calculate the gradients of the displacements (np.gradient) and divide by the time step (**getTimeDerivatives**). This gives us a rate of change with respect to time ie a velocity, hence this is a 'velocity' autocorrelation. ++ Now compute the autocorrelation of the derivatives (**getAutoCorrelation**). To do this we convolve the autocorrelation with a reversed copy of itself using signal.fftconvolve.. ++ Define a windowing function (**getViewPort**), this can be any defined in scipy.signal.window. ++ Perform a discrete fast Fourier transform (np.fft.fft) after first convolving autocorrelation function with the window and applying zero padding (**getPadding**). ++ Get the ftrequency from np.fft.fftfreq and plot frequency v intensity (square of fft). + +This is performed by + +3. **velocityAutocorrelation(options)** + + parameters - *options* is a dictionary with keys 'mode', 'atoms', 'window', 'file', 'plot'. 'mode' can be one of 's' (stretch), 'b' (bend) or 'd' (dihedral), 'atoms' is a list containing integers representing the atoms defining the stretch, bend, or dihedral. 'window' is a string and can be one of 'boxcar', 'triang', 'blackman', 'hamming', 'hann', 'bartlett', 'flattop', 'parzen', 'bohman', 'blackmanharris', 'nuttall', 'barthann', 'cosine', 'exponential', 'tukey', 'taylor', 'kaiser'\*, 'gaussian'\*, 'chebwin'\*. All except the last 3 (\*) require a string eg 'hann', the last three require an additional parameter so 'gaussian, 500', where the extra parameter is for 'gaussian' the standard deviation, for 'chebwin' it's the attenuation in dB and for kaiser it's the shape parameter β. 'file' is a string specifying where the input data file resides and 'plot' and be any of 'derivative', either 'ACp' or 'ACf' and 'spectrum'. 'ACp' will plot the autocorrelation (pyplot.acorr) whereas 'ACf' plots the actual autocorrelation function. Returns wavenumber (cm-1) and intensity (arbitary units). + + Routines contained within velocityAutocorrelation are + +4. **BOMDfileRead(input)** + + parameters - *input* is a string specifying the location of the BOMD data. Returns array of displacements and list containing time step, number of steps, number of atoms and title of BOMD file. + +5. **getVibrationMode(options, geometry)** + + parameters - *options* are the options defining the run and *geometry* is the array of displacements. Returns array of either displacements (stretch) or angles (bend and dihedral). + +6. **getTimeDerivatives(vibrations, dt)** + + parameters - *vibrations* are the linear or angular displacements and *dt* is the time step. Returns time derivatives. + +7. **getAutoCorrelation(f)** + + parameters - *f* are the velocities ie time derivatives of displacements. Returns autocorrelation function values. + +8. **getViewport(options, dataLength)** + + parameters - *options* are the options defining the run and *dataLength* is the length of the autocorrelation data. Returns pointer to a window function. + +9. **getPadding(dataLength)** + + parameters - *dataLength* is the length of the autocorrelation data. Returns next power of 2 beyond end of autocorrelation data. + +10. **autocorrelationFFT(ACF, window)** + + parameters - *ACF* are the autocorrelation function values and *window* is the windowing function. Returns square of result of FFT. + +This is an example of it's use +```python +mdBornOppenheimer(10, 10000, 'velocity-verlet', ['plot', 'file']) + +velocityAutocorrelation({ 'mode' : 's' , 'atoms' : [0,1], 'window' : 'gaussian,500', \ + 'file' : 'md.hdf', 'plot' : ['derivative', 'ACf', 'spectrum']}) +``` +Running the above for an ammonia molecule in STO-3G gives + +![ammonia N-H bond stretch](/media/nh3-vacf-bond.png) +![ammonia H-N-H bend](/media/nh3-vacf-bend.png) + +We see a stretch at ~3800 cm-1 and a bend at ~1400 cm-1. This compares with theoretical HF/STO-3G values from NIST given [here](https://cccbdb.nist.gov/vibs3x.asp?method=1&basis=20) of 3833 cm-1 and 1412 cm-1. + +Using *getPeaks* from tdhf module gives values of 3838 and 1406 so good agreement with NIST. diff --git a/document/cctn.md b/document/cctn.md new file mode 100644 index 0000000..e1fb750 --- /dev/null +++ b/document/cctn.md @@ -0,0 +1,25 @@ +### Coupled-Cluster Triples and Variations + +The theoretical background to this can be found in *documents/CCSDT-n.ipynb*. This covers CCSDT-1a, CCSDT-1b, CCSDT-n for n=2,3,4. The code can be accessed through a *post* command in the harpy input as eg *post={-1a}*. Valid identifiers are -1a, -1b, -2, -3, -4, -T (full CCSDT) and -t (CCSD(T). The code will output to the console rather than the HTML output file. The source file contains a DIIS class specially modified for triples, the routine *cluster_triples_n_diagrams* which contains the extra cluster diagrams needed for the triples variations and *coupledClusterTriplesVariations* which is the main routine. + +The process is as follows: from harpy take the 2-electron repulsion integrals, Fock matrix, mo coefficients (C) and the molecular orbital energies. We convert the eri and Fock to spin versions and use these to pass to the COGUS ccsd(t) code. From the COGUS code we get back (for each cycle) the $T_1$ and $T_2$ amplitudes. These amplitudes are then on each cycle augmented with the extra diagrams needed for the method being computed. For the straight triples the plain COGUS code is used unmodified. The results have been tested by using CC_ADE to explicitly construct the exponential terms involved in the ansatz for each method and also against results given in 'Coupled-Cluster Studies in Computational Chemistry' a Master of Science thesis by Ole T. B. Norli. The results from this source have themselves been verified against J. Noga & R.J. Bartlett Chemical Physics Letters Vol. 134, issue 2, 20 Feb 1987. The molecule used is $H_2 O$ in a DZ basis the geometry is in Bohr units + +| atom | x | y | z | +|------|-----|------|-----| +| O | 0.000000 | 0.000000 | -0.009000 | +| H | 1.515263 | 0.000000 | -1.058898 | +| H | -1.515263 | 0.000000 | -1.058898 | + +The results for references are calculated to 1-e7 and for harpy 1e-8, units are Hartrees + +| method | reference | harpy | +|---------|----------------|----------| +| CCSDT-1a| -0.147577 | -0.1475768 | +| CCSDT-1b| -0.147580 | -0.1475803 | +| CCSDT-2 | -0.147459 | -0.1474589 | +| CCSDT-3 | -0.147450 | -0.1474501 | +| CCSDT-4 | -0.147613 | -0.1476129 +| CCSDT | 0.147594 | -0.1475938 | +| CCSD | | -0.1462381 | +| (T)| | -0.0012159 | + diff --git a/document/ci.md b/document/ci.md new file mode 100644 index 0000000..9ec443a --- /dev/null +++ b/document/ci.md @@ -0,0 +1,71 @@ +# Configuration Interaction Module + + +There is a Crawford project on the CI [see](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2312). See also fci module. + +1. **cis(atoms, charge, bases, eigenVectors, fock, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, *bases* is an array of basis objects (the molecular basis), *eigenVectors* are the final eigenfunctions of the fock matrix, *fock* is the final Fock matrix and *ERI* the 2-electron repulsion integrals. This routine calls buildFockMOspin to get the Fock matrix in the MO spin basis, then buildEriMO to get 2-electron repulsion integrals in the MO basis and subsequently buildEriDoubleBar to transform to a spin basis integral. A CI Hamiltonian is computed and the eigen solution found. This gives a mixture of + tuples states which a returned as a unique value and a multiplicity by ciDegeneracy function. Returns the arrays of eigenvalues and eigenvectors. A call to blockDavidson returns the (5) lowest eigenvalues from a block Davidson algorithm. A call to excitations produces a list of all contributions to the orbital excitations above 10% and the levels involved in the jump. Returns the eigenvalues and eigenvectors. + +2. **ciDegeneracy(e)** + + parameters - *e* is an array of (possibly degenerate) values pre-sorted in ascending order. Returns an array of 2-pules [energy, degeneracy], + where is is the degeneracy (*s* - singlet, *d* - doublet, *t* - triplet or \[*n*] - n'let). + +3. **spinAdaptedSingles(atoms, charge, bases, eigenVectors, fock, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, bases is an array of basis objects (the molecular basis), *eigenVectors* are the final eigenfunctions of the fock matrix, *fock* is the final Fock matrix and *ERI* the 2-electron repulsion integrals. This routine constructs the Fock matrix in the MO basis and calls buildEriMO to get the 2-electron repulsion integrals in the mO basis as well. A spin-adapted CI hamiltonian for singlets is then constructed and the eigen solution found. Returns eigenvalues. + +4. **spinAdaptedTriples(atoms, charge, bases, eigenVectors, fock, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, bases is an array of basis objects (the molecular basis), *eigenVectors* are the final eigenfunctions of the fock matrix, *fock* is the final Fock matrix and *ERI* the 2-electron repulsion integrals. This routine constructs the Fock matrix in the MO basis and calls buildEriMO to get the 2-electron repulsion integrals in the mO basis as well. A spin-adapted CI hamiltonian for triplets is then constructed and the eigen solution found. Returns eigenvalues. + +5. **randomPhaseApproximation(atoms, charge, bases, eigenVectors, fock, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, bases is an array of basis objects (the molecular basis), *eigenVectors* are the final eigenfunctions of the fock matrix, *fock* is the final Fock matrix, *ERI* the 2-electron repulsion integrals and *type* is the method of constructing Hamiltonian. *type* can be 'block' this is just the CIS method, 'linear' is using (A-B)(A+B) to find square of eigenvalues, 'hermitian' is using (A-B)½(A+B)(A-B)½ to find the square of the eigenvectors and 'raw' which just returns the A and B matrices. There is also a 'tamm-dancoff' option which just uses the A matrix. This option will also solve for eigenvectors and returns sorted eigenvalues and eigenvectors. This routine calls buildFockMOspin to get the Fock matrix in the MO spin basis, then buildEriMO to get 2-electron repulsion integrals in the MO basis and subsequently buildEriDoubleBar to transform to a spin basis integral. A and B matrices are constructed and (A+B)(A-B) solved as an eigenvalue problem to get the CI energies squared. ciDegeneracy is then used to filter out the degeneracies. + +6. **excitations(ecis, ccis, nElectrons, nOccupied, nVirtual)** + + parameters - *ecis* and *ccis* are the eigenvalues and vectors of the CI Hamiltonian, n\_ are the various orbital occupation counts. Returns an array of arrays each containing \[energy level number, energy value, % contribution, jump given as eg *3 -> 5*]. + +7. **blockDavidson(nLowestEigen, h)** + + parameters - *nLowestEigen* is the number of the lowest eigenvalues the routine is to return, *h* is a CI hamiltonian to be diagonalised. Returns the eigenvalues as an array or *None* if algorithm failed. Use with sparse matrices. + + +Also included is a class to handle CIS(D) computations. The class can do calculations using both a direct solver (numpy.linalg.eigh) or the Davidson iterative solver from adc moldule. +To do a CIS(D) computation use code as follows which also shows getting the mp2 energy. The class has a *cache* property which is a dictionary with keys 'mp2', 'cis', 'cisd' and 'u'. These are the respective MP2 and CIS energies, the CIS(D) **correction** and the CIS eigenvectors from the computation. These are simply retrieved as eg ```mp2_energy = cisd.cache['mp2```']. The *method* can be either CIS(D) or CIS_MP2, in the latter case the *cache* key 'cisd' will not exist and is replaced by the keyword 'cis-mp2' +``` +from adc.adc import hf_reference + +#run RHF scf computation +import rhf +molAtom, molBasis, molData = rhf.mol([]) +e_scf = rhf.scf(molAtom, molBasis, molData, []) + +#ground state class +hf = hf_reference(rhf, molAtom, molBasis, molData) + +from ci import cis_d +roots = 10 +cisd = cis_d(hf, roots, solver='davidson', method='cis(d)') +``` +which will produce an output like +``` +***CIS(D)*** + root CIS CIS(D) Δ +--------------------------------------------- + 1 0.378234 0.339494 ( -0.038740 ) + 2 0.378234 0.339494 ( -0.038740 ) + 3 0.378234 0.339494 ( -0.038740 ) + 4 0.450863 0.423928 ( -0.026935 ) + 5 0.450863 0.423928 ( -0.026935 ) + 6 0.450863 0.423928 ( -0.026935 ) + 7 0.454664 0.405082 ( -0.049582 ) + 8 0.497466 0.465175 ( -0.032292 ) + 9 0.497466 0.465175 ( -0.032292 ) + 10 0.497466 0.465175 ( -0.032292 ) +``` +This is for the geometry prescribed in [this reference](https://hirata-lab.chemistry.illinois.edu//cis_data.out). The value given by this reference for CIS(D) is -0.03874026915629841. The output for CIS-MP2 (first root) is ```1 0.378234 0.342717 ( -0.035517 )``` compared to the reference value of -0.03551743011037764. + diff --git a/document/cogus.md b/document/cogus.md new file mode 100644 index 0000000..8b72e15 --- /dev/null +++ b/document/cogus.md @@ -0,0 +1,55 @@ +# Cluster Operator Generation Using Sympy + +This module runs the codes generated by the **cogus** program. The *cogus* program uses the Sympy secondquant module to automatically generate Python code to evaluate various coupled-cluster methods. The codes are stored in the directory harpy/codes and are called *ccd.py*, *ccsd.py*, *ccsdt*, *ccsd_t.py*, *cc2.py*, *cc3.py*, *lccd.py* and *lccsd.py*. More details can be found in the *cogus* documentation [here](https://github.com/pwborthwick/cogus) and [here](https://github.com/pwborthwick/ToDo/blob/harpy/cogus.md). The routines are + +1. **symbolicGeneratedCoupledCluster(name, fock, eri, c, e, scfData)** + + parameters - *name* is the name of the coupled-cluster method to be executed. This can be one of **ccd, ccsd, ccsdt, ccsd_t, cc2, cc3, lccd, lccsd**. *fock* is the converged Fock matrix from a Hartree-Fock calculation, *eri* are the 2-electron repulsion integrals, *c* are the converged eigenvectors, *e* are the orbital energies and *scfData* is a list containing [charge, nuclearRepulsion, number of electrons]. The program reads the *cogus* generated Python code and combines this with the code to run the cluster routines. The combined code is the executed using Pythons *exec* command. The routine returns the name of the method, cluster correction energy and either 0.0 or the perturbative correction if the method includes one. These routines are much faster than the ones in the cc module as they use einsum. + ++ CCD + + <0| e-T2 HN eT2 |0> , HN is the normal-ordered Hamiltonian. + + <0| i+j+ab e-T2 HN eT2 |0> + ++ CCSD + + <0| e-T1-T2 HN eT1+T2 |0> , + + <0| i+a e-T1-T2 HN eT1+T2 |0> + + <0| i+j+ab e-T1-T2 HN eT1+T2 |0> + ++ CCSDT + + <0| e-T1-T2-T3 HN eT1+T2+T3 |0> , + + <0| i+a e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+ab e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+k+abc e-T1-T2-T3 HN eT1+T2+T3 |0> + ++ CCSD(T) + + <0| e-T1-T2-T3 HN eT1+T2+T3 |0> , + + <0| {l1+l2} \[v,T3] |0> + + <0| i+a e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+ab e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+k+abc {e-T3 FN eT3+e-T2 vN eT2} |0> + ++LCCD + + T2 is restricted to only linear terms ie T2(1) + ++LCCSD + + T2 is restricted to only linear terms + ++CC2 + + <0| e-T1-T2 HN eT1+T2 |0> , + + <0| i+a e-T1-T2 HN eT1+T2 |0> + + <0| i+j+ab {e-T2 FN eT2 + e-T1 vN eT1 |0> + ++CC3 + + <0| e-T1-T2-T3 HN eT1+T2+T3 |0> , + + <0| i+a e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+ab e-T1-T2-T3 HN eT1+T2+T3 |0> + + <0| i+j+k+abc {e-T1-T2-T3 FN eT1+T2+T3 + e-T1 vN eT1} |0> + <0| i+j+k+abc {v + \[v,T2] + \[\[v,T1],T2] + 1/2\[\[\[v,T1],T1],T2] + 1/6\[\[\[\[v,T1],T1],T1],T2]} |0> + +2. **symbolicGeneratedLambda(name, fock, eri, c, e, coreH, scfData)** + + parameters - *name* is the name of the coupled-cluster method to be executed. This must be **ccsd**. *fock* is the converged Fock matrix from a Hartree-Fock calculation, *eri* are the 2-electron repulsion integrals, *c* are the converged eigenvectors, *e* are the orbital energies, *coreH* is the core Hamiltonian and *scfData* is a list containing [charge, nuclearRepulsion, number of electrons]. The program reads the *cogus* generated Python code and combines this with the code to run the lambda routines. The combined code is the executed using Pythons *exec* command. The routine returns the name of the method, thne lambda Lagrange energy, the Λ-pseudo energ and response density energy. + +3. **symbolicAmplitudes(name, fock, eri, c, e, scfData, spinned = False)** + + parameters - *name* is the name of the coupled-cluster method to be executed. This must be **ccsd**. *fock* is the converged Fock matrix from a Hartree-Fock calculation, *eri* are the 2-electron repulsion integrals, *c* are the converged eigenvectors, *e* are the orbital energies and *scfData* is a list containing [charge, nuclearRepulsion, number of electrons]. The parameter *spinned* allows already spin MO versions of fock, eri and e to be supplied to the routine. *c* can be either spin or unspinned if *spinned* is True as it is not used. The program reads the *cogus* generated Python code and combines this with the code to run the cluster routines. The combined code is the executed using Pythons *exec* command. The routine returns the name of the method and the singles, doubles and triples amplitude (where appropriate). The *name* can be ccd, ccsd, ccsdt or ccsd_t. If *spinned* is True then spin MO versions of Fock, eri and orbital energies must be supplied. + \ No newline at end of file diff --git a/document/diis.md b/document/diis.md new file mode 100644 index 0000000..028a56e --- /dev/null +++ b/document/diis.md @@ -0,0 +1,12 @@ +# Direct Inversion of the Iterative Subspace + +A discussion of the algorithm can be found in [Crawford projects] (https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2308) for Fock convergence and [here](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2310) for the coupled cluster iteration. DIIS requires an 'error vector', a quantity that approaches zero as the equations converge. For the Fock iteration that quantity is a two-dimensional matrix while for coupled cluster it is made up of a 2-dimensional array and a 4-dimensional array. In the latter case the arrays are flattened and concatenated to make the diis object. It is possible to flatten the Fock iteration quantities and in practice use a single routine for both cases. Here there are two routines, one for Fock matrix and one for coupled cluster linear arrays as an example of both ways of doing a diis procedure. They are implemented as classes. + +1. **diis_f(diisCapacity)** + + parameters - *diisCapacity* is the (maximum) size of diis buffer. *diisStatus* is either 'on' or 'off'. Returns a new Fock matrix. The class is initiated with the capacity being passed. The other call is *build(fock, density, s, x)* which builds the fock and error buffers and resturns the extrapolated fock. See rhf.py for an example of use. + + +2. **diis_c(diisCapacity, [ts, td, tt, ...])** + + parameters - *ts, td, tt, ...* are arrays of the quantities on which the diis procedure is based, in this case the singles, doubles, triples etc amplitudes. *diisCapacity* is the (maximum) size of diis buffer and *spinOrbitals* are the number of alpha plus beta spin orbitals.The class is initiated with the initial amplitudes and the capacity being passed. *refresh_store([ts, td, ...])* is used to update a buffer of this iteration and the last iteration values for use in convergence determination. *build([ts, td. ...])* builds the amplitude and error buffers and returns the extrapolated amplitudes. See either scc.py or fcc.py for examples of how to use this class. diff --git a/document/eom.md b/document/eom.md new file mode 100644 index 0000000..cba3885 --- /dev/null +++ b/document/eom.md @@ -0,0 +1,364 @@ +# EOM-CCSD +The motivation for this is Josh Goings program *pyqchem* on Github. The following draws from that program and documents Josh kindly supplied. +The paper [Simplified methods for equation-of-motion coupled-cluster excited state calculations - Steven R. Gwaltney, Marcel Nooijen, Rodney J. Bartlett](https://notendur.hi.is/agust/rannsoknir/papers/cpl248-189-96.pdf) gives the following equations for the partitioning of the EOM-CCSD hamiltonian. The Hamiltonian is not Hermitian and these are equations for right hand eigenvectors. + +**HSS**\ +FaeCei - FmiCam + WamieCem , *which re-indexed {e->c,m->k} is*\ +FacCci - FkiCak + WakicCck   , *uniform vectors*\ +FacCckδik - FkiCckδac+ WakicCck ++ HSS**a****i** = \[F**a**c δ**i**k - Fk**i** δ**a**c + W**a**k**i**c] Cck + +**HSD**\ +FmeCaeim + 0.5WamefCefim - 0.5WmnieCaemn , *which re-indexed {m->l,e->d,f->c,n->k} is*\ +FldCadil + 0.5WaldcCdcil - 0.5WlkidCadlk   , uniform vectors\ +FldCcdklδacδik + 0.5WalcdCcdklδik **1**- 0.5WklidCcdklδac **2**\ +**1** *repeated indices c and d interchanged.*\ +**2** *repeated indices k and l interchanged.* ++ HSD**a****i** = \[Fld δ**i**kδ**a**c + 0.5 W**a**lcd δ**i**k - 0.5 Wlk**i**d δ**a**c] Ccdkl + +**HDS**\ + P(ab) WmaijCbm + P(ij) WabejCei + P(ab) Wbmfetaf ijCem - P(ij) WnmjetabinCem , *which re-indexed {m->k,e->c,f->e,n->m}*\ + P(ab) WkaijCbk + P(ij) WabcjCci + P(ab) WbkectaeijCck - P(ij) WmkjctabimCck   , *uniform vectors*\ +P(ab) WkaijCck δbc + P(ij) WabcjCckδik + P(ab) WbkectaeijCck - P(ij) WmkjctabimCck ++ HDS**ab****ij** = \[*P*(ab) Wk**aij** δ**b**c + *P*(ij) W**ab**c**j** δ**i**k + *P*(ab) W**b**kec t**a**e**ij** - *P*(ij) Wmk**j**c t**ab****i**m]] Cck + +**HDD**\ +P(ab) FbeCaeij - P(ij) FmjCabim + 0.5WabefCef ij + 0.5WmnijCabmn + P(ab)P(ij) WbmjetaeimCaeim - 0.5P(ab) WnmfetfbijCeamn - 0.5P(ij) WnmfetabjnCfeim, *which re-indexed {e->c,m->k,n->m/l,f->e/d}*\ +P(ab) FbcCacij - P(ij) FkjCabik + 0.5WabcdCcdij + 0.5WklijCabkl + P(ab)P(ij) WbkjcCacik - 0.5P(ab) WlkectebijCcakl + 0.5P(ij) WmkdctabjmCdcik   , *uniform vectors*\ +P(ab) FbcCcdklδadδilδjk- P(ij) FkjCcdklδbcδadδil + 0.5WabcdCcdklδikδjl+ 0.5WklijCcdklδacδbd + P(ab)P(ij) WbkjcCcdklδadδil - 0.5P(ab) WlkectebijCcdklδad + 0.5P(ij) WmkdctabjlCcdklδil ++ HDD**ab****ij** = \[*P*(ab) F**b**c δ**j**k δ**i**l δ**a**d - Fk**j** δ**a**d δ**i**l δ**b**c + 0.5W**ab**cd δ**i**k δ**j**l + 0.5Wkl**ij** δ**a**c δ**b**d + *P*(ij)*P*(ab) W**a**k**i**c δ**j**l δ**b**d - 0.5Wlkecte**b****ij** δ**a**d + 0.5Wmkdct**ab****j**m δ**i**l] Ccdkl + +*(Einstein summation implied on repeated indices)* +- - - +Note gabcd = = - = - = \ +τabij = tabij + 2 taibj \ +τabij = -τbaij = -τabji \ +P(ij) = f(ij) - f(ji)\ +For EOM-CCSD tai and tabij are the converged single and double amplitudes from a CCSD calculation. +- - - - +#### Intermediates +Fme = F(ov) = *f*me + tfn gmnef \ +Fmi = F(oo) = *f*mi + tei*f*me + ten gmnie + 0.5 τefin gmnef \ +Fae = F(vv) = *f*ae - tam*f*me + tfm gamef - 0.5 τafmn gmnef \ +\ +Wmnij = W(oooo) = gmnij + P(ij) tej gmnie + 0.5τef ij gmnef \ +Wabef = W(vvvv) = gabef - P(ab) tbm gamef + 0.5τabmn gmnef \ +Wamef = W(vovv) = gamef - tan gnmef \ +Wmnie = W(ooov) = gmnie + tf i gmnfe \ +Wmbej = W(ovvo) = gmbej + tfj gmbef - tbn gmnej - (tfbjn + tfjtbn) gnmfe \ +Wmbje = W(ovov) = gmbje + tfj gbmef - tbn gmnje - (tfbjn + tfjtbn) gnmef \ +Wabei = W(vvvo) = gabei - Fmetabmi + tf iWabef + 0.5τabmn gmnei - P(ab) tafmi gmbef - P(ab) tam {gmbei - tbfni gmnef} \ +Wmbij = W(ovoo) = gmbij - Fmetbeij - tbnWmnij + 0.5τef ij gmbef + P(ij) tbejn gmnie + P(ij) tei {gmbej - tbfnj gmnef} +- - - - +#### HSS +\[F**a**c δ**i**k - Fk**i** δ**a**c + W**a**k**i**c] rck \ +\ +Equations for terms taken from [J. Chem. Phys. 98, 7029 (1993); https://doi.org/10.1063/1.46474698, 7029© 1993 American Institute of Physics.The equation of motion coupled-clustermethod. A systematic biorthogonal approach to molecular excitation energies, transition probabilities, and excited state properties](https://www.theochem.ru.nl/files/local/jcp-98-7029-1993.pdf) + ++ +F**a**c = *f***a**c δ**i**k - t**a**m *f*mcδ**i**k + te m gm**a**ec δ**i**k - 0.5 te**a**nm gmnce δ**i**k - ten t**a**m gmnce δ**i**k + + + [1] +*f***a**c δ**i**k   1 + + [2] -tm**a** *f*mc δ**i**k   9 + + [3] +tem gm**a**ec δ**i**k   4 + + [4] -0.5 te**a**nm gmnce δ**i**k   10 + + [5] -ten t**a**m gmnce δ**i**k   15 + ++ -Fk**i** = -(*f*k**i** δ**a**c + te**i** *f*ke δ**a**c + tem gkm**i**e δ**a**c + 0.5 tef**i**m gkmef δ**a**c + te**i** tfm gkmef δ**a**c ) + + + [6] -*f*k**i** δ**a**c   2 + + [7] -te**i** *f*ke δ**a**c   8 + + [8] -tem gkm**i**e δ**a**c   5 + + [9] -0.5 tef**i**m gkmef δ**a**c   11 + + [10] -te**i** tfm gkmef δ**a**c   14 + ++ +W**a**k**i**c = g**a**k**i**c + te**i** g**a**kec - t**a**m gmk**i**c - (te**a****i**m + te**i** t**a**m) gmkec + + + [11] +g**a**k**i**c   3 + + [12] +te**i** g**a**kec   6 + + [13] -t**a**m gmk**i**c   7 + + [14] -te**a****i**mgmkec   12 + + [15] -te**i** t**a**m gmkec   13 + +- - - +#### HSD +\[Fld δ**i**kδ**a**c + 0.5 W**a**lcd δ**i**k - 0.5 Wkl**i**d δ**a**c] rlkcd + ++ +Fld = fld δ**i**kδ**a**c + tem glmde δ**i**kδ**a**c + + + [16] +fld δ**i**kδ**a**c   16 + + [17] +tem glmde δ**i**kδ**a**c   21 + ++ +0.5 W**a**lcd = 0.5 g**a**lcd δ**i**k - 0.5 t**a**mgmlcd δ**i**k + + + [18] +0.5 g**a**lcd δ**i**k   17 + + [19] -0.5 t**a**m gmlcd δ**i**k   20 + ++ -0.5 Wkl**i**d = -0.5 (gkl**i**d δ**a**d + te**i** gkled δ**a**c) + + + [20] -0.5 gkl**i**d δ**a**c   18 + + [21] -0.5 te**i** gkled δ**a**c   19 + +*There is disagreement between reference [2] and [Coupled-cluster calculations of nuclear magnetic resonance chemical shifts](www2.chemia.uj.edu.pl/~migda/Literatura/pdf/JCP03561.pdf) we have taken reference [3] which agrees with coding in psi4numpy/pyscf. Reference [2] has gkild + tekgkied and reference [3] glkid + teiglked* + +- - - +#### HDS + \[*P*(ab) Wk**aij** δ**b**c + *P*(ij) W**ab**c**j** δ**i**k + *P*(ab) W**b**kec t**a**e**ij** - *P*(ij) Wmk**j**c t**ab****i**m] rkc + ++ +*P*(ab) {Wk**aij**} = *P*(ab) {gk**aij** δ**b**c + *P*(ij) t**a**em**j** gkm**i**e δ**b**c + 0.5τef**ij** gk**a**ef δ**b**c - t**a**m Wkm**ij** δ**b**c +*P*(ij) te**i** (gk**a**e**j** - t**a**fm**j** gkmef) δ**b**c -tae**ij** Fke δ**b**c} + + + [22] +*P*(ab) {gk**aij** δ**b**c}   23 + + [23] +*P*(ab)*P*(ij) te**a**m**j** gkm**i**e δ**b**c   31 + + [--] +*P*(ab) 0.5τef**ij** gk**a**ef δ**b**c + + [24] +*P*(ab) 0.5tef**ij** gk**a**ef δ**b**c   32 + + [25] +*P*(ab) te**i** tf**j** gk**a**ef δ**b**c   36 + + [--] -*P*(ab) t**a**mWkm**ij** δ**b**c + + Wkm**ij** = gkm**ij** + *P*(ij) te**j** gkm**i**e + 0.5τef**ij** gkmef + + [26] -*P*(ab) t**a**m gkm**ij** δ**b**c   25 + + [27] +*P*(ab) {t**a**m *P*(ij) te**j** gkme**i** δ**b**c}   38 + + [--] -*P*(ab) 0.5t**a**m τef**ij** gkmef δ**b**c + + [28] -*P*(ab) 0.5t**a**m tef**ij** gkmef δ**b**c   43 + + [29] -*P*(ab) t**a**m te**i** tf**j** gkmef δ**b**c   50 + + [--] +*P*(ab) {*P*(ij) te**i** (gk**a**e**j** - t**a**fm**j** gkmef) δ**b**c} + + [30] +*P*(ab)*P*(ij) te**i** gk**a**ej δ**b**c   27 + + [31] -*P*(ab)*P*(ij) te**i** t**a**fm**j**gkmef δ**b**c   39 + + [--] -*P*(ab) +t**a**e**ij** Fke δ**b**c = -*P*(ab) {t**a**e**ij** *f*ke δ**b**c + t**a**e**ij** tfm gkmef δ**b**c} + + [32] -*P*(ab) t**a**e**ij** *f*ke δ**b**c   29 + + [48] -*P*(ab) t**a**e**ij** tfm gkmef δ**b**c   49 + ++ *P*(ij) {W**ab**c**j**} = *P*(ij) {g**ab**c**j** δ**i**k - *P*(ab) gm**b**cf t**a**fm**j** δ**i**k + 0.5τ**ab**mn gmnc**j** δ**i**k + te**j** W**ab**ce δ**i**k - *P*(ab) t**a**m (gm**b**c**j** δ**i**k - t**b**en**j** gmnce) δ**i**k - Fmc t**ab**m**j** δ**i**k} + + + [33] +*P*(ij) g**ab**c**j** δ**i**k   22 + + [34] -*P*(ij)*P*(ab) g**b**mce te**a**mj δ**i**k   30 + + [--] +*P*(ij) 0.5τ**ab**mn gmnc**j** δ**i**k + + [35] +*P*(ij) 0.5t**ab**mn gmnc**j** δ**i**k   33 + + [36] +*P*(ij) t**a**m t**b**n gmnc**j** δ**i**k   37 + + [--] *P*(ij) W**ab**ce = *P*(ij) {(g**ab**ce - *P*(ab) t**b**m g**a**mce + 0.5τ**ab**mn gmnce) δ**i**k} + + [37] +*P*(ij) te**j** g**ab**ce δ**i**k   24 + + [38] *P*(ij)*P*(ab) te**j** t**b**m gm**a**ce δ**i**k   40* + + [--] *P*(ij) 0.5τ**ab**mn gmnce δ**i**k + + [39] *P*(ij) 0.5te**j** t**ab**mn gmnce δ**i**k   42 + + [40] *P*(ij) te**j** t**a**m t**b**n gmnce δ**i**k   41 + + [41] -*P*(ij)*P*(ab) t**a**m gm**b**c**j** δ**i**k   26 + + [42] -*P*(ij)*P*(ab) t**a**m te**b**n**j** gmnce δ**i**k   44 + + [--] -*P*(ij) Fmc t**ab**m**j** δ**i**k = *P*(ij) {-t**ab**m**j** *f*mc δ**i**k - t**ab**m**j** ten gmnce δ**i**k} + + [47] -*P*(ij) t**ab**m**j** *f*mc δ**i**k   28 + + [49] -*P*(ij) t**ab**m**j** ten gmnce δ**i**k   47 + ++ *P*(ab) W**b**kec t**a**e**ij** = *P*(ab) {t**a**e**ij**(g**b**kec - t**b**m gmkec)} + + + [43] +*P*(ab) t**a**e**ij** g**b**kec   34 + + [44] -*P*(ab) t**a**e**ij** t**b**m gmkec   48 + ++ -*P*(ij) Wmk**j**c t**ab****i**m = -*P*(ij){ t**ab****i**m(gmk**j**c - te**j** gmkec)} + + [45] -*P*(ij) t**ab****i**m gmk**j**c   35 + + [46] -*P*(ij) t**ab****i**m te**j** gmkec   46 + +- - - +#### HDD + \[*P*(ab) F**b**c δ**j**k δ**i**l δ**a**d - Fk**j** δ**a**d δ**i**l δ**b**c + 0.5W**ab**cd δ**i**k δ**j**l + 0.5Wkl**ij** δ**a**c δ**b**d + *P*(ij)*P*(ab) W**a**k**i**c δ**j**l δ**b**d - 0.5Wlkecte**b****ij** δ**a**d + 0.5Wmkdct**ab****j**m δ**i**l] rlkcd + ++ +*P*(ab) F**b**c = *P*(ab) {(*f***b**c - *f*mc t**b**m + tem gm**b**ec - 0.5 τ**b**emngmnce) δ**j**kδ**i**lδ**a**d} + + [50] +*P*(ab) *f***b**c δ**j**kδ**i**lδ**a**d   52 + + [51] -*P*(ab) *f*mc t**b**m δ**j**kδ**i**lδ**a**d   58 + + [52] +*P*(ab) temgm**b**ec δ**j**kδ**i**lδ**a**d   63 + + [53] -*P*(ab) 0.5te**b**mn gmnec δ**j**kδ**i**lδ**a**d   71 + + [54] -*P*(ab) tem t**b**n gmnecδ**j**kδ**i**lδ**a**d   76 + ++ -*P*(ij) Fk**j** = *P*(ij) {(*f*k**j** + *f*ke te**j** + tem gkm**j**e + 0.5τef**j**m gkmef ) δ**a**dδ**i**lδ**b**c} + + [55] -*P*(ij) *f*k**j** δ**a**dδ**i**lδ**b**c   53 + + [56] -*P*(ij) *f*ke te**j** δ**a**dδ**i**lδ**b**c   57 + + [57] -*P*(ij) tem gkm**j**e δ**a**dδ**i**lδ**b**c   64 + + [58] +*P*(ij) 0.5tfe**j**m gkmef δ**a**dδ**i**lδ**b**c   69 + + [59] +*P*(ij) tf**j** tem gkmef δ**a**dδ**i**lδ**b**c   75 + ++ +0.5W**ab**cd = 0.5 (g**ab**cd - *P*(ab) t**b**m g**a**mcd + 0.5τ**ab**mn gmncd) δ**i**kδ**j**l + + [60] +0.5g**ab**cd δ**i**kδ**j**l   54 + + [61] -P(ab) 0.5t**b**m g**a**mcd δ**i**kδ**j**l   61 + + [62] +0.25t**ab**mn gmncd δ**i**kδ**j**l   65 + + [63] +0.5t**a**m t**b**n gmncd δ**i**kδ**j**l   73 + ++ +0.5Wkl**ij** = 0.5 (gkl**ij** + *P*(ij) te**j** gkl**i**e + 0.5τef**ij** gklef) δ**a**cδ**b**d + + [64] +0.5gkl**ij** δ**a**cδ**b**d   55 + + [65] +P(ij) 0.5te**j** gkl**i**e δ**a**cδ**b**d   62 + + [66] +0.25tef**ij** gklef δ**a**cδ**b**d   66 + + [67] +0.5te**i** tf**j** gklef δ**a**cδ**b**d   72 + ++ +*P*(ij)*P*(ab) W**a**k**i**c = *P*(ij)*P*(ab) {(g**a**k**i**c + te**i** g**a**kec - t**a**m gmk**i**c - (te**a****i**m + te**i** t**a**m) gmkec) δ**j**lδd**b<**} + + [68] +*P*(ij)*P*(ab) g**a**k**i**c δ**j**lδd**b**   56 + + [69] +*P*(ij)*P*(ab) te**i** g**a**kec δ**j**lδd**b**   59 + + [70] -*P*(ij)*P*(ab) t**a**mgmk**i**c δ**j**lδd**b**   60 + + [71] -*P*(ij)*P*(ab) te**a**im gmkec δ**j**lδd**b**   67 + + [72] -*P*(ij)*P*(ab) te**i** t**a**m gmkec δ**j**lδd**b**   74 + ++ -0.5Wlkec te**b****ij** = -0.5te**b****ij** glkec δ**a**d + + [73] -0.5te**b****ij**glkec δ**a**d   70 + ++ +0.5Wmkdc t**ab****j**m = +0.5Wmkdct**ab****j**m δ**i**l + + [74] -0.5Wkmcd t**ab**m**j** δ**i**l   68 +- - - +- - - + # EOM-MBPT(2) + This is an approximation to full EOM-CCSD obtained by only retaining terms through second-order. This means\ + tai = **0**\ + tabij = gabij/(*f*ii+*f*jj-*f*aa-*f*bb)\ + *f*ai = **0** + + A good reference is ['Assessment of low-scaling approximations to the equation of motion coupled-cluster singles and doubles equations' - Joshua J Goings, Marco Caricato, Michael J Frisch and Xiaosong Li](http://dx.doi.org/10.1063/1.4898709) + #### HSS +\[F**a**c δ**i**k - Fk**i** δ**a**c + W**a**k**i**c] rck \ ++ +F**a**c = *f***a**c δ**i**k - 0.5 te**a**nm gmnce δ**i**k + + + [1] +*f***a**c δ**i**k   1 + + [4] -0.5 te**a**nm gmnce δ**i**k   10 + ++ -Fk**i** = -\(*f*k**i** δ**a**c + 0.5 tef**i**m gkmef δ**a**c ) + + + [6] -*f*k**i** δ**a**c   2 + + [9] -0.5 tef**i**m gkmef δ**a**c   11 + ++ +W**a**k**i**c = g**a**k**i**c - te**a****i**m gmkec + + + [11] +g**a**k**i**c   3 + + [14] -te**a****i**mgmkec   12 + +- - - +#### HSD +\[Fld δ**i**kδ**a**c + 0.5 W**a**lcd δ**i**k - 0.5 Wkl**i**d δ**a**c] rlkcd + ++ +Fld = 0 + ++ +0.5 W**a**lcd = 0.5 g**a**lcd δ**i**k + + + [18] +0.5 g**a**lcd δ**i**k   17 + ++ -0.5 Wkl**i**d = -0.5 gkl**i**d δ**a**d + + + [20] -0.5 gkl**i**d δ**a**c   18 +- - - +#### HDS + \[*P*(ab) Wk**aij** δ**b**c + *P*(ij) W**ab**c**j** δ**i**k + *P*(ab) W**b**kec t**a**e**ij** - *P*(ij) Wmk**j**c t**ab****i**m]] rkc + ++ +*P*(ab) {Wk**aij**} = *P*(ab) {gk**aij** δ**b**c + *P*(ij) t**a**em**j** gkm**i**e δ**b**c + 0.5τef**ij** gk**a**ef δ**b**c} + + + [22] +*P*(ab) {gk**aij** δ**b**c}   23 + + [23] +*P*(ab)*P*(ij) te**a**m**j** gkm**i**e δ**b**c   31 + + [--] +*P*(ab) 0.5τef**ij** gk**a**ef δ**b**c + + [24] +*P*(ab) 0.5tef**ij** gk**a**ef δ**b**c   32 + ++ *P*(ij) {W**ab**c**j**} = *P*(ij) {g**ab**c**j** δ**i**k - *P*(ab) gm**b**cf t**a**fm**j** δ**i**k + 0.5τ**ab**mn gmnc**j** δ**i**k + + + [33] +*P*(ij) g**ab**c**j** δ**i**k   22 + + [34] -*P*(ij)*P*(ab) g**b**mce te**a**mj δ**i**k   30 + + [--] +*P*(ij) 0.5τ**ab**mn gmnc**j** δ**i**k + + [35] +*P*(ij) 0.5t**ab**mn gmnc**j** δ**i**k   33 + ++ *P*(ab) W**b**kec t**a**e**ij** = *P*(ab) {t**a**e**ij**(g**b**kec - t**b**m gmkec)} + + + [43] +*P*(ab) t**a**e**ij** g**b**kec   34 + ++ -*P*(ij) Wmk**j**c t**ab****i**m = -*P*(ij){ t**ab****i**m(gmk**j**c - te**j** gmkec)} + + [45] -*P*(ij) t**ab****i**m gmk**j**c   35 +- - - +#### HDD + \[*P*(ab) F**b**c δ**j**k δ**i**l δ**a**d - Fk**j** δ**a**d δ**i**l δ**b**c + 0.5W**ab**cd δ**i**k δ**j**l + 0.5Wkl**ij** δ**a**c δ**b**d + *P*(ij)*P*(ab) W**a**k**i**c δ**j**l δ**b**d - 0.5Wlkecte**b****ij** δ**a**d + 0.5Wmkdct**ab****j**m δ**i**l] rlkcd + ++ +*P*(ab) F**b**c = *P*(ab) {(*f***b**c - 0.5 τ**b**emngmnce) δ**j**kδ**i**lδ**a**d} + + [50] +*P*(ab) *f***b**c δ**j**kδ**i**lδ**a**d   52 + + [53] -*P*(ab) 0.5te**b**mn gmnec δ**j**kδ**i**lδ**a**d   71 + ++ -*P*(ij) Fk**j** = *P*(ij) {(*f*k**j** + 0.5τef**j**m gkmef ) δ**a**dδ**i**lδ**b**c} + + [55] -*P*(ij) *f*k**j** δ**a**dδ**i**lδ**b**c   53 + + [58] +*P*(ij) 0.5tfe**j**m gkmef δ**a**dδ**i**lδ**b**c   69 + ++ +0.5W**ab**cd = 0.5 (g**ab**cd + 0.5τ**ab**mn gmncd) δ**i**kδ**j**l + + [60] +0.5g**ab**cd δ**i**kδ**j**l   54 + + [62] +0.25t**ab**mn gmncd δ**i**kδ**j**l   65 + ++ +0.5Wkl**ij** = 0.5 (gkl**ij** + 0.5τef**ij** gklef) δ**a**cδ**b**d + + [64] +0.5gkl**ij** δ**a**cδ**b**d   55 + + [66] +0.25tef**ij** gklef δ**a**cδ**b**d   66 + ++ +*P*(ij)*P*(ab) W**a**k**i**c = *P*(ij)*P*(ab) {(g**a**k**i**c - te**a****i**m gmkec) δ**j**lδd**b**} + + [68] +*P*(ij)*P*(ab) g**a**k**i**c δ**j**lδd**b**   56 + + [71] -*P*(ij)*P*(ab) te**a**im gmkec δ**j**lδd**b**   67 + ++ -0.5Wlkec te**b****ij** = -0.5te**b****ij** glkec δ**a**d + + [73] -0.5te**b****ij**glkec δ**a**d   70 + ++ +0.5Wmkdc t**ab****j**m = +0.5Wmkdct**ab****j**m δ**i**l + + [74] -0.5gkmcd t**ab**m**j** δ**i**l   68 + + - - - + P-EOM + + In the partitioned scheme the HDD(2) block is replaced with HDD(0). That is + #### HDD + \[*P*(ab) F**b**c δ**j**k δ**i**l δ**a**d - Fk**j** δ**a**d δ**i**l δ**b**c]\ + + [50] +*P*(ab) *f***b**c δ**j**kδ**i**lδ**a**d   52 + + [55] -*P*(ij) *f*k**j** δ**a**dδ**i**lδ**b**c   53 + + - - - + + 1. **maximumAmplitudes(t, top = 5, mode = 0)** + + parameters -*t* is an array of the amplitudes and the maximum *top* amplitude are returned. If *mode* is 0 order of amplitudes is diminishing absolute values, if *mode* is +1 order of amplitudes is diminishing positive amplitudes and if *mode* = -1 order is increasing negative amplitudes (ie -3,-2,-1). Returns a list of the 'top' amplitudes in the format eg '-0.356412 (0, 4)'. + + +2. **eomccsd(fockMOspin, eriMOspin, ts, td, nOccupied, nVirtual, spinOrbitals, partitioned = False, dialog = True)** + + parameters - *fockMOspin* is the converged Fock matrix in the molecular spin basis, *eriMOspin* are the electron repulsion integrals in the molecular spin basis, *ts* are the converged singles amplitudes from a ccsd computation, *td* are the converged doubles amplitudes from a ccsd computation, *nOccupied* is the number of occupied spin orbitals, *nVirtual* are the number of virtual spin orbitals, *spinOrbitals* are the number of spin orbitals. *partitioned* is a boolean flag, if true the HDD block will be set to H(0)DD and *dialog* if true will print the timings to the console. Returns the eigenvalues and right eigenvectors. + +3. **eommbpt2(fockMOspin, eriMOspin, nOccupied, nVirtual, spinOrbitals, partitioned = False, dialog = True)** + + parameters - *fockMOspin* is the converged Fock matrix in the molecular spin basis, *eriMOspin* are the electron repulsion integrals in the molecular spin basis, *nOccupied* is the number of occupied spin orbitals, *nVirtual* are the number of virtual spin orbitals, *spinOrbitals* are the number of spin orbitals. *partitioned* is a boolean flag, if true the HDD block will be set to H(0)DD and *dialog* if true will print the timings to the console. Returns the eigenvalues and right eigenvectors. + +4. **main** + This is an example of an eom calculation. A harpy project file is produced, saved and passed to the scf routine. After the scf has run the file is deleted. The Fock and eri integrals from the scf calculation are then converted to a molecular orbital spin basis and used in a CCSD calculation from which the singles and doubles amplitude are retained. The 5 most significant amplitudes (values and indices) are determined from the routine *maximumAmplitudes*. The eom-ccsd/mbpt(2) routines are run. After each routine has run the eigenvalues are sorted and converted to electron volts and passed to *ciDegeneracy* which returns tuples of (energy, degeneracy). Some of the energy values are compared to Gaussian derived values as a check. The SCF and CCSD correction energies, maximum amplitudes, excitation tuples and a range of eV to output are then passed to *postSCF* for printing in the harpy.html file. The output is + +

equation of motion

+

coupled-cluster singles and doubles calculation +
+ +
scf energy   -1.1229402577
ccsd energy-0.0248728759
total energy-1.1478131337
+
+

most significant amplitudes +
+ + + + + + + + + +
tai
-0.005758 (4, 0)
-0.005758 (5, 1)
tabij
0.084054 (2, 3, 1, 0)
0.084054 (3, 2, 0, 1)
-0.084054 (3, 2, 1, 0)
-0.084054 (2, 3, 0, 1)
-0.047829 (5, 4, 1, 0)
+ + + + + + + + + + + + +
eom-ccsd
10.852658 (t)15.898413 (s)26.471214 (t)30.521616 (s)31.881407 (s)
40.401967 (t)41.140804 (s)43.232123 (t)
+ + + + + + + + + + + + +
eom-mbpt(2)
10.657194 (t)15.708727 (s)26.265493 (t)30.222336 (s)31.678520 (s)
40.207311 (t)40.912816 (s)43.016807 (t)
+ +__Fast EOM_CCSD__ +There is a routine which codes an einsum version of EOM-CCSD using intermediates in _cc.fcc_. diff --git a/document/ep.md b/document/ep.md new file mode 100644 index 0000000..f2e493d --- /dev/null +++ b/document/ep.md @@ -0,0 +1,15 @@ +# Electron Propagator + +This module follows the psi4numpy implementation [here](https://github.com/psi4/psi4numpy/tree/master/Electron-Propagator). + +1. **electronPropagator2( molBasis, c, ERI, scfEnergy, eps, nOccupied, startOrbital = 2, nOrbitals = 4)** + + parameters - *molBasis* is an array of basis objects, *c* are the final orbital eigenvectors, *ERI* the (linear) 2-electron repulsion integrals, *scfEnergy* is the final converged total energy, *eps* the final orbital energies, *nOccupied* the number of occupied orbitals, *startOrbital* is orbital from which to start analysis and *nOrbitals* the number of orbitals to analyse. Returns to postSCF a list of the orbital energies (Koopman) and ep2 energies representing the ionising potentials. Returns ep2 energies. + +2. **electronPropagator2spin(molBasis, c, ERI, eigenValues, nOccupied, nOrbitals = 5)** + + parameters - *molBasis* is an array of basis objects, *c* are the final orbital eigenvectors, *ERI* the (linear) 2-electron repulsion integrals, *eigenValues* are the final orbital energies, *nOccupied* the number of occupied orbitals, and *nOrbitals* the number of orbitals to analyse. Returns to postSCF a list of the orbital energies (Koopman) and ep2 energies representing the ionising potentials. Returns ep3 energies. + +3. **koopmanAGFcorrection(molBasis ,c ,ERI, eigenValues, nOccupied, nOrbitals = 5):** + + parameters - *molBasis* is an array of basis objects, *c* are the final orbital eigenvectors, *ERI* the (linear) 2-electron repulsion integrals, *eigenValues* are the final orbital energies, *nOccupied* the number of occupied orbitals, and *nOrbitals* the number of orbitals to analyse (n below HOMO). This computes the approximate Green function correction to the IP. See Szabo and Ostlund pg 403. Returns a list of [[Koopman energy, AGF correction], ...] \ No newline at end of file diff --git a/document/fcc.md b/document/fcc.md new file mode 100644 index 0000000..b2a15d9 --- /dev/null +++ b/document/fcc.md @@ -0,0 +1,167 @@ +### Fast Coupled-Cluster + +The module scc.py has coupled-cluster routines written for clarity as explicit for-loops. This module contains a different (and faster) approach. In order to do coupled-cluster you need to first convert from atomic basis to a molecular spin basis (at least that's the way we'll do it). This is a class to do just that + +1. **class spinMO(object)** + +The initiator takes arguements (e, eri, c, f) where *e* are the orbital energies of a converged HF calculation, *eri* are the two electron repulsion integrals (in our case given as the linear array form), *c* are the orbital coefficients and *f* is the final Fock matrix. All quantities have dimension number of basis functions. To get a instance of the class use + + mo = spinMO(eps, eri, C, fock) + spinFock = mo.fs ; spinEri = np.gs + + The class has instance variables *gs* the MO spin two electron replusion integrals and *fs* the MO spin Fock integrals. These arrays are of length 2\*number of basis functions in all dimensions ie [n,n,n,n] and [n,n] + + There are two routines\ + *gMOspin(self, e, c, eri, nbf)* - for the two electron repulsion integrals and\ + *fMOspin(self, f, c)* - for the Fock matrix. + +The main coupled-cluster class is + +2. **class coupledCluster(object)** + + The initiator takes the arguements (fs, gs, e, data) where *fs* is the MO spin Fock matrix, *gs* are the MO spin two electron repusion integrals, *e* are the AO basis orbital energies and *data* is a dictionary {'method':.., 'electrons':.., 'cycle_limit'.., 'precision':.., 'verbose':..} supplied to the class by the caller. *method* is the coupled-cluster method, *electrons* are the number of electrons, *cycle_limit* is the maximum number of iterations allowed, *precision* is the number of decimal places to converge to and *verbose* is a boolean flag - if True information on each cycle will be printed. \ +The available *method*s are 'ccd', 'ccsd', 'ccsd(t)', 'cc2', 'qcisd' and linear ccd 'lccd' and linear ccsd 'lccsd'. +On exit the class has instance variables *ts* the singles amplitudes, *td* the doubles amplitudes, *converged* a boolean flag (which should be checked on exit) +indicating a successful convergence of the iterations and 'energy'. *ts* is of dimension [o,v], *td* is of dimension [o,o,v,v]. *energy* is a dictionary with keys + + 'cc' - coupled-cluster correction + + 'pt' - perturbative triples correction (optional) + + 'eHF' - Hartree-Fock electronic energy + + 'mp2' - Moller-Plesset 2 energy + + 'nuclear' - nuclear repulsion energy (user added see example code) + + The class has a method *intermediates(slice, tau)* where *slice* can be one of 'oo', 'vv', 'ov', 'oooo', 'vvvv' or 'ovvo' and tau is a boolean (default=True) which for coupled-cluster will be True (False for Lambda calculations). To get the Fae intermediate use + + mo = cc.itermediates('vv') + + There are eight routines \ + *initialise_amplitudes(self)* - sets ts and td initial values and computes d-tensors (inverses). Computes HF energy. \ + *tau(self, tilde=True)* - the τ functions. \ + *intermediates(self, \_slice, tilde=True)* - F and W coupled-cluster intermediates. \ + *update_amplitudes(self)* - generate next guess of the amplitudes for ccd, ccsd, ccsd(t) and cc2. \ + *update_linear_amplitudes(self)* - generate next guess of the amplitudes for lccd, lccsd. \ + *cluster_energy(self)* - compute the cluster correction energy. \ + *perturbative_triples(self)* - perturbative triples correction. \ + *iterator(self, func)* - the main iteration loop, amplitude update function passed as arguement. + + For the intermediates (tilde type) F-type intermediates are 'oo', 'vv' and 'ov', and for W-type 'oooo', 'vvvv' and 'ovvo'. + +There is a DIIS class specifically for the coupled-cluster class + +3. **diis(object)** + +The initiator takes the arguements *ts* initial singles amplitudes, *td* initial doubles amplitudes and *capacity* the size of the diis buffers. See the iterator routine in coupledCluster class for details on it's implementation. + + There are two routines \ + *refresh_store(self, ts, td)* - adds new ts and td to a buffer. \ + *build(self, ts, td)* - builds the B-matrix and weights and generates extrapolated ts and td. \ + + +4. **fastCoupledCluster(type, fock, eps, c, eri, nuclearRepulsion, data)** + +parameters - *type* is the couple-cluster method (see class for options), *fock* is the Fock matrix in the AO basis, *eps* the orbital energies corresponding to *c* the orbital coefficients in the AO basis, *eri* the two electron repulsion integrals in AO basis (linear form), *nuclearRepulsion* is the energy of the nuclear-nuclear interaction and *data* is a dictionary corresponding to that to be passed to the coupledCluster class initiator. Routine calls spinMO class then the coupledCluster class. The output is written to the output file 'harpy.html' and the energy dictionary from coupledCluster class is returned. + The main rhf module calls this routine in response to the **post={}** keys '+s', '+d', 't', '+2', '+q', +l' and '+L' for ccd, ccsd, ccsd(t), cc2, qcisd, lccd and lccsd respectively. The key for lambda is '+^' which returns the lambda pseudo-energy. + +This is an example of the use of the classes. + + if __name__ == '__main__': + + #do an SCF computation + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri = [rhf.fock, rhf.C, rhf.e, rhf.ERI] + + #get fock and eri in molecular spin basis from spinMO class + mo = spinMO(e, eri, c, f) + gs = mo.gs + fs = mo.fs + + #call coupled-cluster class + data = {'method':'ccsd(t)','electrons':electrons, 'cycle_limit': 50, 'precision':1e-10, 'verbose':False} + cc = coupledCluster(fs, gs, e, data) + + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + + >>>{'cc': -0.07068008870929447, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'pt': -9.987727029497426e-05, 'nuclear': 8.00236706181077} + +The are the results for the methods \ +ccsd(t) {'cc': -0.07068008870929447, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'pt': -0.00009987727029497426, 'nuclear': 8.00236706181077} \ +ccsd {'cc': -0.07068008870929447, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'nuclear': 8.00236706181077} \ +ccd {'cc': -0.07015048756595696, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'nuclear': 8.00236706181077} \ +cc2 {'cc': -0.049399113048481456, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'nuclear': 8.00236706181077} \ +qcisd {'cc': -0.07071279699443576, 'mp2': -0.049149636689279796, 'eHF': -82.94444701585147, 'nuclear': 8.00236706181077} \ +lccd {'cc': -0.0719291640366139, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'nuclear': 8.00236706181077} \ +lccsd {'cc': -0.07257658932696193, 'mp2': -0.04914963668931829, 'eHF': -82.94444701585344, 'nuclear': 8.00236706181077} + +As a note, the ccsd(t) with explicit loop does a computation in about 50s (old Celeron laptop) for H2O in STO-3G basis, these routines do all the above coupled-cluster methods in about 1s. + +5. **class ccsdLambda(object)** + +The initiator takes the arguements (fs, gs, e, data) where *fs* is the MO spin Fock matrix, *gs* are the MO spin two electron repusion integrals, *e* are the AO basis orbital energies and *data* is a dictionary {'method': 'ccsd', 'electrons':.., 'cycle_limit'.., 'precision':.., 'verbose':..} supplied to the class by the caller. *method* is the coupled-cluster method, *electrons* are the number of electrons, *cycle_limit* is the maximum number of iterations allowed, *precision* is the number of decimal places to converge to and *verbose* is a boolean flag - if True information on each cycle will be printed.\The available *method*s are 'ccd', 'ccsd', 'ccsd(t)', 'cc2' and linear ccd 'lccd' and linear ccsd 'lccsd'.\ + On exit the class has instance variables *ts* the singles amplitudes, *td* the doubles amplitudes, *converged* a boolean flag (which should be checked on exit) + indicating a successful convergence of the iterations and 'energy'. *ts* is of dimension [o,v], *td* is of dimension [o,o,v,v]. *energy* is a dictionary with keys + + 'cc' - coupled-cluster correction + + 'eHF' - Hartree-Fock electronic energy + + 'lagrange'- Lagrangian energy + + 'nuclear' - nuclear repulsion energy (user added) + +The class has a method *intermediates(slice, tau)* where *slice* can be one of 'oo', 'vv', 'ov', 'oooo', 'vvvv' or 'ovvo' and tau is a boolean (default=False) which for lambda coupled-cluster will be False (True for coupled-cluster calculations). There are five routines\ + *initialise_amplitudes(self)* - sets ts and td initial values and computes d-tensors (inverses). Computes HF energy. + *intermediates(self, \_slice, tilde=False)* - F, W and G coupled-cluster intermediates. + *update_amplitudes(self)* - generate next guess of the amplitudes for ccd, ccsd, ccsd(t) and cc2. + *lambda_energy(self)* - compute the cluster correction energy. + *lagrangian_energy* - compute the Lagrangian energy. + *iterator(self)* - the main iteration loop, amplitude update function passed as arguement. + +The intermediates (non-tilde) are for F-type 'oo', 'vv' and 'ov' and for W-type 'oooo', 'vvvv', 'ovvo', 'ooov', 'vovv', 'ovoo' and 'vvvo'. In addition there are two G-type 3-body intermediates 'OO' and 'VV'. + +The output is +{'cc': -0.06888821143156079, 'eHF': -82.94444701585394, 'lagrange': -0.07068008870920173, 'nuclear': 8.00236706181077} + +Add the following to the previous code to run lambda + + data['method'] = 'ccsd' + l = ccsdLambda(fs, gs, e, data) + if l.converged: + l.energy['nuclear'] = nuclearRepulsion + + >>>{'cc': -0.06888821143156079, 'eHF': -82.94444701585394, 'lagrange': -0.07068008870920173, 'nuclear': 8.00236706181077} + +The code include here can be run as 'python3 cc/fcc/py' from the harpy/source directory. + +The method 'ccsd(t)' has been added for lambda ie *data[method] = 'ccsd(t)'*. This will do a ΛCCSD(T) computation, that is adding a pertutbative triples to the ΛCCSD calculation. In this case the *energy* dictionary has added keys + + 'pt' - perturbative triples correction at CCSD level + + 'pl' - perturbative triples correction at ΛCCSD level. + +The Λ perturbative triples has not been fully tested against other sources. + +The lambda class has a _oprdm_ method which returns the one-particle response density matrix. + +6. **class eom_ccsd(object)** + +The initiator takes the arguements (cc, roots, partitioned) where *cc* is an instance of the coupled-cluster class (converged), *roots* is a range of enrgy values in eV between which the excitations are to be reported (in *excitations* class variable). The range is given as a list ie [15, 30]. *partitioned* is a boolean flag which if set to True will use an approximate DD-block, that is P-EOM_CCSD. The raw eigenvalues and eigenvectors are given in class variables .e and .v (in atomic units) and the class variable .excitations contains elements of the type [energy, multiplicity] eg [3.56109, 't'] for energies in eV is range *roots*. The class is run as +``` + #EOM-CCSD + eom = eom_ccsd(cc, roots=[4, 19], partitioned=False) + print('root energy (eV) multiplicity\n---------------------------------') + for i, root in enumerate(eom.excitations): + print('{:<2d} {:<10.5f} {:2 (0.74 interbond in angstroms) in 3-21g +``` +--------------------------------- +root energy (eV) multiplicity +--------------------------------- +0 10.85265 t * +1 15.89841 s +2 26.47121 t +3 30.52162 s +4 31.88140 s +5 40.40196 t +``` +* values added in parentheses are from Gaussian (supplied by Josh Goings) \ No newline at end of file diff --git a/document/fci.md b/document/fci.md new file mode 100755 index 0000000..7e54694 --- /dev/null +++ b/document/fci.md @@ -0,0 +1,262 @@ +# full configuration interaction and singles and doubles + +Josh Goings pointed me in the direction of [this paper](https://hal.archives-ouvertes.fr/hal-01539072/document). It uses bit manipulation to implement Slater-Condon rules. The essential results of the Slater-Condon rules are: + +1. The full N! terms that arise in the N-electron Slater determinants do not have to be treated explicitly, nor do the N!(N! + 1)/2 Hamiltonian matrix elements among + the N! terms of one Slater determinant and the N! terms of the same or another Slater determinant +2. All such matrix elements, for any one- and/or two-electron operator can be expressed in terms of one- or two-electron integrals over the spin-orbitals that appear + in the determinants. +3. The integrals over orbitals are three or six dimensional integrals, regardless of how many electrons N there are. +4. These integrals over mo's can, through the LCAO-MO expansion, ultimately be expressed in terms of one- and two-electron integrals over the primitive atomic + orbitals. It is only these ao-based integrals that can be evaluated explicitly (on high speed computers for all but the smallest systems). + +For single excitations:
+ <Δ|Ω1ij> = <ϕi1j> , where Ωn is an n-body operator
+ <Δ|Ω2ij> = Σ <ϕiϕk2jϕk> - <ϕiϕk2kϕj> + +For double excitations:
+ <Δ|Ω1ikjl> = 0
+ <Δ|Ω2ikjl> = Σ <ϕiϕk2jϕl> - <ϕiϕk2lϕj> + +All higher excitations are 0. The paper states to implement the rules you need
+1. to find the number of spin-orbital substitutions between two determinants +2. to find which spin-orbitals are involved in the substitution +3. to compute the phase factor if a reordering of the spin-orbitals has occured. + +The paper uses bit manipulation which is certainly efficient, but does it need to be? Surely the evaluation of the integrals will be the critical stage computationally. We could probably do the 3 steps above using strings. Python strings are limited in length only by the machine RAM so you do not need to worry about stitching variables together when 64 bits are used as in the bit method. Let's see how we go... +Using binary variable a slater determinant will be represented as 0b1101 to represent particles at 0ɑ1ɑ1β, that is the lower states are to the right. We shall write this as '1011' that is lower states to the left as this seems more natural. We are not constrained by the little-endian storage of binary data. We could store both the un-excited and excited determinants on the same string as say '1101:1011' but for now we'll save as two separate strings. + +Let's take two determinants (single excitation example) 0b111 and 0b1000101. In our notation these will be '111' and '1010001'
+Firstly, lets get strings to same shape '111' -> '1110000'. Now we need to find out how many excitations our determinants represent. Let's put our determinants on top of each other
+'1110000'
+'1010001'
+Everywhere a '1' has become a zero represents an excitation (and where a '0' has become a '1'). We have the following routine to count the number of excitations + +1. **excitations(da, db)** \ + parameters - *da* and *db* are string representations of determinants ie strings of '1's and '0's. Returns the number of excitations between the two determinants. + +Now we need to find the excitation jumps. We can see (for single excitation) we need to find where the (first) '1' in determinant 1 has become a '0', then where the (first) '0' has become a '1' in determinant 2. For double excitations we just need to find the second occurrence of the preceding rule too. Once we have found the excitation in the second determinant we must remove it to stop counting it twice, this means we must save a copy of second determinant to restore on exit. This is done in + +2. **levels(da, db)** \ + parameters - *da* and *db* are string representations of determinants. Returns a list of the excitation jumps eg [[0,2], [3,7]] + +Now for the phase. The paper states *The phase is calculated as −1Nperm, where Nperm is the number permutations necessary to bring the spin-orbitals on which the holes are made to the positions of the particles. This number is equal to the number of occupied spin-orbitals between these two positions.*
So let's look at our example,
+'1110000'
+'1010001'
+The number of occupied spin orbitals between where the hole is (1) and where the particle is (6) is 1 (2) so the phase is -11 = -1. Let's look at a second example 0b111 -> 0b101010, which we would write '111000' -> '010101'. This is obvoiusly a double excitation (0->3 and 2->5).
The phase is
+'111000'
+'010101'
+As above the first hole is (0) and the first particle is (3) and there is 1 occupied orbital between them (1), but there is a second hole at (2) and a second particle at (5) with 1 occupied orbital between them (3) - **but this is an excitation**. The paper notes *For a double excitation, if the realization of the first excitation introduces a new orbital between the hole and the particle of the second excitation (crossing of the two excitations), an additional permutation is needed...* +So we have 1+1+1=3 and the phase is -13 = -1.
+Since n+1 has the same parity n-1 (odd or even) instead of adding an extra permutation we could just not count the excited state in the first place. So we would say we have a hole at (0) and an excitation at (3) with one occupied state between, (3) now becomes '0' as we've dealt with it. We have a second hole at (2) and a particle at (5) with no occupied states between, so permutations are 1 and phase is -1. We have a routine to calculate this + +3. **phase(da, db)** \ + parameters - *da* and *db* are string representations of determinants. Returns the phase of the excitation, either 1 or -1. + +We could get the number of permutations of the determinants by using scipy.special.comb to get the total number of combinations. As an example with H2 in 3-21g basis there are 2 electrons in 4 basis functions, so +```python +print('For hydrogen molecule in 3-21g basis with 2 electrons and 8 (spin) basis functions there are.') +print(scipy.special.comb(2,8), ' determinants') +``` +which gives an answer of 28 ie 8 things taken 2 at a time 8C2 = !8/!2 !(8-2) = 8.7/2 = 28 \ +But we will write our own routine + +4. **determinantCount(m, k)** \ + parameters - *m* is the total number of things to be taken *k* at a time. Returns mCk. + +We now have to find what these combinations are. For example for 8C2 (H2 in 3-21g basis will have 8 spin orbitals and 2 electrons) we will get \ +(0,7)(0,6)(0,5)(0,4)(0,3)(0,2)(0,1)
+(1,7)(1,6)(1,5)(1,4)(1,3)(1,2)
+(2,7)(2,6)(2,5)(2,4)(2,3)
+(3,7)(3,6)(3,5)(3,4)
+(4,7)(4,6)(4,5)
+(5,7)(5,6)
+(6,7)
+ +The routine to calculate these combinations is + +5. **combinationList(combs, group, start, stop, level)** \ + parameters - *combs* is an empty list that will contain the combinations, *group* is an empty string, *start* is the beginning of the sequence of items - usually 0, *stop* is the number of items - 1 and *level* is the nmber of selections - 1. For the H2 example we would run +```python +combs = [] +n = 8 +k = 2 +combinations = combinationList(combs, '', 0, n-1, k-1) +``` +Returns a list of combinations. + +These combinations must be converted to binary strings. How do we generate the binary strings? \ +Well (0,1) we say is 20+21 = 3 -> '11', as (1,3) would be 21+23 = 2+8 = 10 = '0101' ie a '1' in positions 1 and 3
+For water ((0, 1, 2, 3, 4, 5, 7, 10, 11, 13) state would be 11111101001101. We do this using + +6. **binaryString(comb, nOrbitals)** \ + parameters - *comb* is an element of the combination list (usually a two element list itself) and *nOrbitals* is the length of the returned string. + +Examples of the conversion are +(0,1) = '11'
+(0,2) = '101'
+(2,6) = '0010001'
+(2,7) = '00100001'
+(5,6) = '0000011'
+(5,7) = '00000101'
+ +These binary strings representing the combinations of excited determinants are then passed to + +7. **buildFCIhamiltonian(binary, eriMOspin, coreMOspin)** \ + parameters - *binary* is the list of binary strings representing the excited determinants, *eriMOspin* are the 2-electron repulsion integrals in the molecular spin basis and *coreMOspin* is the core Hamiltonian also in the molecular spin basis. Returns the excited Hamiltonian. + +Now to define hamiltonianElement. Firstly it must call *excitations* to get the degree of the excitation, then if degree is <= 2 continue to process. It must now call *levels* to get the excitations themselves and finally call *phase* for the phase.
+If it's a double excitation we will have 4 values as say, \[0,3] and \[1,5] this is interpreted as the phase times <01||35>.
+For a single excitation say,\[1,6] this will be phase times Σ <1n||6n>. Where n are common elements between the determinants. We need to calculate the common elements now. + +8. **commonStates(da, db)** \ + parameters - *da* and *db* are string representations of determinants. Returns a list of the states the two determinants have in common. + +For single excitations there is also a one-body contribution which for \[1,6] would be Hsc\[1,6], where Hsc is the molecular spin core Hamltonian. Finally the zero degree exitations. These are m are the common states (namely anywhere there is a '1' in either determinant) so there is a Hsc\[m,m] contribution and if m=n there is a phase times a half times Σ for all combinations. These Hamiltonian elements are computed in + +9. **hamiltonianElement(da, db, eriMOspin, Hp)** \ + parameters - *da* and *db* are string representations of determinants, *eriMOspin* are the 2-electron repulsion integrals in the molecular spin basis and *Hp* is the core Hamiltonian in the molecular spin basis. Returns an element of the excited Hamiltonian. + +10. **fci(molAtom, molBasis, charge, c, ERI, coreH)** \ + parameters - *molAtom* is an array of atom objects (the molecular atoms), *molBasis* is an array of basis objects (the molecular basis), *charge* is the molecular charge, *c* are the converged eigenvectors, *ERI* the 2-electron repulsion integrals in atomic basis and *coreH* is the core Hamiltonian. Sends number of electrons, number of spin orbitals, number of determinants, SCF energy, FCI (electronic) energy and FCI correction to postSCF (view module). Returns electronic FCI energies. + +For CISD we need a different approach. For H2 we have two parts, the first part is the nElectron ground state eg '11'. Aside from the ground state we want all single '0' substitutions ie '01' and '10', then all double substitutions ie '00'. The second part is the nOrbitals - nElectron part. This must be all combinations of the nOrbitals - nElectron taken k at a time, where k is a number to make total electron count nElectrons. Let's look at an example, +For H2, \ +'11' + '000000' \ +'01', '10' + '000001', '000010', '000100', '001000', '010000', '100000' \ +'00' + '000011', '000101', '001001', '010001', '100001', '000110', '001010', '010010', '100010', '001100', '010100', '100100', '011000', '101000' \ +total 28. We have code to do this + +11. **configurations(nElectrons, nOrbitals, type = 'S')** \ + parameters - *nElectrons* are the number of electrons, *nOrbitals* are the number of spin orbitals and *type* can be one or a combination of 'G' - ground state, 'S' - singles, 'D' - doubles, 'T' - triples and 'Q' - quadruples. Returns a list of determinants. Eg 'S' for singles (CIS), 'GSD' for singles and doubles (CISD), 'GD' for doubles (CID) etc. + + +12. **cisd(molAtom, molBasis, charge, c, ERI, coreH)** + parameters - *molAtom* is an array of atom objects (the molecular atoms), *molBasis* is an array of basis objects (the molecular basis), *charge* is the molecular charge, *c* are the converged eigenvectors, *ERI* the 2-electron repulsion integrals in atomic basis and *coreH* is the core Hamiltonian. Sends number of electrons, number of spin orbitals, number of determinants, SCF energy, CISD energy and CISD correction to postSCF (view module).Returns transition energies. + +13. **ciss(molAtom, molBasis, charge, c, ERI, coreH)** \ + parameters - *molAtom* is an array of atom objects (the molecular atoms), *molBasis* is an array of basis objects (the molecular basis), *charge* is the molecular charge, *c* are the converged eigenvectors, *ERI* the 2-electron repulsion integrals in atomic basis and *coreH* is the core Hamiltonian. Sends number of electrons, number of spin orbitals, number of determinants and excitations energy (eV) to postSCF (view module). Returns exitations (Hartree). Returns transition energies and eigenvectors which can be re-shaped for transition dipole and oscillator computations. + +We have the following test results - for water in STO-3G (all values checked against McMurchie-Davidson program), + +| | | +|------------|------------| +|number of electrons |10 | +|number of spin orbitals |14 | +|number of determinants| 1001 | +|SCF energy| -74.942080 | +|FCI energy| -75.012980 | +|FCI correction| -0.070900 | +| | | +|CISD energy| -75.011223 | +|CISD correction| -0.069143 | + +and for CI singles using slater determinants +| | | +|--------|--------| +|number of electrons | 10| +|number of spin orbitals | 14 | +|number of determinants | 40 | + +| in eV | | | | | | +|------|-----|--------|----------|---------|---------| +|7.816620 | 7.816620 | 7.816620 |9.372282 | 9.372282| 9.372282 | +|9.699819 | 9.959068 | 9.959068 |9.959068 | 10.735267 | 10.735267 | + +and for H2, FCI and CISD should be same as only double excitations possible for 2 electrons + +| | | +|------------|------------| +|number of electrons |2 | +|number of spin orbitals |8 | +|number of determinants| 28 | +|SCF energy| -1.122940 | +|FCI energy| -1.147813 | +|FCI correction| -0.024873 | +| | | +|CISD energy| -1.147813 | +|CISD correction| -0.024873 | + +and for CI singles using slater determinants +| | | +|--------|--------| +|number of electrons | 2| +|number of spin orbitals | 8 | +|number of determinants | 12 | + +| in eV | | | | | | +|------|-----|--------|----------|---------|---------| +|10.395356 | 10.395356 | 10.395356 | 15.755380 | 25.908408 | 25.908408 | +|25.908408 | 32.127966 | 39.998167 | 39.998167 | 39.998167 | 46.622756 | + +14. **spinStates(da, nBasis)** + parameters - *da* is a spin-intermngled determinant and *nBasis* are the number of doubly occupied basis functions. Returns two string representations of the alpha and beta spin states. + +15. **occupancy(da, nBasis)** + parameters - *da* is a spin-intermingled determinant and *nBasis* are the number of doubly occupied basis functions. Returns a string representing the occupany of the spatial orbitals. A string entry can be one of 0,1,2 for vacant, singly and doubly occupied orbitals. +- - - +### Bit manipulation versions + +16. **bString(da, spinOrbitals)** + + parameters - *da* is a spin-intermingled determinant and *spinOrbitals* are the number of spin orbitals. Return the integer representation of the bit string representing *da*. 0b101010 -> 42 + +17. **bCombinationList(spinOrbitals, nElectrons)** + + parameters - *spinOrbitals* are the number of spin orbitals and *nElectrons* are the number of electrons. Returns a list of all combinations of putting *nElectrons* into *spinOrbital* orbitals. The list is integers produced by *bstring*. (1,4,5,8) -> 0b010011001 -> 153 + +18. **bRightZeros(n)** + + parameter - *n* is an integer that the number of zeros to it's right of its binary representation is returned. Returns integer. 88 -> 0b1011000 -> 3 + +19. **bSetZero(da, n)** + + parameters - *da* is a spin-intermingled determinant and *n* is the bit that will be cleared (set to 0). Returns integer representing modified determinant. 22 -> 0b10110 -> n=2 -> 0b10010 -> 18 + +20. **bOccupancy(da, db, type = 'h')** + + parameters - *da* and *db* are a pair of determinants and *type* is either 'h' for holes or 'p' for particles. Returns a list of the positions where holes have appeared in the excitation or the position where particles have appeared. 0b111 and 0b101010 -> for 'h' [1], for 'p' [5, 3] + +21. **bExcitations(da, db)** + + parameters - *da* and *db* are a pair of determinants. Returns the number of excitations between two determinants. 0b111 and 0b101010 -> 2 + +22. **bSingleExcitations(da, db)** + + parameters - *da* and *db* are a pair of determinants. Returns the matrix element for a pair of determinants with a single excitation between them. + +23. **bDoubleExcitations(da, db)** + + parameters - *da* and *db* are a pair of determinants. Returns the matrix element for a pair of determinants with a double excitation between them. + +24. **bBuildFCIhamiltonian(determinants, eriMOspin, coreH)** + + parameters - *determinants* are a list a combinations of determinants, *eriMOspin* are the double-bar 2-electron repulsion integrals and *coreH* is the core Hamiltonian. Returns the FCI Hamiltonian matrix. + +25. **bFci(molAtom, molBasis, charge, c, ERI, coreH)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects, *c* are the converged scf eigenvectors, *ERI* are the 2-electron repulsion integrals and *coreH* is the core Hamiltonian. Returns the FCI eigenvalues, eigenvectors and the number of determinants processed. + +26. **bCommonStates(da, db)** + + parameters - *da* and *db* are a pair of determinants. Returns the states that the determinants have in common. 0b111 and 0b101010 -> [1] + +27. **bHamiltonianElement(da, db, eriMOspin, coreH)** + + parameters - *da* and *db* are a pair of determinants, *eriMOspin* are the double-bar 2-electron repulsion integrals and *coreH* is the core Hamiltonian. Returns the matrix element for determinants *da* and *db*. + +28. **bResidues(da, spinOrbitals)** + + parameters - *da* is a spin-intermingled determinant and *spinOrbitals* are the number of spin orbitals. Returns a list of residues - *The residues are a set of determinants that are generated by removing two electrons in all possible ways from the reference determinant*. + +29. **bSetResidues(residues, spinOrbitals)** + + parameters - *residues* is a list of residues and *spinOrbitals* are the number of spin orbitals. Returns a list of the residues with every combination of 2 orbitals filled. + +30. **bCisd(molAtom, molBasis, charge, c, ERI, coreH)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects, *c* are the converged scf eigenvectors, *ERI* are the 2-electron repulsion integrals and *coreH* is the core Hamiltonian. Returns the CISD eigenvalues and the number of determinants processed. + + + + diff --git a/document/force.md b/document/force.md new file mode 100644 index 0000000..137decb --- /dev/null +++ b/document/force.md @@ -0,0 +1,143 @@ +# Forces Module - integral derivatives and force + +This module computes the integrals need for calculating the first derivatives of the molecular energy and hence the intra-molecular forces as F = -dE/dx. The integrals routines are written for compactness and are not in any way efficient. It should be easy to expand them to see what is happening. *x* is the direction, either 0=x, 1=y or 2=z and center is an atomic center, either *a*, *b*, *c* or *d*. The main routine is forces which calculates an analytic solution and then a numeric one based on the the central difference formula. Most of the procedures mirror similar ones in integral module without the *fx* postfix. See also the ocypete module which contains Cython versions of these integrals. + +1. **e(ia, ja, type, r, ie, je, n, x)** + +2. **efx(ia, ja, type, r, ie, je, n, x, p, s)** + +3. **overlapfx(ia, ja, ie, je, ir, jr, n, origin, x, center)** + +4. **sfx(iBasis, jBasis, center, x = 0, n = [0,0,0] , origin = [0,0,0])** + +5. **buildOverlapfx(atom, direction, bases)** + +6. **kineticfx(ia, ja, ie, je, ir, jr, n, origin, x, center)** + +7. **kfx(iBasis, jBasis, center, x = 0, n = [0,0,0] , origin = [0,0,0])** + +8. **buildKineticfx(atom, direction, bases)** + +9. **coulombfxs(ia, ja, ie, je, ir, jr, nucleus, n, origin, x, center)** + +10. **jfx(iBasis, jBasis, nucleus, center = 'a', x = 0, n = [0,0,0] , origin = [0,0,0])** + +11. **buildCoulombfx(atom, direction, molAtom, bases)** + +12. **coulombfxh(ia, ja, ie, je, ir, jr, nucleus, n, origin, x)** + +13. **jfh(iBasis, jBasis, nucleus, x = 0, n = [0,0,0] , origin = [0,0,0])** + +14. **buildCoulombfh(atom, direction, molAtom, bases)** + +15. **buildNuclearfx(atom, direction, molAtom)** + +16. **electronRepulsionfx(ia, ja, ka, la, ie, je, ke, le, ir, jr, kr, lr, ra, rb, origin, x = 0, center = 'a')** + +17. **ERIfx(iBasis, jBasis, kBasis, lBasis, center, x = 0, n = [0,0,0], nu = [0,0,0], origin = [0,0,0])** + +18. **buildERIfx(atom, direction, molAtom, bases)** + +19. **buildFockfx(atom, direction, molAtom, molBasis, density)** + +20. **gradient(molAtom, molBasis, molData)** + + parameters - *molAtom* is an array of atom objects, *molBasis* an array of basis objects and *molData* is the array of *charge*, molecule name and basis name which is returned by rhf.mol. This routine calculates the analytic gradient and returns a [number of atoms, 3] array of gradient components. + +21. **efxNumeric(atom, direction, molAtom, molBasis, molData)** + + parameters - *atom* is the atom for which the gradient is being calculated, *direction* is the cartesian axis along which the gradient is to be calculated, *molAtom* is an array of atom objects, *molBasis* an array of basis objects and *molData* is the array of *charge*, molecule name and basis name which is returned by rhf.mol. This routine calculates the approximate gradient by central differences and returns the gradient of *atom* in *direction*. + + +22. **forces(molAtom, molBasis, density, fock, engine = 'aello', type='analytic')** + + parameters - *molAtom* is an array of atom objects, *molBasis* an array of basis objects and *density* is the converged density matrix, *fock* is the converged Fock matrix and *engine* is the integral engine to be used default is 'aello' which uses the **ocypete** cython engine. The final option *type* can be one of 'analytic' or 'both'. This routine calculates the analytic forces (negative of potential derivative with respect to coordinates) and returns a [number of atoms, 3] array of force components and optionally the numeric forces obtained via efxNumeric by a central difference formula. + +It is possible to do some geometry optimisation, the function optimiseGeometry is a suggestion of an approach... + +23. **optimiseGeometry(f, q0, text):** + + parameters - *f* is a function which evaluates the molecular energy with respect to a number of geometry parameters supplied to the function. *q0* is an initial point in the optimisation space and *text* is a list of descriptions of the geometry items being optimised. The routine calls scipy.minimise using Nelder-Mead simplex method [here](https://en.wikipedia.org/wiki/Nelder–Mead_method) . + + This is an example of optimising the H-O-H angle of water in the 6-31G basis. Define a function to calculate the molecular energy depending on the value of the changing parameter (angle)... +```python +def f(q, molAtom, molBasis, molData): + + import numpy as np + import rhf + + geo = np.zeros((len(molAtom), 3)) + geo[1,0] = -2.079 + geo[2,0] = 2.079 * np.cos(q*180/np.pi) + geo[2,1] = 2.079 * np.sin(q*180/np.pi) + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + + return rhf.scf(molAtom, molBasis, molData, []) +``` +Run as... +```python + +import force + +force.optimiseGeometry(f, [90], ['H-O-H angle']) + +``` +which gives an output of... + +H-O-H angle : 103.5 + +Optimal energy : -75.95250973385882 + +Cycles : 20 + +True + +We can run a full optimisation of both bonds and angle, using +```python +def f(x, molAtom, molBasis, molData): + + import numpy as np + import rhf + import math + + geo = np.zeros((len(molAtom), 3)) + a = x[2]*np.pi/180 + geo[1,0] = -x[0] + geo[2,0] = x[1] * math.cos(a) + geo[2,1] = x[1] * math.sin(a) + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + + return rhf.scf(molAtom, molBasis, molData, []) + +``` +Run as... +```python + +import force + +force.optimiseGeometry(f, [1.5, 1.5, 90], ['O-H bond', 'O-H bond', 'H-O-H angle']) + +``` + +with an output of... + +H-O-H angle : 68.5 (111.5 is HOH angle) + +H1-O1 bond : 1.79 + +H2-O1 bond : 1.79 + +Optimal energy : -75.98535916927149 + +Cycles : 79 + +True + +--when doing a sequence of similar calculations as in geometry optimisation or molecular dynamics then the eigenvectors of the last computation are likely to be close to those of the next one. It is therefore possible to use the eigenvectors of one calculation as the initial guess for the next one thus reducing the computational cost significantly -- + + + + + + + diff --git a/document/h.md b/document/h.md new file mode 100644 index 0000000..5bcd0d0 --- /dev/null +++ b/document/h.md @@ -0,0 +1,170 @@ +## Hydrogenic Wavefunctions +These routines explore various aspects of the hydrogen solution of the Schrodinger equation. They're designed to give pointers to various ways of solving the hydrogen and visualizing the solutions. + +1. **transform(mode, i, j, k)** + + parameters - *mode* is either 'cartesian->spherical' or 'spherical->cartesian', *i* is either an x-coordinate or an r-coordinate, *j* is either a y-coordinate or a θ-coordinate and *k* is either a z-coordinate or a φ-coordinate depending on the *mode*. The routine performs a coordinate transformation according to the *mode* and returns the transformed coordinates. + +2. **angularSolution(m, l, theta, phi)** + + parameters - *m* is the magnetic quantum number, *l* is the angular quantum number, *theta* is the polar coordinate and *phi* the azimuthal coordinate. Calls routine scipy.special.sph_harm and returns the spherical harmonic Yml(θ,φ). + +3. **angularSolutionPlot(ax, m, l, parameters)** + + parameters - *ax* are the matplotlib axes as defined eg from 'fig.add_subplot', *m* is the magnetic quantum number, *l* is the angular quantum number, and *parameters* is a directory of values defining the plot. The *parameters* directory is defined as follows - parameters = {'points':70,'extent':[-0.5,0.5],'color_map':'coolwarm', 'bar':'on','axes':'off','alpha':0.8} where 'points' are the number of data points in the (θ, φ)- grid, 'extent' is extent of the radial values to display, 'color_map' is the matplotlib color mapping to use, 'bar' determines whether to draw a heat bar, 'axes' controls whether to draw the coordinate axes or not and 'alpha' is the transparancy factor. Uses matplotlib.plot_surface to display the spherical harmonic in the color map requested. Optionally displays a colorbar. Does not 'show' the plot. + +4. **angularSolutionPlotSingle(m, l, parameters = {'points':70,'extent':[-0.5,0.5],'color_map':'coolwarm','bar':'on','axes':'off','alpha':0.8})** + + parameters - *m* is the magnetic quantum number, *l* is the angular quantum number and and *parameters* is a directory of values defining the plot. This routine displays a spherical harmonic defined by *m* and *l* according to the display conditions in *parameters*. An example for Y3,0 is + + ![image](https://user-images.githubusercontent.com/73105740/136229523-1f09d93e-3834-497a-a2e5-5bbbd8db491e.png) + + +5. **angularSolutionPlotFamily(l_maximum, parameters = {'points':70,'extent':[-0.5,0.5],'color_map':'coolwarm','bar':'off','axes':'off','alpha':1.0})** + + parameters - *l_maximum* is the highest value of the angular quantum number to display. *parameters* is a directory of values defining the plot. This routine will display all spherical harmonics for l=0, l=1, ... l=l_maximum where -l ≤ m ≥ l. An example for l_maximum = 3 is + + ![image](https://user-images.githubusercontent.com/73105740/136230126-100046a3-7ee5-4435-ae2f-dc43eb5c22b3.png) + + +6. **angularVerify()** + + parameters - none. This generates random values of l, m, θ and φ, and then calculates the (scipy) value from angularSolution routine comparing it with the (sympy) value from the **Ynm** function. Returns True or False. + +7. **radialSolution(n, l, r)** + + parameters - *n* is the principal quantum number, *l* is the angular quantum number (0 ≥ l ≤ n) and *r* is the radial distance (in units of the Bohr radius). Calls scipy.special.genlaguerre to return the normalised radial wavefunction value at r. + +8. **radialVerify()** + + parameters - none. This generates random values of n, l and r , and then calculates the (scipy) value from radialSolution routine comparing it with the (sympy) value from the **R_nl** function. Returns True or False. + +9. **radialSolutionType(n, l, r, psi_type = 'radial distribution')** + + parameters - *n* is the principal quantum number, *l* is the angular quantum number (0 ≥ l ≤ n), *r* is the radial distance (in units of the Bohr radius) and *psi_type* is the type of wavefunction to be plotted. *psi_type* can be one of 'radial distribution' (ψ), 'probability density' (|ψ|2) and 'probability distribution' (4πr2|ψ|2). Returns the value of the *psi_type*. + +10. **radialSolutionPlot(n, l, psi_type = 'radial distribution', psi_normal = False, parameters = {'points':100, 'size':[7,5], 'extent':[20,0.2], 'equal':False})** + + parameters - *n* is a list of principal quantum numbers to plot, *l* is a list of angular quantum numbers corresponding to the list of principal quantum numbers (0 ≥ l ≤ n) to plot, *r* is the radial distance (in units of the Bohr radius) and *psi_type* is the type of wavefunction to be plotted. *psi_type* can be one of 'radial distribution' (ψ), 'probability density' (|ψ|2) and 'probability distribution' (4πr2|ψ|2). *psi_normal* determines if the wavefunction should be normalised. *parameters* is a dictionary of values defining the plot appearance, these values are 'points' - the number of data points to calculate, 'size' - the width and height of the plot in inches, 'extent' - the horizontal and vertical ranges and 'equal' - forces a square aspect ratio. Plots the radial distribution. This is the plot for\ + radialSolutionPlot([1,2,3,2,3,3], [0,0,0,1,1,2], 'radial distribution', False, {'points':100,'size':[7,5],'extent':[20,[-0.15,0.2]],'equal':False}) + +![image](https://user-images.githubusercontent.com/73105740/136762722-b95f78b7-3f3a-4a40-9898-f2aa2119c2c1.png) + +11. **wavefunction(n, l, m, r, theta, phi, grid)** + + parameters - *n* is a principal quantum number to plot, *l* is an angular quantum number, *m* is the magnetic quantum number, *r*, *theta* and *phi* are the coordinates of a point in spherical polars or cartesian (*grid*='cartesian'). Calculates the product of radial and angular solutions and returns value. + +12. **wavefunctionContour(n, l, m, parameters={'points':100, 'extent':[-20, 20], 'color_map':'coolwarm','plane':'xy', 'elevation':0.0, 'contour': False})** + + parameters - *n* is a principal quantum number to plot, *l* is an angular quantum number, *m* is the magnetic quantum number and *parameters* is a dictionary of values defining the plot appearance, these values are 'points' - the number of data points to calculate, 'extent' - the horizontal and vertical ranges, 'color_map' - is the matplotlib name of the color theme to use, 'plane' - specifies which plane to view the contour in, 'elevation - is the height of the slice in 'plane' and 'contour' - specifies if the contour lines should be plotted. Shows a contour plot of the wavefunction. Examples for\ + wavefunctionContour(3, 2, 0, {'points':80, 'extent':[-30, 30], 'color_map':'gist_yarg', 'plane':'zx', 'elevation':0, 'contour': True})\ + wavefunctionContour(3, 2, 0, {'points':80, 'extent':[-30, 30], 'color_map':'gray', 'plane':'zx', 'elevation':0, 'contour': False}) +![image](https://user-images.githubusercontent.com/73105740/136765639-5d801e98-995e-4d87-8760-6ba1925fe9a2.png) + +13. **wavefunctionVerify()** + + parameters - None. This generates random values of *n*, *l*, *m* and *r*, *theta*, *phi* and uses these to compare wavefunction values generated by the routine wavefuction and the (sympy) routine Psi_nlm. Returns True or False. + +14. **numerov(g, u_zero, du, dh)** + + parameters - *g* are the values (at each r) of the expression in second-order differential equation u(r)'' = g(r)u(r) + u(r), *u_zero* is the initial value of u ie u(0), *du* is the grid step in u and *dh* is the grid step between sucessive r values. This routine returns the value of u at each value of r computed using the [Numerov algorithm](https://en.wikipedia.org/wiki/Numerov%27s_method). + +### Energy Levels +In order to determine the bounded energy levels we must solve a boundary value problem. The technique we use is called the 'shooting method' because of it's use in artillery trajectories. Here we fire at the target and if our shot falls to the left of the target we aim a bit more to the right and similarly if it falls to the right we aim more to the left. For our problem we know that the values of the wavefuction at zero at the origin and at infinity. Our strategy is to (under) guess an energy and calculate the wavefunction at r=0, if the value is not zero we increase our guess and recalculate until the value at r=0 is zero. The algorithm is full is ++ Make an initial guess at the energy (𝐸1) that is less than than the absolute minimum energy (-1.1). ++ Compute the value of the wavefunction for 𝐸𝑛 and values of the quantum numbers for the wavefunction considered. ++ Increment guess 𝐸𝑛 as 𝐸𝑛+1 and re-compute the value of the wavefunction. We do this by using a sequence like −1.2/l2,−1.2/(1+𝛿𝐸)2,..., ++ If 𝑢0∗𝑢𝑛+1 > 0 then go to previous step. ++ Here energy is in \[En, En+1] so apply a root finding method to find where zero occurs. + +15. **shootingMethod(E, r, l)** + + parameters - *E* is an energy, *r* is an array of radial values and *l* is an angular quantum number. Returns value past zero crossing. + +16. **numerovBoundEnergy(r, l, n_range, energy_range)** + + parameters - *r* is an array of radial values to evaluate the bound energy at, *l* is an angular quantum number, *n_range* is a number specifying the maximum principal quantum number to evaluate and *energy_range* is an array of energy values at which to search for solutions. Calls *shootingMethod* routine and from scipy.optimize import brentq which is a root-finding routine. Returns the list of bound energies (*n*, *l*, energy). + +17. **numerovHydrogenicEnergies(parameters = {'points':2000, 'extent':[1e-8, 100], 'n_range': 5})** + + parameters - *parameters* is a dictionary of values defining the problem, these values are 'points' - number of radial sample points, 'extent' - radial range values and 'n_range' - is a number specifying the maximum principal quantum number to evaluate. Calls numerovBoundEnergy to compute the bound energy values. Returns a sorted list of bound energy values sorted by energies. For the parameters\ + numerovHydrogenicEnergies({'points':2000, 'extent':[1e-8, 100], 'n_range': 5})\ + The result is +``` + [(1, 0, -0.9999221089559599), (2, 1, -0.2500000156117056), (2, 0, -0.24999019020652957), + (3, 1, -0.11111111678091953), (3, 2, -0.11111111114690334), (3, 0, -0.11110820082299608), + (4, 1, -0.06250000255860046), (4, 2, -0.0625000000252697), (4, 3, -0.0625000000008716), + (4, 0, -0.062498771694931364), (5, 4, -0.039999998545078866), (5, 3, -0.0399999917769602), + (5, 2, -0.039999976852458416), (5, 1, -0.03999995861210411), (5, 0, -0.039999313973705056)] +``` + +18. **numerovEnergyVerify(boundEnergies)** + + parameters - *boundEnergies* are the energies computed by the above routine. Compares the computed *boundEnergies* with the theoretical values of -1.0/n2. Returns overall validity and a list of individual validity tests.The validity criterion is 1e-4. + +19. **numerovHydrogenicRadialDensity(parameters = {'points':2000, 'extent':[1e-8, 100], 'n_range': 5, 'radius':[0,15],'occupied': [1, True, False]})** + + parameters - *parameters* is a dictionary of values defining the problem, these values are 'points' - number of radial sample points, 'extent' - radial range values, 'n_range' - is a number specifying the maximum principal quantum number to evaluate, 'radius' - is the range of radial values for xlim and 'occupied' - is a list, the first entry is the atomic number of the hydrogenic type atom to plot and the second entry is a boolean which controls whether the orbitals should be considered as occupied. The third entry is a boolean which if True will plot the overall electron density in the radial direction. Plots the hydrogenic radial wavefunctions and returns a list of plotted states - each element of list is a 4-tuple containing (*n*, *l*, *e*, fermi level). As an example\ +numerovHydrogenicRadialDensity({'points':2000, 'extent':[1e-8, 100], 'n_range': 5, 'radius':[0,25],'occupied': [28, True, False]})\ + This plots the occupied hydrogenic wavefunctions for an atom with 28 electrons (Ni). + ![image](https://user-images.githubusercontent.com/73105740/136944573-ea821ba8-52e1-4a71-bb96-d672908124b4.png) + +Changing 'occupied'->[28, True, False] gives the total electron density + +![image](https://user-images.githubusercontent.com/73105740/136949551-e9cf391e-f154-4389-957e-ce24138fcb5d.png) + +The returned list is +``` +[(1, 0, -0.9999221089559599, 1.0), (2, 1, -0.2500000156117056, 1.0), (2, 0, -0.24999019020652957, 1.0), + (3, 1, -0.11111111678091953, 1.0), (3, 2, -0.11111111114690334, 1.0), (3, 0, -0.11110820082299608, 1.0)] +``` + +20. **numerovRadialVerify(n, l)** + + parameters - *n* is a principal quantum number, *l* is an angular quantum number. Routine plots Numerov wavefunction profile and scipy calculated profile for comparison. No return value, displays the plotted profiles for Numerov and Sympy radial wavefunctions for (n,l) = (1,0),(2,0),(2,1),(3,0),(3,1),(3,2). The resulting plot is + +![image](https://user-images.githubusercontent.com/73105740/137095203-360f13eb-9ac5-48c2-a3e8-072a8a0c4bda.png) + +21. **finiteDifferenceRadial(parameters = {'l': 0, 'points': 4000, 'extent':[0, 40], 'levels':25, 'show':5})** + + parameters - *parameters* is a directory of values defining the problem, these values are 'l' - quantum angular number, 'points' - are the number of data sample points, 'extent' - is a list denoting the range of the radial extent in nm, 'levels' - the number of eigenvalues to calculate and 'show' - the number of states to plot. This routine uses a three-point stencil finite difference method. The discrete radial grid is generated as an equidistant mesh between 'extent' in 'points' steps. The 'extent' should be sufficient to include contributing parts of the wavefunction. The default [0, 40] is sufficient for first 5 energy levels to an accuracy of two decimal places. Increasing 'points' can improve the accuracy up to a point. The 'show' levels are plotted and the legend shows the computed energy level in eV, included in [] after the computed value is the theoretical value of 1/(n+l)2 Ry. The plot is r and probability density. The default parameters produce the following plot + +![image](https://user-images.githubusercontent.com/73105740/137509411-06d0765b-327d-4843-884b-82b4d0b940f7.png) + +22. **hydrogenSpectralLines(type)** + + parameter - type is list of line types to be calculated, can be any or all of 'lyman', 'balmer' , 'paschen'. Routine computes the spectral lines for the specified series and returns a dictionary with the line names as keys. Each key entry is a list [energy (eV), wavelength (nm), transition as 'n->m']. The returned list for 'balmer' as an example is +``` + [[10.203347934756827, 121.5132237896726, '2->1'], [12.092934418025163, 102.52612460644374, '3->1'], + [12.754299650697403, 97.20970456674237, '4->1'], [13.060419709416564, 94.93122951524093, '5->1'], + [13.226707972305539, 93.73773909547381, '6->1']] +``` +23. **angularSolutionPlotProjection(m, l, parameters= {'points':70,'extent':[-0.5,0.5], 'alpha':0.3, 'color_map':'coolwarm', 'axes':'off','levels':20})** + + parameters - *m* is the magnetic quantum number, *l* is the angular quantum number and and *parameters* is a directory of values defining the plot. This routine displays a spherical harmonic defined by *m* and *l* according to the display conditions in *parameters* including contour projections on the plane surfaces. An example for Y3,1 is +![Screenshot from 2022-08-28 10-35-26](https://user-images.githubusercontent.com/73105740/187163257-ee8e453c-badc-4239-92b6-6b76edf1ee09.png) + +24. **monteCarloHydrogen(n, l, m, view='xy', plot=True)** + + parameters - *n* is the principal quantum number, *l* is the angular quantum number, *m* is the magnetic quantum number, *view* is the plane to display, *plot* is a boolean controlling the auxilliary plots. This routine uses Monte-Carlo techniques to plot a hydrogen orbital. If *plot* is true auxilliary plots of radial wavefunction and density distribution are plotted. The results for n,l,m = 6,3,1 are + ![image](https://user-images.githubusercontent.com/73105740/187165179-f5c98308-e956-4ac2-b46b-a8f72544e30c.png) +and + ![image](https://user-images.githubusercontent.com/73105740/187165497-a3d635ae-7c39-4270-8946-b4511237a5c4.png) + + +These routines can be run using the default parameters supplied from the command line as 'python h.py -\'. The available keys are\ + 'rp' - radialSolutionPlot (10)\ + 'rv' - radialVerify (8)\ + 'as' - angularSolutionPlotSingle (4)\ + 'af' - angularSolutionPlotFamily (5)\ + 'av' - angularVerify (6)\ + 'wc' - wavefunctionContour (12)\ + 'wv' - wavefunctionVerify (13)\ + 'ne' - numerovHydrogenicEnergies (17)\ + 'Nev'- numerovEnergyVerify (18)\ + 'NRv'- numerovRadialVerify (20)\ + 'Nw' - numerovHydrogenicRadialDensity (19)\ + 'fr' - finiteDifferenceRadial (21)\ + 'se' - hydrogenSpectralLines (22)\ + 'ap' - angularSolutionPlotProjection (23)\ + 'mc' - Monte-Carlo wavefunction diff --git a/document/integral.md b/document/integral.md new file mode 100644 index 0000000..313dbcd --- /dev/null +++ b/document/integral.md @@ -0,0 +1,157 @@ +# Integral Module - integrals and integral matrices + +This module uses code derived from the excellent article by Joshua Goings entitled 'A (hopefully)' +gentle guide to the computer implementation of molecular integrals over Gaussian basis functions' [see] +(https://joshuagoings.com/2017/04/28/integrals/) + +1. **e(ia, ja, type, r, ie, je)** + + parameters - *i* and *j* refer to basis functions, so ia is angular momentum on orbital i ie is exponent on orbital i. Type is an integer depends on integral being evaluated. *r* is tuple of vector between atom centers. Uses exp, returns float. + +2. **overlap(ia, ja, ie, je, ir, jr)** + + parameters - *i* and *j* refer to basis functions, so ir is atom center coordinates of i. Uses pow, returns float. + +3. **s(iBasis, jBasis)** + + parameters - *iBasis* , *jBasis* are basis objects. Returns overlap between iBasis and jBasis. Returns float. + +4. **buildOverlap(bases)** + + parameters - *bases* is an array of basis objects (the molecular basis). Computes the overlap matrix. Returns \[nbf, nbf] array where nbf are the number of basis functions. + +5. **kinetic(ia, ja, ie, je, ir, jr)** + + parameters - *i* and *j* refer to basis functions, so ir is atom center coordinates of i. Calls overlap returns float. Kinetic energy integral between two Gaussians. + +6. **k(iBasis, jBasis)** + + parameters - *iBasis* , *jBasis* are basis objects. Returns kinetic between contracted Gaussians and returns a float. + +7. **buildKinetic(bases)** + + parameters - *bases* is an array of basis objects (the molecular basis). Computes the kinetic matrix. Returns \[nbf, nbf] array. One electron exchange. + +8. **j(v, n, p, r, rnorm)** + + parameters - *v* is vector of order of Coulomb Hermite derivatives in x,y,z. *n* is order of Boys function. *p* is sum of exponents of functions comprising composite center and *r* is vector of distance between composite center *p* and a nuclear center *c*. *rnorm* is distance between *p* and *c*. Returns float, recursive function. Calls Boys. + +9. **coulomb(ia, ja, ie, je, ir, jr, kr)** + + parameters - *i* and *j* refer to basis functions, so kr is atom center coordinates of k. Computes the 1e-coulomb integral between two Gaussians. Calls e and j, returns float. + +10. **v(iBasis, jBasis, r)** + + parameters - *iBasis* , *jBasis* are basis objects, r is center of nucleus. Returns coulomb between contracted Gaussians for nuclear center c. Calls coulomb and returns float. + +11. **buildCoulomb(atoms, bases)** + + parameters - *bases* is an array of basis objects (the molecular basis) and *atoms* is an array of atom objects. Computes the nuclear repulsion integral matrix. Returns \[nbf,nbf] array. + +12. **er(ie, je, ke, le, ia, ja, ka, la, ir, jr, kr, lr)** + + parameters - *i*, *j*, *k*, *l* refer to basis functions, so *kr* is atom center coordinates of *k*. Computes the electron-electron repulsion between Gaussians. Calls e and j and uses math.pow. + +13. **eri(iBasis, jBasis, kBasis, lBasis)** + + parameters - *iBasis* , *jBasis*, *kBasis* and *lBasis* are basis objects. Returns 2-electron repulsion between contracted Gaussians and returns a float. Calls er. + +14. **buildEri(bases)** + + parameters - *bases* is an array of basis objects (the molecular basis). Computes the 2-electron repulsion integrals as a linear array. Symmetry is taken into account so only upper triangle of ij, kl matrix is stored. More information of handling the indexes of 2-electron integrals can be found in the Crawford project #3 [see](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2303). Integrals are in Mulliken (chemists) order. + +15. **iEri(i, j, k, l)** + + parameters - *i*, *j*, *k*, *l* are basis indexes. Returns a pointer into array formed in buildEri. + +16. **buildHamiltonian(type, S, K, J)** + + parameters - *type* method of initial guess for fock matrix, currently either 'core' or 'gwh'. *S* is overlap matrix, *K* is 1e-exchange matrix and *J* the 1e-coulomb matrix. If type is 'core' returns (J+K), (J+K). If 'gwh' returns (J+K), 1.75.S\[i,j].(H\[i,i] + H\[j,j])/2 - the generalised Wolfberg-Helmholtz approximation. Return values are core Hamiltonian, initial Fock guess. + +17. **buildDensity(n, occupiedOrbitals, C)** + + parameters - *n* is number of basis functions, *occupiedOrbitals* are the number of occupied orbitals (twice the number of electrons) and *C* are the eigenvectors of the final Fock matrix. This is C\[i,k].C\[j,k] with i,j over n and k over occupiedOrbitals. Returns \[nbf,nbf] array. + +18. **buildFock(H, eri, cycle, D, engine = 'aello')** + + parameters - *H* is the core Hamiltonian matrix, *eri* the linear array of 2-electron repulsion integrals, *cycle* the current SCF iteration (not needed for calculation) and *D* the density matrix. The last parameter is the integral engine selected either 'native' or 'aello'. the default is the cython **aello** engine (doesn't operate on first cycle). If density is a zero matrix then it's first cycle and Fock is equal to core Hamiltonian, otherwise equal to H plus G matrices. The G matrix is G\[i,m] = D\[k,l].(2 - ). Returns \[nbf,nbf] array. + +19. **boys(n, T)** + + parameters - *n* order of Boys function, *T* is point of evaluation. Calls the confluent hypergeometric function 1F1 from scipy.special. Returns float. Used in j. + +20. **mu(iBasis, jBasis, kr, direction)** + + parameters - *iBasis* and *jBasis* are basis objects. *kr* is atom center of atom *k* and *direction* is a cartesian axis \['x'|'y'|'z']. + +21. **dipole(ia, ja, ie, je, ir, jr, kr, direction)** + + parameters - *i*, *j*, *k* refer to basis functions, so *kr* is atom center coordinates of *k* and *direction* is a cartesian axis \['x'|'y'|'z']. Computes the dipole component in the 'direction' specified. Calls e, uses math.pow and returns float. Calls dipole, returns float. Note dipoleComponent and buildDipole are in post module. + +22. **buildEriMO(eigenvectors, ERI)** + + parameters - *eigenvectors* are eigenfunctions of final Fock matrix. *ERI* array of the 2-electron repulsion integrals. Transforms eri to the MO basis, following this scheme [see](https://github.com/CrawfordGroup/ProgrammingProjects/blob/master/Project%2304/hints/hint2.md). Returns linear array. + +23. **buildFockMOspin(spinOrbitals, eigenvectors, fock)** + + parameters - *spinOrbitals* are the number of spin orbitals (twice the number of basis functions), *eigenvectors* are eigenfunctions of final Fock matrix and *fock* the final Fock matrix. Transform Fock matrix from AO basis -> MO basis -> MO spin basis. Returns \[2nbf,2nbf] array. + +24. **buildEriSingleBar(spinOrbitals, eriMO)** + + parameters - *spinOrbitals* are the number of spin orbitals and *eriMO* are the 2-electron repulsion integrals in the MO basis. Returns as a \[2nbf,2nbf,2nbf,2nbf]) array. + +25. **buildEriSingleBar(spinOrbitals, eriMO)** + + parameters - *spinOrbitals* are the number of spin orbitals and *eriMO* are the 2-electron repulsion integrals in the MO basis. Returns as a \[2nbf,2nbf,2nbf,2nbf] array. - . + +26. **eriTransform(eri)** + + parameters - *eri* is a 2-electron repulsion integrals. ab|cd -> ac|bd. + +27. **expandEri(eriMO, nBasis)** + + parameters - *eriMO* the linear eri in the molecular basis and *nBasis* is the number of basis functions. Using this is a lot quicker than recalculating the tensor from scratch. returns eriMO as a 4-index tensor. + +28. **d(iBasis, jBasis, direction):** + + parameters - *iBasis* and *jBasis* are basis objects. *kr* is atom center of atom *k* and *direction* is a cartesian axis \[*x*|*y*|*z*]. Calls nabla to calculate matrix for vector differential operator. + +29. **nabla(ia, ja, ie, je, ir, jr, direction):** + + parameters - *i*, *j*, *k* refer to basis functions, so *kr* is atom center coordinates of k and direction is a cartesian axis \[*x*|*y*|*z*]. Computes the nabla component in the *direction* specified. Calls e, uses math.pow and returns float. Calls nabla, returns float. + +30. **buildNabla(atoms, bases, direction):** + + parameters - *bases* is an array of basis objects (the molecular basis). *atoms* is an array of atom objects. Computes the matrix for the vector differential operator (del or nabla). + +31. **ang(ia, ja, ie, je, ir, jr, kr, direction):** + + parameters - *i*, *j*, *k* refer to basis functions, so *kr* is atom center coordinates of k and direction is a cartesian axis \[*x*|*y*|*z*]. Computes the angular momentum component in the *direction* specified. Calls e, uses math.pow and returns float. Returns float. + +32. **a(iBasis, jBasis, kr, direction):** + + parameters - *iBasis* and *jBasis* are basis objects. *kr* is atom center of atom *k* and *direction* is a cartesian axis \[*x*|*y*|*z*]. Calls ang to compute the angular momentum operator. + +33. **buildAngular(atoms, bases, direction, gaugeOrigin):** + + parameters - *atoms* is an array of atom objects and *bases* is an array of basis objects (the molecular basis). Computes the angular momentum integral matrix in the *direction* specified using *gaugeOrigin*. + +34. **quadrupole(ia, ja, ie, je, ir, jr, kr, direction):** + + parameters - *i*, *j*, *k* refer to basis functions, so *kr* is atom center coordinates of k and direction is a cartesian axis \[*x*|*y*|*z*]. Computes the quadrupole momentum component in the *direction* specified. Calls e, uses math.pow and returns float. Returns float. + +35. **q(iBasis, jBasis, kr, direction):** + + parameters - *iBasis* and *jBasis* are basis objects. *kr* is atom center of atom *k* and *direction* is a cartesian axis \[*x*|*y*|*z*]. Calls quadrupole to compute the quadrupole moment operator. + +36. **electricField(atoms, bases, direction, gaugeOrigin):** + + parameters - *atoms* is an array of atom objects and *bases* is an array of basis objects (the molecular basis). Computes the electric field integral matrix in the *direction* specified using *gaugeOrigin*. + +37. **ef(iBasis, jBasis, kr, direction):** + + parameters - *iBasis* and *jBasis* are basis objects. *kr* is atom center of atom *k* and *direction* is a cartesian axis \[*x*|*y*|*z*]. Calls quadrupole to compute the electric field operator. + +38. **electric(ia, ja, ie, je, ir, jr, kr, direction):** + + parameters - *i*, *j*, *k* refer to basis functions, so *kr* is atom center coordinates of k and direction is a cartesian axis \[*x*|*y*|*z*]. Computes the electric field component in the *direction* specified. Calls e, uses math.pow and returns float. Returns float. diff --git a/document/mbpt.md b/document/mbpt.md new file mode 100644 index 0000000..0d1f8a5 --- /dev/null +++ b/document/mbpt.md @@ -0,0 +1,133 @@ +# Many-body Perturbation Theory + +This module will generate the Hugenholtz diagrams for a particular order (nodes). It will then generate all 'hole' and particle combinations for the base diagrams ie up and down arrow combinations. An HTML file of the equtions for each diagram can be generated, and an example of how to generate python code to evaluate the equations automatically is given. The algorthms are based on those in [this paper](http://cds.cern.ch/record/609508/files/0303069.pdf). Also see Szabo and Ostlund (pg 256-262). + +The rules for constructing a Hugenholtz diagram are:\ +For an *n*th order diagram, n dots (vertices) are drawn in a column. These vertices are connected by directed lines subject to the conditions +1. Each vertex has two lines pointing in and two pointing out. +2. Each diagram is connected, i.e. one must be able to go from any one vertex to any other by following some number of lines. +3. No line connects a vertex with itself. +4. Each diagram is topologically distinct. + +As an example, this is a 4th diagram \ +![](../media/hugenholtz.png) + +There are the following routines.\ +    0. **diagrams_hh**\ +         Is a global list containing each \[base diagram, up arrow diagram] pair. + +1. **nodalPairCount_hh(order)**\ + parameter - *order* is the order of the diagram set required. Returns the number of pairs of adjacent nodes in the diagram. For the example above **6**. + +2. **nodalLineCount_hh(order)**\ + parameter - *order* is the order of the diagram set required. Returns the number of lines in the diagram. For the example above **8**. + +3. **nodalPairs_hh(order)**\ + parameter - *order* is the order of the diagram set required. Returns a set of sets of nodal pairs. For the example above \[\[0,1],\[0,2],\[0,3],\[1,2],\[1,3],\[2,3]]. + +4. **validDiagrams_hh(diagrams, order)**\ + parameters - *diagrams* is a list of diagram specifications (see below), and *order* is the order of the diagrams. The diagram specifications are checked for 4 lines at each node (construction rule 1) and that the diagram is connected (construction rule 2). Returns a boolean flag True is verified, False otherwise. + +5. **nodalPairConnectionsCombinations_hh(connections, nodePair, pairCount, order)**\ + parameters - *connections* is a list of lists, initially set to \[[0] \* nodalPairCount_hh(order)], on exit will contain specification of each node pair, *nodePair* initially set to 0, *pairCount* the number of nodalPairs and *order* is the order of diagrams. This is a recursive routine which builds all possible combinations of lines between the nodes. The number of combinations to reduced to only those valid according to the construction rules. The routine returns a list of all valid combinations for that order eg order 3 will just return [2,2,2], but order 4 will return 12 diagrams including [2,1,1,1,1,2] which is our example. Each diagram can itself have several combinations of up and down arrows as long as they comply with construction rule 1. + +6. **upArrowCombinations_hh(diagramCombinations,order)**\ + parameters - *diagramCombinations* is a list of valid diagrams as returned by the above routine, *order* is the order of diagrams. This routine loops over the diagrams calling upArrow_hh to generate all possible up arrow combinations for the diagram. Returns a list of all valid possible up arrow combinations. For our example [2,1,1,1,1,2] with produce (among others) [1,1,0,0,1,1]. + +7. **upArrow_hh(up, nodePair, diagram, pairs, pairCount, order)**\ + parameters - *up* is a list of the number of up arrows at each node, initially set to \[\[0] * pairCount]. On exit it will contain the valid combinations of up lines at each node. *nodePair* is initially 0, *diagram* is the diagram specification, *pairs* is the list of nodal pairs for this order, *pairCount* is the number of nodal pairs. Recursively calls itself to generate all possible up arrow combinations which are checked for validity before being returned by the next routine... + +8. **verifyArrow_hh(up, pairs, diagram, order)**\ + parameters - *up* is the specification of up arrow lines at each node of the diagram, *pairs* is the list of nodal pairs, *diagram* is the specification of the diagram being considered and *order* is the order of the diagram. Checks number of up arrows is exactly 2. Returns boolean True if valid, False otherwise. + +9. **downArrow_hh(diagram, arrow, pairs)**\ + parameters - *diagram* is the base diagram, *arrow* is the up arrow specification and *pairs* are the nodal pair combinations. Returns the down arrow configuation matching the given up arrow one. For our example will return \[1,0,1,1,0,1]. + +As an example running +```python +import numpy as np + +order = 3 +diagrams_hh = [] + +pairCount = nodalPairCount_hh(order) +connections = [[0] * pairCount] +nodePair = 0 + +diagramCombinations = nodalPairConnectionsCombinations_hh(connections, nodePair, pairCount, order) +upArrowCombinations_hh(diagramCombinations, order) + +d = [] + +for i, diagram in enumerate(diagrams_hh): + if diagram[0] != d: + print('Base diagram ', diagram[0]) + d = diagram[0] + print(' arrow combination [',i,'] ', diagram[1], downArrow_hh(diagram[0], diagram[1], nodalPairs_hh(order))) +``` +will give +``` +Base diagram [2, 2, 2] + arrow combination [ 0 ] [0, 2, 0] [2, 0, 2] + arrow combination [ 1 ] [1, 1, 1] [1, 1, 1] + arrow combination [ 2 ] [2, 0, 2] [0, 2, 0] +``` +10. **connectionFlow_hh(up, down, order)**\ + parameters - *up* the up arrow specification of a diagram, *down* the down arrow combination of a diagram and *order* is the order of the diagrams. This routine generates a full description of the arrows at each node. Each node will have four entries, one for each line connecting it. The specification is of the form \[node 1, node 2, 'u'|'d', 'i'|'o', 'a'] where node n specifies the nodes defining the pair, 'u' or 'd' specify whether the line is up or down, 'i' or 'o' specifies whether the line in in or out of the node and 'a' can be any literal label. The labelling here is 'a-h' for down lines and 'r-y' for up. + For node 0 for our example the specification would be \[0,1,'d','o','a'],\[0,1,'u','i','r'],\[0,2,'d','o','b'],\[0,3,'u','i','s']. Note Szabo and Ostlund number their nodes from the bottom up - this is equivalent to swapping up and down arrow labels - this routines changes to this numbering. + +11. **rules_hh(flows, order)**\ + parameters - *flows* the specification of lines at nodes as produced by connectionFlow_hh, *order* is the order of the diagrams. This routine evalutes the rules for determining the analytic expressions for the energy corrections. These rules are + 1. Each dot contributes an antisymmetric matrix element 1in2||out1out2> to the numerator. + 2. Each pair of adjacent vertices contributes the denominator factor **Σ** εholes - **Σ** εparticles + where the sums run over the labels of all hole and particle lines ceossing an imaginary line separating the pair of vertices. + 3. The overall sign of the expression is(-1)h+l, where *h* and *l* are the number of hole lines and closed loops respectively. + 4. Sum expression over all hole and particle indices. + 5. Multiply the expression by a weight factor 2-2, where k is the number of equivalent lines. Two lines are equivalent is they share the same nodes and their directions are the same. + + This routine will return for order 3 +``` +[0,2,0] +['abrs,cdab,rscd', ['a+b-r-s', 'c+d-r-s'], [4, 2], ['a->r->c->a', 'b->s->d->b'], 3] + +[2,0,2] +['abrs,rstu,tuab', ['a+b-r-s', 'a+b-t-u'], [2, 2], ['a->r->t->a', 'b->s->u->b'], 3] + +[1,1,1] +['abrs,rcat,stbc', ['a+b-r-s', 'b+c-s-t'], [3, 3], ['a->r->a', 'b->s->b', 'c->t->c'], 0] +``` +These values are \[the einsum type expression for the double bar integral product, the orbital energy sums in the denominator, hole lines and closed loops, closed loop calculation, equivalent lines]. + +These results can be compared with Szabo & Ostlund pg 361. It is not immediately clear that \[1,1,1] is equivalent to the S&O version, however we can see that +'abrs,rcat,stbc' is, since ab are just labels and can be swapped ->\ +'bars,rcbt,stac' which is since rs are also just labels ->\ +'basr,scbt,rtac' which changing order of terms and noting <12||34> = <21||43> -> +'abrs,cstb,rtac' which is the same as Szabo and Ostlund labelling. + +12. **HTMLDiagrams_hh(order, filename)**\ + parameters - *order* is the order of the diagrams and *filename* is a file descriptor. This routine will produce an HTML file specied by filename containing the algebraic representation of the diagrams. For order 3 the result is + ![](../media/order3.png) + +13. **codeDiagrams_hh(order)**\ + parameter - *order* is the order of the diagrams. This routine uses the results of the above routines to generate python code to evaluate MPn energies. The python code required to evaluate the energies is generated from the diagrams and then executed via exec() to return the moller-plesset energy. + +14. **mbptEvaluateMPn(scf, mp = [2, 3, 4])** \ + parameter - *scf* is the scf energy and *mp* is a list of mp-orders to be computed. Uses codeDiagrams to evaluate the requested energies. For default writes values to view module for HTML output and also returns a list of requested values. + +Example for water STO-3G +| level of theory | | +|-----------------|----------------| +| mp2 |-0.049150 | +| mp3 |-0.014188 | +| mp4 |-0.004690 | +| scf |-74.942080 | +| scf + correction | -75.010108 | + + + + + + + + + diff --git a/document/mp.md b/document/mp.md new file mode 100644 index 0000000..e6a81ce --- /dev/null +++ b/document/mp.md @@ -0,0 +1,31 @@ +# Moller-Plesset Module - post SCF calculations + +A discussion of MP2 can be found in [Crawford projects] (https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2304). + +1. **mollerPlesset(atoms, charge, bases, eigenVectors, eigenValues, ERI, e)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, *bases* is an array of basis objects (the molecular basis), *eigenVectors* are the eigenfunctions of the final Fock matrix and *eigenValues* the corresponding eigenvalues, *ERI* the 2-electron repulsion integrals and *e* the final SCF total energy. Calls mp2 and mp3 and returns mp2 (parallel and anti-parallel components) and mp3 energy corrections to the output module. + +2. **mp2(atoms, charge, bases, eigenVectors, eigenValues, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, *bases* is an array of basis objects (the molecular basis), *eigenVectors* are the eigenfunctions of the final Fock matrix and *eigenValues* the corresponding eigenvalues and *ERI* are the 2-electron repulsion integrals. *type* can be either 'p-ap' which returns the parallel and anti-parallel spin components of the mp2 correction (default), 'scs' which will return the spin-conponent scaled correction or 'no' which returns the natural orbitals and their occupations (Trunks, Salter, Sosa, Bartlett - Theory and implementation of MBPT density matrix. An application to one-electron properties [here](https://www.sciencedirect.com/science/article/abs/pii/0009261488802495)). Calls buildEriMO to transform ERI to the molecular basis, and returns are dependent on *type*. + +3. **mp3(atoms, charge, bases, eigenVectors, fock, ERI)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* is the molecular charge, *bases* is an array of basis objects (the molecular basis), *eigenVectors* are the eigenfunctions of the final Fock matrix, *fock* is the final Fock matrix and *ERI* are the 2-electron repulsion integrals. Calls buildEriMO to transform ERI to the molecular basis and returns the mp3 energy correction + +4. **orbitalOptimisedMP2(eigenVectors, h, e, molBasis, eNuclear, ERI, nElectrons)** + + parameters - *eigenVectors* are the final orbital coefficients, *h* is the core hamiltonian, *e* are the final orbital energies, *molBasis* is an array of basis objects( the molecular basis), *eNuclear* is the nuclear repulsion energy, *ERI* are the 2-electron repulsion integrals and *nElectrons* are the number of electrons. Calls integral.iEri. This is a version of the algorithm found in psi4numpy tutorials [here](https://github.com/psi4/psi4numpy/blob/master/Tutorials/10_Orbital_Optimized_Methods/10a_orbital-optimized-mp2.ipynb). Outputs results to view.postSCF (*omp*). Contains functions hSpinBlock(h, spinOrbitals, nBasis), eriSpinBlock(eri, spinOrbitals, nBasis) and eriSpinMO(gao, eigenVectors). Returns omp energy. + +5. **eriMOpartition(eri, co, cv, nBasis, no, nv)** + + parameters - *eri* are the 2-electron repulsion integrals in tensor form, *co* and *cv* are partitioned orbital coefficients (co = c[:,o] cv = c[:,v]),*nBasis* is the number of basis functions, *no* and *nv* are the number of occupied and virtual orbitals. Returns eri as tensor [o,v,o,v]. + +6. **mp2LaplaceTransform(molBasis, c, ERI, eps, nOccupied, E, meshSize=40)** + + parameters - *molBasis* an array of basis objects (the molecular basis), *c* the orbital eigenfunctions, *ERI* the 2-electron repulsion integrals (linear), *eps* the orbital energies, *nOccupied* the number of occupied orbitals, *E* the converged scf energy and *meshSize* the size of the quadrature grid. Uses Laplace transforms based on psi4numpty [here](https://github.com/psi4/psi4numpy/blob/master/Moller-Plesset/LT-MP2.py). Sends results to postSCF (*mplp*) for output. Returns mp2Laplace energy correction. + +7. **mp2UnrelaxedDensity(c, e, eri, nbf, nOccupied)** + + parameters - *c* are the orbital eigenfunctions, *e* the orbital energies, *eri* the 2-electron repulsion integrals (linear), *nbf* are the number of basis functions and *nOccupied* are the number of doubly occupied orbitals. Returns the unrelaxed mp2 level density matrix. diff --git a/document/ocypete.html b/document/ocypete.html new file mode 100644 index 0000000..8391615 --- /dev/null +++ b/document/ocypete.html @@ -0,0 +1,3757 @@ + + + + + + Cython: ocypete.pyx + + + +

Generated by Cython 0.29.21

+

+ Yellow lines hint at Python interaction.
+ Click on a line that starts with a "+" to see the C code that Cython generated for it. +

+

Raw output: ocypete.c

+
+001: #cython: boundscheck=False, wraparound=False, nonecheck=False, initializedcheck=False, cdivision=True
+
  __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
 002: from libc.math cimport exp, pow, tgamma, sqrt, abs
+
 003: from scipy.special.cython_special cimport hyp1f1
+
 004: 
+
+005: import numpy as np
+
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
 006: cimport numpy as np
+
 007: 
+
+008: cdef double pi = 3.141592653589793238462643383279
+
  __pyx_v_7ocypete_pi = 3.141592653589793238462643383279;
+
 009: 
+
 010: #---------------------------------------Shared Routines -----------------------------------|
+
 011: 
+
+012: cdef double cye(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0):
+
static double __pyx_f_7ocypete_cye(int __pyx_v_ia, int __pyx_v_ja, int __pyx_v_type, double __pyx_v_r, double __pyx_v_ie, double __pyx_v_je, struct __pyx_opt_args_7ocypete_cye *__pyx_optional_args) {
+  int __pyx_v_n = ((int)0);
+  double __pyx_v_x = ((double)0.0);
+  double __pyx_v_p;
+  double __pyx_v_q;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("cye", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_n = __pyx_optional_args->n;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_x = __pyx_optional_args->x;
+      }
+    }
+  }
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+/* … */
+struct __pyx_opt_args_7ocypete_cye {
+  int __pyx_n;
+  int n;
+  double x;
+};
+
 013: 
+
 014: 	cdef:
+
+015: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
+016: 		double q = ie*je / p
+
  __pyx_v_q = ((__pyx_v_ie * __pyx_v_je) / __pyx_v_p);
+
 017: 
+
+018: 	if n == 0:
+
  __pyx_t_1 = ((__pyx_v_n == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+019: 		if (type < 0) or (type > (ia + ja)):
+
    __pyx_t_2 = ((__pyx_v_type < 0) != 0);
+    if (!__pyx_t_2) {
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+      goto __pyx_L5_bool_binop_done;
+    }
+    __pyx_t_2 = ((__pyx_v_type > (__pyx_v_ia + __pyx_v_ja)) != 0);
+    __pyx_t_1 = __pyx_t_2;
+    __pyx_L5_bool_binop_done:;
+    if (__pyx_t_1) {
+/* … */
+    }
+
+020: 			return 0.0
+
      __pyx_r = 0.0;
+      goto __pyx_L0;
+
+021: 		elif (ia + ja + type) == 0:
+
    __pyx_t_1 = ((((__pyx_v_ia + __pyx_v_ja) + __pyx_v_type) == 0) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+022: 			return exp(-q*r*r)
+
      __pyx_r = exp((((-__pyx_v_q) * __pyx_v_r) * __pyx_v_r));
+      goto __pyx_L0;
+
+023: 		elif ja == 0:
+
    __pyx_t_1 = ((__pyx_v_ja == 0) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+024: 			return (1/(2 * p)) * cye(ia-1,ja,type-1,r,ie,je) - (q*r/ie) * cye(ia-1,ja,type,r,ie,je) + \
+
      __pyx_r = ((((1.0 / (2.0 * __pyx_v_p)) * __pyx_f_7ocypete_cye((__pyx_v_ia - 1), __pyx_v_ja, (__pyx_v_type - 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)) - (((__pyx_v_q * __pyx_v_r) / __pyx_v_ie) * __pyx_f_7ocypete_cye((__pyx_v_ia - 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL))) + ((__pyx_v_type + 1) * __pyx_f_7ocypete_cye((__pyx_v_ia - 1), __pyx_v_ja, (__pyx_v_type + 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)));
+      goto __pyx_L0;
+
 025:                          (type+1) * cye(ia-1,ja,type+1,r,ie,je)
+
 026: 		else:
+
+027: 			return (1/(2 * p)) * cye(ia,ja-1,type-1,r,ie,je) + (q*r/je) * cye(ia,ja-1,type,r,ie,je) + \
+
    /*else*/ {
+/* … */
+      __pyx_r = ((((1.0 / (2.0 * __pyx_v_p)) * __pyx_f_7ocypete_cye(__pyx_v_ia, (__pyx_v_ja - 1), (__pyx_v_type - 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)) + (((__pyx_v_q * __pyx_v_r) / __pyx_v_je) * __pyx_f_7ocypete_cye(__pyx_v_ia, (__pyx_v_ja - 1), __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL))) + ((__pyx_v_type + 1) * __pyx_f_7ocypete_cye(__pyx_v_ia, (__pyx_v_ja - 1), (__pyx_v_type + 1), __pyx_v_r, __pyx_v_ie, __pyx_v_je, NULL)));
+      goto __pyx_L0;
+    }
+
 028:                          (type+1) * cye(ia,ja-1,type+1,r,ie,je)
+
 029: 	else:
+
+030: 		return cye(ia+1,ja,type,r,ie,je,n-1,x) + x * cye(ia,ja,type,r,ie,je,n-1,x)
+
  /*else*/ {
+    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n - 1);
+    __pyx_t_4.x = __pyx_v_x;
+    __pyx_t_3 = __pyx_f_7ocypete_cye((__pyx_v_ia + 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n - 1);
+    __pyx_t_4.x = __pyx_v_x;
+    __pyx_t_5 = __pyx_f_7ocypete_cye(__pyx_v_ia, __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_r = (__pyx_t_3 + (__pyx_v_x * __pyx_t_5));
+    goto __pyx_L0;
+  }
+
 031: 
+
 032: 
+
+033: cdef double efx(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0, int p = 0, int s = 0):
+
static double __pyx_f_7ocypete_efx(int __pyx_v_ia, int __pyx_v_ja, int __pyx_v_type, double __pyx_v_r, double __pyx_v_ie, double __pyx_v_je, struct __pyx_opt_args_7ocypete_efx *__pyx_optional_args) {
+  int __pyx_v_n = ((int)0);
+  double __pyx_v_x = ((double)0.0);
+  int __pyx_v_p = ((int)0);
+  int __pyx_v_s = ((int)0);
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("efx", 0);
+  if (__pyx_optional_args) {
+    if (__pyx_optional_args->__pyx_n > 0) {
+      __pyx_v_n = __pyx_optional_args->n;
+      if (__pyx_optional_args->__pyx_n > 1) {
+        __pyx_v_x = __pyx_optional_args->x;
+        if (__pyx_optional_args->__pyx_n > 2) {
+          __pyx_v_p = __pyx_optional_args->p;
+          if (__pyx_optional_args->__pyx_n > 3) {
+            __pyx_v_s = __pyx_optional_args->s;
+          }
+        }
+      }
+    }
+  }
+/* … */
+  /* function exit code */
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+/* … */
+struct __pyx_opt_args_7ocypete_efx {
+  int __pyx_n;
+  int n;
+  double x;
+  int p;
+  int s;
+};
+
+034: 	if p == 1:
+
  __pyx_t_1 = ((__pyx_v_p == 1) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+035: 		return 2.0 * ie * cye(ia+1, ja, type, r, ie, je, n, x) - ia * cye(ia-1, ja, type, r, ie, je, n, x)
+
    __pyx_t_3.__pyx_n = 2;
+    __pyx_t_3.n = __pyx_v_n;
+    __pyx_t_3.x = __pyx_v_x;
+    __pyx_t_2 = __pyx_f_7ocypete_cye((__pyx_v_ia + 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_t_3.__pyx_n = 2;
+    __pyx_t_3.n = __pyx_v_n;
+    __pyx_t_3.x = __pyx_v_x;
+    __pyx_t_4 = __pyx_f_7ocypete_cye((__pyx_v_ia - 1), __pyx_v_ja, __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_r = (((2.0 * __pyx_v_ie) * __pyx_t_2) - (__pyx_v_ia * __pyx_t_4));
+    goto __pyx_L0;
+
+036: 	elif s == 1:
+
  __pyx_t_1 = ((__pyx_v_s == 1) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+037: 		return 2.0 * je * cye(ia, ja+1, type, r, ie, je, n, x) - ja * cye(ia, ja-1, type, r, ie, je, n, x)
+
    __pyx_t_3.__pyx_n = 2;
+    __pyx_t_3.n = __pyx_v_n;
+    __pyx_t_3.x = __pyx_v_x;
+    __pyx_t_4 = __pyx_f_7ocypete_cye(__pyx_v_ia, (__pyx_v_ja + 1), __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_t_3.__pyx_n = 2;
+    __pyx_t_3.n = __pyx_v_n;
+    __pyx_t_3.x = __pyx_v_x;
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia, (__pyx_v_ja - 1), __pyx_v_type, __pyx_v_r, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_r = (((2.0 * __pyx_v_je) * __pyx_t_4) - (__pyx_v_ja * __pyx_t_2));
+    goto __pyx_L0;
+
 038: 
+
+039: cdef double ovlpfx(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, double ie, double je, \
+
static double __pyx_f_7ocypete_ovlpfx(int __pyx_v_ia0, int __pyx_v_ia1, int __pyx_v_ia2, int __pyx_v_ja0, int __pyx_v_ja1, int __pyx_v_ja2, double __pyx_v_ie, double __pyx_v_je, double __pyx_v_ir0, double __pyx_v_ir1, double __pyx_v_ir2, double __pyx_v_jr0, double __pyx_v_jr1, double __pyx_v_jr2, int *__pyx_v_n, double *__pyx_v_origin, int __pyx_v_x, int __pyx_v_center) {
+  int __pyx_v_pa;
+  int __pyx_v_pb;
+  double __pyx_v_t;
+  double __pyx_v_r0;
+  double __pyx_v_r1;
+  double __pyx_v_r2;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ovlpfx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 040:                    double ir0, double ir1, double ir2, double jr0, double jr1, double jr2, int[3] n, double[3] origin, int x, int center):
+
 041: 
+
 042: 	cdef:
+
+043: 		int pa = 0
+
  __pyx_v_pa = 0;
+
 044: 		int pb
+
+045: 		double t = 0.0
+
  __pyx_v_t = 0.0;
+
 046: 		double r0, r1, r2
+
 047: 
+
+048: 	if center == 0:
+
  __pyx_t_1 = ((__pyx_v_center == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+049: 		pa = 1
+
    __pyx_v_pa = 1;
+
+050: 	pb = (pa+1) % 2
+
  __pyx_v_pb = ((__pyx_v_pa + 1) % 2);
+
 051: 
+
+052: 	r0 = ir0 - jr0
+
  __pyx_v_r0 = (__pyx_v_ir0 - __pyx_v_jr0);
+
+053: 	r1 = ir1 - jr1
+
  __pyx_v_r1 = (__pyx_v_ir1 - __pyx_v_jr1);
+
+054: 	r2 = ir2 - jr2
+
  __pyx_v_r2 = (__pyx_v_ir2 - __pyx_v_jr2);
+
 055: 
+
+056: 	if x == 0:
+
  switch (__pyx_v_x) {
+    case 0:
+/* … */
+    break;
+    case 1:
+
+057: 		t =  efx(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0],pa ,pb )
+
    __pyx_t_3.__pyx_n = 4;
+    __pyx_t_3.n = (__pyx_v_n[0]);
+    __pyx_t_3.x = (__pyx_v_ir0 - (__pyx_v_origin[0]));
+    __pyx_t_3.p = __pyx_v_pa;
+    __pyx_t_3.s = __pyx_v_pb;
+    __pyx_t_2 = __pyx_f_7ocypete_efx(__pyx_v_ia0, __pyx_v_ja0, 0, __pyx_v_r0, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_v_t = __pyx_t_2;
+
+058: 		t *= cye(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[1]);
+    __pyx_t_4.x = (__pyx_v_ir1 - (__pyx_v_origin[1]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia1, __pyx_v_ja1, 0, __pyx_v_r1, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
+059: 		t *= cye(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[2]);
+    __pyx_t_4.x = (__pyx_v_ir2 - (__pyx_v_origin[2]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia2, __pyx_v_ja2, 0, __pyx_v_r2, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
+060: 	elif x == 1:
+
    break;
+    case 2:
+
+061: 		t =  cye(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[0]);
+    __pyx_t_4.x = (__pyx_v_ir0 - (__pyx_v_origin[0]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia0, __pyx_v_ja0, 0, __pyx_v_r0, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = __pyx_t_2;
+
+062: 		t *= efx(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1],pa ,pb )
+
    __pyx_t_3.__pyx_n = 4;
+    __pyx_t_3.n = (__pyx_v_n[1]);
+    __pyx_t_3.x = (__pyx_v_ir1 - (__pyx_v_origin[1]));
+    __pyx_t_3.p = __pyx_v_pa;
+    __pyx_t_3.s = __pyx_v_pb;
+    __pyx_t_2 = __pyx_f_7ocypete_efx(__pyx_v_ia1, __pyx_v_ja1, 0, __pyx_v_r1, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
+063: 		t *= cye(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[2]);
+    __pyx_t_4.x = (__pyx_v_ir2 - (__pyx_v_origin[2]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia2, __pyx_v_ja2, 0, __pyx_v_r2, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
+064: 	elif x == 2:
+
    break;
+    default: break;
+  }
+
+065: 		t =  cye(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[0]);
+    __pyx_t_4.x = (__pyx_v_ir0 - (__pyx_v_origin[0]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia0, __pyx_v_ja0, 0, __pyx_v_r0, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = __pyx_t_2;
+
+066: 		t *= cye(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1])
+
    __pyx_t_4.__pyx_n = 2;
+    __pyx_t_4.n = (__pyx_v_n[1]);
+    __pyx_t_4.x = (__pyx_v_ir1 - (__pyx_v_origin[1]));
+    __pyx_t_2 = __pyx_f_7ocypete_cye(__pyx_v_ia1, __pyx_v_ja1, 0, __pyx_v_r1, __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
+067: 		t *= efx(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2],pa ,pb )
+
    __pyx_t_3.__pyx_n = 4;
+    __pyx_t_3.n = (__pyx_v_n[2]);
+    __pyx_t_3.x = (__pyx_v_ir2 - (__pyx_v_origin[2]));
+    __pyx_t_3.p = __pyx_v_pa;
+    __pyx_t_3.s = __pyx_v_pb;
+    __pyx_t_2 = __pyx_f_7ocypete_efx(__pyx_v_ia2, __pyx_v_ja2, 0, __pyx_v_r2, __pyx_v_ie, __pyx_v_je, &__pyx_t_3); 
+    __pyx_v_t = (__pyx_v_t * __pyx_t_2);
+
 068: 
+
+069: 	return t * pow(pi/(ie+je), 1.5)
+
  __pyx_r = (__pyx_v_t * pow((__pyx_v_7ocypete_pi / (__pyx_v_ie + __pyx_v_je)), 1.5));
+  goto __pyx_L0;
+
 070: 
+
+071: cdef double kntcfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \
+
static double __pyx_f_7ocypete_kntcfx(int *__pyx_v_ia, int *__pyx_v_ja, double __pyx_v_ie, double __pyx_v_je, double *__pyx_v_ir, double *__pyx_v_jr, int *__pyx_v_n, double *__pyx_v_origin, int __pyx_v_x, int __pyx_v_center) {
+  int __pyx_v_pa;
+  int __pyx_v_pb;
+  int __pyx_v_i;
+  double __pyx_v_t[3];
+  double __pyx_v_mu[3];
+  double __pyx_v_nu[3];
+  double __pyx_v_vu[3];
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("kntcfx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 072:                int[3] n, double[3] origin, int x, int center):
+
 073: 
+
 074: 	#cases for center 'a' and center 'b'
+
 075: 	cdef:
+
+076: 		int pa = 0
+
  __pyx_v_pa = 0;
+
 077: 		int pb, i
+
 078: 		double[3] t
+
 079: 		double[3] mu, nu, vu
+
 080: 
+
+081: 	if center == 0:
+
  __pyx_t_1 = ((__pyx_v_center == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+  }
+
+082: 		pa = 1
+
    __pyx_v_pa = 1;
+
+083: 	pb = (pa+1) % 2
+
  __pyx_v_pb = ((__pyx_v_pa + 1) % 2);
+
 084: 
+
+085: 	for i in range(0, 3):
+
  for (__pyx_t_2 = 0; __pyx_t_2 < 3; __pyx_t_2+=1) {
+    __pyx_v_i = __pyx_t_2;
+
+086: 		mu[i] = (2*ja[i] + 1) * je
+
    (__pyx_v_mu[__pyx_v_i]) = (((2 * (__pyx_v_ja[__pyx_v_i])) + 1) * __pyx_v_je);
+
+087: 		nu[i] = -2*pow(je,2)
+
    (__pyx_v_nu[__pyx_v_i]) = (-2.0 * pow(__pyx_v_je, 2.0));
+
+088: 		vu[i] = -0.5 * ja[i]* (ja[i]-1)
+
    (__pyx_v_vu[__pyx_v_i]) = ((-0.5 * (__pyx_v_ja[__pyx_v_i])) * ((__pyx_v_ja[__pyx_v_i]) - 1));
+
+089: 		t[i] = 0.0
+
    (__pyx_v_t[__pyx_v_i]) = 0.0;
+  }
+
 090: 
+
+091: 	for i in range(0, 3):
+
  for (__pyx_t_2 = 0; __pyx_t_2 < 3; __pyx_t_2+=1) {
+    __pyx_v_i = __pyx_t_2;
+
 092: 
+
+093: 		if i == x:
+
    __pyx_t_1 = ((__pyx_v_i == __pyx_v_x) != 0);
+    if (__pyx_t_1) {
+/* … */
+      goto __pyx_L8;
+    }
+
+094: 			t[x] = mu[x] * efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \
+
      __pyx_t_4.__pyx_n = 4;
+      __pyx_t_4.n = (__pyx_v_n[__pyx_v_x]);
+      __pyx_t_4.x = ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_origin[__pyx_v_x]));
+      __pyx_t_4.p = __pyx_v_pa;
+      __pyx_t_4.s = __pyx_v_pb;
+      __pyx_t_3 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), (__pyx_v_ja[__pyx_v_x]), 0, ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+/* … */
+      (__pyx_v_t[__pyx_v_x]) = ((((__pyx_v_mu[__pyx_v_x]) * __pyx_t_3) + ((__pyx_v_nu[__pyx_v_x]) * __pyx_t_5)) + ((__pyx_v_vu[__pyx_v_x]) * __pyx_t_6));
+
+095: 			       nu[x] * efx(ia[x], ja[x] + 2 , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \
+
      __pyx_t_4.__pyx_n = 4;
+      __pyx_t_4.n = (__pyx_v_n[__pyx_v_x]);
+      __pyx_t_4.x = ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_origin[__pyx_v_x]));
+      __pyx_t_4.p = __pyx_v_pa;
+      __pyx_t_4.s = __pyx_v_pb;
+      __pyx_t_5 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), ((__pyx_v_ja[__pyx_v_x]) + 2), 0, ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+
+096: 				   vu[x] * efx(ia[x], ja[x] - 2, 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb )
+
      __pyx_t_4.__pyx_n = 4;
+      __pyx_t_4.n = (__pyx_v_n[__pyx_v_x]);
+      __pyx_t_4.x = ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_origin[__pyx_v_x]));
+      __pyx_t_4.p = __pyx_v_pa;
+      __pyx_t_4.s = __pyx_v_pb;
+      __pyx_t_6 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), ((__pyx_v_ja[__pyx_v_x]) - 2), 0, ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+
 097: 
+
 098: 		else:
+
+099: 			t[i] = mu[i] * cye(ia[i], ja[i] , 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \
+
      __pyx_t_7.__pyx_n = 2;
+      __pyx_t_7.n = (__pyx_v_n[__pyx_v_i]);
+      __pyx_t_7.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_origin[__pyx_v_i]));
+      __pyx_t_6 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), 0, ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_7); 
+/* … */
+      (__pyx_v_t[__pyx_v_i]) = ((((__pyx_v_mu[__pyx_v_i]) * __pyx_t_6) + ((__pyx_v_nu[__pyx_v_i]) * __pyx_t_5)) + ((__pyx_v_vu[__pyx_v_i]) * __pyx_t_3));
+    }
+    __pyx_L8:;
+  }
+
+100: 				   nu[i] * cye(ia[i], ja[i] + 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \
+
    /*else*/ {
+/* … */
+      __pyx_t_7.__pyx_n = 2;
+      __pyx_t_7.n = (__pyx_v_n[__pyx_v_i]);
+      __pyx_t_7.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_origin[__pyx_v_i]));
+      __pyx_t_5 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), ((__pyx_v_ja[__pyx_v_i]) + 2), 0, ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_7); 
+
+101: 				   vu[i] * cye(ia[i], ja[i] - 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i])
+
      __pyx_t_7.__pyx_n = 2;
+      __pyx_t_7.n = (__pyx_v_n[__pyx_v_i]);
+      __pyx_t_7.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_origin[__pyx_v_i]));
+      __pyx_t_3 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), ((__pyx_v_ja[__pyx_v_i]) - 2), 0, ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_7); 
+
 102: 
+
+103: 	for i in range(0, 3):
+
  for (__pyx_t_2 = 0; __pyx_t_2 < 3; __pyx_t_2+=1) {
+    __pyx_v_i = __pyx_t_2;
+
 104: 
+
+105: 		if i == x:
+
    __pyx_t_1 = ((__pyx_v_i == __pyx_v_x) != 0);
+    if (__pyx_t_1) {
+/* … */
+      goto __pyx_L11;
+    }
+
+106: 			t[(x+1) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb )
+
      __pyx_t_8 = ((__pyx_v_x + 1) % 3);
+      __pyx_t_4.__pyx_n = 4;
+      __pyx_t_4.n = (__pyx_v_n[__pyx_v_x]);
+      __pyx_t_4.x = ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_origin[__pyx_v_x]));
+      __pyx_t_4.p = __pyx_v_pa;
+      __pyx_t_4.s = __pyx_v_pb;
+      __pyx_t_3 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), (__pyx_v_ja[__pyx_v_x]), 0, ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+      (__pyx_v_t[__pyx_t_8]) = ((__pyx_v_t[__pyx_t_8]) * __pyx_t_3);
+
+107: 			t[(x+2) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb )
+
      __pyx_t_8 = ((__pyx_v_x + 2) % 3);
+      __pyx_t_4.__pyx_n = 4;
+      __pyx_t_4.n = (__pyx_v_n[__pyx_v_x]);
+      __pyx_t_4.x = ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_origin[__pyx_v_x]));
+      __pyx_t_4.p = __pyx_v_pa;
+      __pyx_t_4.s = __pyx_v_pb;
+      __pyx_t_3 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), (__pyx_v_ja[__pyx_v_x]), 0, ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_4); 
+      (__pyx_v_t[__pyx_t_8]) = ((__pyx_v_t[__pyx_t_8]) * __pyx_t_3);
+
 108: 		else:
+
+109: 			t[(i+1) % 3] *= cye(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i])
+
    /*else*/ {
+      __pyx_t_8 = ((__pyx_v_i + 1) % 3);
+      __pyx_t_7.__pyx_n = 2;
+      __pyx_t_7.n = (__pyx_v_n[__pyx_v_i]);
+      __pyx_t_7.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_origin[__pyx_v_i]));
+      __pyx_t_3 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), 0, ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_7); 
+      (__pyx_v_t[__pyx_t_8]) = ((__pyx_v_t[__pyx_t_8]) * __pyx_t_3);
+
+110: 			t[(i+2) % 3] *= cye(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i])
+
      __pyx_t_8 = ((__pyx_v_i + 2) % 3);
+      __pyx_t_7.__pyx_n = 2;
+      __pyx_t_7.n = (__pyx_v_n[__pyx_v_i]);
+      __pyx_t_7.x = ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_origin[__pyx_v_i]));
+      __pyx_t_3 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), 0, ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_7); 
+      (__pyx_v_t[__pyx_t_8]) = ((__pyx_v_t[__pyx_t_8]) * __pyx_t_3);
+    }
+    __pyx_L11:;
+  }
+
 111: 
+
+112: 	return (t[0] + t[1] + t[2]) * pow(pi/(ie+je), 1.5)
+
  __pyx_r = ((((__pyx_v_t[0]) + (__pyx_v_t[1])) + (__pyx_v_t[2])) * pow((__pyx_v_7ocypete_pi / (__pyx_v_ie + __pyx_v_je)), 1.5));
+  goto __pyx_L0;
+
 113: 
+
+114: cdef double boys(double m,double T):
+
static double __pyx_f_7ocypete_boys(double __pyx_v_m, double __pyx_v_T) {
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("boys", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+115: 	return hyp1f1(m+0.5,m+1.5,-T)/(2.0*m+1.0)
+
  __pyx_r = (__pyx_fuse_1__pyx_f_5scipy_7special_14cython_special_hyp1f1((__pyx_v_m + 0.5), (__pyx_v_m + 1.5), (-__pyx_v_T), 0) / ((2.0 * __pyx_v_m) + 1.0));
+  goto __pyx_L0;
+
 116: 
+
+117: cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2):
+
static double __pyx_f_7ocypete_clmb(int __pyx_v_l, int __pyx_v_m, int __pyx_v_n, int __pyx_v_bf, double __pyx_v_p, double __pyx_v_r0, double __pyx_v_r1, double __pyx_v_r2) {
+  double __pyx_v_t;
+  double __pyx_v_s;
+  double __pyx_v_nm;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clmb", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 118: 
+
 119: 	cdef double t, s, nm
+
+120: 	nm = sqrt(r0*r0 + r1*r1 + r2*r2)
+
  __pyx_v_nm = sqrt((((__pyx_v_r0 * __pyx_v_r0) + (__pyx_v_r1 * __pyx_v_r1)) + (__pyx_v_r2 * __pyx_v_r2)));
+
+121: 	t = p * nm * nm
+
  __pyx_v_t = ((__pyx_v_p * __pyx_v_nm) * __pyx_v_nm);
+
 122: 
+
+123: 	s = 0.0
+
  __pyx_v_s = 0.0;
+
+124: 	if (l+m+n)  == 0:
+
  __pyx_t_1 = ((((__pyx_v_l + __pyx_v_m) + __pyx_v_n) == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+125: 		s += pow(-2*p, bf) * boys(bf, t)
+
    __pyx_v_s = (__pyx_v_s + (pow((-2.0 * __pyx_v_p), __pyx_v_bf) * __pyx_f_7ocypete_boys(__pyx_v_bf, __pyx_v_t)));
+
+126: 	elif (l+m) == 0:
+
  __pyx_t_1 = (((__pyx_v_l + __pyx_v_m) == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+127: 		if n > 1:
+
    __pyx_t_1 = ((__pyx_v_n > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+128: 			s +=(n-1) * clmb(l,m,n-2,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_n - 1) * __pyx_f_7ocypete_clmb(__pyx_v_l, __pyx_v_m, (__pyx_v_n - 2), (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+129: 		s += r2 * clmb(l,m,n-1,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r2 * __pyx_f_7ocypete_clmb(__pyx_v_l, __pyx_v_m, (__pyx_v_n - 1), (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+130: 	elif l == 0:
+
  __pyx_t_1 = ((__pyx_v_l == 0) != 0);
+  if (__pyx_t_1) {
+/* … */
+    goto __pyx_L3;
+  }
+
+131: 		if m > 1:
+
    __pyx_t_1 = ((__pyx_v_m > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+132: 			s +=(m-1) * clmb(l,m-2,n,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_m - 1) * __pyx_f_7ocypete_clmb(__pyx_v_l, (__pyx_v_m - 2), __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+133: 		s += r1 * clmb(l,m-1,n,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r1 * __pyx_f_7ocypete_clmb(__pyx_v_l, (__pyx_v_m - 1), __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
 134: 	else:
+
+135: 		if l > 1:
+
  /*else*/ {
+    __pyx_t_1 = ((__pyx_v_l > 1) != 0);
+    if (__pyx_t_1) {
+/* … */
+    }
+
+136: 			s +=(l-1) * clmb(l-2,m,n,bf+1,p,r0,r1,r2)
+
      __pyx_v_s = (__pyx_v_s + ((__pyx_v_l - 1) * __pyx_f_7ocypete_clmb((__pyx_v_l - 2), __pyx_v_m, __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+
+137: 		s += r0 * clmb(l-1,m,n,bf+1,p,r0,r1,r2)
+
    __pyx_v_s = (__pyx_v_s + (__pyx_v_r0 * __pyx_f_7ocypete_clmb((__pyx_v_l - 1), __pyx_v_m, __pyx_v_n, (__pyx_v_bf + 1), __pyx_v_p, __pyx_v_r0, __pyx_v_r1, __pyx_v_r2)));
+  }
+  __pyx_L3:;
+
 138: 
+
+139: 	return s
+
  __pyx_r = __pyx_v_s;
+  goto __pyx_L0;
+
 140: 
+
+141: cdef double clmbsfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \
+
static double __pyx_f_7ocypete_clmbsfx(int *__pyx_v_ia, int *__pyx_v_ja, double __pyx_v_ie, double __pyx_v_je, double *__pyx_v_ir, double *__pyx_v_jr, __Pyx_memviewslice __pyx_v_nucleus, int *__pyx_v_n, CYTHON_UNUSED double *__pyx_v_origin, int __pyx_v_x, int __pyx_v_center) {
+  double __pyx_v_p;
+  double __pyx_v_q[3];
+  double __pyx_v_r[3];
+  int __pyx_v_i;
+  int __pyx_v_mu;
+  int __pyx_v_nu;
+  int __pyx_v_vu;
+  int __pyx_v_pa;
+  int __pyx_v_pb;
+  int __pyx_v_tau[3];
+  double __pyx_v_sum;
+  double __pyx_v_val;
+  int __pyx_v_xi[3];
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clmbsfx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 142:                double[:] nucleus, int[3] n, double[3] origin, int x, int center):
+
 143: 	#generalised coulomb derivatives dV(ab^(0,0,0))/dx terms
+
 144: 
+
 145: 	cdef:
+
+146: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
 147: 		double[3] q, r
+
 148: 		int i, mu, nu, vu, pa, pb
+
 149: 		int tau[3]
+
 150: 		double sum, val
+
 151: 		int[3] xi
+
 152: 
+
+153: 	for i in range(0, 3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+154: 		q[i] = (ie*ir[i] + je*jr[i])/p
+
    (__pyx_v_q[__pyx_v_i]) = (((__pyx_v_ie * (__pyx_v_ir[__pyx_v_i])) + (__pyx_v_je * (__pyx_v_jr[__pyx_v_i]))) / __pyx_v_p);
+
+155: 		tau[i] = ia[i] + ja[i] + n[i] + 1
+
    (__pyx_v_tau[__pyx_v_i]) = ((((__pyx_v_ia[__pyx_v_i]) + (__pyx_v_ja[__pyx_v_i])) + (__pyx_v_n[__pyx_v_i])) + 1);
+
+156: 		r[i] = q[i] - nucleus[i]
+
    __pyx_t_2 = __pyx_v_i;
+    (__pyx_v_r[__pyx_v_i]) = ((__pyx_v_q[__pyx_v_i]) - (*((double *) ( /* dim=0 */ (__pyx_v_nucleus.data + __pyx_t_2 * __pyx_v_nucleus.strides[0]) ))));
+  }
+
 157: 
+
+158: 	tau[x] += 1
+
  __pyx_t_1 = __pyx_v_x;
+  (__pyx_v_tau[__pyx_t_1]) = ((__pyx_v_tau[__pyx_t_1]) + 1);
+
 159: 
+
+160: 	pa = 0
+
  __pyx_v_pa = 0;
+
+161: 	if center == 0:
+
  __pyx_t_3 = ((__pyx_v_center == 0) != 0);
+  if (__pyx_t_3) {
+/* … */
+  }
+
+162: 		pa = 1
+
    __pyx_v_pa = 1;
+
+163: 	pb = (pa+1) % 2
+
  __pyx_v_pb = ((__pyx_v_pa + 1) % 2);
+
 164: 
+
+165: 	sum = 0.0
+
  __pyx_v_sum = 0.0;
+
+166: 	val = 1.0
+
  __pyx_v_val = 1.0;
+
 167: 
+
+168: 	for mu in range(0, tau[0]):
+
  __pyx_t_1 = (__pyx_v_tau[0]);
+  __pyx_t_4 = __pyx_t_1;
+  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
+    __pyx_v_mu = __pyx_t_5;
+
+169: 		for nu in range(0, tau[1]):
+
    __pyx_t_6 = (__pyx_v_tau[1]);
+    __pyx_t_7 = __pyx_t_6;
+    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
+      __pyx_v_nu = __pyx_t_8;
+
+170: 			for vu in range(0, tau[2]):
+
      __pyx_t_9 = (__pyx_v_tau[2]);
+      __pyx_t_10 = __pyx_t_9;
+      for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+        __pyx_v_vu = __pyx_t_11;
+
+171: 				val = 1.0
+
        __pyx_v_val = 1.0;
+
+172: 				xi = [mu,nu,vu]
+
        __pyx_t_12[0] = __pyx_v_mu;
+        __pyx_t_12[1] = __pyx_v_nu;
+        __pyx_t_12[2] = __pyx_v_vu;
+        memcpy(&(__pyx_v_xi[0]), __pyx_t_12, sizeof(__pyx_v_xi[0]) * (3));
+
+173: 				for i in range(0, 3):
+
        for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) {
+          __pyx_v_i = __pyx_t_13;
+
+174: 					if i == x:
+
          __pyx_t_3 = ((__pyx_v_i == __pyx_v_x) != 0);
+          if (__pyx_t_3) {
+/* … */
+            goto __pyx_L14;
+          }
+
+175: 						val *= efx(ia[x], ja[x], xi[x], ir[x]-jr[x], ie, je, n[x], ir[x]-nucleus[x], pa, pb)
+
            __pyx_t_2 = __pyx_v_x;
+            __pyx_t_15.__pyx_n = 4;
+            __pyx_t_15.n = (__pyx_v_n[__pyx_v_x]);
+            __pyx_t_15.x = ((__pyx_v_ir[__pyx_v_x]) - (*((double *) ( /* dim=0 */ (__pyx_v_nucleus.data + __pyx_t_2 * __pyx_v_nucleus.strides[0]) ))));
+            __pyx_t_15.p = __pyx_v_pa;
+            __pyx_t_15.s = __pyx_v_pb;
+            __pyx_t_14 = __pyx_f_7ocypete_efx((__pyx_v_ia[__pyx_v_x]), (__pyx_v_ja[__pyx_v_x]), (__pyx_v_xi[__pyx_v_x]), ((__pyx_v_ir[__pyx_v_x]) - (__pyx_v_jr[__pyx_v_x])), __pyx_v_ie, __pyx_v_je, &__pyx_t_15); 
+            __pyx_v_val = (__pyx_v_val * __pyx_t_14);
+
 176: 					else:
+
+177: 						val *=   cye(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i])
+
          /*else*/ {
+            __pyx_t_2 = __pyx_v_i;
+            __pyx_t_16.__pyx_n = 2;
+            __pyx_t_16.n = (__pyx_v_n[__pyx_v_i]);
+            __pyx_t_16.x = ((__pyx_v_ir[__pyx_v_i]) - (*((double *) ( /* dim=0 */ (__pyx_v_nucleus.data + __pyx_t_2 * __pyx_v_nucleus.strides[0]) ))));
+            __pyx_t_14 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), (__pyx_v_xi[__pyx_v_i]), ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_16); 
+            __pyx_v_val = (__pyx_v_val * __pyx_t_14);
+          }
+          __pyx_L14:;
+        }
+
 178: 
+
+179: 				sum += val * clmb(mu,nu,vu, 0, p, r[0], r[1], r[2] )
+
        __pyx_v_sum = (__pyx_v_sum + (__pyx_v_val * __pyx_f_7ocypete_clmb(__pyx_v_mu, __pyx_v_nu, __pyx_v_vu, 0, __pyx_v_p, (__pyx_v_r[0]), (__pyx_v_r[1]), (__pyx_v_r[2]))));
+      }
+    }
+  }
+
 180: 
+
+181: 	return sum * 2 * pi/p
+
  __pyx_r = (((__pyx_v_sum * 2.0) * __pyx_v_7ocypete_pi) / __pyx_v_p);
+  goto __pyx_L0;
+
 182: 
+
+183: cdef double clmbhfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \
+
static double __pyx_f_7ocypete_clmbhfx(int *__pyx_v_ia, int *__pyx_v_ja, double __pyx_v_ie, double __pyx_v_je, double *__pyx_v_ir, double *__pyx_v_jr, __Pyx_memviewslice __pyx_v_nucleus, int *__pyx_v_n, CYTHON_UNUSED double *__pyx_v_origin, int __pyx_v_x) {
+  double __pyx_v_p;
+  double __pyx_v_q[3];
+  double __pyx_v_r[3];
+  int __pyx_v_i;
+  int __pyx_v_mu;
+  int __pyx_v_nu;
+  int __pyx_v_vu;
+  int __pyx_v_tau[3];
+  double __pyx_v_sum;
+  double __pyx_v_val;
+  int __pyx_v_xi[3];
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("clmbhfx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 184:                double[:] nucleus, int[3] n, double[3] origin, int x):
+
 185: 	#generalised coulomb derivatives dV(ab^(0,0,0))/dx terms
+
 186: 
+
 187: 	cdef:
+
+188: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
 189: 		double[3] q, r
+
 190: 		int i, mu, nu, vu, pa, pb
+
 191: 		int[3] tau
+
 192: 		double sum, val
+
 193: 		int[3] xi
+
 194: 
+
+195: 	for i in range(0, 3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+196: 		q[i] = (ie*ir[i] + je*jr[i])/p
+
    (__pyx_v_q[__pyx_v_i]) = (((__pyx_v_ie * (__pyx_v_ir[__pyx_v_i])) + (__pyx_v_je * (__pyx_v_jr[__pyx_v_i]))) / __pyx_v_p);
+
+197: 		tau[i] = ia[i] + ja[i] + n[i] + 1
+
    (__pyx_v_tau[__pyx_v_i]) = ((((__pyx_v_ia[__pyx_v_i]) + (__pyx_v_ja[__pyx_v_i])) + (__pyx_v_n[__pyx_v_i])) + 1);
+
+198: 		r[i] = q[i] - nucleus[i]
+
    __pyx_t_2 = __pyx_v_i;
+    (__pyx_v_r[__pyx_v_i]) = ((__pyx_v_q[__pyx_v_i]) - (*((double *) ( /* dim=0 */ (__pyx_v_nucleus.data + __pyx_t_2 * __pyx_v_nucleus.strides[0]) ))));
+  }
+
 199: 
+
+200: 	sum = 0.0
+
  __pyx_v_sum = 0.0;
+
+201: 	val = 1.0
+
  __pyx_v_val = 1.0;
+
 202: 
+
+203: 	for mu in range(0, tau[0]):
+
  __pyx_t_1 = (__pyx_v_tau[0]);
+  __pyx_t_3 = __pyx_t_1;
+  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
+    __pyx_v_mu = __pyx_t_4;
+
+204: 		for nu in range(0, tau[1]):
+
    __pyx_t_5 = (__pyx_v_tau[1]);
+    __pyx_t_6 = __pyx_t_5;
+    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
+      __pyx_v_nu = __pyx_t_7;
+
+205: 			for vu in range(0, tau[2]):
+
      __pyx_t_8 = (__pyx_v_tau[2]);
+      __pyx_t_9 = __pyx_t_8;
+      for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
+        __pyx_v_vu = __pyx_t_10;
+
+206: 				val = 1.0
+
        __pyx_v_val = 1.0;
+
+207: 				xi = [mu,nu,vu]
+
        __pyx_t_11[0] = __pyx_v_mu;
+        __pyx_t_11[1] = __pyx_v_nu;
+        __pyx_t_11[2] = __pyx_v_vu;
+        memcpy(&(__pyx_v_xi[0]), __pyx_t_11, sizeof(__pyx_v_xi[0]) * (3));
+
+208: 				for i in range(0, 3):
+
        for (__pyx_t_12 = 0; __pyx_t_12 < 3; __pyx_t_12+=1) {
+          __pyx_v_i = __pyx_t_12;
+
+209: 					val *=   cye(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i])
+
          __pyx_t_2 = __pyx_v_i;
+          __pyx_t_14.__pyx_n = 2;
+          __pyx_t_14.n = (__pyx_v_n[__pyx_v_i]);
+          __pyx_t_14.x = ((__pyx_v_ir[__pyx_v_i]) - (*((double *) ( /* dim=0 */ (__pyx_v_nucleus.data + __pyx_t_2 * __pyx_v_nucleus.strides[0]) ))));
+          __pyx_t_13 = __pyx_f_7ocypete_cye((__pyx_v_ia[__pyx_v_i]), (__pyx_v_ja[__pyx_v_i]), (__pyx_v_xi[__pyx_v_i]), ((__pyx_v_ir[__pyx_v_i]) - (__pyx_v_jr[__pyx_v_i])), __pyx_v_ie, __pyx_v_je, &__pyx_t_14); 
+          __pyx_v_val = (__pyx_v_val * __pyx_t_13);
+        }
+
 210: 
+
+211: 				xi[x] += 1
+
        __pyx_t_12 = __pyx_v_x;
+        (__pyx_v_xi[__pyx_t_12]) = ((__pyx_v_xi[__pyx_t_12]) + 1);
+
 212: 
+
+213: 				sum -= val * clmb(xi[0],xi[1],xi[2], 0, p, r[0], r[1], r[2] )
+
        __pyx_v_sum = (__pyx_v_sum - (__pyx_v_val * __pyx_f_7ocypete_clmb((__pyx_v_xi[0]), (__pyx_v_xi[1]), (__pyx_v_xi[2]), 0, __pyx_v_p, (__pyx_v_r[0]), (__pyx_v_r[1]), (__pyx_v_r[2]))));
+      }
+    }
+  }
+
 214: 
+
+215: 	return sum * 2 * pi/p
+
  __pyx_r = (((__pyx_v_sum * 2.0) * __pyx_v_7ocypete_pi) / __pyx_v_p);
+  goto __pyx_L0;
+
 216: 
+
+217: cdef double teifx(short[:] ia, short[:] ja, short[:] ka, short[:] la, double ie, double je, double ke, double le, \
+
static double __pyx_f_7ocypete_teifx(__Pyx_memviewslice __pyx_v_ia, __Pyx_memviewslice __pyx_v_ja, __Pyx_memviewslice __pyx_v_ka, __Pyx_memviewslice __pyx_v_la, double __pyx_v_ie, double __pyx_v_je, double __pyx_v_ke, double __pyx_v_le, __Pyx_memviewslice __pyx_v_ir, __Pyx_memviewslice __pyx_v_jr, __Pyx_memviewslice __pyx_v_kr, __Pyx_memviewslice __pyx_v_lr, int *__pyx_v_ra, int *__pyx_v_rb, double *__pyx_v_origin, int __pyx_v_x, int __pyx_v_center) {
+  double __pyx_v_p;
+  double __pyx_v_q;
+  double __pyx_v_rho;
+  double __pyx_v_P[3];
+  double __pyx_v_Q[3];
+  double __pyx_v_r[3];
+  int __pyx_v_i;
+  int __pyx_v_pa;
+  int __pyx_v_pb;
+  int __pyx_v_mu;
+  int __pyx_v_nu;
+  int __pyx_v_vu;
+  int __pyx_v_psi;
+  int __pyx_v_phi;
+  int __pyx_v_chi;
+  int __pyx_v_xia[3];
+  int __pyx_v_xib[3];
+  int __pyx_v_tau[3];
+  int __pyx_v_sigma[3];
+  double __pyx_v_val;
+  double __pyx_v_term;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("teifx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 218: 	              double[:] ir, double[:] jr, double[:] kr, double[:] lr, int[3] ra, int[3] rb, double[3] origin, int x, int center):
+
 219: 
+
 220: 	cdef:
+
+221: 		double p = ie + je
+
  __pyx_v_p = (__pyx_v_ie + __pyx_v_je);
+
+222: 		double q = ke + le
+
  __pyx_v_q = (__pyx_v_ke + __pyx_v_le);
+
+223: 		double rho = p*q/(p + q)
+
  __pyx_v_rho = ((__pyx_v_p * __pyx_v_q) / (__pyx_v_p + __pyx_v_q));
+
 224: 		double[3] P, Q, r
+
 225: 		int i, pa, pb, mu, nu, vu, psi, phi, chi
+
 226: 		int[3] xia, xib, tau, sigma
+
+227: 		double val = 0.0
+
  __pyx_v_val = 0.0;
+
 228: 		double term
+
 229: 
+
+230: 	for i in range(0, 3):
+
  for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) {
+    __pyx_v_i = __pyx_t_1;
+
+231: 		P[i] = (ie*ir[i] + je*jr[i])/p
+
    __pyx_t_2 = __pyx_v_i;
+    __pyx_t_3 = __pyx_v_i;
+    (__pyx_v_P[__pyx_v_i]) = (((__pyx_v_ie * (*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_2 * __pyx_v_ir.strides[0]) )))) + (__pyx_v_je * (*((double *) ( /* dim=0 */ (__pyx_v_jr.data + __pyx_t_3 * __pyx_v_jr.strides[0]) ))))) / __pyx_v_p);
+
+232: 		Q[i] = (ke*kr[i] + le*lr[i])/q
+
    __pyx_t_3 = __pyx_v_i;
+    __pyx_t_2 = __pyx_v_i;
+    (__pyx_v_Q[__pyx_v_i]) = (((__pyx_v_ke * (*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_3 * __pyx_v_kr.strides[0]) )))) + (__pyx_v_le * (*((double *) ( /* dim=0 */ (__pyx_v_lr.data + __pyx_t_2 * __pyx_v_lr.strides[0]) ))))) / __pyx_v_q);
+
+233: 		r[i] = P[i] - Q[i]
+
    (__pyx_v_r[__pyx_v_i]) = ((__pyx_v_P[__pyx_v_i]) - (__pyx_v_Q[__pyx_v_i]));
+
 234: 
+
+235: 		tau[i] = ia[i] + ja[i] + 1 + ra[i]
+
    __pyx_t_2 = __pyx_v_i;
+    __pyx_t_3 = __pyx_v_i;
+    (__pyx_v_tau[__pyx_v_i]) = ((((*((short *) ( /* dim=0 */ (__pyx_v_ia.data + __pyx_t_2 * __pyx_v_ia.strides[0]) ))) + (*((short *) ( /* dim=0 */ (__pyx_v_ja.data + __pyx_t_3 * __pyx_v_ja.strides[0]) )))) + 1) + (__pyx_v_ra[__pyx_v_i]));
+
+236: 		sigma[i] = ka[i] + la[i] + 1 + rb[i]
+
    __pyx_t_3 = __pyx_v_i;
+    __pyx_t_2 = __pyx_v_i;
+    (__pyx_v_sigma[__pyx_v_i]) = ((((*((short *) ( /* dim=0 */ (__pyx_v_ka.data + __pyx_t_3 * __pyx_v_ka.strides[0]) ))) + (*((short *) ( /* dim=0 */ (__pyx_v_la.data + __pyx_t_2 * __pyx_v_la.strides[0]) )))) + 1) + (__pyx_v_rb[__pyx_v_i]));
+  }
+
 237: 
+
+238: 	if (center == 0) or (center == 1):
+
  switch (__pyx_v_center) {
+    case 0:
+    case 1:
+/* … */
+    break;
+    default:
+
+239: 		tau[x] += 1
+
    __pyx_t_1 = __pyx_v_x;
+    (__pyx_v_tau[__pyx_t_1]) = ((__pyx_v_tau[__pyx_t_1]) + 1);
+
 240: 	else:
+
+241: 		sigma[x] += 1
+
    __pyx_t_1 = __pyx_v_x;
+    (__pyx_v_sigma[__pyx_t_1]) = ((__pyx_v_sigma[__pyx_t_1]) + 1);
+    break;
+  }
+
 242: 
+
+243: 	pa = 0
+
  __pyx_v_pa = 0;
+
+244: 	if (center == 0) or (center == 2):
+
  switch (__pyx_v_center) {
+    case 0:
+    case 2:
+/* … */
+    break;
+    default: break;
+  }
+
+245: 		pa = 1
+
    __pyx_v_pa = 1;
+
+246: 	pb = (pa+1) % 2
+
  __pyx_v_pb = ((__pyx_v_pa + 1) % 2);
+
 247: 
+
+248: 	for mu in range(tau[0]):
+
  __pyx_t_1 = (__pyx_v_tau[0]);
+  __pyx_t_4 = __pyx_t_1;
+  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
+    __pyx_v_mu = __pyx_t_5;
+
+249: 		for nu in range(tau[1]):
+
    __pyx_t_6 = (__pyx_v_tau[1]);
+    __pyx_t_7 = __pyx_t_6;
+    for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_7; __pyx_t_8+=1) {
+      __pyx_v_nu = __pyx_t_8;
+
+250: 			for vu in range(tau[2]):
+
      __pyx_t_9 = (__pyx_v_tau[2]);
+      __pyx_t_10 = __pyx_t_9;
+      for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
+        __pyx_v_vu = __pyx_t_11;
+
+251: 				for psi in range(sigma[0]):
+
        __pyx_t_12 = (__pyx_v_sigma[0]);
+        __pyx_t_13 = __pyx_t_12;
+        for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
+          __pyx_v_psi = __pyx_t_14;
+
+252: 					for phi in range(sigma[1]):
+
          __pyx_t_15 = (__pyx_v_sigma[1]);
+          __pyx_t_16 = __pyx_t_15;
+          for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
+            __pyx_v_phi = __pyx_t_17;
+
+253: 						for chi in range(sigma[2]):
+
            __pyx_t_18 = (__pyx_v_sigma[2]);
+            __pyx_t_19 = __pyx_t_18;
+            for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_19; __pyx_t_20+=1) {
+              __pyx_v_chi = __pyx_t_20;
+
+254: 							xia = [mu, nu, vu]
+
              __pyx_t_21[0] = __pyx_v_mu;
+              __pyx_t_21[1] = __pyx_v_nu;
+              __pyx_t_21[2] = __pyx_v_vu;
+              memcpy(&(__pyx_v_xia[0]), __pyx_t_21, sizeof(__pyx_v_xia[0]) * (3));
+
+255: 							xib = [psi, phi, chi]
+
              __pyx_t_22[0] = __pyx_v_psi;
+              __pyx_t_22[1] = __pyx_v_phi;
+              __pyx_t_22[2] = __pyx_v_chi;
+              memcpy(&(__pyx_v_xib[0]), __pyx_t_22, sizeof(__pyx_v_xib[0]) * (3));
+
+256: 							term = 1.0
+
              __pyx_v_term = 1.0;
+
+257: 							for i in range(0, 3):
+
              for (__pyx_t_23 = 0; __pyx_t_23 < 3; __pyx_t_23+=1) {
+                __pyx_v_i = __pyx_t_23;
+
+258: 								if (i == x):
+
                __pyx_t_24 = ((__pyx_v_i == __pyx_v_x) != 0);
+                if (__pyx_t_24) {
+/* … */
+                  goto __pyx_L19;
+                }
+
+259: 									if (center == 0 or center == 1):
+
                  switch (__pyx_v_center) {
+                    case 0:
+                    case 1:
+/* … */
+                    break;
+                    case 2:
+
+260: 										term *= efx(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x], pa, pb)
+
                    __pyx_t_2 = __pyx_v_x;
+                    __pyx_t_3 = __pyx_v_x;
+                    __pyx_t_25 = __pyx_v_x;
+                    __pyx_t_26 = __pyx_v_x;
+                    __pyx_t_27 = __pyx_v_x;
+                    __pyx_t_29.__pyx_n = 4;
+                    __pyx_t_29.n = (__pyx_v_ra[__pyx_v_x]);
+                    __pyx_t_29.x = ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_27 * __pyx_v_ir.strides[0]) ))) - (__pyx_v_origin[__pyx_v_x]));
+                    __pyx_t_29.p = __pyx_v_pa;
+                    __pyx_t_29.s = __pyx_v_pb;
+                    __pyx_t_28 = __pyx_f_7ocypete_efx((*((short *) ( /* dim=0 */ (__pyx_v_ia.data + __pyx_t_2 * __pyx_v_ia.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_ja.data + __pyx_t_3 * __pyx_v_ja.strides[0]) ))), (__pyx_v_xia[__pyx_v_x]), ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_25 * __pyx_v_ir.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_jr.data + __pyx_t_26 * __pyx_v_jr.strides[0]) )))), __pyx_v_ie, __pyx_v_je, &__pyx_t_29); 
+                    __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+
+261: 										term *= cye(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x])
+
                    __pyx_t_27 = __pyx_v_x;
+                    __pyx_t_26 = __pyx_v_x;
+                    __pyx_t_25 = __pyx_v_x;
+                    __pyx_t_3 = __pyx_v_x;
+                    __pyx_t_2 = __pyx_v_x;
+                    __pyx_t_30.__pyx_n = 2;
+                    __pyx_t_30.n = (__pyx_v_rb[__pyx_v_x]);
+                    __pyx_t_30.x = ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_2 * __pyx_v_kr.strides[0]) ))) - (__pyx_v_origin[__pyx_v_x]));
+                    __pyx_t_28 = __pyx_f_7ocypete_cye((*((short *) ( /* dim=0 */ (__pyx_v_ka.data + __pyx_t_27 * __pyx_v_ka.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_la.data + __pyx_t_26 * __pyx_v_la.strides[0]) ))), (__pyx_v_xib[__pyx_v_x]), ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_25 * __pyx_v_kr.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_lr.data + __pyx_t_3 * __pyx_v_lr.strides[0]) )))), __pyx_v_ke, __pyx_v_le, &__pyx_t_30); 
+                    __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+
+262: 									elif (center == 2 or center == 3):
+
                    case 3:
+/* … */
+                    break;
+                    default: break;
+                  }
+
+263: 										term *= cye(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x])
+
                    __pyx_t_2 = __pyx_v_x;
+                    __pyx_t_3 = __pyx_v_x;
+                    __pyx_t_25 = __pyx_v_x;
+                    __pyx_t_26 = __pyx_v_x;
+                    __pyx_t_27 = __pyx_v_x;
+                    __pyx_t_30.__pyx_n = 2;
+                    __pyx_t_30.n = (__pyx_v_ra[__pyx_v_x]);
+                    __pyx_t_30.x = ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_27 * __pyx_v_ir.strides[0]) ))) - (__pyx_v_origin[__pyx_v_x]));
+                    __pyx_t_28 = __pyx_f_7ocypete_cye((*((short *) ( /* dim=0 */ (__pyx_v_ia.data + __pyx_t_2 * __pyx_v_ia.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_ja.data + __pyx_t_3 * __pyx_v_ja.strides[0]) ))), (__pyx_v_xia[__pyx_v_x]), ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_25 * __pyx_v_ir.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_jr.data + __pyx_t_26 * __pyx_v_jr.strides[0]) )))), __pyx_v_ie, __pyx_v_je, &__pyx_t_30); 
+                    __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+
+264: 										term *= efx(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x], pa, pb)
+
                    __pyx_t_27 = __pyx_v_x;
+                    __pyx_t_26 = __pyx_v_x;
+                    __pyx_t_25 = __pyx_v_x;
+                    __pyx_t_3 = __pyx_v_x;
+                    __pyx_t_2 = __pyx_v_x;
+                    __pyx_t_29.__pyx_n = 4;
+                    __pyx_t_29.n = (__pyx_v_rb[__pyx_v_x]);
+                    __pyx_t_29.x = ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_2 * __pyx_v_kr.strides[0]) ))) - (__pyx_v_origin[__pyx_v_x]));
+                    __pyx_t_29.p = __pyx_v_pa;
+                    __pyx_t_29.s = __pyx_v_pb;
+                    __pyx_t_28 = __pyx_f_7ocypete_efx((*((short *) ( /* dim=0 */ (__pyx_v_ka.data + __pyx_t_27 * __pyx_v_ka.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_la.data + __pyx_t_26 * __pyx_v_la.strides[0]) ))), (__pyx_v_xib[__pyx_v_x]), ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_25 * __pyx_v_kr.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_lr.data + __pyx_t_3 * __pyx_v_lr.strides[0]) )))), __pyx_v_ke, __pyx_v_le, &__pyx_t_29); 
+                    __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+
 265: 
+
 266: 								else:
+
+267: 									term *= cye(ia[i],ja[i],xia[i],ir[i]-jr[i],ie,je,ra[i],ir[i] - origin[i])
+
                /*else*/ {
+                  __pyx_t_2 = __pyx_v_i;
+                  __pyx_t_3 = __pyx_v_i;
+                  __pyx_t_25 = __pyx_v_i;
+                  __pyx_t_26 = __pyx_v_i;
+                  __pyx_t_27 = __pyx_v_i;
+                  __pyx_t_30.__pyx_n = 2;
+                  __pyx_t_30.n = (__pyx_v_ra[__pyx_v_i]);
+                  __pyx_t_30.x = ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_27 * __pyx_v_ir.strides[0]) ))) - (__pyx_v_origin[__pyx_v_i]));
+                  __pyx_t_28 = __pyx_f_7ocypete_cye((*((short *) ( /* dim=0 */ (__pyx_v_ia.data + __pyx_t_2 * __pyx_v_ia.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_ja.data + __pyx_t_3 * __pyx_v_ja.strides[0]) ))), (__pyx_v_xia[__pyx_v_i]), ((*((double *) ( /* dim=0 */ (__pyx_v_ir.data + __pyx_t_25 * __pyx_v_ir.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_jr.data + __pyx_t_26 * __pyx_v_jr.strides[0]) )))), __pyx_v_ie, __pyx_v_je, &__pyx_t_30); 
+                  __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+
+268: 									term *= cye(ka[i],la[i],xib[i],kr[i]-lr[i],ke,le,rb[i],kr[i] - origin[i])
+
                  __pyx_t_27 = __pyx_v_i;
+                  __pyx_t_26 = __pyx_v_i;
+                  __pyx_t_25 = __pyx_v_i;
+                  __pyx_t_3 = __pyx_v_i;
+                  __pyx_t_2 = __pyx_v_i;
+                  __pyx_t_30.__pyx_n = 2;
+                  __pyx_t_30.n = (__pyx_v_rb[__pyx_v_i]);
+                  __pyx_t_30.x = ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_2 * __pyx_v_kr.strides[0]) ))) - (__pyx_v_origin[__pyx_v_i]));
+                  __pyx_t_28 = __pyx_f_7ocypete_cye((*((short *) ( /* dim=0 */ (__pyx_v_ka.data + __pyx_t_27 * __pyx_v_ka.strides[0]) ))), (*((short *) ( /* dim=0 */ (__pyx_v_la.data + __pyx_t_26 * __pyx_v_la.strides[0]) ))), (__pyx_v_xib[__pyx_v_i]), ((*((double *) ( /* dim=0 */ (__pyx_v_kr.data + __pyx_t_25 * __pyx_v_kr.strides[0]) ))) - (*((double *) ( /* dim=0 */ (__pyx_v_lr.data + __pyx_t_3 * __pyx_v_lr.strides[0]) )))), __pyx_v_ke, __pyx_v_le, &__pyx_t_30); 
+                  __pyx_v_term = (__pyx_v_term * __pyx_t_28);
+                }
+                __pyx_L19:;
+              }
+
 269: 
+
+270: 							term *= pow(-1, (psi+phi+chi)) * clmb(mu+psi,nu+phi,vu+chi,0, rho,r[0], r[1], r[2])
+
              __pyx_v_term = (__pyx_v_term * (pow(-1.0, ((__pyx_v_psi + __pyx_v_phi) + __pyx_v_chi)) * __pyx_f_7ocypete_clmb((__pyx_v_mu + __pyx_v_psi), (__pyx_v_nu + __pyx_v_phi), (__pyx_v_vu + __pyx_v_chi), 0, __pyx_v_rho, (__pyx_v_r[0]), (__pyx_v_r[1]), (__pyx_v_r[2]))));
+
+271: 							val += term
+
              __pyx_v_val = (__pyx_v_val + __pyx_v_term);
+            }
+          }
+        }
+      }
+    }
+  }
+
 272: 
+
+273: 	return val*2*pow(pi,2.5)/(p*q*sqrt(p+q))
+
  __pyx_r = (((__pyx_v_val * 2.0) * pow(__pyx_v_7ocypete_pi, 2.5)) / ((__pyx_v_p * __pyx_v_q) * sqrt((__pyx_v_p + __pyx_v_q))));
+  goto __pyx_L0;
+
 274: 
+
 275: 
+
+276: cdef double erifx(short[:] ng, int p, int q, int r, int s, double[:,:] im, double[:,:] ic, double[:,:] ie, short[:,:] ia, double[:,:] io, \
+
static double __pyx_f_7ocypete_erifx(__Pyx_memviewslice __pyx_v_ng, int __pyx_v_p, int __pyx_v_q, int __pyx_v_r, int __pyx_v_s, __Pyx_memviewslice __pyx_v_im, __Pyx_memviewslice __pyx_v_ic, __Pyx_memviewslice __pyx_v_ie, __Pyx_memviewslice __pyx_v_ia, __Pyx_memviewslice __pyx_v_io, int __pyx_v_x, int __pyx_v_center) {
+  double __pyx_v_sum;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_k;
+  int __pyx_v_l;
+  double __pyx_r;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("erifx", 0);
+/* … */
+  /* function exit code */
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 277: 	              int x, int center):
+
 278: 
+
 279: 	cdef:
+
+280: 		double sum = 0.0
+
  __pyx_v_sum = 0.0;
+
 281: 		int i, j, k, l
+
 282: 
+
+283: 	for i in range(0, ng[p]):
+
  __pyx_t_1 = __pyx_v_p;
+  __pyx_t_2 = (*((short *) ( /* dim=0 */ (__pyx_v_ng.data + __pyx_t_1 * __pyx_v_ng.strides[0]) )));
+  __pyx_t_3 = __pyx_t_2;
+  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
+    __pyx_v_i = __pyx_t_4;
+
+284: 		for j in range(0, ng[q]):
+
    __pyx_t_1 = __pyx_v_q;
+    __pyx_t_5 = (*((short *) ( /* dim=0 */ (__pyx_v_ng.data + __pyx_t_1 * __pyx_v_ng.strides[0]) )));
+    __pyx_t_6 = __pyx_t_5;
+    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
+      __pyx_v_j = __pyx_t_7;
+
+285: 			for k in range(0, ng[r]):
+
      __pyx_t_1 = __pyx_v_r;
+      __pyx_t_8 = (*((short *) ( /* dim=0 */ (__pyx_v_ng.data + __pyx_t_1 * __pyx_v_ng.strides[0]) )));
+      __pyx_t_9 = __pyx_t_8;
+      for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
+        __pyx_v_k = __pyx_t_10;
+
+286: 				for l in range(0, ng[s]):
+
        __pyx_t_1 = __pyx_v_s;
+        __pyx_t_11 = (*((short *) ( /* dim=0 */ (__pyx_v_ng.data + __pyx_t_1 * __pyx_v_ng.strides[0]) )));
+        __pyx_t_12 = __pyx_t_11;
+        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
+          __pyx_v_l = __pyx_t_13;
+
+287: 					sum += im[p,i]*im[q,j]*im[r,k]*im[s,l] * ic[p,i]*ic[q,j]*ic[r,k]*ic[s,l] *   \
+
          __pyx_t_1 = __pyx_v_p;
+          __pyx_t_14 = __pyx_v_i;
+          __pyx_t_15 = __pyx_v_q;
+          __pyx_t_16 = __pyx_v_j;
+          __pyx_t_17 = __pyx_v_r;
+          __pyx_t_18 = __pyx_v_k;
+          __pyx_t_19 = __pyx_v_s;
+          __pyx_t_20 = __pyx_v_l;
+          __pyx_t_21 = __pyx_v_p;
+          __pyx_t_22 = __pyx_v_i;
+          __pyx_t_23 = __pyx_v_q;
+          __pyx_t_24 = __pyx_v_j;
+          __pyx_t_25 = __pyx_v_r;
+          __pyx_t_26 = __pyx_v_k;
+          __pyx_t_27 = __pyx_v_s;
+          __pyx_t_28 = __pyx_v_l;
+/* … */
+          __pyx_v_sum = (__pyx_v_sum + (((((((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_1 * __pyx_v_im.strides[0]) ) + __pyx_t_14 * __pyx_v_im.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_15 * __pyx_v_im.strides[0]) ) + __pyx_t_16 * __pyx_v_im.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_17 * __pyx_v_im.strides[0]) ) + __pyx_t_18 * __pyx_v_im.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_19 * __pyx_v_im.strides[0]) ) + __pyx_t_20 * __pyx_v_im.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ic.data + __pyx_t_21 * __pyx_v_ic.strides[0]) ) + __pyx_t_22 * __pyx_v_ic.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ic.data + __pyx_t_23 * __pyx_v_ic.strides[0]) ) + __pyx_t_24 * __pyx_v_ic.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ic.data + __pyx_t_25 * __pyx_v_ic.strides[0]) ) + __pyx_t_26 * __pyx_v_ic.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ic.data + __pyx_t_27 * __pyx_v_ic.strides[0]) ) + __pyx_t_28 * __pyx_v_ic.strides[1]) )))) * __pyx_f_7ocypete_teifx(__pyx_t_29, __pyx_t_30, __pyx_t_31, __pyx_t_32, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ie.data + __pyx_t_33 * __pyx_v_ie.strides[0]) ) + __pyx_t_34 * __pyx_v_ie.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ie.data + __pyx_t_35 * __pyx_v_ie.strides[0]) ) + __pyx_t_36 * __pyx_v_ie.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ie.data + __pyx_t_37 * __pyx_v_ie.strides[0]) ) + __pyx_t_38 * __pyx_v_ie.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_ie.data + __pyx_t_39 * __pyx_v_ie.strides[0]) ) + __pyx_t_40 * __pyx_v_ie.strides[1]) ))), __pyx_t_41, __pyx_t_42, __pyx_t_43, __pyx_t_44, __pyx_t_45, __pyx_t_46, __pyx_t_47, __pyx_v_x, __pyx_v_center)));
+          __PYX_XDEC_MEMVIEW(&__pyx_t_29, 1);
+          __pyx_t_29.memview = NULL;
+          __pyx_t_29.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_30, 1);
+          __pyx_t_30.memview = NULL;
+          __pyx_t_30.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_31, 1);
+          __pyx_t_31.memview = NULL;
+          __pyx_t_31.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_32, 1);
+          __pyx_t_32.memview = NULL;
+          __pyx_t_32.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_41, 1);
+          __pyx_t_41.memview = NULL;
+          __pyx_t_41.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_42, 1);
+          __pyx_t_42.memview = NULL;
+          __pyx_t_42.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_43, 1);
+          __pyx_t_43.memview = NULL;
+          __pyx_t_43.data = NULL;
+          __PYX_XDEC_MEMVIEW(&__pyx_t_44, 1);
+          __pyx_t_44.memview = NULL;
+          __pyx_t_44.data = NULL;
+        }
+      }
+    }
+  }
+
+288: 					       teifx(ia[p], ia[q], ia[r], ia[s], ie[p,i], ie[q,j], ie[r,k], ie[s,l], \
+
          __pyx_t_29.data = __pyx_v_ia.data;
+          __pyx_t_29.memview = __pyx_v_ia.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_29, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_ia.strides[0];
+        __pyx_t_29.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_29.shape[0] = __pyx_v_ia.shape[1];
+__pyx_t_29.strides[0] = __pyx_v_ia.strides[1];
+    __pyx_t_29.suboffsets[0] = -1;
+
+__pyx_t_30.data = __pyx_v_ia.data;
+          __pyx_t_30.memview = __pyx_v_ia.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_30, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_q;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_ia.strides[0];
+        __pyx_t_30.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_30.shape[0] = __pyx_v_ia.shape[1];
+__pyx_t_30.strides[0] = __pyx_v_ia.strides[1];
+    __pyx_t_30.suboffsets[0] = -1;
+
+__pyx_t_31.data = __pyx_v_ia.data;
+          __pyx_t_31.memview = __pyx_v_ia.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_31, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_r;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_ia.strides[0];
+        __pyx_t_31.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_31.shape[0] = __pyx_v_ia.shape[1];
+__pyx_t_31.strides[0] = __pyx_v_ia.strides[1];
+    __pyx_t_31.suboffsets[0] = -1;
+
+__pyx_t_32.data = __pyx_v_ia.data;
+          __pyx_t_32.memview = __pyx_v_ia.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_32, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_s;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_ia.strides[0];
+        __pyx_t_32.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_32.shape[0] = __pyx_v_ia.shape[1];
+__pyx_t_32.strides[0] = __pyx_v_ia.strides[1];
+    __pyx_t_32.suboffsets[0] = -1;
+
+__pyx_t_33 = __pyx_v_p;
+          __pyx_t_34 = __pyx_v_i;
+          __pyx_t_35 = __pyx_v_q;
+          __pyx_t_36 = __pyx_v_j;
+          __pyx_t_37 = __pyx_v_r;
+          __pyx_t_38 = __pyx_v_k;
+          __pyx_t_39 = __pyx_v_s;
+          __pyx_t_40 = __pyx_v_l;
+
+289: 					             io[p], io[q], io[r], io[s], [0,0,0], [0,0,0], [0,0,0], x, center)
+
          __pyx_t_41.data = __pyx_v_io.data;
+          __pyx_t_41.memview = __pyx_v_io.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_41, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_p;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_io.strides[0];
+        __pyx_t_41.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_41.shape[0] = __pyx_v_io.shape[1];
+__pyx_t_41.strides[0] = __pyx_v_io.strides[1];
+    __pyx_t_41.suboffsets[0] = -1;
+
+__pyx_t_42.data = __pyx_v_io.data;
+          __pyx_t_42.memview = __pyx_v_io.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_42, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_q;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_io.strides[0];
+        __pyx_t_42.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_42.shape[0] = __pyx_v_io.shape[1];
+__pyx_t_42.strides[0] = __pyx_v_io.strides[1];
+    __pyx_t_42.suboffsets[0] = -1;
+
+__pyx_t_43.data = __pyx_v_io.data;
+          __pyx_t_43.memview = __pyx_v_io.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_43, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_r;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_io.strides[0];
+        __pyx_t_43.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_43.shape[0] = __pyx_v_io.shape[1];
+__pyx_t_43.strides[0] = __pyx_v_io.strides[1];
+    __pyx_t_43.suboffsets[0] = -1;
+
+__pyx_t_44.data = __pyx_v_io.data;
+          __pyx_t_44.memview = __pyx_v_io.memview;
+          __PYX_INC_MEMVIEW(&__pyx_t_44, 0);
+          {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_s;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_io.strides[0];
+        __pyx_t_44.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_44.shape[0] = __pyx_v_io.shape[1];
+__pyx_t_44.strides[0] = __pyx_v_io.strides[1];
+    __pyx_t_44.suboffsets[0] = -1;
+
+__pyx_t_45[0] = 0;
+          __pyx_t_45[1] = 0;
+          __pyx_t_45[2] = 0;
+          __pyx_t_46[0] = 0;
+          __pyx_t_46[1] = 0;
+          __pyx_t_46[2] = 0;
+          __pyx_t_47[0] = 0.0;
+          __pyx_t_47[1] = 0.0;
+          __pyx_t_47[2] = 0.0;
+
 290: 
+
+291: 	return sum
+
  __pyx_r = __pyx_v_sum;
+  goto __pyx_L0;
+
 292: 
+
 293: #-----------------------------------End Shared Routines -----------------------------------|
+
 294: 
+
 295: 
+
+296: cpdef ocypete(object molAtom,object molBasis, double[:,:] density, double[:,:] fock):
+
static PyObject *__pyx_pw_7ocypete_1ocypete(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_f_7ocypete_ocypete(PyObject *__pyx_v_molAtom, PyObject *__pyx_v_molBasis, __Pyx_memviewslice __pyx_v_density, __Pyx_memviewslice __pyx_v_fock, CYTHON_UNUSED int __pyx_skip_dispatch) {
+  int __pyx_v_na;
+  int __pyx_v_nb;
+  int __pyx_v_ng;
+  int __pyx_v_i;
+  int __pyx_v_j;
+  int __pyx_v_p;
+  int __pyx_v_q;
+  int __pyx_v_r;
+  int __pyx_v_s;
+  PyObject *__pyx_v_mx = NULL;
+  PyObject *__pyx_v_mz = NULL;
+  __Pyx_memviewslice __pyx_v_alo_x = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_z = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_v_me = NULL;
+  PyObject *__pyx_v_mc = NULL;
+  PyObject *__pyx_v_mn = NULL;
+  PyObject *__pyx_v_ma = NULL;
+  PyObject *__pyx_v_mo = NULL;
+  PyObject *__pyx_v_ml = NULL;
+  PyObject *__pyx_v_mp = NULL;
+  __Pyx_memviewslice __pyx_v_alo_e = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_c = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_n = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_a = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo_o = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_alo = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_ala = { 0, 0, { 0 }, { 0 }, { 0 } };
+  double __pyx_v_ss;
+  double __pyx_v_sk;
+  double __pyx_v_sj;
+  double __pyx_v_sh;
+  double __pyx_v_si;
+  double __pyx_v_sf;
+  double __pyx_v_f;
+  double __pyx_v_ra;
+  double __pyx_v_rb;
+  double __pyx_v_force;
+  int __pyx_v_cart;
+  PyObject *__pyx_v_Sx = NULL;
+  PyObject *__pyx_v_Ix = NULL;
+  PyObject *__pyx_v_Hx = NULL;
+  PyObject *__pyx_v_Fx = NULL;
+  PyObject *__pyx_v_Wx = NULL;
+  PyObject *__pyx_v_Ex = NULL;
+  PyObject *__pyx_v_Vx = NULL;
+  __Pyx_memviewslice __pyx_v_overlapfx = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_teifx = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_oeifx = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_fockfx = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_weightedEnergy = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_energy = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_vires = { 0, 0, { 0 }, { 0 }, { 0 } };
+  long __pyx_v_atom;
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ocypete", 0);
+/* … */
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_8);
+  __Pyx_XDECREF(__pyx_t_9);
+  __Pyx_XDECREF(__pyx_t_10);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_11, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_12, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_18, 1);
+  __Pyx_XDECREF(__pyx_t_20);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_21, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_t_79, 1);
+  __Pyx_AddTraceback("ocypete.ocypete", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XDECREF(__pyx_v_mx);
+  __Pyx_XDECREF(__pyx_v_mz);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_x, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_z, 1);
+  __Pyx_XDECREF(__pyx_v_me);
+  __Pyx_XDECREF(__pyx_v_mc);
+  __Pyx_XDECREF(__pyx_v_mn);
+  __Pyx_XDECREF(__pyx_v_ma);
+  __Pyx_XDECREF(__pyx_v_mo);
+  __Pyx_XDECREF(__pyx_v_ml);
+  __Pyx_XDECREF(__pyx_v_mp);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_e, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_c, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_n, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_a, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo_o, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_alo, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_ala, 1);
+  __Pyx_XDECREF(__pyx_v_Sx);
+  __Pyx_XDECREF(__pyx_v_Ix);
+  __Pyx_XDECREF(__pyx_v_Hx);
+  __Pyx_XDECREF(__pyx_v_Fx);
+  __Pyx_XDECREF(__pyx_v_Wx);
+  __Pyx_XDECREF(__pyx_v_Ex);
+  __Pyx_XDECREF(__pyx_v_Vx);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_overlapfx, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_teifx, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_oeifx, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_fockfx, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_weightedEnergy, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_energy, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_vires, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* Python wrapper */
+static PyObject *__pyx_pw_7ocypete_1ocypete(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pw_7ocypete_1ocypete(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_molAtom = 0;
+  PyObject *__pyx_v_molBasis = 0;
+  __Pyx_memviewslice __pyx_v_density = { 0, 0, { 0 }, { 0 }, { 0 } };
+  __Pyx_memviewslice __pyx_v_fock = { 0, 0, { 0 }, { 0 }, { 0 } };
+  PyObject *__pyx_r = 0;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ocypete (wrapper)", 0);
+  {
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_molAtom,&__pyx_n_s_molBasis,&__pyx_n_s_density,&__pyx_n_s_fock,0};
+    PyObject* values[4] = {0,0,0,0};
+    if (unlikely(__pyx_kwds)) {
+      Py_ssize_t kw_args;
+      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
+      switch (pos_args) {
+        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+        CYTHON_FALLTHROUGH;
+        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+        CYTHON_FALLTHROUGH;
+        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+        CYTHON_FALLTHROUGH;
+        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+        CYTHON_FALLTHROUGH;
+        case  0: break;
+        default: goto __pyx_L5_argtuple_error;
+      }
+      kw_args = PyDict_Size(__pyx_kwds);
+      switch (pos_args) {
+        case  0:
+        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molAtom)) != 0)) kw_args--;
+        else goto __pyx_L5_argtuple_error;
+        CYTHON_FALLTHROUGH;
+        case  1:
+        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_molBasis)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("ocypete", 1, 4, 4, 1); __PYX_ERR(0, 296, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  2:
+        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_density)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("ocypete", 1, 4, 4, 2); __PYX_ERR(0, 296, __pyx_L3_error)
+        }
+        CYTHON_FALLTHROUGH;
+        case  3:
+        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fock)) != 0)) kw_args--;
+        else {
+          __Pyx_RaiseArgtupleInvalid("ocypete", 1, 4, 4, 3); __PYX_ERR(0, 296, __pyx_L3_error)
+        }
+      }
+      if (unlikely(kw_args > 0)) {
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "ocypete") < 0)) __PYX_ERR(0, 296, __pyx_L3_error)
+      }
+    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
+      goto __pyx_L5_argtuple_error;
+    } else {
+      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+    }
+    __pyx_v_molAtom = values[0];
+    __pyx_v_molBasis = values[1];
+    __pyx_v_density = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_density.memview)) __PYX_ERR(0, 296, __pyx_L3_error)
+    __pyx_v_fock = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_fock.memview)) __PYX_ERR(0, 296, __pyx_L3_error)
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("ocypete", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 296, __pyx_L3_error)
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("ocypete.ocypete", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_RefNannyFinishContext();
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_r = __pyx_pf_7ocypete_ocypete(__pyx_self, __pyx_v_molAtom, __pyx_v_molBasis, __pyx_v_density, __pyx_v_fock);
+  int __pyx_lineno = 0;
+  const char *__pyx_filename = NULL;
+  int __pyx_clineno = 0;
+
+  /* function exit code */
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static PyObject *__pyx_pf_7ocypete_ocypete(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_molAtom, PyObject *__pyx_v_molBasis, __Pyx_memviewslice __pyx_v_density, __Pyx_memviewslice __pyx_v_fock) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannyDeclarations
+  __Pyx_RefNannySetupContext("ocypete", 0);
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = __pyx_f_7ocypete_ocypete(__pyx_v_molAtom, __pyx_v_molBasis, __pyx_v_density, __pyx_v_fock, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 296, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  /* function exit code */
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("ocypete.ocypete", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __PYX_XDEC_MEMVIEW(&__pyx_v_density, 1);
+  __PYX_XDEC_MEMVIEW(&__pyx_v_fock, 1);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 297: 
+
 298: 	cdef:
+
+299: 		int na = len(molAtom)
+
  __pyx_t_1 = PyObject_Length(__pyx_v_molAtom); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 299, __pyx_L1_error)
+  __pyx_v_na = __pyx_t_1;
+
+300: 		int nb = len(molBasis)
+
  __pyx_t_1 = PyObject_Length(__pyx_v_molBasis); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 300, __pyx_L1_error)
+  __pyx_v_nb = __pyx_t_1;
+
+301: 		int	ng = len(molBasis[0].co)
+
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_molBasis, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 301, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_co); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 301, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Length(__pyx_t_3); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 301, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_ng = __pyx_t_1;
+
 302: 		int  i, j, k, l, m, n, p, q, r, s
+
 303: 
+
 304: #get largest primative length
+
+305: 	for i in range(nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_i = __pyx_t_6;
+
+306: 		j = len(molBasis[i].co)
+
    __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 306, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_co); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 306, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 306, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_v_j = __pyx_t_1;
+
+307: 		if j > ng:
+
    __pyx_t_7 = ((__pyx_v_j > __pyx_v_ng) != 0);
+    if (__pyx_t_7) {
+/* … */
+    }
+  }
+
+308: 			ng = j
+
      __pyx_v_ng = __pyx_v_j;
+
 309: 
+
 310: 	#convert atom class properties to c views
+
+311: 	mx = np.empty([na,3], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_na); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_int_3);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, __pyx_t_8); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 311, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_mx = __pyx_t_10;
+  __pyx_t_10 = 0;
+
+312: 	mz = np.empty([na], dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_na); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_10);
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_short); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_10, __pyx_t_2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 312, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_mz = __pyx_t_9;
+  __pyx_t_9 = 0;
+
 313: 	cdef:
+
+314: 		double[:,:] alo_x = mx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 314, __pyx_L1_error)
+  __pyx_v_alo_x = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+315: 		short[:]   alo_z = mz
+
  __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_v_mz, PyBUF_WRITABLE); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 315, __pyx_L1_error)
+  __pyx_v_alo_z = __pyx_t_12;
+  __pyx_t_12.memview = NULL;
+  __pyx_t_12.data = NULL;
+
+316: 	for p in range(0, na):
+
  __pyx_t_4 = __pyx_v_na;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+317: 		for q in range(0, 3):
+
    for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+318: 			alo_x[p,q] = molAtom[p].center[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molAtom, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 318, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_center); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 318, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_2, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 318, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 318, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_15 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_x.strides[1]) )) = __pyx_t_14;
+    }
+
+319: 		alo_z[p] = molAtom[p].number
+
    __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molAtom, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 319, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_number); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 319, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_17 = __Pyx_PyInt_As_short(__pyx_t_2); if (unlikely((__pyx_t_17 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 319, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __pyx_t_16 = __pyx_v_p;
+    *((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_16 * __pyx_v_alo_z.strides[0]) )) = __pyx_t_17;
+  }
+
 320: 
+
 321: 	#convert basis class properties to c-variables
+
+322: 	me = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __pyx_t_2 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 322, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_me = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+323: 	mc = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_9, 1, __pyx_t_10);
+  __pyx_t_3 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_double); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_10, __pyx_t_9); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 323, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_v_mc = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+324: 	mn = np.empty([nb,ng], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_ng); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = PyList_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __pyx_t_2 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_10, __pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 324, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_v_mn = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+325: 	ma = np.empty([nb,3],  dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_10 = PyList_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_3);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_10, 1, __pyx_int_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
+  __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_short); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (PyDict_SetItem(__pyx_t_10, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_3, __pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 325, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_v_ma = __pyx_t_2;
+  __pyx_t_2 = 0;
+
+326: 	mo = np.empty([nb,3],  dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_int_3);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
+  __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_9) < 0) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 326, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_mo = __pyx_t_9;
+  __pyx_t_9 = 0;
+
+327: 	ml = np.empty([nb],    dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_short); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 327, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_ml = __pyx_t_8;
+  __pyx_t_8 = 0;
+
+328: 	mp = np.empty([nb],    dtype = np.short)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_t_8);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_short); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 328, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_v_mp = __pyx_t_10;
+  __pyx_t_10 = 0;
+
 329: 
+
 330: 	cdef:
+
+331: 		double[:,:] alo_e = me
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_me, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 331, __pyx_L1_error)
+  __pyx_v_alo_e = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+332: 		double[:,:] alo_c = mc
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mc, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 332, __pyx_L1_error)
+  __pyx_v_alo_c = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+333: 		double[:,:] alo_n = mn
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mn, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 333, __pyx_L1_error)
+  __pyx_v_alo_n = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+334: 		short[:,:]  alo_a = ma
+
  __pyx_t_18 = __Pyx_PyObject_to_MemoryviewSlice_dsds_short(__pyx_v_ma, PyBUF_WRITABLE); if (unlikely(!__pyx_t_18.memview)) __PYX_ERR(0, 334, __pyx_L1_error)
+  __pyx_v_alo_a = __pyx_t_18;
+  __pyx_t_18.memview = NULL;
+  __pyx_t_18.data = NULL;
+
+335: 		double[:,:] alo_o = mo
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_mo, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 335, __pyx_L1_error)
+  __pyx_v_alo_o = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+336: 		short[:]    alo   = ml
+
  __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_v_ml, PyBUF_WRITABLE); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 336, __pyx_L1_error)
+  __pyx_v_alo = __pyx_t_12;
+  __pyx_t_12.memview = NULL;
+  __pyx_t_12.data = NULL;
+
+337: 		short[:]    ala   = mp
+
  __pyx_t_12 = __Pyx_PyObject_to_MemoryviewSlice_ds_short(__pyx_v_mp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 337, __pyx_L1_error)
+  __pyx_v_ala = __pyx_t_12;
+  __pyx_t_12.memview = NULL;
+  __pyx_t_12.data = NULL;
+
 338: 
+
+339: 	for p in range(0, nb):
+
  __pyx_t_4 = __pyx_v_nb;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
+    __pyx_v_p = __pyx_t_6;
+
+340: 		alo[p] = len(molBasis[p].co)
+
    __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 340, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_co); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 340, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 340, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_16 = __pyx_v_p;
+    *((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_16 * __pyx_v_alo.strides[0]) )) = __pyx_t_1;
+
+341: 		ala[p] = molBasis[p].atom
+
    __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 341, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_atom); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 341, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_17 = __Pyx_PyInt_As_short(__pyx_t_10); if (unlikely((__pyx_t_17 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 341, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __pyx_t_16 = __pyx_v_p;
+    *((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_16 * __pyx_v_ala.strides[0]) )) = __pyx_t_17;
+
+342: 		for q in range(0, len(molBasis[p].co)):
+
    __pyx_t_10 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 342, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_10);
+    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_co); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 342, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_9);
+    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+    __pyx_t_1 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 342, __pyx_L1_error)
+    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __pyx_t_19 = __pyx_t_1;
+    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_19; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+343: 			alo_e[p,q] = molBasis[p].ex[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_ex); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 343, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 343, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_16 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_e.strides[1]) )) = __pyx_t_14;
+
+344: 			alo_c[p,q] = molBasis[p].co[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 344, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_co); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 344, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 344, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 344, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_15 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_c.strides[1]) )) = __pyx_t_14;
+
+345: 			alo_n[p,q] = molBasis[p].normal[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 345, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_normal); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 345, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 345, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 345, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_16 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_n.strides[1]) )) = __pyx_t_14;
+    }
+
+346: 		for q in range(0, 3):
+
    for (__pyx_t_13 = 0; __pyx_t_13 < 3; __pyx_t_13+=1) {
+      __pyx_v_q = __pyx_t_13;
+
+347: 			alo_a[p,q] = molBasis[p].momentum[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 347, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_momentum); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 347, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 347, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_17 = __Pyx_PyInt_As_short(__pyx_t_9); if (unlikely((__pyx_t_17 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 347, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_15 = __pyx_v_p;
+      __pyx_t_16 = __pyx_v_q;
+      *((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_15 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_a.strides[1]) )) = __pyx_t_17;
+
+348: 			alo_o[p,q] = molBasis[p].center[q]
+
      __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_molBasis, __pyx_v_p, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 348, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_center); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 348, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_10);
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_10, __pyx_v_q, int, 1, __Pyx_PyInt_From_int, 0, 0, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 348, __pyx_L1_error)
+      __Pyx_GOTREF(__pyx_t_9);
+      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 348, __pyx_L1_error)
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __pyx_t_16 = __pyx_v_p;
+      __pyx_t_15 = __pyx_v_q;
+      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_16 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )) = __pyx_t_14;
+    }
+  }
+
 349: 
+
 350: 	#matrix definitions
+
 351: 	cdef:
+
 352: 		double ss, sk, sj, sh, si, sf, f, ra, rb, force
+
 353: 		int cart
+
+354: 	Sx = np.zeros([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_zeros); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_8);
+  __pyx_t_9 = 0;
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_9, __pyx_n_s_np); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_8, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 354, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_Sx = __pyx_t_3;
+  __pyx_t_3 = 0;
+
+355: 	Ix = np.zeros([nb,nb,nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_20 = PyList_New(4); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GIVEREF(__pyx_t_3);
+  PyList_SET_ITEM(__pyx_t_20, 0, __pyx_t_3);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_20, 1, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_20, 2, __pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_20, 3, __pyx_t_9);
+  __pyx_t_3 = 0;
+  __pyx_t_8 = 0;
+  __pyx_t_10 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_20);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_20);
+  __pyx_t_20 = 0;
+  __pyx_t_20 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_double); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_20, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, __pyx_t_20); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 355, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __pyx_v_Ix = __pyx_t_8;
+  __pyx_t_8 = 0;
+
+356: 	Hx = np.zeros([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_zeros); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_9);
+  __pyx_t_8 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_20, __pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 356, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_Hx = __pyx_t_10;
+  __pyx_t_10 = 0;
+
+357: 	Fx = np.zeros([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_20 = PyList_New(2); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_20, 0, __pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_20, 1, __pyx_t_9);
+  __pyx_t_10 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_20);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_20);
+  __pyx_t_20 = 0;
+  __pyx_t_20 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_double); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_20, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, __pyx_t_20); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 357, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __pyx_v_Fx = __pyx_t_8;
+  __pyx_t_8 = 0;
+
+358: 	Wx = np.zeros([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_zeros); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_t_9);
+  __pyx_t_8 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_20, __pyx_t_9, __pyx_t_2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 358, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_v_Wx = __pyx_t_10;
+  __pyx_t_10 = 0;
+
+359: 	Ex = np.zeros([nb,nb], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_nb); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_20 = PyList_New(2); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GIVEREF(__pyx_t_10);
+  PyList_SET_ITEM(__pyx_t_20, 0, __pyx_t_10);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyList_SET_ITEM(__pyx_t_20, 1, __pyx_t_9);
+  __pyx_t_10 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_20);
+  PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_20);
+  __pyx_t_20 = 0;
+  __pyx_t_20 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_np); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_10, __pyx_n_s_double); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  if (PyDict_SetItem(__pyx_t_20, __pyx_n_s_dtype, __pyx_t_8) < 0) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_9, __pyx_t_20); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 359, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __pyx_v_Ex = __pyx_t_8;
+  __pyx_t_8 = 0;
+
 360: 
+
+361: 	Vx = np.zeros([na,3], dtype = np.double)
+
  __Pyx_GetModuleGlobalName(__pyx_t_8, __pyx_n_s_np); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_zeros); if (unlikely(!__pyx_t_20)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_20);
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_na); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_9 = PyList_New(2); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_8);
+  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_t_8);
+  __Pyx_INCREF(__pyx_int_3);
+  __Pyx_GIVEREF(__pyx_int_3);
+  PyList_SET_ITEM(__pyx_t_9, 1, __pyx_int_3);
+  __pyx_t_8 = 0;
+  __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_GIVEREF(__pyx_t_9);
+  PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_9, __pyx_n_s_dtype, __pyx_t_10) < 0) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+  __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_20, __pyx_t_8, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 361, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_10);
+  __Pyx_DECREF(__pyx_t_20); __pyx_t_20 = 0;
+  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_v_Vx = __pyx_t_10;
+  __pyx_t_10 = 0;
+
 362: 	cdef:
+
+363: 		double[:,:]  overlapfx = Sx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Sx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 363, __pyx_L1_error)
+  __pyx_v_overlapfx = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+364: 		double[:,:,:,:]  teifx = Ix
+
  __pyx_t_21 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(__pyx_v_Ix, PyBUF_WRITABLE); if (unlikely(!__pyx_t_21.memview)) __PYX_ERR(0, 364, __pyx_L1_error)
+  __pyx_v_teifx = __pyx_t_21;
+  __pyx_t_21.memview = NULL;
+  __pyx_t_21.data = NULL;
+
+365: 		double[:,:]      oeifx = Hx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Hx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 365, __pyx_L1_error)
+  __pyx_v_oeifx = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+366: 		double[:,:]      fockfx= Fx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Fx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 366, __pyx_L1_error)
+  __pyx_v_fockfx = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+367: 		double[:,:]      weightedEnergy = Wx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Wx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 367, __pyx_L1_error)
+  __pyx_v_weightedEnergy = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
+368: 		double[:,:]      energy = Ex
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Ex, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 368, __pyx_L1_error)
+  __pyx_v_energy = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
 369: 
+
+370: 		double[:,:]      vires = Vx
+
  __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_Vx, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 370, __pyx_L1_error)
+  __pyx_v_vires = __pyx_t_11;
+  __pyx_t_11.memview = NULL;
+  __pyx_t_11.data = NULL;
+
 371: 
+
 372: 	#----------------------------------------Begin derivatives ------------------------------------|
+
 373: 
+
 374: 	#---------------------------------------Begin one electron-------------------------------------|
+
 375: 	#don't need overlapfx for fock but included anyway for completeness
+
+376: 	for atom in range(0, na):
+
  __pyx_t_4 = __pyx_v_na;
+  __pyx_t_5 = __pyx_t_4;
+  for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_5; __pyx_t_22+=1) {
+    __pyx_v_atom = __pyx_t_22;
+
+377: 		for cart in range(0, 3):
+
    for (__pyx_t_6 = 0; __pyx_t_6 < 3; __pyx_t_6+=1) {
+      __pyx_v_cart = __pyx_t_6;
+
 378: 
+
+379: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+380: 				for q in range(0, p+1):
+
        __pyx_t_25 = (__pyx_v_p + 1);
+        __pyx_t_26 = __pyx_t_25;
+        for (__pyx_t_27 = 0; __pyx_t_27 < __pyx_t_26; __pyx_t_27+=1) {
+          __pyx_v_q = __pyx_t_27;
+
 381: 
+
+382: 					ss = 0.0
+
          __pyx_v_ss = 0.0;
+
+383: 					sk = 0.0
+
          __pyx_v_sk = 0.0;
+
+384: 					sj = 0.0
+
          __pyx_v_sj = 0.0;
+
+385: 					sh = 0.0
+
          __pyx_v_sh = 0.0;
+
+386: 					for i in range(0, alo[p]):
+
          __pyx_t_15 = __pyx_v_p;
+          __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+          __pyx_t_28 = __pyx_t_17;
+          for (__pyx_t_29 = 0; __pyx_t_29 < __pyx_t_28; __pyx_t_29+=1) {
+            __pyx_v_i = __pyx_t_29;
+
+387: 						for j in range(0, alo[q]):
+
            __pyx_t_15 = __pyx_v_q;
+            __pyx_t_30 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_15 * __pyx_v_alo.strides[0]) )));
+            __pyx_t_31 = __pyx_t_30;
+            for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_31; __pyx_t_32+=1) {
+              __pyx_v_j = __pyx_t_32;
+
 388: 
+
+389: 							f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
              __pyx_t_15 = __pyx_v_p;
+              __pyx_t_16 = __pyx_v_i;
+              __pyx_t_33 = __pyx_v_q;
+              __pyx_t_34 = __pyx_v_j;
+              __pyx_t_35 = __pyx_v_p;
+              __pyx_t_36 = __pyx_v_i;
+              __pyx_t_37 = __pyx_v_q;
+              __pyx_t_38 = __pyx_v_j;
+              __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_15 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_33 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_35 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_37 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_c.strides[1]) ))));
+
+390: 							if ala[p] == atom:
+
              __pyx_t_38 = __pyx_v_p;
+              __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_38 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+              if (__pyx_t_7) {
+/* … */
+              }
+
+391: 								ss += ovlpfx(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2],  \
+
                __pyx_t_38 = __pyx_v_p;
+                __pyx_t_37 = 0;
+                __pyx_t_36 = __pyx_v_p;
+                __pyx_t_35 = 1;
+                __pyx_t_34 = __pyx_v_p;
+                __pyx_t_33 = 2;
+                __pyx_t_16 = __pyx_v_q;
+                __pyx_t_15 = 0;
+                __pyx_t_39 = __pyx_v_q;
+                __pyx_t_40 = 1;
+                __pyx_t_41 = __pyx_v_q;
+                __pyx_t_42 = 2;
+/* … */
+                __pyx_v_ss = (__pyx_v_ss + (__pyx_f_7ocypete_ovlpfx((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_38 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_34 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_16 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_39 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_41 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_42 * __pyx_v_alo_a.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_43 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_44 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_45 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_46 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_47 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_48 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_49 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_51 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_52 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_53 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_54 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_55 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_56 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_57 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_58 * __pyx_v_alo_o.strides[1]) ))), __pyx_t_59, __pyx_t_60, __pyx_v_cart, 0) * __pyx_v_f));
+
+392:  						                    alo_e[p,i], alo_e[q,j], alo_o[p,0], alo_o[p,1], alo_o[p,2], alo_o[q,0], alo_o[q,1], alo_o[q,2], \
+
                __pyx_t_43 = __pyx_v_p;
+                __pyx_t_44 = __pyx_v_i;
+                __pyx_t_45 = __pyx_v_q;
+                __pyx_t_46 = __pyx_v_j;
+                __pyx_t_47 = __pyx_v_p;
+                __pyx_t_48 = 0;
+                __pyx_t_49 = __pyx_v_p;
+                __pyx_t_50 = 1;
+                __pyx_t_51 = __pyx_v_p;
+                __pyx_t_52 = 2;
+                __pyx_t_53 = __pyx_v_q;
+                __pyx_t_54 = 0;
+                __pyx_t_55 = __pyx_v_q;
+                __pyx_t_56 = 1;
+                __pyx_t_57 = __pyx_v_q;
+                __pyx_t_58 = 2;
+
+393:  						                   [0,0,0], [0,0,0], cart, 0   ) * f
+
                __pyx_t_59[0] = 0;
+                __pyx_t_59[1] = 0;
+                __pyx_t_59[2] = 0;
+                __pyx_t_60[0] = 0.0;
+                __pyx_t_60[1] = 0.0;
+                __pyx_t_60[2] = 0.0;
+
 394: 
+
+395: 								sk += kntcfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
                __pyx_t_58 = __pyx_v_p;
+                __pyx_t_57 = 0;
+                __pyx_t_56 = __pyx_v_p;
+                __pyx_t_55 = 1;
+                __pyx_t_54 = __pyx_v_p;
+                __pyx_t_53 = 2;
+                __pyx_t_61[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_58 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_57 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_61[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_56 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_55 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_61[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_54 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_53 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_53 = __pyx_v_q;
+                __pyx_t_54 = 0;
+                __pyx_t_55 = __pyx_v_q;
+                __pyx_t_56 = 1;
+                __pyx_t_57 = __pyx_v_q;
+                __pyx_t_58 = 2;
+                __pyx_t_62[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_53 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_54 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_62[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_55 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_56 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_62[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_57 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_58 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+                __pyx_v_sk = (__pyx_v_sk + (__pyx_f_7ocypete_kntcfx(__pyx_t_61, __pyx_t_62, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_58 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_57 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_56 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_55 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_63, __pyx_t_64, __pyx_t_65, __pyx_t_66, __pyx_v_cart, 0) * __pyx_v_f));
+
+396:  						                    alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
                __pyx_t_58 = __pyx_v_p;
+                __pyx_t_57 = __pyx_v_i;
+                __pyx_t_56 = __pyx_v_q;
+                __pyx_t_55 = __pyx_v_j;
+                __pyx_t_54 = __pyx_v_p;
+                __pyx_t_53 = 0;
+                __pyx_t_52 = __pyx_v_p;
+                __pyx_t_51 = 1;
+                __pyx_t_50 = __pyx_v_p;
+                __pyx_t_49 = 2;
+                __pyx_t_63[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_54 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_53 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_63[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_52 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_51 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_63[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_50 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_49 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_49 = __pyx_v_q;
+                __pyx_t_50 = 0;
+                __pyx_t_51 = __pyx_v_q;
+                __pyx_t_52 = 1;
+                __pyx_t_53 = __pyx_v_q;
+                __pyx_t_54 = 2;
+                __pyx_t_64[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_49 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_64[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_51 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_52 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_64[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_53 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_54 * __pyx_v_alo_o.strides[1]) )));
+
+397:  						                   [0,0,0], [0,0,0], cart, 0   ) * f
+
                __pyx_t_65[0] = 0;
+                __pyx_t_65[1] = 0;
+                __pyx_t_65[2] = 0;
+                __pyx_t_66[0] = 0.0;
+                __pyx_t_66[1] = 0.0;
+                __pyx_t_66[2] = 0.0;
+
 398: 
+
+399: 							if ala[q] == atom:
+
              __pyx_t_55 = __pyx_v_q;
+              __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_55 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+              if (__pyx_t_7) {
+/* … */
+              }
+
+400: 								ss += ovlpfx(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2],  \
+
                __pyx_t_55 = __pyx_v_p;
+                __pyx_t_56 = 0;
+                __pyx_t_57 = __pyx_v_p;
+                __pyx_t_58 = 1;
+                __pyx_t_54 = __pyx_v_p;
+                __pyx_t_53 = 2;
+                __pyx_t_52 = __pyx_v_q;
+                __pyx_t_51 = 0;
+                __pyx_t_50 = __pyx_v_q;
+                __pyx_t_49 = 1;
+                __pyx_t_48 = __pyx_v_q;
+                __pyx_t_47 = 2;
+/* … */
+                __pyx_v_ss = (__pyx_v_ss + (__pyx_f_7ocypete_ovlpfx((*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_55 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_56 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_57 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_58 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_54 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_53 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_52 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_51 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_50 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_49 * __pyx_v_alo_a.strides[1]) ))), (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_48 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_47 * __pyx_v_alo_a.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_46 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_45 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_44 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_43 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_42 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_41 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_40 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_33 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_35 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_o.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_37 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_o.strides[1]) ))), __pyx_t_67, __pyx_t_68, __pyx_v_cart, 1) * __pyx_v_f));
+
+401:  						                    alo_e[p,i], alo_e[q,j], alo_o[p,0], alo_o[p,1], alo_o[p,2], alo_o[q,0], alo_o[q,1], alo_o[q,2], \
+
                __pyx_t_46 = __pyx_v_p;
+                __pyx_t_45 = __pyx_v_i;
+                __pyx_t_44 = __pyx_v_q;
+                __pyx_t_43 = __pyx_v_j;
+                __pyx_t_42 = __pyx_v_p;
+                __pyx_t_41 = 0;
+                __pyx_t_40 = __pyx_v_p;
+                __pyx_t_39 = 1;
+                __pyx_t_15 = __pyx_v_p;
+                __pyx_t_16 = 2;
+                __pyx_t_33 = __pyx_v_q;
+                __pyx_t_34 = 0;
+                __pyx_t_35 = __pyx_v_q;
+                __pyx_t_36 = 1;
+                __pyx_t_37 = __pyx_v_q;
+                __pyx_t_38 = 2;
+
+402:  						                    [0,0,0], [0,0,0], cart, 1  ) * f
+
                __pyx_t_67[0] = 0;
+                __pyx_t_67[1] = 0;
+                __pyx_t_67[2] = 0;
+                __pyx_t_68[0] = 0.0;
+                __pyx_t_68[1] = 0.0;
+                __pyx_t_68[2] = 0.0;
+
 403: 
+
+404: 								sk += kntcfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
                __pyx_t_38 = __pyx_v_p;
+                __pyx_t_37 = 0;
+                __pyx_t_36 = __pyx_v_p;
+                __pyx_t_35 = 1;
+                __pyx_t_34 = __pyx_v_p;
+                __pyx_t_33 = 2;
+                __pyx_t_69[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_38 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_69[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_69[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_34 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_33 = __pyx_v_q;
+                __pyx_t_34 = 0;
+                __pyx_t_35 = __pyx_v_q;
+                __pyx_t_36 = 1;
+                __pyx_t_37 = __pyx_v_q;
+                __pyx_t_38 = 2;
+                __pyx_t_70[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_33 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_70[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_35 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_a.strides[1]) )));
+                __pyx_t_70[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_37 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+                __pyx_v_sk = (__pyx_v_sk + (__pyx_f_7ocypete_kntcfx(__pyx_t_69, __pyx_t_70, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_38 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_36 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_71, __pyx_t_72, __pyx_t_73, __pyx_t_74, __pyx_v_cart, 1) * __pyx_v_f));
+
+405:  						                    alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
                __pyx_t_38 = __pyx_v_p;
+                __pyx_t_37 = __pyx_v_i;
+                __pyx_t_36 = __pyx_v_q;
+                __pyx_t_35 = __pyx_v_j;
+                __pyx_t_34 = __pyx_v_p;
+                __pyx_t_33 = 0;
+                __pyx_t_16 = __pyx_v_p;
+                __pyx_t_15 = 1;
+                __pyx_t_39 = __pyx_v_p;
+                __pyx_t_40 = 2;
+                __pyx_t_71[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_34 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_71[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_16 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_71[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_40 = __pyx_v_q;
+                __pyx_t_39 = 0;
+                __pyx_t_15 = __pyx_v_q;
+                __pyx_t_16 = 1;
+                __pyx_t_33 = __pyx_v_q;
+                __pyx_t_34 = 2;
+                __pyx_t_72[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_40 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_72[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_o.strides[1]) )));
+                __pyx_t_72[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_33 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) )));
+
+406:  						                    [0,0,0], [0,0,0], cart, 1  ) * f
+
                __pyx_t_73[0] = 0;
+                __pyx_t_73[1] = 0;
+                __pyx_t_73[2] = 0;
+                __pyx_t_74[0] = 0.0;
+                __pyx_t_74[1] = 0.0;
+                __pyx_t_74[2] = 0.0;
+
 407: 
+
+408: 							sh -= clmbhfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
              __pyx_t_35 = __pyx_v_p;
+              __pyx_t_36 = 0;
+              __pyx_t_37 = __pyx_v_p;
+              __pyx_t_38 = 1;
+              __pyx_t_34 = __pyx_v_p;
+              __pyx_t_33 = 2;
+              __pyx_t_75[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_35 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_a.strides[1]) )));
+              __pyx_t_75[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_37 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_a.strides[1]) )));
+              __pyx_t_75[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_34 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) )));
+              __pyx_t_33 = __pyx_v_q;
+              __pyx_t_34 = 0;
+              __pyx_t_38 = __pyx_v_q;
+              __pyx_t_37 = 1;
+              __pyx_t_36 = __pyx_v_q;
+              __pyx_t_35 = 2;
+              __pyx_t_76[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_33 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_a.strides[1]) )));
+              __pyx_t_76[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_38 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) )));
+              __pyx_t_76[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+              __pyx_v_sh = (__pyx_v_sh - ((__pyx_f_7ocypete_clmbhfx(__pyx_t_75, __pyx_t_76, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_35 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_37 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_77, __pyx_t_78, __pyx_t_79, __pyx_t_80, __pyx_t_81, __pyx_v_cart) * __pyx_v_f) * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_34 * __pyx_v_alo_z.strides[0]) )))));
+              __PYX_XDEC_MEMVIEW(&__pyx_t_79, 1);
+              __pyx_t_79.memview = NULL;
+              __pyx_t_79.data = NULL;
+            }
+          }
+
+409:  						                   alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
              __pyx_t_35 = __pyx_v_p;
+              __pyx_t_36 = __pyx_v_i;
+              __pyx_t_37 = __pyx_v_q;
+              __pyx_t_38 = __pyx_v_j;
+              __pyx_t_34 = __pyx_v_p;
+              __pyx_t_33 = 0;
+              __pyx_t_16 = __pyx_v_p;
+              __pyx_t_15 = 1;
+              __pyx_t_39 = __pyx_v_p;
+              __pyx_t_40 = 2;
+              __pyx_t_77[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_34 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_o.strides[1]) )));
+              __pyx_t_77[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_16 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )));
+              __pyx_t_77[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )));
+              __pyx_t_40 = __pyx_v_q;
+              __pyx_t_39 = 0;
+              __pyx_t_15 = __pyx_v_q;
+              __pyx_t_16 = 1;
+              __pyx_t_33 = __pyx_v_q;
+              __pyx_t_34 = 2;
+              __pyx_t_78[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_40 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_o.strides[1]) )));
+              __pyx_t_78[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_o.strides[1]) )));
+              __pyx_t_78[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_33 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) )));
+
+410:  						                   alo_x[atom], [0,0,0], [0,0,0], cart  ) * f * alo_z[atom]
+
              __pyx_t_79.data = __pyx_v_alo_x.data;
+              __pyx_t_79.memview = __pyx_v_alo_x.memview;
+              __PYX_INC_MEMVIEW(&__pyx_t_79, 0);
+              {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_atom;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_alo_x.strides[0];
+        __pyx_t_79.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_79.shape[0] = __pyx_v_alo_x.shape[1];
+__pyx_t_79.strides[0] = __pyx_v_alo_x.strides[1];
+    __pyx_t_79.suboffsets[0] = -1;
+
+__pyx_t_80[0] = 0;
+              __pyx_t_80[1] = 0;
+              __pyx_t_80[2] = 0;
+              __pyx_t_81[0] = 0.0;
+              __pyx_t_81[1] = 0.0;
+              __pyx_t_81[2] = 0.0;
+/* … */
+              __pyx_t_34 = __pyx_v_atom;
+
 411: 
+
+412: 					for r in range(0, na):
+
          __pyx_t_29 = __pyx_v_na;
+          __pyx_t_32 = __pyx_t_29;
+          for (__pyx_t_82 = 0; __pyx_t_82 < __pyx_t_32; __pyx_t_82+=1) {
+            __pyx_v_r = __pyx_t_82;
+
+413: 						for i in range(0, alo[p]):
+
            __pyx_t_34 = __pyx_v_p;
+            __pyx_t_17 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_34 * __pyx_v_alo.strides[0]) )));
+            __pyx_t_28 = __pyx_t_17;
+            for (__pyx_t_83 = 0; __pyx_t_83 < __pyx_t_28; __pyx_t_83+=1) {
+              __pyx_v_i = __pyx_t_83;
+
+414: 							for j in range(0, alo[q]):
+
              __pyx_t_34 = __pyx_v_q;
+              __pyx_t_30 = (*((short *) ( /* dim=0 */ (__pyx_v_alo.data + __pyx_t_34 * __pyx_v_alo.strides[0]) )));
+              __pyx_t_31 = __pyx_t_30;
+              for (__pyx_t_84 = 0; __pyx_t_84 < __pyx_t_31; __pyx_t_84+=1) {
+                __pyx_v_j = __pyx_t_84;
+
+415: 								f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j]
+
                __pyx_t_34 = __pyx_v_p;
+                __pyx_t_38 = __pyx_v_i;
+                __pyx_t_37 = __pyx_v_q;
+                __pyx_t_36 = __pyx_v_j;
+                __pyx_t_35 = __pyx_v_p;
+                __pyx_t_33 = __pyx_v_i;
+                __pyx_t_16 = __pyx_v_q;
+                __pyx_t_15 = __pyx_v_j;
+                __pyx_v_f = ((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_34 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_n.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_n.data + __pyx_t_37 * __pyx_v_alo_n.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_n.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_35 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_c.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_c.data + __pyx_t_16 * __pyx_v_alo_c.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_c.strides[1]) ))));
+
+416: 								if ala[p] == atom:
+
                __pyx_t_15 = __pyx_v_p;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_15 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+
+417: 									sj -= clmbsfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
                  __pyx_t_15 = __pyx_v_p;
+                  __pyx_t_16 = 0;
+                  __pyx_t_33 = __pyx_v_p;
+                  __pyx_t_35 = 1;
+                  __pyx_t_36 = __pyx_v_p;
+                  __pyx_t_37 = 2;
+                  __pyx_t_85[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_15 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_85[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_33 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_85[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_37 = __pyx_v_q;
+                  __pyx_t_36 = 0;
+                  __pyx_t_35 = __pyx_v_q;
+                  __pyx_t_33 = 1;
+                  __pyx_t_16 = __pyx_v_q;
+                  __pyx_t_15 = 2;
+                  __pyx_t_86[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_37 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_86[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_35 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_86[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_16 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+                  __pyx_v_sj = (__pyx_v_sj - ((__pyx_f_7ocypete_clmbsfx(__pyx_t_85, __pyx_t_86, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_15 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_33 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_87, __pyx_t_88, __pyx_t_79, __pyx_t_89, __pyx_t_90, __pyx_v_cart, 0) * __pyx_v_f) * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_36 * __pyx_v_alo_z.strides[0]) )))));
+                  __PYX_XDEC_MEMVIEW(&__pyx_t_79, 1);
+                  __pyx_t_79.memview = NULL;
+                  __pyx_t_79.data = NULL;
+
+418:  						                    alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
                  __pyx_t_15 = __pyx_v_p;
+                  __pyx_t_16 = __pyx_v_i;
+                  __pyx_t_33 = __pyx_v_q;
+                  __pyx_t_35 = __pyx_v_j;
+                  __pyx_t_36 = __pyx_v_p;
+                  __pyx_t_37 = 0;
+                  __pyx_t_38 = __pyx_v_p;
+                  __pyx_t_34 = 1;
+                  __pyx_t_39 = __pyx_v_p;
+                  __pyx_t_40 = 2;
+                  __pyx_t_87[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_36 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_87[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_38 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_87[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_40 = __pyx_v_q;
+                  __pyx_t_39 = 0;
+                  __pyx_t_34 = __pyx_v_q;
+                  __pyx_t_38 = 1;
+                  __pyx_t_37 = __pyx_v_q;
+                  __pyx_t_36 = 2;
+                  __pyx_t_88[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_40 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_88[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_34 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_88[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_37 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_o.strides[1]) )));
+
+419:  						                    alo_x[r], [0,0,0], [0,0,0], cart, 0  ) * f * alo_z[r]
+
                  __pyx_t_79.data = __pyx_v_alo_x.data;
+                  __pyx_t_79.memview = __pyx_v_alo_x.memview;
+                  __PYX_INC_MEMVIEW(&__pyx_t_79, 0);
+                  {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_r;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_alo_x.strides[0];
+        __pyx_t_79.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_79.shape[0] = __pyx_v_alo_x.shape[1];
+__pyx_t_79.strides[0] = __pyx_v_alo_x.strides[1];
+    __pyx_t_79.suboffsets[0] = -1;
+
+__pyx_t_89[0] = 0;
+                  __pyx_t_89[1] = 0;
+                  __pyx_t_89[2] = 0;
+                  __pyx_t_90[0] = 0.0;
+                  __pyx_t_90[1] = 0.0;
+                  __pyx_t_90[2] = 0.0;
+/* … */
+                  __pyx_t_36 = __pyx_v_r;
+
 420: 
+
+421: 								if ala[q] == atom:
+
                __pyx_t_36 = __pyx_v_q;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_36 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+              }
+            }
+          }
+
+422: 									sj -= clmbsfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]],  \
+
                  __pyx_t_36 = __pyx_v_p;
+                  __pyx_t_35 = 0;
+                  __pyx_t_33 = __pyx_v_p;
+                  __pyx_t_16 = 1;
+                  __pyx_t_15 = __pyx_v_p;
+                  __pyx_t_37 = 2;
+                  __pyx_t_91[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_36 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_91[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_33 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_91[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_15 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_37 = __pyx_v_q;
+                  __pyx_t_15 = 0;
+                  __pyx_t_16 = __pyx_v_q;
+                  __pyx_t_33 = 1;
+                  __pyx_t_35 = __pyx_v_q;
+                  __pyx_t_36 = 2;
+                  __pyx_t_92[0] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_37 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_92[1] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_16 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_a.strides[1]) )));
+                  __pyx_t_92[2] = (*((short *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_a.data + __pyx_t_35 * __pyx_v_alo_a.strides[0]) ) + __pyx_t_36 * __pyx_v_alo_a.strides[1]) )));
+/* … */
+                  __pyx_v_sj = (__pyx_v_sj - ((__pyx_f_7ocypete_clmbsfx(__pyx_t_91, __pyx_t_92, (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_36 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_35 * __pyx_v_alo_e.strides[1]) ))), (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_e.data + __pyx_t_33 * __pyx_v_alo_e.strides[0]) ) + __pyx_t_16 * __pyx_v_alo_e.strides[1]) ))), __pyx_t_93, __pyx_t_94, __pyx_t_79, __pyx_t_95, __pyx_t_96, __pyx_v_cart, 1) * __pyx_v_f) * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_15 * __pyx_v_alo_z.strides[0]) )))));
+                  __PYX_XDEC_MEMVIEW(&__pyx_t_79, 1);
+                  __pyx_t_79.memview = NULL;
+                  __pyx_t_79.data = NULL;
+
+423:  						                    alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \
+
                  __pyx_t_36 = __pyx_v_p;
+                  __pyx_t_35 = __pyx_v_i;
+                  __pyx_t_33 = __pyx_v_q;
+                  __pyx_t_16 = __pyx_v_j;
+                  __pyx_t_15 = __pyx_v_p;
+                  __pyx_t_37 = 0;
+                  __pyx_t_38 = __pyx_v_p;
+                  __pyx_t_34 = 1;
+                  __pyx_t_39 = __pyx_v_p;
+                  __pyx_t_40 = 2;
+                  __pyx_t_93[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_15 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_93[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_38 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_34 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_93[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_39 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_40 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_40 = __pyx_v_q;
+                  __pyx_t_39 = 0;
+                  __pyx_t_34 = __pyx_v_q;
+                  __pyx_t_38 = 1;
+                  __pyx_t_37 = __pyx_v_q;
+                  __pyx_t_15 = 2;
+                  __pyx_t_94[0] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_40 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_94[1] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_34 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_o.strides[1]) )));
+                  __pyx_t_94[2] = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_o.data + __pyx_t_37 * __pyx_v_alo_o.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_o.strides[1]) )));
+
+424:  						                    alo_x[r], [0,0,0], [0,0,0], cart, 1  ) * f * alo_z[r]
+
                  __pyx_t_79.data = __pyx_v_alo_x.data;
+                  __pyx_t_79.memview = __pyx_v_alo_x.memview;
+                  __PYX_INC_MEMVIEW(&__pyx_t_79, 0);
+                  {
+    Py_ssize_t __pyx_tmp_idx = __pyx_v_r;
+    Py_ssize_t __pyx_tmp_stride = __pyx_v_alo_x.strides[0];
+        __pyx_t_79.data += __pyx_tmp_idx * __pyx_tmp_stride;
+}
+
+__pyx_t_79.shape[0] = __pyx_v_alo_x.shape[1];
+__pyx_t_79.strides[0] = __pyx_v_alo_x.strides[1];
+    __pyx_t_79.suboffsets[0] = -1;
+
+__pyx_t_95[0] = 0;
+                  __pyx_t_95[1] = 0;
+                  __pyx_t_95[2] = 0;
+                  __pyx_t_96[0] = 0.0;
+                  __pyx_t_96[1] = 0.0;
+                  __pyx_t_96[2] = 0.0;
+/* … */
+                  __pyx_t_15 = __pyx_v_r;
+
 425: 
+
 426: 
+
+427: 					oeifx[p,q] = oeifx[q,p] = sk + sj + sh
+
          __pyx_t_14 = ((__pyx_v_sk + __pyx_v_sj) + __pyx_v_sh);
+          __pyx_t_15 = __pyx_v_p;
+          __pyx_t_16 = __pyx_v_q;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oeifx.data + __pyx_t_15 * __pyx_v_oeifx.strides[0]) ) + __pyx_t_16 * __pyx_v_oeifx.strides[1]) )) = __pyx_t_14;
+          __pyx_t_16 = __pyx_v_q;
+          __pyx_t_15 = __pyx_v_p;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oeifx.data + __pyx_t_16 * __pyx_v_oeifx.strides[0]) ) + __pyx_t_15 * __pyx_v_oeifx.strides[1]) )) = __pyx_t_14;
+
+428: 					overlapfx[p,q] = overlapfx[q,p] = ss
+
          __pyx_t_15 = __pyx_v_p;
+          __pyx_t_16 = __pyx_v_q;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlapfx.data + __pyx_t_15 * __pyx_v_overlapfx.strides[0]) ) + __pyx_t_16 * __pyx_v_overlapfx.strides[1]) )) = __pyx_v_ss;
+          __pyx_t_16 = __pyx_v_q;
+          __pyx_t_15 = __pyx_v_p;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlapfx.data + __pyx_t_16 * __pyx_v_overlapfx.strides[0]) ) + __pyx_t_15 * __pyx_v_overlapfx.strides[1]) )) = __pyx_v_ss;
+        }
+      }
+
 429: 
+
 430: 	#----------------------------------------End one electron--------------------------------------|
+
 431: 
+
 432: 	#---------------------------------------Begin two electron-------------------------------------|
+
 433: 
+
+434: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+435: 				for q in range(0, p+1):
+
        __pyx_t_25 = (__pyx_v_p + 1);
+        __pyx_t_26 = __pyx_t_25;
+        for (__pyx_t_27 = 0; __pyx_t_27 < __pyx_t_26; __pyx_t_27+=1) {
+          __pyx_v_q = __pyx_t_27;
+
 436: 
+
+437: 					si = 0.0
+
          __pyx_v_si = 0.0;
+
 438: 
+
+439: 					i = p*(p+1)//2 + q
+
          __pyx_v_i = (((__pyx_v_p * (__pyx_v_p + 1)) / 2) + __pyx_v_q);
+
+440: 					for r in range(0, nb):
+
          __pyx_t_29 = __pyx_v_nb;
+          __pyx_t_32 = __pyx_t_29;
+          for (__pyx_t_82 = 0; __pyx_t_82 < __pyx_t_32; __pyx_t_82+=1) {
+            __pyx_v_r = __pyx_t_82;
+
+441: 						for s in range(0, r+1):
+
            __pyx_t_97 = (__pyx_v_r + 1);
+            __pyx_t_98 = __pyx_t_97;
+            for (__pyx_t_83 = 0; __pyx_t_83 < __pyx_t_98; __pyx_t_83+=1) {
+              __pyx_v_s = __pyx_t_83;
+
 442: 
+
+443: 							j = r*(r+1)//2 + s
+
              __pyx_v_j = (((__pyx_v_r * (__pyx_v_r + 1)) / 2) + __pyx_v_s);
+
 444: 
+
+445: 							if i >= j:
+
              __pyx_t_7 = ((__pyx_v_i >= __pyx_v_j) != 0);
+              if (__pyx_t_7) {
+/* … */
+              }
+
+446: 								si = 0.0
+
                __pyx_v_si = 0.0;
+
+447: 								if ala[p] == atom:
+
                __pyx_t_15 = __pyx_v_p;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_15 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+
+448: 									si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 0)
+
                  __pyx_v_si = (__pyx_v_si + __pyx_f_7ocypete_erifx(__pyx_v_alo, __pyx_v_p, __pyx_v_q, __pyx_v_r, __pyx_v_s, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_cart, 0));
+
+449: 								if ala[q] == atom:
+
                __pyx_t_15 = __pyx_v_q;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_15 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+
+450: 									si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 1)
+
                  __pyx_v_si = (__pyx_v_si + __pyx_f_7ocypete_erifx(__pyx_v_alo, __pyx_v_p, __pyx_v_q, __pyx_v_r, __pyx_v_s, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_cart, 1));
+
+451: 								if ala[r] == atom:
+
                __pyx_t_15 = __pyx_v_r;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_15 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+
+452: 									si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 2)
+
                  __pyx_v_si = (__pyx_v_si + __pyx_f_7ocypete_erifx(__pyx_v_alo, __pyx_v_p, __pyx_v_q, __pyx_v_r, __pyx_v_s, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_cart, 2));
+
+453: 								if ala[s] == atom:
+
                __pyx_t_15 = __pyx_v_s;
+                __pyx_t_7 = (((*((short *) ( /* dim=0 */ (__pyx_v_ala.data + __pyx_t_15 * __pyx_v_ala.strides[0]) ))) == __pyx_v_atom) != 0);
+                if (__pyx_t_7) {
+/* … */
+                }
+
+454: 									si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 3)
+
                  __pyx_v_si = (__pyx_v_si + __pyx_f_7ocypete_erifx(__pyx_v_alo, __pyx_v_p, __pyx_v_q, __pyx_v_r, __pyx_v_s, __pyx_v_alo_n, __pyx_v_alo_c, __pyx_v_alo_e, __pyx_v_alo_a, __pyx_v_alo_o, __pyx_v_cart, 3));
+
 455: 
+
+456: 							teifx[p,q,r,s] = teifx[p,q,s,r] = teifx[q,p,s,r] = teifx[q,p,r,s] = \
+
              __pyx_t_15 = __pyx_v_p;
+              __pyx_t_16 = __pyx_v_q;
+              __pyx_t_33 = __pyx_v_r;
+              __pyx_t_35 = __pyx_v_s;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_15 * __pyx_v_teifx.strides[0]) ) + __pyx_t_16 * __pyx_v_teifx.strides[1]) ) + __pyx_t_33 * __pyx_v_teifx.strides[2]) ) + __pyx_t_35 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_35 = __pyx_v_p;
+              __pyx_t_33 = __pyx_v_q;
+              __pyx_t_16 = __pyx_v_s;
+              __pyx_t_15 = __pyx_v_r;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_35 * __pyx_v_teifx.strides[0]) ) + __pyx_t_33 * __pyx_v_teifx.strides[1]) ) + __pyx_t_16 * __pyx_v_teifx.strides[2]) ) + __pyx_t_15 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_15 = __pyx_v_q;
+              __pyx_t_16 = __pyx_v_p;
+              __pyx_t_33 = __pyx_v_s;
+              __pyx_t_35 = __pyx_v_r;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_15 * __pyx_v_teifx.strides[0]) ) + __pyx_t_16 * __pyx_v_teifx.strides[1]) ) + __pyx_t_33 * __pyx_v_teifx.strides[2]) ) + __pyx_t_35 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_35 = __pyx_v_q;
+              __pyx_t_33 = __pyx_v_p;
+              __pyx_t_16 = __pyx_v_r;
+              __pyx_t_15 = __pyx_v_s;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_35 * __pyx_v_teifx.strides[0]) ) + __pyx_t_33 * __pyx_v_teifx.strides[1]) ) + __pyx_t_16 * __pyx_v_teifx.strides[2]) ) + __pyx_t_15 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+
+457: 							teifx[r,s,p,q] = teifx[r,s,q,p] = teifx[s,r,q,p] = teifx[s,r,p,q] = si
+
              __pyx_t_15 = __pyx_v_r;
+              __pyx_t_16 = __pyx_v_s;
+              __pyx_t_33 = __pyx_v_p;
+              __pyx_t_35 = __pyx_v_q;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_15 * __pyx_v_teifx.strides[0]) ) + __pyx_t_16 * __pyx_v_teifx.strides[1]) ) + __pyx_t_33 * __pyx_v_teifx.strides[2]) ) + __pyx_t_35 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_35 = __pyx_v_r;
+              __pyx_t_33 = __pyx_v_s;
+              __pyx_t_16 = __pyx_v_q;
+              __pyx_t_15 = __pyx_v_p;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_35 * __pyx_v_teifx.strides[0]) ) + __pyx_t_33 * __pyx_v_teifx.strides[1]) ) + __pyx_t_16 * __pyx_v_teifx.strides[2]) ) + __pyx_t_15 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_15 = __pyx_v_s;
+              __pyx_t_16 = __pyx_v_r;
+              __pyx_t_33 = __pyx_v_q;
+              __pyx_t_35 = __pyx_v_p;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_15 * __pyx_v_teifx.strides[0]) ) + __pyx_t_16 * __pyx_v_teifx.strides[1]) ) + __pyx_t_33 * __pyx_v_teifx.strides[2]) ) + __pyx_t_35 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+              __pyx_t_35 = __pyx_v_s;
+              __pyx_t_33 = __pyx_v_r;
+              __pyx_t_16 = __pyx_v_p;
+              __pyx_t_15 = __pyx_v_q;
+              *((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_35 * __pyx_v_teifx.strides[0]) ) + __pyx_t_33 * __pyx_v_teifx.strides[1]) ) + __pyx_t_16 * __pyx_v_teifx.strides[2]) ) + __pyx_t_15 * __pyx_v_teifx.strides[3]) )) = __pyx_v_si;
+            }
+          }
+        }
+      }
+
 458: 
+
 459: 	#----------------------------------------End two electron--------------------------------------|
+
 460: 
+
 461: 	#-------------------------------------------build Fock-----------------------------------------|
+
 462: 
+
+463: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+464: 				for q in range(0, nb):
+
        __pyx_t_27 = __pyx_v_nb;
+        __pyx_t_29 = __pyx_t_27;
+        for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_29; __pyx_t_32+=1) {
+          __pyx_v_q = __pyx_t_32;
+
+465: 					sf = 0.0
+
          __pyx_v_sf = 0.0;
+
+466: 					for r in range(0, nb):
+
          __pyx_t_82 = __pyx_v_nb;
+          __pyx_t_83 = __pyx_t_82;
+          for (__pyx_t_84 = 0; __pyx_t_84 < __pyx_t_83; __pyx_t_84+=1) {
+            __pyx_v_r = __pyx_t_84;
+
+467: 						for s in range(0, nb):
+
            __pyx_t_99 = __pyx_v_nb;
+            __pyx_t_100 = __pyx_t_99;
+            for (__pyx_t_101 = 0; __pyx_t_101 < __pyx_t_100; __pyx_t_101+=1) {
+              __pyx_v_s = __pyx_t_101;
+
+468: 							sf += (2.0 * teifx[p,q,r,s] - teifx[p,s,q,r]) * density[s,r]
+
              __pyx_t_15 = __pyx_v_p;
+              __pyx_t_16 = __pyx_v_q;
+              __pyx_t_33 = __pyx_v_r;
+              __pyx_t_35 = __pyx_v_s;
+              __pyx_t_36 = __pyx_v_p;
+              __pyx_t_37 = __pyx_v_s;
+              __pyx_t_38 = __pyx_v_q;
+              __pyx_t_34 = __pyx_v_r;
+              __pyx_t_39 = __pyx_v_s;
+              __pyx_t_40 = __pyx_v_r;
+              __pyx_v_sf = (__pyx_v_sf + (((2.0 * (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_15 * __pyx_v_teifx.strides[0]) ) + __pyx_t_16 * __pyx_v_teifx.strides[1]) ) + __pyx_t_33 * __pyx_v_teifx.strides[2]) ) + __pyx_t_35 * __pyx_v_teifx.strides[3]) )))) - (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_teifx.data + __pyx_t_36 * __pyx_v_teifx.strides[0]) ) + __pyx_t_37 * __pyx_v_teifx.strides[1]) ) + __pyx_t_38 * __pyx_v_teifx.strides[2]) ) + __pyx_t_34 * __pyx_v_teifx.strides[3]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_density.data + __pyx_t_39 * __pyx_v_density.strides[0]) ) + __pyx_t_40 * __pyx_v_density.strides[1]) )))));
+            }
+          }
+
 469: 
+
+470: 					fockfx[p,q] = oeifx[p,q] + sf
+
          __pyx_t_40 = __pyx_v_p;
+          __pyx_t_39 = __pyx_v_q;
+          __pyx_t_34 = __pyx_v_p;
+          __pyx_t_38 = __pyx_v_q;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fockfx.data + __pyx_t_34 * __pyx_v_fockfx.strides[0]) ) + __pyx_t_38 * __pyx_v_fockfx.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oeifx.data + __pyx_t_40 * __pyx_v_oeifx.strides[0]) ) + __pyx_t_39 * __pyx_v_oeifx.strides[1]) ))) + __pyx_v_sf);
+        }
+      }
+
 471: 
+
 472: 	#|----------------------------------------build energy-----------------------------------------|
+
 473: 
+
+474: 			force = 0.0
+
      __pyx_v_force = 0.0;
+
+475: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+476: 				for q in range(0, nb):
+
        __pyx_t_27 = __pyx_v_nb;
+        __pyx_t_29 = __pyx_t_27;
+        for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_29; __pyx_t_32+=1) {
+          __pyx_v_q = __pyx_t_32;
+
+477: 					force -= density[p,q] * (fockfx[q,p] + oeifx[q,p])
+
          __pyx_t_39 = __pyx_v_p;
+          __pyx_t_40 = __pyx_v_q;
+          __pyx_t_38 = __pyx_v_q;
+          __pyx_t_34 = __pyx_v_p;
+          __pyx_t_37 = __pyx_v_q;
+          __pyx_t_36 = __pyx_v_p;
+          __pyx_v_force = (__pyx_v_force - ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_density.data + __pyx_t_39 * __pyx_v_density.strides[0]) ) + __pyx_t_40 * __pyx_v_density.strides[1]) ))) * ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fockfx.data + __pyx_t_38 * __pyx_v_fockfx.strides[0]) ) + __pyx_t_34 * __pyx_v_fockfx.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_oeifx.data + __pyx_t_37 * __pyx_v_oeifx.strides[0]) ) + __pyx_t_36 * __pyx_v_oeifx.strides[1]) ))))));
+        }
+      }
+
 478: 
+
 479: 	#|-----------------------------------density weighted energy-----------------------------------|
+
+480: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+481: 				for q in range(0, nb):
+
        __pyx_t_27 = __pyx_v_nb;
+        __pyx_t_29 = __pyx_t_27;
+        for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_29; __pyx_t_32+=1) {
+          __pyx_v_q = __pyx_t_32;
+
+482: 					energy[p,q] = 0.0
+
          __pyx_t_36 = __pyx_v_p;
+          __pyx_t_37 = __pyx_v_q;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_energy.data + __pyx_t_36 * __pyx_v_energy.strides[0]) ) + __pyx_t_37 * __pyx_v_energy.strides[1]) )) = 0.0;
+
+483: 					for r in range(0, nb):
+
          __pyx_t_82 = __pyx_v_nb;
+          __pyx_t_83 = __pyx_t_82;
+          for (__pyx_t_84 = 0; __pyx_t_84 < __pyx_t_83; __pyx_t_84+=1) {
+            __pyx_v_r = __pyx_t_84;
+
+484: 						energy[p,q] += fock[p,r] * density[r,q]
+
            __pyx_t_37 = __pyx_v_p;
+            __pyx_t_36 = __pyx_v_r;
+            __pyx_t_34 = __pyx_v_r;
+            __pyx_t_38 = __pyx_v_q;
+            __pyx_t_40 = __pyx_v_p;
+            __pyx_t_39 = __pyx_v_q;
+            *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_energy.data + __pyx_t_40 * __pyx_v_energy.strides[0]) ) + __pyx_t_39 * __pyx_v_energy.strides[1]) )) += ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fock.data + __pyx_t_37 * __pyx_v_fock.strides[0]) ) + __pyx_t_36 * __pyx_v_fock.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_density.data + __pyx_t_34 * __pyx_v_density.strides[0]) ) + __pyx_t_38 * __pyx_v_density.strides[1]) ))));
+          }
+        }
+      }
+
+485: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+486: 				for q in range(0, nb):
+
        __pyx_t_27 = __pyx_v_nb;
+        __pyx_t_29 = __pyx_t_27;
+        for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_29; __pyx_t_32+=1) {
+          __pyx_v_q = __pyx_t_32;
+
+487: 					weightedEnergy[p,q] = 0.0
+
          __pyx_t_38 = __pyx_v_p;
+          __pyx_t_34 = __pyx_v_q;
+          *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_weightedEnergy.data + __pyx_t_38 * __pyx_v_weightedEnergy.strides[0]) ) + __pyx_t_34 * __pyx_v_weightedEnergy.strides[1]) )) = 0.0;
+
+488: 					for r in range(0, nb):
+
          __pyx_t_82 = __pyx_v_nb;
+          __pyx_t_83 = __pyx_t_82;
+          for (__pyx_t_84 = 0; __pyx_t_84 < __pyx_t_83; __pyx_t_84+=1) {
+            __pyx_v_r = __pyx_t_84;
+
+489: 						weightedEnergy[p,q] += density[p,r] * energy[r,q]
+
            __pyx_t_34 = __pyx_v_p;
+            __pyx_t_38 = __pyx_v_r;
+            __pyx_t_36 = __pyx_v_r;
+            __pyx_t_37 = __pyx_v_q;
+            __pyx_t_39 = __pyx_v_p;
+            __pyx_t_40 = __pyx_v_q;
+            *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_weightedEnergy.data + __pyx_t_39 * __pyx_v_weightedEnergy.strides[0]) ) + __pyx_t_40 * __pyx_v_weightedEnergy.strides[1]) )) += ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_density.data + __pyx_t_34 * __pyx_v_density.strides[0]) ) + __pyx_t_38 * __pyx_v_density.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_energy.data + __pyx_t_36 * __pyx_v_energy.strides[0]) ) + __pyx_t_37 * __pyx_v_energy.strides[1]) ))));
+          }
+        }
+      }
+
 490: 
+
 491: 	#|-------------------------------------overlap contribution------------------------------------|
+
 492: 
+
+493: 			for p in range(0, nb):
+
      __pyx_t_13 = __pyx_v_nb;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_p = __pyx_t_24;
+
+494: 				for q in range(0, nb):
+
        __pyx_t_27 = __pyx_v_nb;
+        __pyx_t_29 = __pyx_t_27;
+        for (__pyx_t_32 = 0; __pyx_t_32 < __pyx_t_29; __pyx_t_32+=1) {
+          __pyx_v_q = __pyx_t_32;
+
+495: 					force += 2.0 * overlapfx[p,q] * weightedEnergy[q,p]
+
          __pyx_t_37 = __pyx_v_p;
+          __pyx_t_36 = __pyx_v_q;
+          __pyx_t_38 = __pyx_v_q;
+          __pyx_t_34 = __pyx_v_p;
+          __pyx_v_force = (__pyx_v_force + ((2.0 * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_overlapfx.data + __pyx_t_37 * __pyx_v_overlapfx.strides[0]) ) + __pyx_t_36 * __pyx_v_overlapfx.strides[1]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_weightedEnergy.data + __pyx_t_38 * __pyx_v_weightedEnergy.strides[0]) ) + __pyx_t_34 * __pyx_v_weightedEnergy.strides[1]) )))));
+        }
+      }
+
 496: 
+
 497: 	#|---------------------------------------nuclear repulsion-------------------------------------|
+
 498: 
+
+499: 			for i in range(0, na):
+
      __pyx_t_13 = __pyx_v_na;
+      __pyx_t_23 = __pyx_t_13;
+      for (__pyx_t_24 = 0; __pyx_t_24 < __pyx_t_23; __pyx_t_24+=1) {
+        __pyx_v_i = __pyx_t_24;
+
+500: 				ra = sqrt((alo_x[atom,0] - alo_x[i,0])*(alo_x[atom,0] - alo_x[i,0]) + (alo_x[atom,1] - alo_x[i,1])*(alo_x[atom,1] - alo_x[i,1]) + \
+
        __pyx_t_34 = __pyx_v_atom;
+        __pyx_t_38 = 0;
+        __pyx_t_36 = __pyx_v_i;
+        __pyx_t_37 = 0;
+        __pyx_t_40 = __pyx_v_atom;
+        __pyx_t_39 = 0;
+        __pyx_t_35 = __pyx_v_i;
+        __pyx_t_33 = 0;
+        __pyx_t_16 = __pyx_v_atom;
+        __pyx_t_15 = 1;
+        __pyx_t_41 = __pyx_v_i;
+        __pyx_t_42 = 1;
+        __pyx_t_43 = __pyx_v_atom;
+        __pyx_t_44 = 1;
+        __pyx_t_45 = __pyx_v_i;
+        __pyx_t_46 = 1;
+/* … */
+        __pyx_v_ra = sqrt((((((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_34 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_38 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_36 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_37 * __pyx_v_alo_x.strides[1]) )))) * ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_40 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_39 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_35 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_33 * __pyx_v_alo_x.strides[1]) ))))) + (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_16 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_15 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_41 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_42 * __pyx_v_alo_x.strides[1]) )))) * ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_43 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_44 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_45 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_46 * __pyx_v_alo_x.strides[1]) )))))) + (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_47 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_48 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_49 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_50 * __pyx_v_alo_x.strides[1]) )))) * ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_51 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_52 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_53 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_54 * __pyx_v_alo_x.strides[1]) )))))));
+
+501: 					     (alo_x[atom,2] - alo_x[i,2])*(alo_x[atom,2] - alo_x[i,2]))
+
        __pyx_t_47 = __pyx_v_atom;
+        __pyx_t_48 = 2;
+        __pyx_t_49 = __pyx_v_i;
+        __pyx_t_50 = 2;
+        __pyx_t_51 = __pyx_v_atom;
+        __pyx_t_52 = 2;
+        __pyx_t_53 = __pyx_v_i;
+        __pyx_t_54 = 2;
+
+502: 				rb = alo_x[atom,cart] - alo_x[i,cart]
+
        __pyx_t_54 = __pyx_v_atom;
+        __pyx_t_53 = __pyx_v_cart;
+        __pyx_t_52 = __pyx_v_i;
+        __pyx_t_51 = __pyx_v_cart;
+        __pyx_v_rb = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_54 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_53 * __pyx_v_alo_x.strides[1]) ))) - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_alo_x.data + __pyx_t_52 * __pyx_v_alo_x.strides[0]) ) + __pyx_t_51 * __pyx_v_alo_x.strides[1]) ))));
+
+503: 				if ra != 0:
+
        __pyx_t_7 = ((__pyx_v_ra != 0.0) != 0);
+        if (__pyx_t_7) {
+/* … */
+        }
+      }
+
+504: 					force += rb * alo_z[i] * alo_z[atom]/(ra*ra*ra)
+
          __pyx_t_51 = __pyx_v_i;
+          __pyx_t_52 = __pyx_v_atom;
+          __pyx_v_force = (__pyx_v_force + (((__pyx_v_rb * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_51 * __pyx_v_alo_z.strides[0]) )))) * (*((short *) ( /* dim=0 */ (__pyx_v_alo_z.data + __pyx_t_52 * __pyx_v_alo_z.strides[0]) )))) / ((__pyx_v_ra * __pyx_v_ra) * __pyx_v_ra)));
+
 505: 	#|------------------------------------------final forces---------------------------------------|
+
+506: 			if abs(force) > 1e-12:
+
      __pyx_t_7 = ((fabs(__pyx_v_force) > 1e-12) != 0);
+      if (__pyx_t_7) {
+/* … */
+      }
+    }
+  }
+
+507: 				vires[atom,cart] = force
+
        __pyx_t_52 = __pyx_v_atom;
+        __pyx_t_51 = __pyx_v_cart;
+        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_vires.data + __pyx_t_52 * __pyx_v_vires.strides[0]) ) + __pyx_t_51 * __pyx_v_vires.strides[1]) )) = __pyx_v_force;
+
 508: 
+
+509: 	return Vx
+
  __Pyx_XDECREF(__pyx_r);
+  __Pyx_INCREF(__pyx_v_Vx);
+  __pyx_r = __pyx_v_Vx;
+  goto __pyx_L0;
+
+510: import time
+
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_time, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 510, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_time, __pyx_t_1) < 0) __PYX_ERR(0, 510, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+511: import rhf
+
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_rhf, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 511, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_rhf, __pyx_t_1) < 0) __PYX_ERR(0, 511, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+512: a , b, d = rhf.mol([])
+
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_rhf); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_mol); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
+    PyObject* sequence = __pyx_t_3;
+    Py_ssize_t size = __Pyx_PySequence_SIZE(sequence);
+    if (unlikely(size != 3)) {
+      if (size > 3) __Pyx_RaiseTooManyValuesError(3);
+      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
+      __PYX_ERR(0, 512, __pyx_L1_error)
+    }
+    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
+    if (likely(PyTuple_CheckExact(sequence))) {
+      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
+      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
+      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); 
+    } else {
+      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
+      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
+      __pyx_t_4 = PyList_GET_ITEM(sequence, 2); 
+    }
+    __Pyx_INCREF(__pyx_t_1);
+    __Pyx_INCREF(__pyx_t_2);
+    __Pyx_INCREF(__pyx_t_4);
+    #else
+    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 512, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 512, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_4 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 512, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_4);
+    #endif
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  } else {
+    Py_ssize_t index = -1;
+    __pyx_t_5 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 512, __pyx_L1_error)
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext;
+    index = 0; __pyx_t_1 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_1)) goto __pyx_L2_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_1);
+    index = 1; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L2_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_2);
+    index = 2; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L2_unpacking_failed;
+    __Pyx_GOTREF(__pyx_t_4);
+    if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 3) < 0) __PYX_ERR(0, 512, __pyx_L1_error)
+    __pyx_t_6 = NULL;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    goto __pyx_L3_unpacking_done;
+    __pyx_L2_unpacking_failed:;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_6 = NULL;
+    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
+    __PYX_ERR(0, 512, __pyx_L1_error)
+    __pyx_L3_unpacking_done:;
+  }
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_a, __pyx_t_1) < 0) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_b, __pyx_t_2) < 0) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_d, __pyx_t_4) < 0) __PYX_ERR(0, 512, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+513: from numpy import load
+
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 513, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_INCREF(__pyx_n_s_load);
+  __Pyx_GIVEREF(__pyx_n_s_load);
+  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_load);
+  __pyx_t_4 = __Pyx_Import(__pyx_n_s_numpy, __pyx_t_3, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 513, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_load); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 513, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_load, __pyx_t_3) < 0) __PYX_ERR(0, 513, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+514: data = load('../mints/h2o-sto-3g-mints.npz')
+
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_load); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 514, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 514, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_data, __pyx_t_3) < 0) __PYX_ERR(0, 514, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+/* … */
+  __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_mints_h2o_sto_3g_mints_npz); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 514, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_tuple__21);
+  __Pyx_GIVEREF(__pyx_tuple__21);
+
+515: d = data['d']
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_data); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 515, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_Dict_GetItem(__pyx_t_3, __pyx_n_u_d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 515, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_d, __pyx_t_4) < 0) __PYX_ERR(0, 515, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+516: f = data['f']
+
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 516, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_3 = __Pyx_PyObject_Dict_GetItem(__pyx_t_4, __pyx_n_u_f); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 516, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_f, __pyx_t_3) < 0) __PYX_ERR(0, 516, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
+517: tt = time.time()
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_time); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 517, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_time); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 517, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 517, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_tt, __pyx_t_3) < 0) __PYX_ERR(0, 517, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+
 518: 
+
+519: v= ocypete(a,b,d,f)
+
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_a); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_b); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_d); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_f); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __pyx_f_7ocypete_ocypete(__pyx_t_3, __pyx_t_4, __pyx_t_7, __pyx_t_8, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
+  __pyx_t_7.memview = NULL;
+  __pyx_t_7.data = NULL;
+  __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1);
+  __pyx_t_8.memview = NULL;
+  __pyx_t_8.data = NULL;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_v, __pyx_t_2) < 0) __PYX_ERR(0, 519, __pyx_L1_error)
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+520: print(v)
+
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_v); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 520, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 520, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+
+521: print(time.time()-tt)
+
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_time); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_time); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_4);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_tt); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error)
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
diff --git a/document/ocypete.md b/document/ocypete.md new file mode 100644 index 0000000..5d86905 --- /dev/null +++ b/document/ocypete.md @@ -0,0 +1,46 @@ +# ocypete Module - cython fast integrals derivatives + +As I mentioned before this project was not designed to be fast, the emphasis was on clarity rather than conciseness or speed. However the **aello** module was an example of how to speed up an implementation with Cython. **Aello** is a cython version of the integral module whereas **ocypete** is a cython version of (essentially) the force module, and so concentrates on integral derivatives and forces. The module is called **ocypete** who was one of the Harpies in Greek mythology the name means *swift-wing*. The approach again taken was to convert the python basis and atom class arrays (numpy) to c-memory views and use those. If you compile **ocypete** via 'cython ocypete.pyx -a' and get an html file which shows how the code is interacting with the python interpreter you will see that most of the calculation is in white (good) with only the python->c code in yellow (bad). The loop are free of yellow which is key to a successful conversion. A copy of ocypete.html is to be found in the document folder. The routines are + +1. **cdef double cye(int ia, int ja, int type, double r, double ie, double je, int n, double x)**\ + Cython version of e from integral module. + +2. **cdef double efx(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0, int p = 0, int s = 0):**\ + Cython version of force.efx. + +3. **cdef double ovlpfx(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, double ie, double je, \ + double ir0, double ir1, double ir2, double jr0, double jr1, double jr2, int[3] n, double[3] origin, int x, int center):**\ + Cython version of force.overlapfx + +4. **cdef double kntcfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + int[3] n, double[3] origin, int x, int center):**\ + Cython version of kineticfx + +5. **cdef double boys(double m,double T):**\ + Cython version of force.boys + +6. **cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2):**\ + Cython version of integral.j + +7. **cdef double clmbsfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + double[:] nucleus, int[3] n, double[3] origin, int x, int center):**\ + Cython version of force.coulombfxs + +8. **cdef double clmbhfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + double[:] nucleus, int[3] n, double[3] origin, int x):**\ + Cython version of force.coulombfxh + +9. **cdef double teifx(short[:] ia, short[:] ja, short[:] ka, short[:] la, double ie, double je, double ke, double le, \ + double[:] ir, double[:] jr, double[:] kr, double[:] lr, int[3] ra, int[3] rb, double[3] origin, int x, int center):**\ + Cython version of force.electronRepulsionfx + +10. **cdef double erifx(short[:] ng, int p, int q, int r, int s, double[:,:] im, double[:,:] ic, double[:,:] ie, short[:,:] ia, double[:,:] io, \ + int x, int center):**\ + Cython version of force.ERIfx + +11. **cpdef ocypete(object molAtom,object molBasis, double[:,:] density, double[:,:] fock):**\ + Main routine. Main loops are over all atoms and cartesian directions. Routines from force called *build* are combined with *kfx*, *jfx* and *jfh* within the main loops to form the one-electron contribution to the fock derivative. two electron derivatives are then calculated and a fock derivative matrix formed. Overlap are then incorporated along with the nuclear contribution. A cut-off of 1e-12 is applied to the final force tensor (any element < cut-off set to 0). Returns the force tensor \[atoms, directions]. + + Timings against McMurchie-Davidson program (also using Cython)(JJGoings) on water... + dz basis Harpy 20s McMurchie-Davidson 2m 55s + sto-3g Harpy 3s McMurchie-Davidson 20s diff --git a/document/post.md b/document/post.md new file mode 100644 index 0000000..271e57b --- /dev/null +++ b/document/post.md @@ -0,0 +1,71 @@ +# Post Module - post SCF calculations + +Dipole and Mulliken are covered in [Crawford projects] (https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2303). A useful discussion of charges can be found [here](https://mattermodeling.stackexchange.com/questions/1439/what-are-the-types-of-charge-analysis) + +1. **charges(D, S, atoms, bases)** + + parameters - *D* is the final density matrix, *S* the overlap matrix, *atoms* an array of atom objects (the molecular atom + set) and *bases* an array of basis objects (the molecular basis). The routine calls the different methods of charge and population analysis. Calls Mulliken and Lowdin. No return value. + +2. **mulliken(D, S, atoms, bases))** + + parameters - *D* is the final density matrix, *S* the overlap matrix, *atoms* is an array of atom objects (the molecular atom + set) and *bases* an array of basis objects (the molecular basis). Performs a Mulliken population analysis, passing + gross atomic populations and orbital populations to the output module and returning gross atomic populations. + +3. **lowdin(D, S, atoms, bases))** + + parameters - *D* is the final density matrix, *S* the overlap matrix, *atoms* an array of atom objects (the molecular atom + set) and *bases* an array of basis objects (the molecular basis). Performs a Lowdin population analysis, passing + gross atomic populations to the output module and returning gross atomic populations. + +4. **energyPartition(E, N, D, K, V, G, e, en)** + + parameters - *E* is final electronic energy, *N* the nuclear repulsion energy, *D* the final density matrix, *T* the exchange (kinetic) energy matrix, *V* the Coulomb (potential) energy matrix, *G* the matrix in Fock = CoreHamiltonian + G, *e* are eigenvalues of final fock (orbital energies) and *en* is the number of electrons. Performs a analysis of the components of the energies. Returns the energy partitioning to the output module. + +5. **dipoleComponent(atoms, bases, type, gauge)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *type* is a cartesian axis *x*|*y*|*z* and *gauge* is the type of gauge origin. Calls gaugeCenter (atom module) and mu (integral module) returns float. + +6. **buildDipole(atoms, bases, density, gaugeOrigin, engine = 'aello'):** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *density* is the final density matrix. *gaugeOrigin* is the gauge type string and *engine* is the integral engine to use. Calls dipoleComponent returns an array cells \[0,1,2] are electron dipole components, \[3] is square of resultant. Array is returned and written to output module. + +7. **buildMp2Dipole(atoms, bases, gauge, c, e, eri, nOccupied)** + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *gauge* is the gauge type string, *c* are the converged eigenvectors, *e* the final orbital energies, *eri* are the 2-electron repulsion integrals (as linear list) and *nOccupied* is the number of doubly occupied orbitals. Returns the mp2 level unrelaxed dipole moment. List is returned and output written. + +8. **quadrupoleComponent(atoms, bases, type, gauge)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *type* is a cartesian axis *xx*|*yy*|*zz*|*xy*|*yz*|*zx*| and *gauge* is the type of gauge origin. Calls gaugeCenter (atom module) and q (integral module) returns float. + +9. **buildQuadrupole(atoms, bases, density, gaugeOrigin)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *density* is the final density matrix. *gaugeOrigin* is the gauge type string. Calls quadrupoleComponent returns an array of electron quadrupole components, [xx,yy,zz,xy,yz,zx]. Array is returned writes to output module. + +10. **polarizabilities(atoms, bases, c, f, ERI, nOccupied, gauge)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), + *c* are the final eigenvectors, *f* the final fock matrix, *ERI* the 2-electron repulsion integrals, *nOccupied* the number of occupied orbitals and *gauge* is the type of gauge origin. Returns the principal polarizations, the isotropic polarization, the responses and the dipole tensors. Based on the psi4numpy tutorial [here](https://github.com/psi4/psi4numpy/blob/master/Tutorials/06_Molecular_Properties/6a_CP-SCF.ipynb) + +11. **electricFieldNuclear(atoms, gauge)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *gauge* is the type of gauge origin. Calls gaugeCenter (atom) and returns the nuclear components of the electric field and potential. Returned array [Ex, Ey, Ez, V]. + +12. **buildElectricField(atoms, bases, density, gauge):** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), *density* is the final density matrix. *gaugeOrigin* is the gauge type string. Calls electricField and returns an array of electric field components (field first potential second, [Ex, Ey, Ez, V, Enx, Eny, Enz, Vn]. + +13. **hyperPolarizabilities(atoms, bases, c, eri, e, f, nOccupied, gauge)** + + parameters - *atoms* is an array of atom objects (the molecular atom set) and *bases* an array of basis objects (the molecular basis), + *c* are the final eigenvectors, *eri* are the 2-electron replusion integrals, *e* are the orbital energies, *f* the final fock matrix, *nOccupied* the number of occupied orbitals and *gauge* is the type of gauge origin. Returns the (static) hyperpolarizations in the axial directions, the total amplitude, the parallel and perpendicular components with respect to z-axis and the hyperpolarizability tensor. Based on the psi4numpy tutorial [here](https://github.com/psi4/psi4numpy/blob/master/Tutorials/06_Molecular_Properties/6b_first_hyperpolarizability.ipynb). Defined parameters calculated as per [3.200.7](http://web.mit.edu/multiwfn_v3.3.8/Manual_3.3.8.pdf). For the static case these parameters are + + + **β**i = Σj βijjjjijij i in {x,y,z}. j = {x,y,z} - {i} + + **β**tot = (**β**x2+**β**y2+**β**z2)0.5 + + **β**⊥z = 0.2 **β**z + + **β** = 0.6 **β**z + +14. **bondOrder(D, S, atoms, basis)** + + parameters - *D* is the final density matrix, *S* the overlap matrix, *atoms* is an array of atom objects (the molecular atom + set) and *bases* an array of basis objects (the molecular basis). Computes the Mayer bond orders as BAB = Σ Σ (DS)μν(DS)νμ where μ are orbitals centered on atom A and ν are orbitals centered on atom B. The valency VA is calculated simply as Σ BAX. Returns bond orders and atom valencies. diff --git a/document/rESP.md b/document/rESP.md new file mode 100644 index 0000000..8dcb2d0 --- /dev/null +++ b/document/rESP.md @@ -0,0 +1,216 @@ +# Restrained Electrostatic Potentials + +This follows the reference C. I. Bayly et. al. J. Phys. Chem. 97, 10269 (1993). Firstly a surface or set of surfaces are generated based on the Van der Vaals radii of the atoms in the molecule. These surfaces contain the points on which the electrostatic potential is to be sampled. Below is an example one set of surfaces (shell) of the water molecule. A worthwhile reference is also the multiwfn manual pg 85-89 [](http://sobereva.com/multiwfn/Multiwfn_manual.html). + +![](../media/h2o-shell.png) + +A density of points is specified and an algorithm distributes the points at that density over the shell. Algorithms used can be eg Connolly surfaces (https://en.wikipedia.org/wiki/Accessible_surface_area), Fibonacci based (https://code-examples.net/en/q/927f21) or Saff and Kuijlaars algorithm (https://perswww.kuleuven.be/~u0017946/publications/Papers97/art97a-Saff-Kuijlaars-MI/Saff-Kuijlaars-MathIntel97.pdf). The shells are a continuous hollow surface, meaning points centered on one atom that lie inside the radius of another atom are removed. The electrostatic potential is then calculated at all points on the spherical grid. Constraints can then be imposed and the system is solved using Lagrange multipliers for the charges on the atoms. + +1. **equiDistribution(points=45, variant='con')** + + parameters - *points* is the number of points to be plotted on the atomic surface, usually the result of a previous density calculation. *variants* is one of 'con' for a Connolly surface or 'fib' for a fibonacci golden spiral coverage. Computes a regular spaced point distribution on a unit sphere and returns the array of points. + +2. **surfaceView(distribution)** + + parameters - *distribution* is the array of distributed points. Plots a 3-d scatter plot of the surface distribution of points (as in figure above). + +3. **respData(molAtom, molBasis, molData, options)** + + parameters - *molAtom* is an array of atom objects (the molecular geometry), *molBasis* is an array of basis objects (the molecular basis), *molData* are the parameters of the scf calculation and *options* are the parameters for the resp calculation. Routine processes options, calls equiDistribution to generate a surface or shells of surfaces, removes internal points for each shell, calculates the electrostatic potential at all points on all shells and saves points and esp values in a .npz file. For computational convenience an array of inverse distances from all distribution points to each atomic center is also stored. + +4. **buildmatrix(invRadii, constraintLength, nAtoms))** + + parameters - *invRadii* is an array of inverse distances from all points to all atom centers ([points, atoms]), *constaintLength* is the number of contraints imposed on the system and *nAtoms* is the number of atomic centers in the system. Computes the matrix **A** in the Lagrange multiplier problem **A**q=**b**. **A** is essentially the product of inverse distances. + +5. **buildvector(invRadii, esp, constraintLength, nAtoms, charge)** + + parameters - *invRadii* is an array of inverse distances from all points to all atom centers ([points, atoms]), *esp* is an array of electrostatic potentials evaluated at points in the distribution, *constaintLength* is the number of contraints imposed on the system, *nAtoms* is the number of atomic centers in the system and *charge* is the overall molecular charge. Computes the vector **b** in the Lagrange multiplier problem **A**q=**b**. **b** is essentially the product of inverse distance and the electrostatic potential. + +6. **restrainedESP(molAtom, molBasis, molData, options)** + + parameter - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects, *molData* are the molecular run parameters and *options* are the parameters for the resp calculation. Routine calls rhf.mol to get molecular parameters, calls resp to get data if not reading a previous file, loads data and constructs **A** and **b** matrix and vector. Adds constraints into **A** and **b** and removes any zero rows or columns (or solve will have singular matrix) and calls numpy.linalg solver. + + options can be any of (n,i,j integer and u,v,x float) + + sphere 'con' | 'fib' + points ['density' | 'points', n] + shell [n, u, v] + + file [ 'r' | 'w' , file, 'keep' | 'clear'] + view [ False | True] + constrain [[n , [i,j,...]], ...] + radii [ ['Sy', n], ...] + restrain {'a' : u, 'b' : v, 'h' : False | True, 'tol' : x, 'cycles' : n} + + + *sphere* is the spherical distribution algorithm to use either **con**nolly or **fib**onacci. Default is 'con'. + + + *points* is either an explicit number of points to plot or a density of points, Default is ['density' , 1]. Density is points per square Angstrom. + + + *shell* can be eg [1, 0.0, 1.4] which will generate one shell at a radial distance of the Van der Waals radius scaled by 1.4. [4, 0.2, 1.4] will generate four shell at the Van der Waals radius scaled by 1.4, 1.6, 1.8, 2.0 respectively. Default is single shell at the Van der Waals radius (ie [1, 0.0, 1.0]). + + + *file* ['w', 'esp.npz', 'keep'] eg will write the data to a compressed numpy file and retain the file (you may omit the .npz), ['r', 'esp.npz', 'clear'] will make to program skip generating the data and directly read it in then delete it after processing. Default is ['w', 'esp.npz']. + + + *view* True will display a visualisation of the esp surface. Default is False + + + *constrain* can be one of two type 1) [1, [2,3]] - this will constrain atoms 2 and 3 charges to sum to 1, or 2) [0, [-2,3]] will cause atoms 2 and 3 to have equal charges. Default is []. **Note atoms are numbered from base 1 not 0** + + + *radii* ['H', 1.15] will redefine the default Van der Vaals radius on Hydrogen. + + + *restrain* A dictionary {}. Keys 'a' the restraint factor for **A** matrix, 'b' the restraint factor for **b** vector, 'h' boolean determines whether hydrogens are include in the restrain (True) or not (False), 'tol' is tolerance for the convergence in the iteration and 'cycles' is the maximum number of cycles permitted in the iteration. + + Default values are equivalent to + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [1, 0.0, 1.0], radii : [] , + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [], + 'restrain' : { 'a' : 0.0005, 'b' : 0.1, 'h' : True,'tol' : 1e-6, 'cycles' : 30]} ) + +7. **doRestraintIteration(q, a, b, parameters, z)** + + parameters - *q* charges, *a* and *b* are respectively the **A** matrix and **b** vector, *parameters* are the restraint options and *z* is an array of atomic numbers of the molecules atoms. Restraints are applied, the system solved and repeated until the difference in charges in two sucessive cycles is less than the prescibed tolerance. Returns converged restrained charges. + +8. **doRestraint(q, a, parameters, z)** + + parameters - parameters - *q* charges, *a* is the **A** matrix, *parameters* are the restraint options and *z* is an array of atomic numbers of the molecules atoms. Applies the (hyperbolic) restraints to **A** matrix and returns it. + +9. **writerESP(mData, rData, qc, qr, metrics, stage)** + + parameters - *mData* is the molecular data, *rData* are the program options, *qc* the constrained charges, *qr* the restrained charges and *metrics* the number of points on VdW surface and number of iterations. *stage* flags whether results are from a stage one or stage two calculation. Calls view module to output results in HTML format. + +10. **deltaRMS(esp, qr , invRadii)** + + parameters - *esp* are the electrostatic potentials at the surface points, *qr* are the restrained atomic charges (or constrained if restrained not available) and *invRadii* are in inverse radial distances from surface points to all atomic centers. Returns root mean square difference between the quantum electrostatic potentials at each point and a classically obtained potential using the restrained/constrained point charges. + +11. **carbonGroups(molAtom)** + + parameter - *molAtom* is the molecular atom set. Returns groups of atoms suitable for stage two restraints, that is carbons with atoms attached as [Cn, [H1, H2,...], ...] + +12. **stageTwoConstraints(options, groups, nAtoms, q)** + + parameters - *options* are the parameters for the resp calculation, *groups* are the stage two atoms as determined by carbonGroups routine, *nAtoms* are the number of atoms in the molecule and *q* are the restained charges from stage one. Returns lthe options with the 'constrain' option updated with the stage two *groups*. + +13. **processConstraints(options)** + + parameters - *options* are the parameters from the 'constrain' option which are converted to two lists, one of the charges and one of the atoms involved with that charge constraint. + +Here are the harpy results for the oxygen in water, single shell and then shell sequence 1.4,1.6,1.8,2.0 repeated with default restraints. +Comparisons with psi4 made using following settings + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [1, 0.0, 1.0], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [[0,[-2,3]]] } ) + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [4, 0.2, 1.4], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [[0,[-2,3]]] } ) + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [1, 0.0, 1.0], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [[0,[-2,3]]], 'restrain' : {} } ) + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [4, 0.2, 1.4], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [[0,[-2,3]]], 'restrain' : {} } ) + +The above harpy parameters were run for sto-3g, 6-31g, dz, aug-cc-pvdz, cc-pvdz and compared with the resp plug-in (see psi4numpy). All values agreed with psi4 to better than 0.0001. + +| basis | shells = 1 | shells = 4 | with restraints (1)| with restraints (4) | +|----------|--------------|--------------|-----------------|---------------------| +| sto-3g | -0.4836 | -0.4770 | -0.4809 | -0.4755 | +| 6-31g | -0.7827 | -0.8298 | -0.7800 | -0.8283 | +| dz | -0.7861 | -0.8486 | -0.7834 | -0.8470 | +| cc-pvdz | -0.6524 | -0.6868 | -0.6498 | -0.6853 | +| aug-cc-pvdz | -0.6153 | -0.6701 | -0.6127 | -0.6686 | + +It is possible to add stage 2 restraints by including the keyword **stage2** in the options list the possible values are True or False. If stage2 is enabled then a search is made through the atoms for carbons with hydrogens attached. These groups are refitted with the hydrogen charges constrained to be equal, all other atoms have their charges constrained to the values of the restrained stage 1 calculation. For example, methylamine the carbon(1) has 3 hydrogens attached (3,4,5) and is connected to a nitrogen(2) which has two hydrogens (6,7). A stage two calculation will find the CH3 group and will assign constraints + + [[0, [-3,4,5]] , [q2, [2]] , [q6, [6]] , [q7, [7]] ] + +That is the hydrogens on the carbon are constrained to have equal charges and all other atoms (except the carbon) are constrained to the restrained charges from the first stage. If 'a' is not specified a value of 0.001 will be used following Kollman et al. in J. Phys. Chem., 97, 10269 (1993) (the defaults for first stage also taken from this work). Running... + + restrainedESP({ 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [4, 0.2, 1.4], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [], + 'restrain' : {}, 'stage two' : {'a' : 0.001}}) + +The results are + +| atom | constrained | restrained | stage 2 constrained | stage 2 restrained | +|-------|---------------|-------------|---------------------|--------------------| +| C | 0.1694 | 0.0872 | 0.0927 | 0.0825 | +| N | -0.8270 | -0.8015 | -0.8015 | -0.8015 | +| H(C) | 0.0011 | 0.0236 | 0.0291 | 0.0325 | +| H(C) | 0.0137 | 0.0346 | 0.0291 | 0.0325 | +| H(C) | 0.0137 | 0.0346 | 0.0291 | 0.0325 | +| H(N) | 0.3145 | 0.3107 | 0.3107 | 0.3107 | +| H(N) | 0.3145 | 0.3107 | 0.3107 | 0.3107 | + +These agree with psi4Numpty. Note the first stage restrained charges on amine group are retained in second stage, only the carbon-hydrogens are re-fitted. The results are appended to the stage one output above as + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
molecular basissto-3gmolecular charge0
spherical distribution modelConnollysurface density1
number of shells4shell increment0.2base shell1.4
effective evaluation points72restrained iterations8Δrms (resp - classical)0.0027
A scaling0.0005b scaling0.1convergence tolerance1e-06iteration limit30
hydrogens are restrained
constrained electrostatic potential charges
0.1694-0.8270.00110.01370.01370.31450.3145
restrained electrostatic potential charges
0.0872-0.80150.02360.03460.03460.31070.3107
stage two constraints
restrained iterations4Δrms (resp - classical)0.0028
constrained charges on atoms 3 4 5 are equal
constrained charges on atoms 2 sum to -0.8015
constrained charges on atoms 6 sum to 0.3107
constrained charges on atoms 7 sum to 0.3107
constrained electrostatic potential charges
0.0927-0.80150.02910.02910.02910.31070.3107
restrained electrostatic potential charges
0.0825-0.80150.03250.03250.03250.31070.3107
+ +The Δrms is the root mean square difference between the classically calculated (q/r) value calculated at all points using the restrained (or constrained) point charges on the atoms and the qm calculated electrostatic potential value at that point. + +There is no aello version of electric field integrals so these rESP calculation are a bit slow. + +To run the rESP just edit the restrainedESP line at the end of the rESP.py file and run as python3 rESP.py from the source directory. +The npz file contains the points making up the surface, the inverse radii, the electrostatic potential at the surface points and the number of points in the surface. This allows several constraint and restraint options to be explored without recalculating the surface by using the file 'r' option. + diff --git a/document/rhf.md b/document/rhf.md new file mode 100644 index 0000000..d7f0c38 --- /dev/null +++ b/document/rhf.md @@ -0,0 +1,155 @@ +# Restricted Hartree-Fock Module - SCF calculations + +A discussion of the algorithm can be found in [Crawford projects](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2303). You will need from numpy - sqrt, zeros, dot, from numpy.linalg - fractional_matrix_power, eigh, from math - pow. All functions are imported from their modules explicitly so you can see where they come from. + +1. **rms(Da, Db)** + + parameters - *Da*, *Db* two consecutive cycles of the density matrix. Returns square root of the square of the difference of the two matrices. + +2. **mol(show, file = 'project.hpf', molecule='')** + + parameters - *show* is a list of information to be output to HTML file, \['geometry',| 'orbitals'], \[ ] will surpress output. *File* is by default 'project.hpf' but can be any file following the format given in a) below. The routine... + ++ a) reads the file containing the job to be processed. Name of file is 'project.hpf'. The file has the following type of format... + + name=h2o + matrix=c + post={ch,di} + + O1 8 0.000000000000 -0.143225816552 0.000000000000 + H1 1 1.638036840407 1.136548822547 -0.000000000000 + H2 1 -1.638036840407 1.136548822547 -0.000000000000 + + end + #============================================= + name=h2o-z + matrix=z + units=bohr + + O + H 1 OH + H 1 OH 2 HOH + + OH 2.078698587436746 + HOH 104 + + end + #---------------------------------------------- + + Each molecule definition is terminated by an **end** statement. **#** lines and blank lines are ignored (except in a z-matrix block). The following keywords, options and defaults are recognised, listed as keyword \[default\](options) + + name [] name of molecule + basis [sto-3g] name of basis + diis [on](off) use diis or not + engine [aello](native) use cython or python integral engine. + gauge [origin](nuclear | mass) gauge center + guess [core](gwh) hamiltonian guess + charge [0](integer) molecular charge + multiplicity [1](integer) multiplicity + cycles [100](integer) maximum iterations + capacity [8](integer) diis holding capacity + tolerance [1e-8](float) convergence tolerance + uhfmix [0.0] uhf orbital mixing parameter + matrix [](c | z) use cartesian or z-matrix atom definition + post [] list of post-SCF routines to run + units [bohr](angstrom) units used in atom definitions + cogus [] symbolic cluster codes + no_mint_density don't use initial guess density if available + end marks end of molecule definition +These keywords are dictionary keys in molData. + +**Note that only *matrix* and *end* are mandatory** +The file may contain multiple sections as above seperated by a blank or *#* line, the program will execute the **first** such section. It is the first section that is your effective project molecule, other entries in this file are just for storage until they are required when they will have to be moved into position one. All uses of rhf.mol during execution refer to the molecule in position one. Having read the geometry and options an array of atom objects is made. The key *post* has the form + + post={ch,di,...,po} + +where the two letter code represents a post-SCF procedure to execute. The codes are **ch**arges (ch), **bo**nd order (bo), **en**ergy analysis (en), **di**pole (di), **qu**adrupole (qu), **m**oller-**p**lesset (mp), **o**rbital-optimised **m**p2 (om), **m**p2 by **l**aplace transform (ml), **m**any-**b**ody perturbation theory (mb), **c**onfiguation **i**nteraction singles (ci), **f**ull **c**onfiguration interaction (fc), configuration interaction **s**ingles and **d**oubles (sd), **c**onfiguration interaction **s**ingles (slater determinants) (cs), ci **s**pin-adapted **s**ingles(ss), ci **s**pin-adapted **t**riples(st), **r**adom **p**hase approximation (rp), **c**oupled-cluster sd(**t**) (ct), **c**c**2** approximation (c2), **l**inear coupled-cluster singles and **d**oubles (ld). +**l**inear **c**oupled-cluster doubles (lc), **c**oupled-cluster **d**oubles (cd), **fo**rces (fo), **e**lectron **p**ropagator 2 (ep), +**e**lectron propagator **2** spin-adapted (e2), **e**lectron propagator **3** spin-adapted (e3), **ko**opman associated Greens function correction (ko), +**po**larizabilities (po), **hy**perpolarizabilities (hy). There are also 'fast' (einsum) coupled-cluster options '+s' - cc**s**d, '+d' - cc**d**, '+t' - ccsd(**t**), '+2' - cc**2**, '+l' - **l**ccd, '+L' - **L**ccsd and '+^ - **lambda**. Coupled-cluster triples variants are available as '-T' - ccsd**T**, '-t' - ccsd(**t**), '-1a' - ccsdt-**1a**, '-1b' - ccsd-**1b**, '-2' - ccsdt-**2**, '-3' - ccsdt-**3**, '-4' - ccsdt-**4**. + +The *post* keyword will only have effect if the *postSCF* option appears in the **show** list of the scf function call eg + + rhf.scf(molAtom, molBasis, molData , [ 'preSCF', 'SCF', 'postSCF', 'mints'], density) +Running the code from harpy.py includes the postSCF option. + +The *cogus* keyword has a similar form to *post* + + cogus={d,cd(t)} + +where the codes represent a coupled-cluster code produced by the Cluster Operator Generator Using Sympy program. The codes are **d** - CCD, **sd** - CCSD, **sd(t)** - CCSD(T), **sdt** - CCSDT, **2** - CC2, **3** - CC3, **ld** - LCCD, **lsd** - LCCSD. + +The *molecule* parameter is any molecule identifier from an .hpf file, that is something on the right of a 'name=' specifier. + ++ b) Builds the molecular basis. Uses buildBasis. Returns the atom and basis objects and the parameters defining the run as a list. + +3. **rebuildCenters(molAtom, molBasis, geo)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects and *geo* is an array of cartesian coordinates. This routine is used to copy a new coordinate set represented by *geo* into *molAtom* and *molBasis*.center attributes. Returns the rebuilt object arrays which can then be used as arguements for scf to calculate an energy for a changed geometry. + +4. **scf(molAtom, molBasis, run, show, cptDensity = None)** + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects, *run* is the list of option parameters returned by *mol* and *show* is a list of information to be output to HTML file ['preSCF',| 'SCF',| 'postSCF',| 'mints'], and *cptDensity* is a density matrix used to start an SCF calculation instead of a matrix of zeros. If a mints file for the molecule and basis exists it will be used to start the computation (unless no_mint_density is stated in input file). This is useful in geometry optimisation and molecular dynamics where the density from the nth calculation can be used to start the (n+1)th. The following objects are declared global - C, density, fock, ERI, totalEnergy, S, e and coreH. The algorithm is briefly... + + a) Build overlap, exchange, coulomb, core Hamiltonian and 2-electron repulsion integrals. + Uses buildOverlap, buildKinetic, buildCoulomb, buildHamiltonian, buildEri. There are two integral engines 1) the normal python which is invoked with 'native' and a cython engine invoked with 'aello'. + + b) Define convergence parameters - maximum iterations allowed, convergence threashold, diis switch. Initialise density matrix or use check-point one. + + c) Define storage for, and size of diis mechanism. + + d) Get the inverse of the square root of the overlap matrix. + + e) Start the iteration cycle + + f) Initial Fock is Hamiltonian guess, subsequently H core + G. + + g) If diis and not 1st cycle use diis to compute the next Fock matrix. Uses diisFock. + + h) Orthogonalise the Fock matrix. + + i) Diagonalise the orthogonal Fock matrix. + + j) Transform the eigenvectors of l) back to non-orthogonal atomic basis. + + k) Build density matrix (over occupied orbitals). Uses buildDensity. + + l) Compute the SCF electronic energy. + + m) Check for converged solution. Delta energy and rms density must be satisfied and maximum iterations not exceeded. + if not converged go to step i). + + n) If converged solution do post-SCF (if selected) \ + charges \ + energyPartition \ + dipoles (ground state and mp2)\ + quadrupoles \ + moller-plesset \ + cis \ + full configuration interaction \ + configuration interaction singles and doubles \ + cis spin-adapted \ + random phase approximation \ + coupled-cluster singles and doubles and perturbative triples. \ + coupled-cluster doubles \ + linear coupled-cluster \ + cc2 \ + linear couple-cluster singles and doubles \ + forces \ + electron propogator \ + orbital optimised mp \ + laplace transform mp \ + polarizabilities \ + hyperpolarizabilities \ + or + Symbolic generated cluster code + + o) if 'mints' is in show string a compressed .npz file is saved of the molecular integrals. The file is named + '--mints.npz'. The files are read as + + data = load() + = data[] + +,where is + +**s** - overlap, **k** - kinetic, **j** - coulomb, **i** - 2-electron repulsion, **f** - fock,\ +**d** - density, **c** - eigenvectors, **e** - eigenvalues(orbital energies) and **E** - total energy, **m** -[charge, molecule name, basis name, nuclearRepulsion],**a** - list of atomic numbers of atoms in molecule. diff --git a/document/rohf.md b/document/rohf.md new file mode 100644 index 0000000..9f887b3 --- /dev/null +++ b/document/rohf.md @@ -0,0 +1,45 @@ +## Restricted Open-Shell Hartree-Fock + +For a discussion of ROHF see [this](http://vergil.chemistry.gatech.edu/notes/cis/node5.html). Another useful article is [ROHF theory made simple](https://aip.scitation.org/doi/10.1063/1.3503173). The treatment here follows the pyscf approach. + +1. **rmsDensity(density, preDensity)** + + parameters - *density* is the density matrix in the current cycle and *preDensity* is the density matrix from the previous cycle. Return the root-mean square difference of the matrices. + +2. **get_occupations(eps_list, atoms, charge, multiplicity)** + + parameters - *eps_list* orbital energies either \[e] or \[e, eα, eβ], *atoms* the array of atom objects, *charge* the net charge off the molecule and *multiplicity* is the multiplicity (unpaired electrons -1). This routine returns the occupancy of the atomic orbitals eg water in sto-3g (7 orbitals) with charge +1 (9 electrons) and multiplicity 2 (1 unpaired electron) we have [2, 2, 2, 2, 1, 0, 0] returned. To do this the routine first determines the number of α and β electrons - the number of electrons we can assign to doubly occupied orbitals (nc) is the total electrons - the number which are to be assigned to single orbitals alone ie ne-(multiplicity - 1) for our example 9-1=8. So 8 electrons are assigned to 4 doubly occupied orbitals 4 for α and 4 for β with the remaining unpaired electrons being assigned to α. This gives an occupancy of \[2, 2, 2, 2, 1, 0, 0] = \[1, 1, 1, 1, 1, 0, 0]α + \[1, 1, 1, 1, 0, 0, 0]β. In practice we sort the combined orbital energies by assigning an occupation of 2 to the lowest (core) nc orbitals, then we take the indices of the sorted highest orbitals not already assigned and take the corresponding energies from the α orbitals. These (non-core) orbital energies are then sorted and the lowest used to take (multiplicity -1) orbitals to assign an occupancy of 1 to - all remaining orbitals are assigned an occupancy of 0. + +3. **get_densities(c, occupations)** + + parameters - *c* orbital coefficients (see above)and *occupations* are atomic orbital occupancies calculated from *get_occupations*. Returns the alpha and beta densitys as a (2, nbf, nbf) array. + +4. **get_coulomb_exchange(density, eri)** + + parameters - *density* are the alpha and beta densities as returned by *get_densities* and *eri* are the two-electron repulsion integrals. Returns the alpha and beta j and k integrals. + +5. **make_fock(h, v, dm, s, roothaan=False)** + + parameters - *h* is the one-electron hamiltonian, *v* are alpha and beta effective potential (j+k), *dm* are the alpha and beta densities, *s* is the overlap matrix and *roothaan* is a boolean flag determining if the Roothaan effective Fock matrix is returned. The routine returns the α and β Fock matrices and if *roothaan* is True also the Roothaan effective Fock matrix constructed according to + ![image](https://user-images.githubusercontent.com/73105740/144617311-e3909a47-a4a7-41a0-86be-0c58cd7f6544.png) + +6. **eigensolution(fock, x)** + + parameters - *fock* is tuple of α and β Focks and *x* is the inverse square root of the overlap matrix. Solves for orbital energies for (Fα + Fβ), Fα and Fβ and returns them. + +7. **get_rohf_energy(density, h1e, v)** + + parameters - *density* are the α and β densities, *h1e* is the one-electron hamiltonian and *v* are the exchange and coulomb integrals. Returns the one-electron energy and the two-electron component of the energy separately. + +8. **spin_analysis(c, occupancy, s)** + + parameters - *c* the orbital coefficients (2, nbf, nbf), *occupancy* an array of occupation numbers and *s* the overlpa matrix. Computes the actual total spin (2
>) and multiplicity and returns them with the number of occupied α and β electrons. + +9. **scf(molAtom, molBasis, run, show)** + + parameters - *molAtom* an array of atom objects, *molBasis* an array of orbital objects (the molecular basis), *run* is a distionary of the parameters determining the characteristics of the computation and *show* is a list of properties to be output. This routine gets the molecular integrals needed and performs the scf iteration. If a converged solution is obtained an analysis of the spin properties is carried out and if requested the Mulliken population analysis and dipole computation are performed. + +Note that unlike uhf the spin contamination is zero and the multiplicity is exact. We can run our (modified) H2 dissociation program from harpy/test to see if ROHF handles that problem and we get + +![image](https://user-images.githubusercontent.com/73105740/145675142-efc2e4dd-7646-4787-b26e-0655242b1580.png) + diff --git a/document/scc.md b/document/scc.md new file mode 100644 index 0000000..d736314 --- /dev/null +++ b/document/scc.md @@ -0,0 +1,215 @@ +# Coupled Cluster Module - Single, Doubles and Perturbative Triples + +This module uses code based on the paper **J.F. Stanton, J. Gauss, J.D. Watts, and R.J. Bartlett, J. Chem. Phys. +volume 94, pp. 4334-4345 (1991)**. There is a Crawford project on the Singles and Doubles [see](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2305) and on the Perturbative Triples [see](https://github.com/CrawfordGroup/ProgrammingProjects/tree/master/Project%2306). Joshua Goings has another good discussion with code [here](https://joshuagoings.com/2013/07/17/coupled-cluster-with-singles-and-doubles-ccsd-in-python/). These routines use full spin-spin arrays, a more efficient storage regime would use occupied-virtual slicing. The routines here are coded with explicit loops rather than einsum so it's slow - but explicit. For faster versions see either cogus.py or fcc.py. + +1. **tauSpin(i, j, a, b, ts, td)** + + parameters - *i* and *j* refer to occupied spin basis functions, *a*, *b* are virtual spin basis functions. + *ts* are the singles amplitudes an array \[spinOrbitals, spinOrbitals]. Spin orbital count being twice the number + of basis functions. *td* are doubles amplitudes an array or order \[spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals]. + Returns float. Equation (9) of Stanton et al. + +2. **tautauSpin(i, j, a, b, ts, td)** + + parameters - *i* and *j* refer to occupied spin basis functions, *a*, *b* are virtual spin basis functions. + *ts* are the singles amplitudes and *td* the doubles amplitude. Returns float. Equation (10). + +3. **updateIntermediates(fs, ts, td, eriMOspin, nElectrons)** + + parameters - *fs* is the Fock matrix in the MO spin basis, *ts* and *td* are the singles and doubles amplitudes, *eriMOspin* are the 2-electron + repulsion integrals in the MO spin basis as a \[spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals] array. *nElectrons* + is the electron count. Evaluates equations (3) - (8) and returns the updated ts and td arrays. Calls functions tau, tauSpin, + amplitudesT1 and amplitudesT2. Builds the f and w occupied (\_o), unoccupied (\_u) and mixed (\_m) arrays used by amplitudesT1 and + amplitudeT2. The f and w arrays are global variables to this and the amplitude T1 and T2 routines. + +4. **amplitudesT1()** + + parameters - none. Returns updated ts. Equation (1). + +5. **amplitudesT2()** + + parameters - none. Returns updated td. Equation (2). + +6. **amplitudesT3(fs, ts, td, eriMOspin, nElectrons)** + + parameters - *fs* is the Fock matrix in the MO spin basis, *ts* and *td* are the singles and doubles amplitudes, *eriMOspin* are the 2-electron + repulsion integrals in the MO spin basis as a \[spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals] array. *nElectrons* + is the electron count. Returns the perturbative triples correction as a float. + +7. **ccsd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, totalEnergy, diisStatus)** + + parameters - *atoms* is an array of atom objects (the molecular atoms), *eigenVectors* are the eigenfunctions for the final Fock matrix, + *charge* the molecular charge, *fock* the final fock matrix, *ERI* the 2-electron repulsion integrals, *iterations* the maximum number + of iterations allowed, *convergence* is the convergence tolerence, *totalEnergy* the final converged SCF energy + (not needed for calculation) and *diisStatus* indicates whether DIIS is to be used (='on') or not (='off').\ +     This routine calls buildFockMOspin to get the Fock matrix in the MO spin basis, then buildEriMO to get 2-electron + repulsion integrals in the MO basis and subsequently buildEriDoubleBar to transform to a double-bar spin basis integral in physicist notation. The mp2 + energy is found using the doubles amplitudes. The calculation of the amplitudes is then calculated in a loop until the + amplitude difference (of both amplitudes) is below the convergence threshold. *diis* can be employed which works on the + concatenation of the two (linear) amplitude arrays into a single object and using the difference of two successive cycles + (which should tend to 0 at convergence) as the *diis* error object. Returns CCSD correction and single and double amplitudes. + +8. **ccsdEnergy(fs, ts, td, eriMOspin, nElectrons)** + + parameters - *fs* is the Fock matrix in the MO spin basis, *ts* and *td* are the singles and doubles amplitudes, *eriMOspin* are the 2-electron + repulsion integrals in the MO spin basis as a (spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals) array. *nElectrons* + is the electron count. Returns the total ccsd energy as float. + +- - - +## LCCD +The linear coupled-cluster doubles are a subset of the CCD equations. Hence there are no T1 amplitudes and the T2 amplitudes are (diagram labelling from Shavitt & Bartlett - Many-Body Methods in Chemistry and Physics Figure 9.2) ++ gabij **\[D1]** ++ P(ab){*f*bc taeij} **\[D2a]** ++ -P(ij){*f*mjtabim} **\[D2b]** ++ 0.5 gabef tefij **\[D2c]** ++ 0.5 gmnijtabmn **\[D2d]** ++ P(ab)P(ij){gmbej taeim} **\[D2e]** ++ 0.25 gmnef tefij tabmn **\[D3a]** ++ P(ij){gmnef taeim tbfjn} **\[D3b]** ++ -0.5P(ij){gmnef tfeim tabnj} **\[D3c]** ++ -0.5P(ab){gmnef taenm tfbij} **\[D3d]** + +For the Linear CCD we use **\[D1], \[D2a], \[D2b], \[D2c], \[D2d] and \[D2e]** + +9. **lccd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence):** + + parameters - *atoms* is an array of atom objects (the molecular atoms), *eigenVectors* are the eigenfunctions for the final Fock matrix, + *charge* the molecular charge, *fock* the final fock matrix, *ERI* the 2-electron repulsion integrals, *iterations* the number + of iterations and *convergence* are for control of the iteration process. Returns the linear coupled cluster doubles energy + (LCCD) also known as coupled electron pair approximation zero (CEPA0). Formula used is [here](https://github.com/bge6/psi4numpy/blob/master/Tutorials/08_CEPA0_and_CCD/8b_CEPA0_and_CCD.ipynb). + +10. **lccdAmplitudes(td, eriMOspin, fockMOspin, nElectrons, spinOrbitals)** + + parameters - *td* the doubles amplitudes, *eriMOspin* are the 2-electron repulsion integrals in the MO spin basis, *fockMOspin* is the fock matrix in the MO spin basis, *nElectrons* is the electron count and *spinOrbitals* the total orbitals in the spin basis. + +11. **ccdEnergy( td, eriMOspin, nElectrons, spinOrbitals)** + + parameters - *td* the doubles amplitudes, *eriMOspin* are the 2-electron repulsion integrals in the MO spin basis, *nElectrons* is the electron count and *spinOrbitals* the total orbitals in the spin basis. +- - - +## CCD +The equations are given above in the LCCD section. + +12. **ccd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence):** + + parameters - *atoms* is an array of atom objects (the molecular atoms), *eigenVectors* are the eigenfunctions for the final Fock matrix, + *charge* the molecular charge, *fock* the final fock matrix, *ERI* the 2-electron repulsion integrals, *iterations* the number of + iterations and *convergence* are for control of the iteration process. Returns the coupled cluster doubles energy (CCD). + Formula used is [here](https://github.com/bge6/psi4numpy/blob/master/Tutorials/08_CEPA0_and_CCD/8b_CEPA0_and_CCD.ipynb). + +13. **ccdAmplitudes(td, eriMOspin, fockMOspin, nElectrons, spinOrbitals)** + + parameters - *td* the doubles amplitudes, *eriMOspin* are the 2-electron repulsion integrals in the MO spin basis, *fockMOspin* is the fock matrix in the MO spin basis, *nElectrons* is the electron count and *spinOrbitals* the total orbitals in the spin basis. + +- - - +## Λ-CCSD +These equations are taken from [Gauss and Stanton J. Chem. Phys., Vol. 103, No. 9, 1 September 1995](http://www2.chemia.uj.edu.pl/~migda/Literatura/pdf/JCP03561.pdf)\ +**Lambda intermediates** ++ Fλae = Fae - 0.5tamFme ++ Fλmi = Fmi + 0.5teiFme ++ Fλme = Fmi + ++ + Fae = *f*ae - tam*f*me + tfm gamef - 0.5 τafmn gmnef ++ + Fmi = *f*mi + tei*f*me + ten gmnie + 0.5 τefin gmnef ++ + Fme = *f*me + tfn gmnef + ++ Wλmnij = Wmnij + 0.25τefijgmnef ++ Wλabef = Wabef + 0.25τabmngmnef ++ Wλmbej = Wmbej - 0.5τfbjngmnef + ++ + Wmnij = gmnij + P(ij){tej gmnie} + 0.5τefij gmnef ++ + Wabef = gabef - P(ab){tbm gamef} + 0.5τabmn gmnef ++ + Wmbej = W(ovvo) = gmbej + tfj gmbef - tbn gmnej - (tfbjn + tfjtbn) gnmfe + ++ Wλmnie = Wmnie ++ Wλamef = Wamef ++ Wλmbij = Wmbij ++ Wλabei = Wabei + ++ + Wmnie = gmnie + tfi gmnfe ++ + Wamef = gamef - tan gnmef ++ + Wmbij = gmbij - Fmetbeij - tbnWmnij + 0.5τefij gmbef + P(ij){tbejn gmnie} + P(ij){tei (gmbej - tbfnj gmnef)} ++ + Wabei = gabei - Fmetabmi + tfiWabef + 0.5τabmn gmnei - P(ab){tafmi gmbef} - P(ab{tam (gmbei - tbfni gmnef)} + +**Three-body Terms** ++ Gae = -0.5tefmnλmnaf ++ Gmi = 0.5tefmnλinef + +**Lambda Equations**\ +**Λ1** (λia) = Fλia + λieFλea - λmaFλim + λmeWλieam + 0.5λimefWλefam - 0.5λmnaeWλiemn - GefWλeifa - GmnWmina\ +**Λ2** (λijab) = gijab - P(ij){λimabF%lambda;jm} + 0.5λmnabWλijmn + 0.5λijefWλefab + P(ij){λieWλejab} - P(ab){λmaWλijmb} + P(ij)P(ab){λimaeWλjebm} + P(ij)P(ab){λiaFλjb} + P(ab){gijaeGbe} - P(ij){gimabGmj } + +**Λ-CCSD Pseudoenergy**\ +Eλ = λiafai + 0.25λijabgabij + +14. **ccsd_lambda(fs, eriMOspin, ts, td, nElectrons, iterations, tolerance)** + + parameters - *fs* is the converged Fock matrix in the molecular spin basis, *eriMOspin* are the electron repulsion integrals in the molecular spin basis, *ts* are the converged single amplitudes from a CCSD computation, *td* are the converged doubles amplitudes from a CCSD computation, *nElectrons* are the number of electrons, *iterations* are the maximum number of cycles and *tolerance* is the criterion for convergence. Returns the Λ-CCSD pseudo-energy, the single and doubles Λ-amplitudes and the intermediates. + +- - - +## CC2 +CC2 is an approximate scheme to CCSD. The T1 amplitudes are the same as CCSD, however the T2 amplitudes are given by <ψabij| **HN** eT1 + **FN** T2|0> = 0\ +where **HN** and **FN** are the normal-ordered Hamiltonian and Fock matrices. **\[ ]** are the coupled-cluster diagram designations. Equations for T-amplitudes taken from reference above (Gauss and Stanton) Table I(a) & (b) and (tilde) intermediates taken from Table III. + +T1 = fai + *F*aetei - *F*mitam + *F*metaeim + +temgamie - 0.5taemngmnie + 0.5tefimgamef ++ fai **\[S1]** ++ *F*aetei ++ + teifae **\[S3a]** ++ + -0.5teitamfme **\[S5a]** ++ + teitfmgamef **\[S5b]** ++ + -tei τafmngmnef ++ + + -0.5tei tafmngmnef **\[S4a]** ++ + + -0.5tei tamtfngmnef **\[S6]** ++ *F*mitam ++ + -tamfmi **\[S3b]** ++ + -0.5tamteifme **\[S5a]** ++ + -tamtengmnie **\[S5c]** ++ + -tam τefingmnef ++ + + -0.5tam tefingmnef **\[S4b]** ++ + + -0.5tam teitfngmnef **\[S6]** ++ *F*metaeim ++ + taeimfme **\[S2a]** ++ + taeimtfngmnef **\[S4c]** ++ temgamie **\[S3c]** ++ -0.5taemngmnie **\[S2c]** ++ 0.5tefimgamef **\[S2b]** + +T2 = gabij + P(ij){taeij(*F*be - 0.5tbn*F*me)} - P(ab){tabim(*F*mj + 0.5tej*F*me)} + 0.5τabmn*W*mnij + 0.5τefij*W*abef + P(ab)P(ij){taeim*W*mbej - teitamgmbej} + P(ij){teigabej} - P(ab){tamgmbij} + +Since only T1 operates on **HN** we can reduce the above equation to\ +T2 = gabij + 0.5τabmn*W*mnij + 0.5τefij*W*abef - P(ab)P(ij)teitamgmbej + P(ij)teigabej - P(ab)tamgmbij ++ gabij **\[D1]** ++ 0.5τabmn*W*mnij = tamtbn*W*mnij ++ + tamtbngmnij **\[D6b]** ++ + tamtbnP(ij){tejgmnie} **\[D8b]** ++ + 0.5tamtbnteitfjgmnef **\[D9]** ++ 0.5τefij*W*abef ++ + teitfjgabef **\[D6a]** ++ + -teitfjP(ab){tbmgamef} **\[D8a]** ++ + 0.5teitfjtamtbngmnef **\[D9]** ++ P(ab)P(ij)teitamgmbej **\[D6c]** ++ P(ij)teigabej **\[D4a]** ++ -P(ab)tamgmbij **\[D4b]** + +Need to add in the T2 operating on **FN** ++ taeijfbe **\[D2a]** ++ -tabimfmj **\[D2b]** + +15. **cc2(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, totalEnergy, diisStatus)** + + parameters - *atoms* is an array of atom objects (the molecular atoms), *eigenVectors* are the eigenfunctions for the final Fock matrix, + charge the molecular charge, *fock* the final fock matrix, *ERI* the 2-electron repulsion integrals, *iterations* the number + of iterations allowed from iteration, *convergence* is the convergence tolerence, *totalEnergy* the final converged energy + (not needed for calculation) and *diisStatus* indicates whether DIIS is to be used (='on') or not (='off'). Returns the CC2 level energy correction and the T1 and T2 amplitudes. + +- - - +## LCCSD +For LCCSD we add in **\[S1], \[S2a], \[S2b], \[S2c], \[S3a], \[S3b] and \[S3c]** single and **\[D4a]** and **\[D4b]** from the LCCD equations. + +16. **lccsd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, diisStatus, SCFenergy)** + + parameters - *atoms* is an array of atom objects (the molecular atoms), *eigenVectors* are the eigenfunctions for the final Fock matrix, + charge the molecular charge, *fock* the final fock matrix, *ERI* the 2-electron repulsion integrals, *iterations* the number + of iterations allowed from iteration, *convergence* is the convergence tolerence, *totalEnergy* the final converged energy + (not needed for calculation) and *diisStatus* indicates whether DIIS is to be used (='on') or not (='off'). Returns the LCCSD level energy correction and the T1 and T2 amplitudes. diff --git a/document/tdhf.md b/document/tdhf.md new file mode 100644 index 0000000..f9bdeb8 --- /dev/null +++ b/document/tdhf.md @@ -0,0 +1,437 @@ +# Time-Dependent Hartree-Fock +This module is based on [Josh Going's blog](https://joshuagoings.com/2017/06/15/magnus/) and [this paper](https://www.researchgate.net/publication/338149703_Numerical_integrators_based_on_the_Magnus_expansion_for_nonlinear_dynamical_systems). The Magnus expansion uses a complex Hamiltonian to propagate forward in time. This implementation calculates the dipole moment at every time step (although other properties could be used) and the resulting dipole variation is plotted. The dipole oscillations can then be transformed to form an absorption spectrum. The routines are + +1. **tdhf(do, run, shape, units ):** + + parameters - *do* is a list of parameters defining the problem as \[ '2' | ,'4' |, 'file\[n]', \['noplot']]. at least '2' or '4' must be specied denoting the magnus order(s) to be computed. If 'file[n]' (n is 2 **or** 4) is specified then the dipole and time values are output to an **npz** file for post-processing. To suppress plotting of results include 'noplot'. This file will be called '--tdhf.npz' with keys p - \[order of Magnus, x units, y units, pulse type, field strength, time step, maximum iterations, polarization], t - the time values, e - the SCF energy, d - the dipole values and f - the field values. *run* is a list of \[time step, maximum iterations, polarization] eg \[0.2, 1000, 'z']. *shape* is a list defining the applied field \[type, strength, rho] eg \['kick', 0.0001] will deliver an impulse of 0.0001 at time t=0 and 0.0000 for t>0, See **pulse** routine for more details. *units* are a list of the units to be used for x and y axes. for x they can be 'fs' or 'atu' and for dipole 'debye' or 'au'. The following subroutines are contained in tdhf. Returns time,SCF energy, dipole and frequency as numpy arrays, if '2' and '4' are specified will return for '4'. + +2. **initialise()** + + parameters - None. Routine does a ground state scf calculation to reset integrals needed for the tdhf process. + +3. **pulse(t, type = 'gaussian')** + + parameters = *t* is the time and *type* is the shape of the initial pulse \['kick' | 'gaussian']. The Gaussian shape is define as exp[-τ2/2ρ2).The default rho (standard deviation of Gaussian) is 0.1, so 1/2ρ2 is 50. A more general Gaussian pulse could be defined by + + fieldStrength * exp(-(t-pulseCenter)*(t-pulseCenter)/(2*pulseWidth*pulseWidth)) * sin(fieldFrequency*t + fieldPhase) + +4. **commutator(a, b)** + + parameters - *a* and *b* are matrices. Returns the commutator bracket of *a* and *b*, that is ab - ba. + +5. **orthoField(t)** + + parameter - *t* is the time. Calculates the field contribution to the Hamiltonian by applying the pulse to the relevant dipole component. Returns the Hamiltonian component due to the dipole field in the orthogonal basis. + +6. **updateFock(density, engine = 'aello')** + + parameters - *density* is the complex density matrix and *engine* is the integral engine to use. The default is to use **tdhfFock** from the aello module, this has been written as this step is time consuming in native mode. Two-electron repulsion integrals are used with the core Hamiltonian to produce a complex Fock matrix. Returns a complex Fock matrix. + +7. **updateState(u, cycleDensity)** + + parameters - *u* is the propagated Hamiltionian and *cycleDensity* is the density used for dipole calculation in this present cycle. Returns orthogonal density and Fock matrices. Calls updateFock. + +8. **updateEnergy(molAtom, molBasis, fock, density)** + + parameters - *molAtom* is am array of atom objects, *molBasis* is an array of basis objects, *fock* is the Fock matrix and *density* the density matrix. Computes the energy for the cycle, calls nuclearRepulsion and returns total scf energy. + +9. **magnus2(h, orthoFock, orthoDensity, density)** + + parameters - *h* is the time step size time -i, *orthoFock* is the initial Fock matrix, *orthoDensity* the initial (ground state) density and *density* is the initial density matrix in the non-orthogonal basis. Routine preforms the Magnus at order 2. The time is propagated using a Hamiltonian based unitary operator e-iHt. The dipole is calculated at each step and the array of those values is returned after the required number of steps has been carried out, along with the field, energy and time arrays. + +10. **magnus4(h, orthoFock, orthoDensity, density)** + + parameters - *h* is the time step size time -i, *orthoFock* is the initial Fock matrix, *orthoDensity* the initial (ground state) density and *density* is the initial density matrix in the non-orthogonal basis. Routine preforms the Magnus at order 4. + +11. **tdhfFile(ft, fe, fd, ff, fs)** + + parameters - *ft* the array of time values, *fe* is an array of SCF energy values, *fd* is an array of dipole vales, *ff* is an array of field values and *fs* is a string which is either '2' or '4' denoting the level of Magnus array values relate to. + + +Plots of the dipole v time are output (see examples later). This is how to run a Magnus 2 writing results to file, with a time step of 0.2 (atu) with 1000 steps in the 'z' direction, with a 'gaussian' pulse of maximum strength 0.0001 giving the results in atomic units. + + tdhf(['2', 'file[2]'], [0.2, 1000, 'z'], ['gaussian', 0.0001, 0.1], ['atu', 'au']) + +The next routines are devoted to a spectral analysis of the dipole results of the Magnus expansions above. Following Josh Goings in McMurchie-Davidson program it uses Pade approximants, details of which can be found [here](https://www.researchgate.net/publication/304667651_Accelerated_Broadband_Spectra_Using_Transition_Dipole_Decomposition_and_Pade_Approximants) and a more general article [here](https://en.wikipedia.org/wiki/Pad%C3%A9_approximant). + +12. **pade(p, q, w)** + + parameters - *p* are coefficients of numerator power series, *q* are coeffiecints of denominator power series and *w* value at which series are to be evaluated at. Routine calculates the Pade table entries via the extended Euclidean algorithm for polynomial greatest common divisor. Returns *p(w)*/*q(w)*. + +13. **toeplitz(type, col, row = 0)** + + parameters - *type* can be 'make', which creates a Toeplitz matrix or 'Ltri' which creates a strictlt lower diagonal Toeplitz matrix. *col* is a list of elements defining the first column of the Toeplitz matrix and *row* (optional) is the first row of the Toeplitz matrix. If *row* is zero then row will equal *col*. A Toeplitz matrix such that Ai,j = Ai+1,j+1 = ai-j [wikipedia](https://en.wikipedia.org/wiki/Toeplitz_matrix). Although Toeplitz matrices may seem esoteric they are closely related to Fourier series. Returns a Toeplitz matrix defined by *col* and *row*. + +14. **solveSpectrum(x, y, options)** + + parameters - *x* and *y* are arrays of horizontal and vertical axes values. *options* are the damping factor, maximum number of points allowed to be processed, limit of horizontal (time) axis, the number of sample points on horizonatal axis, the component of spectrum to be returned from getSpectrum ['r' | 'i' | 'a'] ie either real, imaginary or absolute value and the maximum field strength. This routine makes the data zero based, damps the data, solves the Toeplitz system and calculates the Pade approximant. Remember polynomials become differential operators and vice versa when switching between spatial and Fourier coordinates, and products become convolutions and vice versa. Returns spectrum (x and y). + +15. **getSpectrum(time, dipole, options)** + + parameters - *time*, and *dipole* are arrays and *options* are the options discussed in solveSpectrum above. Routine calls solveSpectrum for dipole and the field seperately. Can return real, imaginary or absolute components as spectrum. For imaginary the absorption spectrum (y) and frequency (x) as arrays are returned. The absorption spectrum is calculated as equation 33 in 'Real-time Time-dependent electronic Structure Theory' - J Goings et al. + +The following runs a spectrum using data saved from a previous Magnus computation... + + data = np.load('h2o-3-21g-tdhf.npz') + + d = data['d'] + t = data['t'] + p = data['p'] + + spec, freq = getSpectrum(t, d, [50.0, 5000, 2.0, 0.0001, 'i', 0.0001]) + +This can be used to plot the spectrum which has been damped by 50.0 (1/(2ρ2)), the energy range is 2.0 * au->eV (27.2114), in 0.0001 intervals. + +We can look at an example using Harpy with McMurchie-Davidson program examples/real-time.py. + +running... + + tdhf(['2', '4'], [0.05, 1000, 'z'], ['gaussian', 0.0001, 0.1], ['atu', 'au']) + +we get ![](../media/h2-tdhf.png) + +then running (with data from saved npz-file)... + + spec, freq = getSpectrum(t, d, [50.0, 5000, 2.0, 0.0001, 'i', 0.0001]) + +we get +![](../media/h2-spectrum.png) + + +Using... + +16. **getPeaks(spectrum, frequency, tolerance)** + + parameters - *spectrum* and *frequency* are the values returned by getSpectrum and *tolerance* is the level below which peaks will be ignored. Returns and array \[nPeaks]. + +Running getPeaks from the data returned by getSpectrum as... + + maxima = getPeaks( spec, freq, 0.1) + + print('There are ', len(maxima), ' peaks') + for i in range(len(maxima)): + print('Peak ',i, 'at energy ', "%0.4f" % maxima[i] + ' eV ' + \ + "%0.4f" % (getConstant('eV[-1]->nm') /maxima[i])) + + +gives... + + There are 2 peaks + Peak 0 at energy 15.5078 eV 79.9497 nm + Peak 1 at energy 46.3927 eV 26.7249 nm + +compared to Gaussian16 LR-TDHF (calculation by Josh Goings see Issue #8 Real Time Magnus - McMurchie-Davidson program)... + + Excitation energies and oscillator strengths: + Excited State 1: Singlet-SGU 15.4997 eV 79.99 nm f=0.6685 =0.000 + 1 -> 2 0.70960 + + Excited State 3: Singlet-SGU 46.4065 eV 26.72 nm f=0.0381 =0.000 + 1 -> 4 0.70804 + +We can run a RPA calculation and we get... +0.361476 (t) 0.569602 (s) 0.945233 (t) 1.175137 (s) 1.462167 (t) 1.705407 (s) +The first singlet is 0.569602 (15.4994 eV) and the third 1.705407 (46.4058 eV). The second singlet has 0 oscillator strength and so no peak. +If you use 4th order Magnus the values are 15.5103 and 46.4084 eV - so results probably good to first decimal place. + +Another example is water in 6-31g basis, this is a NWChem example found [here](https://nwchemgit.github.io/RT-TDDFT.html#Hints_and_Tricks). +The code used was + + import matplotlib.pyplot as plt + plt.grid() + plt.title('Magnus 2 water dipoles') + + eV = getConstant('hartree->eV') + field = 0.0001 + + t, _, dx, f = tdhf(['2', 'noplot'], [0.2, 1000, 'x'], ['kick', field], ['atu', 'au']) + specX, freqX = getSpectrum(t, dx, [50.0, 5000, 1.0, 0.0001, 'i', field]) + + t, _, dy, f = tdhf(['2', 'noplot'], [0.2, 1000, 'y'], ['kick', field], ['atu', 'au']) + specY, freqY = getSpectrum(t, dy, [50.0, 5000, 1.0, 0.0001, 'i', field]) + + t, _, dz, f = tdhf(['2', 'noplot'], [0.2, 1000, 'z'], ['kick', field], ['atu', 'au']) + specZ, freqZ = getSpectrum(t, dz, [50.0, 5000, 1.0, 0.0001, 'i', field]) + + scaling = max(np.max(specX), np.max(specY), np.max(specZ)) + + plt.plot(freqX*eV,specX/scaling,label='x',color='red') + plt.plot(freqY*eV,specY/scaling,label='y',color='blue') + plt.plot(freqZ*eV,specZ/scaling,label='z',color='orange') + + plt.legend(loc=1) + plt.xlabel('Energy (eV)') + plt.ylabel('scaled $\sigma(\omega)$ [arb. units]') + plt.show() + +This uses a 'kick' 0f field 0.0001 at time t=0 and results in the following plot...![](../media/h2o-spectrum.png) + +Here the peaks occur at about 9.3742(x), 11.7742 (z), 13.9484(y), 15.5130(y) and 19.1375(z) eV as calculated by getPeaks, compared to RPA +0.305998 (t) 0.343664 (s) 0.365701 (t) 0.388721 (t) 0.414205 (s) 0.429453 (t) +0.431863 (s) 0.504256 (t) 0.508056 (s) 0.555931 (t) 0.569053 (s) 0.702016 (s) +First singlet at 9.3524, second at 11.2708 (zero strength), third at 11.7524, fourth at 13.8259, fifth at 15.4858 and sixth at 19.1021 eV. + + +17. **TDHFproperties(molAtom, molBasis, charge, c, fock, ERI, method, TDHFdata)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects (the molecular basis), *charge* is the molecular charge, *c* are the orbital eigenvectors, *fock* the final Fock matrix, *ERI* the 2-electron repulsion integrals, *method* is the excitation calculation method currently only 'tamm-dancoff' is supported and *TDHFdata* is the [number of doubley occupied orbitals, number of spatial virtual orbitals, number of roots to be calculated]. Routine has a subroutine **integral(type, molAtom, molBasis, co, cv)** where *type* is one of \['dipole','nabla','angular'], *molAtom* and *molBasis* as defined for main routine, *co* and *cv* are occupied and virtual slices of the eigenvectors. *integral* returns the 3 components of the molecular property requested. 'dipole' and 'nabla' are returned in the *nuclear charge* gauge whilst 'angular' is returned in the *origin* gauge (compatible with psi4). The main routine calls a TDHF-RPA mode to determine the excited state eigenvalues and vectors then for each root requested returns an array of dictionaries, + + 1. The excitation energy + + 2. The electric transition dipole in the length gauge (<ψ0|**μ**|ψi>) is calculated as \ + (2)1/2Σ **μ.**|**X**n> + + 3. The electric oscillator strength in the length gauge calculated as + (2/3) **e**nΣ **μ**ti2, where **μ**ti are the components of the length transition dipole. + + 4. The electric transition dipole in the velocity gauge (<ψ0|**∇**|ψi>) is calculated as \ + (2)1/2Σ **ψ.**|**X**n> + + 5. The electric oscillator strength in the velocity gauge calculated as + (2/3**e**n)Σ **ψ**ti2, where **ψ**ti are the components of the velocity transition dipole. + + 6. The magnetic transition dipole (length gauge) (<ψ0|**ω**|ψi>) is calculated as + (1/2)1/2**ω.**|**X**n> \ + If not in Tamm-Dancoff the eigenvector should be the left-eigenvector). + + 7. The rotatory strength in the length gauge is calculated as + Σ **μ**ti**ω**ti where **ω**ti are the components of the magnetic transition dipole + + 8. The rotatory strength in the velocity gauge is calculated as + -Σ **∇**ti**ω**ti where **ω**ti/ **e**n + + The results are returned as a list of dictionaries, one dictionary for each root. Note wavefunction is determined only up to factor of phase so sign may be undetermined. We (and psi4) defines length-gauge dipole integral to include the electron charge (-1.0). + +Here are the comparisons with psi4 for water sto-3g in the Tamm-Dancoff approximation + +1st singlet state **0.356462** (psi4)    **0.356462** (harpy) +| | x | y | z | | x | y | z | +|--------------------------------|-----------------|---------------|------------|-|--------------|----------|----------| +| electric transition dipole (L) | 0.000000 | 0.000000 | 0.099258 | | 0.000000 | 0.000000 |0.099258 | +| electric transition dipole (V) | 0.000000 | 0.000000 | 0.130522 | | 0.000000 | 0.000000 | 0.130522 | +| magnetic transition dipole (L) | -0.302303 | 0.000000 | 0.000000 | | -0.302303 | 0.000000 | 0.000000 | + +| | | | | +|------------------------|--------------|-|----------| +| oscillator strength (L)| 0.002341 | | 0.002341 | +| oscillator strength (V)| 0.031861 | | 0.031861 | + +3rd singlet state **0.505628** (psi4)    **0.505628** (harpy) +| | x | y | z | | x | y | z | +|--------------------------------|-----------------|---------------|------------|-|------------|-----------|----------| +| electric transition dipole (L) | 0.000000 | 0.438875 | 0.000000 | | 0.000000 | 0.438874 |0.000000 | +| electric transition dipole (V) | 0.000000 | 0.273548 | 0.000000 | | 0.000000 | -0.273549 | 0.000000 | +| magnetic transition dipole (L) | 0.000000 | 0.000000 | 0.000000 | | 0.000000 | 0.000000 | 0.000000 | + +| | | | | +|------------------------|--------------|-|----------| +| oscillator strength (L)| 0.064926 | | 0.064926 | +| oscillator strength (V)| 0.098661 | | 0.098661 | + +To test the rotatory strengths used psi4 (S)-methyloxirane in sto-3g from [this reference](https://tinyurl.com/tddft-psicon2020) +1st singlet **0.381675** (psi4)    **0.381675** (harpy) +| | | | | +|-----------------------|-------------|-|-----------| +| rotatary strength (L) | 0.004605 | | 0.004605 | +| rotatory strength (V) | 0.001749 | | 0.001748 | + +This is an example of how to run a TDHF calculation. Put this in a file and run from harpy/source... +```python +from basis import electronCount +from tdhf import TDHFproperties +import rhf + +#run harpy and get run parameters and integrals +molAtom, molBasis, molData = rhf.mol([]) +rhf.scf(molAtom, molBasis, molData,[]) + +charge = molData['charge'] + +#metrics for TDHF +nOccupied = electronCount(molAtom, charge)//2 +nVirtual = len(molBasis) - nOccupied +roots = 3 +data = [nOccupied, nVirtual, roots] + +#get residues in Tamm-Dancoff Approximation +residues = TDHFproperties(molAtom, molBasis, charge, rhf.C, rhf.fock, rhf.ERI, 'tamm-dancoff', data) + +print('TDHF residues for ', molData['name'], ' in the basis ', molData['basis']) +print('excitation oscillator strengths (L,V)') +print('----------------------------------------') +for r in residues: + print(" {:f} {:f} {:f}".format(r['excitation energy'], \ + r['oscillator strength (length gauge)'], \ + r['oscillator strength (velocity gauge)'])) +``` +18. **TDHFspectrum(spectrum)** + + parameters - *spectrum* is a dictionary with the following keys: *data* - an array of dictionaries of residue results as returned by **TDHFproperties**, *units* - units to used in output either '**nm**' or 'ev', *type* the kind of spectrum to draw either '**opa**' for one-photon absorption or 'ecd' for electronic circular dichroism, *points* are the number of x-axis points to plot (**5000**), *shape* is the type of broadening to be used, either '**gaussian**' for inhomegenous broadening or 'lorentzian' for homegenous broadening and *gamma* is the broadening factor (**0.02**). Defaults are in bold. + There are 2 contained subroutines + + **profile(p, d = None, mode = 'wave')** + parameters - *p* is the on which the lineshape is centered, poles, *d* is the domain of the profile and *mode* is either 'wave' where routine returns the lineshape or 'max' which returns the maximum of the band. + + **prefactor()** + parameters - None. This routine computes the numerical factor of the expressions for opa and edc. The prefactor is computed in SI units and then adjusted for the fact that atomic units are used to express microscopic observables: excitation energies and transition dipole moments. The refractive index *n* is, in general, frequency-dependent. We assume it to be constant and equal to 1. *NA* is Avagadro constant, *c* the speed of light, *ħ* is reduced Planck constant, *e0* is the electric constant. + + for absorption need conversion au->Ccm (Coulomb centimeters) \ + *elementary charge x bohr radius x 1000*. (1000 is m->cm) + + prefactor calculated as \ + (4.π.2*NA*/(3.1000.ln(10).(4.π.*e0*).*ħ*,*c*)).(C->cm)2 \ + + + for circular dichroism also need conversion au-> JT-1 (Joules inverse Tesla) \ + 2.μB.1000*, where μB is the Bohr magnetron. + + **the results are given in litres per molecule per centimetre** + + The main routine returns a dictionary with keys *x* - the x-axis convolution, *y* - the y-axis convolution, *poles* the x-axis bar values and *bars* the heights of the residues. + + For water in STO-3G and TDA regime (units = 'nm', gamma = '0.02') the comparison results from psi4 via the jupyter notebook referenced earlier are, giving values for just the first singlet harpy(psi4)... + + | OPA | gaussian | lorentzian | + |--------------|------------------|-------------| + | x convolution | 57.8701 (57.8701) | | + | y convolution | 5.366e-03 (5.366e-03) 1 | 824.5057 (824.5071) | + | poles | 127.8212 (127.8211) | | + | bars | 9.7079e-01 (9.7078e-01) | 7.7458e-01 (7.7457e-01) | + + 1 this is the 5th singlet (1st was 0). eV results also checked and found to be in same sort of agreement. + + To check ECD I've used the (S)-methyloxirane example in the jupyter notebook with STO-3G. + + | ECD | gaussian | lorentzian | + |--------------|------------------|-------------| + | x convolution | 73.0109 (73.0110) | | + | y convolution | -8.2248e-06 (-8.2322e-06) | -0.5623 (-0.5627) | + | poles | 119.3774 (119.3773) | | + | bars | 1.4393 (1.4391) | 1.1484 (1.1483) | + +Run the following code (from source directory for eg (S)-methyloxirane) +```python +from basis import electronCount +from tdhf import TDHFproperties +import rhf + +#run harpy and get run parameters and integrals +molAtom, molBasis, molData = rhf.mol([]) +rhf.scf(molAtom, molBasis, molData,[]) + +charge = molData['charge'] + +#metrics for TDHF +nOccupied = electronCount(molAtom, charge)//2 +nVirtual = len(molBasis) - nOccupied +roots = 5 +data = [nOccupied, nVirtual, roots] + +#get residues in Tamm-Dancoff Approximation +residues = TDHFproperties(molAtom, molBasis, charge, rhf.C, rhf.fock, rhf.ERI, 'tamm-dancoff', data) + +#get spectrum data +from tdhf import TDHFspectrum + +dict = {'data' : residues, 'units' : 'nm', 'type' : 'opa', 'points' : 5000, 'shape' : 'gaussian', 'gamma' : 0.02} +spectrum = TDHFspectrum(dict) + +import matplotlib.pyplot as plt +fig, ax = plt.subplots() + +ax.set_xlabel('\u03BB [nm]') +if dict['type'] == 'opa': ax.set_ylabel('\u03B5 [L $mol^{-1}$ $cm^{-1}$') +elif dict['type'] == 'ecd': ax.set_ylabel('\u0394\u03B5 [L $mol^{-1}$ $cm^{-1}$') +plt.grid() +plt.title('(S)-methyloxirane - Gaussian') + +ax.bar(spectrum['poles'], spectrum['bars'], width=0.5, color='k') +ax.plot(spectrum['x'], spectrum['y'], color='orange') + +plt.show() +``` +this will produce either of the following plots... + +![](../media/opa-ecd.png) + +- - - +### TD-CCSD +This follows [Linear Absorption Spectra from Explicitly Time-Dependent Equation-of-Motion Coupled-Cluster Theory- Nascimento & DePrince](https://pubs.acs.org/doi/full/10.1021/acs.jctc.6b00796). The dipole is propogated in time using a 4th-order Runge-Kutta algorithm. We have propagated the right-hand amplitudes of the dipole (autocorrelation) function which are given by\ +*m*0 = μii\ +*m*ai = μia\ +*m*abij = 0.0 + +The left-hand amplitudes are\ +**m**0 = μii + μiaλia\ +**m**ai = μii + μabλib - (μijλja - μjjλia) + μjbλijab\ +**m**abij = μjbλia + μkkλijab + P(ab){ μacλijcb} - P(ij){ μikλkjab} + +The time derivatives of the *m*-amplitudes are\ +d/dt[*m*0] = *m*aiFaisub> + 0.25*m*abijgijab [24]\ +d/dt[*m*ai] = *m*biFab - *m*bjFij + *m*bjWjabi + *m*abijFjb - 0.5*m*abjkWjkib + 0.5*m*bcsup>ijWajbc [25]\ +d/dt[*m*abij] = P(ab){*m*bmWmaij} + P(ij){(*m*enWmnie)tabjm} - P(ij){*m*ejWabei} - P(ab){(*m*fmWamef)tbeij} + P(ij){*m*abmjFmi} + P(ij){(0.5*m*efingmnef)tabjm} + P(ab){*m*aeijFbe} + P(ij){(0.5*m*afmngmnef)tbeij} + P(ij)P(ab){*m*aemjWmbei} + 0.5*m*abmnWmnij + 0.5*m*efijWabef + +The intermediates F and W are given in cc.md. *t* are the ccsd-singles and doubles amplitudes and *λ* are the Λ-ccsd singles and doubles amplitudes. μ are the dipoles in the MO spin basis. The auto-correlation function is evaluated at each step as\ +fac = **m**0*m*0 + **m**ai*m*ai + 0.25**m**abij*m*abij + +19. **td_ccsd(molAtom, molBasis, ts, td, ls, ld, ims, fockMOspin, eriMOspin, run, metrics)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects (the molecular basis), *charge* is the molecular charge, *ts* and *td* are the converged CCSD singles and doubles amplitudes, *ls* and *ld* are the converged Λ-CCSD singles and doubles amplitudes, *fockMOspin* the final Fock matrix in the molecular spin basis, *eriMOspin* the 2-electron repulsion integrals in the molecular spin basis and *run* are the parameters for the calculation ie [time_step, step count, polarization]. The *metrics* are [number of spin orbitals, number of electrons]. Returns [time] , [dipole] lists. + +The following code is an example of using Λ-CCSD with harpy (it was used to generate a dipole plot for H2 in 3-21g basis as a test against psi4). +```python +import rhf +from integral import buildFockMOspin, buildEriMO, buildEriDoubleBar +from cc.scc import ccsd_lambda +from basis import electronCount +import numpy as np + +from tdhf import td_ccsd +if __name__ == '__main__': + + #do a reference scf calculation + atoms, basis, data = rhf.mol([]) + eSCF = rhf.scf(atoms, basis, data,[]) + + charge, iterations, tolerance, diis, gauge = data['charge'], data['cycles'], 1e-10, data['diis'], data['gauge'] + + #get t amplitudes from ccsd calculation + from cc.scc import ccsd + eCCSD, ts, td = ccsd(atoms, rhf.C, charge, rhf.fock, rhf.ERI, iterations, tolerance, eSCF, diis) + + #metrics + spinOrbitals = rhf.C.shape[0] * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, rhf.C, rhf.fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(rhf.C, rhf.ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #calculate lambda amlplitudes and pseudoenergy + eLCCSD, ls, ld, ims = ccsd_lambda(fockMOspin, eriMOspin, ts, td, nElectrons, iterations, tolerance) + + print("SCF energy {:>12f} Hartree".format(eSCF)) + print("CCSD energy {:>12f} Hartree".format(eCCSD)) + print('\u039B-CCSD energy' "{:>12f} Hartree".format(eLCCSD)) + + #Time-dependent CCSD + polarization = 'z' + time, dipoles = td_ccsd(atoms, basis, ts, td, ls, ld, ims, fockMOspin, eriMOspin, [0.05, 1000, polarization], [spinOrbitals, nElectrons]) + + import matplotlib.pyplot as plt + from atom import getConstant + plt.grid() + plt.title('TD-EOM-CCSD harpy comparision') + plt.plot(np.array(time) * getConstant('atu->femtosecond'),np.array(dipoles).real * getConstant('au->debye') ,label=u"\u211D",color='red', lw=0.7) + plt.plot(np.array(time) * getConstant('atu->femtosecond'),np.array(dipoles).imag * getConstant('au->debye') ,label=u"\U0001D540",color='blue',lw=0.7) + plt.legend(loc=1) + plt.xlabel('time (fs)') + plt.ylabel('dipole (Debye)') + plt.show() +``` +The comparison plots for harpy and psi4 are shown below. + +![td-eom-ccsd](https://user-images.githubusercontent.com/73105740/120072199-7cfe6a00-c08a-11eb-8068-e071041ce90c.png) diff --git a/document/ucc.md b/document/ucc.md new file mode 100644 index 0000000..8fe5490 --- /dev/null +++ b/document/ucc.md @@ -0,0 +1,60 @@ +### Unitary Coupled-Cluster + +This module implements ucc2, ucc3 and excited state ucc2. These are unitary coupled-cluster methods. + +1. **class unitaryCoupledCluster(object)** + + The initiator takes the arguments (fs, gs, e, data) where *fs* is the MO spin Fock matrix, *gs* are the MO spin two electron repusion integrals, *e* are the AO basis orbital energies and *data* is a dictionary {'method':.., 'electrons':.., 'cycle_limit'.., 'precision':.., 'verbose':.., 'roots:...'} supplied to the class by the caller. *method* is the unitary coupled-cluster method, *electrons* are the number of electrons, *cycle_limit* is the maximum number of iterations allowed, *precision* is the number of decimal places to converge to, *verbose* is a boolean flag - if True information on each cycle will be printed and *roots* are the number of roots to be returned if excited-state is selected. \ +The available *method*s are 'ucc2', 'ucc3', 'ucc2-s-ee', 'ucc2-ee' and 'ucc(4). +On exit the class has instance variables *ss* the singles amplitudes, *sd* the doubles amplitudes, *converged* a boolean flag (which should be checked on exit) +indicating a successful convergence of the iterations and 'energy'. *ss* is of dimension [o,v], *sd* is of dimension [o,o,v,v]. *energy* is a dictionary with keys + + 'cc' - unitary coupled-cluster correction + + 'eHF' - Hartree-Fock electronic energy + + 'mp2' - Moller-Plesset 2 energy + + 'nuclear' - nuclear repulsion energy (user added see example code) + + In the ucc2 method the singles and doubles de-coupled with the doubles being formally equivalent to linear ccd. ucc2-ee is the excited state version of ucc2 using converged ss and sd amplitudes. ucc2-s-ee is the 'strict' version of ucc2-ee using td amplitudes and is equivalent to adc(2). + + + There are eight routines \ + *initialise_amplitudes(self)* - sets td,ss and sd initial values and computes d-tensors (inverses). Computes HF energy. \ + *update_amplitudes(self, iterative=True)* - generate next guess of the amplitudes. \ + *cluster_energy(self)* - compute the cluster correction energy. \ + *iterator(self, func)* - the main iteration loop, amplitude update function passed as arguement. + *excitations(self)* - secular equations for ucc2 + + This is an example of the use of the classes. +if __name__ == '__main__': + + #do an SCF computation + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri = [rhf.fock, rhf.C, rhf.e, rhf.ERI] + + #get fock and eri in molecular spin basis from spinMO class + mo = spinMO(e, eri, c, f) + gs = mo.gs + fs = mo.fs + + data = {'method':'ucc2-s-ee', 'electrons':electrons, 'cycle_limit': 50, 'precision':1e-10, 'verbose':True, 'roots':5} + cc = unitaryCoupledCluster(fs, gs, e, data) + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + + print(cc.energy) + +The results for the methods are (Crawford geometry STO-3G) +{'ucc2': -0.07192916403651912, 'mp2': -0.049149636689279796, 'eHF': -82.94444701585147, 'nuclear': 8.00236706181077} +{'ucc3': -0.07011956942398256, 'mp2': -0.049149636689279796, 'eHF': -82.94444701585147, 'nuclear': 8.00236706181077} + +[0.28550929 0.28550929 0.28550929 0.34391619 0.37229159] +{'ucc2-s-ee': -0.07192916403651912, 'mp2': -0.049149636689279796, 'eHF': -82.94444701585147, 'nuclear': 8.00236706181077} +{'ucc(4)': -0.07054260489227335, 'mp2': -0.049149636689279796, 'eHF': -82.94444701585147, 'nuclear': 8.00236706181077} + +The ucc2 and ucc3 methods are taken from [Hodecker](https://core.ac.uk/download/pdf/322693292.pdf) and ucc(4) from [Rodney J.Bartlett, Stanislaw A.Kucharski & Jozef Noga](https://www.sciencedirect.com/science/article/abs/pii/S0009261489873725). +] \ No newline at end of file diff --git a/document/uhf.md b/document/uhf.md new file mode 100644 index 0000000..407fb75 --- /dev/null +++ b/document/uhf.md @@ -0,0 +1,54 @@ +# Unrestricted Hartree-Fock Module - SCF calculations + +A discussion of the algorithm can be found in eg [here](https://www2.chemistry.msu.edu/faculty/harrison/web_docs_Hartree_Fock/HF3.pdf). You will need from numpy - sqrt, zeros, dot and vdot from numpy.linalg - fractional_matrix_power, eigh, from math - pow. All functions are imported from their modules explicitly so you can see where they come from. This uses **mol** from rhf to read input file and process defaults. + +1. **buildUnrestrictedFock(H, eri, cycle, density)** + + parameters - *H* the core Hamiltonian, *eri* the 2-electron repulsion integrals, *cycle* the current SCF iteration, *density* are the alpha and beta spin density matrices in format (2, nBasis, nBasis). Returns an alpha and beta spin Fock matrices in same format as density. If cycle is 0 then both matrices are returned as the core Hamiltonian. + +2. **buildUnrestrictedDensity(c, orbitals)** + + parameters - *c* are the alpha and beta spin Fock eigenvectors in format (2, nBasis, nBasis), *orbitals* are the α and β occupancy numbers. Returns the spin density matrices. + +3. **rmsDensity(density, preDensity)** + + parameters - *density*, *preDensity* two consecutive cycles of a density matrix. Returns square root of the square of the difference of the two matrices. + + +4. **rebuildCenters(molAtom, molBasis, geo)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects and *geo* is an array of cartesian coordinates. This routine is used to copy a new coordinate set represented by geo into molAtom and molBasis .center attributes. Returns the rebuilt object arrays which can then be used as arguements for scf to calculate an energy for a changed geometry. + +5. **scf(molAtom, molBasis, run, show)** + + parameters - *molAtom* is an array of atom objects, *molBasis* is an array of basis objects, *run* are the parameters that define the scf, *show* are the output sections to be displayed. If show selects *postSCF* the following are displayed + spin matrix, spin contamination, total density Pa + Pb, spin density Pa - Pb, and if post={ch,di} is in the project file then a Mulliken population analysis and dipole calculation are performed. There is a 'uhfmix' parameter that can be included in the .hpf molecule definition, by default this is set to 0.0 so closed shell uhf computations default to rhf. In, for example, the H2 dissociation example the mixing parameter is set to 0.02 which results in a mixing of the humo and lumo on the alpha orbitals. + + Returns total energy and total density is global. + +6. **getOccupancy(e, orbitals, nBasis)** + + parameters - *e* are the orbital energies, *orbitals* are the number of α and β orbitals and *nBasis* is the number of basis functions. Returns occupancy vectors. + +7. **spinSquare(c, occupancy, S)** + + parameters - *c* are the molecular eigenvectors shape is (2, nBasis, nBasis), *occupancy* are the alpha and beta occupancies and *S* is the overlap integrals. Returns 2> and the multiplicity 2\*S + 1. + +H2O in 6-31G basis - charge -1, multiplicity 2. Comparison with pyscf. + +| energy | source | +|---------|-------| +|-75.801683 | harpy | +| -75.801683 | pyscf | + +mulliken population + +| O1 | H1 | H2 | description | +|-----------|----| ------|---------------| +|-0.714275 | -0.142862 | -0.142862 | harpy charge | +| -0.12926 | 0.56463 | 0.56463 | harpy spin | +| -0.71428 | -0.14286 | -0.14286 | pyscf charge | +| -0.12926 | 0.56463 | 0.56463 | pyscf spin | + +total spin is 0.771032 +multiplicity is 2.021 \ No newline at end of file diff --git a/document/view.md b/document/view.md new file mode 100644 index 0000000..860ccb6 --- /dev/null +++ b/document/view.md @@ -0,0 +1,179 @@ +# View Module - output results to HTML file + +Theres nothing really interesting here. Results are passed from the computational algorithms to this module for formatting into an HTML file suitable for viewing in a browser. Each run is written to a harpy.html which unless saved elsewhere will be overwritten on each run, the file will be created if doesn't exist. + +1. **pre(name, atoms, type)** + + parameters - *name* is the molecule name as read for the project file and *type* is the level of the calculation 'rhf' or 'uhf'. This function must be called as it writes essential HTML to the output file. + +2. **geometry(atoms)** + + parameters - *atoms* is an array of atom objects (the molecular atom set). Outputs + + the number ao atoms, + the atomic input data, + the bond lengths, + the bond angles, + the out-of-plane angles, + the dihedral angles, + the center of mass, + the connection matrix, + the inertia tensor, + the principal moments of inertia, + the rotor type, + the rotational constants, + the nuclear repulsion energy. + +3. **orbitals(atoms, charge, name, bases)** + + parameters - *atoms* is an array of atom objects (the molecular atom set), *charge* the molecular charge, *name* is name of the basis and *bases* is an array of basis objects (the molecular basis). Outputs + + the number of electrons, + the name of basis, + the information from the basis exchange file about the basis, + the orbital information - number of orbitals, occupied orbitals, virtual orbitals, + the list of orbitals with their atom centers and momenta, + the aufbau occupancy of the atoms in the molecule, + +4. **uhfOrbitals(alpha, beta, multiplicity)** + + parameters - *alpha* and *beta* are the number of alpha spin and beta spin electrons. *multiplicity* is the multiplicity of the molecule. Outputs + + the number of alpha spin electrons/orbitals, + the number of beta spin electrons/orbitals, + the multiplicity. + +5. **preSCF(S,K,J,ERI,U, FO, D, IE, guess)** + + parameters - *S* is the overlap matrix, *K* is the exchange matrix, *J* is the coulomb matrix, *ERI* are the 2-electron repulsion integrals, *U* is the orthogonal transform matrix, *F0* is the initial Fock guess, *D* is the initial density matrix, *IE* is the initial electronic energy and guess is either 'core' or 'gwh' for the type of initial Fock used. Outputs + + the initial guess type, + the overlap matrix, + the exchange matrix, + the coulomb matrix, + the 2-electron repulsion integrals, + the orthogonal transform matrix, + the initial orthogonal Fock matrix, + the initial density matrix, + the initial electronic energy. + +6. **SCF(e, de, dd, cycle, diis, iterations, convergence)** + + parameters - *e* the current electronic energy, *de* delta energy during the SCF cycle, *dd* rms delta density during the SCF cycle, *cycle* the current iteration, *diis* whether diis is being employed, *iterations* is the maximum number of iterations allowed and *convergence* is the convergence threshold. Outputs + the maximum allowed iterations, convergence threshold and diis status, for each cycle delta energy, rms delta density, electronic energy and iteration number. + +7. **postSCF(data, type)** + + parameters - *data* a list of values, *type* an identifier for the 'data' list. Outputs... + + 'eigen' - number of cycles convergence took, final total energy and the orbital + energies, the final eigenvectors and the final density matrix, + 'uhf-post' - spin statistics for UHF + 'uhf-mull' - Mulliken population and spin analysis, + 'mulliken' - the Mulliken charge analysis, + 'lowdin' - the Lowdin charge analysis, + 'bonds' - Mayer bond orders and valency, + 'energy' - analysis of the energy partitioning, + 'dipole' - components and resultant of the dipole, + 'mp2-dipole' - components of the mp2 level dipole momemnt. + 'quad' - components, amplitude and asymmetry of quadrupole. + 'mp' - moller-plesset 2nd and 3rd order corrections, + 'omp' - orbital optimised moller-plesset 2, + 'mplp' - Laplace transform mp2, + 'mbpt' - many-body perturbation theory, + 'ci' and 'rpa' - configuation interaction and random phase approximation, + 'fci' - full configuration interaction, + 'cisd' - configuration interaction singles and doubles, + 'cis' - configuration interaction singles + 'cisas' and 'cisat' - spin-adapted configuration interaction, + 'ju' - CI energy level contributions and significant jumps, + 'bd' - block Davidson - 1st five eigenvalues, + 'ccsd' - coupled-cluster singles and doubles, + 'ccsd(t)' - coupled-cluster singles and doubles perturbative triples, + 'lccd' - linear coupled-cluster doubles, + 'ccd' - coupled-cluster doubles, + 'cc2' - coupled-cluster 2 approximation, + '+c' - fast coupled-cluster + 'fa' - intra-molecular forces on atom - analytic, + 'fn' - intra-molecular forces on atom - numeric, + 'ep' - electron propagator (2)(spatial), + 'eps' - electron propagator (2)(spin), + 'ep3' - electron propagator (3)(spin), + 'gfa' - approximate Green's function correction + 'po' - polarizabilities + 'hyper' - hyperpolarizabilities + 'resp' - restrained electrostatic potential charges + 'eom' - equation of motion ccsd and mbpt + 'cogus' - Cluster Operator Genrator Using Sympy + +8. **post(exit = True)** + + parameters - *exit* if not true will write error messages else complete HTML script and close output file. Must be called as last output function. + +9. **showMatrix(title, matrix, f, precision = '%.4f')** + + parameters - *title* is caption for HTML table, *matrix* the values to be displayed in table form, *f* is the output file and *precision* is the format of the displayed numbers. + +10. **matrixHeatPlot(a, title = '')** + + parameter - *a* is a 2-dimensional matrix and *title* is a title for the plot. Displays a heatplot of the matrix. + +We can run this as eg +```python + #do ccsd computation + _, ts, _ = cc.ccsd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF, 'on') + + maxAmplitudes = eom.maximumAmplitudes(ts, 5, 0) + print(maxAmplitude) + + import view + view.matrixHeatPlot(eomEVec, 'eom-mbpt2') + +``` +to give +``` +['0.021778 (7, 11)', '0.021778 (6, 10)', '0.00329 (2, 10)', '0.00329 (3, 11)', '-0.002501 (5, 13)'] +``` +10. **matrixHeatPlot(a, title = '')** + + parameter - *a* is a 2-dimensional matrix and *title* is a title for the plot. Displays a heatplot of the matrix with values normalised to inteval \[0,1]. + +We can run this as eg +```python + #do ccsd computation + _, ts, _ = cc.ccsd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF, 'on') + + maxAmplitudes = eom.maximumAmplitudes(ts, 5, 0) + print(maxAmplitude) + + import view + view.matrixHeatPlot(eomEVec, 'eom-mbpt2') + +``` +to give +``` +['0.021778 (7, 11)', '0.021778 (6, 10)', '0.00329 (2, 10)', '0.00329 (3, 11)', '-0.002501 (5, 13)'] +``` +![image](https://user-images.githubusercontent.com/73105740/120977873-bf4f3780-c76b-11eb-979e-37652bd60b80.png) + +11. **evaluateGaussian(iBasis, x ,y , plane, z, normal)** + + parameters - *iBasis* is a basis object, *x* and *y* are coordinates in the plane in which the Gaussian is to be evaluated, *plane* is 'xy'|'yz'|'zx' which defines the plane, *z* is the distance from the plane at which to evaluate Gaussian, *normal* is a boolean flag - if True Gaussian will be normalised. Returns the Gaussian density at point (x,y,z) (or y,z,x or z,x,y depending on *plane*). + +12. **plotGaussianOverlap(iBasis, jBasis, plane, z, extent, grid, atoms, options = \[False, 20])** + + parameters - *iBasis* and *jBasis* are basis objects, *plane* is 'xy'|'yz'|'zx' - the plane in which to display contour, *z* distance (bohr) above (+) or below (-) plane in which to draw contour, *extent* is a list of maximum and minimum extents of the area to be contoured, *grid* is the mesh size of the grid, *atoms* are the molecular atom objects, *options* are a list \[normalise, number of contours]. Plots a contour of the overlap between orbitals iBasis and jBasis. If jBasis is *None* singlem orbital is plotted. + +13. **plotMO(C, orbital, plane, z, extent, grid, atoms, bases, options = \[True, 60, 1e-8])** + + parameters - *C* are the eigenvectors from a converged SCF calculation, *orbital* is the number of the orbital to plot (0,1,...), *plane* is 'xy'|'yz'|'zx' - the plane in which to display contour, *z* distance (bohr) above (+) or below (-) plane in which to draw contour, *extent* is a list of maximum and minimum extents of the area to be contoured, *grid* is the mesh size of the grid, *atoms* are the molecular atom objects, *bases* is the molecular basis and *options* is a list \[normalise, number of contour lines, reject absolute values below this]. Plots a contour of the molecular orbital. + +For water in STO-3g (in xy-plane) we can run +```python + graphic.plotGaussianOverlap(molBasis[3], None,'xy', 0, [-4, 4,-4, 4], 100, molAtom, [False, 20]) + graphic.plotGaussianOverlap(molBasis[2], molBasis[6],'xy', 0, [-4, 4,-4, 4], 100, molAtom, [False, 20]) + graphic.plotMO(rhf.C, 5, 'xy', 0, [-5,5,-5,5],100, molAtom, molBasis, [False, 60, 1e-6]) +``` +![image](https://user-images.githubusercontent.com/73105740/120989336-58378000-c777-11eb-9143-dca37f19a3da.png) ![image](https://user-images.githubusercontent.com/73105740/120988845-d8111a80-c776-11eb-9dd3-7e7ba9a37b03.png) ![image](https://user-images.githubusercontent.com/73105740/120989996-07745700-c778-11eb-8e76-04690c0e4c25.png) + + diff --git a/media/aello.jpeg b/media/aello.jpeg new file mode 100644 index 0000000..44d6013 Binary files /dev/null and b/media/aello.jpeg differ diff --git a/media/ch3coh.png b/media/ch3coh.png new file mode 100644 index 0000000..4c5e186 Binary files /dev/null and b/media/ch3coh.png differ diff --git a/media/h2-dissociation.png b/media/h2-dissociation.png new file mode 100644 index 0000000..278fd6b Binary files /dev/null and b/media/h2-dissociation.png differ diff --git a/media/h2-spectrum.png b/media/h2-spectrum.png new file mode 100644 index 0000000..4d7115a Binary files /dev/null and b/media/h2-spectrum.png differ diff --git a/media/h2-sto-3g.png b/media/h2-sto-3g.png new file mode 100644 index 0000000..f84ca45 Binary files /dev/null and b/media/h2-sto-3g.png differ diff --git a/media/h2-tdhf.png b/media/h2-tdhf.png new file mode 100644 index 0000000..c2b1b57 Binary files /dev/null and b/media/h2-tdhf.png differ diff --git a/media/h2o-shell.png b/media/h2o-shell.png new file mode 100644 index 0000000..15c2fc3 Binary files /dev/null and b/media/h2o-shell.png differ diff --git a/media/h2o-spectrum.png b/media/h2o-spectrum.png new file mode 100644 index 0000000..08b9b3f Binary files /dev/null and b/media/h2o-spectrum.png differ diff --git a/media/h2o-sto-3g-a.png b/media/h2o-sto-3g-a.png new file mode 100644 index 0000000..d015e26 Binary files /dev/null and b/media/h2o-sto-3g-a.png differ diff --git a/media/h2o-sto-3g.png b/media/h2o-sto-3g.png new file mode 100644 index 0000000..f86af4d Binary files /dev/null and b/media/h2o-sto-3g.png differ diff --git a/media/hugenholtz.png b/media/hugenholtz.png new file mode 100644 index 0000000..1f557a3 Binary files /dev/null and b/media/hugenholtz.png differ diff --git a/media/nh3-vacf-bend.png b/media/nh3-vacf-bend.png new file mode 100644 index 0000000..46e4865 Binary files /dev/null and b/media/nh3-vacf-bend.png differ diff --git a/media/nh3-vacf-bond.png b/media/nh3-vacf-bond.png new file mode 100644 index 0000000..0208726 Binary files /dev/null and b/media/nh3-vacf-bond.png differ diff --git a/media/opa-ecd.png b/media/opa-ecd.png new file mode 100644 index 0000000..fd2839d Binary files /dev/null and b/media/opa-ecd.png differ diff --git a/media/order3.png b/media/order3.png new file mode 100644 index 0000000..f8b1ac6 Binary files /dev/null and b/media/order3.png differ diff --git a/mints/acetaldehyde-sto-3g-mints.npz b/mints/acetaldehyde-sto-3g-mints.npz new file mode 100644 index 0000000..a240ba0 Binary files /dev/null and b/mints/acetaldehyde-sto-3g-mints.npz differ diff --git a/mints/ch4-sto-3g-mints.npz b/mints/ch4-sto-3g-mints.npz new file mode 100644 index 0000000..4773aa5 Binary files /dev/null and b/mints/ch4-sto-3g-mints.npz differ diff --git a/mints/h2o-3-21g-mints.npz b/mints/h2o-3-21g-mints.npz new file mode 100644 index 0000000..c0f8a2f Binary files /dev/null and b/mints/h2o-3-21g-mints.npz differ diff --git a/mints/h2o-6-31g-mints.npz b/mints/h2o-6-31g-mints.npz new file mode 100644 index 0000000..54931c7 Binary files /dev/null and b/mints/h2o-6-31g-mints.npz differ diff --git a/mints/h2o-aug-cc-pvdz-mints.npz b/mints/h2o-aug-cc-pvdz-mints.npz new file mode 100644 index 0000000..cd0e27a Binary files /dev/null and b/mints/h2o-aug-cc-pvdz-mints.npz differ diff --git a/mints/h2o-cc-pvdz-mints.npz b/mints/h2o-cc-pvdz-mints.npz new file mode 100644 index 0000000..30cc295 Binary files /dev/null and b/mints/h2o-cc-pvdz-mints.npz differ diff --git a/mints/h2o-dz-mints.npz b/mints/h2o-dz-mints.npz new file mode 100644 index 0000000..d9fca01 Binary files /dev/null and b/mints/h2o-dz-mints.npz differ diff --git a/mints/h2o-sto-3g-mints.npz b/mints/h2o-sto-3g-mints.npz new file mode 100644 index 0000000..a69ef5a Binary files /dev/null and b/mints/h2o-sto-3g-mints.npz differ diff --git a/source/adc/ADC.ipynb b/source/adc/ADC.ipynb new file mode 100644 index 0000000..c2d2327 --- /dev/null +++ b/source/adc/ADC.ipynb @@ -0,0 +1,236 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "af9ca12e", + "metadata": {}, + "source": [ + "### Algebraic-Diagrammatic Construction" + ] + }, + { + "cell_type": "markdown", + "id": "feeaa6fc", + "metadata": {}, + "source": [ + "__Prerequisites__\n", + "\n", + "Reference is 'Development and Implementation of Theoretical Methods for the Description of Electronically Core-Excited States' - Jan Wenzel https://archiv.ub.uni-heidelberg.de/volltextserver/20514/1/Jan_Wenzel_Thesis.pdf\n", + "\n", + "+ (i) $\\Delta_{ia} = \\displaystyle \\sum_{ia} (\\epsilon_i - \\epsilon_a)$\n", + "\n", + "+ (ii) $\\Delta_{ijab} = \\displaystyle \\sum_{ijab} (\\epsilon_i + \\epsilon_j - \\epsilon_a - \\epsilon_b)$\n", + "\n", + "+ (iii) $r^{ia} =diag[:n_o*n_v]$ reshaped to $[n_o, n_v] = -r^{ai}$\n", + "\n", + "+ (iv) $r^{iajb} =diag[n_o*n_v:]$ reshaped to $[n_o, n_v, n_o, n_v]= -r^{aijb}$\n", + "\n", + "+ (v) $\\tau_{ijab} = \\frac{\\langle ab||ij\\rangle }{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b} = -\\tau_{abij}$\n", + "\n", + "__Level (0) ADC__\n", + "\n", + "+ (1) $\\boldsymbol{M^{0}_{ia,jb}~~~~~(\\epsilon_a - \\epsilon_i)\\delta_{ab} \\delta_{ij}~~~~~~~~~~~~~~~}$ \n", + "\n", + "__Level (1) ADC__\n", + "\n", + "+ (1) $\\boldsymbol{M^{0}_{ia,jb}~~~~~(\\epsilon_a - \\epsilon_i)\\delta_{ab} \\delta_{ij}~~~~~~~~~~~~~~~}$ \n", + "\n", + "+ (2) $\\boldsymbol{M^{1}_{ia,jb}~~~~~} -\\langle aj||bi \\rangle ~~~~~~~~~~~~~~~~~~~~~~~~~~$ \n", + "\n", + "__Level (2) ADC__\n", + "\n", + "+ (1) $\\boldsymbol{M^{0}_{ia,jb}~~~~~(\\epsilon_a - \\epsilon_i)\\delta_{ab} \\delta_{ij}~~~~~~~~~~~~~~~}$ \n", + "\n", + "+ (2) $\\boldsymbol{M^{1}_{ia,jb}~~~~~}-\\langle aj||bi \\rangle ~~~~~~~~~~~~~~~~~~~~~~~~~~$ \n", + "\n", + "+ (3) $\\boldsymbol{M^{(2)}_{ia,jb}~~~~~~\\frac{1}{4} \\delta_{ij}\\displaystyle \\sum_{ckl} \\big(\\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_k - \\epsilon_l} + \\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_k - \\epsilon_l} \\big)}$\n", + "\n", + "$\\frac{1}{4} \\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_k-\\epsilon_l}= -\\frac{1}{4} \\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_k+\\epsilon_l-\\epsilon_a-\\epsilon_c} = -\\frac{1}{4} \\tau_{klac} \\scriptsize \\langle kl||bc\\rangle $\n", + "\n", + "$\\frac{1}{4} \\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_k-\\epsilon_l}= -\\frac{1}{4} \\frac{\\langle ac||kl\\rangle \\langle bc||kl\\rangle }{\\epsilon_k+\\epsilon_l-\\epsilon_b-\\epsilon_c} = -\\frac{1}{4} \\tau_{klbc} \\scriptsize \\langle ac||kl\\rangle $\n", + "\n", + "$~~~~~~~~~~~~~~~~~~~~~~~~~~\\boldsymbol{ \\frac{1}{4} \\delta_{ab}\\displaystyle \\sum_{cdk} \\big(\\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_i - \\epsilon_k} + \\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_j - \\epsilon_k} \\big)}$\n", + "\n", + "$\\frac{1}{4} \\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_i - \\epsilon_k} = -\\frac{1}{4} \\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_i+\\epsilon_k-\\epsilon_c - \\epsilon_d} = -\\frac{1}{4} \\tau_{ikcd} \\scriptsize \\langle jk||cd\\rangle $\n", + "\n", + "$\\frac{1}{4} \\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_j - \\epsilon_k} = -\\frac{1}{4} \\frac{\\langle cd||ik\\rangle \\langle cd||jk\\rangle }{\\epsilon_j+\\epsilon_k-\\epsilon_c - \\epsilon_d} = -\\frac{1}{4} \\tau_{jkcd} \\scriptsize \\langle cd||ik\\rangle $\n", + "\n", + "$~~~~~~~~~~~~~~~~~~~~~~~~\\boldsymbol{ -\\frac{1}{2} \\displaystyle \\sum_{ck} \\big(\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_i - \\epsilon_k} + \\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k} \\big)}$\n", + "\n", + " $-\\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_i - \\epsilon_k} = \\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_i+\\epsilon_k-\\epsilon_a - \\epsilon_c}= \\frac{1}{2} \\tau_{ikac}\\scriptsize \\langle jk||bc\\rangle $ \n", + " \n", + " $-\\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k} = \\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k}= \\frac{1}{2} \\tau_{jkbc}\\scriptsize \\langle ac||ik\\rangle $ \n", + " \n", + "+ (4) $\\boldsymbol{M^{(1)}_{ia,klcd}~~~~~~~\\scriptsize \\langle kl||id\\rangle \\delta_{ac} - \\langle kl||ic\\rangle \\delta_{ad} - \\langle al||cd\\rangle \\delta_{ik} + \\langle ak||cd\\rangle \\delta_{il}}$\n", + "\n", + "+ (5) $\\boldsymbol{M^{(1)}_{iajb,kc}~~~~~~~\\scriptsize \\langle kb||ij\\rangle \\delta_{ac} - \\langle ka||ij\\rangle \\delta_{bc} - \\langle ab||cj\\rangle \\delta_{ik} + \\langle ab||ci\\rangle \\delta_{jk}}$\n", + "\n", + "+ (6) $\\boldsymbol{M^{(0)}_{iajb,kcld}~~~~~~~(\\epsilon_a+\\epsilon_b-\\epsilon_i - \\epsilon_j)\\delta_{ac}\\delta_{bd}\\delta_{ik}\\delta_{jl}}$\n", + "\n", + "$-(\\epsilon_i+\\epsilon_j-\\epsilon_a - \\epsilon_b)\\delta_{ac}\\delta_{bd}\\delta_{ik}\\delta_{jl}$\n", + "\n", + "__Level (2) ADC-x__\n", + "\n", + "+ (7) $\\boldsymbol{M^{(1)}_{iajb,kcld}~~~~~~~\\scriptsize \\langle ab||cd\\rangle \\delta_{ik} \\delta_{jl}+ \\langle kl||ij\\rangle \\delta_{ac}\\delta_{bd} - P(cd) P(kl)(\\langle ak||ci\\rangle \\delta_{bd}\\delta_{jl} + \\langle al||cj\\rangle \\delta_{bd} \\delta_{ik}+ \\langle bk||di\\rangle \\delta_{ac} \\delta_{jl}+ \\langle bl||dj\\rangle \\delta_{ac} \\delta_{ik}) }$\n", + "\n", + "__Diagonal pre-conditioner terms__\n", + "\n", + "+ (1) $\\boldsymbol{M^{0}_{ia,jb}~~~~~(\\epsilon_a - \\epsilon_i)\\delta_{ab} \\delta_{ij}~~~~~~~~~~~~~~~}$ \n", + "\n", + "+ (2) $\\boldsymbol{M^{1}_{ia,jb}~~~~~}$-\\langle aj||bi\\rangle $~~~~~~~~~~~~~~~~~~~~~~~~~~$ \n", + "\n", + "+ (3) $\\boldsymbol{M^{(2)}_{ia,jb}~~~~~~\\frac{1}{4} \\delta_{ij}\\displaystyle \\sum_{ckl} \\big(\\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_k - \\epsilon_l} + \\frac{\\langle ac||kl\\rangle \\langle kl||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_k - \\epsilon_l} \\big)}$\n", + "\n", + "$~~~~~~~~~~~~~~~~~~~~~~~~~~\\boldsymbol{ \\frac{1}{4} \\delta_{ab}\\displaystyle \\sum_{cdk} \\big(\\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_i - \\epsilon_k} + \\frac{\\langle cd||ik\\rangle \\langle jk||cd\\rangle }{\\epsilon_c+\\epsilon_d-\\epsilon_j - \\epsilon_k} \\big)}$\n", + "\n", + "$~~~~~~~~~~~~~~~~~~~~~~~~\\boldsymbol{ -\\frac{1}{2} \\displaystyle \\sum_{ck} \\big(\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_i - \\epsilon_k} + \\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k} \\big)}$\n", + "\n", + " $-\\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_a+\\epsilon_c-\\epsilon_i - \\epsilon_k} = \\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_i+\\epsilon_k-\\epsilon_a - \\epsilon_c}= \\frac{1}{2} \\tau_{ikac}\\scriptsize \\langle jk||bc\\rangle $ \n", + " \n", + " $-\\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k} = \\frac{1}{2}\\frac{\\langle ac||ik\\rangle \\langle jk||bc\\rangle }{\\epsilon_b+\\epsilon_c-\\epsilon_j - \\epsilon_k}= \\frac{1}{2} \\tau_{jkbc}\\scriptsize \\langle ac||ik\\rangle $ \n", + "\n", + "+ (6) $\\boldsymbol{M^{(0)}_{iajb,kcld}~~~~~~~(\\epsilon_a+\\epsilon_b-\\epsilon_i - \\epsilon_j)\\delta_{ac}\\delta_{bd}\\delta_{ik}\\delta_{jl}}$\n", + "\n", + "+ (7) $\\boldsymbol{M^{(1)}_{iajb,kcld}~~~~~~~\\scriptsize \\langle ab||cd\\rangle \\delta_{ik} \\delta_{jl}+ \\langle kl||ij\\rangle \\delta_{ac}\\delta_{bd} - P(cd) P(kl)(\\langle ak||ci\\rangle \\delta_{bd}\\delta_{jl} + \\langle al||cj\\rangle \\delta_{bd} \\delta_{ik}+ \\langle bk||di\\rangle \\delta_{ac} \\delta_{jl}+ \\langle bl||dj\\rangle \\delta_{ac} \\delta_{ik}) }$\n", + "\n", + "$\\scriptsize {\\langle ab||cd\\rangle \\delta_{ik} \\delta_{jl} \\rightarrow \\langle ab||ab\\rangle \\delta_{ii} \\delta_{jj} \\rightarrow \\langle ab||ab\\rangle }$\n", + "\n", + "$\\scriptsize {\\langle kl||ij\\rangle \\delta_{ac} \\delta_{bd} \\rightarrow \\langle ij||ij\\rangle \\delta_{aa} \\delta_{bb} \\rightarrow \\langle ij||ij\\rangle }$\n", + "\n", + "$\\scriptsize {\\langle ak||ci\\rangle \\delta_{bd}\\delta_{jl} + \\langle al||cj\\rangle \\delta_{bd} \\delta_{ik}+ \\langle bk||di\\rangle \\delta_{ac} \\delta_{jl}+ \\langle bl||dj\\rangle \\delta_{ac} \\delta_{ik} \\rightarrow \\langle ai||ai\\rangle \\delta_{bb} \\delta_{jj} + \\langle aj||aj\\rangle \\delta_{bb} \\delta_{ii} + \\langle bi||bi\\rangle \\delta_{aa} \\delta_{jj} + \\langle bj||bj\\rangle \\delta_{aa} \\delta_{ii} \\rightarrow \\langle ai||ai\\rangle + \\langle aj||aj\\rangle + \\langle bi||bi\\rangle + \\langle bj||bj\\rangle }$\n", + "\n", + "$\\scriptsize {\\langle ak||di\\rangle \\delta_{bc}\\delta_{jl} + \\langle al||dj\\rangle \\delta_{bc} \\delta_{ik}+ \\langle bk||ci\\rangle \\delta_{ad} \\delta_{jl}+ \\langle bl||cj\\rangle \\delta_{ad} \\delta_{ik} \\rightarrow \\langle ai||bi\\rangle \\delta_{ba} \\delta_{jj} + \\langle aj||bj\\rangle \\delta_{ba} \\delta_{ii} + \\langle bi||ai\\rangle \\delta_{ab} \\delta_{jj} + \\langle bj||aj\\rangle \\delta_{ab} \\delta_{ii} \\rightarrow 0}$ and for other two terms giving $\\scriptsize {\\langle ab||ab\\rangle + \\langle ij||ij\\rangle - \\langle ai||ai\\rangle - \\langle aj||aj\\rangle - \\langle bi||bi\\rangle - \\langle bj||bj\\rangle }$\n", + "\n", + "__Steps to getting oscillator strengths__\n", + "+ The mp2 densities\n", + "\n", + "$\\rho_{ij} = -\\frac{1}{2} \\displaystyle \\sum_{kab} \\tau_{ikab} \\tau_{jkab}$\n", + "\n", + "$\\rho_{ia} = -\\frac{1}{2} \\frac{1}{\\Delta_{ia}}\\big( \\displaystyle \\sum_{jbc} \\tau_{ijbc} \\langle ja||bc\\rangle + \\displaystyle \\sum_{jkb} \\tau_{jkab} \\langle jk||ib\\rangle \\big)$\n", + "\n", + "$\\rho_{ab} = \\frac{1}{2} \\displaystyle \\sum_{ijc} \\tau_{ijac} \\tau_{ijbc}$\n", + "\n", + "+ The Spectral Amplitudes (Transition Moments)\n", + "\n", + "__$ \\boldsymbol{ ai^{(0)}}$__\n", + "\n", + "$F^{(0)}_{ia} = D_{ai} \\rightarrow v_{ai}$\n", + "\n", + "__$\\boldsymbol{ia^{(1)}}$__\n", + "\n", + "$F^{(1)}_{ia} = \\displaystyle \\sum_{bj} \\frac{\\langle ab||ji\\rangle }{\\epsilon_a + \\epsilon_b - \\epsilon_j - \\epsilon_i} D_{jb} = \\displaystyle \\sum_{bj} \\frac{\\langle ij||ab\\rangle }{\\epsilon_i + \\epsilon_j - \\epsilon_a - \\epsilon_b} D_{jb} \\rightarrow \\tau_{ijab} v_{jb}$\n", + "\n", + "__$\\boldsymbol{ai^{(2)}}$__\n", + "\n", + "$F^{(2)A}_{ia} = -\\frac{1}{4} \\displaystyle \\sum_{bjck} \\frac{\\langle ab||jk\\rangle \\langle jk||cb\\rangle }{(\\epsilon_a + \\epsilon_b-\\epsilon_j - \\epsilon_k)(\\epsilon_c + \\epsilon_b-\\epsilon_j - \\epsilon_k)} D_{ci} \\rightarrow -\\frac{1}{4} \\tau_{jkab} \\tau_{jkcb} D_{ci} \\rightarrow -\\frac{1}{2} \\rho_{ac} D_{ci} \\rightarrow -\\frac{1}{2} \\rho_{ab} v_{ib}$\n", + "\n", + "$F^{(2)B}_{ia} = -\\frac{1}{4} \\displaystyle \\sum_{bjck} \\frac{\\langle bc||ij\\rangle \\langle kj||bc\\rangle }{(\\epsilon_b + \\epsilon_c-\\epsilon_i - \\epsilon_j)(\\epsilon_b + \\epsilon_c-\\epsilon_k - \\epsilon_j)} D_{ak} \\rightarrow -\\frac{1}{4} \\tau_{ijbc} \\tau_{kjbc} D_{ak} \\rightarrow \\frac{1}{2} \\rho_{ik} D_{ak} \\rightarrow \\frac{1}{2} \\rho_{ij} v_{ja}$\n", + "\n", + "$F^{(2)C}_{ia} = \\frac{1}{2} \\displaystyle \\sum_{bjck} \\frac{\\langle ab||ij\\rangle \\langle jk||cb\\rangle }{(\\epsilon_a + \\epsilon_b-\\epsilon_i - \\epsilon_j)(\\epsilon_c + \\epsilon_b-\\epsilon_j - \\epsilon_k)} D_{ck} \\rightarrow \\frac{1}{2} \\tau_{ijab} \\tau_{jkcb} D_{ck} \\rightarrow \\frac{1}{2} \\tau_{ijab} \\tau_{jkcb} v_{kc} $\n", + "\n", + "__$\\boldsymbol{ij^{(2)}}$__\n", + "\n", + "$F^{(2,1)}_{ia} = -\\frac{1}{2} \\displaystyle \\sum_{bjck} \\frac{\\langle bc||jk\\rangle \\langle ja||bc\\rangle }{(\\epsilon_b + \\epsilon_c-\\epsilon_j - \\epsilon_k)(\\epsilon_a-\\epsilon_k)} D_{ki} \\rightarrow -\\frac{1}{2} \\tau_{jkbc} \\frac{\\langle ja||bc\\rangle }{\\epsilon_k - \\epsilon_a} D_{ki} \\rightarrow \\frac{1}{2} \\tau_{ijbc} \\frac{\\langle ja||bc\\rangle }{\\epsilon_i - \\epsilon_a} v_{ja}$\n", + "\n", + "$F^{(2,2)}_{ia} = \\frac{1}{2} \\displaystyle \\sum_{bjkl} \\frac{\\langle ba||jk\\rangle \\langle jk||bl\\rangle }{(\\epsilon_a + \\epsilon_b-\\epsilon_j - \\epsilon_k)(\\epsilon_a-\\epsilon_l)} D_{li} \\rightarrow -\\frac{1}{2} \\tau_{jkab} \\frac{\\langle jk||bl\\rangle }{\\epsilon_l - \\epsilon_a} D_{li} \\rightarrow \\frac{1}{2} \\tau_{jkab} \\frac{\\langle jk||ib\\rangle }{\\epsilon_i - \\epsilon_a} v_{ja}$\n", + "\n", + "$F^{(2,1)}_{ia} + F^{(2,2)}_{ia} = \\frac{1}{2} \\frac{1}{\\epsilon_i - \\epsilon_a} \\big[ \\tau_{ijbc} \\langle ja||bc\\rangle + \\tau_{jkab} \\langle jk||ib\\rangle \\big] v_{ja} = -\\rho_{ia} v_{ja}$\n", + "\n", + "$\\boldsymbol{ab^{(2)}}$\n", + "\n", + "$F^{2,3}_{ia} = -\\frac{1}{2} \\displaystyle \\sum_{bjck} \\frac{\\langle bc||jk\\rangle \\langle jk||ic\\rangle }{(\\epsilon_b + \\epsilon_c-\\epsilon_j - \\epsilon_k)(\\epsilon_b-\\epsilon_i)} D_{ab} \\rightarrow -\\frac{1}{2} \\tau_{jkbc} \\frac{\\langle jk||ic\\rangle }{\\epsilon_i-\\epsilon_b} D_{ab}$\n", + "\n", + "$F^{2,4}_{ia} = \\frac{1}{2} \\displaystyle \\sum_{bcjd} \\frac{\\langle bc||ij\\rangle \\langle dj||bc\\rangle }{(\\epsilon_b + \\epsilon_c-\\epsilon_i - \\epsilon_j)(\\epsilon_d-\\epsilon_i)} D_{ad} \\rightarrow -\\frac{1}{2} \\tau_{ijbc} \\frac{\\langle jd||bc\\rangle }{\\epsilon_i-\\epsilon_d} D_{ad} \\rightarrow -\\frac{1}{2} \\tau_{ijdc} \\frac{\\langle jb||dc\\rangle }{\\epsilon_i-\\epsilon_b} D_{ab}$\n", + "\n", + "$F^{(2,3)}_{ia} + F^{(2,4)}_{ia} = -\\frac{1}{2} \\frac{1}{\\epsilon_i - \\epsilon_b} \\big[ \\tau_{ijdc} \\langle jb||dc\\rangle +\\tau_{jkbc} \\langle jk||ic\\rangle \\big] v_{ab} = \\rho_{ib} v_{ia}$\n", + "\n", + "$\\boldsymbol{ijab^{(2)}}$\n", + "\n", + "$F^{(1,1)}_{ijab} = \\displaystyle \\sum_{k} \\frac{\\langle ab||ki\\rangle }{\\epsilon_a + \\epsilon_b - \\epsilon_k - \\epsilon_i}D_{kj} - \\displaystyle \\sum_{k} \\frac{\\langle ab||kj\\rangle }{\\epsilon_a + \\epsilon_b - \\epsilon_k - \\epsilon_j}D_{ki} \\rightarrow -\\tau_{kiab} D_{kj} + \\tau_{kjab} D_{ki} \\rightarrow \\tau_{ikab} v_{jkab} - \\tau_{jkab} v_{ikab}$\\\n", + "$\\rightarrow \\big[1 - P(ij)\\big] \\tau_{ikab} v_{jkab}$\n", + "\n", + "$F^{(1,2)}_{ijab} = \\displaystyle \\sum_{c} \\frac{\\langle cb||ij\\rangle }{\\epsilon_c + \\epsilon_a - \\epsilon_i - \\epsilon_j}D_{ac} - \\displaystyle \\sum_{c} \\frac{\\langle ca||ij\\rangle }{\\epsilon_c + \\epsilon_a - \\epsilon_i - \\epsilon_j}D_{ac} \\rightarrow -\\tau_{ijcb} D_{ac} + \\tau_{ijca} D_{ac} \\rightarrow -\\tau_{ijbc} v_{ijac} + \\tau_{ijac} v_{ijbc}$\\\n", + "$\\rightarrow -\\big[1 - P(ab)\\big] \\tau_{ijbc} v_{ijac}$\n", + "\n", + "$\\boldsymbol{ia^{(2)}}$\n", + "\n", + "$F^{(2,5)}_{ia} = \\displaystyle \\sum_{bjck} \\frac{\\langle bc||kj\\rangle \\langle aj||bi\\rangle }{(\\epsilon_b + \\epsilon_c-\\epsilon_k - \\epsilon_j)(\\epsilon_a + \\epsilon_c-\\epsilon_i - \\epsilon_k)} D_{kc} \\rightarrow \\tau_{kjbc} \\frac{\\langle aj||bi\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc} \\rightarrow -\\tau_{jkbc} \\frac{\\langle ja||ib\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc}$\n", + "\n", + "$F^{(2,6)}_{ia} = \\displaystyle \\sum_{bjck} \\frac{\\langle ab||ji\\rangle \\langle jc||kb\\rangle }{(\\epsilon_a + \\epsilon_b-\\epsilon_j - \\epsilon_i)(\\epsilon_a + \\epsilon_c-\\epsilon_i - \\epsilon_k)} D_{kc} \\rightarrow \\tau_{jiab} \\frac{\\langle jc||kb\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc} \\rightarrow -\\tau_{jiba} \\frac{\\langle jc||kb\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc}$ \n", + "\n", + "$F^{(2,7)}_{ia} = -\\displaystyle \\sum_{bjcd} \\frac{\\langle cb||ji\\rangle \\langle aj||kc\\rangle }{(\\epsilon_c + \\epsilon_b-\\epsilon_j - \\epsilon_i)(\\epsilon_a + \\epsilon_b-\\epsilon_i - \\epsilon_k)} D_{kb} \\rightarrow -\\tau_{jicb} \\frac{\\langle aj||kc\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_b} D_{kb} \\rightarrow -\\tau_{jibc} \\frac{\\langle ja||kc\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_b} D_{kb}$ \n", + "\n", + "$F^{(2,8)}_{ia} = - \\displaystyle \\sum_{bjcd} \\frac{\\langle ac||kj\\rangle \\langle jb||ci\\rangle }{(\\epsilon_a + \\epsilon_c-\\epsilon_k - \\epsilon_j)(\\epsilon_a + \\epsilon_b-\\epsilon_i - \\epsilon_k)} D_{kb} \\rightarrow -\\tau_{kjac} \\frac{\\langle jb||ci\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_b} D_{kb} \\rightarrow -\\tau_{jkac} \\frac{\\langle jb||ic\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_b} D_{kb}$ \n", + "\n", + "$F^{(2,6)}_{ia} = P(ik)P(ac)\\big[F^{(2,5)}_{ia}\\big]$\n", + "\n", + "As b and c are dummy indices and so interchangeable.\n", + "\n", + "$F^{(2,7)}_{ia} = -\\tau_{jicb} \\frac{\\langle ja||kb\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc} = +\\tau_{jibc} \\frac{\\langle ja||kb\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc} = -P(ik)\\big[ F^{(2,5)}_{ia} \\big]$\n", + "\n", + "$F^{(2,8)}_{ia} = -\\tau_{jkab} \\frac{\\langle jc||ib\\rangle }{\\epsilon_a + \\epsilon_c-\\epsilon_i - \\epsilon_k} D_{kc} = +\\tau_{jkba} \\frac{\\langle jc||ib\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc} = -P(ac)\\big[ F^{(2,5)}_{ia} \\big]$\n", + "\n", + "$F^{(2,5)}_{ia} + F^{(2,6)}_{ia} + F^{(2,7)}_{ia} + F^{(2,8)}_{ia} = -\\big[ 1-P(ik)\\big]\\big[1 - P(ac) \\big] \\tau_{jkbc} \\frac{\\langle ja||ib\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} D_{kc}$\n", + "\n", + "$\\scriptsize {\\big[ 1-P(ik)\\big]\\big[1 - P(ac) \\big] \\tau_{jkbc} \\frac{\\langle ja||ib\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_c} \\rightarrow \\big[ 1-P(ji)\\big]\\big[1 - P(ba) \\big] \\tau_{kica} \\frac{\\langle kb||jc\\rangle }{\\epsilon_i + \\epsilon_k-\\epsilon_a - \\epsilon_b} = \\big[ 1-P(ij)\\big]\\big[1 - P(ab) \\big] \\tau_{ikac} \\frac{\\langle kb||jc\\rangle }{\\epsilon_i + \\epsilon_j-\\epsilon_a - \\epsilon_b} }$ this is the first term in $\\boldsymbol {T^{D(1)}_{ijab}}$ defined in reference in Table 3.1\n", + "\n", + "Combined we have $-T^{D(1)}_{ijab}v_{jb}$\n", + "\n", + "$F^{(2,9)}_{ia} = -\\frac{1}{2} \\displaystyle \\sum_{bjcd} \\frac{\\langle cd||ji\\rangle \\langle ab||cd\\rangle }{(\\epsilon_c+\\epsilon_d-\\epsilon_j-\\epsilon_i)(\\epsilon_a+\\epsilon_b-\\epsilon_i-\\epsilon_j)} D_{jb} \\rightarrow +\\frac{1}{2}\\tau_{ijcd} \\frac{\\langle ab||cd\\rangle }{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b} D_{jb}$\n", + "\n", + "$F^{(2,10)}_{ia} = -\\frac{1}{2} \\displaystyle \\sum_{bjkl} \\frac{\\langle ab||kl\\rangle \\langle kl||ji\\rangle }{(\\epsilon_a+\\epsilon_b-\\epsilon_k-\\epsilon_l)(\\epsilon_a+\\epsilon_b-\\epsilon_i-\\epsilon_j)} D_{jb} \\rightarrow +\\frac{1}{2}\\tau_{klab} \\frac{\\langle kl||ij \\rangle }{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b} D_{jb}$\n", + "\n", + "If we define $T^{D}_{ijab} = \\big[ 1-P(ij)\\big]\\big[1 - P(ab) \\big] \\tau_{ikac} \\frac{\\langle kb||jc\\rangle }{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b} - \\frac{1}{2}\\tau_{ijcd} \\frac{\\langle ab||cd\\rangle }{\\epsilon_i-\\epsilon_j-\\epsilon_a-\\epsilon_b} - \\frac{1}{2}\\tau_{klab} \\frac{\\langle kl||ij \\rangle }{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b} = \\frac{1}{\\epsilon_i+\\epsilon_j-\\epsilon_a-\\epsilon_b}\\big(\\big[ 1-P(ij)\\big]\\big[1 - P(ab) \\big] \\tau_{ikac} \\langle kb||jc\\rangle - \\frac{1}{2}\\tau_{ijcd} \\langle ab||cd\\rangle - \\frac{1}{2}\\tau_{klab} \\langle kl||ij \\rangle \\big)$ \n", + "\n", + "then $\\boldsymbol{ia^{(2)}} = -T^{D}_{ijab} v_{jb}$\n", + "\n", + "Then collecting terms we have\n", + "\n", + "$\\boldsymbol{oo} = -\\rho_{ia} v_{ja} + \\tau_{ikab} v_{jkab}$\n", + "\n", + "$\\boldsymbol{vv} = \\rho_{ib} v_{ia} - \\tau_{ijbc} v_{ijac}$\n", + "\n", + "$\\boldsymbol{ov} = v_{ia}^T -T^{D}_{ijab} v_{jb} + \\tau_{ijab} v_{jb}$\n", + "\n", + "$\\boldsymbol{vo} = \\frac{1}{2}\\big( \\tau_{ijab} \\tau_{jkcb} v_{kc} - \\rho_{ab} v_{ib} + v_{ja} \\rho_{ij}\\big)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8218862c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f954946", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/source/adc/adc(1).py b/source/adc/adc(1).py new file mode 100644 index 0000000..b718100 --- /dev/null +++ b/source/adc/adc(1).py @@ -0,0 +1,378 @@ +from __future__ import division +import numpy as np +from atom import getConstant +from cc.fcc import spinMO +from adc import * + +class first_order_adc(object): + + def __init__(self, ADC, HF, solver='eigh'): + + self.ADC = ADC + self.HF = HF + self.solver = solver + + #get mp2 quantities + ds, dd, td = self.ADC.moller_plesset(silent=True) + + #get diagonal preconditioner + diagonal = self.adc_diagonal(ds, dd, td) + + #generate initial guess from diagonal + guess_vectors = self.adc_initial_guess(diagonal, self.ADC.guess_vector_factor) + + #global for this routine + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + gs = adc.gs ; tol = adc.tol + + if solver == 'davidson': + e, u, converged = davidson(self.matvec, guess_vectors, diagonal, tol=self.ADC.tol, + vectors_per_root = self.ADC.vectors_per_root ) + elif solver == 'eigh': + e, u, converged = self.direct_solve() + + self.cache = {'e':e[:self.ADC.roots], 'u':u[:, :self.ADC.roots], 'c':converged} + + def get(self): + #return results + + return self.cache['e'], self.cache['u'], self.cache['c'] + + def get_transition_properties(self): + #collect the different transition property and write to cache + + function_calls = [self.get_cis_transition_moments, self.get_adc_transition_moments] * 3 + cache_labels = [['dipole:electric:length:CIS', 'oscillator:electric:length:CIS'], + ['dipole:electric:length:ADC', 'oscillator:electric:length:ADC'], + ['dipole:electric:velocity:CIS', 'oscillator:electric:velocity:CIS'], + ['dipole:electric:velocity:ADC', 'oscillator:electric:velocity:ADC'], + ['dipole:magnetic:length:CIS', ''], + ['dipole:magnetic:length:ADC', '']] + operator_id = ['d', 'd', 'n', 'n', 'a', 'a'] + + #transition dipoles and oscillator strengths + for i, f in enumerate(function_calls): + + properties = [] + operator = f(operator_id[i]) + + for root, tdm in enumerate(operator): + if 'electric' in cache_labels[i][0]: + properties.append((2/3) * self.cache['e'][root] * np.einsum('x,x->', tdm, tdm, optimize=True)) + self.cache[cache_labels[i][1]] = properties + + self.cache[cache_labels[i][0]] = operator + + #cross-section + properties = [] + for root in range(self.ADC.roots): + properties.append(self.cache['oscillator:electric:length:CIS'][root] * 2 * getConstant('alpha') * (np.pi)**2) + self.cache['cross-section:CIS'] = properties + properties = [] + for root in range(self.ADC.roots): + properties.append(self.cache['oscillator:electric:length:ADC'][root] * 2 * getConstant('alpha') * (np.pi)**2) + self.cache['cross-section:ADC'] = properties + + def get_adc_transition_moments(self, type='d'): + #compute the transition dipole and oscillator strength at ADC(1) level + + transition_properties = [] + + + mu_mo = self.get_reference_dipole_components(type) + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + + #get MP2 properties + ds, dd ,td = adc.moller_plesset(silent=True) + + for root in range(self.ADC.roots): + + #ADC ph amplitude + u = self.cache['u'][:, root].reshape(nocc, nvir) + + #get ADC transition density + dm = np.zeros((nocc+nvir, nocc+nvir)) + dm[v, o] += u.transpose(1, 0) + dm[o, v] += np.einsum('ijab,jb->ia', td, u, optimize=True) + + #get transition dipole moment + tdm = np.einsum('ia,xia->x', dm, mu_mo, optimize=True) + + transition_properties.append(tdm) + + return transition_properties + + + def get_cis_transition_moments(self, type='d'): + #compute the transition dipole momemnts and oscilator strength at CIS level + + transition_properties = [] + + mu_mo = self.get_reference_dipole_components(type) + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + + for root in range(self.ADC.roots): + + #get CIS transition density + dm = self.cache['u'][:, root].reshape(nocc, nvir) + + #get transition dipole moment + tdm = np.einsum('ia,xia->x', dm, mu_mo[:, o, v], optimize=True) + + transition_properties.append(tdm) + + return transition_properties + + + def get_reference_dipole_components(self, type='d'): + #return the ground state dipole components + + #get components + if type == 'd': + from post import dipoleComponent + mu_component = [dipoleComponent(self.HF.atoms, self.HF.basis, x, 'nuclear charge') for x in ['x','y','z']] + + elif type == 'n': + from integral import buildNabla + mu_component = [buildNabla(self.HF.atoms, self.HF.basis, x) for x in ['x','y','z']] + + elif type == 'a': + from integral import buildAngular + mu_component = [0.5 * buildAngular(self.HF.atoms, self.HF.basis, x, 'origin') for x in ['x','y','z']] + + else: + print('property operator type[', type, ']not supported') + + #ao->mo + mu_mo = np.kron(np.einsum('rp,xrs,sq->xpq', self.HF.rhf.C, mu_component, self.HF.rhf.C, optimize=True), np.eye(2)) + + return mu_mo + + def adc_diagonal(self, ds, dd, td): + #compute the diagonal of the ADC matrix as a pre-conditioner for the davidson iterations + + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + + #initialize to fock diagonal + diagonal = -ds.ravel() + + adc_diagonal = diagonal[:nrot].reshape(nocc, nvir) + adc_diagonal -= np.einsum('aiai->ia', self.ADC.gs[v, o, v, o], optimize=True) + + return diagonal + + def adc_initial_guess(self, diagonal, f=1): + #initial vector to start Davidson + + #get largest absolute values on diagonal matrix as best guess + args = np.argsort(np.absolute(diagonal)) + + #we only have nocc*nvir roots available + if self.ADC.roots > len(args): + print('reducing requested roots - exceeded ', len(args)) + self.ADC.roots = len(args) + + guess_vectors = np.zeros((diagonal.size, self.ADC.roots * f)) + for root in range(self.ADC.roots * f): + guess_vectors[args[root], root] = 1.0 + + return guess_vectors + + def matvec(self, adc): + #construct the self blocks of EE-self first order matrix dot product with arbitary vector (r) + + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + ds, dd, td = self.ADC.moller_plesset(silent=True) + + adc = np.array(adc) + r = np.zeros_like(adc) + + adc_s = adc[:nrot].reshape(nocc, nvir) + r_s = r[:nrot].reshape(nocc, nvir) + + #singles - singles block + r_s -= np.einsum('ia,ia->ia', ds, adc_s, optimize=True) + r_s -= np.einsum('ajbi,jb->ia', self.ADC.gs[v, o, v, o], adc_s, optimize=True) + + return r + + def direct_solve(self): + #self(1) = CIS + + n, o, v = self.ADC.slice ; nocc, nvir, nrot = self.ADC.occupations + + #excitations + a = np.einsum('ab,ij->iajb',np.diag(np.diag(self.ADC.fs)[v]),np.diag(np.ones(nocc))) + a -= np.einsum('ij,ab->iajb',np.diag(np.diag(self.ADC.fs)[o]),np.diag(np.ones(nvir))) + a += np.einsum('ajib->iajb',self.ADC.gs[v,o,o,v], optimize=True) + + #reshape for solving + a = a.reshape(nrot, nrot) + + try: + e, u = np.linalg.eigh(a) + converged = True + except np.linalg.LinAlgError as e: + print('matrix solve error ', e) + converged = False + + return e, u, converged + + +if __name__ == '__main__': + + def get_excitation_labels(n, type, nocc): + #put HOMO/LUMO labels on excitation + + if type == 'o': + frontier = 'HOMO' if n == (nocc-1) else 'HOMO-' + str(nocc-1-n) + else: + frontier = 'LUMO' if n == 0 else 'LUMO+' + str(n) + + return frontier + + import rhf + molAtom, molBasis, molData = rhf.mol([]) + e_scf = rhf.scf(molAtom, molBasis, molData, []) + + from basis import electronCount + + charge, electrons = [molData['charge'], electronCount(molAtom, molData['charge'])] + + #call adc class with zero roots to initialise object then reset roots + adc = ADC('ee', rhf, electrons, roots=0, solve=[1, 10]) + adc.roots = 20 + + #create ground state class for acd + hf = hf_reference(rhf, molAtom, molBasis, molData) + + #create instance of adc(1) class + adc_1 = first_order_adc(adc, hf, solver='eigh') + energy, v, converged = adc_1.get() + + #instance of ground state RHF object + adc_1.get_transition_properties() + + + if converged: + + nocc, nvir , _ = adc.occupations + nocc_spatial, nvir_spatial = nocc//2, nvir//2 + + print('ADC(1) Excited States') + print('-----------------------------------------------------------------------------------------------') + print('root energy excitation osc. (CIS) (ADC)') + print('-----------------------------------------------------------------------------------------------') + current_energy = energy[0] ; current_root = 1 ; multiple = 0 + + state = [] + for i, e in enumerate(energy): + + if not np.isclose(current_energy, e): + multiplicity = '[' + str(multiple) + ']' + + eigenvector = (v[:, i-1]**2).reshape(nocc, nvir) + + compacted_to_spatial = (eigenvector[::2,::2].ravel() + eigenvector[1::2,1::2].ravel() + + eigenvector[::2,1::2].ravel() + eigenvector[1::2,::2].ravel())/np.sqrt(2) + + idx = np.argsort(compacted_to_spatial)[::-1] + maximum_excitations = compacted_to_spatial[idx] + ix = np.unravel_index(idx, (nocc_spatial, nvir_spatial)) + + oscillator_strength_cis = adc_1.cache['oscillator:electric:length:CIS'][i-1] + oscillator_strength_adc = adc_1.cache['oscillator:electric:length:ADC'][i-1] + + + print(' {:<2d} {:4s} {:>9.6f} {:>9.6f} {:>8.4f} {:>8s} -> {:8s}'. + format(current_root, multiplicity, current_energy, current_energy*getConstant('hartree->eV'), + maximum_excitations[0], get_excitation_labels(ix[0][0],'o', nocc_spatial), + get_excitation_labels(ix[1][0],'v', nocc_spatial)), end='') + + if not np.isclose(oscillator_strength_cis, 0.0) : + print(' {:<9.4f} {:<9.4f}'.format(oscillator_strength_cis, oscillator_strength_adc)) + else: + print() + current_energy = e ; current_root += 1 ; multiple = 1 + else: + multiple +=1 + + state.append(current_root) + + #get full properties for singlet state + root = 14 + print('\nExcited state ', state[root], ' root number ', root, ' energy ', round(adc_1.cache['e'][root], 6)) + print('------------------------------------ ------------------------------------------------------------------') + print(' type gauge CIS ADC ') + print(' dipole oscillator dipole oscillator') + print('------------------------------------------------------------------------------------------------------') + cis_edl = adc_1.cache['dipole:electric:length:CIS'][root] + adc_edl = adc_1.cache['dipole:electric:length:ADC'][root] + cis_osc = adc_1.cache['oscillator:electric:length:CIS'][root] ; adc_osc = adc_1.cache['oscillator:electric:length:ADC'][root] + print(' electric length [{:>7.4f} {:>7.4f} {:>7.4f}] {:>7.4f} [{:>7.4f} {:>7.4f} {:>7.4f}] {:>7.4f}'. + format(cis_edl[0], cis_edl[1], cis_edl[2], cis_osc, adc_edl[0], adc_edl[1], adc_edl[2], adc_osc)) + + cis_edv = adc_1.cache['dipole:electric:velocity:CIS'][root] + adc_edv = adc_1.cache['dipole:electric:velocity:ADC'][root] + cis_osc = adc_1.cache['oscillator:electric:velocity:CIS'][root] ; adc_osc = adc_1.cache['oscillator:electric:velocity:ADC'][root] + print(' electric velocity [{:>7.4f} {:>7.4f} {:>7.4f}] {:>7.4f} [{:>7.4f} {:>7.4f} {:>7.4f}] {:>7.4f}'. + format(cis_edv[0], cis_edv[1], cis_edv[2], cis_osc, adc_edv[0], adc_edv[1], adc_edv[2], adc_osc)) + + cis_mdl = adc_1.cache['dipole:magnetic:length:CIS'][root] + adc_mdl = adc_1.cache['dipole:magnetic:length:ADC'][root] + print(' magnetic length [{:>7.4f} {:>7.4f} {:>7.4f}] [{:>7.4f} {:>7.4f} {:>7.4f}] '. + format(cis_mdl[0], cis_mdl[1], cis_mdl[2], adc_mdl[0], adc_mdl[1], adc_mdl[2])) + + print('\nCross-sections CIS {:>9.6f} ADC {:>9.6f}'. + format(adc_1.cache['cross-section:CIS'][root], adc_1.cache['cross-section:ADC'][root]) ) + + else: + print('ADC(1) failed to converge') + + def lorentzian(e0, e, tau): + #Lorentzian broadening + + gamma = 1.0/tau + g = (gamma/2.0)**2.0/((e0-e)**2.0 + (gamma/2.0)**2.0) + + return g + + + bars = ['oscillator:electric:length:CIS', 'oscillator:electric:velocity:CIS'] + broad = ['oscillator:electric:length:ADC', 'oscillator:electric:velocity:ADC'] + + import matplotlib.pyplot as py + + fig, ax = py.subplots(2, 1, sharex=True) + fig.subplots_adjust(hspace=0.04) + + fig.suptitle('Oscillator Strengths') + + #bar plots + ax[0].bar(adc_1.cache['e']*getConstant('hartree->eV'), adc_1.cache[bars[0]], + width=0.05, color='orange', align='edge', label='length') + ax[0].bar(adc_1.cache['e']*getConstant('hartree->eV'), adc_1.cache[bars[1]], + width=-0.05, color='black', align='edge', label='velocity') + ax[0].get_xaxis().set_visible(False) + ax[0].set_ylabel('CIS') + + ax[0].legend(loc="upper left") + + tau, margin, n = [40, 0.5, 50 ] + + #broadening plots + for i, e in enumerate(adc_1.cache['e']): + + eV = e * getConstant('hartree->eV') + x = np.linspace(eV - margin, eV + margin, n) + if not np.isclose(adc_1.cache[broad[0]][i], 0): + lorentz = lorentzian(eV, x, tau) * adc_1.cache[broad[0]][i] + ax[1].plot(x, lorentz, color='orange') + if not np.isclose(adc_1.cache[broad[1]][i], 0): + lorentz = lorentzian(eV, x, tau) * adc_1.cache[broad[1]][i] + ax[1].plot(x, lorentz, color='black') + + ax[1].set_ylabel('ADC(1)') + ax[1].set_xlabel('Energy (eV)') + + py.show() \ No newline at end of file diff --git a/source/adc/adc.py b/source/adc/adc.py new file mode 100644 index 0000000..b3c44ef --- /dev/null +++ b/source/adc/adc.py @@ -0,0 +1,793 @@ +from __future__ import division +import numpy as np +from atom import getConstant +from cc.fcc import spinMO + +def davidson(matrix, guess_subspace, diagonal, cycles=None, sort_on_absolute=True, tol=1e-8, vectors_per_root=30): + #asymmetric Davidson iterator + #this code is based on O Backhouse's solver in psi4numpy (ADC_helper) + + converged = False + + if callable(matrix): + matvec = matrix + else: + matvec = lambda x: np.dot(matrix, x) + + if sort_on_absolute: + selector = lambda x: np.argsort(np.absolute(x))[:k] + else: + selector = lambda x: np.argsort(x)[:k] + + k = guess_subspace.shape[1] + b = guess_subspace.copy() + theta = np.zeros((k,)) + + if cycles is None: + cycles = k * 15 + + for cycle in range(cycles): + + #orthogonalize sub-space set + b, r = np.linalg.qr(b) + ex_theta = theta[:k] + + #solve sub-space Hamiltonian + s = np.zeros_like(b) + for i in range(b.shape[1]): + s[:,i] = matvec(b[:,i]) + + g = np.dot(b.T, s) + theta, S = np.linalg.eigh(g) + + #selected biggest eigenvalues (theta) and corresponding vectors (S) + idx = selector(theta) + theta = theta[idx] + S = S[:,idx] + + #augment sub-space + b_augment = [] + for i in range(k): + w = np.dot(s, S[:,i]) + w -= np.dot(b, S[:,i]) * theta[i] + q = w / (theta[i] - diagonal[i] + 1e-30) + b_augment.append(q) + + #check for converged roots + if np.linalg.norm(theta[:k] - ex_theta) < tol: + converged = True + b = np.dot(b, S) + break + + else: + #collapse sub-space if too large or augment sub-space + if b.shape[1] >= (k * vectors_per_root): + b = np.dot(b, S) + theta = ex_theta + else: + b = np.hstack([b, np.column_stack(b_augment)]) + + b = b[:, :k] + + return theta, b, converged + +class ADC(object): + #class for Algebraic Diagramatic Construction method for excited states + from cc.fcc import spinMO + + def __init__(self, mode, rhf, electrons, roots=3, tolerance=1e-8, solve=[1,20]): + + self.mode = mode + self.roots = roots + self.tol = tolerance + self.electrons = electrons + + self.guess_vector_factor, self.vectors_per_root = solve + + #check SCF has been computed + try: + rhf.e + except AttributeError: + print('SCF not performed - no integrals') + + self.rhf = rhf + + #set converged flag and do computation + self.converged = False + if self.mode == 'ee': + self.eig_energy, self.eig_vector = self.do_adc_ee() + elif self.mode in ['ea', 'ip']: + self.eig_energy, self.eig_vector = self.do_adc_ea_ip() + + def get(self, type): + #get quantities + + if type == 'e': return self.eig_energy + if type == 'v': return self.eig_vector + + def get_spin_quantities(self): + #from harpy globals get the spin eri and no energies + + spin = spinMO(self.rhf.e, self.rhf.ERI, self.rhf.C, self.rhf.fock) + + return spin.gs, np.kron(self.rhf.e, np.ones(2)), spin.fs + + def get_spin_metrics(self): + #compute the ocupations of spin orbitals + + nocc = self.electrons + nvir = self.rhf.S.shape[0] * 2 - nocc + + #occupation slices + n = np.newaxis + o = slice(None, nocc) + v = slice(nocc, None) + + return (nocc, nvir, nocc*nvir), (n, o, v) + + def moller_plesset(self, silent=False): + #do moller-plesset second order + + n, o, v = self.slice + + #d tensors - d singles and d doubles + ds = self.eps[o, n] - self.eps[n, v] + dd = self.eps[o, n, n, n] + self.eps[n, o, n, n] - self.eps[n, n, v, n] - self.eps[n, n, n, v] + + #doubles cluster amplitudes + td = self.gs[o, o, v, v] / dd + + #output the MP2 energy summary + mp2 = 0.25 * np.einsum('ijab,ijab->', td, self.gs[o, o, v, v]) + + if not silent: + print('\nmoller-plesset(2) energy summary') + print('rhf total energy {:>16.10f}'.format(self.rhf.SCFenergy)) + print('mp2 correlation energy {:>16.10f}'.format(mp2)) + print('mp2 corrected energy {:>16.10f}\n'.format(self.rhf.SCFenergy+mp2)) + + return ds, dd, td + + def do_adc_ee(self): + #shell for ADC computation + + def adc_diagonal(self, ds, dd, td): + #compute the diagonal of the ADC matrix as a pre-conditioner for the davidson iterations + + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + + #initialize to fock diagonal + diagonal = -np.concatenate([ds.ravel(), dd.swapaxes(1, 2).ravel()]) + + adc_diagonal = diagonal[:nrot].reshape(nocc, nvir) + + adc_diagonal -= np.einsum('aiai->ia', self.gs[v, o, v, o], optimize=True) + + adc_diagonal += 0.5 * np.einsum('acik,ikac->ia', self.gs[v, v, o, o], td, optimize=True) + adc_diagonal += 0.5 * np.einsum('ikac,ikac->ia', self.gs[o, o, v, v], td, optimize=True) + adc_diagonal -= 0.25 * np.einsum('cdik,ikcd->i', self.gs[v, v, o, o], td, optimize=True)[:, n] + adc_diagonal -= 0.25 * np.einsum('ikcd,ikcd->i', self.gs[o, o, v, v], td, optimize=True)[:, n] + adc_diagonal -= 0.25 * np.einsum('ackl,klac->a', self.gs[v, v, o, o], td, optimize=True)[n, :] + adc_diagonal -= 0.25 * np.einsum('klac,klac->a', self.gs[o, o, v, v], td, optimize=True)[n, :] + + return diagonal + + def adc_initial_guess(self, diagonal, f=1): + #initial vector to start Davidson + + #get largest absolute values on diagonal matrix as best guess + args = np.argsort(np.absolute(diagonal)) + guess_vectors = np.zeros((diagonal.size, self.roots * f)) + for root in range(self.roots * f): + guess_vectors[args[root], root] = 1.0 + + return guess_vectors + + def matvec(adc): + #construct the ADC blocks of EE-ADC second order matrix dot product with arbitary vector (r) + + adc = np.array(adc) + r = np.zeros_like(adc) + + adc_s = adc[:nrot].reshape(nocc, nvir) + r_s = r[:nrot].reshape(nocc, nvir) + + #singles - singles block + r_s -= np.einsum('ia,ia->ia', ds, adc_s, optimize=True) + + r_s -= np.einsum('ajbi,jb->ia', gs[v, o, v, o], adc_s, optimize=True) + + r_s += 0.5 * np.einsum('acik,jkbc,jb->ia', gs[v, v, o, o], td, adc_s, optimize=True) + r_s += 0.5 * np.einsum('jkbc,ikac,jb->ia', gs[o, o, v, v], td, adc_s, optimize=True) + + t = -np.einsum('cdik,jkcd->ij', gs[v, v, o, o], td, optimize=True) + t += -np.einsum('jkcd,ikcd->ij', gs[o, o, v, v], td, optimize=True) + r_s += 0.25 * np.einsum('ij,ja->ia', t, adc_s, optimize=True) + + t = -np.einsum('ackl,klbc->ab', gs[v, v, o, o], td, optimize=True) + t += -np.einsum('klbc,klac->ab', gs[o, o, v, v], td, optimize=True) + r_s += 0.25 * np.einsum('ab,ib->ia', t, adc_s, optimize=True) + + adc_d = adc[nrot:].reshape(nocc, nvir, nocc, nvir) + r_d = r[nrot:].reshape(nocc, nvir, nocc, nvir) + + #singles - doubles block + r_s += 0.5 * np.einsum('klid,kald->ia', gs[o, o, o, v], adc_d, optimize=True) + r_s -= 0.5 * np.einsum('klic,kcla->ia', gs[o, o, o, v], adc_d, optimize=True) + r_s -= 0.5 * np.einsum('alcd,icld->ia', gs[v, o, v, v], adc_d, optimize=True) + r_s += 0.5 * np.einsum('akcd,kcid->ia', gs[v, o, v, v], adc_d, optimize=True) + + #doubles - singles block + r_d += 0.5 * np.einsum('kbij,ka->iajb', gs[o, v, o, o], adc_s, optimize=True) + r_d -= 0.5 * np.einsum('kaij,kb->iajb', gs[o, v, o, o], adc_s, optimize=True) + r_d -= 0.5 * np.einsum('abcj,ic->iajb', gs[v, v, v, o], adc_s, optimize=True) + r_d += 0.5 * np.einsum('abci,jc->iajb', gs[v, v, v, o], adc_s, optimize=True) + + #doubles - doubles block + r_d -= np.einsum('ijab,iajb->iajb', dd, adc_d, optimize=True) + + return r + + #get spin versions of integrals + self.gs, self.eps, self.fs = self.get_spin_quantities() + + #get spin metrics + self.occupations, self.slice = self.get_spin_metrics() + + #do Moller-Plesset (2) + ds, dd, td = self.moller_plesset() + + #get diagonal preconditioner + diagonal = adc_diagonal(self, ds, dd, td) + + #generate initial guess from diagonal + guess_vectors = adc_initial_guess(self, diagonal, self.guess_vector_factor) + + #global for this routine + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + gs = self.gs ; tol = self.tol + + e, v, self.converged = davidson(matvec, guess_vectors, diagonal, tol=self.tol, + vectors_per_root = self.vectors_per_root ) + + return e, v + + def do_adc_ea_ip(self): + #shell for ADC computation + + def adc_diagonal(self, ds, dd, td): + #compute the diagonal of the ADC matrix as a pre-conditioner for the davidson iterations + + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + + #initialize to fock diagonal + if self.mode == 'ip': + + dh = self.eps[o, n, n] + ds[n] + + # Construct the single-singles (1h-1h) contribution + hh = np.diag(self.eps[o]) + hh += 0.25 * np.einsum('ikab,jkab->ij', td, self.gs[o, o, v, v], optimize=True) + hh += 0.25 * np.einsum('jkab,ikab->ij', td, self.gs[o, o, v, v], optimize=True) + + diagonal = np.concatenate([np.diag(hh), dh.ravel()]) + return diagonal, hh, dh + + elif self.mode == 'ea': + + dp = ds[:, :, n] - self.eps[n, n, v] + + # Construct the single-singles (1p-1p) contribution + pp = np.diag(self.eps[v]) + pp -= 0.25 * np.einsum('ijac,ijbc->ab', td, self.gs[o, o, v, v], optimize=True) + pp -= 0.25 * np.einsum('ijbc,ijac->ab', td, self.gs[o, o, v, v], optimize=True) + + diagonal = np.concatenate([np.diag(pp), -dp.ravel()]) + return diagonal, pp, dp + + def adc_initial_guess(self, diagonal, f=1): + #initial vector to start Davidson + + #get largest absolute values on diagonal matrix as best guess + args = np.argsort(np.absolute(diagonal)) + guess_vectors = np.zeros((diagonal.size, self.roots * f)) + for root in range(self.roots * f): + guess_vectors[args[root], root] = 1.0 + + return guess_vectors + + def matvec_ip(adc): + #construct the ADC blocks of IP-ADC second order matrix dot product with arbitary vector (r) + + r = np.zeros_like(adc) ; adc = np.array(adc) + r_i = r[:nocc] ; adc_i = adc[:nocc] + + adc_ija = adc[nocc:].reshape(nocc, nocc, nvir) ; r_ija = r[nocc:].reshape(nocc, nocc, nvir) + + r_i += np.dot(shp, adc_i) + r_i += np.sqrt(0.5) * np.einsum('ijak,ija->k', gs[o, o, v, o], adc_ija, optimize=True) + + r_ija += np.sqrt(0.5) * np.einsum('ijak,k->ija', gs[o, o, v, o], adc_i, optimize=True) + r_ija += np.einsum('ija,ija->ija', dhp, adc_ija, optimize=True) + + return r + + def matvec_ea(adc): + #construct the ADC blocks of EA-ADC second order matrix dot product with arbitary vector (r) + + r = np.zeros_like(adc) ; adc = np.array(adc) + r_a = r[:nvir] ; adc_a = adc[:nvir] + + adc_iab = adc[nvir:].reshape(nocc, nvir, nvir) ; r_iab = r[nvir:].reshape(nocc, nvir, nvir) + + r_a += np.dot(shp, adc_a) + r_a += np.sqrt(0.5) * np.einsum('abic,iab->c', gs[v, v, o, v], adc_iab, optimize=True) + + r_iab += np.sqrt(0.5) * np.einsum('abic,c->iab', gs[v, v, o, v], adc_a, optimize=True) + r_iab -= np.einsum('iab,iab->iab', dhp, adc_iab, optimize=True) + + return r + + #get spin versions of integrals + self.gs, self.eps, self.fs = self.get_spin_quantities() + + #get spin metrics + self.occupations, self.slice = self.get_spin_metrics() + + #do Moller-Plesset (2) + ds, dd, td = self.moller_plesset() + + #get diagonal preconditioner + diagonal, shp, dhp = adc_diagonal(self, ds, dd, td) + + #generate initial guess from diagonal + guess_vectors = adc_initial_guess(self, diagonal, self.guess_vector_factor) + + #global for this routine + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + gs = self.gs ; tol = self.tol + + matvec = matvec_ip if self.mode == 'ip' else matvec_ea + e, v, self.converged = davidson(matvec, guess_vectors, diagonal, tol=self.tol, + vectors_per_root = self.vectors_per_root) + + if self.mode == 'ip': + e = -e ; v = -v + + return e, v + +class adc_analyse(object): + #class to process results from adc calculation + + THRESHOLD = 0.1 + ORBITAL_ROOT = 1 + + def __init__(self, adc): + + self.adc = adc + self.root = -1 + + def adc_energy(self): + #ccompute the energies key is 'energy' [multiplicity, e(Hr), e(eV)] + + m = lambda x: len([n for n, i in enumerate(eigenvalue) if abs(i-x)<1e-6]) + eigenvalue = self.adc.eig_energy + + adc_energy = [] + for i in range(self.adc.roots): + multiplicity = m(eigenvalue[i]) + adc_energy.append([multiplicity, eigenvalue[i], eigenvalue[i]*getConstant('hartree->eV')]) + + return adc_energy[self.root] + + def adc_norm(self): + #compute the norms + + nocc, nvir, _ = self.adc.occupations + + blocks = {'ip':['1h', '2h-1p'] , 'ea':['1p', '2p-1h'], 'ee': ['1h-1p', '2h-2p']} + f = {'ip': nocc, 'ea': nvir, 'ee': nocc*nvir} + + mode = self.adc.mode + + #singles + v = self.adc.eig_vector[:f[self.adc.mode], self.root] + norm_single = np.einsum('i,i->', v, v, optimize=True) + + #doubles + v = self.adc.eig_vector[f[self.adc.mode]:, self.root] + norm_double = np.einsum('i,i->', v, v, optimize=True) + + adc_norm = [blocks[self.adc.mode], float(norm_single), float(norm_double)] + + return adc_norm + + def adc_state_ip_ea(self): + #compute the excitations + + has_block = [False, False, False] + dominant_state = [None, -1, None, -1] + state_cache = [] + + nocc, nvir, nrot = self.adc.occupations + s_block = {'ip': nocc, 'ea': nvir} + d_block = {'ip':(nocc, nocc, nvir), 'ea':(nocc, nvir, nvir)} + + spatial = [i//2 for i in d_block[self.adc.mode]] + + #singles excitation + u = (self.adc.eig_vector[:s_block[self.adc.mode], self.root]**2.0).reshape(s_block[self.adc.mode]) + + #aa and bb + blocks = [u[::2].ravel() , u[1::2].ravel()] + + x = np.sqrt(blocks[0] + blocks[1]) + idx = np.argsort(x)[::-1] + x = x[idx] + + dominant = np.count_nonzero(x > adc_analyse.THRESHOLD) + + if idx != [] and (self.adc.mode == 'ea'): + for n, i in enumerate(idx): + idx[n] += spatial[0] + + if idx != []: + dominant_state = [idx[0], x[0], None, -1] ; has_block[0] = True + state_cache.append([[i for i in idx[:dominant]], [i for i in x[:dominant]]]) + + #doubles excitation + u = (self.adc.eig_vector[s_block[self.adc.mode]:, self.root]**2.0).reshape(d_block[self.adc.mode]) + + #aaa, bbb, aba and baba + blocks = [u[::2,::2,::2].ravel(), u[1::2,1::2,1::2].ravel(), u[::2,1::2,::2].ravel(), u[1::2,::2,1::2].ravel()] + + for n, block in enumerate([[0,1],[2,3]]): + + x = np.sqrt(blocks[block[0]] + blocks[block[1]])*np.sqrt(2) + idx = np.argsort(x)[::-1] + x = x[idx] + + dominant = np.count_nonzero(x > adc_analyse.THRESHOLD) + ix = np.vstack(np.unravel_index(idx[:dominant], tuple(spatial))).transpose().tolist() + + #get proper sequence for virtual orbitals + if ix != []: + mask = [2] if self.adc.mode == 'ip' else [1,2] + for i in ix: + for j in mask: + i[j] += spatial[0] + + if x[0] > dominant_state[3]: dominant_state[2:] = [ix[0], x[0]] + has_block[n+1] = True + state_cache.append([ix, [i for i in x[:dominant]]]) + + return has_block, dominant_state, state_cache + + def adc_state_ee(self): + #compute the excitations + + has_block = [False, False] + dominant_state = [None, None] + state_cache = [] + + nocc, nvir, nrot = self.adc.occupations + s_block = {'ee':(nocc,nvir)} + d_block = {'ee':(nocc, nvir, nocc, nvir)} + + spatial = [i//2 for i in s_block[self.adc.mode]] + + #singles excitation + u = (self.adc.eig_vector[:nocc*nvir, self.root]**2.0).reshape(s_block[self.adc.mode]) + + blocks = [u[::2,::2].ravel(), u[1::2,1::2].ravel(), u[::2,1::2].ravel(), u[1::2,::2].ravel()] + + x = np.sqrt(blocks[0] + blocks[1] + blocks[2] + blocks[3])/np.sqrt(2) + idx = np.argsort(x)[::-1] + x = x[idx] + + dominant = np.count_nonzero(x > adc_analyse.THRESHOLD) + ix = np.vstack(np.unravel_index(idx[:dominant], tuple(spatial))).transpose().tolist() + + #get proper sequence for virtual orbitals + if ix != []: + mask = [1] + for i in ix: + for j in mask: + i[j] += spatial[0] + + has_block[0] = True + dominant_state = [ix[0], x[0]] + state_cache.append([ix, [i for i in x[:dominant]]]) + + return has_block, dominant_state, state_cache + + def summary(self): + #output to console + + if self.adc.mode == 'ip': head = ['1h','2h-1p','i','i j a'] + if self.adc.mode == 'ea': head = ['1p','2p-1h','a','i a b'] + if self.adc.mode == 'ee': head = ['1h-1p','2h-2p','i a',''] + + if self.adc.mode == 'ee': + print(' n m energy {:2s}:-----------------------> {:5s}:---->'. + format(head[0], head[1])) + print(' Hr eV norm {:1s} norm '. + format(head[2])) + print('--------------------------------------------------------------------------') + else: + print(' n m energy {:2s}:-----------------------> {:5s}:------------------------>'. + format(head[0], head[1])) + print(' Hr eV norm {:1s} norm {:7s} '. + format(head[2], head[3])) + print('-------------------------------------------------------------------------------------------') + + root = 1 ; cycle_energy = 0.0 + + #from cache and dominant root orbitals are numbered from base 0 + + for i in range(self.adc.roots): + + self.root = i + e = self.adc_energy() + n = self.adc_norm() + + #ignore 0.0000 single normed roots and only print 1 of each multiplicity + if np.isclose(n[1], 0.0000) : continue + if np.isclose(e[1], cycle_energy): + continue + else: cycle_energy = e[1] + + state = self.adc_state_ee if self.adc.mode == 'ee' else self.adc_state_ip_ea + + has_block, dominant_state, cache = state() + + print(' {:>2d} {:>2d} {:>10.6f}{:>10.6f}'. + format(root, e[0], e[1], e[2]), end='') + if self.adc.mode == 'ee' and has_block[0]: + print(' {:>8.4f} [{:>2d},{:>2d} ]{:>7.4f}'. + format(n[1], dominant_state[0][0] + adc_analyse.ORBITAL_ROOT, + dominant_state[0][1] + adc_analyse.ORBITAL_ROOT, + dominant_state[1]), end='') + elif has_block[0]: + print(' {:>8.4f} [{:>2d} ]{:>7.4f}'. + format(n[1], dominant_state[0] + adc_analyse.ORBITAL_ROOT, + dominant_state[1]), end='') + else: + print(' ', end='') + + if self.adc.mode != 'ee' and (has_block[1] or has_block[2]): + print(' {:>8.4f} [{:>2d},{:>2d},{:>2d} ]{:>7.4f}'. + format(n[2], dominant_state[2][0] + adc_analyse.ORBITAL_ROOT, + dominant_state[2][1] + adc_analyse.ORBITAL_ROOT, + dominant_state[2][2] + adc_analyse.ORBITAL_ROOT, + dominant_state[3])) + else: + print(' {:>8.4f}'.format(n[2])) + + root += 1 + + def detail(self, root): + #detailed list of excitations + + self.root = root + e = self.adc_energy() + n = self.adc_norm() + + print('\n-->state (root) {:>2d}'. + format(root)) + print(' polarization type = {:>2s} energy = {:<9.6f} eV'. + format(self.adc.mode.upper(), e[1])) + + HOMO = self.adc.occupations[0]//2 ; LUMO = HOMO + 1 + print(' multiplicity = {:>2d} homo->lumo {:>2d}->{:>2d}'.format(e[0], HOMO, LUMO)) + + state = self.adc_state_ee if self.adc.mode == 'ee' else self.adc_state_ip_ea + + block_label = {'ip':['1h','2h-1p'],'ea':['1p','2p-2h'],'ee':['1h-1p','2h-2p']} + idx_label = {'ip':['i','i j a'], 'ea':['a','i a b'], 'ee':['i a', '']} + sym_label = ['\u03B1->\u03B1','\u03B1\u03B1->\u03B2\u03B2', '\u03B1\u03B2->\u03B1\u03B2'] + + has_block, dominant_state, cache = state() + idx, x = zip(*cache) + + print('block type excitation\n--------------------------------------'.format()) + for n, block in enumerate(has_block): + + if block: + for m, i in enumerate(idx[n]): + if self.adc.mode in ['ip','ea']: + if n == 0: + print('{:<5s} {:<5s} [{:>2d} ] {:>7.4f}'. + format(block_label[self.adc.mode][min(n,1)], sym_label[n], i + adc_analyse.ORBITAL_ROOT, x[n][m])) + elif n == 1: + if (m//2)*2 == m:continue + print('{:<5s} {:<5s} [{:>2d},{:>2d},{:>2d} ] {:>7.4f}'. + format(block_label[self.adc.mode][min(n,1)], sym_label[n], i[0] + adc_analyse.ORBITAL_ROOT, + i[1] + adc_analyse.ORBITAL_ROOT, i[2] + adc_analyse.ORBITAL_ROOT, x[n][m])) + else: + print('{:<5s} {:<5s} [{:>2d},{:>2d},{:>2d} ] {:>7.4f}'. + format(block_label[self.adc.mode][min(n,1)], sym_label[n], i[0] + adc_analyse.ORBITAL_ROOT, + i[1] + adc_analyse.ORBITAL_ROOT, i[2] + adc_analyse.ORBITAL_ROOT, x[n][m])) + else: + print('{:<5s} {:<5s} [{:>2d},{:>2d} ] {:>7.4f}'. + format(block_label[self.adc.mode][min(n,1)], sym_label[n], i[0] + adc_analyse.ORBITAL_ROOT, + i[1] + adc_analyse.ORBITAL_ROOT, x[n][m])) + + def transition_density(self, root, mpdm, type='ee'): + #return the transition density for ee type + + if type != 'ee': + print('transition density only available for electron excitation') + return None + + #collect the properties needed for computation + nocc, nvir, nrot = self.adc.occupations ; n, o, v = self.adc.slice + ds, dd, td = self.adc.moller_plesset(silent=True) + + #get amplitude vectors + u1 = self.adc.eig_vector[:nocc*nvir, root].reshape(nocc, nvir) + u2 = self.adc.eig_vector[nocc*nvir:, root].reshape(nocc, nvir, nocc, nvir) + + gs, _, _ = self.adc.get_spin_quantities() + + t = np.einsum('ikac,kbjc->ijab', td, gs[o,v,o,v], optimize=True) + tD = t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + tD -= 0.5 * np.einsum('ijcd,abcd->ijab', td, gs[v,v,v,v]) + 0.5 * np.einsum('klab,klij->ijab', td, gs[o,o,o,o], optimize=True) + tD /= dd + + #the transition density matrix + dm = np.zeros((nocc+nvir, nocc+nvir)) + + #0th order + dm[v, o] += u1.transpose(1, 0) + #1st order + dm[o, v] += np.einsum('ijab,jb->ia', td, u1, optimize=True) + + #2nd order + dm[o, o] -= np.einsum('ia,ja->ij', mpdm[o,v], u1, optimize=True) + dm[o, o] += np.einsum('iakb,jkab->ij', u2, td, optimize=True) + + dm[v, v] += np.einsum('ia,ib->ab', u1, mpdm[o,v], optimize=True) + dm[v, v] -= np.einsum('iajc,ijbc->ab', u2, td, optimize=True) + + dm[o, v] -= np.einsum('ijab,jb->ia', tD, u1, optimize=True) + + dm[v, o] += 0.5 * (np.einsum('ijab,jkbc,kc->ai', td, td, u1, optimize=True) + -np.einsum('ab,ib->ai', mpdm[v,v], u1, optimize=True) + +np.einsum('ja,ij->ai', u1, mpdm[o,o], optimize=True)) + + return dm + +class hf_reference(object): + #holder class for rhf, molAtom and molBasis structures + + def __init__(self, rhf, atoms, basis, data): + + self.rhf = rhf + self.atoms = atoms + self.basis = basis + self.data = data + +class mp2_properties(object): + #class to provide mp2 density and dipoles + + def __init__(self, hf, adc): + + self.hf = hf + self.adc = adc + + def mp2_density(self, type='unrelaxed'): + #compute the mp2 level density matrix in spin basis + + ds, dd, td = self.adc.moller_plesset(silent=True) + + #particle block and enforce symmetry + oo = -0.5* np.einsum('ikab,jkab->ij', td, td, optimize=True) + oo = 0.5 * (oo + np.transpose(oo)) + + #hole block and enforce symmetry + vv = 0.5 * np.einsum('ijac,ijbc->ab', td, td, optimize=True) + vv = 0.5 * (vv + np.transpose(vv)) + + #paticle-hole block needed for relaxed density + gs, _ , _ = self.adc.get_spin_quantities() + n, o, v = self.adc.slice + ov = -0.5 * (np.einsum('ijbc,jabc->ia', td, gs[o,v,v,v], optimize=True) + + np.einsum('jkib,jkab->ia', gs[o,o,o,v], td, optimize=True) + )/ds + + if type == 'unrelaxed': ov = np.zeros_like(ov) + + dm = np.block([[oo, ov] , [np.transpose(ov), vv]]) + + return dm + + def dipoles(self): + #compute dipoles at various levels + + spin_to_spatial = lambda x: (x[::2,::2] + x[1::2,1::2] + x[::2,1::2] + x[1::2,::2]) + + #get components + from post import dipoleComponent + mu_component = [dipoleComponent(self.hf.atoms, self.hf.basis, x, 'origin') for x in ['x','y','z']] + charges = [a.number for a in self.hf.atoms] + centers = [a.center for a in self.hf.atoms] + + #ao->mo + mu_mo = np.einsum('rp,xrs,sq->xpq', self.hf.rhf.C, mu_component, self.hf.rhf.C, optimize=True) + + #compute nuclear dipole contribution + nuclear_dipole = np.einsum('i,ix->x', charges, centers) + + #HF reference dipole + nocc, nvir, _ = self.adc.occupations + + dm = np.zeros((nocc+nvir, nocc+nvir)) + np.fill_diagonal(dm[:nocc, :nocc], 1.0) + + #contract density to spatial + dm = spin_to_spatial(dm) + mu_rhf = np.asarray([np.einsum("ij,ij->", mu_mo[k], dm) for k in range(3)]) + hf_reference_dipole = nuclear_dipole - mu_rhf + + #compute unrelaxed dipole at mp2 level + udm = self.mp2_density(type = 'unrelaxed') + udm = spin_to_spatial(udm) + dm + mu_mp2 = np.asarray([np.einsum("ij,ij->", mu_mo[k], udm) for k in range(3)]) + mu_mp2_unrelaxed = nuclear_dipole - mu_mp2 + + #compute relaxed dipole at mp2 level + rdm = self.mp2_density(type = 'relaxed') + rdm = spin_to_spatial(rdm) + dm + mu_mp2 = np.asarray([np.einsum("ij,ij->", mu_mo[k], rdm) for k in range(3)]) + mu_mp2_relaxed = nuclear_dipole - mu_mp2 + + return {'hf': hf_reference_dipole, 'mpu': mu_mp2_unrelaxed, 'mpr': mu_mp2_relaxed} + +if __name__ == '__main__': + + import rhf + molAtom, molBasis, molData = rhf.mol([]) + e_scf = rhf.scf(molAtom, molBasis, molData, []) + + from basis import electronCount + + charge, electrons = [molData['charge'], electronCount(molAtom, molData['charge'])] + + adc = ADC('ee', rhf, electrons, roots=6, solve=[2, 10]) + + adc_a = adc_analyse(adc) + adc_a.summary() + adc_a.detail(0) + adc_a.detail(3) + adc_a.detail(4) + + mp_prop = mp2_properties(hf_reference(rhf, molAtom, molBasis, molData), adc) + dipoles = mp_prop.dipoles() + + print() + caption = ['hf reference dipole', 'mp2 unrelaxed dipole', 'mp2 relaxed dipole'] + for i, mu in enumerate(['hf', 'mpu', 'mpr']): + x , y, z = dipoles[mu] * getConstant('au->debye') + print('{:<20s} x= {:<8.4f} y= {:<8.4f} z= {:<8.4f} D'.format(caption[i], x, y, z)) + + + adc = ADC('ee', rhf, electrons, roots=20, solve=[2, 10]) + adc_a = adc_analyse(adc) + root = 14 + dm = adc_a.transition_density(root, mp_prop.mp2_density(type='relaxed')) + + from post import dipoleComponent + mu_component = [dipoleComponent(mp_prop.hf.atoms, mp_prop.hf.basis, x, 'origin') for x in ['x','y','z']] + charges = [a.number for a in mp_prop.hf.atoms] + centers = [a.center for a in mp_prop.hf.atoms] + + #ao->mo + mu_mo = np.kron(np.einsum('rp,xrs,sq->xpq', mp_prop.hf.rhf.C, mu_component, mp_prop.hf.rhf.C, optimize=True), np.eye(2)) + + #get transition dipole moment + tdm = np.einsum('ia,xia->x', dm, mu_mo, optimize=True) + + os = (2/3) * adc.eig_energy[root] * np.einsum('x,x->', tdm, tdm, optimize=True) + print('electric length gauge oscillator strength = {:<8.6f} for excitation {:<8.6f} eV'. + format(os , adc.eig_energy[root]*getConstant('hartree->eV'))) diff --git a/source/aello.pyx b/source/aello.pyx new file mode 100644 index 0000000..26d04ac --- /dev/null +++ b/source/aello.pyx @@ -0,0 +1,491 @@ +#cython: boundscheck=False, wraparound=False, nonecheck=False, initializedcheck=False, cdivision=True +from libc.math cimport exp, pow, tgamma, sqrt, abs +from scipy.special.cython_special cimport hyp1f1 +from atom import gaugeCenter + +import numpy as np +cimport numpy as np + +cdef double pi = 3.141592653589793238462643383279 + +#from integral - e +cdef double cye(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0): + + cdef: + double p = ie + je + double q = ie*je / p + + if n == 0: + if (type < 0) or (type > (ia + ja)): + return 0.0 + elif (ia + ja + type) == 0: + return exp(-q*r*r) + elif ja == 0: + return (1/(2 * p)) * cye(ia-1,ja,type-1,r,ie,je) - (q*r/ie) * cye(ia-1,ja,type,r,ie,je) + \ + (type+1) * cye(ia-1,ja,type+1,r,ie,je) + else: + return (1/(2 * p)) * cye(ia,ja-1,type-1,r,ie,je) + (q*r/je) * cye(ia,ja-1,type,r,ie,je) + \ + (type+1) * cye(ia,ja-1,type+1,r,ie,je) + else: + return cye(ia+1,ja,type,r,ie,je,n-1,x) + x * cye(ia,ja,type,r,ie,je,n-1,x) + +cdef double ovlp(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, int type, \ + double r0, double r1, double r2, double ie, double je): + cdef double s + s = cye(ia0, ja0, type, r0, ie, je) + s *= cye(ia1, ja1, type, r1, ie, je) + s *= cye(ia2, ja2, type, r2, ie, je) + + return s * pow(pi/(ie+je),1.5) + +cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2): + + cdef double t, s, nm + nm = sqrt(r0*r0 + r1*r1 + r2*r2) + t = p * nm * nm + + s = 0.0 + if (l+m+n) == 0: + s += pow(-2*p, bf) * boys(bf, t) + elif (l+m) == 0: + if n > 1: + s +=(n-1) * clmb(l,m,n-2,bf+1,p,r0,r1,r2) + s += r2 * clmb(l,m,n-1,bf+1,p,r0,r1,r2) + elif l == 0: + if m > 1: + s +=(m-1) * clmb(l,m-2,n,bf+1,p,r0,r1,r2) + s += r1 * clmb(l,m-1,n,bf+1,p,r0,r1,r2) + else: + if l > 1: + s +=(l-1) * clmb(l-2,m,n,bf+1,p,r0,r1,r2) + s += r0 * clmb(l-1,m,n,bf+1,p,r0,r1,r2) + + return s + + +#boys function +cdef double boys(double m,double T): + return hyp1f1(m+0.5,m+1.5,-T)/(2.0*m+1.0) + +cdef double tei(int al0, int al1, int al2, int al3, short[:,:] aa, double[:,:] an, double[:,:] ac, \ + double[:,:] ae, double[:,:] ao, int i, int j, int k, int l): + + cdef: + double s = 0.0 + int mu, nu, vu, su, tu, psi, phi, chi, alpha, beta, gamma + double f, p, q, t1, s1, s2 + double t2[3] + + for mu in range(0, al0): + for nu in range(0, al1): + for vu in range(0, al2): + for su in range(0, al3): + f = an[i,mu] * an[j,nu] * an[k,vu] * an[l,su] * ac[i,mu] * ac[j,nu] * ac[k,vu] * ac[l,su] + p = ae[i,mu] + ae[j,nu] + q = ae[k,vu] + ae[l,su] + t1 = p*q/(p+q) + for tu in range(0, 3): + t2[tu] = (ae[i,mu]*ao[i,tu] + ae[j,nu]*ao[j,tu])/p - (ae[k,vu]*ao[k,tu] + ae[l,su]*ao[l,tu])/q + + s1 = 0.0 + for psi in range(0, aa[i,0]+aa[j,0]+1): + for phi in range(0, aa[i,1]+aa[j,1]+1): + for chi in range(0, aa[i,2]+aa[j,2]+1): + for alpha in range(0, aa[k,0]+aa[l,0]+1): + for beta in range(0, aa[k,1]+aa[l,1]+1): + for gamma in range(0, aa[k,2]+aa[l,2]+1): + + s2 = cye(aa[i,0],aa[j,0],psi, ao[i,0]-ao[j,0],ae[i,mu],ae[j,nu]) * \ + cye(aa[i,1],aa[j,1],phi, ao[i,1]-ao[j,1],ae[i,mu],ae[j,nu]) * \ + cye(aa[i,2],aa[j,2],chi, ao[i,2]-ao[j,2],ae[i,mu],ae[j,nu]) + s2*= cye(aa[k,0],aa[l,0],alpha, ao[k,0]-ao[l,0],ae[k,vu],ae[l,su]) * \ + cye(aa[k,1],aa[l,1],beta, ao[k,1]-ao[l,1],ae[k,vu],ae[l,su]) * \ + cye(aa[k,2],aa[l,2],gamma, ao[k,2]-ao[l,2],ae[k,vu],ae[l,su]) + s2*= pow(-1, alpha+beta+gamma) * clmb(psi+alpha, phi+beta, chi+gamma, 0, t1, \ + t2[0],t2[1],t2[2]) + s1 += s2 + s1 *= 2 * pow(pi, 2.5) / ((p*q) * sqrt(p+q)) + s += s1 * f + return s + +#|-------------------------------------dipole helper-------------------------------------| + +cdef double mu(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction): + # dipole moment + cdef: + double p = ie + je + double[3] q, ijr + int i + double u, v, t + + for i in range(3): + q[i] = ((ie*ir[i] + je*jr[i])/p) - kr[i] + ijr[i] = ir[i] - jr[i] + + if direction == 1: + u = cye(ia[0], ja[0], 1, ijr[0], ie, je) + q[0]* cye(ia[0], ja[0], 0, ijr[0], ie, je) + v = cye(ia[1], ja[1], 0, ijr[1], ie, je) + t = cye(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + if direction == 2: + u = cye(ia[0], ja[0], 0, ijr[0], ie, je) + v = cye(ia[1], ja[1], 1, ijr[1], ie, je) + q[1]* cye(ia[1], ja[1], 0, ijr[1], ie, je) + t = cye(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + if direction == 3: + u = cye(ia[0], ja[0], 0, ijr[0], ie, je) + v = cye(ia[1], ja[1], 0, ijr[1], ie, je) + t = cye(ia[2], ja[2], 1, ijr[2], ie, je) + q[2]* cye(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + +#|---------------------------------end dipole helper-------------------------------------| + +#|------------------------------------momentum helper------------------------------------| +cdef double ang(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, double[3] kr, int direction): + # angular momentum + cdef: + double p = ie + je + double[3] ijr + int i + double u, v, t + double sd[3][3] + + for i in range(3): + ijr[i] = ir[i] - jr[i] + + for i in range(3): + sd[0][i] = cye(ia[i], ja[i], 0, ijr[i], ie, je) + sd[1][i] = cye(ia[i], ja[i], 0, ijr[i], ie, je, 1, ir[i]-kr[i]) + sd[2][i] = (ja[i] * cye(ia[i], ja[i]-1, 0, ijr[i], ie, je)) - (2.0 * je * cye(ia[i], ja[i]+1, 0, ijr[i], ie, je)) + + if direction == 1: + return -sd[0][0] * (sd[1][1] * sd[2][2] - sd[1][2] * sd[2][1]) * pow(pi/p, 1.5) + elif direction == 2: + return -sd[0][1] * (sd[1][2] * sd[2][0] - sd[1][0] * sd[2][2]) * pow(pi/p, 1.5) + elif direction == 3: + return -sd[0][2] * (sd[1][0] * sd[2][1] - sd[1][1] * sd[2][0]) * pow(pi/p, 1.5) + +#|--------------------------------end momentum helper------------------------------------| + +#get the atom and basis classes +def aello(molAtom, molBasis, mode = 'scf', density = None, gauge = None): + + cdef: + int na = len(molAtom) + int nb = len(molBasis) + int ng = len(molBasis[0].co) + int i, j, k, l, m, n, p, q + + #get largest primative length + for i in range(nb): + j = len(molBasis[i].co) + if j > ng: + ng = j + + #convert atom class properties to c views + mx = np.empty([na,3], dtype = np.double) + mz = np.empty([na], dtype = np.short) + cdef: + double[:,:] alo_x = mx + short[:] alo_z = mz + for p in range(0, na): + for q in range(0, 3): + alo_x[p,q] = molAtom[p].center[q] + alo_z[p] = molAtom[p].number + + #convert basis class properties to c-variables + me = np.empty([nb,ng], dtype = np.double) + mc = np.empty([nb,ng], dtype = np.double) + mn = np.empty([nb,ng], dtype = np.double) + ma = np.empty([nb,3], dtype = np.short) + mo = np.empty([nb,3], dtype = np.double) + ml = np.empty([nb], dtype = np.short) + cdef: + double[:,:] alo_e = me + double[:,:] alo_c = mc + double[:,:] alo_n = mn + short[:,:] alo_a = ma + double[:,:] alo_o = mo + short[:] alo = ml + + for p in range(0, nb): + alo[p] = len(molBasis[p].co) + for q in range(0, len(molBasis[p].co)): + alo_e[p,q] = molBasis[p].ex[q] + alo_c[p,q] = molBasis[p].co[q] + alo_n[p,q] = molBasis[p].normal[q] + for q in range(0, 3): + alo_a[p,q] = molBasis[p].momentum[q] + alo_o[p,q] = molBasis[p].center[q] + + if mode == 'dipole': + return aelloDipole(alo_n, alo_c, alo_e, alo_a, alo_o, alo, alo_z, alo_x, na, nb, molAtom, density, gauge) + + if mode == 'angular': + return aelloAngular(alo_n, alo_c, alo_e, alo_a, alo_o, alo, alo_z, alo_x, na, nb, molAtom, gauge) + +#-------------------------------------Begin Overlap---------------------------------------| + S = np.empty([nb,nb], dtype = np.double) + cdef: + double [:,:] overlap = S + double s, f + + for p in range(0, nb): + for q in range(p, nb): + + s = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + s += ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) * f + + overlap[p,q] = s + if p != q: + overlap[q,p] = overlap[p,q] +#----------------------------------------End Overlap----------------------------------------| + +#---------------------------------------Begin Kinetic---------------------------------------| + K = np.empty([nb,nb], dtype = np.double) + cdef: + double[:,:] kinetic = K + double t1, t2, t3 + + for p in range(0, nb): + for q in range(p, nb): + + s = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + t1 = alo_e[q,j] * (2*(alo_a[q,0] + alo_a[q,1] + alo_a[q,2]) + 3) * \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + + t2 = -2 * alo_e[q,j] * alo_e[q,j] * ( \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0]+2, alo_a[q,1], alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1]+2, alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2]+2, \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) ) + + + t3 = alo_a[q,0] * (alo_a[q,0] - 1) * \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0]-2, alo_a[q,1], alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + t3 +=alo_a[q,1] * (alo_a[q,1] - 1) * \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1]-2, alo_a[q,2], \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + t3 +=alo_a[q,2] * (alo_a[q,2] - 1) * \ + ovlp(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2]-2, \ + 0 ,alo_o[p,0] - alo_o[q,0], alo_o[p,1] - alo_o[q,1], alo_o[p,2] - alo_o[q,2], \ + alo_e[p,i], alo_e[q,j]) + + s += (t1 + t2 - 0.5*t3) * f + + kinetic[p,q] = s + if p != q: + kinetic[q,p] = kinetic[p,q] +#----------------------------------------End Kinetic----------------------------------------| + +#---------------------------------------Begin Coulomb---------------------------------------| + J = np.empty([nb,nb], dtype = np.double) + cdef: + double[:,:] coulomb = J + double r[3] + double cp + + for p in range(0, nb): + for q in range(p, nb): + + t1 = 0.0 + for k in range(0, na): + + s = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + cp = alo_e[p,i] + alo_e[q,j] + for n in range(0, 3): + r[n] = ((alo_e[p,i] * alo_o[p,n]) + (alo_e[q,j] * alo_o[q,n]))/cp - alo_x[k,n] + + t2 = 0.0 + for l in range(0, alo_a[p,0]+alo_a[q,0]+1): + for m in range(0, alo_a[p,1]+alo_a[q,1]+1): + for n in range(0, alo_a[p,2]+alo_a[q,2]+1): + t2 += cye(alo_a[p,0], alo_a[q,0], l, alo_o[p,0]- alo_o[q,0], alo_e[p,i], alo_e[q,j]) * \ + cye(alo_a[p,1], alo_a[q,1], m, alo_o[p,1]- alo_o[q,1], alo_e[p,i], alo_e[q,j]) * \ + cye(alo_a[p,2], alo_a[q,2], n, alo_o[p,2]- alo_o[q,2], alo_e[p,i], alo_e[q,j]) * \ + clmb(l, m, n, 0, cp, r[0], r[1], r[2]) + + t2 = t2 * pi * 2.0 / cp + s += t2 * f + t1 -= s * alo_z[k] + coulomb[p,q] = t1 + if p != q: + coulomb[q,p] = coulomb[p,q] + +#----------------------------------------End Coulomb----------------------------------------| + +#----------------------------------Begin electron repulsion---------------------------------| + i = int(nb*(nb-1)/2 + nb) + j = (i*(i+1)/2) + I = np.empty([j], dtype=np.double) + cdef: + double[:] eri = I + int idx + for i in range(0, nb): + for j in range(0, i+1): + m = i * (i+1)/2 + j + for k in range(0, nb): + for l in range(0, k+1): + n = k*(k+1)/2 + l + if m >= n: + idx = int(m*(m+1)/2 + n) + I[idx] = tei(alo[i], alo[j], alo[k], alo[l], alo_a, alo_n, alo_c, alo_e, alo_o, i, j, k, l) +#|----------------------------------End electron repulsion----------------------------------| + + return S, K, J, I + +#---------------------------------------Begin Dipole----------------------------------------| +cpdef aelloDipole(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, \ + short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, double[:,:] density, str gauge): + + D = np.empty([nb,nb], dtype = np.double) + cdef: + double[:,:] dipole = D + double[3] gaugeOrigin = gaugeCenter(molAtom, gauge) + int direction, p, q, i, j + double s, f + double[3] dipoleComponent + + for direction in range(1,4): + #electronic component + for p in range(0, nb): + for q in range(p, -1, -1): + + s = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + s += mu([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], \ + [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + gaugeOrigin, direction) * f + + dipole[p, q] = s + if p != q: + dipole[q,p] = dipole[p,q] + + s =0.0 + for p in range(0, nb): + for i in range(0, nb): + s += -2.0 * density[p,i] * dipole[i,p] + + #nuclear component and charge center adjustment + for i in range(0, na): + s += alo_z[i] * (alo_x[i, direction-1] - gaugeOrigin[direction-1]) + + dipoleComponent[direction-1] = s + + return dipoleComponent +#|-----------------------------------------End Dipole---------------------------------------| + +#----------------------------------------Begin Angular--------------------------------------| + +cpdef aelloAngular(double[:,:] alo_n, double[:,:] alo_c, double[:,:] alo_e, short[:,:] alo_a, double[:,:] alo_o, \ + short[:] alo, short[:] alo_z, double[:,:] alo_x, int na, int nb, object molAtom, str gauge): + + A = np.empty([3,nb,nb], dtype = np.double) + cdef: + double[:,:,:] angular = A + double[3] gaugeOrigin = gaugeCenter(molAtom, gauge) + int direction, p, q, i, j + double s, f + + for direction in range(0, 3): + #electronic component + for p in range(0, nb): + for q in range(0, p+1): + + s = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + s += ang([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], \ + [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + gaugeOrigin, direction+1) * f + + angular[direction, p, q] = s + if p != q: + angular[direction,q,p] = -angular[direction,p,q] + + + + return A + +#|----------------------------------------End Angular---------------------------------------| + +#|---------------------------------------fock build-----------------------------------------| +cdef long iEri(long i, long j, long k, long l): + #eri indexing + cdef: + long p = max(i*(i+1)//2 + j, j*(j+1)//2 + i) + long q = max(k*(k+1)//2 + l, l*(l+1)//2 + k) + + return long(max(p*(p+1)//2 + q, q*(q+1)//2 + p)) + + +cpdef aelloFock(long n, double[:,:] H, double[:] eri, double[:,:] D): + #fast Fock build + fock = np.empty([n,n], dtype=np.double) + g = np.empty([n,n], dtype=np.double) + cdef: + long i, m, k, l + double[:,:] F = fock + double[:,:] G = g + + for i in range(0, n): + for m in range(0, n): + G[i,m] = 0.0 + for k in range(0, n): + for l in range(0, n): + G[i,m] += D[k,l] * ( 2* eri[iEri(i,m,k,l)] - eri[iEri(i,k,m,l)]) + F[i,m] = H[i,m] + G[i,m] + + return fock, G + +#|------------------------------------End Fock Build-------------------------------------| + +#|----------------------------------Complex Fock Build-----------------------------------| +cpdef tdhfFock(long n, double complex[:,:] D, double complex[:,:] H, double complex[:] eri): + #complex fock build for tdhf + fock = np.empty([n,n], dtype=np.cdouble) + g = np.empty([n,n], dtype=np.cdouble) + cdef: + long i, m, k, l + double complex[:,:] F = fock + double complex[:,:] G = g + + for i in range(0, n): + for m in range(0, n): + G[i,m] = 0.0 + for k in range(0, n): + for l in range(0, n): + G[i,m] = G[i,m] + D[k,l] * ( 2.0 * eri[iEri(i,m,k,l)] - eri[iEri(i,k,m,l)]) + F[i,m] = H[i,m] + G[i,m] + + return fock + + + + diff --git a/source/atom.py b/source/atom.py new file mode 100644 index 0000000..4f92b2e --- /dev/null +++ b/source/atom.py @@ -0,0 +1,445 @@ +from __future__ import division +from numpy import zeros, cross, dot, array, sqrt, pi, asarray, ndarray +from numpy.linalg import norm, eig +from math import asin, acos, atan2, cos, sin + +weight = array([1.00784, 4.002602, 6.938, 9.0121831, 10.806, 12.0096, 14.00643, 15.99903, 18.998403163, 20.1797, + 22.98976928, 24.304, 26.9815384, 28.084, 30.973761998, 32.059, 35.446, 39.792, 39.0983, 40.078, 44.955908, + 47.867, 50.9415, 51.9961, 54.938043, 55.845, 58.933194, 58.6934, 63.546, 65.38, 69.723, 72.630, 74.921595, + 78.971, 79.901, 83.798, 85.4678, 87.62, 88.90584, 91.224, 92.90637, 95.95, 98, 101.07, 102.90549, 106.42, + 107.8682, 112.414, 114.818, 118.710, 121.760, 127.60, 126.90447, 131.293, 132.90545196, 137.327, 138.90547, + 140.116, 140.90766, 144.242, 145, 150.36, 151.964, 157.25, 158.925354, 162.500, 164.930328, 167.259, 168.934218, + 173.045, 174.9668, 178.486, 180.94788, 183.84, 186.207, 190.23, 192.217, 195.084, 196.966570, 200.592, 204.382, + 207.2, 208.98040, 209, 210, 222]) + +covalentRadius = array([31, 28, 128, 96, 84, 73, 71, 66, 57, 58, 166, 141, 121, 111, 107, 105, 102, 106, + 203, 176, 170, 160, 153, 139, 139, 132, 126, 124, 132, 122, 122, 120, 119, 120, 120, 116, 220, 195, 190, + 175, 164, 154, 147, 146, 142, 139, 145, 144, 142, 139, 139, 138, 139, 140, 224, 215, 207, 204, 203, 201, + 199, 198, 198, 196, 194, 192, 192, 189, 190, 187, 187, 187, 175, 162, 151, 144, 141, 136, 136, 132, 145, + 146, 148, 140, 150, 150]) + +symbol = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', + 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', + 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu','Rb', + 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', 'Hf', + 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn'] + +class atom(object): + + def __init__(self,id,number,center=zeros(3)): + self.id = id + self.number = number + self.center = array(center) + +def seperation(atoms, i, j, unit='b'): + #length of vector ij + + d =0.0 + for dim in range(0,3): + d += (atoms[i].center[dim] - atoms[j].center[dim])**2 + d = sqrt(d) + + if unit == 'a': + return d * getConstant('bohr->angstrom') + else: + return d + +def angle(atoms,i,j,k): + #angle between vectors ij and jk + + u = zeros(3) + v = zeros(3) + + for dim in range(0,3): + u[dim] = atoms[j].center[dim] - atoms[i].center[dim] + v[dim] = atoms[j].center[dim] - atoms[k].center[dim] + + return acos(dot(u,v)/(norm(v)*norm(u)))*getConstant('radian->degree') + +def oopAngle(atoms, i, j, k, l): + #for i the angle between vector ik and normal to plane jkl + + u = zeros(3) + v = zeros(3) + w = zeros(3) + + for dim in range(0,3): + u[dim] = atoms[i].center[dim] - atoms[k].center[dim] + v[dim] = atoms[j].center[dim] - atoms[k].center[dim] + w[dim] = atoms[l].center[dim] - atoms[k].center[dim] + + u /= norm(u) + v /= norm(v) + w /= norm(w) + + vw = cross(v,w) + + angle = dot(vw,u)/norm(vw) + return asin(angle)*getConstant('radian->degree') + +def dihedral(atoms,i,j,k,l): + #angle between planes ijk and jkl + + u = zeros(3) + v = zeros(3) + w = zeros(3) + + + for dim in range(0,3): + u[dim] = atoms[i].center[dim] - atoms[j].center[dim] + v[dim] = atoms[j].center[dim] - atoms[k].center[dim] + w[dim] = atoms[k].center[dim] - atoms[l].center[dim] + + u /= norm(u) + v /= norm(v) + w /= norm(w) + + uv = cross(u,v) + vw = cross(v,w) + uvv = cross(uv,v) + + return atan2(dot(uvv,vw),dot(uv,vw))*getConstant('radian->degree') + +def massCenter(atoms): + #total mass of system + w = 0.0 + for i in range(0 , len(atoms)): + w += weight[atoms[i].number-1] + + com = zeros(3) + for dim in range(0,3): + for i in range(0, len(atoms)): + com[dim] += atoms[i].center[dim] * weight[atoms[i].number-1]/w + + return com + +def isBond(atoms,i,j): + #if sum of covalent radii of i and j is less than seperation + + if i == j: return False + + sumRadii = (covalentRadius[atoms[i].number-1] + covalentRadius[atoms[j].number-1]) * getConstant('picometre->bohr') + + if seperation(atoms,i,j) < 1.6 * sumRadii: + return True + else: + return False + +def bondMatrix(atoms): + # construct connection matrix for molecule + + joins = zeros([len(atoms), len(atoms)]) + + for i in range(0, len(atoms)): + for j in range(i+1, len(atoms)): + joins[i,j] = isBond(atoms,i,j) + #symmetrise + joins = joins + joins.T + + return joins + +def inertiaTensor(atoms): + #compute the moment of inertia tensor for molecule + + inertiaTensor = zeros([3,3]) + comFrame = zeros([len(atoms),3]) + + com = massCenter(atoms) + #transfer to center of mass frame + for i in range(0,len(atoms)): + for dim in range(0, 3): + comFrame[i,dim] = atoms[i].center[dim] - com[dim] + + for i in range(0,len(atoms)): + w = weight[atoms[i].number-1] + for dim in range(0,3): + #diagonal elements + inertiaTensor[dim,dim] += w * (comFrame[i, (dim+1) % 3]**2 + comFrame[i, (dim+2) % 3]**2) + #off-diagonal elements + inertiaTensor[dim, (dim+1) % 3] -= w * comFrame[i, dim]*comFrame[i, (dim+1) % 3] + #symmetrize + inertiaTensor[(dim+1) % 3, dim] = inertiaTensor[dim, (dim+1) % 3] + + return inertiaTensor + +def principalMoments(atoms): + #compute principal moments of inertia (amu bohr2) + + tensor = inertiaTensor(atoms) + + principalMoments, V = eig(tensor) + #order ascending + idx = principalMoments.argsort() + + return principalMoments[idx] + +def rotor(atoms): + #compute rotor type + + epsilon = 1e-8 + pm = principalMoments(atoms) + + type = '' + + if len(atoms) == 2: + return 'diatomic' + elif pm[0] < epsilon: + return 'linear' + elif (abs(pm[0] - pm[1]) < epsilon) and (abs(pm[1] - pm[2]) < epsilon): + return 'spherical top' + elif (abs(pm[0] - pm[1]) < epsilon) and (abs(pm[1] - pm[2]) < epsilon): + return 'spherical top' + elif (abs(pm[0] - pm[1]) < epsilon) and (abs(pm[1] - pm[2]) > epsilon): + return 'oblate spherical top' + elif (abs(pm[0] - pm[1]) > epsilon) and (abs(pm[1] - pm[2]) < epsilon): + return 'prolate spherical top' + else: + return 'asymmetric top' + +def rotationalConstants(atoms): + #compute the rotational constants (/cm) + + rotor = zeros(3) + + #principal moments + pm = principalMoments(atoms) + + for dim in range(0, 3): + rotor[dim] = getConstant('planck')/(8.0*pi*pi*getConstant('c') * \ + getConstant('bohr->cm') * getConstant('bohr->cm')) + if pm[dim] != 0: + rotor[dim] /= pm[dim]* getConstant('dalton->gm') + + return rotor + +def nuclearRepulsion(atoms): + #compute the repulsion of the nucleii + + energy = 0.0 + for i in range(0, len(atoms)): + for j in range(i+1 , len(atoms)): + energy += atoms[i].number*atoms[j].number/seperation(atoms,i,j) + + return energy + +def nuclearChargeCenter(atoms): + #compute the center of the nuclear charge + #total charge + charge = 0.0 + for i in range(0, len(atoms)): + charge += atoms[i].number + + chargeCenter = zeros(3) + for dim in range(0, 3): + for i in range(0, len(atoms)): + chargeCenter[dim] += atoms[i].center[dim] * atoms[i].number/charge + + return chargeCenter + +def getMass(molAtom, atom): + #return the atom weight + + return weight[molAtom[atom].number-1] + +def getNumber(atomicSymbol): + #get the atomic number from symbol + i = symbol.index(atomicSymbol) + + return i+1 + +def gaugeCenter(atoms, mode = 'origin'): + #set the gauge center + + if isinstance(mode, str): + if mode == 'origin': + return array([0,0,0]) + elif mode == 'mass': + return massCenter(atoms) + elif mode == 'nuclear charge': + return nuclearChargeCenter(atoms) + + elif isinstance(mode, ndarray): + return mode + +def getConstant(unit): + unitDict = {'bohr->angstrom' : 0.52917721092, 'picometre->bohr' : 0.018897261339213, 'radian->degree': 180.0/pi, \ + 'planck' : 6.62607015e-34, 'bohr->cm' : 0.529177249e-10, 'c' : 2.99792458e10 , 'dalton->gm' : 1.6605402e-27, \ + 'em2->amu' : 1822.8884850, 'atu->femtosecond' : 0.02418884254, 'hartree->eV' : 27.21138505, 'au->debye' : 2.541580253, \ + 'alpha' : 0.00729735256, 'eV[-1]->nm' : 1239.841701, 'Eh' : 4.359744722207e-18, 'avogadro' : 6.022140857e+23, \ + 'electric constant' : 8.854187817e-12 , 'e' : 1.6021766208e-19, 'bohr magneton' : 9.274009994e-24, 'rydberg->eV':13.6056980659} + + return unitDict[unit] + +def zMatrix(input): + #compute cartesians from z-matrix + + def rodriguez(axis, theta): + #rotation matrix generator + + axis /= norm(axis) + psi = cos(theta/2) + + i,j,k = -axis * sin(theta/2) + + return asarray([[psi*psi+i*i-j*j-k*k,2*(i*j-psi*k),2*(i*k+psi*j)], \ + [2*(i*j+psi*k), psi*psi+j*j-i*i-k*k, 2*(j*k-psi*i)], \ + [2*(i*k-psi*j),2*(j*k+psi*i),psi*psi+k*k-i*i-j*j]]) + + + def getSymbolValue(s, input): + #find numeric replacement for symbol + + stream = len(input) -1 + for i in range(stream, -1, -1): + data = input[i].split() + if len(data)==0:continue + if data[0] == s: + return data[1] + + return 'failed to find symbol [', s , ']' + + def isSymbol(s): + #check if arguement(s) is representation of number [false] or symbol [True] + + sym = False + try: + float(s) + except: + sym = True + + return sym + + def getValue(item, type, input): + #return numeric value of stretch, bend or dihedral + + if isSymbol(item): + val = getSymbolValue(item, input) + else: + val = item + #return as float and in radians for angular type + val = float(val) + if type in 'bt': val *= pi/180.0 + + return val + + def clean(val, mode): + #strip out 'X' dummy atoms and blank line at ends + + if mode == 1: + while True: + b = False + for i in range(len(val)): + if val[i][1] == -1: + del val[i] + b = True + if b: break + if not b:break + + if mode == 2: + for i in range(len(val)): + if len(val[i]) != 0: break + del val[i] + + for i in range(len(val)-1, -1): + if len(val[i]) != 0: break + del val[i] + + return val + + def processAtom(atom, input, geo=None): + #process the input line for each atom + + data = input[atom].split() + z = data[0] + + #non-general atoms + if atom >=1: + a = data[1] + stretch = getValue(data[2],'s', input) + if atom >= 2: + b = data[3] + bend = getValue(data[4],'b', input) + if atom >= 3: + t = data[5] + dihedral = getValue(data[6],'t', input) + + if atom == 0: return z, [0,0,0] + if atom == 1: return z, [stretch,0,0] + if atom == 2: + + a = int(data[1])-1 + b = int(data[3])-1 + + ap = coordinates[a,:] + bp = coordinates[b,:] + + u = bp - ap + + w = stretch*u/norm(u) + w = dot(rodriguez([0,0,1],bend),w) + + return z, w + ap + + #general atom processing + if atom >= 3: + + a = int(data[1])-1 + b = int(data[3])-1 + c = int(data[5])-1 + + ap = coordinates[a,:] + bp = coordinates[b,:] + cp = coordinates[c,:] + + u = bp-ap + v = bp-cp + + #vector a->b length s + w = stretch*u/norm(u) + + #normal to plane abc + n = cross(u, v) + #rotation of w by b about n + w = dot(rodriguez(n,bend),w) + #rotation of w by dihedral about u + w = dot(rodriguez(u,dihedral),w) + + #return atomic symbol and coordinates + return z, w + ap + + #strip control character '\t' and calculate number of atoms + bAtom = True + atoms = 0 + + input = clean(input,2) #strip leading and trailing blank lines + for i in range(len(input)): + input[i] = input[i].replace('\t',' ') + + #first blank line is start of symbols and end of atom definitions + if bAtom and (len(input[i]) == 0): + bAtom = False + atoms = i + #no symbols + if bAtom: atoms = len(input) + + #define array for geometry + coordinates = zeros((atoms,3)) + z = [] + + for i in range(atoms): + s, coordinates[i,:] = processAtom(i, input, coordinates) + if s != 'X': n = getNumber(s) + else: n = -1 + z.append([str(i+1), n, coordinates[i,0],coordinates[i,1],coordinates[i,2]]) + + #remove dummy atoms from final list and return [id, Z, x, y, z] + + return clean(z,1) + +def atomList(molAtom): + #generate a list of atom type for each atom in molecule + atoms = [] + for a in molAtom: + atoms.append(a.number) + + return atoms \ No newline at end of file diff --git a/source/basis.py b/source/basis.py new file mode 100644 index 0000000..fd06147 --- /dev/null +++ b/source/basis.py @@ -0,0 +1,283 @@ +from __future__ import division +from numpy import sqrt, sort, zeros, array +from math import sqrt, pi, pow +from atom import symbol +from scipy.special import factorial2 as df + +subshell = {'s': [[0, 0, 0]], \ + 'p': [[1, 0, 0], [0, 1, 0], [0, 0, 1]], \ + 'd': [[2, 0, 0], [1, 1, 0], [1, 0, 1], [0, 2, 0], [0, 1, 1], [0, 0, 2]], \ + 'f': [[3, 0, 0], [2, 1, 0], [2, 0, 1], [1, 2, 0], [1, 1, 1], [1, 0, 2], [0, 3, 0], [0, 2, 1], [0, 1, 2], [0, 0, 3]]} + +class basis(object): + + def __init__(self, atom, symbol, center= zeros(3), momentum = zeros(0), ex = zeros(0), co = zeros(0) , normal = zeros(0) ): + self.atom = atom + self.symbol = symbol + self.center = array(center) + self.momentum = array(momentum) + self.ex = ex + self.co = co + self.normal = normal + +def electronCount(atoms, charge): + #compute the number of electrons + + n = 0 + for i in range(0, len(atoms)): + n += atoms[i].number + + #adjust for change + n -= charge + + return n + +def species(atoms): + #get a list of different atom types + z = zeros(len(atoms)) + for i in range(0, len(atoms)): + z[i] = atoms[i].number + + #order + z = sort(z) + #unique list + unique = [] + unique.append(int(z[0])) + for i in range(1, len(z)): + if z[i] != unique[-1]: + unique.append(int(z[i])) + + return unique + +def checkBasis(name, atoms): + #is basis supported + f = open('../basis/' + name + '.gbf','r') + try: + f.close() + except FileNotFoundError: + return False + + #does basis support atom type, last types entry is greatest z + types = species(atoms) + if (name in ['sto-3g', '3-21g']) and (types[-1] > 54): + print('Atom not supported for ' + name + ' basis set') + return False + if (name == 'dz') and (types[-1] > 17): + print('Atom not supported for ' + name + ' basis set') + return False + if (name in ['6-31g','aug-cc-pvdz','cc-pvdz']) and (types[-1] > 36): + print('Atom not supported for ' + name + ' basis set') + return False + + return True + +def principalQuantumNumber(basis): + #compute principal quantum number of subshell + n = 1 + for i in range(0, 3): + n += basis.momentum[i] + + return n + +def basisNormalise(basis): + #normalise the primatives + + #get principal quantum number + n = principalQuantumNumber(basis) - 1 + + normalisedBasis = zeros(len(basis.ex)) + + for i in range(0, len(basis.ex)): + num = pow(2*basis.ex[i]/pi, 0.75) * pow(4*basis.ex[i], n/2) + den = sqrt(df(2*basis.momentum[0]-1) * df(2*basis.momentum[1]-1) * df(2*basis.momentum[2]-1)) + normalisedBasis[i] = num/den + + #normalise coefficients + prefactor = (pi ** 1.5) * df(2*basis.momentum[0] - 1) * \ + df(2*basis.momentum[1] - 1) * \ + df(2*basis.momentum[2] - 1) / (2 ** n) + + s = 0.0 + for i in range(0,len(basis.ex)): + for j in range(0,len(basis.ex)): + s += normalisedBasis[i] * normalisedBasis[j] * basis.co[i] * basis.co[j] \ + / pow( (basis.ex[i] + basis.ex[j]) , (n + 1.5)) + + s *= prefactor + s = 1/sqrt(s) + + for i in range(0, len(basis.co)): + basis.co[i] *= s + + basis.normal = normalisedBasis + + return basis + +def buildBasis(atoms,name): + #read basis information for each atom type in molecule + types = species(atoms) + + #molecular basis + molBasis = [] + + #open 'g'aussian 'b'asis 'f'ile + f = open('../basis/' + name + '.gbf', 'r') + data = [] + + #construct basis for atom type - construct atomic basis + atomBasis = [] + + #cycle through unique atoms list + for i in range(0, len(types)): + sym = symbol[types[i]-1] + + #find atomic symbol + while f: + line = f.readline().strip() + if line[:2].strip() == sym: + #S could be element or shell - element lines eg S 0 + data = line.split() + if data[1] == '0': + break + + momentum = [] + primatives = [] + exponents = [] + coefficients = [] + coefficientp = [] + + while True: + #get momentum header eg S 3 1.0 + data = f.readline().split() + if data[0] == '****': + break + momentum.append(data[0].lower()) + primatives.append(int(data[1])) + + #read primatives + for j in range(0, int(primatives[-1])): + data = f.readline().split() + + exponents.append(float(data[0].replace('D','e'))) + if 's,p,d,f'.rfind(momentum[-1]) >= 0: + coefficients.append(float(data[1].replace('D','e'))) + else: + coefficients.append(float(data[1].replace('D','e'))) + coefficientp.append(float(data[2].replace('D','e'))) + + start = 0 + pStart = 0 + for j in range(0, len(momentum)): + end = start + primatives[j] + if momentum[j] != 'sp': + for angular in range(0, len(subshell[momentum[j]])): + atomBasis.append(basis(types[i], orbitalType(subshell[momentum[j]][angular]), \ + [0,0,0] ,subshell[momentum[j]][angular], exponents[start:end], \ + coefficients[start:end])) + else: + atomBasis.append(basis(types[i], orbitalType(subshell['s'][0]) , \ + [0,0,0], subshell['s'][0], exponents[start:end], coefficients[start:end])) + + for angular in range(0, len(subshell['p'])): + atomBasis.append(basis(types[i], orbitalType(subshell['p'][angular]) , \ + [0,0,0], subshell['p'][angular], exponents[start:end], coefficientp[pStart:pStart+primatives[j]])) + pStart = primatives[j] + start = end + + #assign atomBasis to each atom of that type - construct molecular basis + for i in range(0, len(atoms)): + for j in range(0, len(atomBasis)): + if atoms[i].number == atomBasis[j].atom: + molBasis.append(basis(i, atomBasis[j].symbol, atoms[i].center, atomBasis[j].momentum, \ + atomBasis[j].ex, atomBasis[j].co)) + #add normalisation factor + molBasis[-1] = basisNormalise(molBasis[-1]) + + #prefix orbital type with shell and sort + orbitalShell(molBasis) + molBasis.sort(key=lambda b: (b.atom, 'spdf'.index(b.symbol[1]), b.symbol[0])) + + return molBasis + +def orbitalType(subShell): + #get the orbital symbol from momentum tuple + name = { '[000]' : 's' , \ + '[100]' : 'px', '[010]' : 'py' , '[001]' : 'pz' , \ + '[200]' : 'dxx', '[110]' : 'dxy', '[101]' : 'dxz', '[020]' : 'dyy', '[011]' : 'dyz', '[002]' : 'dzz' , \ + '[300]' : 'fxxx', '[210]' : 'fxxy' , '[201]' : 'fxxz' , '[120]' : 'fxyy' , '[111]' : 'fxyz' , '[102]' : 'fxzz' , \ + '[030]' : 'fyyy' , '[021]' : 'fyyz' , '[012]' : 'fyzz' , '[003]' : 'fzzz' } + + return name['[' + ''.join(str(e) for e in subShell) + ']'] + +def aufbau(atom): + #implementation to f-orbitals {s,p,d,f} so shells {K,L,M,N}, n {1,2,3,4} + + principal = [] # list principal quantum number + azimuthal = [] # list of azimuthal quantum numbers, n[i], l[i] give eg the 2, p respectively designation + # for orbital i + order = [] + for n in range(1, len(subshell)+1): + for a in range(0,n): + principal.append(n) + azimuthal.append(a) + #aufbau -> order is (n+l) and where (n+l)'s are equal then smallest n applies + order.append(n+a) + + #create hash of 10*(n+l) +n this is the correct aufbau order + for i in range(0 , len(order)): + order[i] = 10*order[i] + principal[i] + + #sort 'order' into ascending order and we have aufbau occupancy order + order.sort() + + #reverse hash to generate eg 1s, 2p etc + orbitalCode = ['s' , 'p', 'd', 'f'] + orbitals = [] + for i in range(0 , len(order)): + n = order[i] - (order[i]//10) * 10 + l = order[i]//10 - n + orbitals.append(str(n) + orbitalCode[l]) + + + orbitalCapacity = { 's' : 2 , 'p' : 2+4 , 'd' : 2+4+4 , 'f' : 2+4+4+4 } + + #loop over the orbitals in order accumulating total electrons until get to atomic number of 'atom' + electronCount = 0 + effectiveAN = atom.number + orbitalSequence = '' + + for i in range(0 , len(order)): + e = orbitalCapacity[orbitals[i][-1]] + electronCount += e + #build sequence + orbitalSequence += orbitals[i] + + if electronCount >= effectiveAN: + #enough orbitals + orbitalSequence += '' + str(effectiveAN) + '' + break + else: + # need (at least) another orbital + orbitalSequence += '' + str(e) + '' + effectiveAN -= e + electronCount = 0 + + return orbitalSequence + +def orbitalShell(molBasis): + #prefix orbital type with shell + + atom = -1 + lowest = {'s':1,'p':2,'d':3,'f':4} + + for mol in molBasis: + if mol.atom != atom: + atom = mol.atom + n = {} + sym = mol.symbol + if not sym in n.keys(): n[sym] = lowest[sym[0]] + mol.symbol = str(n[sym]) + sym + n[sym] += 1 + + + diff --git a/source/bomd.py b/source/bomd.py new file mode 100644 index 0000000..7267f55 --- /dev/null +++ b/source/bomd.py @@ -0,0 +1,428 @@ +from __future__ import division +from atom import getMass, getConstant +from force import forces +import numpy as np +import matplotlib.pyplot as plt +from math import acos +from scipy import signal +import rhf +import time + +def mdBornOppenheimer(timeIncrement, iterations, integrator = 'velocity-verlet', out=['plot','file']): + + #constants relative atomic masses to atomic units and atomic time units to (femto) seconds + em2amu = getConstant('em2->amu') + toFemtoSeconds =getConstant('atu->femtosecond') + + #initial scf calculation + molAtom, molBasis, molData = rhf.mol([]) + totalEnergy = rhf.scf(molAtom, molBasis, molData , []) + + #titles + name, basisName = [molData['name'], molData['basis']] + + #initial forces + force = [] + vis = forces(molAtom, molBasis, rhf.density, rhf.fock) + force.append(vis) + + #initial velocities - start at rest + velocity = np.zeros_like(vis) + + #initial geometry + geo = np.zeros_like(vis) + for a in range(vis.shape[0]): + geo[a,:] = molAtom[a].center[:] + + #output set-up + if 'file' in out: + #output to file - number of atoms, number of iterations + #file will be of length 1 + number of iterations * number of atoms + f = open('md.hdf','w') + f.write(name + ' ' + basisName + ' ' + integrator + '\n') + f.write("%2d" % vis.shape[0] + ' ' + "%4d" % iterations + ' ' + "%4d" % timeIncrement + '\n') + f.write("%.2f" % 0 + ' ' + "%12.8f" % totalEnergy + ' ' + "%8.3f" % 0 + '\n') + if 'plot' in out: + energy = [] + + #initial state + for a in range(vis.shape[0]): + if 'file' in out: + f.write('{0:10.6f} {1:10.6f} {2:10.6f} {3:10.6f} {4:10.6f} {5:10.6f} {6:10.6f} {7:10.6f} {8:10.6f} \n'.format(geo[a,0], geo[a,1],geo[a,2], \ + velocity[a,0], velocity[a,1], velocity[a,2], \ + force[0][a,0], force[0][a,1], force[0][a,2])) + if 'plot' in out: + energy.append(totalEnergy) + + + t = time.time() + for cycle in range(1, iterations): + + if (integrator == 'velocity-verlet') or ((integrator in ['beeman','adams-moulton']) and (cycle == 1)): + #update position + for a in range(vis.shape[0]): + for cart in range(3): + geo[a, cart] += velocity[a,cart] * timeIncrement + 0.5 * timeIncrement * timeIncrement * force[-1][a,cart] / (getMass(molAtom, a) * em2amu) + + #run scf for new position + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + totalEnergy = rhf.scf(molAtom, molBasis, molData , [], rhf.density) + + #get new forces + vis = forces(molAtom, molBasis, rhf.density, rhf.fock) + force.append(vis) + + #update velocity + for a in range(vis.shape[0]): + for cart in range(3): + velocity[a,cart] += 0.5 * timeIncrement * (force[-2][a,cart] + force[-1][a,cart]) / (getMass(molAtom, a) * em2amu) + + elif integrator in ['beeman','adams-moulton']: + #update position + for a in range(vis.shape[0]): + for cart in range(3): + geo[a, cart] += velocity[a, cart] * timeIncrement + timeIncrement* timeIncrement * (4.0 * force[-1][a, cart] - force[-2][a, cart] ) \ + / (getMass(molAtom, a) * em2amu * 6.0) + + #run scf for new position + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + totalEnergy = rhf.scf(molAtom, molBasis, molData , [], rhf.density) + + #get new forces + vis = forces(molAtom, molBasis, rhf.density, rhf.fock) + force.append(vis) + + #update velocity + if integrator == 'beeman': + for a in range(vis.shape[0]): + for cart in range(3): + velocity[a, cart] += timeIncrement * (2.0 * force[-1][a, cart] + 5.0 * force[-2][a, cart] - force[-3][a, cart]) \ + / (getMass(molAtom, a) * em2amu * 6.0) + elif integrator == 'adams-moulton': + for a in range(vis.shape[0]): + for cart in range(3): + velocity[a, cart] += timeIncrement * (5.0 * force[-1][a, cart] + 8.0 * force[-2][a, cart] - force[-3][a, cart]) \ + / (getMass(molAtom, a) * em2amu * 12.0) + + + elapsed = (cycle + 1) * timeIncrement + + if 'file' in out: + #write output file + f.write("%.2f" % elapsed + ' ' + "%12.8f" % totalEnergy + ' ' + "%8.3f" % (time.time() - t) + '\n') + for a in range(vis.shape[0]): + f.write('{0:10.6f} {1:10.6f} {2:10.6f} {3:10.6f} {4:10.6f} {5:10.6f} {6:10.6f} {7:10.6f} {8:10.6f} \n'.format(geo[a,0], geo[a,1],geo[a,2], \ + velocity[a,0], velocity[a,1], velocity[a,2], \ + force[-1][a,0], force[-1][a,1], force[-1][a,2])) + if 'plot' in out: + energy.append(totalEnergy) + + if 'file' in out: + f.close() + if 'plot' in out: + plt.title('[' + integrator + '][' + name + '][' + basisName + ']') + plt.xlabel('t') + plt.ylabel('E') + plt.plot( np.arange(0, timeIncrement*iterations, timeIncrement)*toFemtoSeconds, energy) + plt.grid(True) + plt.show() + +def mdVisualise(type): + + toFemtoSeconds = getConstant('atu->femtosecond') + + #get type and attribute either eg 'bond{0:2}' or 'angle{1:0:2}'' + if type.find('{') == 0: + type = type + '{' + attribute = type[type.find('{'):] + type = type[:type.find('{')] + if type == 'bond': + l = int(attribute[1:attribute.find(':')]) + r = int(attribute[attribute.find(':')+1:-1]) + if type == 'angle': + i = attribute.find(':') + l = int(attribute[1:i]) + m = int(attribute[i+1:attribute.find(':',i+1)]) + r = int(attribute[attribute.find(':',i+1)+1:-1]) + + + file = open('md.hdf', 'r') + + #time, force, velocity and energy + t = [] + E = [] + + #read molecule, basis and integrator + data = file.readline().split() + if len(data) != 3: + exit('data format error') + + title = '[' + data[0] + '][' + data[1] + '][' + data[2] + ']' + + #read nAtoms and number of steps + data = file.readline().split() + atoms = int(data[0]) + steps = int(data[1]) + + #coordinates and molecular attribute + q = [] + Q = [] + + #loop over file lines + for step in range(steps): + + #time and energy + data = file.readline().split() + t.append(float(data[0])*toFemtoSeconds) + E.append(float(data[1])) + + #coordinates + for a in range(atoms): + data = file.readline().split() + q.append([float(data[0]), float(data[1]), float(data[2])]) + + if type == 'bond': + Q.append(np.linalg.norm(np.array(q[-atoms+l])-np.array(q[-atoms+r]))) + if type == 'angle': + va = np.array(q[-atoms+l])-np.array(q[-atoms+m]) + vb = np.array(q[-atoms+m])-np.array(q[-atoms+r]) + Q.append(acos(np.dot(va,vb)/(np.linalg.norm(va)*np.linalg.norm(vb))) * getConstant('radian->degree')) + + #plot energy and attribute + plt.figure() + plt.subplot(211) + plt.xlabel('t (fs)') + plt.ylabel('E (Eh)') + plt.grid(True) + plt.title(title) + plt.plot(t,E) + + if type == 'bond': + plt.subplot(212) + plt.xlabel('t (fs)') + plt.ylabel('r (bohr)') + plt.grid(True) + plt.plot(t,Q) + + if type == 'angle': + plt.subplot(212) + plt.xlabel('t (fs)') + plt.ylabel('angle') + plt.grid(True) + plt.plot(t,Q) + + plt.show() + +def velocityAutocorrelation(options): + #get intensity spectrum from velocity autocorrelation function + + def BOMDfileRead(input): + #reads file for BOMD run parameters and geometry + + with open(input, 'r') as f: + + AVFdata = [] + count = 0 + for line in f: + + data = line.strip().replace(' ', ' ').replace(' ', ' ').split( ' ') + if count == 0: + title = data[0] + '/' + data[1] + ' [' + data[2] + ']' + elif count == 1: + nAtoms = int(data[0]) + steps = int(data[1]) + timeStep = float(data[2]) + elif len(data) == 9: + AVFdata.append(data[:3]) + + count += 1 + + return np.array(AVFdata, dtype = float).reshape(steps, nAtoms, 3), [timeStep, steps, nAtoms, title] + + def getVibrationMode(options, geometry): + #get the length or angular displacement required + + #get stretch + if options['mode'] == 's': + return np.linalg.norm(geometry[:, options['atoms'][0], :] - geometry[:, options['atoms'][1], :], axis=1) + #get bend + if options['mode'] == 'b': + u = geometry[:,options['atoms'][0],:] - geometry[:,options['atoms'][1],:] + v = geometry[:,options['atoms'][2],:] - geometry[:,options['atoms'][1],:] + theta = np.arccos((u*v).sum(axis=1)/(np.linalg.norm(v, axis=1)*np.linalg.norm(u, axis=1))) * getConstant('radian->degree') + return theta + #get dihedral + if options['mode'] == 'd': + #plane 1 defined by u,v and plane 2 by v,w + u = geometry[:,options['atoms'][1],:] - geometry[:,options['atoms'][0],:] + v = geometry[:,options['atoms'][2],:] - geometry[:,options['atoms'][1],:] + w = geometry[:,options['atoms'][3],:] - geometry[:,options['atoms'][2],:] + #normals to planes + normalToPlaneUV = np.cross(u,v) + normalToPlaneVW = np.cross(v,w) + #dot product of normals is cos.|a|.|b| + dotProduct = (normalToPlaneUV * normalToPlaneVW).sum(axis=1) + #get normal norms + normNormalToPlaneUV = np.linalg.norm(normalToPlaneUV,axis=1) + normNormalToPlaneVW = np.linalg.norm(normalToPlaneVW,axis=1) + + phi = np.arccos(dotProduct / (normNormalToPlaneUV * normNormalToPlaneVW)) + + return phi * getConstant('radian->degree') + + def getTimeDerivatives(vibrations, dt): + #get the derivatives of the displacements + + dy = np.gradient(vibrations) + + return np.divide(dy, dt) + + def getAutoCorrelation(f): + #compute the velocity auto-correlation function + + fUnbiased = f - np.mean(f) + fNormed = np.sum(fUnbiased * fUnbiased) + + autocorrelation = signal.fftconvolve(f, f[::-1], mode='full')[len(f)-1:] / fNormed + + return autocorrelation + + def getViewport(options, dataLength): + #define a window + + data = options['window'].split(',') + if len(data) == 1: + return signal.get_window(data[0], dataLength, False) + else: + return signal.get_window((data[0], float(data[1])), dataLength, False) + + def getPadding(dataLength): + #get next power of 2 beyond data length + + if (dataLength and not (dataLength & (dataLength - 1))) : return dataLength + n = 1 + while (n < dataLength): + n <<= 1 + + return n + + def autocorrelationFFT(ACF, window): + #perform a discrete fast Fourier Transform analysis of autocorrelation function + + dataLength = len(ACF) + #unbiased units: data/mean + w = window / (sum(window) / dataLength) + + #convolve data with window + convolvedSignal = ACF * w + + #get zero padding + padding = getPadding(dataLength) + + #do the FFT + FFT = np.fft.fft(convolvedSignal, padding) / dataLength + + #return square of absolute intensity + return np.absolute(FFT) * np.absolute(FFT) + + #retrieve the displacement vectors from BOMD file + displacements, bomdParameters = BOMDfileRead(options['file']) + timeStep, steps, atoms, title = bomdParameters + timeStep *= getConstant('atu->femtosecond') * 1e-15 + + #compute the stretches + vibrationMode = getVibrationMode(options, displacements) + + #get the derivatives of the mode displacements (velocities) + derivatives = getTimeDerivatives(vibrationMode, timeStep) + + #compute the auto-correlation function + vACF = getAutoCorrelation(derivatives) + + #define a viewport + window = getViewport(options, steps) + + #Wiener–Khinchin theorem: FFT of autocorrelation is power spectrum + spectrum = autocorrelationFFT(vACF, window) + + #get frequency (omega) and intensity + spectrumLength = len(spectrum) + + frequency = np.fft.fftfreq(spectrumLength, timeStep * getConstant('c') )[0:int(spectrumLength * 0.5)] + intensity = spectrum[0:int(spectrumLength * 0.5)] + + #visualisation + nPlot = len(options['plot']) + import matplotlib.pyplot as plt + + derivatives = derivatives * timeStep + xtick = np.arange(0, steps+1, int(steps * 0.25)) * timeStep * 1e15 + xlabel = [] + for x in xtick: + xlabel.append(str(int(x))) + + plotCount = 0 + if 'derivative' in options['plot']: + plotCount += 1 + plt.subplot(nPlot,1,plotCount) + plt.title(title, fontsize='small') + + dataPoints = np.arange(len(derivatives)) + plt.plot(dataPoints, derivatives, color="red", linewidth=1.5 ) + plt.axis([0, len(derivatives) , + 1.1 * np.min(derivatives), + 1.1 * np.max(derivatives)]) + #converts steps to femtoseconds for x axis + plt.xticks(np.arange(0, steps+1, int(steps * 0.25)), xlabel, fontsize = 'x-small') + plt.yticks(np.linspace(np.min(derivatives),np.max(derivatives),4), fontsize = 'x-small') + + plt.xlabel("Time (fs)", fontsize = 'x-small') + if options['mode'] == 's': plt.ylabel("Derivative of stretch (bohr)", fontsize = 'x-small') + if options['mode'] == 'b': plt.ylabel("Derivative of bend (degree)", fontsize = 'x-small') + if options['mode'] == 'd': plt.ylabel("Derivative of dihedral (degree)", {fontsize : 'x-small'}) + + if 'ACf' in options['plot']: + plotCount += 1 + plt.subplot(nPlot,1,plotCount) + dataPoints = np.arange(len(vACF)) + plt.plot(dataPoints, vACF, color='red', linewidth=1.5) + plt.axis([0, len(vACF), + 1.1 * np.min(vACF), + 1.1 * np.max(vACF)]) + plt.xticks(np.arange(0, steps+1, int(steps * 0.25)), xlabel, fontsize = 'x-small') + plt.yticks(np.linspace(np.min(vACF),np.max(vACF),4), fontsize = 'x-small') + plt.xlabel("Time (fs)", fontsize = 'x-small') + plt.ylabel("velocity ACF (au)", fontsize = 'x-small') + elif 'ACp' in options['plot']: + plotCount += 1 + plt.subplot(nPlot,1,plotCount) + plt.acorr(vACF, usevlines=True, normed=True, maxlags=len(dataPoints)//4, color='red') + + + if 'spectrum' in options['plot']: + plotCount += 1 + plt.subplot(nPlot,1,plotCount) + plt.plot(frequency, intensity, color="black", linewidth=1.5) + minIntensity = np.min(intensity) + maxIntensity = np.max(intensity) + plt.axis([0, len(frequency)//2, + 1.1 * minIntensity, + 1.1 * maxIntensity]) + if options['mode'] == 's': + attribute = 'stretch ' + str(options['atoms'][0]) + '-' + str(options['atoms'][1]) + elif options['mode'] == 'b': + attribute = 'bend ' + str(options['atoms'][1]) + '-' + str(options['atoms'][0]) + '-' + str(options['atoms'][2]) + elif options['mode'] == 'd': + attribute = 'dihedral ' + str(options['atoms'][1]) + '-' + str(options['atoms'][0]) + '-' + str(options['atoms'][2]) + \ + '-' + str(options['atoms'][2]) + plt.text(len(frequency)/100,maxIntensity - maxIntensity/6, attribute, fontsize = 'x-small' ) + plt.grid() + plt.xticks(np.linspace(0, len(frequency)//2, 10), fontsize = 'x-small') + plt.yticks(np.around(np.linspace(np.min(intensity),np.max(intensity),4), 3), fontsize = 'x-small') + plt.xlabel("wavenumber (cm$^{-1}$)", fontsize = 'x-small') + plt.ylabel("intensity (au)", fontsize = 'x-small') + plt.subplots_adjust(hspace = 0.5) + + plt.show() + + return frequency, intensity diff --git a/source/cc/cctn.py b/source/cc/cctn.py new file mode 100644 index 0000000..771519a --- /dev/null +++ b/source/cc/cctn.py @@ -0,0 +1,250 @@ +from __future__ import division +import numpy as np +import sys +sys.path.append('../../harpy/codes') +from cc.fcc import spinMO +from diis import diis_c + +''' +extra diagram to add to CCSD to implement CCSDT-n methods +''' +def cluster_triples_n_diagrams(name, d_tensor, f, g, o, v, t1=None, t2=None, t3=None): + #evaluate extra diagrams for ccsdt-n + + if name in ['ccsdt-1a', 'ccsdt-1b', 'ccsdt-2', 'ccsdt-3', 'ccsdt-4']: + #diagram S_{7} + singles = 0.25 * np.einsum('mnef,aefimn->ai', g[o,o,v,v], t3, optimize=True) + + #diagrams D_{10a-19c} + doubles = np.einsum('em,abeijm->abij', f[v,o], t3, optimize=True) + t = 0.5 * np.einsum('aefijm,bmef->abij', t3, g[v,o,v,v], optimize=True) + doubles += t - t.transpose(1,0,2,3) + t = -0.5 * np.einsum('abeimn,mnje->abij', t3, g[o,o,o,v], optimize=True) + doubles += t - t.transpose(0,1,3,2) + + #diagrams T_{1a-1b}, T_{2a-2b} + t = np.einsum('aeij,bcek->abcijk', t2, g[v,v,v,o], optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples = t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('abim,mcjk->abcijk', t2, g[o,v,o,o], optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = np.einsum('ce,abeijk->abcijk', f[v,v], t3, optimize=True) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = -np.einsum('km,abcijm->abcijk', f[o,o], t3, optimize=True) + triples += t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + + if name in ['ccsdt-1b', 'ccsdt-2', 'ccsdt-3', 'ccsdt-4']: + #diagrams D_{11a-11c} + doubles += np.einsum('mnef,em,fabnij->abij', g[o,o,v,v], t1, t3, optimize=True) + t = -0.5 * np.einsum('mnef,am,efbinj->abij', g[o,o,v,v], t1, t3, optimize=True) + doubles += t - t.transpose(1,0,2,3) + t = -0.5 * np.einsum('mnef,ei,afbmnj->abij', g[o,o,v,v], t1, t3, optimize=True) + doubles += t - t.transpose(0,1,3,2) + + if name in ['ccsdt-2', 'ccsdt-3', 'ccsdt-4']: + #diagrams T_{3a-3e} + t = -np.einsum('em,aeij,bcmk->abcijk', f[v,o], t2, t2, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = np.einsum('mbef,aeim,fcjk->abcijk',g[o,v,v,v], t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(0,2,1,3,4,5) + t.transpose(1,2,0,3,4,5) + t.transpose(2,0,1,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('mnej,aeim,bcnk->abcijk', g[o,o,v,o], t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,3,5,4) + t.transpose(0,1,2,4,5,3) + t.transpose(0,1,2,5,3,4) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -0.5 * np.einsum('mcef,abim,efjk->abcijk', g[o,v,v,v], t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = 0.5 * np.einsum('mnek,aeij,bcmn->abcijk', g[o,o,v,o], t2, t2, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + + if name in ['ccsdt-3', 'ccsdt-4']: + #diagrams T_{4a-4d} + t = np.einsum('abef,ei,fcjk->abcijk', g[v,v,v,v], t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = np.einsum('mnij,am,bcnk->abcijk', g[o,o,o,o], t1, t2, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('amie,ej,bcmk->abcijk', g[v,o,o,v], t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,3,5,4) + t.transpose(0,1,2,4,5,3) + t.transpose(0,1,2,5,3,4) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('amie,bm,ecjk->abcijk', g[v,o,o,v], t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(0,2,1,3,4,5) + t.transpose(1,2,0,3,4,5) + t.transpose(2,0,1,3,4,5) - t.transpose(2,1,0,3,4,5) + #diagram T_{7a-7d} + t = -np.einsum('mbef,ei,am,fcjk->abcijk', g[o,v,v,v], t1, t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(0,2,1,3,4,5) + t.transpose(1,2,0,3,4,5) + t.transpose(2,0,1,3,4,5) - t.transpose(2,1,0,3,4,5) + t = np.einsum('mnej,ei,am,bcnk->abcijk', g[o,o,v,o], t1, t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,3,5,4) + t.transpose(0,1,2,4,5,3) + t.transpose(0,1,2,5,3,4) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('amef,ei,fj,bcmk->abcijk', g[v,o,v,v], t1, t1, t2, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = np.einsum('mnie,am,bn,ecjk->abcijk', g[o,o,o,v], t1, t1, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + #diagrams T_{8a-8e} + t = -np.einsum('mnef,em,abin,fcjk->abcijk', g[o,o,v,v], t1, t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = -np.einsum('mnef,fj,aeim,bcnk->abcijk', g[o,o,v,v], t1, t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,3,5,4) + t.transpose(0,1,2,4,5,3) + t.transpose(0,1,2,5,3,4) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + t = -np.einsum('mnef,bn,aeim,fcjk->abcijk', g[o,o,v,v], t1, t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(0,2,1,3,4,5) + t.transpose(1,2,0,3,4,5) + t.transpose(2,0,1,3,4,5) - t.transpose(2,1,0,3,4,5) + t = 0.5 * np.einsum('mnef,ei,abmn,fcjk->abcijk', g[o,o,v,v], t1, t2, t2, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = 0.5 * np.einsum('mnef,am,efij,bcnk->abcijk', g[o,o,v,v], t1, t2, t2, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + + if name in ['ccsdt-4']: + #diagrams T_{2c - 2e} + t = 0.5 * np.einsum('abef,efcijk->abcijk', g[v,v,v,v], t3, optimize=True) + triples += t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = 0.5 * np.einsum('mnij,abcmnk->abcijk', g[o,o,o,o], t3, optimize=True) + triples += t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + t = np.einsum('amie,ebcmjk->abcijk', g[v,o,o,v], t3, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + triples += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + + return [singles * d_tensor[0], doubles * d_tensor[1], triples * d_tensor[2] + t3] + +''' +use the symbolically generated COGUS CCSD, CCSDT and CCSD(T) to get basic amplitudes +''' +def coupledClusterTriplesVariations(name, fock, eri, c, e, scfData, runData): + #execute symbolically generated cluster codes + + #check we can handle method + if not name in ['ccsd', 'ccsdt','ccsd(t)', 'ccsdt-1a', 'ccsdt-1b', 'ccsdt-2', 'ccsdt-3', 'ccsdt-4'] : return 0.0 + + #get code for correct method + if name == 'ccsdt': + from ccsdt import cc_energy, cc_singles, cc_doubles, cc_triples + else: + from ccsd_t import cc_energy, cc_singles, cc_doubles, cc_triples, cc_perturbation_energy + + #run and scf values + use_td_guess, iterations, tolerance, verbose = runData + charge, nuclearRepulsion, electrons = scfData + + #orbital occupations + spinOrbitals = (fock.shape[0]) * 2 + nocc = electrons + nvir = spinOrbitals - nocc + + #get two-electron repulsion integrals in MO basis + mo = spinMO(e, eri, c, fock) + gs = mo.gs + fs = mo.fs + + #slices + n = np.newaxis + o = slice(None,nocc) + v = slice(nocc, None) + + #D tensors + eps = np.kron(e, np.ones(2)) + + d = [np.reciprocal(-eps[v, n] + eps[n, o]), + np.reciprocal(-eps[v, n, n, n] - eps[n, v, n, n] + eps[n, n, o, n] + eps[n, n, n, o]), + np.reciprocal(- eps[ v, n, n, n, n, n] - eps[n, v, n, n, n, n] - eps[n, n, v, n, n, n] + + eps[n, n, n, o, n, n] + eps[n, n, n, n, o, n] + eps[n, n, n, n, n, o])] + + #HF energy3 + HFenergy = 1.0 * np.einsum('ii', fs[o, o]) -0.5 * np.einsum('ijij', gs[o, o, o, o]) + print('Hartree-Fock SCF electronic energy {:<14.10f} au\nTotal energy {:<14.10f} au\n'. + format(HFenergy, HFenergy + nuclearRepulsion)) + if verbose: + print('cycle energy \u0394E\n---------------------------------------------') + #amplitude initialisation + ts = np.zeros((nvir, nocc)) + td = np.zeros((nvir, nvir, nocc, nocc)) + tt = np.zeros((nvir, nvir, nvir, nocc, nocc, nocc)) + + #use initial guess + if use_td_guess: td = gs[v,v,o,o].copy()*d[1] + + #get initial cluster energy + cycleEnergy = [cc_energy(fs, gs, o, v, t1=ts, t2=td, t3=tt ) - HFenergy] + + #initiate DIIS + diis = diis_c(6, [ts, td, tt]) + + triples = np.zeros_like(tt) + + #iterations + for cycle in range(iterations): + + #update DIIS cache + diis.refresh_store([ts, td, tt]) + #update amplitudes + singles = cc_singles(fs, gs, o, v, t1=ts, t2=td, t3=tt) * d[0] + ts + doubles = cc_doubles(fs, gs, o, v, t1=ts, t2=td, t3=tt) * d[1] + td + if name in ['ccsdt', 'ccsd(t)']: + triples = cc_triples(fs, gs, o, v, t1=ts, t2=td, t3=tt) * d[2] + tt + + #additional diagrams + if name in ['ccsdt-1a', 'ccsdt-1b', 'ccsdt-2', 'ccsdt-3', 'ccsdt-4']: + triples_corrections = cluster_triples_n_diagrams(name, d, fs, gs, o, v, t1=ts, t2=td, t3=tt) + + singles += triples_corrections[0] + doubles += triples_corrections[1] + triples = triples_corrections[2] + + #recalculate energy + cycleEnergy.append(cc_energy(fs, gs, o, v, t1=singles, t2=doubles, t3=triples) - HFenergy) + deltaEnergy = np.abs(cycleEnergy[-2] - cycleEnergy[-1]) + + #convergence test + if deltaEnergy < tolerance: + + print('Final {:8} correction is {:<14.10f} au'.format(name, cycleEnergy[-1])) + print('Final energy with {:8} correction {:<14.10f} au'.format(name, cycleEnergy[-1] + HFenergy)) + break + else: + ts = singles + td = doubles + tt = triples + lastCycleEnergy = cycleEnergy + if verbose: print('{:>3d} {:>15.10f} {:>12.10f} '.format(cycle, cycleEnergy[-1], deltaEnergy)) + + #interpolated DIIS values + ts, td, tt = diis.build([ts, td, tt]) + del cycleEnergy[0] + else: + print("Did not converge") + exit('cc failed') + + perturbationEnergy = 0.0 + if name == 'ccsd(t)': + perturbativeTriples = cc_triples(fs, gs, o, v, t1=singles, t2=doubles, t3=triples) + triples = perturbativeTriples + np.reciprocal(d[2]) * triples + triples = triples * d[2] + l1, l2 = [singles.transpose(1,0) ,doubles.transpose(2,3,0,1)] + + perturbationEnergy = cc_perturbation_energy(fs, gs, o, v, l1, l2, triples) + print('\nccsd(t) (t) perturbative correction {:<14.10f} au'.format(perturbationEnergy)) + print('Final ccsd(t) energy with all corrections {:<14.10f} au'.format(cycleEnergy[-1] + HFenergy+ perturbationEnergy)) + +if __name__ == '__main__': + + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri = [rhf.fock, rhf.C, rhf.e, rhf.ERI] + + coupledClusterTriplesVariations('ccsdt-1a', f, eri, c, e, + [charge, nuclearRepulsion, electrons], + [True, 50, 1e-10, True]) \ No newline at end of file diff --git a/source/cc/fcc.py b/source/cc/fcc.py new file mode 100644 index 0000000..a7fb5e3 --- /dev/null +++ b/source/cc/fcc.py @@ -0,0 +1,988 @@ +from __future__ import division +import numpy as np +from diis import diis_c +from view import postSCF +from atom import getConstant + +class coupledCluster(object): + #class to provide coupled cluster facilities + #ccsd reference compute the F and W intermediates from J. Gauss and J. F. Stanton: Coupled-cluster calculations of + #Nuclear magnetic resonance chemical shifts - J. Chem. Phys., Vol. 103, No. 9, 1 September 1995 + + o = None ; v = None + d_tensors = [] + HFenergy = 0.0 + + def __init__(self, fs, gs, e, data): + #initialise with spin fock eris and amplitudes + + self.fs = fs + self.gs = gs + self.e = e + self.ts = None + self.td = None + self.method, self.electrons, self.cycle_limit, self.convergence, self.verbose = data.values() + self.converged = False + + #check method implemented + if not self.method in ['ccsd', 'ccsd(t)', 'ccd', 'cc2', 'lccd', 'lccsd', 'qcisd'] : return None + + func_amplitude = self.update_amplitudes if not self.method in ['lccd', 'lccsd'] else self.update_linear_amplitudes + + self.mp2 = 0.0 + + self.energy = self.iterator(func_amplitude) + if self.method == 'ccsd(t)': + self.perturbative_triples() + + def initialise_amplitudes(self): + #set initial amplitudes + + nocc = self.electrons + n = np.newaxis + o = slice(None, nocc) + v = slice(nocc, None) + + eps = np.kron(self.e, np.ones(2)) + + #d tensors + ds = 1.0 / (eps[o, n] - eps[n, v] ) + dd = 1.0 / (eps[o, n, n, n] + eps[n, o, n, n] - eps[n, n, v, n] - eps[n, n, n, v] ) + dt = 1.0 / (eps[o, n, n, n, n, n] + eps[n, o, n, n, n, n] + eps[n, n, o, n, n, n]- \ + eps[n, n, n, v, n, n] - eps[n, n, n, n, v, n] - eps[n, n, n, n, n, v] ) + + self.d_tensors = [ds, dd, dt] + + #initial amplitudes and mp2 energy + self.ts = np.zeros_like(self.fs[o,v]) ; self.td = self.gs[o, o, v, v]*dd + self.mp2 = 0.25 * np.einsum('ijab,ijab->', self.gs[o, o, v, v], self.td, optimize=True) + + #Hartree-Fock energy + self.HFenergy = np.einsum('ii', self.fs[o, o]) - 0.5 * np.einsum('ijij', self.gs[o, o, o, o]) + + #class variables + self.o = o ; self.v = v + + def tau(self, tilde=True): + #build the tau and tau-tilde Table III (d) + + tau = self.td.copy() + f = 0.5 if tilde else 1.0 + t = f * np.einsum('ia,jb->ijab', self.ts, self.ts, optimize=True) + + tau += t - t.transpose(0,1,3,2) + + return tau + + def intermediates(self, _slice, tilde=True): + #intermedates from Table III(a) + + if not _slice in ['oo','vv','ov','oooo','vvvv','ovvo']: + print('no pre-evaluated slice [', _slice, '] - transpose axes') + exit() + + o = self.o ; v = self.v + + if tilde: + if _slice == 'oo': + im = self.fs[o,o].copy() + np.fill_diagonal(im, 0.0) + im += 0.5 * np.einsum('ie,me->mi', self.ts, self.fs[o, v],optimize=True) + im += np.einsum('ne,mnie->mi', self.ts, self.gs[o, o, o, v], optimize=True) + im += 0.5 * np.einsum('inef,mnef->mi', self.tau(), self.gs[o, o, v, v], optimize=True) + + if _slice == 'vv': + im = self.fs[v,v].copy() + np.fill_diagonal(im, 0.0) + im -= 0.5 * np.einsum('ma,me->ae', self.ts, self.fs[o, v],optimize=True) + im += np.einsum('mf,mafe->ae', self.ts, self.gs[o, v, v, v], optimize=True) + im -= 0.5 * np.einsum('mnaf,mnef->ae', self.tau(), self.gs[o, o, v, v], optimize=True) + + if _slice == 'ov': + im = self.fs[o,v].copy() + im += np.einsum('nf,mnef->me', self.ts, self.gs[o, o, v, v], optimize=True) + + if _slice == 'oooo': + im = self.gs[o, o, o, o].copy() + t = np.einsum('je,mnie->mnij', self.ts, self.gs[o, o, o, v], optimize=True) + im += t - t.transpose(0,1,3,2) + im += 0.25 * np.einsum('ijef,mnef->mnij', self.tau(tilde=False), self.gs[o, o, v, v], optimize=True) + + if _slice == 'vvvv': + im = self.gs[v, v, v, v].copy() + t = -np.einsum('mb,amef->abef', self.ts, self.gs[v, o, v, v], optimize=True) + im += (t - t.transpose(1,0,2,3)) + im += 0.25 * np.einsum('mnab,mnef->abef', self.tau(tilde=False), self.gs[o, o, v, v], optimize=True) + + if _slice == 'ovvo': + im = self.gs[o, v, v, o].copy() + im += np.einsum('jf,mbef->mbej', self.ts, self.gs[o, v, v, v], optimize=True) + im -= np.einsum('nb,mnej->mbej', self.ts, self.gs[o, o, v, o], optimize=True) + im -= 0.5 * np.einsum('jnfb,mnef->mbej', self.td, self.gs[o, o, v, v], optimize=True) + im -= np.einsum('jf,nb,mnef->mbej', self.ts, self.ts, self.gs[o, o, v, v], optimize=True) + + return im + + def update_amplitudes(self): + #compute the next cycle amplitudes + + o = self.o ; v = self.v + + foo = self.intermediates('oo') ; fvv = self.intermediates('vv') ; fov = self.intermediates('ov') + + #singles amplitudes + if self.method in ['ccsd', 'ccsd(t)', 'cc2']: + + #single amplitudes Table I (a) + t1 = self.fs[o,v].copy() + t1 += np.einsum('ie,ae->ia', self.ts, fvv, optimize=True) + t1 -= np.einsum('ma,mi->ia', self.ts, foo, optimize=True) + t1 += np.einsum('imae,me->ia', self.td, fov, optimize=True) + t1 -= np.einsum('nf,naif->ia', self.ts, self.gs[o, v, o, v], optimize=True) + t1 -= 0.5 * np.einsum('imef,maef->ia', self.td, self.gs[o, v, v, v], optimize=True) + t1 -= 0.5 * np.einsum('mnae,nmei->ia', self.td, self.gs[o, o, v, o], optimize=True) + + elif self.method in ['ccd']: + t1 = self.ts.copy() + + elif self.method in ['qcisd']: + foo = self.fs[o,o] ; fvv = self.fs[v,v] + np.fill_diagonal(foo, 0.0) ; np.fill_diagonal(fvv, 0.0) + + t1 = np.einsum('ic,ac->ia', self.ts, fvv, optimize=True) + t1 -= np.einsum('ka,ki->ia', self.ts, foo, optimize=True) + t1 += np.einsum('kc,akic->ia', self.ts, self.gs[v,o,o,v], optimize=True) + + t1 += np.einsum('ikac,kc->ia', self.td, self.fs[o,v], optimize=True) + t1 += 0.5 * np.einsum('kicd,kacd->ia', self.td, self.gs[o,v,v,v], optimize=True) + t1 -= 0.5 * np.einsum('klca,klci->ia', self.td, self.gs[o,o,v,o], optimize=True) + + t1 -= 0.5 * np.einsum('ic,klda,lkcd->ia', self.ts, self.td, self.gs[o,o,v,v], optimize=True) + t1 -= 0.5 * np.einsum('ka,licd,lkcd->ia', self.ts, self.td, self.gs[o,o,v,v], optimize=True) + t1 += np.einsum('kc,lida,klcd->ia', self.ts, self.td, self.gs[o,o,v,v], optimize=True) + + #doubles amplitudes + t2 = self.gs[o, o, v, v].copy() + + if self.method in ['ccsd', 'ccsd(t)', 'ccd']: + + #doubles amplitudes Table I (b) + woooo = self.intermediates('oooo') ; wvvvv = self.intermediates('vvvv') ; wovvo = self.intermediates('ovvo') + + t2 += 0.5 * np.einsum('mnab,mnij->ijab', self.tau(tilde=False), woooo, optimize=True) + + t2 += 0.5 * np.einsum('ijef,abef->ijab', self.tau(tilde=False), wvvvv, optimize=True) + + t = np.einsum('abej,ie->ijab', self.gs[v, v, v, o], self.ts, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t = np.einsum('ma,mbij->ijab', self.ts, self.gs[o, v, o, o], optimize=True) + t2 += -(t - t.transpose(0,1,3,2)) + + t = np.einsum('imae,mbej->ijab', self.td, wovvo, optimize=True) + t -= np.einsum('ie,ma,mbej->ijab', self.ts, self.ts, self.gs[o, v, v, o], optimize=True) + t2 += t - t.transpose(0,1,3,2) - t.transpose(1,0,2,3) + t.transpose(1,0,2,3).transpose(0,1,3,2) + + t = np.einsum('ijae,be->ijab', self.td, fvv, optimize=True) + t -= 0.5 * np.einsum('ijae,mb,me->ijab', self.td, self.ts, fov, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + t = np.einsum('imab,mj->ijab', self.td, foo, optimize=True) + t += 0.5 * np.einsum('imab,je,me->ijab', self.td, self.ts, fov, optimize=True) + t2 += -(t - t.transpose(1,0,2,3)) + + elif self.method in ['cc2']: + + foo = self.fs[o,o] ; fvv =self.fs[v,v] + np.fill_diagonal(foo, 0.0) ; np.fill_diagonal(fvv, 0.0) + + t = -np.einsum('mj,imab->ijab', foo, self.td, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t = -np.einsum('ijmb,ma->ijab', self.gs[o, o, o, v], self.ts, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + t2 += np.einsum('efab,ie,jf->ijab', self.gs[v, v, v, v], self.ts, self.ts, optimize=True) + + t2 += np.einsum('ijmn,ma,nb->ijab', self.gs[o, o, o, o], self.ts, self.ts, optimize=True) + + t = np.einsum('be,ijae->ijab', fvv, self.td, optimize=True) + + t = np.einsum('ejab,ie->ijab', self.gs[v, o, v, v], self.ts, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t = np.einsum('ejmn,ma,nb,ie->ijab', self.gs[v, o, o, o], self.ts, self.ts, self.ts, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t2 += np.einsum('efmn,ma,nb,ie,jf->ijab', self.gs[v, v, o, o], self.ts, self.ts, self.ts, self.ts, optimize=True) + + t = -np.einsum('ejmb,ie,ma->ijab', self.gs[v, o, o, v], self.ts, self.ts, optimize=True) + t2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,2,3).transpose(0,1,3,2) + + t = -np.einsum('efmb,ma,ie,jf->ijab', self.gs[v, v, o, v], self.ts, self.ts, self.ts, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + elif self.method in ['qcisd']: + + t = np.einsum('ic,abcj->ijab', self.ts, self.gs[v,v,v,o], optimize=True) + t2 += t - t.transpose(1,0,2,3) + t = -np.einsum('ka,kbij->ijab', self.ts, self.gs[o,v,o,o], optimize=True) + t2 += t - t.transpose(0,1,3,2) + + t = np.einsum('ijac,bc->ijab', self.td, fvv, optimize=True) + t2 += t - t.transpose(0,1,3,2) + t = -np.einsum('ikab,kj->ijab', self.td, foo, optimize=True) + t2 += t - t.transpose(1,0,2,3) + t2 += 0.5 * np.einsum('ijcd,abcd->ijab', self.td, self.gs[v,v,v,v], optimize=True) + t2 += 0.5 * np.einsum('klab,klij->ijab', self.td, self.gs[o,o,o,o], optimize=True) + t = np.einsum('ikac,kbcj->ijab', self.td, self.gs[o,v,v,o]) + t2 += t - t.transpose(0,1,3,2) - t.transpose(1,0,2,3) + t.transpose(1,0,3,2) + + t2 += 0.25 * np.einsum('ijcd,klab,klcd->ijab', self.td, self.td, self.gs[o,o,v,v], optimize=True) + t = np.einsum('ikac,jlbd,klcd->ijab', self.td, self.td, self.gs[o,o,v,v], optimize=True) + t2 += t - t.transpose(1,0,2,3) + t = -0.5 * np.einsum('ikdc,ljab,klcd->ijab', self.td, self.td, self.gs[o,o,v,v], optimize=True) + t2 += t - t.transpose(1,0,2,3) + t = -0.5 * np.einsum('lkac,ijdb,klcd->ijab', self.td, self.td, self.gs[o,o,v,v], optimize=True) + t2 += t - t.transpose(0,1,3,2) + + #update amplitudes + self.ts = t1*self.d_tensors[0] + self.td = t2*self.d_tensors[1] + + def update_linear_amplitudes(self): + #linear coupled-cluster - only td and ts. + + o = self.o ; v = self.v + + #doubles amplitdes - no singles for linear + foo = self.fs[o,o] ; fvv = self.fs[v,v] + np.fill_diagonal(foo, 0.0) ; np.fill_diagonal(fvv, 0.0) + + t2 = self.gs[o, o, v, v].copy() + + t = np.einsum('be,ijae->ijab', fvv, self.td, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + t = -np.einsum('mj,imab->ijab', foo, self.td, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t2 += 0.5 * np.einsum('abef,ijef->ijab', self.gs[v, v, v, v], self.td, optimize=True) + + t2 += 0.5 * np.einsum('mnij,mnab->ijab', self.gs[o, o, o, o], self.td, optimize=True) + + t = np.einsum('mbej,imae->ijab', self.gs[o, v, v, o], self.td, optimize=True) + t2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,2,3).transpose(0,1,3,2) + + #block for adding 's' to lccd + if self.method == 'lccsd': + + t1 = self.fs[o,v].copy() + + t1 += np.einsum('me,imae->ia', self.fs[o,v], self.td, optimize=True) + + t1 += 0.5 * np.einsum('efam,imef->ia', self.gs[v, v, v, o], self.td, optimize=True) + + t1 -= 0.5 * np.einsum('iemn,mnae->ia', self.gs[o, v, o, o], self.td, optimize=True) + + t1 += np.einsum('ae,ie->ia', fvv, self.ts, optimize=True) + + t1 -= np.einsum('mi,ma->ia', foo, self.ts, optimize=True) + + t1 += np.einsum('ieam,me->ia', self.gs[o, v, v, o], self.ts, optimize=True) + + t = np.einsum('ejab,ie->ijab', self.gs[v, o, v, v], self.ts, optimize=True) + t2 += t - t.transpose(1,0,2,3) + + t = -np.einsum('ijmb,ma->ijab', self.gs[o, o, o, v], self.ts, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + self.ts = t1*self.d_tensors[0] + + self.td = t2*self.d_tensors[1] + + + def cluster_energy(self): + #compute the coupled-cluster energy correction + + o = self.o ; v = self.v + + e = 1.0 * np.einsum('ia,ia->', self.fs[o,v], self.ts, optimize=True) + + e += 0.25 * np.einsum('ijab,ijab->', self.gs[o, o, v, v], self.td, optimize=True) + + #non-linear term + if not self.method in ['lccd', 'lccsd', 'qcisd']: + e += 0.5 * np.einsum('ijab,ia,jb->', self.gs[o, o, v, v], self.ts, self.ts, optimize=True) + + return e + + def perturbative_triples(self): + #compute the perturbative triples contribution + + o = self.o ; v = self.v + + #cyclic permutation list + cyclic = {'ijkbac':-1,'ijkcba':-1,'jikabc':-1,'jikbac':+1,\ + 'jikcba':+1,'kjiabc':-1,'kjibac':+1,'kjicba':+1} + + #disconnected triples amplitudes + t = np.einsum('ia,jkbc->ijkabc', self.ts, self.gs[o, o, v, v], optimize=True) + disconnected_tt = t.copy() + for i in cyclic: + disconnected_tt += cyclic[i] * np.einsum('ijkabc->' + i, t, optimize=True) + + #connected triples amplitudes + t = np.einsum('jkae,eibc->ijkabc', self.td, self.gs[v, o, v, v], optimize=True) + t -= np.einsum('imbc,majk->ijkabc', self.td, self.gs[o, v, o, o], optimize=True) + connected_tt = t.copy() + for i in cyclic: + connected_tt += cyclic[i] * np.einsum('ijkabc->' + i, t, optimize=True) + + tt = (disconnected_tt + connected_tt) * self.d_tensors[2] + + perturbation_energy = np.einsum('ijkabc,ijkabc->', connected_tt, tt) / 36.0 + + #add triples perturbation correction to energy dictionary + self.energy['pt'] = perturbation_energy + + + def iterator(self, func): + #consistent field iterations + + #initiate the amplitudes + self.initialise_amplitudes() + + #initialise diis buffers + diis = diis_c(6, [self.ts, self.td]) + + cycle_energy = [self.cluster_energy()] + + for cycle in range(self.cycle_limit): + + #store pre-update amplitudes + diis.refresh_store([self.ts, self.td]) + + func() + + #calculate current cycle energy + cycle_energy.append(self.cluster_energy()) + + #test convergence + delta_energy = np.abs(cycle_energy[-2] - cycle_energy[-1]) + if delta_energy < self.convergence: + self.converged = True + return {'cc': cycle_energy[-1], 'mp2': self.mp2, 'eHF':self.HFenergy} + break + else: + if self.verbose: print('cycle = {:>3d} energy = {:>15.10f} \u0394E = {:>12.10f} '.format(cycle, cycle_energy[-1], delta_energy)) + del cycle_energy[0] + + #diis build extrapolated amplitudes + self.ts, self.td = diis.build([self.ts, self.td]) + +class spinMO(object): + #class to provide integrals in the spin molecular basis + + def __init__(self, e, eri, c, f): + #instance variables + self.e = e + self.eri = eri + self.c = c + self.f = f + + self.gs = self.gMOspin(self.e, self.c, self.eri, self.c.shape[0]) + self.fs = self.fMOspin(self.f, self.c) + + def gMOspin(self, e, c, eri, nbf): + #construct MO spin eri - eri is linear array + + def iEri(i,j,k,l): + #index into the four-index eri integrals + p = max(i*(i+1)/2 + j, j*(j+1)/2 + i) + q = max(k*(k+1)/2 + l, l*(l+1)/2 + k) + return int(max(p*(p+1)/2 + q, q*(q+1)/2 + p)) + + #get 4 index eri and spinblock to spin basis + g = np.zeros((nbf,nbf,nbf,nbf)) + for i in range(nbf): + for j in range(nbf): + for k in range(nbf): + for l in range(nbf): + g[i,j,k,l] = eri[iEri(i,j,k,l)] + + spinBlock = np.kron(np.eye(2), np.kron(np.eye(2), g).T) + g = spinBlock.transpose(0,2,1,3) - spinBlock.transpose(0,2,3,1) + + #prepare orbital energies + eps = np.concatenate((e,e), axis=0) + cs = np.block([ + [c, np.zeros_like(c)], + [np.zeros_like(c), c]]) + cs = cs[:, eps.argsort()] + eps = np.sort(eps) + + #eri to MO + g = np.einsum('pQRS,pP->PQRS', np.einsum('pqRS,qQ->pQRS', np.einsum('pqrS,rR->pqRS', np.einsum('pqrs,sS->pqrS', \ + g, cs, optimize=True), cs, optimize=True), cs, optimize=True), cs, optimize=True) + + return g + + def fMOspin(self, f, c): + #construct MO spin fock + + cs = np.kron(c, np.eye(2)) + fs = np.dot(cs.T, np.dot(np.kron(f, np.eye(2)), cs)) + + return fs + +class ccsdLambda(object): + #class to provide coupled cluster facilities - lambda + #ccsd reference compute the F and W intermediates from J. Gauss and J. F. Stanton: Coupled-cluster calculations of + #Nuclear magnetic resonance chemical shifts - J. Chem. Phys., Vol. 103, No. 9, 1 September 1995 + + o = None ; v = None + d_tensors = [] + HFenergy = 0.0 + + def __init__(self, fs, gs, e, data): + #initialise with spin fock eris and amplitudes + + print('..running CCSD') + self.cc = coupledCluster(fs, gs, e, data) + print('--running Lambda') + self.method, self.electrons, self.cycle_limit, self.convergence, self.verbose = data.values() + self.converged = False + self.e = e + self.fs = fs + self.gs = gs + + #get the lambda initial amplitudes + self.energy = self.iterator() + + def initialise_amplitudes(self): + #initialisation + + nocc = self.electrons + n = np.newaxis + o = slice(None, nocc) + v = slice(nocc, None) + + eps = np.kron(self.e, np.ones(2)) + + #d tensors + ds = 1.0 / (eps[o, n] - eps[n, v] ) + dd = 1.0 / (eps[o, n, n, n] + eps[n, o, n, n] - eps[n, n, v, n] - eps[n, n, n, v] ) + + self.d_tensors = [ds.transpose(1,0), dd.transpose(2,3,0,1)] + + #initial amplitudes + self.ts = self.cc.ts ; self.td = self.cc.td + self.ls = np.zeros_like(self.ts).transpose(1,0) ; self.ld = self.td.transpose(2,3,0,1) + + #Hartree-Fock energy + self.HFenergy = np.einsum('ii', self.fs[o, o]) - 0.5 * np.einsum('ijij', self.gs[o, o, o, o]) + + #class variables + self.o = o ; self.v = v + + def intermediates(self, _slice, tilde=False): + #lambda intermedates from Table III(b) + + if not _slice in ['oo','vv','ov','oooo','vvvv','ovvo','ooov','vovv','ovoo','vvvo','OO','VV']: + print('no pre-evaluated slice [', _slice, '] - transpose axes') + exit() + + o = self.o ; v = self.v + + fov = self.cc.intermediates('ov', tilde=True).copy() + + if not tilde: + if _slice == 'vv': + im = self.cc.intermediates('vv', tilde=True) + im -= 0.5 * np.einsum('me,ma->ae', fov, self.ts, optimize=True) + + if _slice == 'oo': + im = self.cc.intermediates('oo', tilde=True) + im += 0.5 * np.einsum('me,ie->mi', fov, self.ts, optimize=True) + + if _slice == 'ov': + im = fov + + if _slice == 'oooo': + im = self.cc.intermediates('oooo', tilde=True) + im += 0.25 * np.einsum('ijef,mnef->mnij', self.cc.tau(tilde=False), self.gs[o, o, v, v], optimize=True) + + if _slice == 'vvvv': + im = self.cc.intermediates('vvvv', tilde=True) + im += 0.25 * np.einsum('mnab,mnef->abef', self.cc.tau(tilde=False), self.gs[o, o, v, v], optimize=True) + + if _slice == 'ovvo': + im = self.cc.intermediates('ovvo', tilde=True) + im -= 0.5 * np.einsum('jnfb,mnef->mbej', self.td, self.gs[o, o, v, v], optimize=True) + + if _slice == 'ooov': + im = self.gs[o, o, o, v].copy() + im += np.einsum('if,mnfe->mnie', self.ts, self.gs[o, o, v, v], optimize=True) + + if _slice == 'vovv': + im = self.gs[v, o, v, v].copy() + im += np.einsum('na,mnef->amef', self.ts, self.gs[o, o, v, v], optimize=True) + + if _slice == 'ovoo': + im = self.gs[o, v, o, o].copy() + im -= np.einsum('me,ijbe->mbij', fov, self.td, optimize=True) + im -= np.einsum('nb,mnij->mbij', self.ts, self.intermediates('oooo', tilde=False), optimize=True) + im += 0.5 * np.einsum('ijef,mbef->mbij', self.cc.tau(tilde=False), self.gs[o, v, v, v], optimize=True) + t = np.einsum('jnbe,mnie->mbij', self.td, self.gs[o, o, o, v], optimize=True) + im += t - t.transpose(0,1,3,2) + t = np.einsum('ie,mbej->mbij', self.ts, self.gs[o, v, v, o], optimize=True) + t -= np.einsum('ie,njbf,mnef->mbij', self.ts, self.td, self.gs[o, o, v, v], optimize=True) + im += t - t.transpose(0,1,3,2) + + if _slice == 'vvvo': + im = self.gs[v, v, v, o].copy() + im -= np.einsum('me,miab->abei', fov, self.td, optimize=True) + im += np.einsum('if,abef->abei', self.ts, self.intermediates('vvvv', tilde=False), optimize=True) + im += 0.5 * np.einsum('mnab,mnei->abei', self.cc.tau(tilde=False), self.gs[o, o, v, o], optimize=True) + t = -np.einsum('miaf,mbef->abei', self.td, self.gs[o, v, v, v], optimize=True) + im += t - t.transpose(1,0,2,3) + t = -np.einsum('ma,mbei->abei', self.ts, self.gs[o, v, v, o], optimize=True) + t += np.einsum('ma,nibf,mnef->abei', self.ts, self.td, self.gs[o, o, v, v], optimize=True) + im += t - t.transpose(1,0,2,3) + + if _slice == 'VV': + im = -0.5 * np.einsum('afmn,mnef->ae', self.ld, self.td, optimize=True) + + if _slice == 'OO': + im = 0.5 * np.einsum('efin,mnef->mi', self.ld, self.td, optimize=True) + + return im + + def update_amplitudes(self): + #compute the next cycle amplitudes + + o = self.o ; v = self.v + + #singles lambda Table II (a) + fov = self.intermediates('ov', tilde=False) ; foo = self.intermediates('oo', tilde=False) + fvv = self.intermediates('vv', tilde=False) ; wovvo = self.intermediates('ovvo', tilde=False) + wvvvo = self.intermediates('vvvo', tilde=False) ; wovoo = self.intermediates('ovoo', tilde=False) + wvovv = self.intermediates('vovv', tilde=False) ; wooov = self.intermediates('ooov', tilde=False) + woooo = self.intermediates('oooo', tilde=False) ; wvvvv = self.intermediates('vvvv', tilde=False) + goo = self.intermediates('OO', tilde=False) ; gvv = self.intermediates('VV', tilde=False) + + l1 = fov.copy().transpose(1,0) + l1 += np.einsum('ei,ae->ai', self.ls, fvv, optimize=True) + l1 -= np.einsum('am,im->ai', self.ls, foo, optimize=True) + l1 += np.einsum('em,ieam->ai', self.ls, wovvo, optimize=True) + l1 += 0.5 * np.einsum('efim,efam->ai', self.ld, wvvvo, optimize=True) + l1 -= 0.5 * np.einsum('aemn,iemn->ai', self.ld, wovoo, optimize=True) + l1 -= np.einsum('ef,eifa->ai', gvv, wvovv, optimize=True) + l1 -= np.einsum('mn,mina->ai', goo, wooov, optimize=True) + + #doubles lambda Table II (b) + + l2 = self.gs[v, v, o, o].copy() + + t = np.einsum('aeij,eb->abij', self.ld, fvv, optimize=True) + l2 += t - t.transpose(1,0,2,3) + + t = -np.einsum('abim,jm->abij', self.ld, foo, optimize=True) + l2 += t - t.transpose(0,1,3,2) + + l2 += 0.5 * np.einsum('abmn,ijmn->abij', self.ld, woooo, optimize=True) + + l2 += 0.5 * np.einsum('efab,efij->abij', wvvvv, self.ld, optimize=True) + + t = np.einsum('ei,ejab->abij', self.ls, wvovv, optimize=True) + l2 += t - t.transpose(0,1,3,2) + + t = -np.einsum('am,ijmb->abij', self.ls, wooov, optimize=True) + l2 += t - t.transpose(1,0,2,3) + + t = np.einsum('aeim,jebm->abij', self.ld, wovvo, optimize=True) + l2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,2,3).transpose(0,1,3,2) + + t = np.einsum('ai,jb->abij', self.ls, fov) + l2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,2,3).transpose(0,1,3,2) + + t = np.einsum('ijae,be->abij', self.gs[o, o, v, v], gvv, optimize=True) + l2 += t - t.transpose(1,0,2,3) + + t = -np.einsum('imab,mj->abij', self.gs[o, o, v, v], goo, optimize=True) + l2 += t - t.transpose(0,1,3,2) + + self.ls = l1*self.d_tensors[0] ; self.ld = l2*self.d_tensors[1] + + def oprdm(self): + #one-particle reduced density matrix + + n = sum(self.ls.shape) + gamma = np.zeros((n, n)) + o = self.o ; v = self.v + + gamma[v, o] = np.einsum('ai->ai', self.ls, optimize=True) + + gamma[o, v] = np.einsum('ia->ia', self.cc.ts, optimize=True) + gamma[o, v] += np.einsum('bj,ijab->ia', self.ls, self.cc.td, optimize=True) + gamma[o, v] -= np.einsum('bj,ja,ib->ia', self.ls, self.cc.ts, self.cc.ts, optimize=True) + gamma[o, v] -= 0.5 * np.einsum('bcjk,ikbc,ja->ia', self.ld, self.cc.td, self.cc.ts, optimize=True) + gamma[o, v] -= 0.5 * np.einsum('bcjk,jkac,ib->ia', self.ld, self.cc.td, self.cc.ts, optimize=True) + + gamma[v, v] = np.einsum('ai,ib->ab', self.ls, self.cc.ts, optimize=True) + gamma[v, v] += 0.5 * np.einsum('acij,ijbc->ab', self.ld, self.cc.td, optimize=True) + + gamma[o, o] = -np.einsum('aj,ia->ij', self.ls, self.cc.ts, optimize=True) + gamma[o, o] -= 0.5 * np.einsum('abjk,ikab->ij', self.ld, self.cc.td, optimize=True) + gamma[o, o] += np.einsum('ij->ij', np.eye(self.ls.shape[1]), optimize=True) + + return gamma + + def lambda_energy(self): + + o = self.o ; v = self.v + + e = np.einsum('ia,ai->', self.fs[o,v], self.ls, optimize=True) + + e += 0.25 * np.einsum('abij,abij->', self.ld, self.gs[v, v, o, o], optimize=True) + + return e + + def lagrangian_energy(self): + + o = self.o ; v = self.v + + #diagonals of Fock matrix + foo = np.diag(np.diag(self.cc.fs[o,o])) + fvv = np.diag(np.diag(self.cc.fs[v,v])) + + #singles amplitudes recalculated + t1 = self.cc.ts/self.cc.d_tensors[0] + t1 -= np.einsum('ma,mi->ia', self.ts, foo, optimize=True) + t1 += np.einsum('ie,ae->ia', self.ts, fvv, optimize=True) + + #doubles amplitudes recalculated + t2 = self.td/self.cc.d_tensors[1] + t = np.einsum('imab,mj->ijab', self.td, foo, optimize=True) + t2 += -(t - t.transpose(1,0,2,3)) + t = np.einsum('ijae,be->ijab', self.td, fvv, optimize=True) + t2 += t - t.transpose(0,1,3,2) + + lagrange = self.cc.energy['cc'] + lagrange += np.einsum('ai,ia->', self.ls, t1, optimize=True) + lagrange += np.einsum('abij,ijab->', self.ld, t2, optimize=True) + + return lagrange + + def lambda_perturbative_triples(self): + #perturbative triples correction to lambda CCSD + + o = self.o ; v = self.v + + #permutations are: i/jk a/bc, i/jk c/ab and k/ij a/bc + permutation_set = [{'ijkabc':+1,'ijkbac':-1,'ijkcba':-1,'jikabc':-1,'jikbac':+1,'jikcba':+1,'kjiabc':-1,'kjibac':+1,'kjicba':+1}, + {'ijkcab':+1,'ijkacb':-1,'ijkbac':-1,'jikcab':-1,'jikacb':+1,'jikbac':+1,'kjicab':-1,'kjiacb':+1,'kjibac':+1}, + {'kijabc':+1,'ikjabc':-1,'jikabc':-1,'kijbac':-1,'ikjbac':+1,'jikbac':+1,'kijcba':-1,'ikjcba':+1,'jikcba':+1}] + + #triples orbital energy divisor + dt = self.cc.d_tensors[2] + + #triples correction + lll = np.zeros_like(dt) + + #lambda triples + t = np.einsum('dkbc,adij->ijkabc', self.gs[v, o, v, v], self.ld, optimize=True) + for i in permutation_set[2]: + lll += permutation_set[2][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + t = np.einsum('jklc,abil->ijkabc', self.gs[o, o, o, v], self.ld, optimize=True) + for i in permutation_set[1]: + lll -= permutation_set[1][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + t = np.einsum('ai,bcjk->ijkabc', self.ls, self.gs[v, v, o, o], optimize=True) + for i in permutation_set[0]: + lll += permutation_set[0][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + t = np.einsum('ia,bcjk->ijkabc', self.fs[o,v], self.ld, optimize=True) + for i in permutation_set[0]: + lll += permutation_set[0][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + + #t triples + ttt = np.zeros_like(dt) + + t = np.einsum('bcdk,ijad->ijkabc', self.gs[v, v, v, o], self.cc.td, optimize=True) + for i in permutation_set[2]: + ttt += permutation_set[2][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + t = np.einsum('lcjk,ilab->ijkabc', self.gs[o, v, o, o], self.cc.td, optimize=True) + for i in permutation_set[1]: + ttt -= permutation_set[1][i] * np.einsum('ijkabc->' + i, t, optimize=True) + + ttt *= dt + + lambda_correction = np.einsum('ijkabc,ijkabc->', lll, ttt, optimize=True)/36.0 + + return lambda_correction + + def iterator(self): + #iterate lambda amplitudes to convergence + + self.initialise_amplitudes() + + #initialise diis buffers + diis = diis_c(6, [self.ls, self.ld]) + + cycle_energy = [self.lambda_energy()] + + for cycle in range(self.cycle_limit): + + #store pre-update amplitudes + diis.refresh_store([self.ls, self.ld]) + + self.update_amplitudes() + cycle_energy.append(self.lambda_energy()) + + #test convergence + delta_energy = np.abs(cycle_energy[-2] - cycle_energy[-1]) + if delta_energy < self.convergence: + self.converged = True + return_energies = {'cc': cycle_energy[-1], 'eHF':self.HFenergy, 'lagrange':self.lagrangian_energy()} + if '(t)' in self.method: + return_energies['pt'] = self.cc.energy['pt'] + return_energies['pl'] = self.lambda_perturbative_triples() + return return_energies + break + else: + if self.verbose: print('cycle = {:>3d} energy = {:>15.10f} \u0394E = {:>12.10f} '.format(cycle, cycle_energy[-1], delta_energy)) + del cycle_energy[0] + + #diis build extrapolated amplitudes + self.ls, self.ld = diis.build([self.ls, self.ld]) + +def fastCoupledCluster(type, fock, eps, c, eri, nuclearRepulsion, data): + #einsum coupled-cluster + + #get fock and eri in molecular spin basis from spinMO class + mo = spinMO(eps, eri, c, fock) + gs = mo.gs + fs = mo.fs + + cc_data = {'method':type,'electrons':data['electrons'], 'cycle_limit': data['cycle_limit'], \ + 'precision':data['precision'], 'verbose':False} + + #call coupled-cluster class + if type in ['ccd', 'ccsd', 'ccsd(t)', 'cc2', 'lccd', 'lccsd', 'qcisd']: + cc = coupledCluster(fs, gs, eps, cc_data) + + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + energy = cc.energy + postSCF([type, cc.energy], '+c') + + elif type in ['lambda']: + cc_data['method'] = 'ccsd' + l = ccsdLambda(fs, gs, eps, cc_data) + if l.converged: + l.energy['nuclear'] = nuclearRepulsion + energy = l.energy + postSCF([type, energy], '+c') + + return energy + +class eom_ccsd(object): + #class for equation of motion coupled-cluster singles and doubles + + def __init__(self, cc, roots=[1, 50], partitioned=False): + self.cc = cc + self.roots = roots + self.partitioned = partitioned + + self.e, self.v = self.do_eom_ccsd(cc) + + from ci import ciDegeneracy + e = np.sort( self.e * getConstant('hartree->eV')) + excitation_tuples = ciDegeneracy(e) + + self.excitations = [] + for excitation in excitation_tuples: + if excitation[0] > self.roots[0] and excitation[0] < self.roots[1]: + self.excitations.append(excitation) + + + def intermediates(self, cc, _slice, tilde=False): + #intermediates for EOM + + o = cc.o ; v = cc.v + fov = cc.intermediates('ov', tilde=True).copy() + + if not tilde: + + if _slice == 'vv': + im = cc.intermediates('vv', tilde=True) + np.diag(np.diag(cc.fs[v,v])) + im -= 0.5 * np.einsum('me,ma->ae', fov, cc.ts, optimize=True) + + if _slice == 'oo': + im = cc.intermediates('oo', tilde=True) + np.diag(np.diag(cc.fs[o,o])) + im += 0.5 * np.einsum('me,ie->mi', fov, cc.ts, optimize=True) + + if _slice == 'ov': + im = fov + + if _slice == 'oovv': + im = cc.gs[o,o,v,v] + + if _slice == 'oooo': + im = cc.intermediates('oooo', tilde=True) + im += 0.25 * np.einsum('ijef,mnef->mnij', cc.tau(tilde=False), cc.gs[o, o, v, v], optimize=True) + + if _slice == 'vvvv': + im = cc.intermediates('vvvv', tilde=True) + im += 0.25 * np.einsum('mnab,mnef->abef', cc.tau(tilde=False), cc.gs[o, o, v, v], optimize=True) + + if _slice == 'ovvo': + im = cc.intermediates('ovvo', tilde=True) + im -= 0.5 * np.einsum('jnfb,mnef->mbej', cc.td, cc.gs[o, o, v, v], optimize=True) + + if _slice == 'ooov': + im = cc.gs[o, o, o, v].copy() + im += np.einsum('if,mnfe->mnie', cc.ts, cc.gs[o, o, v, v], optimize=True) + + if _slice == 'vovv': + im = cc.gs[v, o, v, v].copy() + im += np.einsum('na,mnef->amef', cc.ts, cc.gs[o, o, v, v], optimize=True) + + if _slice == 'ovoo': + im = cc.gs[o, v, o, o].copy() + im -= np.einsum('me,ijbe->mbij', fov, cc.td, optimize=True) + im -= np.einsum('nb,mnij->mbij', cc.ts, self.intermediates(cc, 'oooo', tilde=False), optimize=True) + im += 0.5 * np.einsum('ijef,mbef->mbij', cc.tau(tilde=False), cc.gs[o, v, v, v], optimize=True) + t = np.einsum('jnbe,mnie->mbij', cc.td, cc.gs[o, o, o, v], optimize=True) + im += t - t.transpose(0,1,3,2) + t = np.einsum('ie,mbej->mbij', cc.ts, cc.gs[o, v, v, o], optimize=True) + t -= np.einsum('ie,njbf,mnef->mbij', cc.ts, cc.td, cc.gs[o, o, v, v], optimize=True) + im += t - t.transpose(0,1,3,2) + + if _slice == 'vvvo': + im = cc.gs[v, v, v, o].copy() + im -= np.einsum('me,miab->abei', fov, cc.td, optimize=True) + im += np.einsum('if,abef->abei', cc.ts, self.intermediates(cc, 'vvvv', tilde=False), optimize=True) + im += 0.5 * np.einsum('mnab,mnei->abei', cc.tau(tilde=False), cc.gs[o, o, v, o], optimize=True) + t = -np.einsum('miaf,mbef->abei', cc.td, cc.gs[o, v, v, v], optimize=True) + im += t - t.transpose(1,0,2,3) + t = -np.einsum('ma,mbei->abei', cc.ts, cc.gs[o, v, v, o], optimize=True) + t += np.einsum('ma,nibf,mnef->abei', cc.ts, cc.td, cc.gs[o, o, v, v], optimize=True) + im += t - t.transpose(1,0,2,3) + + return im + + def do_eom_ccsd(self, cc): + #construct the EOM Hamiltonian + + nocc, nvir = self.cc.ts.shape + nrot = nocc * nvir + + #kronecker delta + kd = np.eye(nocc + nvir) + + #short version variables + o = self.cc.o ; v = self.cc.v + fs, gs, ts, td = self.cc.fs, self.cc.gs, self.cc.ts, self.cc.td + + #get singles-singles block + + hss = np.einsum('ac,ik->iakc', self.intermediates(cc, 'vv'), kd[o,o], optimize=True) + hss -= np.einsum('ki,ac->iakc', self.intermediates(cc, 'oo'), kd[v,v], optimize=True) + hss += np.einsum('akic->iakc', self.intermediates(cc, 'ovvo').transpose(1,0,3,2)) + hss = hss.reshape(nrot, nrot).copy() + + #get singles-doubles + hsd = np.einsum('ld,ac,ik->iakcld', self.intermediates(cc, 'ov'), kd[v,v], kd[o,o], optimize=True) + hsd += 0.5 * np.einsum('alcd,ik->iakcld', self.intermediates(cc, 'vovv'), kd[o,o], optimize=True) + hsd -= 0.5 * np.einsum('klid,ac->iakcld', self.intermediates(cc, 'ooov'), kd[v,v], optimize=True) + hsd = hsd.reshape(nrot, nrot*nrot).copy() + + #get doubles-singles + t = np.einsum('kaij,bc->iajbkc', self.intermediates(cc, 'ovoo'), kd[v,v], optimize=True) + hds = t - t.transpose(0,3,2,1,4,5) + t = np.einsum('abcj,ik->iajbkc', self.intermediates(cc, 'vvvo'), kd[o,o], optimize=True) + hds += t - t.transpose(2,1,0,3,4,5) + t = np.einsum('bkec,ijae->iajbkc', self.intermediates(cc, 'vovv'), td, optimize=True) + hds += t - t.transpose(0,3,2,1,4,5) + t = -np.einsum('mkjc,imab->iajbkc', self.intermediates(cc, 'ooov'), td, optimize=True) + hds += t - t.transpose(2,1,0,3,4,5) + hds = hds.reshape(nrot*nrot, nrot).copy() + + if not self.partitioned: + + t = np.einsum('bc,ad,il,jk->iajbkcld', self.intermediates(cc, 'vv'), kd[v,v], kd[o,o], kd[o,o], optimize=True) + hdd = t - t.transpose(0,3,2,1,4,5,6,7) + t = -np.einsum('kj,ad,il,bc->iajbkcld', self.intermediates(cc, 'oo'), kd[v,v], kd[o,o], kd[v,v], optimize=True) + hdd += t - t.transpose(2,1,0,3,4,5,6,7) + hdd += 0.5 * np.einsum('abcd,ik,jl->iajbkcld', self.intermediates(cc, 'vvvv'), kd[o,o], kd[o,o], optimize=True) + hdd += 0.5 * np.einsum('klij,ac,bd->iajbkcld', self.intermediates(cc, 'oooo'), kd[v,v], kd[v,v], optimize=True) + t = np.einsum('akic,jl,db->iajbkcld', self.intermediates(cc, 'ovvo').transpose(1,0,3,2), kd[o,o], kd[v,v], optimize=True) + hdd += t - t.transpose(2,1,0,3,4,5,6,7) - t.transpose(0,3,2,1,4,5,6,7) + t.transpose(2,3,0,1,4,5,6,7) + t = -0.5 * np.einsum('lkec,ijeb,ad->iajbkcld', self.intermediates(cc, 'oovv'), td, kd[v,v], optimize=True) + hdd += t - t.transpose(0,3,2,1,4,5,6,7) + t = 0.5 * np.einsum('kmcd,miab,jl->iajbkcld', self.intermediates(cc, 'oovv'), td, kd[o,o], optimize=True) + hdd += t - t.transpose(2,1,0,3,4,5,6,7) + + else: + t = np.einsum('bc,jk,il,ad->iajbkcld', fs[v,v], kd[o,o], kd[o,o], kd[v,v], optimize=True) + hdd = t - t.transpose(0,3,2,1,4,5,6,7) + t = np.einsum('ki,jl,ad,bc->iajbkcld', fs[o,o], kd[o,o], kd[v,v], kd[v,v], optimize=True) + hdd += t - t.transpose(2,1,0,3,4,5,6,7) + + hdd = hdd.reshape(nrot*nrot, nrot*nrot).copy() + + #construct Hamiltonian from blocks + eom_matrix = np.bmat([[hss, hsd], + [hds, hdd]]) + + #solve dense Hamiltonian + from scipy.linalg import eig + e, v = eig(eom_matrix) + + return e.real, v.real + +if __name__ == '__main__': + + #do an SCF computation + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri = [rhf.fock, rhf.C, rhf.e, rhf.ERI] + + #get fock and eri in molecular spin basis from spinMO class + mo = spinMO(e, eri, c, f) + gs = mo.gs + fs = mo.fs + + #call coupled-cluster class + data = {'method':'ccsd','electrons':electrons, 'cycle_limit': 50, 'precision':1e-10, 'verbose':True} + cc = coupledCluster(fs, gs, e, data) + + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + + print(cc.energy) + + data['method'] = 'ccsd(t)' + l = ccsdLambda(fs, gs, e, data) + if l.converged: + l.energy['nuclear'] = nuclearRepulsion + + print(l.energy) + + #EOM-CCSD + eom = eom_ccsd(cc, roots=[4, 41], partitioned=False) + + print('root energy (eV) multiplicity\n---------------------------------') + for i, root in enumerate(eom.excitations): + print('{:<2d} {:<10.5f} {:ijab', self.td, self.g[v,v,v,v], optimize=True) + t2 += np.einsum('mnab,ijmn->ijab', self.td, self.g[o,o,o,o], optimize=True) + t2 += np.einsum('mjae,infb,nmef->ijab', self.td, self.td, self.g[o,o,v,v],optimize=True) + t2 -= 2.0*np.einsum('ijae,mnbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('ijae,nmbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 -= 2.0*np.einsum('miae,jnbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('miae,njbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('imae,njbf,nmef->ijab', self.td, self.td, self.g[o,o,v,v],optimize=True) + t2 += 4.0*np.einsum('imae,jnbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 -= 2.0*np.einsum('imae,njbf,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('mnae,ijfb,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 -= 2.0*np.einsum('nmae,ijfb,mnef-> ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('ijfe,nmab,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('miae,njfb,nmef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t2 -= 2.0*np.einsum('imae,jnbf,nmef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + + t = np.einsum('eb,ijae->ijab', self.f[v,v], self.td, optimize=True) + t -= np.einsum('im,mjab->ijab', self.f[o,o], self.td, optimize=True) + t += 2.0*np.einsum('jmbe,miea->ijab', self.td, self.g[o,o,v,v], optimize=True) + t -= np.einsum('mjbe,miea->ijab', self.td, self.g[o,o,v,v], optimize=True) + t -= np.einsum('imeb,jema->ijab', self.td, self.g[o,v,o,v], optimize=True) + t -= np.einsum('imae,jemb->ijab', self.td, self.g[o,v,o,v], optimize=True) + t += np.einsum('jmef,inab,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + t -= 2.0*np.einsum('mjef,inab,mnef->ijab', self.td, self.td, self.g[o,o,v,v], optimize=True) + + if self.method == 'ccd': t2 += t + t.transpose(1,0,3,2) + + if self.method in ['ccsd']: + + #singles CCSD + t1 = self.f[o,v].copy() + t1 -= np.einsum('im,ma->ia', self.f[o,o], self.ts, optimize=True) + t1 += np.einsum('ea,ie->ia', self.f[v,v], self.ts, optimize=True) + t1 -= np.einsum('me,ie,ma->ia', self.f[o,v], self.ts, self.ts, optimize=True) + t1 += 2.0*np.einsum('me,imae->ia', self.f[o,v], self.td, optimize=True) + t1 -= np.einsum('me,miae->ia', self.f[o,v], self.td, optimize=True) + t1 -= np.einsum('me,iema->ia', self.ts, self.g[o,v,o,v], optimize=True) + t1 += 2.0*np.einsum('me,miea->ia', self.ts, self.g[o,o,v,v], optimize=True) + t1 -= 2.0*np.einsum('me,na,nmie->ia', self.ts, self.ts, self.g[o,o,o,v], optimize=True) + t1 -= np.einsum('me,if,mafe->ia', self.ts, self.ts, self.g[o,v,v,v], optimize=True) + t1 += 2.0*np.einsum('me,if,maef->ia', self.ts, self.ts, self.g[o,v,v,v], optimize=True) + t1 += np.einsum('me,na,mnie->ia', self.ts, self.ts, self.g[o,o,o,v], optimize=True) + t1 += np.einsum('me,if,na,nmef->ia', self.ts, self.ts, self.ts, self.g[o,o,v,v], optimize=True) + t1 -= 2.0*np.einsum('me,if,na,mnef->ia', self.ts, self.ts, self.ts, self.g[o,o,v,v], optimize=True) + t1 -= np.einsum('mief,mafe->ia', self.td, self.g[o,v,v,v], optimize=True) + t1 += 2.0*np.einsum('imef,mafe->ia', self.td, self.g[o,v,v,v], optimize=True) + t1 -= 2.0*np.einsum('mnae,mnie->ia', self.td, self.g[o,o,o,v], optimize=True) + t1 += np.einsum('nmae,mnie->ia', self.td, self.g[o,o,o,v], optimize=True) + t1 -= 2.0*np.einsum('me,inaf,nmef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 -= 2.0*np.einsum('me,niaf,mnef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 += np.einsum('me,niaf,nmef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 -= 2.0*np.einsum('ie,nmaf,nmef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 += np.einsum('ie,nmaf,mnef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 -= 2.0*np.einsum('na,imfe,mnef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 += np.einsum('na,imef,mnef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + t1 += 4.0*np.einsum('me,inaf,mnef->ia', self.ts, self.td, self.g[o,o,v,v], optimize=True) + + #doubles CCSD + t2 += np.einsum('ie,jf,efab->ijab', self.ts, self.ts, self.g[v,v,v,v], optimize=True) + t2 += np.einsum('ma,nb,ijmn->ijab', self.ts, self.ts, self.g[o,o,o,o], optimize=True) + t2 -= np.einsum('ie,jf,ma,mbef->ijab', self.ts, self.ts, self.ts, self.g[o,v,v,v], optimize=True) + t2 -= np.einsum('ie,jf,mb,mafe->ijab', self.ts, self.ts, self.ts, self.g[o,v,v,v], optimize=True) + t2 += np.einsum('ie,ma,nb,nmje->ijab', self.ts, self.ts, self.ts, self.g[o,o,o,v], optimize=True) + t2 += np.einsum('je,ma,nb,mnie->ijab', self.ts, self.ts, self.ts, self.g[o,o,o,v], optimize=True) + t2 += np.einsum('ie,jf,ma,nb,mnef->ijab', self.ts, self.ts, self.ts, self.ts, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('ie,jf,nmab,nmef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t2 += np.einsum('ma,nb,ijfe,nmef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + + t -= np.einsum('mb,jima->ijab', self.ts, self.g[o,o,o,v], optimize=True) + t += np.einsum('je,ieab->ijab', self.ts, self.g[o,v,v,v], optimize=True) + t += np.einsum('me,ie,mjab->ijab', self.f[o,v], self.ts, self.td, optimize=True) + t -= np.einsum('me,ma,ijeb->ijab', self.f[o,v], self.ts, self.td, optimize=True) + t -= np.einsum('ie,ma,mjeb->ijab', self.ts, self.ts, self.g[o,o,v,v], optimize=True) + t -= np.einsum('ie,mb,jema->ijab', self.ts, self.ts, self.g[o,v,o,v], optimize=True) + t -= 2.0*np.einsum('nb,imae,nmje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t += np.einsum('nb,miae,nmje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t -= np.einsum('je,imfb,maef->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t -= np.einsum('je,miaf,mbfe->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t -= np.einsum('je,imaf,mbef->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t += np.einsum('je,nmab,nmie->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t += np.einsum('nb,imae,mnje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t -= np.einsum('ma,ijfe,mbfe->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t += np.einsum('ma,ineb,nmje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t += 2.0*np.einsum('je,imaf,mbfe->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t -= np.einsum('me,ijaf,mbfe->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t += 2.0*np.einsum('me,ijaf,mbef->ijab', self.ts, self.td, self.g[o,v,v,v], optimize=True) + t += np.einsum('me,inab,mnje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t -= 2.0*np.einsum('me,inab,nmje->ijab', self.ts, self.td, self.g[o,o,o,v], optimize=True) + t -= 2.0*np.einsum('me,jf,inab,mnef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t += np.einsum('me,jf,inab,nmef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t -= 2.0*np.einsum('me,na,ijfb,mnef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t += np.einsum('me,na,ijfb,nmef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t += np.einsum('ie,ma,njbf,mnef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t -= 2.0*np.einsum('ie,ma,jnbf,mnef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t += np.einsum('ie,ma,njfb,nmef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + t += np.einsum('ie,nb,mjaf,mnef->ijab', self.ts, self.ts, self.td, self.g[o,o,v,v], optimize=True) + + t2 += t + t.transpose(1,0,3,2) + + self.ts = t1 * self.d_tensors[0] + self.td = t2 * self.d_tensors[1] + + def cluster_energy(self): + #compute the coupled-cluster energy correction + + o = self.o ; v = self.v + + e = np.einsum('nemf, mnef -> ', (2.0*self.td.transpose(1,2,0,3) - self.td.transpose(0,2,1,3)), self.g[o,o,v,v], optimize =True) + + if self.method in ['ccsd']: + e -= np.einsum('ne,mf,mnef->', self.ts, self.ts, self.g[o,o,v,v], optimize=True) + e += 2.0 * np.einsum('me,me->', self.f[o,v], self.ts, optimize=True) + e += 2.0 * np.einsum('ne,mf,nmef->', self.ts, self.ts, self.g[o,o,v,v], optimize=True) + + return e + + + def iterator(self, func): + #consistent field iterations + + #initiate the amplitudes + self.initialise_amplitudes() + + #initialise diis buffers + diis = diis_c(6, [self.ts, self.td]) + + cycle_energy = [self.cluster_energy()] + + for cycle in range(self.cycle_limit): + + #store pre-update amplitudes + diis.refresh_store([self.ts, self.td]) + + func() + + #calculate current cycle energy + cycle_energy.append(self.cluster_energy()) + + #test convergence + delta_energy = np.abs(cycle_energy[-2] - cycle_energy[-1]) + if delta_energy < self.convergence: + self.converged = True + return {'cc': cycle_energy[-1], 'mp2': self.mp2, 'eHF':self.HFenergy} + break + else: + if self.verbose: print('cycle = {:>3d} energy = {:>15.10f} \u0394E = {:>12.10f} '.format(cycle, cycle_energy[-1], delta_energy)) + del cycle_energy[0] + + #diis build extrapolated amplitudes + self.ts, self.td = diis.build([self.ts, self.td]) + +if __name__ == '__main__': + + #do an SCF computation + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri, d, ch = [rhf.fock, rhf.C, rhf.e, rhf.ERI, rhf.density, rhf.coreH] + + #Hartree-Fock electronic energy + eHF = float(np.einsum('pq,pq->',d , (f + ch), optimize=True)) + + def gMO(c, f, eri, nbf): + #construct MO eri and Fock - eri is linear array in Chemists notation + + from integral import buildEriMO, expandEri + + g = expandEri(buildEriMO(c, eri), nbf).reshape(nbf, nbf, nbf, nbf).swapaxes(1, 2) + f = np.einsum('rp,rs,sq->pq', c, f, c, optimize=True) + + return f, g + + #transform to molecular basis + f, g = gMO(c, f, eri, c.shape[0]) + + #call restricted coupled-cluster class + data = {'method':'ccd','electrons':electrons, 'cycle_limit': 50, 'precision':1e-10, 'verbose':True, 'scf energy':eHF} + cc = restrictedCoupledCluster(f, g, e, data) + + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + + print(cc.energy) + diff --git a/source/cc/scc.py b/source/cc/scc.py new file mode 100644 index 0000000..d95f6c1 --- /dev/null +++ b/source/cc/scc.py @@ -0,0 +1,1096 @@ +from __future__ import division +import numpy as np +from integral import buildFockMOspin, buildEriMO, buildEriDoubleBar +from basis import electronCount +from math import sqrt +from view import postSCF +from diis import diis_c + +#'** references to Stanton et al +#'** J.Chem.Phys 94(6), 15 March 1991 + +def tauSpin(i, j, a, b, ts, td): + #equation (9) + return td[a,b,i,j] + 0.5 * (ts[a,i] * ts[b,j] - ts[b,i] * ts[a,j]) + +def tau(i, j, a, b, ts, td): + #equation (10) + return td[a,b,i,j] + ts[a,i] * ts[b,j] - ts[b,i] * ts[a,j] + +def updateIntermediates(fs, ts, td, eriMOspin, nElectrons): + #fs - fockSpin ts - tsingle cluster operator td - tdouble cluster operator + #eriMOspin - electron repulsion integrals in the MO spin + + def amplitudesT1(): + # equation (1) + TS = np.zeros((spinOrbitals, spinOrbitals)) + + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + TS[a,i] += fs[a,i] + for e in range(nElectrons, spinOrbitals): + TS[a,i] += ts[e,i] * fu[e,a] + for m in range(0, nElectrons): + TS[a,i] -= ts[a,m] * fo[i,m] + for e in range(nElectrons, spinOrbitals): + TS[a,i] += td[a,e,i,m] * fm[e,m] + for f in range(nElectrons, spinOrbitals): + TS[a,i] -= 0.5 * td[e,f,i,m] * eriMOspin[m,a,e,f] + for n in range(0, nElectrons): + TS[a,i] -= 0.5 * td[a,e,m,n] * eriMOspin[n,m,e,i] + + for n in range(0, nElectrons): + for f in range(nElectrons, spinOrbitals): + TS[a,i] -= ts[f,n] * eriMOspin[n,a,i,f] + TS[a,i] /= (fs[i,i] - fs[a,a]) + + return TS + + def amplitudesT2(): + # equation (2) + TD = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + TD[a,b,i,j] +=eriMOspin[i,j,a,b] + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += td[a,e,i,j] * fu[e,b] - td[b,e,i,j] * fu[e,a] + for m in range(0, nElectrons): + TD[a,b,i,j] += -0.5 * td[a,e,i,j] * ts[b,m] * fm[e,m] + 0.5 * td[b,e,i,j] * ts[a,m] * fm[e,m] + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += 0.5 * wu[e,f,a,b] * tau(i,j,e,f,ts,td) + for m in range(0, nElectrons): + TD[a,b,i,j] -= td[a,b,i,m] * fo[j,m] - td[a,b,j,m] * fo[i,m] + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += -0.5 * td[a,b,i,m] * ts[e,j] * fm[e,m] + 0.5 * td[a,b,j,m] * ts[e,i] * fm[e,m] + for n in range(0, nElectrons): + TD[a,b,i,j] += 0.5 * tau(m,n,a,b,ts,td) * wo[i,j,m,n] + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += td[a,e,i,m] * wm[e,j,m,b] - ts[e,i] * ts[a,m] * eriMOspin[m,b,e,j] + TD[a,b,i,j] -= td[a,e,j,m] * wm[e,i,m,b] - ts[e,j] * ts[a,m] * eriMOspin[m,b,e,i] + TD[a,b,i,j] -= td[b,e,i,m] * wm[e,j,m,a] - ts[e,i] * ts[b,m] * eriMOspin[m,a,e,j] + TD[a,b,i,j] += td[b,e,j,m] * wm[e,i,m,a] - ts[e,j] * ts[b,m] * eriMOspin[m,a,e,i] + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += eriMOspin[a,b,e,j] * ts[e,i] + TD[a,b,i,j] -= eriMOspin[a,b,e,i] * ts[e,j] + for m in range(0, nElectrons): + TD[a,b,i,j] -= eriMOspin[m,b,i,j] * ts[a,m] + TD[a,b,i,j] += eriMOspin[m,a,i,j] * ts[b,m] + TD[a,b,i,j] /= (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) + + return TD + + spinOrbitals = fs.shape[0] + + fo = np.zeros((spinOrbitals, spinOrbitals)) + fu = np.zeros((spinOrbitals, spinOrbitals)) + fm = np.zeros((spinOrbitals, spinOrbitals)) + + wo = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + wu = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + wm = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #equation (3) + for a in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + fu[e,a] += (1 - (a == e)) * fs[e,a] + for m in range(0, nElectrons): + fu[e,a] -= 0.5 * fs[e,m] * ts[a,m] + for f in range(nElectrons, spinOrbitals): + fu[e,a] += ts[f,m] * eriMOspin[m,a,f,e] + for n in range(0, nElectrons): + fu[e,a] -= 0.5 * tauSpin(m,n,a,f,ts,td) * eriMOspin[m,n,e,f] + #equation (4) + for m in range(0, nElectrons): + for i in range(0, nElectrons): + fo[i,m] += (1 - (m == i)) * fs[i,m] + for e in range(nElectrons, spinOrbitals): + fo[i,m] += 0.5 * fs[e,m] * ts[e,i] + for n in range(0, nElectrons): + fo[i,m] += ts[e,n] * eriMOspin[m,n,i,e] + for f in range(nElectrons, spinOrbitals): + fo[i,m] += 0.5 * tauSpin(i,n,e,f,ts,td) * eriMOspin[m,n,e,f] + #equation (5) + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + fm[e,m] += fs[e,m] + for n in range(0, nElectrons): + for f in range(nElectrons, spinOrbitals): + fm[e,m] += ts[f,n] * eriMOspin[m,n,e,f] + #equation (6) + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for i in range(0, nElectrons): + for j in range(0, nElectrons): + wo[i,j,m,n] +=eriMOspin[m,n,i,j] + for e in range(nElectrons, spinOrbitals): + wo[i,j,m,n] += ts[e,j] * eriMOspin[m,n,i,e] - ts[e,i] * eriMOspin[m,n,j,e] + for f in range(nElectrons, spinOrbitals): + wo[i,j,m,n] += 0.25 * tau(i,j,e,f,ts,td) * eriMOspin[m,n,e,f] + #equation (7) + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + wu[e,f,a,b] += eriMOspin[a,b,e,f] + for m in range(0, nElectrons): + wu[e,f,a,b] += -ts[b,m] * eriMOspin[a,m,e,f] + ts[a,m] * eriMOspin[b,m,e,f] + for n in range(0, nElectrons): + wu[e,f,a,b] += 0.25 * tau(m,n,a,b,ts,td) * eriMOspin[m,n,e,f] + #equation (8) + for m in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for j in range(0, nElectrons): + wm[e,j,m,b] += eriMOspin[m,b,e,j] + for f in range(nElectrons, spinOrbitals): + wm[e,j,m,b] += ts[f,j] * eriMOspin[m,b,e,f] + for n in range(0, nElectrons): + wm[e,j,m,b] -= ts[b,n] * eriMOspin[m,n,e,j] + for f in range(nElectrons, spinOrbitals): + wm[e,j,m,b] -= (0.5 * td[f,b,j,n] + ts[f,j] * ts[b,n]) * eriMOspin[m,n,e,f] + + ts = amplitudesT1() + td = amplitudesT2() + + return ts, td + +def amplitudesT3(fs, ts, td, eriMOspin, nElectrons): + # perturbative triples correction + + spinOrbitals = fs.shape[0] + tttd = 0.0 + et = 0.0 + + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for k in range(0, nElectrons): + + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + for c in range(nElectrons, spinOrbitals): + + fockDenominator = fs[i,i] + fs[j,j] + fs[k,k] - fs[a,a] - fs[b,b] - fs[c,c] + + tttd = (ts[a,i] * eriMOspin[j,k,b,c] - ts[a,j] * eriMOspin[i,k,b,c] - ts[a,k] * eriMOspin[j,i,b,c] - \ + ts[b,i] * eriMOspin[j,k,a,c] + ts[b,j] * eriMOspin[i,k,a,c] + ts[b,k] * eriMOspin[j,i,a,c] - \ + ts[c,i] * eriMOspin[j,k,b,a] + ts[c,j] * eriMOspin[i,k,b,a] + ts[c,k] * eriMOspin[j,i,b,a]) + tttd /= fockDenominator + + tttc = 0.0 + for e in range(nElectrons, spinOrbitals): + tttc += (td[a,e,j,k] * eriMOspin[e,i,b,c] - td[a,e,i,k] * eriMOspin[e,j,b,c] - td[a,e,j,i] * eriMOspin[e,k,b,c] \ + - td[b,e,j,k] * eriMOspin[e,i,a,c] + td[b,e,i,k] * eriMOspin[e,j,a,c] + td[b,e,j,i] * eriMOspin[e,k,a,c] \ + - td[c,e,j,k] * eriMOspin[e,i,b,a] + td[c,e,i,k] * eriMOspin[e,j,b,a] + td[c,e,j,i] * eriMOspin[e,k,b,a]) + + for m in range(0, nElectrons): + tttc -= (td[b,c,i,m] * eriMOspin[m,a,j,k] - td[b,c,j,m] * eriMOspin[m,a,i,k] - td[b,c,k,m] * eriMOspin[m,a,j,i] \ + - td[a,c,i,m] * eriMOspin[m,b,j,k] + td[a,c,j,m] * eriMOspin[m,b,i,k] + td[a,c,k,m] * eriMOspin[m,b,j,i] \ + - td[b,a,i,m] * eriMOspin[m,c,j,k] + td[b,a,j,m] * eriMOspin[m,c,i,k] + td[b,a,k,m] * eriMOspin[m,c,j,i]) + tttc /= fockDenominator + + et += tttc * (tttc + tttd) * fockDenominator / 36.0 + + return et + +def ccsd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, SCFenergy, diisStatus): + #compute the charged coupled single and doubles + + spinOrbitals = (fock.shape[0]) * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #amplitude array for singles and doubles + ts = np.zeros((spinOrbitals, spinOrbitals)) + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #get mp2 + mp2 = 0.0 + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + Dijab = fockMOspin[i,i] + fockMOspin[j,j] - fockMOspin[a,a] - fockMOspin[b,b] + td[a,b,i,j] = eriMOspin[i,j,a,b] / Dijab + mp2 += 0.25 * eriMOspin[i,j,a,b] * td[a,b,i,j] + + #diis variables + if diisStatus == 'on': + diisCapacity = 6 + diis = diis_c(diisCapacity, [ts, td]) + + #start the convergence iterations + energy = 0.0 + rmsAmplitudes = 0.0 + for cycle in range(1 , iterations): + + diis.refresh_store([ts, td]) + ts,td = updateIntermediates(fockMOspin, ts, td, eriMOspin, nElectrons) + + energy = ccsdEnergy(fockMOspin, ts, td, eriMOspin, nElectrons) + + #test convergence + rms = max(sqrt(np.sum(ts*ts)) ,sqrt(np.sum(td*td))) + if cycle != 1: + deltaEnergy = abs(preEnergy - energy) + deltaAmplitudes = abs(rmsAmplitudes - rms) + postSCF([energy, deltaEnergy, deltaAmplitudes, cycle, diisStatus], 'diis-sd') + + if (deltaEnergy < convergence) and (deltaAmplitudes < convergence): + break + + preEnergy = energy + rmsAmplitudes = rms + #diis + if diisStatus == 'on': + ts, td = diis.build([ts, td]) + + postSCF([cycle,energy, amplitudesT3(fockMOspin, ts, td, eriMOspin, nElectrons), mp2, SCFenergy], 'ccsd(t)') + + return energy, ts, td + +def ccsdEnergy(fs, ts, td, eriMOspin, nElectrons): + #compute the ccsd energy + energy = 0.0 + mp2 = 0 + spinOrbitals = fs.shape[0] + + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + energy += fs[i,a] * ts[i,a] + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + mp2 = 0.25 * eriMOspin[i,j,a,b] * td[a,b,i,j] + energy += mp2 + 0.5 * eriMOspin[i,j,a,b] * ts[a,i] * ts[b,j] + return energy + +def lccd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, SCFenergy): + #coupled electron pairs approximation zero order + + spinOrbitals = (fock.shape[0]) * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #amplitude array for singles and doubles + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #start the convergence iterations + energy = 0.0 + rmsAmplitudes = 0.0 + diisStatus = 'off' + + for cycle in range(1 , iterations): + + td = lccdAmplitudes(td, fockMOspin, eriMOspin, nElectrons, spinOrbitals) + + energy = ccdEnergy(td, eriMOspin, nElectrons, spinOrbitals) + + rms = sqrt(np.sum(td*td)) + if cycle != 1: + deltaEnergy = abs(preEnergy - energy) + deltaAmplitudes = abs(rmsAmplitudes - rms) + postSCF([energy, deltaEnergy, deltaAmplitudes, cycle, diisStatus], 'diis-ld') + + if (deltaEnergy < convergence) and (deltaAmplitudes < convergence): + break + + preEnergy = energy + rmsAmplitudes = rms + + + postSCF([cycle, energy, SCFenergy], 'lccd') + + return energy + + +def lccdAmplitudes(td, fs, eriMOspin, nElectrons, spinOrbitals): + #compute coupled electron pair approximation + + TD = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + + TD[a,b,i,j] = eriMOspin[i,j,a,b] #[D1] + + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += fs[e,b] * (1 - (b == e)) * td[a,e,i,j] - \ + fs[e,a] * (1 - (a == e)) * td[b,e,i,j] #[D2a] + + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += 0.5 * eriMOspin[e,f,a,b] * td[e,f,i,j] #[D2c] + + + for m in range(0, nElectrons): + TD[a,b,i,j] += -fs[j,m] * (1 - (m == j)) *td[a,b,i,m] + \ + fs[i,m] * (1 - (m == i)) *td[a,b,i,m] #[D2b] + + for n in range(0, nElectrons): + TD[a,b,i,j] += 0.5 * eriMOspin[i,j,m,n] * td[a,b,m,n] #[D2d] + + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += eriMOspin[e,j,m,b] * td[a,e,i,m] - \ + eriMOspin[e,i,m,b] * td[a,e,j,m] - \ + eriMOspin[e,j,m,a] * td[b,e,i,m] + \ + eriMOspin[e,i,m,a] * td[b,e,j,m] #[D2e] + + fockDenominator = fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b] + + TD[a,b,i,j] /= fockDenominator + + return TD + +def ccdEnergy( td, eriMOspin, nElectrons, spinOrbitals): + + energy = 0.0 + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + energy += 0.25 * eriMOspin[a,b,i,j] * td[a,b,i,j] + + return energy + +def ccd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, SCFenergy): + #coupled cluster doubles + + spinOrbitals = (fock.shape[0]) * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #amplitude array for singles and doubles + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #start the convergence iterations + energy = 0.0 + rmsAmplitudes = 0.0 + diisStatus = 'off' + + for cycle in range(1 , iterations): + + td = ccdAmplitudes(td, fockMOspin, eriMOspin, nElectrons, spinOrbitals) + + #can reuse cepaEnergy as algorithm the same + energy = ccdEnergy(td, eriMOspin, nElectrons, spinOrbitals) + + rms = sqrt(np.sum(td*td)) + if cycle != 1: + deltaEnergy = abs(preEnergy - energy) + deltaAmplitudes = abs(rmsAmplitudes - rms) + postSCF([energy, deltaEnergy, deltaAmplitudes, cycle, diisStatus], 'diis-sd') + + if (deltaEnergy < convergence) and (deltaAmplitudes < convergence): + break + + preEnergy = energy + rmsAmplitudes = rms + + postSCF([cycle, energy, SCFenergy], 'ccd') + + return energy + + +def ccdAmplitudes(td, fs, eriMOspin, nElectrons, spinOrbitals): + #compute coupled electron pair approximation + + TD = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + + #linear + TD[a,b,i,j] = eriMOspin[i,j,a,b] #[D1] + + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += fs[e,b] * (1 - (b == e)) * td[a,e,i,j] - \ + fs[e,a] * (1 - (a == e)) * td[b,e,i,j] #[D2a] + + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += 0.5 * eriMOspin[e,f,a,b] * td[e,f,i,j] #[D2c] + + + for m in range(0, nElectrons): + TD[a,b,i,j] += -fs[j,m] * (1 - (m == j)) *td[a,b,i,m] + \ + fs[i,m] * (1 - (m == i)) *td[a,b,i,m] #[D2b] + + for n in range(0, nElectrons): + TD[a,b,i,j] += 0.5 * eriMOspin[i,j,m,n] * td[a,b,m,n] #[D2d] + + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += eriMOspin[e,j,m,b] * td[a,e,i,m] - \ + eriMOspin[e,i,m,b] * td[a,e,j,m] - \ + eriMOspin[e,j,m,a] * td[b,e,i,m] + \ + eriMOspin[e,i,m,a] * td[b,e,j,m] #[D2e] + + #quadratic + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += -0.5 * eriMOspin[e,f,m,n] * td[f,b,i,j] * td[a,e,n,m] + \ + 0.5 * eriMOspin[e,f,m,n] * td[f,a,i,j] * td[b,e,n,m] #[D3d] + + TD[a,b,i,j] += -0.5 * eriMOspin[e,f,m,n] * td[a,b,n,j] * td[f,e,i,m] + \ + 0.5 * eriMOspin[e,f,m,n] * td[a,b,n,i] * td[f,e,j,m] #[D3c] + + TD[a,b,i,j] += 0.25 * eriMOspin[e,f,m,n] * td[e,f,i,j] * td[a,b,m,n] #[D3a] + + TD[a,b,i,j] += eriMOspin[e,f,m,n] * td[a,e,i,m] * td[b,f,j,n] - \ + eriMOspin[e,f,m,n] * td[a,e,j,m] * td[b,f,i,n] #[D3a] + + + + fockDenominator = fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b] + + TD[a,b,i,j] /= fockDenominator + + return TD + +def ccsd_lambda(fs, eriMOspin, ts, td, nElectrons, iterations, tolerance): + #CCSD lambda equations - Gauss and Stanton J. Chem. Phys.103(9), 1 September 1995 + + spinOrbitals = fs.shape[0] + + #initial guess from lambda amplitudes + ls = ts * 0.0 + ld = td.copy() + ld.transpose(2,3,0,1) + + def tauSpin(i, j, a, b, ts, td): + # table III(d) + return td[a,b,i,j] + 0.5 * (ts[a,i] * ts[b,j] - ts[b,i] * ts[a,j]) + + def tau(i, j, a, b, ts, td): + #table III(d) + return td[a,b,i,j] + ts[a,i] * ts[b,j] - ts[b,i] * ts[a,j] + + def buildLambdaIntermediates(type = ''): + #fs - fockSpin ts - tsingle cluster operator td - tdouble cluster operator + #eriMOspin - electron repulsion integrals in the MO spin + + + + fi = np.zeros((spinOrbitals, spinOrbitals)) + wi = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + if type == 'ae': + #table III(a)[1] (b)[1] F[ae] + fi[:,:] = 0.0 + for a in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + fi[a,e] += (1 - (a == e)) * fs[a,e] + for m in range(0, nElectrons): + fi[a,e] -= fs[e,m] * ts[a,m] + for f in range(nElectrons, spinOrbitals): + fi[a,e] += ts[f,m] * eriMOspin[a,m,e,f] + for n in range(0, nElectrons): + fi[a,e] -= 0.5 * tauSpin(m,n,a,f,ts,td) * eriMOspin[m,n,e,f] + fi[a,e] -= 0.5 * ts[a,m] * ts[f,n] * eriMOspin[m,n,e,f] + return fi + + if type == 'mi': + #table III(a)[2] (b)[2] F[mi] + fi[:,:] = 0.0 + for m in range(0, nElectrons): + for i in range(0, nElectrons): + fi[m,i] += (1 - (m == i)) * fs[m,i] + for e in range(nElectrons, spinOrbitals): + fi[m,i] += fs[e,m] * ts[e,i] + for n in range(0, nElectrons): + fi[m,i] += ts[e,n] * eriMOspin[m,n,i,e] + for f in range(nElectrons, spinOrbitals): + fi[m,i] += 0.5 * tauSpin(i,n,e,f,ts,td) * eriMOspin[m,n,e,f] + fi[m,i] += 0.5 * ts[e,i] * ts[f,n] * eriMOspin[m,n,e,f] + return fi + + if type == 'me': + #table III(a)[3] (b)[3] F[me] + fi[:,:] = 0.0 + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + fi[m,e] += fs[m,e] + for n in range(0, nElectrons): + for f in range(nElectrons, spinOrbitals): + fi[m,e] += ts[f,n] * eriMOspin[m,n,e,f] + return fi + + if type == 'mnij': + #table III(a)[4] (b)[4] W[mnij] + wi[:,:,:,:] = 0.0 + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for i in range(0, nElectrons): + for j in range(0, nElectrons): + wi[m,n,i,j] +=eriMOspin[m,n,i,j] + for e in range(nElectrons, spinOrbitals): + wi[m,n,i,j] += ts[e,j] * eriMOspin[m,n,i,e] - ts[e,i] * eriMOspin[m,n,j,e] + for f in range(nElectrons, spinOrbitals): + wi[m,n,i,j] += 0.5 * tau(i,j,e,f,ts,td) * eriMOspin[m,n,e,f] + return wi + + if type == 'abef': + #table III(a)[5] (b)[5] W[abef] + wi[:,:,:,:] = 0.0 + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + wi[a,b,e,f] += eriMOspin[a,b,e,f] + for m in range(0, nElectrons): + wi[a,b,e,f] += -ts[b,m] * eriMOspin[a,m,e,f] + ts[a,m] * eriMOspin[b,m,e,f] + for n in range(0, nElectrons): + wi[a,b,e,f] += 0.5 * tau(m,n,a,b,ts,td) * eriMOspin[m,n,e,f] + return wi + + if type == 'mbej': + #table III(a)[6] (b)[6] W[mbej] + wi[:,:,:,:] = 0.0 + for m in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for j in range(0, nElectrons): + wi[m,b,e,j] += eriMOspin[m,b,e,j] + for f in range(nElectrons, spinOrbitals): + wi[m,b,e,j] += ts[f,j] * eriMOspin[m,b,e,f] + for n in range(0, nElectrons): + wi[m,b,e,j] -= ts[b,n] * eriMOspin[m,n,e,j] + for f in range(nElectrons, spinOrbitals): + wi[m,b,e,j] -= (td[f,b,j,n] + ts[f,j] * ts[b,n]) * eriMOspin[m,n,e,f] + return wi + + if type == 'abei': + wu = buildLambdaIntermediates('abef') + fm = buildLambdaIntermediates('me') + #table III(b)[10] W[abei] + wi[:,:,:,:] = 0.0 + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for i in range(0, nElectrons): + wi[a,b,e,i] += eriMOspin[a,b,e,i] + for m in range(0, nElectrons): + wi[a,b,e,i] -= td[a,b,m,i] * fm[m,e] + wi[a,b,e,i] += -ts[a,m] * eriMOspin[m,b,e,i] + ts[b,m] * eriMOspin[m,a,e,i] + for n in range(0, nElectrons): + wi[a,b,e,i] += 0.5 * tau(m,n,a,b,ts,td) * eriMOspin[m,n,e,i] + for f in range(nElectrons, spinOrbitals): + wi[a,b,e,i] += ts[a,m] * td[b,f,n,i] * eriMOspin[m,n,e,f] - ts[b,m] * td[a,f,n,i] * eriMOspin[m,n,e,f] + for f in range(nElectrons, spinOrbitals): + wi[a,b,e,i] += -td[a,f,m,i] * eriMOspin[m,b,e,f] + td[b,f,m,i] * eriMOspin[m,a,e,f] + for f in range(nElectrons, spinOrbitals): + wi[a,b,e,i] += ts[f,i] * wu[a,b,e,f] + return wi + + if type == 'mbij': + wo = buildLambdaIntermediates('mnij') + fm = buildLambdaIntermediates('me') + #table III(b)[9] W[mbij] + wi[:,:,:,:] = 0.0 + for m in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + for i in range(0, nElectrons): + for j in range(0, nElectrons): + wi[m,b,i,j] += eriMOspin[m,b,i,j] + for e in range(nElectrons, spinOrbitals): + wi[m,b,i,j] -= td[b,e,i,j] * fm[m,e] + wi[m,b,i,j] += ts[e,i] * eriMOspin[m,b,e,j] - ts[e,j] * eriMOspin[m,b,e,i] + for f in range(nElectrons, spinOrbitals): + wi[m,b,i,j] += 0.5 * tau(i,j,e,f,ts,td) * eriMOspin[m,b,e,f] + for n in range(0, nElectrons): + wi[m,b,i,j] += -ts[e,i] * td[b,f,n,j] * eriMOspin[m,n,e,f] + ts[e,j] * td[b,f,n,i] * eriMOspin[m,n,e,f] + for n in range(0, nElectrons): + wi[m,b,i,j] += td[b,e,j,n] * eriMOspin[m,n,i,e] - td[b,e,i,n] * eriMOspin[m,n,j,e] + for n in range(0, nElectrons): + wi[m,b,i,j] -= ts[b,n] * wo[m,n,i,j] + return wi + + if type == 'amef': + #table III(b)[8] W[amef] + wi[:,:,:,:] = 0.0 + for a in range(nElectrons, spinOrbitals): + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + wi[a,m,e,f] += eriMOspin[a,m,e,f] + for n in range(0, nElectrons): + wi[a,m,e,f] -= ts[a,n] * eriMOspin[n,m,e,f] + return wi + + if type == 'mnie': + #table III(b)[7] W[mnie] + wi[:,:,:,:] = 0.0 + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for i in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + wi[m,n,i,e] += eriMOspin[m,n,i,e] + for f in range(nElectrons, spinOrbitals): + wi[m,n,i,e] += ts[f,i] * eriMOspin[m,n,f,e] + return wi + + def buildGintermediates(type = ''): + #build the G lambda intermediates + + gi = np.zeros((spinOrbitals, spinOrbitals)) + + if type == 'ae': + #table III(c)[1] + gi[:,:] = 0.0 + for a in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for f in range(nElectrons, spinOrbitals): + gi[a,e] -= 0.5 * td[e,f,m,n] * ld[m,n,a,f] + return gi + + if type == 'mi': + #table III(c)[1] + gi[:,:] = 0.0 + for m in range(0, nElectrons): + for i in range(0, nElectrons): + for n in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + gi[m,i] += 0.5 * td[e,f,m,n] * ld[i,n,e,f] + return gi + + + #evaluate intermediates + fme = buildLambdaIntermediates('me') + fae = buildLambdaIntermediates('ae') + fmi = buildLambdaIntermediates('mi') + wmnij = buildLambdaIntermediates('mnij') + wabef = buildLambdaIntermediates('abef') + wmbej = buildLambdaIntermediates('mbej') + + wmnie = buildLambdaIntermediates('mnie') + wamef = buildLambdaIntermediates('amef') + wmbij = buildLambdaIntermediates('mbij') + wabei = buildLambdaIntermediates('abei') + + preLambdaCorrelationEnergy = 0.0 + + #start energy loop + for cycle in range(iterations): + + #build lambda intermediates + gae = buildGintermediates('ae') + gmi = buildGintermediates('mi') + + #make the lambda singles Table II(a) + LS = np.zeros_like(ls) + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + LS[i,a] += fme[i,a] + for e in range(nElectrons, spinOrbitals): + LS[i,a] += ls[i,e] * fae[e,a] + for f in range(nElectrons, spinOrbitals): + LS[i,a] -= gae[e,f] * wamef[e,i,f,a] + for m in range(0, nElectrons): + LS[i,a] -= ls[m,a] * fmi[i,m] + for n in range(0, nElectrons): + LS[i,a] -= gmi[m,n] * wmnie[m,i,n,a] + for e in range(nElectrons, spinOrbitals): + LS[i,a] += ls[m,e] * wmbej[i,e,a,m] + for f in range(nElectrons, spinOrbitals): + LS[i,a] += 0.5 * ld[i,m,e,f] * wabei[e,f,a,m] + for n in range(0, nElectrons): + LS[i,a] -= 0.5 * ld[m,n,a,e] * wmbij[i,e,m,n] + + LS[i,a] /= (fs[i,i] - fs[a,a]) + + #make the lambda doubles Table II(b) + LD = np.zeros_like(ld) + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + LD[i,j,a,b] += eriMOspin[i,j,a,b] + LD[i,j,a,b] += ls[i,a] * fme[j,b] - ls[i,b] * fme[j,a] - \ + ls[j,a] * fme[i,b] + ls[j,b] * fme[i,a] + for e in range(nElectrons, spinOrbitals): + LD[i,j,a,b] += ld[i,j,a,e] * fae[e,b] - ld[i,j,b,e] * fae[e,a] + LD[i,j,a,b] += ls[i,e] * wamef[e,j,a,b] - ls[j,e] * wamef[e,i,a,b] + LD[i,j,a,b] += eriMOspin[i,j,a,e] * gae[b,e] - eriMOspin[i,j,b,e] *gae[a,e] + for f in range(nElectrons, spinOrbitals): + LD[i,j,a,b] += 0.5 * ld[i,j,e,f] * wabef[e,f,a,b] + for m in range(0, nElectrons): + LD[i,j,a,b] += ld[i,m,a,e] * wmbej[j,e,b,m] - ld[i,m,b,e] * wmbej[j,e,a,m] -\ + ld[j,m,a,e] * wmbej[i,e,b,m] + ld[j,m,b,e] * wmbej[i,e,a,m] + for m in range(0, nElectrons): + LD[i,j,a,b] += -ld[i,m,a,b] * fmi[j,m] + ld[j,m,a,b] * fmi[i,m] + LD[i,j,a,b] += -ls[m,a] * wmnie[i,j,m,b] + ls[m,b] * wmnie[i,j,m,a] + LD[i,j,a,b] += -eriMOspin[i,m,a,b] * gmi[m,j] + eriMOspin[j,m,a,b] * gmi[m,i] + for n in range(0, nElectrons): + LD[i,j,a,b] += 0.5 * ld[m,n,a,b] * wmnij[i,j,m,n] + + LD[i,j,a,b] /= (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) + + ls = LS + ld = LD + + #compute lambda pseudo-energy + lambdaCorrelationEnergy = 0.0 + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + lambdaCorrelationEnergy += fs[a,i] * ls[i,a] + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + lambdaCorrelationEnergy += 0.25 * eriMOspin[i,j,a,b] * ld[i,j,a,b] + + #convergence control + if abs(lambdaCorrelationEnergy - preLambdaCorrelationEnergy) < tolerance: + break + + preLambdaCorrelationEnergy = lambdaCorrelationEnergy + + #return lambda intermediates + ims = [fae, fmi, fme, wmnij, wabef, wmbej, wmnie, wamef, wmbij, wabei] + + return lambdaCorrelationEnergy, ls, ld, ims + +def cc2_updateIntermediates(fs, ts, td, eriMOspin, nElectrons): + #fs - fockSpin ts - single cluster operator td - double cluster operator + #eriMOspin - electron repulsion integrals in the MO spin + + def cc2_amplitudesT1(): + # equation (1) CC2 T1 amplitude (same as CCSD) + #diagram labels Shavitt & Bartlett (Many Body methods in Chemistry & Physics Table 10.1) + + TS = np.zeros((spinOrbitals, spinOrbitals)) + + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + TS[a,i] += fs[a,i] #[S1] + + for e in range(nElectrons, spinOrbitals): + TS[a,i] += ts[e,i] * (1 - (a == e)) * fs[e,a] #[S3a] + + for m in range(0, nElectrons): + TS[a,i] -= ts[e,i] * ts[a,m] * fs[e,m] #[S5a] + TS[a,i] += td[a,e,i,m] * fs[e,m] #[S2a] + TS[a,i] += ts[e,m] * eriMOspin[a,m,i,e] #[S3c] + + for n in range(0, nElectrons): + TS[a,i] -= ts[a,m] * ts[e,n] * eriMOspin[m,n,i,e] #[S5c] + TS[a,i] -= 0.5 * td[a,e,m,n] * eriMOspin[m,n,i,e] #[S2c] + + for f in range(nElectrons, spinOrbitals): + TS[a,i] += ts[e,i] * ts[f,m] * eriMOspin[a,m,e,f] #[S5b] + TS[a,i] += 0.5 * td[e,f,i,m] * eriMOspin[a,m,e,f] #[S2b] + + for n in range(0, nElectrons): + TS[a,i] -= 0.5 * ts[e,i] * td[a,f,m,n] * eriMOspin[m,n,e,f] #[S4b] + TS[a,i] -= ts[e,i] * ts[a,m] * ts[f,n] * eriMOspin[m,n,e,f] #[S6] + + TS[a,i] -= 0.5 * ts[a,m] * td[e,f,i,n] * eriMOspin[m,n,e,f] #[S4b] + TS[a,i] += td[a,e,i,m] * ts[f,n] * eriMOspin[m,n,e,f] #[S4c] + + for m in range(0, nElectrons): + TS[a,i] -= ts[a,m] *(1 - (m == i)) * fs[i,m] #[S3b] + + TS[a,i] /= (fs[i,i] - fs[a,a]) + + return TS + + def cc2_amplitudesT2(): + # equation (2) CC2 T2 amplitude (T1H + T2F) + #diagram labels Shavitt & Bartlett (Many Body methods in Chemistry & Physics Table 10.2) + TD = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + TD[a,b,i,j] +=eriMOspin[i,j,a,b] #[D1] + + for m in range(0, nElectrons): + TD[a,b,i,j] += -ts[a,m] * eriMOspin[m,b,i,j] + ts[b,m] * eriMOspin[m,a,i,j] #[D4b] + TD[a,b,i,j] += -td[a,b,i,m] * fs[j,m] * (1 - (m == j)) + td[a,b,j,m] * fs[i,m] * (1 - (m == i)) #[D2b] + + for n in range(0, nElectrons): + TD[a,b,i,j] += ts[a,m] * ts[b,n] * eriMOspin[m,n,i,j] #[D6b] + + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += ts[a,m] * ts[b,n] * ts[e,i] * eriMOspin[m,n,e,j] - \ + ts[a,m] * ts[b,n] * ts[e,j] * eriMOspin[m,n,e,i] #[D8b] + + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += ts[a,m] * ts[b,n] * ts[e,i] * ts[f,j] * eriMOspin[m,n,e,f] #[D9] + + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += ts[e,i] * eriMOspin[a,b,e,j] - ts[e,j] * eriMOspin[a,b,e,i] #[D4a] + TD[a,b,i,j] += td[a,e,i,j] * fs[e,b] * (1 - (b == e)) #[D2a] + + for m in range(0, nElectrons): + TD[a,b,i,j] += -ts[e,i] * ts[a,m] * eriMOspin[m,b,e,j] + \ + ts[e,i] * ts[b,m] * eriMOspin[m,a,e,j] + \ + ts[e,j] * ts[a,m] * eriMOspin[m,b,e,i] - \ + ts[e,j] * ts[b,m] * eriMOspin[m,a,e,i] #[D6c] + + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += ts[e,i] * ts[f,j] * eriMOspin[a,b,e,f] #[D6a] + + for m in range(0, nElectrons): + TD[a,b,i,j] += -ts[e,i] * ts[f,j] * ts[a,m] * eriMOspin[m,b,e,f] + \ + ts[e,i] * ts[f,j] * ts[b,m] * eriMOspin[m,a,e,f] #[D8a] + + TD[a,b,i,j] /= (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) + + return TD + + spinOrbitals = fs.shape[0] + + ts = cc2_amplitudesT1() + td = cc2_amplitudesT2() + + return ts, td + + +def cc2(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, SCFenergy, diisStatus): + #compute the charged coupled single and doubles + + spinOrbitals = (fock.shape[0]) * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #amplitude array for singles and doubles + ts = np.zeros((spinOrbitals, spinOrbitals)) + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + # #previous iteration amplitudes needed for diis + # preTs = np.zeros_like(ts) + # preTd = np.zeros_like(td) + + #get mp2 + mp2 = 0.0 + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + Dijab = fockMOspin[i,i] + fockMOspin[j,j] - fockMOspin[a,a] - fockMOspin[b,b] + td[a,b,i,j] = eriMOspin[i,j,a,b] / Dijab + mp2 += 0.25 * eriMOspin[i,j,a,b] * td[a,b,i,j] + + diisCapacity = 6 + diis = diis_c(diisCapacity, [ts, td]) + + #start the convergence iterations + energy = 0.0 + rmsAmplitudes = 0.0 + for cycle in range(1 , iterations): + + diis.refresh_store([ts, td]) + ts,td = cc2_updateIntermediates(fockMOspin, ts, td, eriMOspin, nElectrons) + + energy = ccsdEnergy(fockMOspin, ts, td, eriMOspin, nElectrons) + + #test convergence + rms = max(sqrt(np.sum(ts*ts)) ,sqrt(np.sum(td*td))) + if cycle != 1: + deltaEnergy = abs(preEnergy - energy) + deltaAmplitudes = abs(rmsAmplitudes - rms) + postSCF([energy, deltaEnergy, deltaAmplitudes, cycle, diisStatus], 'diis-c2') + + if (deltaEnergy < convergence) and (deltaAmplitudes < convergence): + break + + preEnergy = energy + rmsAmplitudes = rms + #diis + if diisStatus == 'on': + ts, td = diis.build([ts, td]) + + postSCF([cycle, energy, mp2, SCFenergy], 'cc2') + + return energy, ts, td + +def lccsd(atoms, eigenVectors, charge, fock, ERI, iterations, convergence, diisStatus, SCFenergy): + #coupled electron pairs approximation zero order + + spinOrbitals = (fock.shape[0]) * 2 + nElectrons = electronCount(atoms, charge) + + #get fock in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #amplitude array for singles and doubles + ts = np.zeros((spinOrbitals, spinOrbitals)) + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #previous iteration amplitudes needed for diis + preTs = np.zeros_like(ts) + preTd = np.zeros_like(td) + + #diis variables + if diisStatus == 'on': + diisCapacity = 6 + diis = diis_c(diisCapacity, [ts, td]) + + #start the convergence iterations + energy = 0.0 + rmsAmplitudes = 0.0 + for cycle in range(1 , iterations): + + diis.refresh_store([ts, td]) + ts, td = lccsd_updateIntermediates(ts, td, fockMOspin, eriMOspin, nElectrons, spinOrbitals) + + energy = lccsdEnergy(fockMOspin, ts, td, eriMOspin, nElectrons, spinOrbitals) + + #test convergence + rms = max(sqrt(np.sum(ts*ts)) ,sqrt(np.sum(td*td))) + if cycle != 1: + deltaEnergy = abs(preEnergy - energy) + deltaAmplitudes = abs(rmsAmplitudes - rms) + postSCF([energy, deltaEnergy, deltaAmplitudes, cycle, diisStatus], 'diis-ls') + + if (deltaEnergy < convergence) and (deltaAmplitudes < convergence): + break + + preEnergy = energy + rmsAmplitudes = rms + + #diis + if diisStatus == 'on': + ts, td = diis.build([ts, td]) + + postSCF([cycle, energy, SCFenergy], 'lccsd') + + return energy, ts, td + + +def lccsd_updateIntermediates(ts, td, fs, eriMOspin, nElectrons, spinOrbitals): + #fs - fockSpin ts - tsingle cluster operator td - double cluster operator + #eriMOspin - electron repulsion integrals in the MO spin + + def lccsd_amplitudesT1(): + # using S1, S2a, S2b, S2c, S3a, S3b and S3c + TS = np.zeros((spinOrbitals, spinOrbitals)) + + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + TS[a,i] += fs[a,i] #[S1] + + for e in range(nElectrons, spinOrbitals): + TS[a,i] += ts[e,i] * (1 - (a == e)) * fs[e,a] #[S3a] + + for m in range(0, nElectrons): + TS[a,i] += td[a,e,i,m] * fs[e,m] #[S2a] + TS[a,i] += ts[e,m] * eriMOspin[a,m,i,e] #[S3c] + + for n in range(0, nElectrons): + TS[a,i] -= 0.5 * td[a,e,m,n] * eriMOspin[m,n,i,e] #[S2c] + + for f in range(nElectrons, spinOrbitals): + TS[a,i] += 0.5 * td[e,f,i,m] * eriMOspin[a,m,e,f] #[S2b] + + for m in range(0, nElectrons): + TS[a,i] -= ts[a,m] *(1 - (m == i)) * fs[i,m] #[S3b] + + TS[a,i] /= (fs[i,i] - fs[a,a]) + + return TS + + def lccsd_amplitudesT2(): + # using D1, D2a, D2b, D2c, D2d, D2e, D4a, D4b + + TD = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + + TD[a,b,i,j] = eriMOspin[i,j,a,b] #[D1] + + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += fs[e,b] * (1 - (b == e)) * td[a,e,i,j] - \ + fs[e,a] * (1 - (a == e)) * td[b,e,i,j] #[D2a] + TD[a,b,i,j] += ts[e,i] * eriMOspin[a,b,e,j] - ts[e,j] * eriMOspin[a,b,e,i] #[D4a] + + for f in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += 0.5 * eriMOspin[e,f,a,b] * td[e,f,i,j] #[D2c] + + + for m in range(0, nElectrons): + TD[a,b,i,j] += -fs[j,m] * (1 - (m == j)) *td[a,b,i,m] + \ + fs[i,m] * (1 - (m == i)) *td[a,b,j,m] #[D2b] + TD[a,b,i,j] += -ts[a,m] * eriMOspin[m,b,i,j] + ts[b,m] * eriMOspin[m,a,i,j] #[D4b] + + for n in range(0, nElectrons): + TD[a,b,i,j] += 0.5 * eriMOspin[i,j,m,n] * td[a,b,m,n] #[D2d] + + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + TD[a,b,i,j] += eriMOspin[e,j,m,b] * td[a,e,i,m] - \ + eriMOspin[e,i,m,b] * td[a,e,j,m] - \ + eriMOspin[e,j,m,a] * td[b,e,i,m] + \ + eriMOspin[e,i,m,a] * td[b,e,j,m] #[D2e] + + fockDenominator = fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b] + + TD[a,b,i,j] /= fockDenominator + + return TD + + ts = lccsd_amplitudesT1() + td = lccsd_amplitudesT2() + + return ts, td + +def lccsdEnergy(fs, ts, td, eriMOspin, nElectrons, spinOrbitals): + + energy = 0.0 + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + energy += fs[a,i] * ts[a,i] + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + energy += 0.25 * eriMOspin[a,b,i,j] * td[a,b,i,j] + + return energy diff --git a/source/cc/ucc.py b/source/cc/ucc.py new file mode 100644 index 0000000..3ec0752 --- /dev/null +++ b/source/cc/ucc.py @@ -0,0 +1,385 @@ +from __future__ import division +import numpy as np +from diis import diis_c +from view import postSCF +from atom import getConstant +from adc.adc import davidson +from cc.fcc import spinMO + +class unitaryCoupledCluster(object): + #Unitary Coupled Cluster CC2 + + o = None ; v = None + d_tensors = [] + HFenergy = 0.0 + + def __init__(self, fs, gs, e, data): + + self.fs = fs + self.gs = gs + self.e = e + self.ss = None + self.sd = None + self.method, self.electrons, self.cycle_limit, self.convergence, self.verbose, self.roots = data.values() + self.converged = False + + self.guess_vector_factor = 1 + + #check method implemented + if not self.method in ['ucc2', 'ucc2-ee', 'ucc2-s-ee', 'ucc3', 'ucc(4)'] : return None + + self.mp2 = 0.0 + + self.energy = self.iterator(self.update_amplitudes) + + if self.method in ['ucc2-ee', 'ucc2-s-ee']: self.excitations() + + def initialise_amplitudes(self): + #set initial amplitudes + + nocc = self.electrons + n = np.newaxis + o = slice(None, nocc) + v = slice(nocc, None) + + eps = np.kron(self.e, np.ones(2)) + + #d tensors + ds = 1.0 / (eps[o, n] - eps[n, v] ) + dd = 1.0 / (eps[o, n, n, n] + eps[n, o, n, n] - eps[n, n, v, n] - eps[n, n, n, v] ) + dt = 1.0 / (eps[o, n, n, n, n, n] + eps[n, o, n, n, n, n] + eps[n, n, o, n, n, n]- \ + eps[n, n, n, v, n, n] - eps[n, n, n, n, v, n] - eps[n, n, n, n, n, v] ) + + self.d_tensors = [ds, dd, dt] + + #initial amplitudes and mp2 energy + self.ss = np.zeros_like(self.fs[o,v]) ; self.sd = self.gs[o, o, v, v]*dd ; self.st = np.zeros_like(dt) + self.mp2 = 0.25 * np.einsum('ijab,ijab->', self.gs[o, o, v, v], self.sd, optimize=True) + self.td = self.sd.copy() + + #Hartree-Fock energy + self.HFenergy = np.einsum('ii', self.fs[o, o]) - 0.5 * np.einsum('ijij', self.gs[o, o, o, o]) + + #class variables + self.o = o ; self.v = v + + def update_amplitudes(self, iterative=True): + #compute the next cycle amplitudes + + o = self.o ; v = self.v + + if self.method in ['ucc2', 'ucc2-s-ee', 'ucc2-ee']: + if not iterative: + s1 = 0.5 * np.einsum('ajbc,ijbc->ia', self.gs[v,o,v,v], self.sd, optimize=True) + s1 -= 0.5 * np.einsum('jkib,jkab->ia', self.gs[o,o,o,v], self.sd, optimize=True) + + self.ss = s1 * self.d_tensors[0] + + s2 = self.gs[o,o,v,v].copy() + s2 += 0.5 * np.einsum('abcd,ijcd->ijab', self.gs[v,v,v,v], self.sd, optimize=True) + s2 += 0.5 * np.einsum('klij,klab->ijab', self.gs[o,o,o,o], self.sd, optimize=True) + + t = np.einsum('kbcj,ikac->ijab', self.gs[o,v,v,o], self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + + self.sd = s2 * self.d_tensors[1] + + if self.method == 'ucc3': + s1 = 0.5 * np.einsum('ajbc,ijbc->ia', self.gs[v,o,v,v], self.sd, optimize=True) + s1 -= 0.5 * np.einsum('jkib,jkab->ia', self.gs[o,o,o,v], self.sd, optimize=True) + s1 += np.einsum('ajib,jb->ia', self.gs[v,o,o,v], self.ss, optimize=True) + s1 += 0.5 * np.einsum('abij,jb->ia', self.gs[v,v,o,o], self.ss, optimize=True) + s1 -= 0.5 * np.einsum('alik,ljcb,kjcb->ia', self.gs[v,o,o,o], self.sd, self.sd, optimize=True) + s1 += 0.5 * np.einsum('adic,kjcb,kjdb->ia', self.gs[v,v,o,v], self.sd, self.sd, optimize=True) + s1 -= 0.25* np.einsum('bcid,jkad,jkbc->ia', self.gs[v,v,o,v], self.sd, self.sd, optimize=True) + s1 += 0.25* np.einsum('aljk,ilbc,jkbc->ia', self.gs[v,o,o,o], self.sd, self.sd, optimize=True) + s1 -= np.einsum('acjd,ikbd,jkbc->ia', self.gs[v,v,o,v], self.sd, self.sd, optimize=True) + s1 += np.einsum('blik,jlac,jkbc->ia', self.gs[v,o,o,o], self.sd, self.sd, optimize=True) + s1 -= 0.25*np.einsum('bljk,ilac,jkbc->ia', self.gs[v,o,o,o], self.sd, self.sd, optimize=True) + s1 += 0.25*np.einsum('bdjc,ikac,jkbd->ia', self.gs[v,v,o,v], self.sd, self.sd, optimize=True) + + self.ss = s1 * self.d_tensors[0] + + s2 = self.gs[o,o,v,v].copy() + s2 += 0.5 * np.einsum('abcd,ijcd->ijab', self.gs[v,v,v,v], self.sd, optimize=True) + s2 += 0.5 * np.einsum('klij,klab->ijab', self.gs[o,o,o,o], self.sd, optimize=True) + + t = np.einsum('kbcj,ikac->ijab', self.gs[o,v,v,o], self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + + t = np.einsum('abcj,ic->ijab', self.gs[v,v,v,o], self.ss, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + t = -np.einsum('kbij,ka->ijab', self.gs[o,v,o,o], self.ss, optimize=True) + s2 += t - t.transpose(0,1,3,2) + + t = (1/3) * np.einsum('klcd,ikac,ljdb->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + + s2 += (1/6) * np.einsum('klcd,ijcd,klab->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + + t = -(1/3) * np.einsum('klcd,ijac,klbd->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + + t = -(1/3) * np.einsum('klcd,ikab,jlcd->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + t = (1/3) * np.einsum('acik,ljdb,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + + s2 += (1/12) * np.einsum('cdij,klab,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += (1/12) * np.einsum('abkl,ijcd,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + + t = -(1/6) * np.einsum('cdki,ljab,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + t = -(1/6) * np.einsum('cakl,ijdb,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + + t = -(1/6) * np.einsum('acij,klbd,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + + t = -(1/6) * np.einsum('abik,jlcd,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + self.sd = s2 * self.d_tensors[1] + + if self.method == 'ucc(4)': + s1 = 0.5 * np.einsum('ajbc,ijbc->ia', self.gs[v,o,v,v], self.sd, optimize=True) + s1 -= 0.5 * np.einsum('jkib,jkab->ia', self.gs[o,o,o,v], self.sd, optimize=True) + + self.ss = s1 * self.d_tensors[0] + + s2 = self.gs[o,o,v,v].copy() + s2 += 0.5 * np.einsum('abcd,ijcd->ijab', self.gs[v,v,v,v], self.sd, optimize=True) + s2 += 0.5 * np.einsum('klij,klab->ijab', self.gs[o,o,o,o], self.sd, optimize=True) + + t = np.einsum('kbcj,ikac->ijab', self.gs[o,v,v,o], self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + t = np.einsum('abcj,ic->ijab', self.gs[v,v,v,o], self.ss, optimize=True) + s2 += t - t.transpose(1,0,2,3) + t = -np.einsum('kbij,ka->ijab', self.gs[o,v,o,o], self.ss, optimize=True) + s2 += t - t.transpose(0,1,3,2) + + t = 0.25 * np.einsum('klcd,ikac,jlbd->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + t = -0.25 * np.einsum('klcd,ikab,jlcd->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + t = -0.25 * np.einsum('klcd,ijac,klbd->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + s2 += 0.125 * np.einsum('klcd,ijcd,klab->ijab', self.gs[o,o,v,v], self.sd, self.sd, optimize=True) + + t = 0.5 * np.einsum('dblj,ikac,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) - t.transpose(0,1,3,2) + t.transpose(1,0,3,2) + s2 += 0.125 * np.einsum('abkl,klcd,ijcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += 0.125 * np.einsum('cdij,klcd,klab->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + t = -0.25 * np.einsum('bdkl,klcd,ijac->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + t = -0.25 * np.einsum('cdjl,klcd,ikab->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + t = -0.25 * np.einsum('dbij,klca,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(0,1,3,2) + t = -0.25 * np.einsum('ablj,ikdc,klcd->ijab', self.gs[v,v,o,o], self.sd, self.sd, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + t = 0.5 * np.einsum('bkcd,ijkacd->ijab', self.gs[v,o,v,v], self.st, optimize=True) + s2 += t - t.transpose(0,1,3,2) + t = -0.5 * np.einsum('kljc,iklabc->ijab', self.gs[o,o,o,v], self.st, optimize=True) + s2 += t - t.transpose(1,0,2,3) + + self.sd = s2 * self.d_tensors[1] + + t = np.einsum('bcdk,ijad->ijkabc', self.gs[v,v,v,o], self.sd, optimize=True) + t = t - t.transpose(0,1,2,4,3,5) - t.transpose(0,1,2,5,4,3) + s3 = t - t.transpose(2,1,0,3,4,5) - t.transpose(0,2,1,3,4,5) + t = -np.einsum('lcjk,ilab->ijkabc', self.gs[o,v,o,o], self.sd, optimize=True) + t = t - t.transpose(0,1,2,5,4,3) - t.transpose(0,1,2,3,5,4) + s3 += t - t.transpose(1,0,2,3,4,5) - t.transpose(2,1,0,3,4,5) + + self.dt = s3 * self.d_tensors[2] + + def cluster_energy(self): + #compute the coupled-cluster energy correction + + o = self.o ; v = self.v + + e = 1.0 * np.einsum('ia,ia->', self.fs[o,v], self.ss, optimize=True) + + e += 0.25 * np.einsum('ijab,ijab->', self.gs[o, o, v, v], self.sd, optimize=True) + + if self.method == 'ucc3': + e += (1/6) * np.einsum('ijab,ia,jb->', self.gs[o,o,v,v], self.ss, self.ss, optimize=True) + if self.method == 'ucc(4)': + t = 0.5 * np.einsum('dblj,ikac,klcd,ijab->', self.gs[v,v,o,o], self.sd, self.sd, self.sd, optimize=True) + t += 0.0625 * np.einsum('abkl,ijab,klcd,ijcd->', self.gs[v,v,o,o], self.sd, self.sd, self.sd, optimize=True) + t -= 0.25 * np.einsum('ablj,klcd,ijab,ikdc->', self.gs[v,v,o,o], self.sd, self.sd, self.sd, optimize=True) + t -= 0.25 * np.einsum('dbij,klcd,ijab,klca->', self.gs[v,v,o,o], self.sd, self.sd, self.sd, optimize=True) + e -= 0.5 * t + + return e + + def iterator(self, func): + #consistent field iterations + + #initiate the amplitudes + self.initialise_amplitudes() + + #initialise diis buffers + amplitudes = [self.ss, self.sd] if self.method != 'ucc(4)' else [self.ss, self.sd, self.st] + diis = diis_c(6, amplitudes) + + cycle_energy = [self.cluster_energy()] + + for cycle in range(self.cycle_limit): + + #store pre-update amplitudes + amplitudes = [self.ss, self.sd] if self.method != 'ucc(4)' else [self.ss, self.sd, self.st] + diis.refresh_store(amplitudes) + + func() + + #calculate current cycle energy + cycle_energy.append(self.cluster_energy()) + + #test convergence + delta_energy = np.abs(cycle_energy[-2] - cycle_energy[-1]) + if delta_energy < self.convergence: + self.converged = True + break + else: + if self.verbose: print('cycle = {:>3d} energy = {:>15.10f} \u0394E = {:>12.10f} '.format(cycle, cycle_energy[-1], delta_energy)) + del cycle_energy[0] + + #diis build extrapolated amplitudes + amplitudes = [self.ss, self.sd] if self.method != 'ucc(4)' else [self.ss, self.sd, self.st] + amplitudes = diis.build(amplitudes) + if self.method != 'ucc(4)': + self.ss, self.sd = amplitudes + else: + self.ss, self.sd, self.st = amplitudes + + if self.converged: + self.update_amplitudes(iterative=False) + return {self.method: cycle_energy[-1], 'mp2': self.mp2, 'eHF':self.HFenergy} + + + def excitations(self): + #UCC2 secular matrix + + o, v, n = self.o, self.v, np.newaxis + nocc, nvir = self.ss.shape + nrot = nocc * nvir + + ds, dd = np.reciprocal(self.d_tensors[0]), np.reciprocal(self.d_tensors[1]) + sd = self.sd if not self.method == 'ucc2-s-ee' else self.td + + def ucc_diagonal(self): + #compute the diagonal of the ADC matrix as a pre-conditioner for the davidson iterations + + #initialize to fock diagonal + diagonal = -np.concatenate([ds.ravel(), dd.swapaxes(1, 2).ravel()]) + + ucc_diagonal = diagonal[:nrot].reshape(nocc, nvir) + + ucc_diagonal -= np.einsum('aiai->ia', self.gs[v, o, v, o], optimize=True) + + ucc_diagonal += 0.5 * np.einsum('acik,ikac->ia', self.gs[v, v, o, o], sd, optimize=True) + ucc_diagonal += 0.5 * np.einsum('ikac,ikac->ia', self.gs[o, o, v, v], sd, optimize=True) + ucc_diagonal -= 0.25 * np.einsum('cdik,ikcd->i', self.gs[v, v, o, o], sd, optimize=True)[:, n] + ucc_diagonal -= 0.25 * np.einsum('ikcd,ikcd->i', self.gs[o, o, v, v], sd, optimize=True)[:, n] + ucc_diagonal -= 0.25 * np.einsum('ackl,klac->a', self.gs[v, v, o, o], sd, optimize=True)[n, :] + ucc_diagonal -= 0.25 * np.einsum('klac,klac->a', self.gs[o, o, v, v], sd, optimize=True)[n, :] + + return diagonal + + def ucc_initial_guess(self, diagonal, f=1): + #initial vector to start Davidson + + #get largest absolute values on diagonal matrix as best guess + args = np.argsort(np.absolute(diagonal)) + guess_vectors = np.zeros((diagonal.size, self.roots * f)) + for root in range(self.roots * f): + guess_vectors[args[root], root] = 1.0 + + return guess_vectors + + def matvec(ucc): + #construct the UCC2 blocks of second order matrix dot product with arbitary vector (r) + + ucc = np.array(ucc) + r = np.zeros_like(ucc) + + ucc_s = ucc[:nrot].reshape(nocc, nvir) + r_s = r[:nrot].reshape(nocc, nvir) + + #singles - singles block + r_s -= np.einsum('ia,ia->ia', ds, ucc_s, optimize=True) + + r_s -= np.einsum('ajbi,jb->ia', gs[v, o, v, o], ucc_s, optimize=True) + + r_s += 0.5 * np.einsum('acik,jkbc,jb->ia', gs[v, v, o, o], sd, ucc_s, optimize=True) + r_s += 0.5 * np.einsum('jkbc,ikac,jb->ia', gs[o, o, v, v], sd, ucc_s, optimize=True) + + t = -np.einsum('cdik,jkcd->ij', gs[v, v, o, o], sd, optimize=True) + t += -np.einsum('jkcd,ikcd->ij', gs[o, o, v, v], sd, optimize=True) + r_s += 0.25 * np.einsum('ij,ja->ia', t, ucc_s, optimize=True) + + t = -np.einsum('ackl,klbc->ab', gs[v, v, o, o], sd, optimize=True) + t += -np.einsum('klbc,klac->ab', gs[o, o, v, v], sd, optimize=True) + r_s += 0.25 * np.einsum('ab,ib->ia', t, ucc_s, optimize=True) + + ucc_d = ucc[nrot:].reshape(nocc, nvir, nocc, nvir) + r_d = r[nrot:].reshape(nocc, nvir, nocc, nvir) + + #singles - doubles block + r_s += 0.5 * np.einsum('klid,kald->ia', gs[o, o, o, v], ucc_d, optimize=True) + r_s -= 0.5 * np.einsum('klic,kcla->ia', gs[o, o, o, v], ucc_d, optimize=True) + r_s -= 0.5 * np.einsum('alcd,icld->ia', gs[v, o, v, v], ucc_d, optimize=True) + r_s += 0.5 * np.einsum('akcd,kcid->ia', gs[v, o, v, v], ucc_d, optimize=True) + + #doubles - singles block + r_d += 0.5 * np.einsum('kbij,ka->iajb', gs[o, v, o, o], ucc_s, optimize=True) + r_d -= 0.5 * np.einsum('kaij,kb->iajb', gs[o, v, o, o], ucc_s, optimize=True) + r_d -= 0.5 * np.einsum('abcj,ic->iajb', gs[v, v, v, o], ucc_s, optimize=True) + r_d += 0.5 * np.einsum('abci,jc->iajb', gs[v, v, v, o], ucc_s, optimize=True) + + #doubles - doubles block + r_d -= np.einsum('ijab,iajb->iajb', dd, ucc_d, optimize=True) + + return r + + #get diagonal preconditioner + diagonal = ucc_diagonal(self) + + #generate initial guess from diagonal + guess_vectors = ucc_initial_guess(self, diagonal, self.guess_vector_factor) + + self.tol = 1e-8 ; sort_on_absolute=True ; self.vectors_per_root=30 + e, v, self.converged = davidson(matvec, guess_vectors, diagonal, tol=self.tol, + vectors_per_root = self.vectors_per_root ) + + print(e) + +if __name__ == '__main__': + + #do an SCF computation + import rhf + molAtom, molBasis, molData = rhf.mol([]) + eSCF = rhf.scf(molAtom, molBasis,molData, []) + + #get data for coupled-cluster + from atom import nuclearRepulsion ; from basis import electronCount + charge, nuclearRepulsion, electrons = [molData['charge'], nuclearRepulsion(molAtom), electronCount(molAtom, molData['charge'])] + f, c, e, eri = [rhf.fock, rhf.C, rhf.e, rhf.ERI] + + #get fock and eri in molecular spin basis from spinMO class + mo = spinMO(e, eri, c, f) + gs = mo.gs + fs = mo.fs + + data = {'method':'ucc(4)', 'electrons':electrons, 'cycle_limit': 50, 'precision':1e-10, 'verbose':True, 'roots':5} + cc = unitaryCoupledCluster(fs, gs, e, data) + if cc.converged: + cc.energy['nuclear'] = nuclearRepulsion + + print(cc.energy) diff --git a/source/ci.py b/source/ci.py new file mode 100644 index 0000000..85cff92 --- /dev/null +++ b/source/ci.py @@ -0,0 +1,664 @@ +from __future__ import division +from integral import buildFockMOspin, buildEriMO, buildEriDoubleBar +from numpy import zeros, sort, real, dot, sqrt, eye, append, block +from basis import electronCount +from numpy.linalg import eigh, eigvals, eig, qr, norm +from scipy.linalg import sqrtm +from view import postSCF +from integral import iEri + +def cis(atoms, charge, bases, eigenVectors, fock, ERI): + #compute Configuration Interaction Singles + + spinOrbitals = len(bases) * 2 + #get fock matrix in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #orbital occupation + nElectrons = electronCount(atoms, charge) + nOccupied = int(nElectrons/2) + nVirtual = len(bases) - nOccupied + + #build singly excited determinant basis Hamiltonian + ciHamiltonian = zeros( (nOccupied*nVirtual*4,nOccupied*nVirtual*4) ) + + ia = 0 + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + + jb = 0 + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + + if (i == j): + ciHamiltonian[ia,jb] += fockMOspin[a,b] + if (a == b): + ciHamiltonian[ia,jb] -= fockMOspin[i,j] + + ciHamiltonian[ia,jb] += eriMOspin[a,j,i,b] + + jb += 1 + ia += 1 + + #diagonalise Hamiltonian + e, ccis = eigh(ciHamiltonian) + + #excitations + jumps = excitations(e, ccis, nElectrons, nOccupied, nVirtual) + + #detect degeneracy + postSCF(ciDegeneracy(e), 'ci') + + #Davidson + n = min(5, len(ciHamiltonian)//2) + postSCF(blockDavidson(n, ciHamiltonian),'bd') + + #output jumps + postSCF(jumps, 'ju') + + return e, ccis + +def ciDegeneracy(e): + #from sorted [low->high] produce [value, degeneracy] tuples + + count = 0 + ciEnergy = [] + energy = e[count] + degeneracy = 0 + + #search forward for equal energies + while True: + + #loop until new energy value + while True: + degeneracy += 1 + count += 1 + if count == len(e): #got to end of list + break + if abs(energy - e[count]) > 1e-12: #same to within tolerence + break + + if degeneracy == 3: + ciEnergy.append([energy, 't']) + elif degeneracy == 2: + ciEnergy.append([energy, 'd']) + elif degeneracy == 1: + ciEnergy.append([energy, 's']) + else: + ciEnergy.append([energy, '(' + str(degeneracy) + ')']) + + if count >= len(e): + break + + energy = e[count] + degeneracy = 0 + + return ciEnergy + +def ciSpinAdaptedSingles(atoms, charge, bases, eigenVectors, fock, ERI): + #configuration interaction spin-adapted singles + + spinOrbitals = len(bases) * 2 + #get fock matrix in MO basis + fockMO = dot(eigenVectors.T , dot(fock, eigenVectors)) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #orbital occupation + nElectrons = electronCount(atoms, charge) + nOccupied = int(nElectrons/2) + nVirtual = len(bases) - nOccupied + n = len(bases) + + #build singly excited determinant basis Hamiltonian + ciHamiltonian = zeros( (nOccupied*nVirtual, nOccupied*nVirtual) ) + + ia = 0 + for i in range(0, nOccupied): + for a in range(nOccupied, n): + + jb = 0 + for j in range(0, nOccupied): + for b in range(nOccupied, n): + + sum = 0.0 + if (i == j) and (a == b): + sum += fockMO[a,a] - fockMO[i,i] + + sum += 2.0 * eriMO[iEri(a,i,j,b)] - eriMO[iEri(a,b,j,i)] + ciHamiltonian[ia,jb] = sum + + jb += 1 + ia += 1 + + #diagonalise Hamiltonian + e = eigvals(ciHamiltonian) + + #order eigenvalues + e.sort() + + postSCF(e, 'cisas') + + return e + +def ciSpinAdaptedTriples(atoms, charge, bases, eigenVectors, fock, ERI): + #configuration interaction spin-adapted singles + + spinOrbitals = len(bases) * 2 + #get fock matrix in MO basis + fockMO = dot(eigenVectors.T , dot(fock, eigenVectors)) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #orbital occupation + nElectrons = electronCount(atoms, charge) + nOccupied = int(nElectrons/2) + nVirtual = len(bases) - nOccupied + n = len(bases) + + #build singly excited determinant basis Hamiltonian + ciHamiltonian = zeros( (nOccupied*nVirtual, nOccupied*nVirtual) ) + + ia = 0 + for i in range(0, nOccupied): + for a in range(nOccupied, n): + + jb = 0 + for j in range(0, nOccupied): + for b in range(nOccupied, n): + + sum = 0.0 + if (i == j) and (a == b): + sum += fockMO[a,a] - fockMO[i,i] + + sum -= eriMO[iEri(a,b,j,i)] + ciHamiltonian[ia,jb] = sum + + jb += 1 + ia += 1 + + #diagonalise Hamiltonian + e = eigvals(ciHamiltonian) + + #order eigenvalues + e.sort() + + postSCF(e, 'cisat') + + return e + +def randomPhaseApproximation(atoms, charge, bases, eigenVectors, fock, ERI, type = 'tamm-dancoff'): + #time-dependent Hartree-Fock (TDHF) random phase approximation (RPA) + + spinOrbitals = len(bases) * 2 + + #get fock matrix in MO spin basis + fockMOspin = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + #get two-electron repulsion integrals in MO basis + eriMO = buildEriMO(eigenVectors, ERI) + + #transform eri from MO to spin basis + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #orbital occupation + nElectrons = electronCount(atoms, charge) + nOccupied = int(nElectrons/2) + nVirtual = len(bases) - nOccupied + + A = zeros((nOccupied*nVirtual*4, nOccupied*nVirtual*4)) + B = zeros((nOccupied*nVirtual*4, nOccupied*nVirtual*4)) + + ia = 0 + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + + jb = 0 + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + + if (i == j): + A[ia,jb] += fockMOspin[a,b] + if (a == b): + A[ia,jb] -= fockMOspin[i,j] + + A[ia,jb] += eriMOspin[b,i,j,a] + B[ia,jb] += eriMOspin[b,a,j,i] + + jb += 1 + ia += 1 + + if type == 'linear': + HA = A + B + HB = A - B + ciHamiltonian = dot(HA, HB) + elif type == 'block': + ciHamiltonian = block([ [A, B], + [-B, -A] ]) + elif type == 'hermitian': + sqm = sqrtm(A-B) + ciHamiltonian = dot(sqm, dot(A+B, sqm)) + + elif type == 'tamm-dancoff': + ciHamiltonian = A + e, v = eigh(ciHamiltonian) + + #sort eigen solutions + idx = e.argsort() + e = e[idx].real + v = v[:,idx].real + + return e, v + + elif type == 'raw': + return A, B + + #diagonalise Hamiltonian + e = eigvals(ciHamiltonian) + + #order eigenvalues + e.sort() + + #'hermitian' and 'linear' gives square of eigenvalues + if type in 'hermitian, linear' : + e = sqrt(real(e)) + else: + e = e[nOccupied*nVirtual*4:].real + + #detect degeneracy + postSCF(ciDegeneracy(e), 'rpa') + + return e + + +def excitations(ecis, ccis, nElectrons, nOccupied, nVirtual): + #calculate the jumps and contributions + + levels = [] + for i in range(0, nOccupied*2): + for j in range(nOccupied*2, (nOccupied+nVirtual)*2): + levels.append(str(i) + ' -> ' + str(j)) + + contributions = [] + #loop over energies and find contributions > 10% + for i in range(0, ccis.shape[1]): + #loop down levels + for j in range(0, ccis.shape[0]): + percent = round(ccis[j,i] * ccis[j,i] * 100) + if percent > 10: + contributions.append([i , round(ecis[i],6), percent, levels[j]]) + + return contributions + +def blockDavidson(nLowestEigen, h): + #simplistic implementation of block Davidson algorithm for finding n lowest eigenvalues, real symmetric + + tolerence = 1e-8 + n = h.shape[0] + iterations = n + + #sub-space can't be greater than dimension of h + if nLowestEigen > n//2: nLowestEigen = n//2 + + #initial sub-space guess + nInitialGuessVectors = 2 * nLowestEigen + t = eye(n, nInitialGuessVectors) + + V = zeros((n, 0)) + V = append(V, t, axis=1) + + I = eye(n) + + #begin algorithm + m = nInitialGuessVectors + cycle = 0 + tau = 0 + preTheta = 1 + + while True: + if m > nInitialGuessVectors: + preTheta = theta[:nLowestEigen] + + T = dot(V[:,:m].T,dot(h,V[:,:m])) + rho,S = eig(T) + idx = rho.argsort() + theta = rho[idx] + s = S[:,idx] + for j in range(0,nInitialGuessVectors): + w = dot((h - theta[j]*I),dot(V[:,:m],s[:,j])) + #refresh the sub-space block + t[:, j] = real(w/(theta[j]-h[j,j] + 1e-14)) + #append new block + V = append(V , t, axis=1) + #orthogonalise + V, a = qr(V) + + #check convergence + delta = norm(theta[:nLowestEigen] - preTheta) + if delta < tolerence: + break + + m += nInitialGuessVectors + cycle += 1 + if cycle == iterations: + break + + if (cycle < iterations): + return real(theta[:nLowestEigen]) + else: + return [] + +import numpy as np +class cis_d(object): + #class for CIS(D) + + def __init__(self, hf, roots=5, solver='eigh', method='cis(d)'): + + self.hf = hf + self.roots = roots + self.solver = solver + self.method = method + + self.fs, self.gs, self.eps = self.get_spin_quantities() + self.get_spin_metrics() + + self.cache = {} + if self.method == 'cis-mp2': + self.cache['cis-mp2'] = self.get_perturbative_doubles_mp2() + else: + self.cache['cisd'] = self.get_perturbative_doubles_cis() + + def get_spin_quantities(self): + #return the eri, Fock and orbital energies in spin MO basis + + from cc.fcc import spinMO + + spin = spinMO(self.hf.rhf.e, self.hf.rhf.ERI, self.hf.rhf.C, self.hf.rhf.fock) + + return spin.fs, spin.gs, np.kron(self.hf.rhf.e, np.ones(2)) + + def get_spin_metrics(self): + #get the dimensions of spin quantities + + from basis import electronCount + charge = self.hf.data['charge'] + nocc = electronCount(self.hf.atoms, charge) + nvir = 2*len(self.hf.basis) - nocc + + self.occupations = (nocc, nvir, nocc*nvir) + + #get the orbital slices + n = np.newaxis + o = slice(None, nocc) + v = slice(nocc, None) + + self.slice = (n, o, v) + + def check_scf_energy(self, e_scf): + #check that Harpy energy equals spin quantities version + + from atom import nuclearRepulsion + from math import isclose + + n, o, v = self.slice + hf_energy = np.einsum('ii', self.fs[o, o]) - 0.5 * np.einsum('ijij', self.gs[o, o, o, o]) + nuclearRepulsion(self.hf.atoms) + + return isclose(hf_energy, e_scf, rel_tol=1e-8) + + def get_mp2_energy(self): + #compute the MP2 energy correction + + n, o, v = self.slice + + #orbital energy denominator + dd = 1.0 / (self.eps[v, n, n, n] + self.eps[n, v, n, n] + - self.eps[n, n, o, n] - self.eps[n, n, n, o] ) + + #mp2 energy + e_mp2 = -0.25 * np.einsum('ijab,abij->', self.gs[o,o,v,v]**2, dd, optimize=True) + + self.cache['mp2'] = e_mp2 + + return e_mp2 + + def cis_solve_direct(self): + #solve the CIS eigenvalue problem with eigh + + nocc, nvir, nrot = self.occupations + n, o, v = self.slice + + a = np.einsum('ab,ij->iajb',np.diag(np.diag(self.fs)[v]),np.diag(np.ones(nocc)), optimize=True) + a -= np.einsum('ij,ab->iajb',np.diag(np.diag(self.fs)[o]),np.diag(np.ones(nvir)), optimize=True) + a += np.einsum('ajib->iajb', self.gs[v,o,o,v], optimize=True) + + #reshape for solving + a = a.reshape(nrot, nrot) + + #direct solve + try: + e_cis, u = np.linalg.eigh(a) + converged = True + except np.linalg.LinAlgError as e: + print('matrix solve error ', e) + converged = False + + self.cache['cis'] = e_cis + self.cache['u'] = u + + return e_cis, u, converged + + def cis_solve_davidson(self): + #davidson solve for cis + + def cis_diagonal(self): + #diagonal pre-conditioner for cis Davidson + + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + + ds = self.eps[o, n] - self.eps[n, v] + + #initialize to fock diagonal + diagonal = -ds.ravel() + + cis_diagonal = diagonal.reshape(nocc, nvir) + cis_diagonal -= np.einsum('aiai->ia', self.gs[v, o, v, o], optimize=True) + + return diagonal + + def cis_initial_guess(self, diagonal, f=1): + #guess vector for cis Davidson + + #get largest absolute values on diagonal matrix as best guess + args = np.argsort(np.absolute(diagonal)) + + #we only have nocc*nvir roots available + if self.roots > len(args): + print('reducing requested roots - exceeded ', len(args)) + self.roots = len(args) + + guess_vectors = np.zeros((diagonal.size, self.roots * f)) + for root in range(self.roots * f): + guess_vectors[args[root], root] = 1.0 + + return guess_vectors + + def cis_matvec(cis): + + #construct the cis matrix dot product with arbitary vector (r) + + n, o, v = self.slice ; nocc, nvir, nrot = self.occupations + + ds = self.eps[o, n] - self.eps[n, v] + + cis = np.array(cis) + r = np.zeros_like(cis) + + cis_s = cis.reshape(nocc, nvir) + r_s = r.reshape(nocc, nvir) + + #sconfiguration interaction singles + r_s -= np.einsum('ia,ia->ia', ds, cis_s, optimize=True) + r_s -= np.einsum('ajbi,jb->ia', self.gs[v, o, v, o], cis_s, optimize=True) + + return r + + guess_vector_factor, tol, vectors_per_root = 1, 1e-8, 20 + + #get diagonal preconditioner + diagonal = cis_diagonal(self) + + #generate initial guess from diagonal + guess_vectors = cis_initial_guess(self, diagonal, guess_vector_factor) + + + from adc.adc import davidson + e_cis, u, converged = davidson(cis_matvec, guess_vectors, diagonal, tol=tol, + vectors_per_root = vectors_per_root ) + + self.cache['cis'] = e_cis + self.cache['u'] = u + + return e_cis, u, converged + + def get_perturbative_doubles_cis(self): + #get the cis(d) corrected roots + + nocc, nvir, _ = self.occupations + n, o, v = self.slice + + #orbital energy denominator + dd = 1.0 / (self.eps[v, n, n, n] + self.eps[n, v, n, n] + - self.eps[n, n, o, n] - self.eps[n, n, n, o] ) + + #get CIS solution + if self.solver == 'eigh': + e_cis, u_cis, converged = self.cis_solve_direct() + if self.solver == 'davidson': + e_cis, u_cis, converged = self.cis_solve_davidson() + + #not converged exit + if not converged: exit('cis failed to converge') + + cisd_correction = [] + + print('***CIS(D)***\n root CIS CIS(D) \u0394 \n---------------------------------------------') + for root in range(self.roots): + + #get amplitude vector and clean + b = u_cis[:, root] + + b[abs(b)<1e-14] = 0 + + #re-shape amplitude vector + b = b.reshape(nocc, nvir).T + + #a tensor + a = -self.gs[v,v,o,o]*dd + + #u tensor + u = np.einsum('icab,cj->abij', self.gs[o,v,v,v], b, optimize=True) + u -= np.einsum('jcab,ci->abij', self.gs[o,v,v,v], b, optimize=True) + u += np.einsum('ijka,bk->abij', self.gs[o,o,o,v], b, optimize=True) + u -= np.einsum('ijkb,ak->abij', self.gs[o,o,o,v], b, optimize=True) + + #v tensor + V = 0.5 * np.einsum('jkbc,bi,cajk->ai', self.gs[o,o,v,v], b, a, optimize=True) + V += 0.5 * np.einsum('jkbc,aj,cbik->ai', self.gs[o,o,v,v], b, a, optimize=True) + V += np.einsum('jkbc,bj,acik->ai', self.gs[o,o,v,v], b, a, optimize=True) + + #double excitations - correlation term electrons not involved in excitation + e_cisd = np.einsum('ai,ai->', b, V, optimize=True) + + #shifted denominator + d_abij_omega = 1.0 / (self.eps[v, n, n, n] + self.eps[n, v, n, n] + - self.eps[n, n, o, n] - self.eps[n, n, n, o] - e_cis[root]) + + e_cisd_direct = -0.25 * np.einsum('abij,abij->', u*u, d_abij_omega, optimize=True) + + e_mp2 = self.get_mp2_energy() + print(' {:>2d} {:>10.6f} {:>10.6f} ({:>10.6f} )'. + format(root+1, e_cis[root], e_cisd_direct + e_cisd + e_mp2 + e_cis[root], + e_cisd_direct + e_cisd + e_mp2 )) + + cisd_correction.append(e_cisd_direct + e_cisd + e_mp2) + + return cisd_correction + + def get_perturbative_doubles_mp2(self): + #get the cis-mp2 corrected roots + + nocc, nvir, _ = self.occupations + n, o, v = self.slice + + #orbital energy denominator + dd = 1.0 / (self.eps[v, n, n, n] + self.eps[n, v, n, n] + - self.eps[n, n, o, n] - self.eps[n, n, n, o] ) + dt = 1.0 / (self.eps[v, n, n, n, n, n] + self.eps[n, v, n, n, n, n] + + self.eps[n, n, v, n, n, n] - self.eps[n, n, n, o, n, n] + - self.eps[n, n, n, n, o, n] - self.eps[n, n, n, n, n, o]) + + #get CIS solution + if self.solver == 'eigh': + e_cis, u_cis, converged = self.cis_solve_direct() + if self.solver == 'davidson': + e_cis, u_cis, converged = self.cis_solve_davidson() + + #not converged exit + if not converged: exit('cis failed to converge') + + cis_mp2_correction = [] + + print('***CIS-MP2***\n root CIS CIS-MP2 \u0394 \n---------------------------------------------') + for root in range(self.roots): + + #get amplitude vector and clean + b = u_cis[:, root] + + b[abs(b)<1e-14] = 0 + + #re-shape amplitude vector + b = b.reshape(nocc, nvir).T + + #shifted denominators + d_abij_omega = 1.0 / (self.eps[v, n, n, n] + self.eps[n, v, n, n] + - self.eps[n, n, o, n] - self.eps[n, n, n, o] - e_cis[root]) + + d_abcijk_omega = 1.0 / (self.eps[v, n, n, n, n, n] + self.eps[n, v, n, n, n, n] + + self.eps[n, n, v, n, n, n] - self.eps[n, n, n, o, n, n] + - self.eps[n, n, n, n, o, n] - self.eps[n, n, n, n, n, o] - e_cis[root]) + + #u tensor + u = np.einsum('icab,cj->abij', self.gs[o,v,v,v], b, optimize=True) + u -= np.einsum('jcab,ci->abij', self.gs[o,v,v,v], b, optimize=True) + u += np.einsum('ijka,bk->abij', self.gs[o,o,o,v], b, optimize=True) + u -= np.einsum('ijkb,ak->abij', self.gs[o,o,o,v], b, optimize=True) + e_cis_mp2 = -0.25 * np.einsum('abij,abij->', u*u, d_abij_omega, optimize=True) + + #u tensor + u = np.einsum('jkbc,ai->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('jkca,bi->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('jkab,ci->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('kibc,aj->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('kica,bj->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('kiab,cj->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('ijbc,ak->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('ijca,bk->abcijk', self.gs[o,o,v,v], b, optimize=True) + u += np.einsum('ijab,ck->abcijk', self.gs[o,o,v,v], b, optimize=True) + e_cis_mp2 += -(1/36) * np.einsum('abcijk,abcijk->', u*u, d_abcijk_omega, optimize=True) + + print(' {:>2d} {:>10.6f} {:>10.6f} ({:>10.6f} )'. + format(root+1, e_cis[root], e_cis_mp2 + e_cis[root], + e_cis_mp2 )) + + cis_mp2_correction.append(e_cis_mp2) + + return cis_mp2_correction + diff --git a/source/cogus.py b/source/cogus.py new file mode 100644 index 0000000..aa40d4e --- /dev/null +++ b/source/cogus.py @@ -0,0 +1,471 @@ +from __future__ import division +import numpy as np + +internalLambdaCode =""" +#declarations +import numpy as np + +def spatialTospin(eriMO, nbf): + #openfermion style transformation + + import numpy as np + + spin = np.zeros((2*nbf, 2*nbf, 2*nbf, 2*nbf)) + + eriMO = eriMO.transpose(0,2,3,1) + for p in range(nbf): + for q in range(nbf): + for r in range(nbf): + for s in range(nbf): + #anti-spin + spin[2*p, 2*q+1, 2*r+1, 2*s], spin[2*p+1, 2*q, 2*r, 2*s+1] = [eriMO[p,q,r,s]] * 2 + #syn-spin + spin[2*p, 2*q, 2*r, 2*s], spin[2*p+1, 2*q+1, 2*r+1, 2*s+1] = [eriMO[p,q,r,s]] * 2 + + return spin + +def gMOspin(e, c, eri, nbf): + #construct MO spin eri + + import numpy as np + + def iEri(i,j,k,l): + #index into the four-index eri integrals + p = max(i*(i+1)/2 + j, j*(j+1)/2 + i) + q = max(k*(k+1)/2 + l, l*(l+1)/2 + k) + return int(max(p*(p+1)/2 + q, q*(q+1)/2 + p)) + + #get 4 index eri and spinblock to spin basis + g = np.zeros((nbf,nbf,nbf,nbf)) + for i in range(nbf): + for j in range(nbf): + for k in range(nbf): + for l in range(nbf): + g[i,j,k,l] = eri[iEri(i,j,k,l)] + + #eri to MO + g = np.einsum('pQRS,pP->PQRS', np.einsum('pqRS,qQ->pQRS', np.einsum('pqrS,rR->pqRS', np.einsum('pqrs,sS->pqrS', \ + g, c, optimize=True), c, optimize=True), c, optimize=True), c, optimize=True) + + return g, np.kron(e, np.ones(2)) + +iterations = 50 +tolerance = 1e-10 + +charge, nuclearRepulsion, electrons = scfData + +#orbital occupations +spinOrbitals = (fock.shape[0]) * 2 +nsocc = electrons +nsvir = spinOrbitals - nsocc + +#get one electron operators +h1 = np.dot(c.T, np.dot(hcore, c)) +hcSpin = np.kron(h1, np.eye(2)) +nbf = h1.shape[0] + +#get fock in MO spin basis +cSpin = np.kron(c, np.eye(2)) +fock = np.dot(cSpin.T, np.dot(np.kron(fock, np.eye(2)), cSpin)) + +#get two-electron repulsion integrals in MO basis +eriMO, eps = gMOspin(e, c, eri, spinOrbitals//2) +eriMOspin = spatialTospin(eriMO, spinOrbitals//2) +g = (np.einsum('ijkl', eriMOspin) - np.einsum('ijlk', eriMOspin)).transpose(0, 1, 3, 2) + +#slices +n = np.newaxis +o = slice(None,nsocc) +v = slice(nsocc, None) + +#D tensors +d_ai = 1.0 / (-eps[v, n] + eps[n, o]) +d_abij = 1.0 / (-eps[v, n, n, n] - eps[n, v, n, n] + eps[n, n, o, n] + eps[n, n, n, o]) +d_abcijk = 1.0 / (- eps[ v, n, n, n, n, n] - eps[n, v, n, n, n, n] - eps[n, n, v, n, n, n] + + eps[n, n, n, o, n, n] + eps[n, n, n, n, o, n] + eps[n, n, n, n, n, o] ) + +#HF energy +HFenergy = 1.0 * np.einsum('ii', fock[o, o]) -0.5 * np.einsum('ijij', g[o, o, o, o]) + +#amplitude initialisation +ts = np.zeros((nsvir, nsocc)) +td = np.zeros((nsvir,nsvir,nsocc,nsocc)) + +#get initial cluster energy +lastCycleEnergy = cc_energy(fock, g, o, v, t1=ts, t2=td, t3=None ) + +#dummies +triples = None + +#iterations +for cycle in range(iterations): + + #update amplitudes + singles = cc_singles(fock, g, o, v, t1=ts, t2=td, t3=None) * d_ai + ts + doubles = cc_doubles(fock, g, o, v, t1=ts, t2=td, t3=None) * d_abij + td + + #recalculate energy + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=None) + deltaEnergy = np.abs(lastCycleEnergy - cycleEnergy) + + #convergence test + if deltaEnergy < tolerance: + + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=None) - HFenergy + ts = singles + td = doubles + break + else: + ts = singles + td = doubles + lastCycleEnergy = cycleEnergy +else: + print("Did not converge") + exit('cc failed') + +#for lagrange amplitudes l are transposes of t +d_ia = d_ai.transpose(1,0) +d_ijab = d_abij.transpose(2,3,0,1) + +#initial values for lagrange amplitudes +ls = ts.transpose(1,0) +ld = td.transpose(2,3,0,1) + +lastCycleEnergy = cc_lambda_lagrangian_energy(fock, g, o, v, t1=ts, t2=td, l1=ls, l2=ld) + +#iterations +for cycle in range(iterations): + + singlesResidual = cc_lambda_singles(fock, g, o, v, ts, td, ls, ld) + doublesResidual = cc_lambda_doubles(fock, g, o, v, ts, td, ls, ld) + + lambdaResidual = np.linalg.norm(singlesResidual) + np.linalg.norm(doublesResidual) + + singles = singlesResidual * d_ia + ls + doubles = doublesResidual * d_ijab + ld + + lambdaCycleEnergy = cc_lambda_lagrangian_energy(fock, g, o, v, ts, td, singles, doubles) + pseudoEnergy = 0.25 * np.einsum('jiab,jiab', g[o, o, v, v], ld) + + energyDelta = np.abs(lastCycleEnergy - lambdaCycleEnergy) + + if energyDelta < 1e-10 and lambdaResidual < 1e-10: + ls = singles + ld = doubles + lambdaCycleEnergy = cc_lambda_lagrangian_energy(fock, g, o, v, ts, td, ls, ld) - HFenergy + break + else: + ls = singles + ld = doubles + lastCycleEnergy = lambdaCycleEnergy +else: + print("Did not converge") + exit('lambda failed') + +#response density matrices +opdm = cc_oprdm(o, v, ts, td, ls, ld) +tpdm = cc_tprdm(o, v, ts, td, ls, ld) + +rdmEnergy = np.einsum('ij,ij', hcSpin, opdm) + 0.25 * np.einsum('ijlk,ijlk',tpdm, g)- HFenergy +""" + +internalSpinClusterCode = """ +#declarations +import numpy as np + +g = eri +eps = e + +iterations = 50 +tolerance = 1e-10 + +charge, nuclearRepulsion, electrons = scfData + +#orbital occupations +spinOrbitals = (fock.shape[0]) +nsocc = electrons +nsvir = spinOrbitals - nsocc + +#slices +n = np.newaxis +o = slice(None,nsocc) +v = slice(nsocc, None) + +#D tensors +eps = np.kron(e, np.ones(2)) + +d_ai = 1.0 / (-eps[v, n] + eps[n, o]) +d_abij = 1.0 / (-eps[v, n, n, n] - eps[n, v, n, n] + eps[n, n, o, n] + eps[n, n, n, o]) +d_abcijk = 1.0 / (- eps[ v, n, n, n, n, n] - eps[n, v, n, n, n, n] - eps[n, n, v, n, n, n] + + eps[n, n, n, o, n, n] + eps[n, n, n, n, o, n] + eps[n, n, n, n, n, o] ) + +#HF energy +HFenergy = 1.0 * np.einsum('ii', fock[o, o]) -0.5 * np.einsum('ijij', g[o, o, o, o]) + +#amplitude initialisation +ts = np.zeros((nsvir, nsocc)) +td = np.zeros((nsvir,nsvir,nsocc,nsocc)) +tt = np.zeros((nsvir,nsvir,nsvir,nsocc,nsocc,nsocc)) + +#reciprocal D tensors +fock_d_ai = np.reciprocal(d_ai) +fock_d_abij = np.reciprocal(d_abij) +fock_d_abcijk = np.reciprocal(d_abcijk) + +#get initial cluster energy +lastCycleEnergy = cc_energy(fock, g, o, v, t1=ts, t2=td, t3=tt ) + +#dummies + +if not 'S' in level: singles = None +if not 'D' in level: doubles = None +if not (('T' in level) or ('t' in level)): triples = None + +#iterations +for cycle in range(iterations): + + #update amplitudes + if 'S' in level: singles = cc_singles(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_ai + ts + if 'D' in level: doubles = cc_doubles(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_abij + td + if (('T' in level) or ('t' in level)) : triples = cc_triples(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_abcijk + tt + + #recalculate energy + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=triples ) + deltaEnergy = np.abs(lastCycleEnergy - cycleEnergy) + + #convergence test + if deltaEnergy < tolerance: + + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=triples ) - HFenergy + break + else: + ts = singles + td = doubles + tt = triples + lastCycleEnergy = cycleEnergy +else: + print("Did not converge") + exit('cc failed') + +perturbationEnergy = 0.0 +if 't' in level: + perturbativeTriples = cc_triples(fock, g, o, v, t1=singles, t2=doubles, t3=triples) + triples = perturbativeTriples + fock_d_abcijk * triples + triples = triples * d_abcijk + l1, l2 = [singles.transpose(1,0) ,doubles.transpose(2,3,0,1)] + + perturbationEnergy = cc_perturbation_energy(fock, g, o, v, l1, l2, triples) + +""" +internalClusterCode = """ +#declarations +import numpy as np + +def gMOspin(e, c, eri, nbf): + #construct MO spin eri + + import numpy as np + + def iEri(i,j,k,l): + #index into the four-index eri integrals + p = max(i*(i+1)/2 + j, j*(j+1)/2 + i) + q = max(k*(k+1)/2 + l, l*(l+1)/2 + k) + return int(max(p*(p+1)/2 + q, q*(q+1)/2 + p)) + + #get 4 index eri and spinblock to spin basis + g = np.zeros((nbf,nbf,nbf,nbf)) + for i in range(nbf): + for j in range(nbf): + for k in range(nbf): + for l in range(nbf): + g[i,j,k,l] = eri[iEri(i,j,k,l)] + + spinBlock = np.kron(np.eye(2), np.kron(np.eye(2), g).T) + g = spinBlock.transpose(0,2,1,3) - spinBlock.transpose(0,2,3,1) + + #prepare orbital energies + eps = np.concatenate((e,e), axis=0) + C = np.block([ + [c, np.zeros_like(c)], + [np.zeros_like(c), c]]) + C =C[:, eps.argsort()] + eps = np.sort(eps) + + #eri to MO + g = np.einsum('pQRS,pP->PQRS', np.einsum('pqRS,qQ->pQRS', np.einsum('pqrS,rR->pqRS', np.einsum('pqrs,sS->pqrS', \ + g, C, optimize=True), C, optimize=True), C, optimize=True), C, optimize=True) + + return g + + +iterations = 50 +tolerance = 1e-10 + +charge, nuclearRepulsion, electrons = scfData + +#orbital occupations +spinOrbitals = (fock.shape[0]) * 2 +nsocc = electrons +nsvir = spinOrbitals - nsocc + +#get fock in MO spin basis +cSpin = np.kron(c, np.eye(2)) +fock = np.dot(cSpin.T, np.dot(np.kron(fock, np.eye(2)), cSpin)) + +#get two-electron repulsion integrals in MO basis +g = gMOspin(e, c, eri, spinOrbitals//2) + +#slices +n = np.newaxis +o = slice(None,nsocc) +v = slice(nsocc, None) + +#D tensors +eps = np.kron(e, np.ones(2)) + +d_ai = 1.0 / (-eps[v, n] + eps[n, o]) +d_abij = 1.0 / (-eps[v, n, n, n] - eps[n, v, n, n] + eps[n, n, o, n] + eps[n, n, n, o]) +d_abcijk = 1.0 / (- eps[ v, n, n, n, n, n] - eps[n, v, n, n, n, n] - eps[n, n, v, n, n, n] + + eps[n, n, n, o, n, n] + eps[n, n, n, n, o, n] + eps[n, n, n, n, n, o] ) + +#HF energy +HFenergy = 1.0 * np.einsum('ii', fock[o, o]) -0.5 * np.einsum('ijij', g[o, o, o, o]) + +#amplitude initialisation +ts = np.zeros((nsvir, nsocc)) +td = np.zeros((nsvir,nsvir,nsocc,nsocc)) +tt = np.zeros((nsvir,nsvir,nsvir,nsocc,nsocc,nsocc)) + +#reciprocal D tensors +fock_d_ai = np.reciprocal(d_ai) +fock_d_abij = np.reciprocal(d_abij) +fock_d_abcijk = np.reciprocal(d_abcijk) + +#get initial cluster energy +lastCycleEnergy = cc_energy(fock, g, o, v, t1=ts, t2=td, t3=tt ) + +#dummies + +if not 'S' in level: singles = None +if not 'D' in level: doubles = None +if not (('T' in level) or ('t' in level)): triples = None + +#iterations +for cycle in range(iterations): + + #update amplitudes + if 'S' in level: singles = cc_singles(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_ai + ts + if 'D' in level: doubles = cc_doubles(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_abij + td + if (('T' in level) or ('t' in level)) : triples = cc_triples(fock, g, o, v, t1=ts, t2=td, t3=tt) * d_abcijk + tt + + #recalculate energy + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=triples ) + deltaEnergy = np.abs(lastCycleEnergy - cycleEnergy) + + #convergence test + if deltaEnergy < tolerance: + + cycleEnergy = cc_energy(fock, g, o, v, t1=singles, t2=doubles, t3=triples ) - HFenergy + break + else: + ts = singles + td = doubles + tt = triples + lastCycleEnergy = cycleEnergy +else: + print("Did not converge") + exit('cc failed') + +perturbationEnergy = 0.0 +if 't' in level: + perturbativeTriples = cc_triples(fock, g, o, v, t1=singles, t2=doubles, t3=triples) + triples = perturbativeTriples + fock_d_abcijk * triples + triples = triples * d_abcijk + l1, l2 = [singles.transpose(1,0) ,doubles.transpose(2,3,0,1)] + + perturbationEnergy = cc_perturbation_energy(fock, g, o, v, l1, l2, triples) + +""" + +def symbolicGeneratedCoupledCluster(name, fock, eri, c, e, scfData): + #execute symbolically generated cluster codes + + if not name in ['ccd','ccsd','ccsdt','ccsd_t','lccd','lccsd','cc2','cc3'] : return 0.0 + + levelDictionary = {'ccd':['C','D'], 'ccsd':['C','SD'], 'ccsdt':['C','SDT'], 'ccsd_t':['C', 'SDt'], \ + 'cc2':['A','2'], 'cc3':['A','3'], \ + 'lccd':['L','D'], 'lccsd':['L','SD']} + + #get external code + type, level = levelDictionary[name] + file = '../codes/' + name + '.py' + f = open(file, 'r') + externalCode = f.read() + cycleEnergy = 0.0 + + if type == 'A': + if level == '2': level = 'SD' + if level == '3': level = 'SDT' + + #exec dictionary + data = {'level':level, 'fock':fock, 'c':c, 'eri':eri, 'e':e, 'scfData':scfData} + exec(externalCode + internalClusterCode,{},data) + + #prepare return values + coupledClusterCorrection = data['cycleEnergy'] + perturbationCorrection = data['perturbationEnergy'] + + return name, coupledClusterCorrection, perturbationCorrection + + +def symbolicGeneratedLambda(name, fock, eri, c, e, hcore, scfData): + #execute symbolically generated lambda equation codes + + if not name in ['ccsd'] : return 0.0 + + #get external code + files = ['../codes/ccsd.py', '../codes/ccsd_lambda.py', '../codes/cc_rdm.py'] + + externalCode = """global cc_energy, cc_singles, cc_doubles """ + + for f in files: + input = open(f, 'r') + externalCode += input.read() + + data = {'fock':fock, 'c':c, 'eri':eri, 'e':e, 'hcore': hcore, 'scfData':scfData} + exec(externalCode + internalLambdaCode,{},data) + + #prepare return values + lambdaLagrangeEnergy = data['lambdaCycleEnergy'] + pseudoEnergy = data['pseudoEnergy'] + rdmEnergy = data['rdmEnergy'] + + return name, lambdaLagrangeEnergy, pseudoEnergy, rdmEnergy + +def symbolicAmplitudes(name, fock, eri, c, e, scfData, spinned = False): + #execute symbolically generated cluster codes for amplitudes + + if not name in ['ccd','ccsd','ccsdt','ccsd_t'] : return 0.0 + + levelDictionary = {'ccd':['C','D'], 'ccsd':['C','SD'], 'ccsdt':['C','SDT'], 'ccsd_t':['C', 'SDt']} + + #get external code + type, level = levelDictionary[name] + file = '../codes/' + name + '.py' + f = open(file, 'r') + externalCode = f.read() + cycleEnergy = 0.0 + + #exec dictionary + data = {'level':level, 'fock':fock, 'c':c, 'eri':eri, 'e':e, 'scfData':scfData} + if not spinned: + exec(externalCode + internalClusterCode,{},data) + else: + exec(externalCode + internalSpinClusterCode,{},data) + + #prepare return values + singlesAmplitudes = data['ts'] + doublesAmplitudes = data['td'] + triplesAmplitudes = data['tt'] + + return name, singlesAmplitudes, doublesAmplitudes, triplesAmplitudes diff --git a/source/diis.py b/source/diis.py new file mode 100644 index 0000000..686a3ae --- /dev/null +++ b/source/diis.py @@ -0,0 +1,135 @@ +from __future__ import division +import numpy as np +from numpy.linalg import solve, LinAlgError + +class diis_f(object): + #direct inversion of iterative subspace class + + def __init__(self, size): + self.size = size + self.fock_vector = [] + self.error_vector = [] + self.norm = 0.0 + + def append(self, f, d, s, x): + #update the subspaces respecting capacity of buffer + + self.fock_vector.append(f) + if f.ndim == 2: + fds = np.einsum('im,mn,nj->ij',f, d, s, optimize=True) + self.error_vector.append(np.einsum('mi,mn,nj->ij', x, (fds - fds.T), x, optimize=True)) + elif f.ndim == 3: + fds = np.einsum('xim,xmn,nj->xij',f, d, s, optimize=True) + self.error_vector.append(np.vstack(np.einsum('mi,xmn,nj->xij', x, (fds - fds.transpose(0,2,1)), x, optimize=True))) + + self.norm = np.linalg.norm(self.error_vector[-1]) + + #check capacity + if len(self.fock_vector) > self.size: + del self.fock_vector[0] + del self.error_vector[0] + + + def build(self, f, d, s, x): + #compute extrapolated Fock + + #update buffers + self.append(f, d, s, x) + + #construct B matrix + nSubSpace = len(self.fock_vector) + + #start diis after cache full + if nSubSpace < self.size: return f + + b = -np.ones((nSubSpace+1,nSubSpace+1)) + b[:-1,:-1] = 0.0 ; b[-1,-1] = 0.0 + for i in range(nSubSpace): + for j in range(nSubSpace): + b[i,j] = b[j,i] = np.einsum('ij,ij->',self.error_vector[i], self.error_vector[j], optimize=True) + + + #solve for weights + residuals = np.zeros(nSubSpace+1) + residuals[-1] = -1 + + try: + weights = np.linalg.solve(b, residuals) + except np.linalg.LinAlgError as e: + if 'Singular matrix' in str(e): exit('diis failed with singular matrix') + + #weights should sum to +1 + sum = np.sum(weights[:-1]) + assert np.isclose(sum, 1.0) + + #construct extrapolated Fock + f = np.zeros_like(f , dtype='float') + for i in range(nSubSpace): + f += self.fock_vector[i] * weights[i] + + if f.ndim == 3: + f = f.reshape(d.shape) + + return f + +''' +Modified diis class to handle three amplitudes for triples +''' +class diis_c(object): + + def __init__(self, capacity, amplitudes): + + self.buffer = [amplitudes] + self.errors = [] + self.store = [] + self.size = 0 + self.capacity = capacity + + def refresh_store(self, amplitudes): + #store current amplitude proir to update + + self.store = amplitudes + + def build(self, amplitudes): + #build the new amplitudes + + self.buffer.append([i.copy() for i in amplitudes]) + n_amplitudes = len(amplitudes) + error = [(self.buffer[-1][i] - self.store[i]).ravel() for i in range(n_amplitudes)] + self.errors.append(np.concatenate(error)) + + if (len(self.buffer) > self.capacity): + del self.buffer[0] + del self.errors[0] + self.size = len(self.buffer) - 1 + + #construct b-matrix + b = -np.ones((self.size + 1, self.size + 1)) + b[-1, -1] = 0 + + n = self.size + b = np.zeros((n+1,n+1)) + for i in range(0, n): + for j in range(0, i+1): + b[j,i] = np.dot(self.errors[i], self.errors[j]) + b[i,j] = b[j,i] + for i in range(0, n): + b[n, i] = -1 + b[i, n] = -1 + + # Build residual vector + residual = np.zeros(self.size + 1) + residual[-1] = -1 + + # Solve Pulay equations for weights + try: + w = np.linalg.solve(b, residual) + except np.linalg.LinAlgError as e: + if 'Singular matrix' in str(e): exit('diis failed with singular matrix') + + # Calculate new amplitudes + amplitudes = [amplitudes[i]*0.0 for i in range(n_amplitudes)] + for num in range(self.size): + for i in range(n_amplitudes): amplitudes[i] += w[num] * self.buffer[num + 1][i] + + return amplitudes diff --git a/source/eom.py b/source/eom.py new file mode 100644 index 0000000..e06e2c9 --- /dev/null +++ b/source/eom.py @@ -0,0 +1,589 @@ +from __future__ import division +import numpy as np +import scipy as sp +import cc.scc +import rhf +from basis import electronCount +from integral import buildEriMO, buildEriDoubleBar, buildFockMOspin, iEri +from atom import getConstant +import time +import os + +def maximumAmplitudes(t, top = 5, mode = 0): + #return the biggest 'top' amplitudes, mode is '+'|'-'|'abs' + #for biggest +ve, -ve or absolute value + + #sort and get indexes + if mode == 0: + idx = np.unravel_index(np.argsort(np.abs(t), axis=None)[::-1][:top], t.shape) + else: + idx = np.unravel_index(np.argsort(t, axis=None)[::-mode][:top], t.shape) + + #convert tuple to list + ampInformation = [] + for i in range(t.ndim): + ampInformation.append(np.array(idx)[i,:top]) + ampInformation.append(t[idx][:top]) + + #make an information string 'value (index)'' + sInfo = [] + for i in range(top): + s = str(round(ampInformation[t.ndim][i],6)) + ' (' + for j in range(t.ndim): + s += str(ampInformation[j][i]) + ', ' + + sInfo.append(s[:-2] + ')') + + return sInfo + +def eomccsd(fockMOspin, eriMOspin, ts, td, nOccupied, nVirtual, spinOrbitals, partitioned = False, dialog = True): + #EOM-CCSD calculation - right eigenvectors + + #get singles-singles block + nRotate = nOccupied * nVirtual + + start=time.time() + + hss = np.zeros((nRotate, nRotate)) + ia = 0 + for i in range(0,nOccupied): + for a in range(nOccupied, spinOrbitals): + + kc = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + + hss[ia,kc] += fockMOspin[a,c]*(i==k) #[1] + hss[ia,kc] -= fockMOspin[k,i]*(a==c) #[6] + hss[ia,kc] += eriMOspin[a,k,i,c] #[11] + for e in range(nOccupied, spinOrbitals): + hss[ia,kc] += eriMOspin[a,k,e,c]*ts[e,i] #[12] + hss[ia,kc] -= (a==c)*fockMOspin[k,e]*ts[e,i] #[7] + for m in range(nOccupied): + hss[ia,kc] -= eriMOspin[m,k,i,c]*ts[a,m] #[13] + hss[ia,kc] -= (i==k)*fockMOspin[m,c]*ts[a,m] #[2] + for e in range(nOccupied, spinOrbitals): + hss[ia,kc] += eriMOspin[m,a,e,c]*ts[e,m]*(i==k) #[3] + hss[ia,kc] -= eriMOspin[k,m,i,e]*ts[e,m]*(a==c) #[8] + hss[ia,kc] -= eriMOspin[m,k,e,c]*td[e,a,i,m] #[14] + hss[ia,kc] += -eriMOspin[m,k,e,c]*ts[e,i]*ts[a,m] #[15] + for n in range(nOccupied): + hss[ia,kc] -= 0.5*(i==k)*eriMOspin[m,n,c,e]*td[e,a,n,m] #[4] + for f in range(nOccupied, spinOrbitals): + hss[ia,kc] -= 0.5*(a==c)*eriMOspin[k,m,e,f]*td[e,f,i,m] #[9] + hss[ia,kc] -= (a==c)*eriMOspin[k,m,e,f]*ts[e,i]*ts[f,m] #[10] + for n in range(nOccupied): + for f in range(nOccupied, spinOrbitals): + hss[ia,kc] -= (i==k)*eriMOspin[m,n,c,f]*ts[a,m]*ts[f,n] #[5] + + kc += 1 + ia += 1 + + if dialog: print('finished Hss block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get singles-doubles + hsd = np.zeros((nRotate, nRotate*nRotate)) + + ia = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hsd[ia,kcld] += (i==k)*(a==c)*fockMOspin[l,d] #[16] + hsd[ia,kcld] += 0.5*eriMOspin[a,l,c,d]*(i==k) #[18] + hsd[ia,kcld] -= 0.5*eriMOspin[k,l,i,d]*(a==c) #[20] + for e in range(nOccupied, spinOrbitals): + hsd[ia,kcld] -= 0.5*eriMOspin[k,l,e,d]*ts[e,i]*(a==c) #[21] + for m in range(nOccupied): + hsd[ia,kcld] -= 0.5*eriMOspin[m,l,c,d]*ts[a,m]*(i==k) #[19] + for e in range(nOccupied, spinOrbitals): + hsd[ia,kcld] += eriMOspin[m,l,e,d]*ts[e,m]*(i==k)*(a==c) #[17] + + kcld += 1 + + ia += 1 + + if dialog: print('finished Hsd block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get doubles-singles + hds = np.zeros((nRotate*nRotate, nRotate)) + + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kc = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += (i==k)*eriMOspin[a,b,c,j] - (j==k)*eriMOspin[a,b,c,i] #[33] + hds[iajb,kc] += (b==c)*eriMOspin[k,a,i,j] - (a==c)*eriMOspin[k,b,i,j] #[22] + + for e in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += (i==k)*eriMOspin[a,b,c,e]*ts[e,j] - (j==k)*eriMOspin[a,b,c,e]*ts[e,i] #[37] + + hds[iajb,kc] += (b==c)*eriMOspin[k,a,e,j]*ts[e,i] - (b==c)*eriMOspin[k,a,e,i]*ts[e,j] - \ + (a==c)*eriMOspin[k,b,e,j]*ts[e,i] + (a==c)*eriMOspin[k,b,e,i]*ts[e,j] #[30] + + hds[iajb,kc] += (b==c)*fockMOspin[k,e]*td[e,a,i,j] - (a==c)*fockMOspin[k,e]*td[e,b,i,j] #[32] + + hds[iajb,kc] += eriMOspin[k,a,c,e]*td[e,b,i,j] - eriMOspin[k,b,c,e]*td[e,a,i,j] #[43] + + for f in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += 0.5*td[e,f,i,j]*( (b==c)*eriMOspin[k,a,e,f] - (a==c)*eriMOspin[k,b,e,f]) #[24] + hds[iajb,kc] += ts[e,i]*ts[f,j]*(-(a==c)*eriMOspin[k,b,e,f] + (b==c)*eriMOspin[k,a,e,f]) #[25] + + for m in range(nOccupied): + + hds[iajb,kc] += (a==c)*eriMOspin[k,m,i,j]*ts[b,m] - (b==c)*eriMOspin[k,m,i,j]*ts[a,m] #[26] + + hds[iajb,kc] += (j==k)*eriMOspin[m,b,c,i]*ts[a,m] - (j==k)*eriMOspin[m,a,c,i]*ts[b,m] - \ + (i==k)*eriMOspin[m,b,c,j]*ts[a,m] + (i==k)*eriMOspin[m,a,c,j]*ts[b,m] #[41] + + hds[iajb,kc] += (j==k)*fockMOspin[m,c]*td[a,b,m,i] - (i==k)*fockMOspin[m,c]*td[a,b,m,j] #[47] + + hds[iajb,kc] += eriMOspin[k,m,c,j]*td[a,b,m,i] - eriMOspin[k,m,c,i]*td[a,b,m,j] #[45] + + for n in range(nOccupied): + hds[iajb,kc] += 0.5*td[a,b,m,n]*((i==k)*eriMOspin[m,n,c,j] - (j==k)*eriMOspin[m,n,c,i]) #[35] + hds[iajb,kc] += ts[a,m]*ts[b,n]*((i==k)*eriMOspin[m,n,c,j] - (j==k)*eriMOspin[m,n,c,i]) #[36] + + for e in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += (i==k)*eriMOspin[a,m,c,e]*td[e,b,m,j] - (i==k)*eriMOspin[b,m,c,e]*td[e,a,m,j] - \ + (j==k)*eriMOspin[a,m,c,e]*td[e,b,m,i] + (j==k)*eriMOspin[b,m,c,e]*td[e,a,m,i] #[34] + + hds[iajb,kc] += (b==c)*eriMOspin[k,m,i,e]*td[e,a,m,j] - (b==c)*eriMOspin[k,m,j,e]*td[e,a,m,i] - \ + (a==c)*eriMOspin[k,m,i,e]*td[e,b,m,j] + (a==c)*eriMOspin[k,m,j,e]*td[e,b,m,i] #[23] + + hds[iajb,kc] += (j==k)*ts[e,i]*(ts[a,m]*eriMOspin[m,b,c,e] - ts[b,m]*eriMOspin[m,a,c,e]) - \ + (i==k)*ts[e,j]*(ts[a,m]*eriMOspin[m,b,c,e] - ts[b,m]*eriMOspin[m,a,c,e]) #[38] + + hds[iajb,kc] += ts[e,i]*eriMOspin[k,m,e,j]*(ts[b,m]*(a==c) - ts[a,m]*(b==c)) - \ + ts[e,j]*eriMOspin[k,m,e,i]*(ts[b,m]*(a==c) - ts[a,m]*(b==c)) #[27] + + hds[iajb,kc] += eriMOspin[k,m,c,e]*(ts[e,j]*td[a,b,m,i] - ts[e,i]*td[a,b,m,j]) #[46] + + hds[iajb,kc] += eriMOspin[k,m,c,e]*(ts[b,m]*td[e,a,i,j] - ts[a,m]*td[e,b,i,j]) #[44] + + for n in range(nOccupied): + + hds[iajb,kc] += 0.5*td[a,b,m,n]*eriMOspin[m,n,c,e]*((i==k)*ts[e,j] - (j==k)*ts[e,i]) #[39] + + hds[iajb,kc] += eriMOspin[m,n,c,e]*ts[a,m]*((j==k)*td[e,b,n,i] - (i==k)*td[e,b,n,j]) - \ + eriMOspin[m,n,c,e]*ts[b,m]*((j==k)*td[e,a,n,i] - (i==k)*td[e,a,n,j]) #[42] + + hds[iajb,kc] += ts[e,m]*eriMOspin[m,n,e,c]*((j==k)*td[a,b,n,i] - (i==k)*td[a,b,n,j]) #[49] + + hds[iajb,kc] += ts[a,m]*ts[b,n]*eriMOspin[m,n,e,c]*((j==k)*ts[e,i] - (i==k)*ts[e,j]) #[40] + + for f in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += 0.5*td[e,f,i,j]*eriMOspin[k,m,e,f]*((a==c)*ts[b,m] - (b==c)*ts[a,m]) #[28] + + hds[iajb,kc] += ts[e,i]*eriMOspin[k,m,e,f]*((b==c)*td[f,a,m,j] - (a==c)*td[f,b,m,j]) - \ + ts[e,j]*eriMOspin[k,m,e,f]*((b==c)*td[f,a,m,i] - (a==c)*td[f,b,m,i]) #[31] + + hds[iajb,kc] += ts[e,m]*eriMOspin[m,k,e,f]*((b==c)*td[f,a,i,j] - (a==c)*td[f,b,i,j]) #[48] + + hds[iajb,kc] += ts[e,i]*ts[f,j]*eriMOspin[m,k,e,f]*((b==c)*ts[a,m] - (a==c)*ts[b,m]) #[29] + + + kc += 1 + + iajb += 1 + + if dialog: print('finished Hds block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get doubles-doubles + hdd = np.zeros((nRotate*nRotate, nRotate*nRotate)) + + if not partitioned: + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hdd[iajb,kcld] += (j==k)*(i==l)*(a==d)*fockMOspin[b,c] - \ + (j==k)*(i==l)*(b==d)*fockMOspin[a,c] #[50] + hdd[iajb,kcld] += (j==l)*(a==d)*(b==c)*fockMOspin[k,i] - \ + (i==l)*(a==d)*(b==c)*fockMOspin[k,j] #[55] + hdd[iajb,kcld] += 0.5*(i==k)*(j==l)*eriMOspin[a,b,c,d] #[60] + hdd[iajb,kcld] += 0.5*(a==c)*(b==d)*eriMOspin[k,l,i,j] #[64] + hdd[iajb,kcld] += (i==l)*(a==d)*eriMOspin[k,b,c,j] - \ + (j==l)*(a==d)*eriMOspin[k,b,c,i] - \ + (i==l)*(b==d)*eriMOspin[k,a,c,j] + \ + (j==l)*(b==d)*eriMOspin[k,a,c,i] #[68] + for e in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += (a==c)*(i==l)*(b==d)*fockMOspin[k,e]*ts[e,j] - \ + (a==c)*(j==l)*(b==d)*fockMOspin[k,e]*ts[e,i] #[56] + hdd[iajb,kcld] += (j==l)*(b==d)*eriMOspin[a,k,e,c]*ts[e,i] - \ + (i==l)*(b==d)*eriMOspin[a,k,e,c]*ts[e,j] - \ + (j==l)*(a==d)*eriMOspin[b,k,e,c]*ts[e,i] + \ + (i==l)*(a==d)*eriMOspin[b,k,e,c]*ts[e,j] #[69] + hdd[iajb,kcld] += 0.5*(b==d)*(a==c)*eriMOspin[k,l,e,j]*ts[e,i] - \ + 0.5*(b==d)*(a==c)*eriMOspin[k,l,e,i]*ts[e,j] #[65] + hdd[iajb,kcld] += 0.5*(b==d)*eriMOspin[k,l,c,e]*td[e,a,i,j] - \ + 0.5*(a==d)*eriMOspin[k,l,c,e]*td[e,b,i,j] #[73] + for f in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += 0.25*(a==c)*(b==d)*eriMOspin[k,l,e,f]*td[e,f,i,j] #[66] + hdd[iajb,kcld] += 0.5*(a==c)*(b==d)*eriMOspin[k,l,e,f]*ts[e,i]*ts[f,j] #[67] + for m in range(nOccupied): + hdd[iajb,kcld] += (i==k)*(j==l)*(a==d)*fockMOspin[m,c]*ts[b,m] - \ + (i==k)*(j==l)*(b==d)*fockMOspin[m,c]*ts[a,m] #[51] + hdd[iajb,kcld] += (i==l)*(b==d)*eriMOspin[m,k,j,c]*ts[a,m] - \ + (j==l)*(b==d)*eriMOspin[m,k,i,c]*ts[a,m] - \ + (i==l)*(a==d)*eriMOspin[m,k,j,c]*ts[b,m] + \ + (j==l)*(a==d)*eriMOspin[m,k,i,c]*ts[b,m] #[70] + hdd[iajb,kcld] += 0.5*(j==l)*(i==k)*eriMOspin[m,a,c,d]*ts[b,m] - \ + 0.5*(j==l)*(i==k)*eriMOspin[m,b,c,d]*ts[a,m] #[61] + hdd[iajb,kcld] += 0.5*(j==l)*eriMOspin[k,m,c,d]*td[a,b,m,i] - \ + 0.5*(i==l)*eriMOspin[k,m,c,d]*td[a,b,m,j] #[74] + for n in range(nOccupied): + hdd[iajb,kcld] += 0.25*(i==k)*(j==l)*eriMOspin[m,n,c,d]*td[a,b,m,n] #[62] + hdd[iajb,kcld] += 0.5*(i==k)*(j==l)*eriMOspin[m,n,c,d]*ts[a,m]*ts[b,n] #[63] + for e in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += (i==k)*(j==l)*(b==d)*eriMOspin[m,a,e,c]*ts[e,m] - \ + (i==k)*(j==l)*(a==d)*eriMOspin[m,b,e,c]*ts[e,m] #[52] + hdd[iajb,kcld] += (a==c)*(i==l)*(b==d)*eriMOspin[m,k,e,j]*ts[e,m] - \ + (a==c)*(j==l)*(b==d)*eriMOspin[m,k,e,i]*ts[e,m] #[57] + hdd[iajb,kcld] += (j==l)*(b==d)*eriMOspin[k,m,c,e]*td[e,a,m,i] - \ + (i==l)*(b==d)*eriMOspin[k,m,c,e]*td[e,a,m,j] - \ + (j==l)*(a==d)*eriMOspin[k,m,c,e]*td[e,b,m,i] + \ + (i==l)*(a==d)*eriMOspin[k,m,c,e]*td[e,b,m,j] #[71] + hdd[iajb,kcld] += (l==j)*(a==d)*eriMOspin[m,k,e,c]*ts[e,i]*ts[b,m] - \ + (l==j)*(b==d)*eriMOspin[m,k,e,c]*ts[e,i]*ts[a,m] - \ + (l==i)*(a==d)*eriMOspin[m,k,e,c]*ts[e,j]*ts[b,m] + \ + (l==i)*(b==d)*eriMOspin[m,k,e,c]*ts[e,j]*ts[a,m] #[72] + for n in range(nOccupied): + hdd[iajb,kcld] += 0.5*(i==k)*(j==l)*(a==d)*eriMOspin[m,n,e,c]*td[b,e,n,m] - \ + 0.5*(i==k)*(j==l)*(b==d)*eriMOspin[m,n,e,c]*td[a,e,n,m] #[53] + hdd[iajb,kcld] += (i==k)*(j==l)*(a==d)*eriMOspin[m,n,e,c]*ts[e,m]*ts[b,n] - \ + (i==k)*(j==l)*(b==d)*eriMOspin[m,n,e,c]*ts[e,m]*ts[a,n] #[54] + for f in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += 0.5*(a==c)*(i==l)*(b==d)*eriMOspin[m,k,e,f]*td[f,e,j,m] - \ + 0.5*(a==c)*(j==l)*(b==d)*eriMOspin[m,k,e,f]*td[f,e,i,m] #[58] + hdd[iajb,kcld] += (a==c)*(i==l)*(b==d)*eriMOspin[m,k,e,f]*ts[f,j]*ts[e,m] - \ + (a==c)*(j==l)*(b==d)*eriMOspin[m,k,e,f]*ts[f,i]*ts[e,m] #[59] + kcld += 1 + iajb += 1 + + else: + + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hdd[iajb,kcld] += (j==k)*(i==l)*(a==d)*fockMOspin[b,c] - \ + (j==k)*(i==l)*(b==d)*fockMOspin[a,c] #[50] + hdd[iajb,kcld] += (j==l)*(a==d)*(b==c)*fockMOspin[k,i] - \ + (i==l)*(a==d)*(b==c)*fockMOspin[k,j] #[55] + kcld += 1 + iajb += 1 + + + if dialog: print('finished Hdd block in : {:>8.3f} s'.format(time.time()-start)) + + eomMatrix = np.bmat([[hss,hsd],[hds,hdd]]) + + if dialog: + print("begin full diagonalization") + print("matrix dimension: ", str(len(eomMatrix)) + "x" + str(len(eomMatrix)) ) + + eomEVal,eomEVec = sp.linalg.eig(eomMatrix) + + return eomEVal.real, eomEVec + + +def eommbpt2(fockMOspin, eriMOspin, nOccupied, nVirtual, spinOrbitals, partitioned = False, dialog = True): + #EOM-MBPT(2) calculation - right eingenvectors + + #get second-order td amplitudes + td = np.zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + for a in range(nOccupied, spinOrbitals): + for b in range(nOccupied, spinOrbitals): + for i in range(nOccupied): + for j in range(nOccupied): + td[a,b,i,j] += eriMOspin[a,b,i,j]/(fockMOspin[i,i]+fockMOspin[j,j]-fockMOspin[a,a]-fockMOspin[b,b]) + + #get singles-singles block + nRotate = nOccupied * nVirtual + + start=time.time() + + hss = np.zeros((nRotate, nRotate)) + ia = 0 + for i in range(0,nOccupied): + for a in range(nOccupied, spinOrbitals): + + kc = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + + hss[ia,kc] += fockMOspin[a,c]*(i==k) #[1] + hss[ia,kc] -= fockMOspin[k,i]*(a==c) #[6] + hss[ia,kc] += eriMOspin[a,k,i,c] #[11] + for m in range(nOccupied): + for e in range(nOccupied, spinOrbitals): + hss[ia,kc] -= eriMOspin[m,k,e,c]*td[e,a,i,m] #[14] + for n in range(nOccupied): + hss[ia,kc] -= 0.5*(i==k)*eriMOspin[m,n,c,e]*td[e,a,n,m] #[4] + for f in range(nOccupied, spinOrbitals): + hss[ia,kc] -= 0.5*(a==c)*eriMOspin[k,m,e,f]*td[e,f,i,m] #[9] + + kc += 1 + ia += 1 + + if dialog: print('finished Hss block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get singles-doubles + hsd = np.zeros((nRotate, nRotate*nRotate)) + + ia = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hsd[ia,kcld] += 0.5*eriMOspin[a,l,c,d]*(i==k) #[18] + hsd[ia,kcld] -= 0.5*eriMOspin[k,l,i,d]*(a==c) #[20] + + kcld += 1 + + ia += 1 + + if dialog: print('finished Hsd block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get doubles-singles + hds = np.zeros((nRotate*nRotate, nRotate)) + + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kc = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + + hds[iajb,kc] += (i==k)*eriMOspin[a,b,c,j] - (j==k)*eriMOspin[a,b,c,i] #[33] + hds[iajb,kc] += (b==c)*eriMOspin[k,a,i,j] - (a==c)*eriMOspin[k,b,i,j] #[22] + + for e in range(nOccupied, spinOrbitals): + hds[iajb,kc] += eriMOspin[k,a,c,e]*td[e,b,i,j] - eriMOspin[k,b,c,e]*td[e,a,i,j] #[43] + + for f in range(nOccupied, spinOrbitals): + hds[iajb,kc] += 0.5*td[e,f,i,j]*( (b==c)*eriMOspin[k,a,e,f] - (a==c)*eriMOspin[e,f,k,b]) #[24] + + for m in range(nOccupied): + hds[iajb,kc] += eriMOspin[k,m,c,j]*td[a,b,m,i] - eriMOspin[k,m,c,i]*td[a,b,m,j] #[45] + + for n in range(nOccupied): + hds[iajb,kc] += 0.5*td[a,b,m,n]*((i==k)*eriMOspin[m,n,c,j] - (j==k)*eriMOspin[m,n,c,i]) #[35] + + for e in range(nOccupied, spinOrbitals): + hds[iajb,kc] += (i==k)*eriMOspin[a,m,c,e]*td[e,b,m,j] - (i==k)*eriMOspin[b,m,c,e]*td[e,a,m,j] - \ + (j==k)*eriMOspin[a,m,c,e]*td[e,b,m,i] + (j==k)*eriMOspin[b,m,c,e]*td[e,a,m,i] #[34] + + hds[iajb,kc] += (b==c)*eriMOspin[k,m,i,e]*td[e,a,m,j] - (b==c)*eriMOspin[k,m,j,e]*td[e,a,m,i] - \ + (a==c)*eriMOspin[k,m,i,e]*td[e,b,m,j] + (a==c)*eriMOspin[k,m,j,e]*td[e,b,m,i] #[23] + + kc += 1 + + iajb += 1 + + if dialog: print('finished Hds block in : {:>8.3f} s'.format(time.time()-start)) + start = time.time() + + #get doubles-doubles + hdd = np.zeros((nRotate*nRotate, nRotate*nRotate)) + + if not partitioned: + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hdd[iajb,kcld] += (j==k)*(i==l)*(a==d)*fockMOspin[b,c] - \ + (j==k)*(i==l)*(b==d)*fockMOspin[a,c] #[50] + hdd[iajb,kcld] += (j==l)*(a==d)*(b==c)*fockMOspin[k,i] - \ + (i==l)*(a==d)*(b==c)*fockMOspin[k,j] #[55] + hdd[iajb,kcld] += 0.5*(i==k)*(j==l)*eriMOspin[a,b,c,d] #[60] + hdd[iajb,kcld] += 0.5*(a==c)*(b==d)*eriMOspin[k,l,i,j] #[64] + hdd[iajb,kcld] += (i==l)*(a==d)*eriMOspin[k,b,c,j] - \ + (j==l)*(a==d)*eriMOspin[k,b,c,i] - \ + (i==l)*(b==d)*eriMOspin[k,a,c,j] + \ + (j==l)*(b==d)*eriMOspin[k,a,c,i] #[68] + for e in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += 0.5*(b==d)*eriMOspin[k,l,c,e]*td[e,a,i,j] - \ + 0.5*(a==d)*eriMOspin[k,l,c,e]*td[e,b,i,j] #[73] + for f in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += 0.25*(a==c)*(b==d)*eriMOspin[k,l,e,f]*td[e,f,i,j] #[66] + for m in range(nOccupied): + hdd[iajb,kcld] += 0.5*(j==l)*eriMOspin[k,m,c,d]*td[a,b,m,i] - \ + 0.5*(i==l)*eriMOspin[k,m,c,d]*td[a,b,m,j] #[74] + for n in range(nOccupied): + hdd[iajb,kcld] += 0.25*(i==k)*(j==l)*eriMOspin[m,n,c,d]*td[a,b,m,n] #[62] + for e in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += (j==l)*(b==d)*eriMOspin[k,m,c,e]*td[e,a,m,i] - \ + (i==l)*(b==d)*eriMOspin[k,m,c,e]*td[e,a,m,j] - \ + (j==l)*(a==d)*eriMOspin[k,m,c,e]*td[e,b,m,i] + \ + (i==l)*(a==d)*eriMOspin[k,m,c,e]*td[e,b,m,j] #[71] + for n in range(nOccupied): + hdd[iajb,kcld] += 0.5*(i==k)*(j==l)*(a==d)*eriMOspin[m,n,e,c]*td[b,e,n,m] - \ + 0.5*(i==k)*(j==l)*(b==d)*eriMOspin[m,n,e,c]*td[a,e,n,m] #[53] + for f in range(nOccupied, spinOrbitals): + hdd[iajb,kcld] += 0.5*(a==c)*(i==l)*(b==d)*eriMOspin[m,k,e,f]*td[f,e,j,m] - \ + 0.5*(a==c)*(j==l)*(b==d)*eriMOspin[m,k,e,f]*td[f,e,i,m] #[58] + + kcld += 1 + iajb += 1 + + else: + + iajb = 0 + for i in range(nOccupied): + for a in range(nOccupied, spinOrbitals): + for j in range(nOccupied): + for b in range(nOccupied, spinOrbitals): + + kcld = 0 + for k in range(nOccupied): + for c in range(nOccupied, spinOrbitals): + for l in range(nOccupied): + for d in range(nOccupied, spinOrbitals): + + hdd[iajb,kcld] += (j==k)*(i==l)*(a==d)*fockMOspin[b,c] - \ + (j==k)*(i==l)*(b==d)*fockMOspin[a,c] #[50] + hdd[iajb,kcld] += (j==l)*(a==d)*(b==c)*fockMOspin[k,i] - \ + (i==l)*(a==d)*(b==c)*fockMOspin[k,j] #[55] + kcld += 1 + iajb += 1 + + if dialog: print('finished Hdd block in : {:>8.3f} s'.format(time.time()-start)) + + eomMatrix = np.bmat([[hss,hsd],[hds,hdd]]) + + if dialog: + print("begin full diagonalization") + print("matrix dimension: ", str(len(eomMatrix)) + "x" + str(len(eomMatrix)) ) + + eomEVal,eomEVec = sp.linalg.eig(eomMatrix) + + return eomEVal.real, eomEVec + + +if __name__ == '__main__': + + #generate a scf calculation + fileName = '../test/h2.hpf' + f = open(fileName, 'w') + hpf = 'name=h2\nmatrix=c\ndiis=off\nunits=angstrom\npost={}\nbasis=3-21g\n\nH1 1 0.00000000 0.00000000 0.00000000000\nH2 1 0.00000000 0.00000000 0.74\nend' + f.write(hpf) + f.close() + + molAtom, molBasis, molData = rhf.mol([], fileName) + eSCF = rhf.scf(molAtom, molBasis, molData, []) + + #clean up file + if os.path.exists(fileName): + os.remove(fileName) + + #occupations + charge = molData['charge'] + nOccupied = electronCount(molAtom, charge) + spinOrbitals = len(molBasis) * 2 + nVirtual = spinOrbitals - nOccupied + + #build eriMO spin tensor in physisist notation + eriMO = buildEriMO(rhf.C, rhf.ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #build FockMO in spin formalism + fockMOspin = buildFockMOspin(spinOrbitals, rhf.C, rhf.fock) + + #get ccsd singles and doubles amplitudes + iterations = 30 + convergence = 1e-8 + diisStatus = 'on' + ccsdEnergy, ts, td = cc.scc.ccsd(molAtom, rhf.C, charge, rhf.fock, rhf.ERI, iterations, convergence, rhf.SCFenergy, diisStatus) + + #most significant amplitudes + maxts = maximumAmplitudes(ts, 5) + maxtd = maximumAmplitudes(td, 5) + + #do eom-ccsd computation + eomEVal, eomEVec = eomccsd(fockMOspin, eriMOspin, ts, td, nOccupied, nVirtual, spinOrbitals, partitioned=False) + + from ci import ciDegeneracy + eomEVal = np.sort(eomEVal * getConstant('hartree->eV')) + ccsdExcitations = ciDegeneracy(eomEVal) + + #Gaussian reference (from JJ Goings) + eomTest = [] + for excitation in eomEVal: + if excitation > 1.0 and excitation < 50.0: eomTest.append(excitation) + gaussianReference = [10.8527,10.8527,10.8527,15.8984,26.4712,26.4712,26.4712,30.5216,31.8814,40.4020,40.4020,40.4020] + assert np.allclose(eomTest[:12], gaussianReference), 'EOM-CCSD Gaussian check failed - H2' + + #do eom-mbpt(2) computation + eomEVal, eomEVec = eommbpt2(fockMOspin, eriMOspin, nOccupied, nVirtual, spinOrbitals, partitioned = False) + + eomEVal = np.sort(eomEVal * getConstant('hartree->eV')) + mbptExcitations = ciDegeneracy(eomEVal) + + #Gaussian reference (from JJ Goings) + eomTest = [] + for excitation in eomEVal: + if excitation > 1.0 and excitation < 50.0: eomTest.append(excitation) + gaussianReference = [10.6572, 10.6572, 10.6572, 15.7087, 26.2655, 26.2655, 26.2655, 30.2223, 31.6785, 40.2073, 40.2073, 40.2073] + assert np.allclose(eomTest[:12], gaussianReference) , 'EOM-MBPT2 Gaussian check failed - H2' + + #write results to HTML file + from view import pre, postSCF, post + pre('h2','rhf') + postSCF([[eSCF, ccsdEnergy], [maxts, maxtd], ccsdExcitations, mbptExcitations, [1.0, 50.0]], 'eom') + post() + diff --git a/source/ep.py b/source/ep.py new file mode 100644 index 0000000..20e5a87 --- /dev/null +++ b/source/ep.py @@ -0,0 +1,512 @@ +from __future__ import division +from numpy import zeros, power +from integral import eriTransform, buildEriMO, iEri, buildEriDoubleBar, expandEri +from view import postSCF +from atom import getConstant + +def electronPropagator2(molBasis, c, ERI, eps, nOccupied, startOrbital = 2, nOrbitals = 4): + #electron propagator (2) + + eV = getConstant('hartree->eV') + threshold = 1e-4 + iterations = 20 + + nBasis = len(molBasis) + + #get 2-electron integral tensor in AO basis + eri = buildEriMO(c, ERI) + eriMO = expandEri(eri, nBasis) + + #physists notation + eriMO = eriTransform(eriMO) + + #get occupied and virtual span + nVirtual = c.shape[0] - nOccupied + + if nOrbitals > nOccupied: + nOrbitals = nOccupied + + ep2 = [] + for orbital in range(startOrbital + 1, startOrbital + nOrbitals + 1): + + e = eps[orbital] + converged = False + + for cycle in range(0, iterations): + ePre = e + + # Compute sigmas - first term + sigmaA = 0.0 + dSigmaA = 0.0 + for r in range(nOccupied, nBasis): + for s in range(nOccupied, nBasis): + for a in range(0, nOccupied): + sigmaA += eriMO[r,s,orbital,a] \ + * (2*eriMO[orbital,a,r,s]-eriMO[a,orbital,r,s]) / (e+eps[a]-eps[r]-eps[s]) + dSigmaA += sigmaA/ (e+eps[a]-eps[r]-eps[s]) + + #second term + sigmaB = 0.0 + dSigmaB = 0.0 + for r in range(nOccupied, nBasis): + for a in range(0, nOccupied): + for b in range(0, nOccupied): + sigmaB += eriMO[a,b,orbital,r] \ + * (2*eriMO[orbital,r,a,b]-eriMO[r,orbital,a,b])/ (e+eps[r]-eps[a]-eps[b]) + dSigmaB += sigmaB/ (e+eps[r]-eps[a]-eps[b]) + + #new sigma total + eNow = eps[orbital] + sigmaA + sigmaB + + # Break if below threshold + if abs(eNow - ePre) < threshold: + converged= True + ep2.append(eNow * eV) + break + + dSigma = -1 * (dSigmaA + dSigmaB) + e = ePre - (ePre - eNow) / (1-dSigma) + + if not converged: + ep2.append(eNow * eV) + print('warn: ep2 for orbital HOMO - %d did not converged' % (nOccupied/2 - orbital/2 - 1)) + + postSCF([startOrbital, ep2, eps, eV, nOccupied], 'ep') + + return ep2 + +def electronPropagator2spin(molBasis, c, ERI, eigenValues, nOccupied, nOrbitals = 5): + #spin version of electron propagator 2 + + eV = getConstant('hartree->eV') + threshold = 1e-4 + iterations = 50 + + nBasis = len(molBasis) + spinOrbitals = nBasis * 2 + + #compute eri in molecular spin basis + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #recalculate occupation with respect to spin basis + nOccupied = nOccupied * 2 + nVirtual = spinOrbitals - nOccupied + + #spin eps tensor + eps = zeros(2*len(eigenValues)) + for p in range(0, spinOrbitals): + eps[p] = eigenValues[p//2] + + if nOrbitals > nOccupied: + nOrbitals = nOccupied + + ep2 = [] + for orbital in range(nOccupied-nOrbitals*2, nOccupied, 2): + e = eps[orbital] + converged = False + + for cycle in range(iterations): + ePre = e + + # Compute sigmas - first term + sigmaA = 0.0 + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + sigmaA += 0.5 * eriMOspin[r,s,orbital,a] * eriMOspin[orbital,a,r,s] / (e+eps[a]-eps[r]-eps[s]) + #second term + sigmaB = 0.0 + for r in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + for b in range(0, nOccupied): + sigmaB += 0.5 * eriMOspin[a,b,orbital,r] * eriMOspin[orbital,r,a,b] / (e+eps[r]-eps[a]-eps[b]) + + #new sigma total + eNow = eps[orbital] + sigmaA + sigmaB + + # Break if below threshold + if abs(eNow - ePre) < threshold: + converged= True + ep2.append(eNow * eV) + break + + # Build derivatives + dSigmaA = 0.0 + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + dSigmaA += eriMOspin[r,s,orbital,a] * eriMOspin[orbital,a,r,s] / \ + (power((e+eps[a]-eps[r]-eps[s]), 2)) + dSigmaB = 0.0 + for r in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + for b in range(0, nOccupied): + dSigmaB += eriMOspin[a,b,orbital,r] * eriMOspin[orbital,r,a,b] / \ + (power((e+eps[r]-eps[a]-eps[b]), 2)) + + dSigma = 1 + (dSigmaA + dSigmaB) + e = ePre - (ePre - eNow) / dSigma + + if not converged: + ep2.append(eNow * eV) + print('warn: ep2 for orbital HOMO - %d did not converged' % (nOccupied - orbital/2 - 1)) + + postSCF([ep2, eps, eV ], 'eps') + + return ep2 + + +def electronPropagator3spin(molBasis, c, ERI, eigenValues, nOccupied, nOrbitals = 5): + #electron propagator 3 + eV = getConstant('hartree->eV') + threshold = 1e-4 + iterations = 50 + + nBasis = len(molBasis) + spinOrbitals = nBasis * 2 + + #compute eri in molecular spin basis + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + # Update nOccupied and nvirt + nOccupied = nOccupied * 2 + nVirtual = spinOrbitals - nOccupied + + #spin eps tensor + eps = zeros(2*len(eigenValues)) + for p in range(0, spinOrbitals): + eps[p] = eigenValues[p//2] + + if nOrbitals > nOccupied: + nOrbitals = nOccupied + + ep2 = [] + ep3 = [] + for orbital in range(nOccupied - nOrbitals * 2, nOccupied, 2): + e = eps[orbital] + converged = False + + #electron propagator (2) + for cycle in range(iterations): + ePre = e + + # Compute sigmas - first term + sigmaA = 0.0 + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + sigmaA += 0.5 * eriMOspin[r,s,orbital,a] \ + * eriMOspin[orbital,a,r,s] / (e+eps[a]-eps[r]-eps[s]) + #second term + sigmaB = 0.0 + for r in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + for b in range(0, nOccupied): + sigmaB += 0.5 * eriMOspin[a,b,orbital,r] \ + * eriMOspin[orbital,r,a,b] / (e+eps[r]-eps[a]-eps[b]) + + #new sigma total + eNow = eps[orbital] + sigmaA + sigmaB + + # Break if below threshold + if abs(eNow - ePre) < threshold: + converged= True + ep2.append(eNow * eV) + break + + # Build derivatives + dSigmaA = 0.0 + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + dSigmaA += eriMOspin[r,s,orbital,a] * eriMOspin[orbital,a,r,s] / \ + (power((e+eps[a]-eps[r]-eps[s]), 2)) + dSigmaB = 0.0 + for r in range(nOccupied, spinOrbitals): + for a in range(0, nOccupied): + for b in range(0, nOccupied): + dSigmaB += eriMOspin[a,b,orbital,r] * eriMOspin[orbital,r,a,b] / \ + (power((e+eps[r]-eps[a]-eps[b]), 2)) + + dSigma = 1 + (dSigmaA + dSigmaB) + e = ePre - (ePre - eNow) / dSigma + + if not converged: + ep2.append(eNow * eV) + print('warn: ep2 for orbital HOMO - %d did not converged' % (nOccupied/2 - orbital/2 - 1)) + + #ep2 value for orbital + orbitalEp2 = e + + #electron propagator (3) + f = 0.0 + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + f += 0.5 * eriMOspin[orbital,p,orbital,a] * eriMOspin[q,r,p,b] * eriMOspin[a,b,q,r] / \ + ((eps[a]-eps[p])*(eps[a]+eps[b]-eps[q]-eps[r])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + f -= 0.5 * eriMOspin[orbital,p,orbital,b] * eriMOspin[b,q,a,c] * eriMOspin[a,c,p,q] / \ + ((eps[b]-eps[p])*(eps[a]+eps[c]-eps[p]-eps[q])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + f += 0.5 * eriMOspin[p,r,a,b] * eriMOspin[orbital,q,orbital,p] * eriMOspin[a,b,q,r] / \ + ((eps[a]+eps[b]-eps[p]-eps[r])*(eps[a]+eps[b]-eps[q]-eps[r])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + f -= 0.5 * eriMOspin[p,q,b,c] * eriMOspin[orbital,b,orbital,a] * eriMOspin[a,c,p,q] / \ + ((eps[b]+eps[c]-eps[p]-eps[q])*(eps[a]+eps[c]-eps[p]-eps[q])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + f += 0.5 * eriMOspin[p,r,a,b] * eriMOspin[q,b,p,r] * eriMOspin[orbital,a,orbital,q] / \ + ((eps[a]+eps[b]-eps[p]-eps[r])*(eps[a]-eps[q])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + f -= 0.5 * eriMOspin[p,q,b,c] * eriMOspin[b,c,a,q] * eriMOspin[orbital,a,orbital,p] / \ + ((eps[b]+eps[c]-eps[p]-eps[q])*(eps[a]-eps[p])) + + #koopman-ep2 average guess for ep3 calculation + e = (orbitalEp2 + eps[orbital]) / 2 + + converged = False + for cycle in range(iterations): + ePre = e + + eNow = eps[orbital] + f + de = 0 + + #ep3 - quadratic eri terms + for a in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = 0.5 * eriMOspin[orbital,a,p,q] * eriMOspin[p,q,orbital,a] + termB = (e+eps[a]-eps[p]-eps[q]) + eNow += termA/termB + de += -1.0 * termA/(termB*termB) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + termA = 0.5 * eriMOspin[orbital,p,a,b] * eriMOspin[a,b,orbital,p] + termB = (e+eps[p]-eps[a]-eps[b]) + eNow += termA/termB + de += -1.0 * termA/(termB*termB) + + #ep3 - cubic eri terms(1) + for a in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,a,q,s] * eriMOspin[q,s,p,r] * eriMOspin[p,r,orbital,a] + termB = (e+eps[a]-eps[p]-eps[r]) * (e+eps[a]-eps[q]-eps[s]) + eNow += termA/termB + de += -termA/(termB * (e+eps[a]-eps[p]-eps[r])) -termA/(termB * (e+eps[a]-eps[q]-eps[s])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,a,q,r] * eriMOspin[q,b,p,a] * eriMOspin[p,r,orbital,b] + termB = (e+eps[b]-eps[p]-eps[r]) * (e+eps[a]-eps[q]-eps[r]) + eNow -= termA/termB + de += termA/(termB * (e+eps[b]-eps[p]-eps[r])) + termA/(termB * (e+eps[a]-eps[q]-eps[r])) + #(2) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,r,a,q] * eriMOspin[a,b,p,r] * eriMOspin[p,q,orbital,b] + termB = (e+eps[b]-eps[p]-eps[q]) * (eps[a]+eps[b]-eps[p]-eps[r]) + eNow -= termA/termB + de += termA/(termB * (e+eps[b]-eps[p]-eps[r])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,c,a,b] * eriMOspin[a,b,p,q] * eriMOspin[p,q,orbital,c] + termB = (e+eps[c]-eps[p]-eps[q]) * (eps[a]+eps[b]-eps[p]-eps[q]) + eNow += termA/termB + de -= termA/(termB * (e+eps[c]-eps[p]-eps[q])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,b,p,r] * eriMOspin[p,q,a,b] * eriMOspin[a,r,orbital,q] + termB = (e+eps[b]-eps[p]-eps[r]) * (eps[a]+eps[b]-eps[p]-eps[q]) + eNow -= termA/termB + de += termA/(termB * (e+eps[c]-eps[p]-eps[q])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,b,p,q] * eriMOspin[p,q,a,c] * eriMOspin[a,c,orbital,b] + termB = (e+eps[b]-eps[p]-eps[q]) * (eps[a]+eps[c]-eps[p]-eps[q]) + eNow += termA/termB + de -= termA/(termB * (e+eps[c]-eps[p]-eps[q])) + + #(3) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,q,a,b] * eriMOspin[a,b,p,r] * eriMOspin[p,r,orbital,q] + termB = (e+eps[q]-eps[a]-eps[b]) * (eps[p]+eps[r]-eps[a]-eps[b]) + eNow -= termA/termB + de += termA/(termB * (e+eps[q]-eps[a]-eps[b])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,q,a,c] * eriMOspin[a,b,p,q] * eriMOspin[p,c,orbital,b] + termB = (e+eps[q]-eps[a]-eps[c]) * (eps[p]+eps[q]-eps[a]-eps[b]) + eNow += termA/termB + de -= termA/(termB * (e+eps[q]-eps[a]-eps[c])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + for r in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,r,p,q] * eriMOspin[p,q,a,b] * eriMOspin[a,b,orbital,r] + termB = (e+eps[r]-eps[a]-eps[b]) * (eps[p]+eps[q]-eps[a]-eps[b]) + eNow -= termA/termB + de += termA/(termB * (e+eps[r]-eps[a]-eps[b])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,c,p,b] * eriMOspin[p,q,a,c] * eriMOspin[a,b,orbital,q] + termB = (e+eps[q]-eps[a]-eps[b]) * (eps[p]+eps[q]-eps[a]-eps[c]) + eNow += termA/termB + de -= termA/(termB * (e+eps[q]-eps[a]-eps[b])) + #(4) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + for q in range(nOccupied, spinOrbitals): + termA = eriMOspin[orbital,p,b,c] * eriMOspin[b,q,a,p] * eriMOspin[a,c,orbital,q] + termB = (e+eps[p]-eps[b]-eps[c]) * (e+eps[q]-eps[a]-eps[c]) + eNow += termA/termB + de -= termA/(termB * (e+eps[p]-eps[b]-eps[c])) + de -= termA/(termB * (e+eps[q]-eps[a]-eps[c])) + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for c in range(0, nOccupied): + for d in range(0, nOccupied): + for p in range(nOccupied, spinOrbitals): + termA = 0.25 * eriMOspin[orbital,p,b,d] * eriMOspin[b,d,a,c] * eriMOspin[a,c,orbital,p] + termB = (e+eps[p]-eps[b]-eps[d]) * (e+eps[p]-eps[a]-eps[c]) + eNow -= termA/termB + de += termA/(termB * (e+eps[p]-eps[b]-eps[d])) + de += termA/(termB * (e+eps[p]-eps[a]-eps[c])) + + # Break if below threshold + if abs(eNow - ePre) < 1.e-4: + ep3.append(eNow * 27.21138505) + converged = True + break + + # Newton-Raphson update + e = ePre - (ePre - eNow) / (1 - de) + + if converged is False: + ep3.append(e) + print('warn: ep3 for orbital HOMO - %d did not converged' % (nOccupied/2 - orbital/2 - 1)) + + postSCF([ep3, eps, eV ], 'ep3') + + return ep3 + +def koopmanAGFcorrection(molBasis ,c ,ERI, eigenValues, nOccupied, nOrbitals = 5): + #Approximate Green's function approximation correction to koopman IP + + eV = getConstant('hartree->eV') + threshold = 1e-4 + iterations = 50 + + nBasis = len(molBasis) + spinOrbitals = nBasis * 2 + + #compute eri in molecular spin basis + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + #recalculate occupation with respect to spin basis + nOccupied = nOccupied * 2 + nVirtual = spinOrbitals - nOccupied + + #spin eps tensor + eps = zeros(2*len(eigenValues)) + for p in range(0, spinOrbitals): + eps[p] = eigenValues[p//2] + + if nOrbitals > nOccupied: + nOrbitals = nOccupied + + agf = [] + #starts at nOrbitals below HOMO + cycleControl = -1 + for orbital in range(nOccupied-nOrbitals*2, nOccupied, 2): + + #orbital relaxation component + orx = 0.0 + for a in range(0, nOccupied): + for r in range(nOccupied, spinOrbitals): + orx += power(eriMOspin[a,orbital,orbital,r],2) / (eps[r]-eps[a]) + + #pair relaxation component + prx = 0.0 + for a in range(0, nOccupied): + for b in range(0, nOccupied): + for r in range(nOccupied, spinOrbitals): + if (a != orbital) and (b != orbital): + prx += 0.5 * power(eriMOspin[a,b,orbital,r],2) / (eps[orbital]+eps[r]-eps[a]-eps[b]) + + #pair removal component + prm = 0.0 + for a in range(0, nOccupied): + for r in range(nOccupied, spinOrbitals): + for s in range(nOccupied, spinOrbitals): + prm += 0.5 * power(eriMOspin[r,s,orbital,a],2) / (eps[a]+eps[orbital]-eps[r]-eps[s]) + + deltaIP = -orx - prx + prm + + #IP -ve of orbital energy + koopman = -eps[orbital] + + #send results to postSCF for output - cycleControl [-1] first,[0] :, [1] last + if (orbital + 2 == nOccupied): + cycleControl = 1 + + postSCF([cycleControl, orbital/2, koopman*eV, orx*eV ,prx*eV, prm*eV, deltaIP*eV, (koopman+deltaIP)*eV],'gfa') + agf.append([koopman*eV, deltaIP*eV]) + cycleControl = 0 + + return agf \ No newline at end of file diff --git a/source/fci.py b/source/fci.py new file mode 100644 index 0000000..81b3171 --- /dev/null +++ b/source/fci.py @@ -0,0 +1,627 @@ +from __future__ import division +from integral import buildEriDoubleBar, buildEriMO, buildFockMOspin +from atom import nuclearRepulsion +from basis import electronCount +import numpy as np +import rhf +from view import postSCF + +from scipy.special import comb +from itertools import combinations + + +def determinantCount(m, k): + #compute number of combinations of n things taken k at a time + + def fact(n): + #compute factorial + + f = 1 + if n < 0: + return -1 + elif n == 0: + return 1 + else: + for i in range(1,n + 1): + f *= i + return f + + return int(fact(m)/(fact(k)*fact(m-k))) + +def combinationList(combs, group, start, stop, level): + #compute the combinations for taking n things k at a time + + for i in range(start, stop+1): + + if level == 0: + s = (group + ',' + str(i))[1:] + combs.append(list(map(int, s.split(',')))) + + combinationList(combs, group + ',' + str(i), i+1, stop, level-1) + + return combs + +def binaryString(comb, nOrbitals): + #compute a binary string representation of combination as list + + sbinary = '' + for i in range(max(comb)+1): + if i in comb: sbinary = sbinary + '1' + else: sbinary = sbinary + '0' + + return sbinary + '0' * (nOrbitals - len(sbinary)) + +def buildFCIhamiltonian(determinants, eriMOspin, Hp, singles=False): + #compute the full FCI Hamiltonian + + nH = len(determinants) + fciH = np.zeros((nH, nH)) + + for i in range(len(determinants)): + for j in range(0, i+1): + + da = determinants[i] + db = determinants[j] + + element = hamiltonianElement(da, db, eriMOspin, Hp, singles) + fciH[i,j] = fciH[j,i] = element + + return fciH + +def excitations(da, db): + #compute the total excitations + + excite = 0 + for i in range(len(da)): + if (da[i] == '1') and (db[i] == '0') : excite += 1 + + return excite + +def phase(da, db): + #compute the phase between the determinants + + t = db + ld = len(da) + occupied = 0 + + for i in range(ld): + if da[i] == '1' and db[i] == '0': + + #hole has appeared + for j in range(ld): + if db[j] == '1' and da[j] == '0': + + #particle has appeared - get occupied between + #hole and particle + m = min(i,j) + n = max(j,i) + occupied += db.count('1', m+1, n) + + db = db[:j] + '0' + db[j+1:] + break + + db = t + + return pow(-1,occupied) + +def levels(da, db): + #compute the jumps + + ld = len(da) + jumps = [] + t = db + + for i in range(ld): + if da[i] == '1' and db[i] == '0': + + #hole has appeared + for j in range(ld): + if db[j] == '1' and da[j] == '0': + + #particle has appeared + jumps.append([i,j]) + + #set excited state to zero so don't count again + db = db[:j] + '0' + db[j+1:] + break + db = t + + return jumps + +def commonStates(da, db): + #compute common states between determinants + ld = min(len(da), len(db)) + + common = [] + for i in range(ld): + if da[i] == '1' and db[i] == '1': common.append(i) + + return common + +def hamiltonianElement(da, db, eriMOspin, coreH, singles): + #compute an individual Hamiltonian element + + #get number of excitions + excites = excitations(da, db) + + if excites > 2 : return 0.0 + + theta = phase(da, db) + jump = levels(da, db) + if excites == 2: + if singles: + #alpha must come before beta + if (jump[0][0] % 2) == 1 and (jump[1][0] % 2) != 1: jump[0][0], jump[1][0] = jump[1][0], jump[0][0] + if (jump[0][1] % 2) == 1 and (jump[1][1] % 2) != 1: jump[0][1], jump[1][1] = jump[1][1], jump[0][1] + + return theta * eriMOspin[jump[0][0], jump[1][0], jump[0][1], jump[1][1]] + + elif excites == 1: + common = commonStates(da, db) + f = coreH[jump[0][0],jump[0][1]] + for i in common: + f += eriMOspin[jump[0][0], i, jump[0][1], i] + + return theta * f + + elif excites == 0: + common = commonStates(da, db) + f = 0.0 + for i in common: + f += coreH[i, i] + for i in common: + for j in common: + f += 0.5 * eriMOspin[i, j, i, j] + + return theta * f + +def configurations(nElectrons, nOrbitals, type = 'S'): + + determinants = [] + pad = nOrbitals - nElectrons + + def subDeterminant(n, k, bit): + #components of full determinant + + sub = [] + comb = [] + combinationList(comb, '', 0, n-1, k) + + for i in comb: + s = bit[0] * n + for j in range(k+1): + s = s[:i[j]] + bit[1] + s[i[j]+1:] + sub.append(s) + + return sub + + #groundstate + if 'G' in type: + determinants.append('1' * nElectrons + '0' * pad) + + #generate groundstate single excitations + if ('S' in type) and (nElectrons > 0): + + pre = subDeterminant(nElectrons, 0, '10') + post = subDeterminant(pad, 0, '01') + + for i in pre: + for j in post: + determinants.append(i+j) + + #generate groundstate double excitations + if ('D' in type) and (nElectrons > 1): + + pre = subDeterminant(nElectrons, 1, '10') + post = subDeterminant(pad, 1, '01') + + for i in pre: + for j in post: + determinants.append(i+j) + + #generate groundstate triple excitations + if ('T' in type) and (nElectrons > 2): + + pre = subDeterminant(nElectrons, 2, '10') + post = subDeterminant(pad, 2, '01') + + for i in pre: + for j in post: + determinants.append(i+j) + + #generate groundstate quadruples excitations + if ('Q' in type) and (nElectrons > 3): + + pre = subDeterminant(nElectrons, 3, '10') + post = subDeterminant(pad, 3, '01') + + for i in pre: + for j in post: + determinants.append(i+j) + + #sort determinants into major alpha order + determinants.sort() + + return determinants + +def fci(molAtom, molBasis, charge, c, ERI, coreH): + #compute a full configuration interaction + + nElectrons = electronCount(molAtom, charge) + nBasis = len(molBasis) + nOrbitals = nBasis * 2 + + #get all combinations of orbitals taken electrons at a time + combinations = [] + combinations = combinationList(combinations, '', 0, nOrbitals-1, nElectrons-1) + + #convert combinations to determinant binary strings + binary = [] + for det in combinations: + binary.append(binaryString(det, nOrbitals)) + binary.sort() + + #spin molecular integrals + coreMOspin = buildFockMOspin(nOrbitals, c, coreH) + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(nOrbitals, eriMO) + + Hp = buildFCIhamiltonian(binary, eriMOspin, coreMOspin) + + e, _ = np.linalg.eigh(Hp) + + postSCF([nElectrons, nOrbitals, determinantCount(nOrbitals, nElectrons), rhf.SCFenergy, e[0], nuclearRepulsion(molAtom)],'fci') + + return e + +def cisd(molAtom, molBasis, charge, c, ERI, coreH): + #compute configuration up to doubles + + nElectrons = electronCount(molAtom, charge) + nBasis = len(molBasis) + nOrbitals = nBasis * 2 + + coreMOspin = buildFockMOspin(nOrbitals, c, coreH) + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(nOrbitals, eriMO) + + determinants = configurations(nElectrons, nOrbitals, 'GSD') + + Hp = buildFCIhamiltonian(determinants, eriMOspin, coreMOspin) + + e, _ = np.linalg.eigh(Hp) + + postSCF([nElectrons, nOrbitals, determinantCount(nOrbitals, nElectrons), rhf.SCFenergy, e[0], nuclearRepulsion(molAtom)],'cisd') + + return e + + +def ciss(molAtom, molBasis, charge, c, ERI, coreH): + #compute configuration single using slater determinants + + nElectrons = electronCount(molAtom, charge) + nBasis = len(molBasis) + nOrbitals = nBasis * 2 + + coreMOspin = buildFockMOspin(nOrbitals, c, coreH) + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(nOrbitals, eriMO) + + determinants = configurations(nElectrons, nOrbitals, 'S') + + determinants = list(zip(*(iter(determinants),) * (nOrbitals - nElectrons))) + determinants = sum([list(i)[::-1] for i in determinants], []) + + Hp = buildFCIhamiltonian(determinants, eriMOspin, coreMOspin, singles=True) + Hp -= np.eye(Hp.shape[0]) * (rhf.SCFenergy - nuclearRepulsion(molAtom)) + + e , v = np.linalg.eigh(Hp) + + postSCF([nElectrons, nOrbitals, len(determinants), e],'cis') + + return e, v + +def spinStates(da, nBasis): + #get the alpha and beta spin states + + alpha = da[0::2] + beta = da[1::2] + + return alpha + '0'*(nBasis - len(alpha)) , beta + '0'*(nBasis - len(beta)) + +def occupancy(da, nBasis): + #get the unoccupied, singe and double occupancy (spatial) orbitals + + alpha , beta = spinStates(da, nBasis) + + occupancy = '' + for i in range(len(alpha)): + occupancy += str(int(alpha[i]) + int(beta[i])) + + return occupancy + +def bString(da, spinOrbitals): + #convert determinant to a bit string integer + + bits = '0b' + for i in range(spinOrbitals-1, -1, -1): + if i in da: bits += '1' + else: bits += '0' + + return int(bits,2) + +def bCombinationList(spinOrbitals, nElectrons): + #create list of all combinations of nElectrons in spinOrbital orbitals + + nVirtual = spinOrbitals - nElectrons + determinantList = [] + + for determinant in combinations(range(spinOrbitals), nElectrons): + + determinantList.append(bString(determinant, spinOrbitals)) + + return determinantList + + +def bRightZeros(n): + #compute the number of rightmost zero bits + + return (n & -n).bit_length() - 1 + + +def bSetZero(da, n): + #set the nth bit to zero 0-based + + return ~(1 << n) & da + +def bOccupancy(da, db, type = 'h'): + #compute the holes or particles between determinants + + k = 0 + hp = [] + if type == 'h': h = (da ^ db) & da + else: h = (da ^ db) & db + + while h != 0: + p = bRightZeros(h) + hp.append(p) + + h = bSetZero(h, p) + k += 1 + + return hp + +def bExcitations(da, db): + #the number of excitation between the two determinants + + return (bin(da ^ db).count('1')) >> 1 + +def bSingleExcitations(da, db): + #compute the single excitation da->db + + excite = np.zeros((2,2), dtype=object) + + if da == db: return excite, 0 + + #get hole and particle + aorb = da ^ db + hole = aorb & da + particle = aorb & db + + #get positions and excitation degree=1 + excite[0,0] = 1 + excite[1,0] = bRightZeros(hole) + excite[0,1] = 1 + excite[1,1] = bRightZeros(particle) + + #get phase + lo = min(excite[1,0], excite[1,1]) + hi = max(excite[1,0], excite[1,1]) + + nPerm = bin(da & (~(1 << lo+1)+1 & (1 << hi)-1)).count('1') + phases = [1, -1] + phase = phases[nPerm & 1] + + return excite, phase + +def bDoubleExcitations(da, db): + #compute the double excitation da->db + + excite = np.zeros((3,2), dtype=object) + + if da == db: return excite, 0 + + aorb = da ^ db + hole = aorb & da + particle = aorb & db + + #the holes + iHole = 0 + while hole != 0: + iHole += 1 + excite[iHole,0] = bRightZeros(hole) + excite[0,0] += 1 + + hole = hole & (hole - 1) + + #the particles + iParticle = 0 + while particle != 0: + iParticle += 1 + excite[iParticle,1] = bRightZeros(particle) + excite[0,1] += 1 + + particle = particle & (particle - 1) + + #phase + nPerm = 0 + for excitation in [1,2]: + lo = min(excite[excitation,0],excite[excitation,1]) + hi = max(excite[excitation,0],excite[excitation,1]) + + nPerm += bin(da & (~(1 << lo+1)+1 & (1 << hi)-1)).count('1') + + #orbital crossings + i = min(excite[1,0], excite[1,1]) + a = max(excite[1,0], excite[1,1]) + j = min(excite[2,0], excite[2,1]) + b = max(excite[2,0], excite[2,1]) + + if (j>i) and (ja) : + nPerm += 1 + + phases = [1,-1] + phase = phases[nPerm & 1] + + return excite, phase + +def bBuildFCIhamiltonian(determinants, eriMOspin, coreH): + #compute the full FCI Hamiltonian + + nH = len(determinants) + fciH = np.zeros((nH, nH)) + + for i in range(len(determinants)): + for j in range(0, i+1): + + da = determinants[i] + db = determinants[j] + + element = bHamiltonianElement(da, db, eriMOspin, coreH) + fciH[i,j] = fciH[j,i] = element + + return fciH + +def bFci(molAtom, molBasis, charge, c, ERI, coreH): + #bit version of fci + + nElectrons = electronCount(molAtom, charge) + nBasis = len(molBasis) + spinOrbitals = nBasis * 2 + + #get all combinations of orbitals taken electrons at a time + combinations = [] + combinations = bCombinationList(spinOrbitals, nElectrons) + + #spin molecular integrals + coreMOspin = buildFockMOspin(spinOrbitals, c, coreH) + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + Hp = bBuildFCIhamiltonian(combinations, eriMOspin, coreMOspin) + + e, c = np.linalg.eigh(Hp) + + return e, c, comb(spinOrbitals, nElectrons, exact=True) + +def bCommonStates(da, db): + #get the common orbitals + + common = [] + ab = da & db + + for i in range(ab.bit_length()): + idx = ab & (1 << i) + if idx: common.append(bRightZeros(1< 2 : return 0.0 + + if excites == 2: + + jump, phase = bDoubleExcitations(da, db) + + return phase * eriMOspin[jump[1,0], jump[2,0], jump[1,1], jump[2,1]] + + elif excites == 1: + + common = bCommonStates(da, db) + jump, phase = bSingleExcitations(da, db) + + f = coreH[jump[1,0], jump[1,1]] + + for i in common: + f += eriMOspin[jump[1,0], i, jump[1,1], i] + + return phase * f + + elif excites == 0: + + common = bCommonStates(da, db) + f = 0.0 + for i in common: + f += coreH[i, i] + for i in common: + for j in common: + f += 0.5 * eriMOspin[i, j, i, j] + + return f + +def bResidues(da, spinOrbitals): + #get the residues of determinant da + + residues = [] + occupancy = bin(da).count('1') + + for i in range(spinOrbitals): + mask1 = 1 << i + for j in range(i): + mask2 = 1 << j + reducedOccupancy = da & ~(mask1 ^ mask2) + + if bin(reducedOccupancy).count('1') == (occupancy - 2): + residues.append(reducedOccupancy) + + return residues + +def bSetResidue(residues, spinOrbitals): + #populate residues with two particles + + determinants = [] + + for residue in residues: + + for i in range(spinOrbitals): + mask1 = 1 << i + if not bool(residue & mask1): + p = residue | mask1 + + for j in range(i): + mask2 = 1 << j + if not bool(p & mask2): + q = p | mask2 + + determinants.append(q) + + return list(set(determinants)) + +def bCisd(molAtom, molBasis, charge, c, ERI, coreH): + #compute configuration up to doubles + + nElectrons = electronCount(molAtom, charge) + nBasis = len(molBasis) + spinOrbitals = nBasis * 2 + + coreMOspin = buildFockMOspin(spinOrbitals, c, coreH) + eriMO = buildEriMO(c, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + groundState = (2**nElectrons-1) + + residueList = bResidues(groundState, spinOrbitals) + + particles = bSetResidue(residueList, spinOrbitals) + + Hp = bBuildFCIhamiltonian(particles, eriMOspin, coreMOspin) + + e, c = np.linalg.eigh(Hp) + + return e, len(particles) + \ No newline at end of file diff --git a/source/force.py b/source/force.py new file mode 100644 index 0000000..f7d8f0f --- /dev/null +++ b/source/force.py @@ -0,0 +1,515 @@ +from __future__ import division +from math import pow, pi, sqrt +from numpy import zeros, ones, dot, array +from numpy.linalg import norm +from view import postSCF +import integral + +def e(ia, ja, type, r, ie, je, n, x): + #recursive definition of Hermite Gaussian for derivative at x + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent + #type number of Hermite node + + if n == 0: + return integral.e(ia, ja, type, r, ie, je) + else: + return e(ia+1, ja, type, r, ie, je, n-1, x) + x * e(ia, ja, type, r, ie, je, n-1, x) + +def efx(ia, ja, type, r, ie, je, n, x, p, s): + + if p == 1: + return 2.0 * ie * e(ia+1, ja, type, r, ie, je, n, x) - ia * e(ia-1, ja, type, r, ie, je, n, x) + elif s == 1: + return 2.0 * je * e(ia, ja+1, type, r, ie, je, n, x) - ja * e(ia, ja-1, type, r, ie, je, n, x) + +def overlapfx(ia, ja, ie, je, ir, jr, n, origin, x, center): + #ia, ja momentum vectors, ie, je exponent values, ir, jr center vectors + + pa = 0 + if center == 'a': + pa = 1 + pb = (pa+1) % 2 + + t = 0.0 + + if x == 0: + t = efx(ia[0], ja[0] , 0, ir[0] - jr[0], ie, je, n[0], ir[0] - origin[0],pa ,pb ) + t *= e(ia[1], ja[1] , 0, ir[1] - jr[1], ie, je, n[1], ir[1] - origin[1]) + t *= e(ia[2], ja[2] , 0, ir[2] - jr[2], ie, je, n[2], ir[2] - origin[2]) + elif x == 1: + t = e(ia[0], ja[0] , 0, ir[0] - jr[0], ie, je, n[0], ir[0] - origin[0]) + t *= efx(ia[1], ja[1] , 0, ir[1] - jr[1], ie, je, n[1], ir[1] - origin[1],pa ,pb ) + t *= e(ia[2], ja[2] , 0, ir[2] - jr[2], ie, je, n[2], ir[2] - origin[2]) + elif x == 2: + t = e(ia[0], ja[0] , 0, ir[0] - jr[0], ie, je, n[0], ir[0] - origin[0]) + t *= e(ia[1], ja[1] , 0, ir[1] - jr[1], ie, je, n[1], ir[1] - origin[1]) + t *= efx(ia[2], ja[2] , 0, ir[2] - jr[2], ie, je, n[2], ir[2] - origin[2],pa ,pb ) + + return t * pow(pi/(ie+je), 1.5) + +def sfx(iBasis, jBasis, center, x = 0, n = [0,0,0] , origin = [0,0,0]): + #derivatives of generalised overlap for basis centered on 'center' + #iBasis, jBasis are basis objects + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j]*overlapfx(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, n , origin, x, center) + + return sum + +def buildOverlapfx(atom, direction, bases): + #overlap derivative for 'atom' in 'direction' + + n = len(bases) + Sx = zeros((n,n)) + + for i in range(0, len(bases)): + for j in range(0, (i+1)): + sum = 0.0 + if bases[i].atom == bases[j].atom: continue + + #use translational invariance - only need calculate one center + f = sfx(bases[i], bases[j], 'a', direction) + + if bases[i].atom == atom: sum += f + if bases[j].atom == atom: sum -= f + + Sx[i,j] = Sx[j,i] = sum + + return Sx + +def kineticfx(ia, ja, ie, je, ir, jr, n, origin, x, center): + #ia, ja momentum vectors, ie, je exponent values, ir, jr center vectors + + #cases for center 'a' and center 'b' + pa = 0 + if center == 'a': + pa = 1 + pb = (pa+1) % 2 + + mu = (2*ja + 1) * je + nu = -2*pow(je,2) * ones(3) + vu = -0.5 * ja* (ja-1) + + t = zeros(3) + for i in range(0, 3): + + if i == x: + t[x] = mu[x] * efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \ + nu[x] * efx(ia[x], ja[x] + 2 , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \ + vu[x] * efx(ia[x], ja[x] - 2, 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + + else: + t[i] = mu[i] * e(ia[i], ja[i] , 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \ + nu[i] * e(ia[i], ja[i] + 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \ + vu[i] * e(ia[i], ja[i] - 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + + for i in range(0, 3): + + if i == x: + t[(x+1) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + t[(x+2) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + else: + t[(i+1) % 3] *= e(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + t[(i+2) % 3] *= e(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + + return (t[0] + t[1] + t[2]) * pow(pi/(ie+je), 1.5) + +def kfx(iBasis, jBasis, center, x = 0, n = [0,0,0] , origin = [0,0,0]): + #derivatives of generalised exchange integral for basis centered on 'center' + #iBasis, jBasis are basis objects + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j] * kineticfx(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, n , origin, x, center) + + return sum + +def buildKineticfx(atom, direction, bases): + #overlap derivative for 'atom' in 'direction' + + n = len(bases) + Kx = zeros((n,n)) + + for i in range(0, len(bases)): + for j in range(0, (i+1)): + sum = 0.0 + if bases[i].atom == bases[j].atom: continue + + #use translational invariance - only need calculate one center + f = kfx(bases[i], bases[j], 'a', direction) + + if bases[i].atom == atom: sum += f + if bases[j].atom == atom: sum -= f + + Kx[i,j] = Kx[j,i] = sum + + return Kx + +def coulombfxs(ia, ja, ie, je, ir, jr, nucleus, n, origin, x, center): + #generalised coulomb derivatives dV(ab^(0,0,0))/dx terms + + #center of four Gaussians + p = ie + je + q = (ie*ir + je*jr)/p + r = q - nucleus + + #loop limits + tau = ia + ja + n + 1 + tau[x] += 1 + + pa = 0 + if center == 'a': + pa = 1 + pb = (pa+1) % 2 + + sum = 0.0 + val = 1.0 + + for mu in range(0, tau[0]): + for nu in range(0, tau[1]): + for vu in range(0, tau[2]): + val = 1.0 + xi = [mu,nu,vu] + for i in range(0, 3): + if i == x: + val *= efx(ia[x], ja[x], xi[x], ir[x]-jr[x], ie, je, n[x], ir[x]-nucleus[x], pa, pb) + else: + val *= e(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i]) + + sum += val * integral.j(xi, 0, p, r, norm(r)) + + return sum * 2 * pi/p + +def jfx(iBasis, jBasis, nucleus, center = 'a', x = 0, n = [0,0,0] , origin = [0,0,0]): + #derivatives of generalised coulomb integral for basis centered on 'center' + #iBasis, jBasis are basis objects + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j] * coulombfxs(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, nucleus, n , origin, x, center) + + return sum + +def buildCoulombfx(atom, direction, molAtom, bases): + #coulomb derivative for 'atom' in 'direction' + + n = len(bases) + Jx = zeros((n,n)) + + for i in range(0, len(bases)): + for j in range(0, (i+1)): + sum = 0.0 + for k in range(0, len(molAtom)): + if bases[i].atom == atom: + sum -= molAtom[k].number * jfx(bases[i], bases[j], molAtom[k].center, 'a', direction) + if bases[j].atom == atom: + sum -= molAtom[k].number * jfx(bases[i], bases[j], molAtom[k].center, 'b', direction) + + Jx[i,j] = Jx[j,i] = sum + + return Jx + +def coulombfxh(ia, ja, ie, je, ir, jr, nucleus, n, origin, x): + #generalised coulomb derivatives dV(ab^(0,0,0))/dx terms + + #center of two Gaussians + p = ie + je + q = (ie*ir + je*jr)/p + r = q - nucleus + + #loop limits + tau = ia + ja + n + 1 + + sum = 0.0 + val = 1.0 + + for mu in range(0, tau[0]): + for nu in range(0, tau[1]): + for vu in range(0, tau[2]): + val = 1.0 + xi = [mu,nu,vu] + for i in range(0, 3): + val *= e(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i]) + + xi[x] += 1 + sum -= val * integral.j(xi, 0, p, r, norm(r)) + + + return sum * 2 * pi/p + +def jfh(iBasis, jBasis, nucleus, x = 0, n = [0,0,0] , origin = [0,0,0]): + #derivatives of generalised coulomb integral for basis centered on 'center' + #iBasis, jBasis are basis objects + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j] * coulombfxh(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, nucleus, n , origin, x) + + return sum + +def buildCoulombfh(atom, direction, molAtom, bases): + #coulomb derivative for 'atom' in 'direction' - Hellman-Feynmann term + + n = len(bases) + Fx = zeros((n,n)) + + for i in range(0, len(bases)): + for j in range(0, (i+1)): + Fx[j,i] = Fx[i,j] = -molAtom[atom].number * jfh(bases[i], bases[j], molAtom[atom].center, direction) + + + return Fx + +def buildNuclearfx(atom, direction, molAtom): + #nuclear repulsion derivative + + sum = 0.0 + for i in range(0, len(molAtom)): + r = norm(molAtom[atom].center - molAtom[i].center) + #vector component i-atom in 'direction' + vr = molAtom[atom].center[direction] - molAtom[i].center[direction] + if r != 0: + sum -= vr * molAtom[i].number * molAtom[atom].number / (r * r * r) + + return sum + +def electronRepulsionfx(ia, ja, ka, la, ie, je, ke, le, ir, jr, kr, lr, ra, rb, origin, x = 0, center = 'a'): + + p = ie + je + q = ke + le + rho = p*q/(p + q) + P = (ie*ir + je*jr)/p + Q = (ke*kr + le*lr)/q + r = P - Q + + tau = ia + ja + 1 + ra + sigma = ka + la + 1 + rb + if (center == 'a') or (center == 'b'): + tau[x] += 1 + else: + sigma[x] += 1 + + pa = 0 + if (center == 'a') or (center == 'c'): + pa = 1 + pb = (pa+1) % 2 + + val = 0.0 + for mu in range(tau[0]): + for nu in range(tau[1]): + for vu in range(tau[2]): + for psi in range(sigma[0]): + for phi in range(sigma[1]): + for chi in range(sigma[2]): + xia = [mu, nu, vu] + xib = [psi, phi, chi] + term = 1.0 + for i in range(0, 3): + if (i == x): + if (center == 'a' or center == 'b'): + term *= efx(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x], pa, pb) + term *= e(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x]) + elif (center == 'c' or center == 'd'): + term *= e(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x]) + term *= efx(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x], pa, pb) + + else: + term *= e(ia[i],ja[i],xia[i],ir[i]-jr[i],ie,je,ra[i],ir[i] - origin[i]) + term *= e(ka[i],la[i],xib[i],kr[i]-lr[i],ke,le,rb[i],kr[i] - origin[i]) + + term *= pow(-1, (psi+phi+chi)) * integral.j([mu+psi,nu+phi,vu+chi],0, rho,r,norm(r)) + val += term + + return val*2*pow(pi,2.5)/(p*q*sqrt(p+q)) + +def ERIfx(iBasis, jBasis, kBasis, lBasis, center, x = 0, n = [0,0,0], nu = [0,0,0], origin = [0,0,0]): + #2-electrons derivative + sum = 0.0 + + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + for k in range(0, len(kBasis.co)): + for l in range(0, len(lBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*kBasis.normal[k]*lBasis.normal[l] * \ + iBasis.co[i]*jBasis.co[j]*kBasis.co[k]*lBasis.co[l] * \ + electronRepulsionfx(iBasis.momentum, jBasis.momentum, kBasis.momentum, lBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], kBasis.ex[k], lBasis.ex[l], \ + iBasis.center, jBasis.center, kBasis.center, lBasis.center, \ + n, nu, origin, x, center) + + return sum + +def buildERIfx(atom, direction, molAtom, bases): + #derivatives of 2-electron repulsion integrals + + n = len(bases) + ERIx = zeros((n,n,n,n)) + + for i in range(0, len(bases)): + for j in range(0, (i+1)): + ij = i*(i+1)/2 + j + for k in range(0, len(bases)): + for l in range(0, (k+1)): + kl = k*(k+1)/2 + l + if ij >= kl: + sum = 0.0 + if bases[i].atom == atom: + sum += ERIfx(bases[i], bases[j], bases[k], bases[l], 'a', direction) + if bases[j].atom == atom: + sum += ERIfx(bases[i], bases[j], bases[k], bases[l], 'b', direction) + if bases[k].atom == atom: + sum += ERIfx(bases[i], bases[j], bases[k], bases[l], 'c', direction) + if bases[l].atom == atom: + sum += ERIfx(bases[i], bases[j], bases[k], bases[l], 'd', direction) + + ERIx[i,j,k,l] = ERIx[i,j,l,k] = ERIx[j,i,l,k] = ERIx[j,i,k,l] = \ + ERIx[k,l,i,j] = ERIx[k,l,j,i] = ERIx[l,k,j,i] = ERIx[l,k,i,j] = sum + + return ERIx + +def buildFockfx(atom, direction, molAtom, molBasis, density): + #compute the derivative of the fock matrix + + #core hamiltonian + hfx = buildKineticfx(atom , direction, molBasis) + \ + buildCoulombfx(atom, direction, molAtom, molBasis) + \ + buildCoulombfh(atom, direction, molAtom, molBasis) + + ERIx = buildERIfx(atom, direction, molAtom, molBasis) + + #get g-matrix jx+kx + n = len(molBasis) + jx = zeros((n,n)) + for p in range(0, n): + for q in range(0, n): + sum = 0.0 + for r in range(0, n): + for s in range(0, n): + sum += ERIx[p,q,r,s] * density[s, r] + + jx[p,q] = sum + + kx = zeros((n,n)) + for p in range(0, n): + for q in range(0, n): + sum = 0.0 + for r in range(0, n): + for s in range(0, n): + sum += ERIx[p,s,q,r] * density[s, r] + + kx[p,q] = sum + + fockfx = hfx + 2.0 * jx - kx + + return fockfx , hfx + +def gradient(molAtom, molBasis, molData): + import rhf + #compute gradient + gfx = zeros((len(molAtom), 3)) + + #equilibrium geometry - restore after each perturbation + referenceGeometry = zeros((len(molAtom), 3)) + for i in range(0, referenceGeometry.shape[0]): + referenceGeometry[i,:] = molAtom[i].center + + for atom in range(0, gfx.shape[0]): + for direction in range(0 , gfx.shape[1]): + gfx[atom,direction] = -1.0 * efxNumeric(atom, direction, molAtom, molBasis, molData) + rhf.rebuildCenters(molAtom, molBasis, referenceGeometry) + + return gfx + +def efxNumeric(atom, direction, molAtom, molBasis, molData): + #derivative of energy in 'direction' using central difference + #after changing centers must update molAtom and molBasis + import rhf + dq = 1e-4 + + #make copy of coordinates for perturbation + geo = zeros((len(molAtom), 3)) + for i in range(0, geo.shape[0]): + geo[i,:] = molAtom[i].center + + #perturb -> + + geo[atom, direction] += dq + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + ep = rhf.scf(molAtom, molBasis, molData, []) + + #perturb -> - + geo[atom, direction] -= 2 * dq + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + em = rhf.scf(molAtom, molBasis, molData, []) + + deltaE = (ep - em)/ (2 * dq) + + return deltaE + +def forces(molAtom, molBasis, density, fock, engine = 'aello', type = 'analytic'): + #get force aor all atoms in all direction + n = len(molBasis) + + if ('analytic,both'.find(type)) != -1 : + + molForces = zeros((len(molAtom), 3)) + if engine != 'aello': + for atom in range(0, len(molAtom)): + for direction in range(0, 3): + fx, hx = buildFockfx(atom, direction, molAtom, molBasis, density ) + + ex = fx + hx + force = 0.0 + for p in range(0, n): + for q in range(0, n): + force -= density[p,q] * ex[q,p] + + #density weighted energy and overlap derivative + eWeighted = dot(density, dot(fock, density)) + sx = buildOverlapfx(atom, direction, molBasis) + + for p in range(0, n): + for q in range(0, n): + force += 2.0 * sx[p,q] * eWeighted[q,p] + + #nuclear repulsion term + force -= buildNuclearfx(atom, direction, molAtom) + #F = -dE/dx + molForces[atom, direction] = force + else: + + from ocypete import ocypete + molForces = ocypete(molAtom, molBasis, density, fock) + + postSCF([molForces, molAtom], 'fa') + + if type == 'both' : + import rhf + #numeric derivatives + _, _, molData = rhf.mol([]) + postSCF([gradient(molAtom, molBasis, molData), molAtom], 'fn') + + return molForces + + +def optimiseGeometry(f, q, text): + #optimise geometry using Nelder-Mead + from scipy.optimize import minimize + import rhf + + molAtom, molBasis, molData = rhf.mol([]) + + optimumGeometry = minimize(f, q, method="Nelder-Mead", args = (molAtom, molBasis, molData)) + + for i in range(0, len(text)): + print(text[i],' : ', optimumGeometry.x[i]) + + print("Optimal energy : ", optimumGeometry.fun) + print("Cycles : ", optimumGeometry.nit) + print(optimumGeometry.success) + diff --git a/source/h.py b/source/h.py new file mode 100644 index 0000000..8bbcc9d --- /dev/null +++ b/source/h.py @@ -0,0 +1,812 @@ +from __future__ import division +import numpy as np +from atom import getConstant +from scipy.special import genlaguerre, sph_harm, assoc_laguerre +import math +import matplotlib.pyplot as py +import matplotlib.colors as pcolors +from matplotlib import cm + +#reduced bohr radius +a = 1.0 + +def transform(mode, i, j, k): + #coordinate system transforms + + if mode == 'cartesian->spherical': + x, y, z = i, j, k + r = np.sqrt(x**2 + y**2 + z**2) + with np.errstate(divide='ignore', invalid='ignore'): + theta = np.arccos(z/r) + phi = np.arctan2(y,x) + + return r, theta, phi + + elif mode == 'spherical->cartesian': + r, theta, phi = i, j, k + x, y, z = [r*np.sin(theta)*np.cos(phi), r*np.sin(theta)*np.sin(phi), r*np.cos(theta)] + + return x, y, z + +def angularSolution(m, l, theta, phi): + #angular hydrogenic solution + + return sph_harm(m, l, phi, theta) + +def angularSolutionPlot(ax, m, l, parameters): + #plot the spherical harmonic Y[ml] + + #construct a theta, phi grid + theta_extent = np.linspace(0, np.pi, parameters['points']) + phi_extent = np.linspace(0, 2*np.pi, parameters['points']) + (theta, phi) = np.meshgrid(theta_extent, phi_extent) + + point = np.array(transform('spherical->cartesian', 1.0, theta, phi)) + + Y = angularSolution(abs(m), l, theta, phi) + if m < 0: Y = np.sqrt(2) * (-1)**m * Y.imag + elif m > 0: Y = np.sqrt(2) * (-1)**m * Y.real + + x, y, z = np.abs(Y) * point + + color_map = py.cm.ScalarMappable(cmap = py.get_cmap(parameters['color_map'])) + color_map.set_clim(-0.5, 0.5) + + surface = ax.plot_surface(x, y, z, facecolors = color_map.to_rgba(Y.real), rstride = 2, cstride = 2, alpha = parameters['alpha']) + + py.title(r'$Y_{{{},{}}}$'.format(l, m)) + + extent = parameters['extent'] + ax.plot([0,0], extent, [0,0], c='0.5', lw=1, zorder=10) + ax.plot([0,0], [0,0], extent, c='0.5', lw=1, zorder=10) + ax.plot(extent, [0,0], [0,0], c='0.5', lw=1, zorder=10) + ax.set_xlim(extent) + ax.set_ylim(extent) + ax.set_zlim(extent) + ax.axis(parameters['axes']) + + if parameters['bar'] == 'on': py.colorbar(color_map, shrink=0.5, aspect=30, orientation='horizontal') + + return + +def angularSolutionPlotProjection(m, l, parameters= {'points':70,'extent':[-0.5,0.5], 'alpha':0.3, 'color_map':'coolwarm', \ + 'axes':'off','levels':20}): + + #construct a theta, phi grid + theta_extent = np.linspace(0, np.pi, parameters['points']) + phi_extent = np.linspace(0, 2*np.pi, parameters['points']) + (theta, phi) = np.meshgrid(theta_extent, phi_extent) + + point = np.array(transform('spherical->cartesian', 1.0, theta, phi)) + + Y = angularSolution(abs(m), l, theta, phi) + if m < 0: Y = np.sqrt(2) * (-1)**m * Y.imag + elif m > 0: Y = np.sqrt(2) * (-1)**m * Y.real + + x, y, z = np.abs(Y) * point + + fig = py.figure(figsize=(5,5)) + ax = fig.add_subplot(111, projection='3d') + + color_map = py.cm.ScalarMappable(cmap = py.get_cmap(parameters['color_map'])) + color_map.set_clim(-0.5, 0.5) + ax.plot_surface(x, y, z, facecolors = color_map.to_rgba(Y.real), alpha=parameters['alpha']) + + cset = ax.contour(x, y, z, parameters['levels'], zdir='z', offset=-1, cmap='summer', alpha=parameters['alpha']*0.5) + cset = ax.contour(x, y, z, parameters['levels'], zdir='y', offset= 1, cmap='winter', alpha=parameters['alpha']*0.5) + cset = ax.contour(x, y, z, parameters['levels'], zdir='x', offset=-1, cmap='autumn', alpha=parameters['alpha']*0.5) + + ax.set_xlim(-1, 1) + ax.set_ylim(-1, 1) + ax.set_zlim(-1, 1) + ax.axis(parameters['axes']) + + py.title(r'$Y_{{{},{}}}$'.format(l, m)) + + py.show() + +def angularSolutionPlotSingle(m, l, parameters = {'points':70,'extent':[-0.5,0.5],'color_map':'coolwarm', \ + 'bar':'on','axes':'off','alpha':0.8}): + + fig = py.figure(figsize = py.figaspect(1.0)) + ax = fig.add_subplot(projection='3d') + + angularSolutionPlot(ax, m, l, parameters) + + py.show() + + return + +def angularSolutionPlotFamily(l_maximum, parameters = {'points':70,'extent':[-0.5,0.5],'color_map':'coolwarm', \ + 'bar':'off','axes':'off','alpha':1.0}): + #plot a family of spherical harmonics + import matplotlib.gridspec as gridspec + + figsize_size, DPI = 500, 100 + figsize_inches = figsize_size/DPI + + fig = py.figure(figsize=(figsize_inches, figsize_inches), dpi=DPI) + spec = gridspec.GridSpec(ncols = 2*l_maximum+1, nrows = l_maximum+1, figure = fig) + + for l in range(l_maximum + 1): + for m in range(-l, l+1): + ax = fig.add_subplot(spec[l, m + l_maximum], projection='3d') + angularSolutionPlot(ax, m, l, parameters) + + py.tight_layout() + py.show() + + return + +def angularVerify(): + #compare analytic solution with sympy + + from random import randint + l = randint(0, 4) + m, theta, phi = [randint(-l, l), randint(0, 5000) * np.pi * 1e-4, randint(0, 20000) * np.pi * 1e-4] + + analytic = sph_harm(m, l, phi, theta) + + from sympy import Ynm, evalf + values = {'l':l, 'm':m, 'theta':theta, 'phi':phi} + symbolic = Ynm(l, m, theta, phi).evalf(subs=values) + + return ((analytic-complex(symbolic)) < (1e-15 + 1e-15j)) + +def radialSolution(n, l, r): + #radial hydrogenic wavefunction + + rho = (2*r/(n*a)) + L = genlaguerre(n-l-1, 2*l+1)(rho) + normalization = np.sqrt(((2/(n*a))**3.0)*math.factorial(n-l-1)/(2*n*math.factorial(n+l))) + psi = (rho**l) * np.exp(-rho/2) * L * normalization + + return psi + +def radialVerify(): + #compare analytic solution with sympy + + from random import randint + n = randint(1, 5) + l, r = [randint(0, n-1), randint(0, 20000) * 1e-3] + + from sympy.physics.hydrogen import R_nl + analytic = radialSolution(n, l, r) + symbolic = R_nl(n, l, r, 1) + + return ((analytic - symbolic) < 1e-15) + +def radialSolutionType(n, l, r, psi_type = 'radial distribution'): + #return either radial distribution, radial probability density or radial probability distribution + + psi = radialSolution(n, l, r) + + if psi_type == 'radial distribution' : return psi + elif psi_type == 'probability density' : return psi * psi + elif psi_type == 'probability distribution': return (4.0*np.pi*r*r) * (psi*psi) + else: + exit(psi_type, ' not implemented') + +def radialSolutionPlot(n, l, psi_type = 'radial distribution', psi_normal = False,\ + parameters = {'points':100, 'size':[7,5], 'extent':[20,0.2], 'equal':False}): + #plot either for given n range of l, of for given l range of n + + subshell = ['s', 'p', 'd', 'f', 'g'] + + yLabel = {'radial distribution':'$\psi(r)$', 'probability density':'$\psi(r)^2$',\ + 'probability distribution':'$4\pi{r}^2\psi(r)$'} + + points = parameters['points'] + + f = py.figure() + f.set_figheight(parameters['size'][1]) + f.set_figwidth(parameters['size'][0]) + ax = py.subplot() + ax.grid() + py.title(psi_type + ' for hydrogenic $\Psi$') + + r = np.linspace(0, parameters['extent'][0], points) + + #plot all the shells and subshell in lists + for i in range(len(n)): + + if l[i] >= n[i]: continue + psi = radialSolutionType(n[i], l[i], r, psi_type) + if psi_normal: psi /= np.max(psi) + py.plot(r, psi, label= str(n[i]) + subshell[l[i]]) + + + py.ylim(parameters['extent'][1]) + if parameters['equal']: ax.set_box_aspect(1) + py.xlabel('r($[a]$)') + ax.legend(loc='upper right') + py.ylabel(yLabel[psi_type]) + + py.show() + + return + +def wavefunction(n, l, m, r, theta, phi, grid): + #evaluate the radial and angular components from full psi + + if grid == 'cartesian': + #if cartesian transform to r, theta, phi + r, theta, phi = transform('cartesian->spherical', r, theta, phi) + + #get radial solution + radial = radialSolution(n, l, r) + + #get angular solution + angular = angularSolution(abs(m), l, theta, phi) + + return radial * angular + +def wavefunctionContour(n, l, m, parameters={'points':100, 'extent':[-20, 20], 'color_map':'coolwarm', \ + 'plane':'xy', 'elevation':0.0, 'contour': False}): + #plot contour map of wavefunction + + extent = parameters['extent'] + points = parameters['points'] + + step = (extent[1] - extent[0])/points + grid = np.linspace(extent[0], extent[1], points) + + x, y, z = np.meshgrid(grid, grid, grid) + r, theta, phi = transform('cartesian->spherical', x, y, z) + Y = angularSolution(abs(m), l, theta, phi) + if m < 0: Y = np.sqrt(2) * (-1)**m * Y.imag + elif m > 0: Y = np.sqrt(2) * (-1)**m * Y.real + + data = np.nan_to_num(Y * radialSolution(n, l, r)) + data = abs(data)**2 + + fig, ax = py.subplots() + + slice = max(min(parameters['elevation'], extent[1]) , extent[0]) + slice = (-extent[0] + parameters['elevation']) + + switch = {'xy':(2,0,1),'yz':(1,2,0),'zx':(0,1,2)} + data = data.transpose(switch[parameters['plane']]) + + im = py.imshow(data[int((-extent[0]+parameters['elevation'])/step),:,:], vmin= 0.0, vmax = np.max(data), \ + extent = (extent + extent), cmap = parameters['color_map']) + + py.colorbar(shrink=0.5, aspect=30, orientation = 'horizontal') + ax.set_title('hydrogen orbital ' + parameters['plane'] + '-slice at displacement ' + str(parameters['elevation']) + \ + '\nn=' + str(n) + ', l=' + str(l) + ', m=' + str(m), fontsize=10) + py.xlabel(parameters['plane'][0]) + py.ylabel(parameters['plane'][1]) + + if parameters['contour']: + levels = [0.0000001, 0.000001, 0.00001, 0.0001, 0.001, 0.1] + cs = ax.contour(data[int((-extent[0]+parameters['elevation'])/step),:,:] , levels, origin='lower', cmap='gray', extend='both', + linewidths=0.2, extent=(extent + extent)) + + py.show() + + return + +def wavefunctionVerify(): + #compare analytic solution with sympy + + from random import randint + n = randint(1, 5) + l, r, theta, phi = [randint(0, n-1), randint(0, 20000) * 1e-3, randint(0, 5000) * np.pi * 1e-4, randint(0, 20000) * np.pi * 1e-4] + m = randint(-l, l) + + from sympy.physics.hydrogen import Psi_nlm + analytic = wavefunction(n, l, m, r, theta, phi, 'spherical polar') + values = {'n':n,'l':l, 'm':m,'r':r, 'theta':theta, 'phi':phi} + symbolic = Psi_nlm(n, l, m, r, phi, theta, 1).evalf(subs=values) + + return ((analytic-complex(symbolic)) < (1e-15 + 1e-15j)) + +def numerov(g, u_zero, du, dh): + #Numerov method for integrating ode + + #array for wavefunction values + u = np.zeros_like(g) + u[0] = u_zero + u[1] = u[0] + dh*du + + h = (dh*dh)/12. + f = [u[0]*(1.0 - h*g[0]), u[1]*(1.0 - h*g[1]), 0.0] + + #current cycle values + cycle_value = [u[1], g[1]] + + for i in range(2, g.size): + + f[2] = 2*f[1] - f[0] + dh*dh * cycle_value[0] * cycle_value[1] + cycle_value[1] = g[i] + + cycle_value[0] = f[2]/(1.0 - h* cycle_value[1]) + u[i]=cycle_value[0] + + f[0] = f[1] + f[1] = f[2] + + return u + +def numerovBoundEnergy(r, l, n_range, energy_range): + + from scipy.optimize import brentq + + def shootingMethod(E, r, l): + #boundary value by 'shooting' method + from scipy.integrate import simps + + g = l*(l+1.)/r**2 - 2./r - E + u = numerov(g, 0.0,-1e-8 ,-r[-2] + r[-1]) + + #normalize wavefunction + u /= np.sqrt(abs(simps(u**2,x = r))) + u /= r**l + + #interpolate back to zero + f_zero = u[-1] + (u[-2] - u[-1])*(0.0-r[-1])/(r[-2]-r[-1]) + + return f_zero + + n = l + bound_energy = [] + u_zero = shootingMethod(energy_range[0],r,l) + + for i in range(1, len(energy_range)): + u = shootingMethod(energy_range[i],r,l) + if u_zero * u < 0: + e = brentq(shootingMethod, energy_range[i-1], energy_range[i], xtol=1e-16, args=(r,l)) + bound_energy.append((n+1, l, e)) + + n += 1 + + if len(bound_energy) >= n_range: break + + u_zero = u + + return bound_energy + +def numerovHydrogenicEnergies(parameters = {'points':2000, 'extent':[1e-8, 100], 'n_range': 5}): + #compute the bound energies using Numerov + + energy_range = -1.2/(np.arange(1,20,0.2)**2.0) + + r = np.linspace(parameters['extent'][0],parameters['extent'][1],parameters['points'])[::-1] + + n_range = parameters['n_range'] + + bound_states = [] + for l in range(n_range): + bound_states += numerovBoundEnergy(r, l, n_range-l, energy_range) + + bound_states.sort(key = lambda x: x[2]) + + return bound_states + +def numerovEnergyVerify(boundEnergies): + #check bound energies against theoretical values + + valid = [] + for n,l,e in boundEnergies: + theoretical = -1.0/(n * n) + valid.append((e - theoretical) <= 1e-4) + + return np.all(valid), valid + +def numerovHydrogenicRadialDensity(parameters = {'points':2000, 'extent':[1e-8, 100], 'n_range': 5, \ + 'radius':[0,15],'occupied': [1, True, False]}): + #numerov wavefunction densities + + from scipy.integrate import simps + r = np.linspace(parameters['extent'][0],parameters['extent'][1],parameters['points'])[::-1] + + #get the bound energies for the states + bound_states = numerovHydrogenicEnergies(parameters) + + electrons = 0 + total_rho = np.zeros_like(r) + Z = parameters['occupied'][0] + states = [] + + ax = py.subplot() + subshell = ['s', 'p', 'd', 'f', 'g'] + + for (n, l, e) in bound_states: + + #solve Numerov for bound energies + g = l*(l+1.)/r**2 - 2./r - e + u = numerov(g, 0.0,-1e-8 ,-r[-2]+r[-1]) + u /= np.sqrt(abs(simps(u*u, x = r))) + + occupation = 2*(2*l + 1) + + #fermi level at atomic number + if (electrons + occupation) <= Z: + fermi =1.0 + else: + fermi = (Z - electrons)/float(occupation) + + #compute current orbital contribution to total + if parameters['occupied'][1] : + rho = u*u * fermi * occupation/(4*np.pi*r*r) + else: + rho = u*u / (4*np.pi*r*r) + + total_rho += rho + + #new atomic occupation + electrons += occupation + + states.append((n,l,e,fermi)) + + py.plot(r, rho*(4*np.pi*r*r), label= str(n) + subshell[l]) + + if electrons >= Z: break + + py.xlim(parameters['radius']) + py.xlabel('r($[a]$)') + ax.legend(loc='upper right') + ax.grid() + py.ylabel(r'$\rho(\psi)$') + py.title('Hydrogenic Wavefuntions (z=' + str(Z) + ')') + py.show() + + if parameters['occupied'][2]: + py.plot(r, total_rho*(4*np.pi*r*r)) + py.xlabel('r($[a]$)') + ax.grid() + py.ylabel(r'$\rho(\psi)$') + py.title('charge density') + py.xlim(parameters['radius']) + py.show() + + return states + +def numerovRadialVerify(): + + #compare Numerov and sympy wavefunction profiles + + quantum_numbers = [[1,0],[2,0],[2,1],[3,0],[3,1],[3,2]] + parameters = {'points':1000, 'extent':[1e-8, 100], 'z': 1} + + #sample points + r_points = np.linspace(parameters['extent'][0],parameters['extent'][1],parameters['points'])[::-1] + + #compute analytic solution + from sympy import lambdify + from sympy.abc import r, z + from sympy.physics.hydrogen import R_nl + + u_symbolic = [lambdify((r, z), r * R_nl(n, l, r, z), 'numpy')(r_points, 1) for n, l in quantum_numbers] + + #compute Numerov solution + u_numerov = [] + i = 0 + for n, l in quantum_numbers: + e = -parameters['z']/(n*n) + g = l*(l+1.)/r_points**2 - 2./r_points - e + + #correct start from above or below y=0 + asymptote = [1, -1, 1, 1, -1, 1] + + u = numerov(g, 0.0,-1e-8 , asymptote[i]*(-r_points[-2] + r_points[-1])) + i += 1 + + from scipy.integrate import simps + u /= np.sqrt(abs(simps(u**2,x = r_points))) + u_numerov.append(u) + + #plot wavefunctions + fig = py.figure(figsize=(8, 4), dpi=100) + for i in range(len(quantum_numbers)): + + ax = py.subplot(2, 3, i+1) + + ax.plot(r_points, u_symbolic[i], lw=0.6, color = 'black', label = r'sympy') + ax.plot(r_points, u_numerov[i], markersize = 4, lw=0, color = 'orange', marker = 'o', markevery=0.1, label = r'numerov') + + ax.set_xlim(-2, 16 + i * 8) + ax.set_xlabel(r'$r$[$a$]', labelpad=5) + ax.set_ylabel(r'$u_{{ {}{} }}(r)$'.format(*quantum_numbers[i]), labelpad=5) + py.xticks(fontsize=8) + py.yticks(fontsize=8) + ax.legend(loc='best', fontsize='x-small', ncol=1) + + fig.suptitle('Numerov-Actual Comparison') + py.tight_layout() + py.show() + + return + +def finiteDifferenceRadial(parameters = {'l': 0, 'points': 4000, 'extent':[0, 40], 'levels':25, 'show':5}): + #matrix finite difference solution + + #parameters + l = parameters['l'] + + #constants + hbar = getConstant('planck')/(2.0*np.pi) + e = getConstant('e') + epsilon_zero = getConstant('electric constant') + electron_mass = 9.1093837015e-31 + + from scipy import sparse + + def potentialMatrix(r): + #1/r schroedinger term + + v = e*e/(4.0*np.pi*epsilon_zero*r) + + return sparse.diags(v) + + def angularMatrix(r, l): + #1/r*r angular momentum term + + a = l*(l+1)/(r*r) + + return sparse.diags(a) + + def kineticMatrix(r): + #Laplace matrix kinetic term + + step = r[1] - r[0] + mainDiagonal = (-2.0/(step*step))*np.ones(len(r)) + offDiagonal = ( 1.0/(step*step))*np.ones(len(r)-1) + + return sparse.diags([mainDiagonal, offDiagonal, offDiagonal], (0, -1, 1)) + + r = np.linspace(parameters['extent'][1]*1.0e-10, parameters['extent'][0], parameters['points'], endpoint=False) + + #construct Hamiltonian + h = (-hbar*hbar/(2.0*electron_mass))*(kineticMatrix(r) - angularMatrix(r, l)) - potentialMatrix(r) + + from scipy.sparse.linalg import eigs + e_levels = parameters['levels'] + E, c = eigs(h, k=e_levels, which='SM') + + #sort the eigensolution + eigenvectors = np.array([x for _, x in sorted(zip(E, c.T), key=lambda pair: pair[0])]) + eigenvalues = np.sort(E).real/e + + #plot radial density + radial_density = [pow(np.absolute(eigenvectors[i,:]),2) for i in range(e_levels)] + + rydberg = getConstant('hartree->eV')/2.0 + legend = ['{: >5.2f} eV [{: >5.2f}]'.format(eigenvalues[i], -rydberg/pow(i+1+l,2)) for i in range(parameters['show'])] + for i in range(parameters['show']): + py.plot(r*1.0e10, radial_density[i], label=legend[i]) + + py.xlabel('r ($\\mathrm{\AA}$)') + py.ylabel('$\psi(r)^2$') + py.xlim([0, 20]) + py.grid() + py.legend() + py.title('radial wavefunctions for l=' + str(l)) + py.show() + +def hydrogenSpectralLines(type): + #compute and plot Hydrogen spectrum series + + lineDictionary = {} + + wavenumberFactor = getConstant('eV[-1]->nm') + energyFactor = getConstant('rydberg->eV') + + def series(n): + + baseEnergy = boundEnergies[n][2] * energyFactor + lines = [] + for i in boundEnergies[(n+1):]: + energy = i[2] * energyFactor - baseEnergy + lines.append([energy , wavenumberFactor/energy, str(i[0])+'->'+str(n+1)]) + + return lines + + boundEnergies = numerovHydrogenicEnergies({'points':4000, 'extent':[1e-8, 200], 'n_range': 8}) + boundEnergies = [i for i in boundEnergies if i[1] == 0] + + if 'lyman' in type: lineDictionary['lyman'] = series(0) + if 'balmer' in type: lineDictionary['balmer'] = series(1) + if 'paschen' in type: lineDictionary['paschen'] = series(2) + + return lineDictionary + +def monteCarloHydrogen(n, l, m, view='xy', plot=True): + '''a Monte-Carlo approach to hydrogenic orbitals see + 'A smooth path to plot hydrogen atom via Monte Carlo Method' - + Pedro Henrique Fernandes Lobo, Everaldo Arashiro, Alcides Castro e Silva, Carlos Felipe and Saraiva Pinheiro + ''' + import random + + def unlinspace(l, u, delta, spacing=1.1): + #custom linspace + + return [l + (i/(delta-1))**spacing*(u-l) for i in range(delta)] + + def angularDensity(t, l, m): + #get the angular density + + wavefunction = sph_harm(m, l, 0.0, t) + + return (wavefunction * wavefunction).real + + def radialDensity(r, n, l): + #get the radial wavefunction density + + factor = np.sqrt(((2.0/n)**3.0) * math.factorial(n-l-1) / (2.0 * n * math.factorial(n+l))) + laguerre = assoc_laguerre(2.0*r/n, n-l-1, 2.0*l+1) + + wavefunction = factor * np.exp(-r/n) * ((2.0*r/n)**l) * laguerre + + return (wavefunction * wavefunction).real + + def get_wavefunction_maximum(L, n, l, m, nr, nt, plot=True): + #get the maximum value of the wavefunction + + #maximum radial is half diagonal of cube + maxL = np.linalg.norm(L) * 0.5 + + #recalculate radial and angular increments + dr, dt = maxL/nr, math.pi/nt + + x = [] ; y = []; z = [] + + max_value = 0.0 + for i in range(nr): + r = i * dr + + for j in range(nt): + t = j * dt + + angular_density = angularDensity(t, l, m) + radial_density = radialDensity(r, n, l) + + density = angular_density * radial_density + x.append(r) ; y.append(t) ; z.append(density) + + if density > max_value: max_value = density + + if plot: + fig = py.figure(figsize=(4,4)) + ax = fig.add_subplot(111, projection='3d') + + ax.scatter(x, y, z, s=0.002) + + py.title(r'$\Phi_{{{},{},{}}}$'.format(n, l, m)) + for axis in [ax.xaxis, ax.yaxis, ax.zaxis]: + axis.set_ticklabels([]) + axis._axinfo['axisline']['linewidth'] = 1 + axis._axinfo['axisline']['color'] = (0, 0, 0) + axis._axinfo['grid']['linewidth'] = 0.5 + axis._axinfo['grid']['linestyle'] = "-" + axis._axinfo['grid']['color'] = (0, 0, 0) + axis._axinfo['tick']['inward_factor'] = 0.0 + axis._axinfo['tick']['outward_factor'] = 0.0 + axis.set_pane_color((0.95, 0.95, 0.95)) + ax.yaxis.labelpad=-15 + ax.xaxis.labelpad=-15 + + ax.set_xlabel(r'$r(a_0)$') + ax.set_ylabel(r'$\theta$') + + py.show() + + return max_value.real + + #decode view + view = view.replace('x','0',1).replace('y','1',1).replace('z','2',1) + + #define the view - viewport is dependent on n + plane = [int(view[0]), int(view[1])] + L = [0, 0, 0] + for i in plane: + L[i] = n*25.0 + dx, dy, dz = L + + dr, dt, icr = 0.1, 0.1, 1.05 + + nr = math.ceil(np.linalg.norm(L)/dr) + nt = math.ceil(2 * math.pi/dt) + + if plot: + fig = py.figure(figsize=(4,4)) + ax = fig.add_subplot(111) + r = np.array(unlinspace(0, np.linalg.norm(L)*0.5, 1000, spacing=4)) + + R = radialDensity(r, n, l) + py.plot(r, np.sqrt(R), '.k', markersize=2) + ax.set_yticks([]) + ax.set_xlabel(r'$r(a_0)$') + py.title(r'$\Phi_{{{},{},{}}}$'.format(n, l, m)) + py.show() + + wf_maximum = get_wavefunction_maximum(L, n, l, m, nr, nt, plot) + + cycle, cycles = 1, n*2000 + + mc_points = np.zeros((cycles+1,3)) + while cycle < cycles: + + #generate random value less than maximum of wavefunction + (icr-1)% + random_wavefunction = random.random() * wf_maximum * icr + + #generate random point in cube space + v = [dx * (random.random() - 0.5), dy * (random.random() - 0.5), dz * (random.random() - 0.5)] + r = np.linalg.norm(v) + + t = math.acos(v[2]/r) + + wavefunction = radialDensity(r, n, l) * angularDensity(t, l, m) + + if random_wavefunction < wavefunction: + cycle += 1 + mc_points[cycle] = v + + fig = py.figure(figsize=(4,4)) + ax = fig.add_subplot(111) + + py.plot(mc_points[:,plane[0]], mc_points[:,plane[1]], 'ok', markersize=1) + ax.set_xlabel(r'$x(a_0)$') + ax.set_ylabel(r'$y(a_0)$') + py.title(r'$\Phi_{{{},{},{}}}$'.format(n, l, m)) + py.show() + +if __name__ == '__main__': + + import sys + args = '' + for arg in sys.argv: + args += arg + + #get svf type + if 'rp' in args: + radialSolutionPlot([1,2,3,2,3,3], [0,0,0,1,1,2], 'radial distribution', False, {'points':100,'size':[7,5],'extent':[20,[-0.15,0.2]],'equal':False}) + elif 'rv' in args: + print('Radial verify returned ', radialVerify()) + elif 'as' in args: + angularSolutionPlotSingle(0, 3, {'points':100,'extent':[-0.5,0.5],'color_map':'coolwarm','axes':'off','bar':'on','alpha':0.2}) + elif 'av' in args: + print('Angular verify returned ', angularVerify()) + elif 'ap' in args: + angularSolutionPlotProjection(1, 3) + elif 'af' in args: + angularSolutionPlotFamily(3) + elif 'wc' in args: + wavefunctionContour(3, 2, 0, {'points':80, 'extent':[-30, 30], 'color_map':'gist_yarg', 'plane':'zx', 'elevation':0, 'contour': True}) + elif 'wv' in args: + print('Wavefunction verify returned ', wavefunctionVerify()) + elif 'ne' in args: + boundEnergies = numerovHydrogenicEnergies({'points':2000, 'extent':[1e-8, 100], 'n_range': 5}) + print(' n l Numerov Energy (E/E\N{SUBSCRIPT ZERO}) Actual') + print('---------------------------------------------------------------') + for e in boundEnergies: + print(' {:1n} {:1n} {:<5.4f} {:<5.4f}'.format(e[0], e[1], e[2], -1.0/(e[0]*e[0]))) + elif 'Nev' in args: + boundEnergies = numerovHydrogenicEnergies({'points':2000, 'extent':[1e-8, 100], 'n_range': 5}) + overall_validity, valid_list = numerovEnergyVerify(boundEnergies) + print('Numerov energy verify returned an overall ',overall_validity) + print('Numerov energy verify returned individuals ', valid_list) + elif 'NRv' in args: + numerovRadialVerify() + elif 'Nw' in args: + numerovHydrogenicRadialDensity({'points':2000, 'extent':[1e-8, 100], 'n_range': 5, \ + 'radius':[0,25],'occupied': [28, True, True]}) + elif 'fr' in args: + finiteDifferenceRadial() + elif 'se' in args: + lines = hydrogenSpectralLines(['lyman', 'balmer', 'paschen']) + print('transition energy (eV) wavelength (nm)') + + print('Lyman series\n------------') + for i in lines['lyman'][:5]: + print(' {:<6s} {:>8.3f} {:>6.1f}'.format(i[2], i[0], i[1])) + print('Balmer series\n-------------') + for i in lines['balmer'][:5]: + print(' {:<6s} {:>8.3f} {:>6.0f}'.format(i[2], i[0], i[1])) + print('Paschen series\n--------------') + for i in lines['paschen'][:5]: + print(' {:<6s} {:>8.3f} {:>6.0f}'.format(i[2], i[0], i[1])) + elif 'mc' in args: + monteCarloHydrogen(6, 3, 1, view='yz', plot=True) + else: + print('key not recognized') diff --git a/source/harpy.py b/source/harpy.py new file mode 100644 index 0000000..5658672 --- /dev/null +++ b/source/harpy.py @@ -0,0 +1,75 @@ +#main program +''' +if you change geometry you must rebuild molAtom and molBasis +with molAtom, molBasis = rebuildCenters(molAtom, molBasis, geo) +where geo is a (nAtoms, 3) array of the new geometry. + +if you don't want output then either replace lists with [] or +change the name of the item(s) to say 'mintsx'. +''' + +import rhf +import uhf +import rohf +import time +import sys +from numpy import load + +t = time.time() + +#concatenate arguments harpy.py-rhf.-v.-m.-LiH. +hfType = 'rhf' +args = '' +for arg in sys.argv: + args += arg + '.' + +#get hf type, remove fom args list once processed +if '-uhf.' in args: hfType = 'uhf' +if '-rohf.' in args: hfType = 'rohf' +args = args.replace('-uhf.','').replace('-rhf.','').replace('-rohf.','').replace('harpy.py.','') + +#verbose or minimal +molList, scfList = [[],['SCF', 'postSCF']] +if '-v.' in args: + molList = ['geometry', 'orbitals'] + scfList = [ 'preSCF', 'SCF', 'postSCF'] + +if '-m.' in args: scfList.append('mints') +args = args.replace('-v.','').replace('-m.','') + +#get project file +molFile = 'project.hpf' +if '.hpf' in args: + sgra = args[::-1] + i = sgra.find('fph.') + j = sgra.find('-', i) + molFile = sgra[i:j][::-1] + args = args.replace('-'+molFile+'.','') + +#only thing left in args is molecule +molecule = '' +if '-' in args: + molecule = args[1:-1] + +#set up geometry and basis +if hfType == 'rhf': + molAtom, molBasis, molData = rhf.mol(molList, file=molFile, molecule=molecule) + #check if there is a density matrix for this molecule in the basis + name, basisName = [molData['name'], molData['basis']] + mints = '../mints/' + name + '-' + basisName + '-mints.npz' + try: + data = load(mints) + density = data['d'] + except FileNotFoundError: + density = None + +elif hfType in ['uhf', 'rohf']: + molAtom, molBasis, molData = rhf.mol(molList, file=molFile, molecule=molecule, method=hfType) + +#do scf calculation +if hfType == 'rhf': + print(rhf.scf(molAtom, molBasis, molData , scfList, density), ' in ',round(time.time()-t,3),'s') +elif hfType == 'uhf': + print(uhf.scf(molAtom, molBasis, molData , scfList), ' in ',round(time.time()-t,3),'s') +elif hfType == 'rohf': + print(rohf.scf(molAtom, molBasis, molData , scfList), ' in ',round(time.time()-t,3),'s') \ No newline at end of file diff --git a/source/integral.py b/source/integral.py new file mode 100644 index 0000000..89c6267 --- /dev/null +++ b/source/integral.py @@ -0,0 +1,659 @@ +from __future__ import division +from numpy import zeros, dot, all +from numpy.linalg import norm +from math import exp, pow, pi, sqrt +from scipy.special import hyp1f1 +from atom import gaugeCenter + +def e(ia, ja, type, r, ie, je, n = 0, x = 0.0): + #recursive definition of Hermite Gaussian + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent + #type number of Hermite node + + p = ie + je + q = ie * je / p + #check bound of type + if n == 0: + if (type < 0) or (type > (ia + ja)): + return 0.0 + elif (ia + ja + type) == 0: + return exp(-q*r*r) + elif ja == 0: + return (1/(2 * p)) * e(ia-1,ja,type-1,r,ie,je) - (q*r/ie) * e(ia-1,ja,type,r,ie,je) + \ + (type+1) * e(ia-1,ja,type+1,r,ie,je) + else: + return (1/(2 * p)) * e(ia,ja-1,type-1,r,ie,je) + (q*r/je) * e(ia,ja-1,type,r,ie,je) + \ + (type+1) * e(ia,ja-1,type+1,r,ie,je) + else: + return e(ia+1,ja,type,r,ie,je,n-1,x) + x * e(ia,ja,type,r,ie,je,n-1,x) + +def overlap(ia, ja, ie, je, ir, jr): + #overlap between two Gaussians + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent, r - seperation + #0 type number of Hermite node + s = zeros(3) + for dim in range(0,3): + s[dim] = e(ia[dim], ja[dim], 0, ir[dim]-jr[dim], ie, je) + + return s[0]*s[1]*s[2] * pow(pi/(ie+je),1.5) + +def s(iBasis, jBasis): + #overlap between contracted Gaussians (S) + + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j]*overlap(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center) + + return sum + +def buildOverlap(bases): + #compute the overlap matrix + n = len(bases) + overlap = zeros((n,n)) + + for iBasis in range(0, n): + for jBasis in range(0, iBasis+1): + overlap[iBasis,jBasis] = s(bases[iBasis], bases[jBasis]) + #symmetrize + if iBasis != jBasis: + overlap[jBasis, iBasis] = overlap[iBasis, jBasis] + + return overlap + +def kinetic(ia, ja, ie, je, ir, jr): + #kinetic between two Gaussians + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent, r - seperation + + t = zeros(3) + + t[0] = je * (2*(ja[0] + ja[1] + ja[2]) + 3) * overlap(ia,ja,ie,je,ir,jr) + t[1] = -2 * je * je * (overlap(ia, [ja[0]+2, ja[1], ja[2]], ie, je, ir, jr) + \ + overlap(ia, [ja[0], ja[1]+2, ja[2]], ie, je, ir, jr) + \ + overlap(ia, [ja[0], ja[1], ja[2]+2], ie, je, ir, jr)) + t[2] = ja[0] * (ja[0] - 1) * overlap(ia, [ja[0]-2, ja[1], ja[2]], ie, je, ir, jr) + t[2] += ja[1] * (ja[1] - 1) * overlap(ia, [ja[0], ja[1]-2, ja[2]], ie, je, ir, jr) + t[2] += ja[2] * (ja[2] - 1) * overlap(ia, [ja[0], ja[1], ja[2]-2], ie, je, ir, jr) + + return t[0] + t[1] - 0.5*t[2] + +def k(iBasis, jBasis): + #kinetic between contracted Gaussians (K) + + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j]*kinetic(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center) + + return sum + + +def buildKinetic(bases): + #compute the kinetic (eN) matrix + n = len(bases) + kinetic = zeros((n,n)) + + for iBasis in range(0, n): + for jBasis in range(0, iBasis+1): + kinetic[iBasis,jBasis] = k(bases[iBasis], bases[jBasis]) + #symmetrize + if iBasis != jBasis: + kinetic[jBasis, iBasis] = kinetic[iBasis, jBasis] + + return kinetic + +def j(v, n, p, r, rnorm): + #Coulomb auxillary integrals + #v[] - order of Coulomb Hermite derivatives + #n Boys function order , p sum of exponents + #r distance between Gaussians composite center and nuclear center, + #rnorm - norm of r + + t = p * rnorm * rnorm + sum =0.0 + if (v[0]+v[1]+v[2]) == 0: + sum += pow(-2*p, n) * boys(n, t) + elif (v[0]+v[1]) == 0: + if v[2] > 1: + sum +=(v[2]-1) * j([v[0],v[1],v[2]-2],n+1,p,r,rnorm) + sum += r[2] * j([v[0],v[1],v[2]-1],n+1,p,r,rnorm) + elif v[0] == 0: + if v[1] > 1: + sum +=(v[1]-1) * j([v[0],v[1]-2,v[2]],n+1,p,r,rnorm) + sum += r[1] * j([v[0],v[1]-1,v[2]],n+1,p,r,rnorm) + else: + if v[0] > 1: + sum +=(v[0]-1) * j([v[0]-2,v[1],v[2]],n+1,p,r,rnorm) + sum += r[0] * j([v[0]-1,v[1],v[2]],n+1,p,r,rnorm) + + return sum + + + +def coulomb(ia, ja, ie, je, ir, jr, kr): + #Coulomb energy between two Gaussians + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent, r - seperation + + #p is composite center + p = ie + je + q = (ie*ir + je*jr)/p + + r = q - kr + + sum = 0.0 + for i in range(0, ia[0]+ja[0]+1): + for k in range(0, ia[1]+ja[1]+1): + for l in range(0, ia[2]+ja[2]+1): + sum += e(ia[0], ja[0], i, ir[0]-jr[0], ie, je) * \ + e(ia[1], ja[1], k, ir[1]-jr[1], ie, je) * \ + e(ia[2], ja[2], l, ir[2]-jr[2], ie, je) * \ + j([i,k,l], 0, p, r, norm(r)) + + return sum * pi * 2 / p + + +def v(iBasis, jBasis, r): + #contracted Gaussian + sum = 0.0 + + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i]*jBasis.normal[j]*iBasis.co[i]*jBasis.co[j]*coulomb(iBasis.momentum, jBasis.momentum, \ + iBasis.ex[i], jBasis.ex[j], iBasis.center,jBasis.center, r) + + return sum + +def buildCoulomb(atoms, bases): + #compute the Coulomb (eN) matrix + n = len(bases) + coulomb = zeros((n,n)) + + for iBasis in range(0,n): + for jBasis in range(0, iBasis+1): + + sum = 0.0 + for i in range(0, len(atoms)): + r = atoms[i].center + sum -= atoms[i].number * v(bases[iBasis], bases[jBasis], r) + coulomb[iBasis, jBasis] = sum + + if iBasis != jBasis: + coulomb[jBasis, iBasis] = coulomb[iBasis, jBasis] + + return coulomb + +def er(ie, je, ke, le, ia, ja, ka, la, ir, jr, kr, lr): + #two electron repulsion integral Gaussians + + p = ie + je + q = ke + le + + alpha = p*q/(p+q) + beta = (ie*ir + je*jr)/p - \ + (ke*kr + le*lr)/q + betaNorm = norm(beta) + + sum = 0.0 + + for a in range(0, ia[0] + ja[0] + 1): + for b in range(0, ia[1] + ja[1] + 1): + for c in range(0, ia[2] + ja[2] + 1): + + for t in range(0, ka[0] + la[0] + 1): + for u in range(0, ka[1] + la[1] + 1): + for v in range(0, ka[2] + la[2] + 1): + factor = e(ia[0],ja[0], a, ir[0]-jr[0], ie, je) * \ + e(ia[1],ja[1], b, ir[1]-jr[1], ie, je) * \ + e(ia[2],ja[2], c, ir[2]-jr[2], ie, je) + factor *= e(ka[0],la[0], t, kr[0]-lr[0], ke, le) * \ + e(ka[1],la[1], u, kr[1]-lr[1], ke, le) * \ + e(ka[2],la[2], v, kr[2]-lr[2], ke, le) + factor *= pow(-1, t+u+v) * j([a+t,b+u,c+v], 0, alpha, beta, betaNorm) + + sum += factor + + sum *= 2 * pow(pi, 2.5) / ((p*q) * sqrt(p+q)) + + return sum + +def eri(iBasis, jBasis, kBasis, lBasis): + #two electron repulsion integrals + sum = 0.0 + + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + for k in range(0, len(kBasis.co)): + for l in range(0, len(lBasis.co)): + factor = iBasis.normal[i]*jBasis.normal[j]*kBasis.normal[k]*lBasis.normal[l] * \ + iBasis.co[i]*jBasis.co[j]*kBasis.co[k]*lBasis.co[l] + factor *= er(iBasis.ex[i], jBasis.ex[j], kBasis.ex[k], lBasis.ex[l], \ + iBasis.momentum, jBasis.momentum, kBasis.momentum, lBasis.momentum, \ + iBasis.center, jBasis.center, kBasis.center, lBasis.center) + + sum += factor + return sum + +def buildEri(bases): + #build all the two electron integrals into linear array + #using symmetry only store upper triangle of ij,kl matrix + + #get dimension of array + n = len(bases) * (len(bases) - 1)/2 + len(bases) + n = n*(n+1)/2 + + linearEri = zeros(int(n)) + for i in range(0, len(bases)): + for j in range(0, i+1): + ij = i * (i + 1)/2 + j + for k in range(0, len(bases)): + for l in range(0, k+1): + kl = k * (k + 1)/2 + l + if ij >= kl: + ijkl = ij * (ij + 1)/2 + kl + linearEri[int(ijkl)] = eri(bases[i], bases[j], bases[k], bases[l]) + + return linearEri + +def iEri(i,j,k,l): + #index into the four-index eri integrals + p = max(i*(i+1)/2 + j, j*(j+1)/2 + i) + q = max(k*(k+1)/2 + l, l*(l+1)/2 + k) + + return int(max(p*(p+1)/2 + q, q*(q+1)/2 + p)) + + +def buildHamiltonian(type, S, K, J): + #build the intial Hamiltonian guess either + #core H = K + J + if type == 'core': + return (K + J), (K + J) + + #generalised Wolfberg-Helmholtz + if type == 'gwh': + n = S.shape[0] + H = zeros((n,n)) + for i in range(0, n): + for j in range( i, n): + H[i,j] = 1.75 * S[i,j] * ((K+J)[i,i] + (K+J)[j,j])/2 + if i != j: + H[j,i] = H[i,j] + + return (K + J), H + +def buildDensity(n, occupiedOrbitals, C): + density = zeros(( n, n)) + #initial density matrix + for i in range(0, n): + row = zeros(n) + for j in range(0, n): + for l in range(0, occupiedOrbitals): + row[j] += C[i,l] * C[j,l] + density[i,:] = row[:] + + return density + +def buildFock(H, eri, D, engine = 'aello'): + #build the fock matrix + n = H.shape[0] + fock = zeros((n,n)) + G = zeros((n,n)) + + if (all(D==0)): + #initially set Fock to core Hamiltonian + fock = H + else: + #subsequently Fock is core Hamiltonian + G ->[D.(2. - )] + if engine == 'native': + for i in range(0, n): + for m in range(0, n): + G[i,m] = 0.0 + for k in range(0, n): + for l in range(0, n): + G[i,m] += D[k,l] * ( 2* eri[iEri(i,m,k,l)] - eri[iEri(i,k,m,l)]) + fock[i,m] = H[i,m] + G[i,m] + elif engine == 'aello': + from aello import aelloFock + fock, G = aelloFock(n, H, eri, D) + + return fock, G + +def boys(n,T): + return hyp1f1(n+0.5 ,n+1.5, -T)/(2.0*n + 1.0) + +def mu(iBasis, jBasis, kr, direction): + #collects dipole values + + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i] * jBasis.normal[j] * iBasis.co[i] * jBasis.co[j] * \ + dipole(iBasis.momentum, jBasis.momentum, iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, kr, direction) + + return sum + +def dipole(ia, ja, ie, je, ir, jr, kr, direction): + # dipole moment + p = ie + je + q = ((ie*ir + je*jr)/p) - kr + ijr = ir - jr + + if direction == 'x': + u = e(ia[0], ja[0], 1, ijr[0], ie, je) + q[0]* e(ia[0], ja[0], 0, ijr[0], ie, je) + v = e(ia[1], ja[1], 0, ijr[1], ie, je) + t = e(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + if direction == 'y': + u = e(ia[0], ja[0], 0, ijr[0], ie, je) + v = e(ia[1], ja[1], 1, ijr[1], ie, je) + q[1]* e(ia[1], ja[1], 0, ijr[1], ie, je) + t = e(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + if direction == 'z': + u = e(ia[0], ja[0], 0, ijr[0], ie, je) + v = e(ia[1], ja[1], 0, ijr[1], ie, je) + t = e(ia[2], ja[2], 1, ijr[2], ie, je) + q[2]* e(ia[2], ja[2], 0, ijr[2], ie, je) + return u * v * t * pow(pi/p, 1.5) + +def buildEriMO( eigenVectors, ERI): + #transform eri from AO basis to MO basis + n = eigenVectors.shape[0] + eriMatrix_a = zeros((n,n)) + eriMatrix_b = zeros((n,n)) + eriMatrix_t = zeros((int(n*(n+1)/2), int(n*(n+1)/2))) + eriMO = zeros(len(ERI)) + + ij = 0 + for i in range(0, n): + for j in range(0 , i+1): + kl = 0 + for k in range(0, n): + for l in range(0, k+1): + eriMatrix_a[l,k] = ERI[iEri(i,j,k,l)] + eriMatrix_a[k,l] = eriMatrix_a[l,k] + kl += 1 + + #transform eriMatrix_a to MO basis + eriMatrix_b = dot(eigenVectors.T, dot(eriMatrix_a, eigenVectors)) + + kl = 0 + for k in range(0, n): + for l in range(0, k+1): + eriMatrix_t[kl,ij] = eriMatrix_b[k,l] + kl += 1 + + ij += 1 + + kl = 0 + for k in range(0, n): + for l in range(0, k+1): + #reset eriMatrix_a and _b + eriMatrix_a = zeros((n,n)) + eriMatrix_b = zeros((n,n)) + + ij = 0 + for i in range(0, n): + for j in range(0, i+1): + eriMatrix_a[j,i] = eriMatrix_t[kl,ij] + eriMatrix_a[i,j] = eriMatrix_a[j,i] + ij += 1 + + #transform eriMatrix_a to MO basis + eriMatrix_b = dot(eigenVectors.T, dot(eriMatrix_a, eigenVectors)) + + for i in range(0, n): + for j in range(0, i+1): + eriMO[iEri(k,l,i,j)] = eriMatrix_b[i,j] + + kl += 1 + + return eriMO + +def buildFockMOspin(spinOrbitals, eigenVectors, fock): + #transform Fock -> MO -> spin basis + + fockspin = zeros((spinOrbitals, spinOrbitals)) + eigenspin = zeros((spinOrbitals, spinOrbitals)) + + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + fockspin[p,q] = fock[int(p/2), int(q/2)] * ((p % 2) == (q % 2)) + eigenspin[p,q] = eigenVectors[int(p/2), int(q/2)] * ((p % 2) == (q % 2)) + + return dot(eigenspin.T, dot(fockspin, eigenspin)) + +def buildEriSingleBar(spinOrbitals, eriMO): + #construct the spin two-electron repulsion integrals - < | > + moSpinSingle = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + moSpinSingle[p,q,r,s] = eriMO[iEri(int(p/2),int(q/2),int(r/2),int(s/2))] * \ + ((p % 2) == (q % 2)) * ((r % 2) == (s % 2)) + + return moSpinSingle + +def buildEriDoubleBar(spinOrbitals, eriMO): + #construct the spin two-electron repulsion integrals - < || > + moSpinDouble = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + #get the sigle bar integrals + moSpinSingle = buildEriSingleBar(spinOrbitals, eriMO) + + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + moSpinDouble[p,q,r,s] = moSpinSingle[p,r,q,s] - moSpinSingle[p,s,q,r] + + return moSpinDouble + +def eriTransform(eri): + #transform between chemist [ij|kl] -> physicist notation + return eri.transpose(0, 2, 1, 3) + +def expandEri(erimo, nBasis): + #convert linear eri in MO basis to tensor form + tensor = zeros((nBasis, nBasis, nBasis, nBasis)) + + for p in range(0, nBasis): + for q in range(0, nBasis): + for r in range(0, nBasis): + for s in range(0, nBasis): + tensor[p,q,r,s] = erimo[iEri(p,q,r,s)] + return tensor + +def d(iBasis, jBasis, direction): + #construct Nabla + + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i] * jBasis.normal[j] * iBasis.co[i] * jBasis.co[j] * \ + nabla(iBasis.momentum, jBasis.momentum, iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, direction) + + return sum + +def nabla(ia, ja, ie, je, ir, jr, direction): + #Nabla + p = ie + je + ijr = ir - jr + + sx = e(ia[0], ja[0], 0, ijr[0], ie, je) + sy = e(ia[1], ja[1], 0, ijr[1], ie, je) + sz = e(ia[2], ja[2], 0, ijr[2], ie, je) + + dx = ja[0]*e(ia[0], ja[0]-1, 0, ijr[0], ie, je) - 2*je*e(ia[0], ja[0]+1, 0, ijr[0], ie, je) + dy = ja[1]*e(ia[1], ja[1]-1, 0, ijr[1], ie, je) - 2*je*e(ia[1], ja[1]+1, 0, ijr[1], ie, je) + dz = ja[2]*e(ia[2], ja[2]-1, 0, ijr[2], ie, je) - 2*je*e(ia[2], ja[2]+1, 0, ijr[2], ie, je) + + if direction == 'x': + return dx * sy * sz * pow(pi/p , 1.5) + if direction == 'y': + return sx * dy * sz * pow(pi/p , 1.5) + if direction == 'z': + return sx * sy * dz * pow(pi/p , 1.5) + +def buildNabla(atoms, bases, direction): + #build Nabla matrix + n = len(bases) + delOperator = zeros((n,n)) + + for iBasis in range(0,n): + for jBasis in range(0, iBasis+1): + delOperator[iBasis,jBasis] = d(bases[iBasis], bases[jBasis], direction) + + if iBasis != jBasis: + delOperator[jBasis, iBasis] = -delOperator[iBasis, jBasis] + + return delOperator + +def ang(ia, ja, ie, je, ir, jr, kr, direction): + # angular momentum + p = ie + je + ijr = ir - jr + + sd = zeros((3,3)) + for i in range(3): + sd[0,i] = e(ia[i], ja[i], 0, ijr[i], ie, je) + sd[1,i] = e(ia[i], ja[i], 0, ijr[i], ie, je, 1, ir[i]-kr[i]) + sd[2,i] = (ja[i] * e(ia[i], ja[i]-1, 0, ijr[i], ie, je)) - (2.0 * je * e(ia[i], ja[i]+1, 0, ijr[i], ie, je)) + + if direction == 'x': + return -sd[0,0] * (sd[1,1] * sd[2,2] - sd[1,2] * sd[2,1]) * pow(pi/p, 1.5) + elif direction == 'y': + return -sd[0,1] * (sd[1,2] * sd[2,0] - sd[1,0] * sd[2,2]) * pow(pi/p, 1.5) + elif direction == 'z': + return -sd[0,2] * (sd[1,0] * sd[2,1] - sd[1,1] * sd[2,0]) * pow(pi/p, 1.5) + +def a(iBasis, jBasis, kr, direction): + #construct angular momentum + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i] * jBasis.normal[j] * iBasis.co[i] * jBasis.co[j] * \ + ang(iBasis.momentum, jBasis.momentum, iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, kr, direction) + + return sum + + +def buildAngular(atoms, bases, direction, gaugeOrigin): + #build the angular momentum integrals + n = len(bases) + angular = zeros((n,n)) + + #get gauge center + gauge = gaugeCenter(atoms, gaugeOrigin) + + for iBasis in range(0,n): + for jBasis in range(0, iBasis+1): + angular[iBasis,jBasis] = a(bases[iBasis], bases[jBasis], gauge, direction) + + if iBasis != jBasis: + angular[jBasis, iBasis] = -angular[iBasis, jBasis] + + return angular + +def quadrupole(ia, ja, ie, je, ir, jr, kr, direction): + # quadrupole moment + p = ie + je + q = ((ie*ir + je*jr)/p) - kr + ijr = ir - jr + + sx = e(ia[0], ja[0], 0, ijr[0], ie, je) + sy = e(ia[1], ja[1], 0, ijr[1], ie, je) + sz = e(ia[2], ja[2], 0, ijr[2], ie, je) + + tx = e(ia[0], ja[0], 1, ijr[0], ie, je) + q[0]* e(ia[0], ja[0], 0, ijr[0], ie, je) + ty = e(ia[1], ja[1], 1, ijr[1], ie, je) + q[1]* e(ia[1], ja[1], 0, ijr[1], ie, je) + tz = e(ia[2], ja[2], 1, ijr[2], ie, je) + q[2]* e(ia[2], ja[2], 0, ijr[2], ie, je) + + if direction == 'xx': + u = 2.0 * e(ia[0], ja[0], 2, ijr[0], ie, je) + 2.0 * q[0]* e(ia[0], ja[0], 1, ijr[0], ie, je) \ + + (q[0]*q[0] + (0.5 / p)) * e(ia[0], ja[0], 0, ijr[0], ie, je) + return u * sy * sz * pow(pi/p, 1.5) + if direction == 'yy': + u = 2.0 * e(ia[1], ja[1], 2, ijr[1], ie, je) + 2.0 * q[1]* e(ia[1], ja[1], 1, ijr[1], ie, je) \ + + (q[1]*q[1] + (0.5 / p)) * e(ia[1], ja[1], 0, ijr[1], ie, je) + return sx * u * sz * pow(pi/p, 1.5) + if direction == 'zz': + u = 2.0 * e(ia[2], ja[2], 2, ijr[2], ie, je) + 2.0 * q[2]* e(ia[2], ja[2], 1, ijr[2], ie, je) \ + + (q[2]*q[2] + (0.5 / p)) * e(ia[2], ja[2], 0, ijr[2], ie, je) + return sx * sy * u * pow(pi/p, 1.5) + if direction == 'xy': + return tx * ty * sz * pow(pi/p, 1.5) + if direction == 'yz': + return sx * ty * tz * pow(pi/p, 1.5) + if direction == 'zx': + return tx * sy * tz * pow(pi/p, 1.5) + +def q(iBasis, jBasis, kr, direction): + #collects quadrupole values + + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i] * jBasis.normal[j] * iBasis.co[i] * jBasis.co[j] * \ + quadrupole(iBasis.momentum, jBasis.momentum, iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, kr, direction) + + return sum + +def electricField(atoms, bases, direction, gauge): + #compute components of the electric field + + n = len(bases) + electric = zeros((n,n)) + + #get gauge center + gaugeOrigin = gaugeCenter(atoms, gauge) + + for iBasis in range(0,n): + for jBasis in range(0, iBasis+1): + electric[iBasis,jBasis] = ef(bases[iBasis], bases[jBasis], gaugeOrigin, direction) + + if iBasis != jBasis: + electric[jBasis, iBasis] = electric[iBasis, jBasis] + + return electric + +def ef(iBasis, jBasis, kr, direction): + #construct electric field + sum = 0.0 + for i in range(0, len(iBasis.co)): + for j in range(0, len(jBasis.co)): + sum += iBasis.normal[i] * jBasis.normal[j] * iBasis.co[i] * jBasis.co[j] * \ + electric(iBasis.momentum, jBasis.momentum, iBasis.ex[i], jBasis.ex[j], iBasis.center, jBasis.center, kr, direction) + + return sum + +def electric(ia, ja, ie, je, ir, jr, kr, direction): + # electric field + #Coulomb energy between two Gaussians + # i,j - Gaussian 'i' 'j' , a - angular momentum , e - exponent, r - seperation + + #p is composite center + p = ie + je + q = (ie*ir + je*jr)/p + + r = q - kr + + #component + if direction == 'x': ix, iy, iz = [1,0,0] + if direction == 'y': ix, iy, iz = [0,1,0] + if direction == 'z': ix, iy, iz = [0,0,1] + #potential + if direction == 'p': ix, iy, iz = [0,0,0] + + sum = 0.0 + for i in range(0, ia[0]+ja[0]+1): + for k in range(0, ia[1]+ja[1]+1): + for l in range(0, ia[2]+ja[2]+1): + sum += e(ia[0], ja[0], i, ir[0]-jr[0], ie, je) * \ + e(ia[1], ja[1], k, ir[1]-jr[1], ie, je) * \ + e(ia[2], ja[2], l, ir[2]-jr[2], ie, je) * \ + j([i+ix,k+iy,l+iz], 0, p, r, norm(r)) + + sign = pow(-1, (ix+iy+iz)) + return sign* sum * pi * 2 / p diff --git a/source/mbpt.py b/source/mbpt.py new file mode 100644 index 0000000..de33b9d --- /dev/null +++ b/source/mbpt.py @@ -0,0 +1,621 @@ +from __future__ import division +import numpy as np + +diagrams_hh = [] + +def nodalPairCount_hh(order): + #return the number of pairs of nodes in Hugenholtz diagrams of 'order' + + return int(0.5 * order * (order- 1)) + +def nodalLineCount_hh(order): + #return the total number of line connecting nodes in the diagram + + return 2 * order + +def nodalPairs_hh(order): + #return the nodal pairs in diagram of 'order' + + pairs = [] + + for p in range(order): + for q in range(p+1, order): + pairs.append([p, q]) + + return pairs + +def validDiagrams_hh(diagrams, order): + #perform checks on diagrams for validity + + verified = [] + passed = False + + #get list of nodal pairs + nodalPair = nodalPairs_hh(order) + pairCount = nodalPairCount_hh(order) + + #number of lines + for d in diagrams: + + if sum(d) == 2 * order: + + #check line count for diagram + vertex = [0] * order + + #accummulate lines to each node + for i in range(pairCount): + vertex[nodalPair[i][0]] += d[i] + vertex[nodalPair[i][1]] += d[i] + + #check correct number of lines at node + if vertex == [4] * order: + + #number of lines at nodes verified check connected + route = [0,1] + node = 1 + tested = [False] * pairCount + tested[0] = True + + #loop over nodes to be found + while True: + + #loop over nodal pairs + for i in range(pairCount): + + pair = nodalPair[i] + + #has pair been checked + if not tested[i]: + + #is current node in nodal pair + if node == pair[0]: + route.append(pair[1]) + node = pair[1] + elif node == pair[1]: + route.append(pair[0]) + node = pair[0] + tested[i] = True + + #all nodes tested leave while loop + if all(t == True for t in tested): break + + #have we got all nodes, make unique and sort + route = list(set(route)) + route.sort() + passed = True + for i in range(order): + if i != route[i]: passed = False + + if passed: verified.append(d) + + return verified + +def nodalPairConnectionsCombinations_hh(connections, nodePair, pairCount, order): + #generate all combinations of connections between pairs + + #recursive return + + if nodePair == pairCount: + return validDiagrams_hh(connections,order) + + #define maximum number of connections + limit = 3 + + #adjust for special case order 2 + if order == 2: limit += 1 + + #make copy of connections as we are modifying it and don't want to processed appended elements + c = connections.copy() + + #loop over all elements in original connection list + for connection in connections: + + #loop over all possible connection types, + for i in range(1, limit+1): + + #make copy of current connection + t = connection.copy() + t[nodePair] = i + + #if sum of elements is less than or equal to allowed lines in diagram save + if sum(t) <= 2 * order: + c.append(t) + + #don't need original list now + del connections + + #increment the nodePair + nodePair += 1 + + #recurse + node = nodalPairConnectionsCombinations_hh(c, nodePair, pairCount, order) + + return node + +def verifyArrow_hh(up, pairs, diagram, order): + #check up arrow combination compatible with original diagram + + nodes = np.zeros(order) + + #loop over all pairs of nodes + for n, pair in enumerate(pairs): + i = pair[0] + j = pair[1] + + #sum up arrows at each node + if i < j: + nodes[j] += up[n] + nodes[i] += diagram[n] - up[n] + else: + nodes[i] += up[n] + nodes[j] += diagram[n] - up[n] + + passed = True + for i in range(order): + if nodes[i] != 2: passed = False + + return passed + + +def upArrow_hh(up, nodePair, diagram, pairs, pairCount, order): + #up arrow combinations for diagram + + if nodePair == pairCount-1: + + passed = verifyArrow_hh(up, pairs, diagram, order) + if passed: diagrams_hh.append([diagram,up.copy()]) + + return + + nodePair += 1 + + #get limits of up connections + lo = max(diagram[nodePair] - 2, 0) + hi = min(diagram[nodePair],2) + + #generate combination within range + for i in range(lo, hi+1): + + up[nodePair] = i + upArrow_hh(up, nodePair, diagram, pairs, pairCount, order) + + nodePair -= 1 + + return + +def upArrowCombinations_hh(diagramCombinations,order): + #get all combinations of up arrows + + for i in diagramCombinations: + + nodePair = -1 + pairCount = nodalPairCount_hh(order) + + arrows = [0] * pairCount + upArrow_hh(arrows, nodePair, i, nodalPairs_hh(order), pairCount, order) + + + return len(diagrams_hh) + +def downArrow_hh(diagram, arrow, pairs): + #compute the down arrows from an up arrow specification + + down = [0] * pairs + for pair in range(pairs): + down[pair] = abs(diagram[pair] - arrow[pair]) + + + return down + +def connectionFlow_hh(up, down, order): + #determine characteristics of each node + + #special case order 2 + if order == 2: return [[0,1,'d','i','a'],[0,1,'d','i','b'],[0,1,'u','o','r'], [0,1,'u','o','s'], \ + [0,1,'d','o','a'],[0,1,'d','o','b'],[0,1,'u','i','r'], [0,1,'u','i','s']] + + def nodalFlow(pair, p, a, d, id, flows): + #assign flow list element + + i, j= pair + la = [i, j, a, d, id] + id += 1 + + #allow for two lines in same direction between same pair + if p == 2: + lb = [i, j, a, d, id] + id += 1 + flows.append(la) + flows.append(lb) + else: flows.append(la) + + return id, flows + + pairs = nodalPairs_hh(order) + id = 1 + flowPattern = [] + + for node in range(order): + for i, pair in enumerate(pairs): + + #determine defining attributes of each line + if node == pair[0] and up[i] != 0: + id, flowPattern = nodalFlow(pair, up[i], 'u', 'o', id, flowPattern) + if node == pair[0] and down[i] != 0: + id, flowPattern = nodalFlow(pair, down[i], 'd', 'i', id, flowPattern) + if node == pair[1] and up[i] != 0: + id, flowPattern = nodalFlow(pair, up[i], 'u', 'i', id, flowPattern) + if node == pair[1] and down[i] != 0: + id, flowPattern = nodalFlow(pair, down[i], 'd', 'o', id, flowPattern) + + #rationalize numbering so each line has unique number + connection = 0 + processed = [] + while connection != 2 * nodalLineCount_hh(order) : + + #current connection + i,j,a,d,id = flowPattern[connection] + + #see if match in other direction + for f in range(connection+1, len(flowPattern)): + if flowPattern[f][:3] == [i,j,a] and flowPattern[f][3] != d : + + #if not already changed re-label and mark as changed + if not f in processed: + flowPattern[f][4] = id + processed += [f] + break + + connection += 1 + + #change to symbols + holes = ['a','b','c','d','e','f','g','h'] + particles = ['r','s','t','u','v','w','x','y'] + + for i, line in enumerate(flowPattern): + + #get id and if digit translate to letter + ID = line[4] + if str(ID).isdigit(): + + #determine if hole or particle + if line[2] == 'd': id = holes[0] + else: id = particles[0] + + #replace all occurences + for j in range(i, len(flowPattern)): + if flowPattern[j][4] == ID: flowPattern[j][4] = id + + #remove letter from pool + if id in holes: del holes[0] + else: del particles[0] + + return flowPattern + +def rules_hh(flows, order): + #evaluate rules + + rules = {} + + #rule 1 - in and out lines at each node + eri = '' + + for i in range(order): + + #get this node values + nodalFlow = flows[4*i: 4*i+4] + + #sort to get 'in' lines first + nodalFlow.sort(reverse = False, key=lambda i :i[3]) + + eri += nodalFlow[0][4] + nodalFlow[1][4] + nodalFlow[2][4] + nodalFlow[3][4] + ',' + + rules['doubleBars'] = eri[:-1] + + #rule 2 - mid-points of nodes + + levels = [] + + for level in range(order-1): + + e = '' + for f in flows: + i,j,a,d,id = f + + #stop double counting by just taking 'in' + if d == 'o': continue + if i <= level and j > level: + + if a == 'd': e += '+' + id + else: e += '-' + id + + levels.append(e[1:]) + + rules['orbitalEnergies'] = levels + + #rule 3 - down lines (h) and closed loops(l) + + h = 0 + for f in flows: + if f[2] == 'd': h += 1 + + #get string of labels + eri = rules['doubleBars'].replace(',','') + + labels = [] + cycles = [] + + current = 0 + + while True: + + #target of cycle + target = eri[current] + + labels.append(target) + cycle = target + '->' + + #search string cyclically + while True: + + current += 2 + next = eri[current] + labels.append(next) + + cycle += next + '->' + if target == next: break + + if next in eri[current+1:]: + current = eri.index(next, current+1) + else: + current = 0 + current = eri.index(next, current+1) + + #cycle finished + cycles.append(cycle[:-2]) + cycle = '' + + #see if we've done all labels + visited = True + for i, a in enumerate(eri): + if a not in labels: + visited = False + break + + if visited: break + + #start where label still not visited + current = i + + rules['sign'] = [h//2, len(cycles)] + rules['cycles'] = cycles + + #rule 5 - equivalent lines + + equivalent = [] + for f in flows: + if f[3] == 'i': equivalent.append(f) + equivalent.sort() + + count = 0 + for i in range(len(equivalent)-1): + if equivalent[i][:3] == equivalent[i+1][:3]: + count += 1 + + rules['powerTwo'] = -count + + return rules + +def codeDiagrams_hh(molAtom, molBasis, molData, order): + #produce python statements for diagrams of order + + diagrams_hh.clear() + + def getDenominators(rule, h): + #generate reshapes for denominators + + code = '\nf = []' + #get denominator strings + f = [] + for r in rule.split(','): + a = '' + for s in r: + if not s in '+-': a += s + f.append(a) + + #for each denominator expression generate reshape code + for i, denominator in enumerate(f): + + d = '' + for j, a in enumerate(denominator): + l = len(denominator) + + #occupied or virtual + if a in h: d += '+ eocc' + else: d += '- evir' + + if j != l-1: + d += '.reshape(-1' + ',1' * (l-j+-1) +') ' + + d = '\nf.append( 1/(' + d[2:] + '))' + + code += d + + return code + + code = """ +import rhf + +eSCF = rhf.scf(molAtom, molBasis, molData, []) + +from integral import buildFockMOspin +import numpy as np +ns = 2 * rhf.C.shape[0] +fs = buildFockMOspin(ns, rhf.C, rhf.fock) +efs = np.diag(fs) + +from basis import electronCount +charge = molData['charge'] +nsbf = len(molBasis)*2 +nocc = int(electronCount(molAtom, charge)) +nvir = nsbf - nocc + +from integral import buildEriMO, buildEriDoubleBar +eriMO = buildEriMO(rhf.C, rhf.ERI) +MO = buildEriDoubleBar(nsbf, eriMO) + +eocc = efs[:nocc] +evir = efs[nocc:] + +o = slice(0,nocc) +v = slice(nocc, nsbf) + +mp = 0.0 + """ + holes = ['a','b','c','d','e','f','g','h'] + particles = ['r','s','t','u','v','w','x','y'] + + #get combinations of diagrams + connections = [[0] * nodalPairCount_hh(order)] + nodePair = 0 + pairCount = nodalPairCount_hh(order) + + diagramCombinations = nodalPairConnectionsCombinations_hh(connections, nodePair, pairCount, order) + + #up arrow diagrams + nDiagrams = upArrowCombinations_hh(diagramCombinations, order) + + for i, diagrams in enumerate(diagrams_hh): + + diagram, up = diagrams + + #down arrows + down = downArrow_hh(diagram, up, pairCount) + + #arrow flow + flows = connectionFlow_hh(up, down, order) + + #get rules + rules = [] + rules.append(rules_hh(flows, order)) + + #enumerate rules for diagrams + + for rule in rules: + + d = '' + for a in rule['orbitalEnergies']: + d += a.replace('+','') + d = d.replace('-','') + ',' + + auto = getDenominators(d[:-1], holes) + + #sign and power of 1/2 + auto += '\nmp += ' + h = pow(-1, int(rule['sign'][0]) + int(rule['sign'][1])) + if h<0: auto += '-1 * ' + auto += 'pow(1/2, ' + str(abs(rule['powerTwo'])) + ') * np.einsum(\'' + + #double bar integrals and occupations + auto += rule['doubleBars'] + + d = ',' + d + auto += d[:-1] + '\', MO[' + for a in rule['doubleBars']: + if a in holes: auto += 'o,' + elif a in particles: auto += 'v,' + else :auto = auto[:-1] + '],MO[' + auto = auto[:-1] + '], ' + + for i in range(order-1): + auto += 'f[' + str(i) + '],' + auto = auto[:-1] + ')' + + code += auto + '\n' + + data = {'molAtom':molAtom,'molBasis':molBasis,'molData':molData} + + exec(code, {}, data) + + return data['mp'] + +def HTMLDiagrams_hh(order, filename): + #produce an HTML file for diagrams of order + + diagrams_hh.clear() + + #get combinations of diagrams + connections = [[0] * nodalPairCount_hh(order)] + nodePair = 0 + pairCount = nodalPairCount_hh(order) + + diagramCombinations = nodalPairConnectionsCombinations_hh(connections, nodePair, pairCount, order) + + #up arrow diagrams + nDiagrams = upArrowCombinations_hh(diagramCombinations, order) + + #open file and write header + f = open(filename, 'w') + f.write('\n\n\t\n\t\t
order of diagrams ' + str(order) + '
') + + for i, diagrams in enumerate(diagrams_hh): + + diagram, up = diagrams + + #down arrows + down = downArrow_hh(diagram, up, pairCount) + + #arrow flow + flows = connectionFlow_hh(up, down, order) + + #get rules + rules = [] + rules.append(rules_hh(flows, order)) + + #enumerate rules for diagrams + for rule in rules: + + f.write('\n\t\t

  diagram ' + str(diagram) + '

') + f.write('\n\t\t

    sub-diagram ' + str(up) + \ + '⮝' + ' ' + str(down) + '⮟

') + + h = str(rule['sign'][0]) + '+' + str(rule['sign'][1]) + f.write('\n\t\t

\n\t\t\t\n\t\t\t\t    (-1)' + h + '') + + h = str(rule['powerTwo']) + f.write('\n\t\t\t\t (2)' + h + ' ') + + f.write('\n\t\t\t\t\n\t\t\t\t\t') + eris = rule['doubleBars'].split(',') + for eri in eris: + f.write('\n\t\t\t\t\t\t<' + eri[:2] + '||' + eri[2:] + '>') + f.write('\n\t\t\t\t\t\n\t\t\t\t\t') + + es = rule['orbitalEnergies'] + for e in es: + s = '' + for i in e: + if i.isalpha(): s += 'ε' + i + '' + if i in '+-': s += '' + i + '' + f.write('\n\t\t\t\t\t\t(' + s + ')' ) + + f.write('\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t

') + + f.write('\n\t\n') + f.close() + +def mbptEvaluateMPn(molAtom, molBasis, molData, scf, mp = [2, 3, 4]): + #evalute mbpt diagrams for mp2, mp3 and mp4 + from view import postSCF + + if not isinstance(mp, list): mp = [mp] + + mbpt = [] + for m in mp: + mbpt.append(codeDiagrams_hh(molAtom, molBasis, molData, m)) + + if mp == [2, 3, 4]: + mp2, mp3, mp4 = mbpt + postSCF([mp2,mp3,mp4,scf,scf+mp2+mp3+mp4], 'mbpt') + + return mbpt diff --git a/source/mp.py b/source/mp.py new file mode 100644 index 0000000..61a3451 --- /dev/null +++ b/source/mp.py @@ -0,0 +1,500 @@ +from __future__ import division +from integral import buildEriMO, iEri, buildEriDoubleBar, buildFockMOspin, expandEri +from numpy.polynomial.laguerre import laggauss as quadrature +from basis import electronCount +from view import postSCF +from numpy import zeros, exp, diag, ones, einsum, newaxis, fill_diagonal +from numpy.linalg import eigh + +def mollerPlesset(atoms, charge, bases, eigenVectors, eigenValues, fock, ERI, e): + #compute mp2 and mp3 + ps = aps = mp = 0.0 + ps , aps = mp2(atoms, charge, bases, eigenVectors, eigenValues, ERI) + mp = mp3(atoms, charge, bases, eigenVectors, fock, ERI) + + postSCF([ps, aps, mp, e], 'mp') + + +def mp2(atoms, charge, bases, eigenVectors, eigenValues, ERI, type = 'p-ap'): + #moller-plesset perturbation theory 2nd order + eriMO = buildEriMO(eigenVectors, ERI) + + nOccupied = int(electronCount(atoms, charge)/2) + n = len(bases) + + mpParallel = mpAntiParallel = 0 + for i in range(0, nOccupied): + for a in range(nOccupied, n): + + for j in range(0, nOccupied): + for b in range(nOccupied, n): + u = eigenValues[i] + eigenValues[j] - eigenValues[a] - eigenValues[b] + v = eriMO[iEri(i,a,j,b)] + + mpParallel += (v*(v- eriMO[iEri(i,b,j,a)]))/u + mpAntiParallel += (v*v)/u + + if type == 'p-ap': + + #parallel and anti-parallel components + return mpParallel , mpAntiParallel + + elif type == 'scs': + + #do a spin-component scaled mp2 correction + + scs = mpParallel/3.0 + 1.2 * mpAntiParallel + return scs + + elif type == 'no': + + #get mp2 natural orbitals + + nVirtual = n - nOccupied + ga = zeros((nOccupied, nVirtual, nOccupied, nVirtual)) + gb = zeros((nOccupied, nVirtual, nOccupied, nVirtual)) + + for i in range(nOccupied): + for a in range(nOccupied, n): + for j in range(nOccupied): + for b in range(nOccupied, n): + ga[i,a-nOccupied,j,b-nOccupied] = eriMO[iEri(i,a,j,b)] + (eriMO[iEri(i,a,j,b)] - eriMO[iEri(i,b,j,a)]) + gb[i,a-nOccupied,j,b-nOccupied] = eriMO[iEri(i,a,j,b)] / (eigenValues[i] + eigenValues[j] - eigenValues[a] - eigenValues[b]) + + co = zeros((nOccupied, nOccupied)) + for i in range(nOccupied): + for j in range(nOccupied): + for a in range(nOccupied, n): + for k in range(nOccupied): + for b in range(nOccupied, n): + co[i,j] += ga[i,a-nOccupied,k,b-nOccupied] * gb[j,a-nOccupied,k,b-nOccupied] + + cv = zeros((nVirtual, nVirtual)) + for i in range(nOccupied): + for c in range(nOccupied, n): + for a in range(nOccupied, n): + for j in range(nOccupied): + for b in range(nOccupied, n): + cv[c-nOccupied,a-nOccupied] += ga[i,a-nOccupied,j,b-nOccupied] * gb[i,c-nOccupied,j,b-nOccupied] + + #construct symmetric mp2 density matrix + mp2Density = zeros((n, n)) + po = 0.25 * (co + co.T) + diag(ones(nOccupied)) * 2 + pv = -0.25 * (cv + cv.T) + + mp2Density[:nOccupied, :nOccupied] = po + mp2Density[nOccupied:, nOccupied:] = pv + + #diagonalise + noE, noC = eigh(mp2Density) + + return noE, noC + +def mp3(atoms, charge, bases, eigenVectors, fock, ERI): + #moller-plesset perturbation theory 3rd order - spin orbitals + + nElectrons = int(electronCount(atoms, charge)) + spinOrbitals = len(bases) * 2 + + #spin MO eris + eriMO = buildEriMO(eigenVectors, ERI) + eriMOspin = buildEriDoubleBar(spinOrbitals, eriMO) + + + #spin MO fock + fs = buildFockMOspin(spinOrbitals, eigenVectors, fock) + + mp3 = 0.0 + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for k in range(0, nElectrons): + for l in range(0, nElectrons): + for a in range(nElectrons,spinOrbitals): + for b in range(nElectrons,spinOrbitals): + u = (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) * \ + (fs[k,k] + fs[l,l] - fs[a,a] - fs[b,b]) + + mp3 += 0.125 * eriMOspin[i,j,a,b] * eriMOspin[k,l,i,j] * eriMOspin[a,b,k,l] / u + + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons,spinOrbitals): + for b in range(nElectrons,spinOrbitals): + for c in range(nElectrons,spinOrbitals): + for d in range(nElectrons,spinOrbitals): + u = (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) * \ + (fs[i,i] + fs[j,j] - fs[c,c] - fs[d,d]) + + mp3 += 0.125 * eriMOspin[i,j,a,b] * eriMOspin[a,b,c,d] * eriMOspin[c,d,i,j] / u + + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for k in range(0, nElectrons): + for a in range(nElectrons,spinOrbitals): + for b in range(nElectrons,spinOrbitals): + for c in range(nElectrons,spinOrbitals): + u = (fs[i,i] + fs[j,j] - fs[a,a] - fs[b,b]) * \ + (fs[i,i] + fs[k,k] - fs[a,a] - fs[c,c]) + + mp3 += eriMOspin[i,j,a,b] * eriMOspin[k,b,c,j] * eriMOspin[a,c,i,k] / u + + return mp3 + +def orbitalOptimisedMP2(eigenVectors, h, e, molBasis, eNuclear, ERI, nElectrons): + import scipy.linalg as la + from numpy import zeros, dot, zeros_like, append + + def hSpinBlock(h, spinOrbitals, nBasis): + #spin blocking a square matrix + sb = zeros((spinOrbitals, spinOrbitals)) + + for p in range(0, nBasis): + for q in range(0, nBasis): + sb[p,q] = sb[p+nBasis,q+nBasis] = h[p,q] + + return sb + + def eriSpinBlock(eri, spinOrbitals, nBasis): + #spin blocking the eri + sbEri = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + + for p in range(0, nBasis): + for q in range(0, nBasis): + for r in range(0, nBasis): + for s in range(0, nBasis): + sbEri[p,q,r,s] = sbEri[p,q,r+nBasis, s+nBasis] = eri[iEri(p,q,r,s)] + + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, nBasis): + for s in range(0, nBasis): + sbEri[p,q,r,s] = sbEri[p,q,r+nBasis, s+nBasis] = sbEri[s,r,q,p] + + aoSpinDoubleBar = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + aoSpinDoubleBar[p,q,r,s] = sbEri[p,r,q,s] - sbEri[p,s,q,r] + + return aoSpinDoubleBar + + def eriSpinMO(gao, eigenVectors): + #change eri from spin AO to spin MO + gmoA = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + gmo = zeros_like(gmoA) + for a in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + for p in range(0, spinOrbitals): + gmoA[a,q,r,s] += eigenVectors[p,a] * gao[p,q,r,s] + for a in range(0, spinOrbitals): + for b in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + gmo[a,b,r,s] += eigenVectors[q,b] * gmoA[a,q,r,s] + gmoA = zeros_like(gmoA) + for a in range(0, spinOrbitals): + for b in range(0, spinOrbitals): + for c in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + gmoA[a,b,c,s] += eigenVectors[r,c] * gmo[a,b,r,s] + gmo = zeros_like(gmo) + for a in range(0, spinOrbitals): + for b in range(0, spinOrbitals): + for c in range(0, spinOrbitals): + for d in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + gmo[a,b,c,d] += eigenVectors[s,d] * gmoA[a,b,c,s] + + return gmo + + #loop control + iterations = 40 + tolerance = 1.0e-8 + + #metrics + nBasis = len(molBasis) + nOccupied = nElectrons + spinOrbitals = 2 * nBasis + nVirtual = spinOrbitals - nOccupied + + #eri in spin atomic basis and double bar + gao = eriSpinBlock(ERI,spinOrbitals, nBasis) + #h in spin atomic basis + hao = hSpinBlock(h,spinOrbitals, nBasis) + + #get orbital energies (o,v)+(o,v) + eps = append(e, e) + + #get orbital coefficients, block (not spin block), and sort by eps (oo,vv) + c = zeros((spinOrbitals, spinOrbitals)) + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + c[p,q] = eigenVectors[p % nBasis, q % nBasis] + if ((p < nBasis) and (q >= nBasis)) or ((p >= nBasis) and (q < nBasis)): + c[p,q] = 0.0 + + c = c[:, eps.argsort()] + + # Transform gao and hao into MO basis + hmo = dot(c.T, dot(hao,c)) + gmo = eriSpinMO(gao, c) + + #initialise the fock matrix, amplitudes, correlation and reference + #one-particle density matrix and energy, two-particle density matrix + fock = zeros((spinOrbitals, spinOrbitals)) + td = zeros((nOccupied, nOccupied, nVirtual, nVirtual)) + tpdmCor = zeros((spinOrbitals, spinOrbitals, spinOrbitals, spinOrbitals)) + preOMP = 0.0 + + # Build the reference one particle density matrix + opdmRef = zeros((spinOrbitals, spinOrbitals)) + for i in range(0, nOccupied): + opdmRef[i,i] = 1.0 + + # Initialize the rotation matrix parameter + rot = zeros((spinOrbitals, spinOrbitals)) + + for cycle in range(0, iterations): + + # Build the Fock matrix + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + fock[p,q] = hmo[p,q] + for i in range(0, nOccupied): + fock[p,q] += gmo[p,i,q,i] + + # Build off-diagonal Fock Matrix and orbital energies + fprime = zeros((spinOrbitals, spinOrbitals)) + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + if p != q: + fprime[p,q] = fock[p,q] + else: + eps[p] = fock[p,p] + + # Update t amplitudes + t = zeros_like(td) + for i in range(0, nOccupied): + for j in range(0, nOccupied): + for a in range(0, nVirtual): + for b in range(0, nVirtual): + t[i,j,a,b] = gmo[i,j,a+nOccupied,b+nOccupied] + for d in range(0, nVirtual): + t[i,j,a,b] += fprime[a+nOccupied,d+nOccupied] * td[i,j,d,b] - \ + fprime[b+nOccupied,d+nOccupied] * td[i,j,d,a] + for k in range(0, nOccupied): + t[i,j,a,b] += -fprime[k,i] * td[k,j,a,b] + fprime[k,j] * td[k,i,a,b] + t[i,j,a,b] /= (eps[i] + eps[j] - eps[a+nOccupied] - eps[b+nOccupied]) + td = t.copy() + + #build one particle density matrix + opdmCor = zeros((spinOrbitals, spinOrbitals)) + for i in range(0, nOccupied): + for j in range(0, nOccupied): + for a in range(0, nVirtual): + for b in range(0, nVirtual): + for d in range(0, nVirtual): + opdmCor[b+nOccupied, a+nOccupied] += 0.5 * td[j,i,d,a] * td[i,j,b,d] + for k in range(0, nOccupied): + opdmCor[j,i] -= 0.5 * td[k,j,b,a] * td[i,k,a,b] + opdm = opdmCor + opdmRef + + #build two particle density matrix + tpdm = zeros_like(tpdmCor) + tpdm1 = zeros_like(tpdmCor) + for i in range(0, nOccupied): + for j in range(0, nOccupied): + for a in range(0, nVirtual): + for b in range(0, nVirtual): + tpdmCor[a+nOccupied,b+nOccupied,i,j] = td[i,j,a,b] + tpdmCor[i,j,a+nOccupied,b+nOccupied] = td[j,i,b,a] + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + tpdm[r,s,p,q] += opdmCor[r,p] * opdmRef[s,q] + tpdm[s,r,q,p] = tpdm[r,s,p,q] + tpdm[s,r,p,q] = tpdm[r,s,q,p] = -tpdm[r,s,p,q] + + tpdm1[r,s,p,q] += opdmRef[r,p] * opdmRef[s,q] + tpdm1[s,r,p,q] = - tpdm1[r,s,p,q] + tpdm += tpdmCor + tpdm1 + + # Newton-Raphson step + generalFock = zeros_like(fock) + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + generalFock[p,q] += hmo[p,r] * opdm[r,q] + for s in range(0, spinOrbitals): + for t in range(0, spinOrbitals): + generalFock[p,q] += 0.5 * gmo[p,r,s,t] * tpdm[s,t,q,r] + + for i in range(0, nOccupied): + for a in range(0, nVirtual): + rot[a+nOccupied,i] = (generalFock - generalFock.T)[a+nOccupied, i]/(eps[i] - eps[a+nOccupied]) + + # Build Newton-Raphson orbital rotation matrix + U = la.expm(rot - rot.T) + + # Rotate spin-orbital coefficients + c = c.dot(U) + + # Transform one and two electron integrals using new C + hmo = dot(c.T, dot(hao,c)) + gmo = eriSpinMO(gao, c) + + # Compute the energy + omp = eNuclear + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + omp += hmo[p,q] * opdm[q,p] + for p in range(0, spinOrbitals): + for q in range(0, spinOrbitals): + for r in range(0, spinOrbitals): + for s in range(0, spinOrbitals): + omp += 0.25 * gmo[p,q,r,s] * tpdm[r,s,p,q] + + if (abs(omp - preOMP)) < tolerance: + break + + # Updating values + preOMP = omp + + postSCF([cycle, omp, omp-preOMP],'omp') + + return omp + +def eriMOpartition(eri, co, cv, nBasis, no, nv): + #split eri [:no,:nv,:,no,:nv] + #[no,:,:,:] + eriReduced = zeros((nBasis, nBasis, nBasis, nBasis)) + for p in range(0, nBasis): + for q in range(0, nBasis): + for r in range(0, nBasis): + for s in range(0, nBasis): + for i in range(0, no): + eriReduced[i,q,r,s] += co[p,i] * eri[p,q,r,s] + eriReduced = eriReduced[:no,:,:,:] + #[no,nv,:,:] + eriIntermediate = zeros((no, nBasis, nBasis, nBasis)) + for p in range(0, no): + for q in range(0, nBasis): + for r in range(0, nBasis): + for s in range(0, nBasis): + for a in range(0, nv): + eriIntermediate[p,a,r,s] += cv[q,a] * eriReduced[p,q,r,s] + eriReduced = eriIntermediate[:,:nv,:,:] + #[no,nv,no,:] + eriIntermediate = zeros((no, nv, nBasis, nBasis)) + for p in range(0, no): + for q in range(0, nv): + for r in range(0, nBasis): + for s in range(0, nBasis): + for j in range(0, no): + eriIntermediate[p,q,j,s] += co[r,j] * eriReduced[p,q,r,s] + eriReduced = eriIntermediate[:,:,:no,:] + #[no,nv,no,nv] + eriIntermediate = zeros((no, nv, no, nBasis)) + for p in range(0, no): + for q in range(0, nv): + for r in range(0, no): + for s in range(0, nBasis): + for b in range(0, nv): + eriIntermediate[p,q,r,b] += cv[s,b] * eriReduced[p,q,r,s] + eriReduced = eriIntermediate[:,:,:,:nv] + + return eriReduced + +def mp2LaplaceTransform(molBasis, c, ERI, eps, nOccupied, eSCF, meshSize=40): + #Laplace transform Moller-Plesset (2) - restricted reference implementation + + #metrics + nBasis = len(molBasis) + nVirtual = nBasis - nOccupied + + #slices of orbital eigens + epsOccupied = eps[:nOccupied] + epsVirtual = eps[nOccupied:] + cOccupied = c[:,:nOccupied] + cVirtual = c[:,nOccupied:] + + #sliced eri in MO basis + eriTensor = expandEri(ERI, nBasis) + eriMOslice = eriMOpartition(eriTensor, cOccupied, cVirtual, nBasis, nOccupied, nVirtual) + + #Gauss-Leguerre quadrature + mesh, weights = quadrature(meshSize) + #use exponential weights + weights *= exp(mesh) + #energies for mp2 parallel and anti-parallel spins + eMP = [0.0,0.0] + + #cycle over mesh + for cycle in range(0, meshSize): + + #compute amplitudes + ampOccupied = exp(mesh[cycle] * epsOccupied) + ampVirtual = exp(-mesh[cycle] * epsVirtual) + ampEri = zeros((nOccupied, nVirtual, nOccupied, nVirtual)) + for i in range(0, nOccupied): + for a in range(0, nVirtual): + for j in range(0, nOccupied): + for b in range(0, nVirtual): + ampEri[i,a,j,b] = ampOccupied[i] * ampVirtual[a] * ampOccupied[j] * ampVirtual[b] * eriMOslice[i,a,j,b] + + #mp2 energies + eMPcontraction = [0.0,0.0] + for i in range(0, nOccupied): + for a in range(0, nVirtual): + for j in range(0, nOccupied): + for b in range(0, nVirtual): + eMPcontraction[0] += ampEri[i,a,j,b] * eriMOslice[i,a,j,b] + eMPcontraction[1] += ampEri[i,a,j,b] * (eriMOslice[i,a,j,b] - eriMOslice[i,b,j,a]) + + for e in range(0, 2): + eMP[e] -= eMPcontraction[e] * weights[cycle] + + postSCF([eMP, eSCF], 'mplp') + + return eMP + +def mp2UnrelaxedDensity(c, e, eri, nbf, nOccupied): + #compute the mp2 level unrelaxed density matrix + + #transform to mo basis + eriMO = buildEriMO(c, eri) + g = expandEri(eriMO, nbf) + + #slices + o = slice(None, nOccupied) ; v = slice(nOccupied, None) ; n = newaxis + + #energy denominator + dd = 1.0/(e[o, n, n, n] + e[n, o, n, n] - e[n, n, v, n] - e[n, n, n, v]) + + #doubles amplitudes + t2 = -einsum('iajb,ijab->ijab', g[o,v,o,v], dd, optimize=True) + + #double Lagrange multipliers + l2 = -2.0 * einsum('iajb,ijab->ijab', 2.0*g[o,v,o,v] - g[o,v,o,v].swapaxes(3, 1), dd, optimize=True) + + oo = -einsum('kiab,kjab->ij', l2, t2, optimize=True) + vv = einsum('ijbc,ijac->ab', l2, t2, optimize=True) + + #enforce symmetry + oo = 0.5 * (oo + oo.T) + vv = 0.5 * (vv + vv.T) + + #HF and mp2 contributions + mp2Density = zeros((nbf, nbf)) + fill_diagonal(mp2Density[:nOccupied, :nOccupied], 2.0) + mp2Density[:nOccupied, :nOccupied] += oo + mp2Density[nOccupied:, nOccupied:] += vv + + return mp2Density + \ No newline at end of file diff --git a/source/ocypete.pyx b/source/ocypete.pyx new file mode 100644 index 0000000..80b7c98 --- /dev/null +++ b/source/ocypete.pyx @@ -0,0 +1,508 @@ +#cython: boundscheck=False, wraparound=False, nonecheck=False, initializedcheck=False, cdivision=True +from libc.math cimport exp, pow, tgamma, sqrt, abs +from scipy.special.cython_special cimport hyp1f1 + +import numpy as np +cimport numpy as np + +cdef double pi = 3.141592653589793238462643383279 + +#---------------------------------------Shared Routines -----------------------------------| + +cdef double cye(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0): + + cdef: + double p = ie + je + double q = ie*je / p + + if n == 0: + if (type < 0) or (type > (ia + ja)): + return 0.0 + elif (ia + ja + type) == 0: + return exp(-q*r*r) + elif ja == 0: + return (1/(2 * p)) * cye(ia-1,ja,type-1,r,ie,je) - (q*r/ie) * cye(ia-1,ja,type,r,ie,je) + \ + (type+1) * cye(ia-1,ja,type+1,r,ie,je) + else: + return (1/(2 * p)) * cye(ia,ja-1,type-1,r,ie,je) + (q*r/je) * cye(ia,ja-1,type,r,ie,je) + \ + (type+1) * cye(ia,ja-1,type+1,r,ie,je) + else: + return cye(ia+1,ja,type,r,ie,je,n-1,x) + x * cye(ia,ja,type,r,ie,je,n-1,x) + + +cdef double efx(int ia,int ja,int type, double r, double ie, double je, int n = 0, double x = 0.0, int p = 0, int s = 0): + if p == 1: + return 2.0 * ie * cye(ia+1, ja, type, r, ie, je, n, x) - ia * cye(ia-1, ja, type, r, ie, je, n, x) + elif s == 1: + return 2.0 * je * cye(ia, ja+1, type, r, ie, je, n, x) - ja * cye(ia, ja-1, type, r, ie, je, n, x) + +cdef double ovlpfx(int ia0, int ia1, int ia2, int ja0, int ja1, int ja2, double ie, double je, \ + double ir0, double ir1, double ir2, double jr0, double jr1, double jr2, int[3] n, double[3] origin, int x, int center): + + cdef: + int pa = 0 + int pb + double t = 0.0 + double r0, r1, r2 + + if center == 0: + pa = 1 + pb = (pa+1) % 2 + + r0 = ir0 - jr0 + r1 = ir1 - jr1 + r2 = ir2 - jr2 + + if x == 0: + t = efx(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0],pa ,pb ) + t *= cye(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1]) + t *= cye(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2]) + elif x == 1: + t = cye(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0]) + t *= efx(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1],pa ,pb ) + t *= cye(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2]) + elif x == 2: + t = cye(ia0, ja0 , 0, r0, ie, je, n[0], ir0 - origin[0]) + t *= cye(ia1, ja1 , 0, r1, ie, je, n[1], ir1 - origin[1]) + t *= efx(ia2, ja2 , 0, r2, ie, je, n[2], ir2 - origin[2],pa ,pb ) + + return t * pow(pi/(ie+je), 1.5) + +cdef double kntcfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + int[3] n, double[3] origin, int x, int center): + + #cases for center 'a' and center 'b' + cdef: + int pa = 0 + int pb, i + double[3] t + double[3] mu, nu, vu + + if center == 0: + pa = 1 + pb = (pa+1) % 2 + + for i in range(0, 3): + mu[i] = (2*ja[i] + 1) * je + nu[i] = -2*pow(je,2) + vu[i] = -0.5 * ja[i]* (ja[i]-1) + t[i] = 0.0 + + for i in range(0, 3): + + if i == x: + t[x] = mu[x] * efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \ + nu[x] * efx(ia[x], ja[x] + 2 , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + \ + vu[x] * efx(ia[x], ja[x] - 2, 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + + else: + t[i] = mu[i] * cye(ia[i], ja[i] , 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \ + nu[i] * cye(ia[i], ja[i] + 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + \ + vu[i] * cye(ia[i], ja[i] - 2, 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + + for i in range(0, 3): + + if i == x: + t[(x+1) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + t[(x+2) % 3] *= efx(ia[x], ja[x] , 0, ir[x] - jr[x], ie, je, n[x], ir[x] - origin[x],pa ,pb ) + else: + t[(i+1) % 3] *= cye(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + t[(i+2) % 3] *= cye(ia[i], ja[i], 0, ir[i] - jr[i], ie, je, n[i], ir[i] - origin[i]) + + return (t[0] + t[1] + t[2]) * pow(pi/(ie+je), 1.5) + +cdef double boys(double m,double T): + return hyp1f1(m+0.5,m+1.5,-T)/(2.0*m+1.0) + +cdef double clmb(int l, int m, int n, int bf, double p, double r0, double r1, double r2): + + cdef double t, s, nm + nm = sqrt(r0*r0 + r1*r1 + r2*r2) + t = p * nm * nm + + s = 0.0 + if (l+m+n) == 0: + s += pow(-2*p, bf) * boys(bf, t) + elif (l+m) == 0: + if n > 1: + s +=(n-1) * clmb(l,m,n-2,bf+1,p,r0,r1,r2) + s += r2 * clmb(l,m,n-1,bf+1,p,r0,r1,r2) + elif l == 0: + if m > 1: + s +=(m-1) * clmb(l,m-2,n,bf+1,p,r0,r1,r2) + s += r1 * clmb(l,m-1,n,bf+1,p,r0,r1,r2) + else: + if l > 1: + s +=(l-1) * clmb(l-2,m,n,bf+1,p,r0,r1,r2) + s += r0 * clmb(l-1,m,n,bf+1,p,r0,r1,r2) + + return s + +cdef double clmbsfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + double[:] nucleus, int[3] n, double[3] origin, int x, int center): + #generalised coulomb derivatives dV(ab^(0,0,0))/dx terms + + cdef: + double p = ie + je + double[3] q, r + int i, mu, nu, vu, pa, pb + int tau[3] + double sum, val + int[3] xi + + for i in range(0, 3): + q[i] = (ie*ir[i] + je*jr[i])/p + tau[i] = ia[i] + ja[i] + n[i] + 1 + r[i] = q[i] - nucleus[i] + + tau[x] += 1 + + pa = 0 + if center == 0: + pa = 1 + pb = (pa+1) % 2 + + sum = 0.0 + val = 1.0 + + for mu in range(0, tau[0]): + for nu in range(0, tau[1]): + for vu in range(0, tau[2]): + val = 1.0 + xi = [mu,nu,vu] + for i in range(0, 3): + if i == x: + val *= efx(ia[x], ja[x], xi[x], ir[x]-jr[x], ie, je, n[x], ir[x]-nucleus[x], pa, pb) + else: + val *= cye(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i]) + + sum += val * clmb(mu,nu,vu, 0, p, r[0], r[1], r[2] ) + + return sum * 2 * pi/p + +cdef double clmbhfx(int[3] ia, int[3] ja, double ie, double je, double[3] ir, double[3] jr, \ + double[:] nucleus, int[3] n, double[3] origin, int x): + #generalised coulomb derivatives dV(ab^(0,0,0))/dx terms + + cdef: + double p = ie + je + double[3] q, r + int i, mu, nu, vu, pa, pb + int[3] tau + double sum, val + int[3] xi + + for i in range(0, 3): + q[i] = (ie*ir[i] + je*jr[i])/p + tau[i] = ia[i] + ja[i] + n[i] + 1 + r[i] = q[i] - nucleus[i] + + sum = 0.0 + val = 1.0 + + for mu in range(0, tau[0]): + for nu in range(0, tau[1]): + for vu in range(0, tau[2]): + val = 1.0 + xi = [mu,nu,vu] + for i in range(0, 3): + val *= cye(ia[i], ja[i], xi[i], ir[i]-jr[i], ie, je, n[i], ir[i]-nucleus[i]) + + xi[x] += 1 + + sum -= val * clmb(xi[0],xi[1],xi[2], 0, p, r[0], r[1], r[2] ) + + return sum * 2 * pi/p + +cdef double teifx(short[:] ia, short[:] ja, short[:] ka, short[:] la, double ie, double je, double ke, double le, \ + double[:] ir, double[:] jr, double[:] kr, double[:] lr, int[3] ra, int[3] rb, double[3] origin, int x, int center): + + cdef: + double p = ie + je + double q = ke + le + double rho = p*q/(p + q) + double[3] P, Q, r + int i, pa, pb, mu, nu, vu, psi, phi, chi + int[3] xia, xib, tau, sigma + double val = 0.0 + double term + + for i in range(0, 3): + P[i] = (ie*ir[i] + je*jr[i])/p + Q[i] = (ke*kr[i] + le*lr[i])/q + r[i] = P[i] - Q[i] + + tau[i] = ia[i] + ja[i] + 1 + ra[i] + sigma[i] = ka[i] + la[i] + 1 + rb[i] + + if (center == 0) or (center == 1): + tau[x] += 1 + else: + sigma[x] += 1 + + pa = 0 + if (center == 0) or (center == 2): + pa = 1 + pb = (pa+1) % 2 + + for mu in range(tau[0]): + for nu in range(tau[1]): + for vu in range(tau[2]): + for psi in range(sigma[0]): + for phi in range(sigma[1]): + for chi in range(sigma[2]): + xia = [mu, nu, vu] + xib = [psi, phi, chi] + term = 1.0 + for i in range(0, 3): + if (i == x): + if (center == 0 or center == 1): + term *= efx(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x], pa, pb) + term *= cye(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x]) + elif (center == 2 or center == 3): + term *= cye(ia[x],ja[x],xia[x],ir[x]-jr[x],ie,je,ra[x],ir[x] - origin[x]) + term *= efx(ka[x],la[x],xib[x],kr[x]-lr[x],ke,le,rb[x],kr[x] - origin[x], pa, pb) + + else: + term *= cye(ia[i],ja[i],xia[i],ir[i]-jr[i],ie,je,ra[i],ir[i] - origin[i]) + term *= cye(ka[i],la[i],xib[i],kr[i]-lr[i],ke,le,rb[i],kr[i] - origin[i]) + + term *= pow(-1, (psi+phi+chi)) * clmb(mu+psi,nu+phi,vu+chi,0, rho,r[0], r[1], r[2]) + val += term + + return val*2*pow(pi,2.5)/(p*q*sqrt(p+q)) + + +cdef double erifx(short[:] ng, int p, int q, int r, int s, double[:,:] im, double[:,:] ic, double[:,:] ie, short[:,:] ia, double[:,:] io, \ + int x, int center): + + cdef: + double sum = 0.0 + int i, j, k, l + + for i in range(0, ng[p]): + for j in range(0, ng[q]): + for k in range(0, ng[r]): + for l in range(0, ng[s]): + sum += im[p,i]*im[q,j]*im[r,k]*im[s,l] * ic[p,i]*ic[q,j]*ic[r,k]*ic[s,l] * \ + teifx(ia[p], ia[q], ia[r], ia[s], ie[p,i], ie[q,j], ie[r,k], ie[s,l], \ + io[p], io[q], io[r], io[s], [0,0,0], [0,0,0], [0,0,0], x, center) + + return sum + +#-----------------------------------End Shared Routines -----------------------------------| + + +cpdef ocypete(object molAtom,object molBasis, double[:,:] density, double[:,:] fock): + + cdef: + int na = len(molAtom) + int nb = len(molBasis) + int ng = len(molBasis[0].co) + int i, j, k, l, m, n, p, q, r, s + +#get largest primative length + for i in range(nb): + j = len(molBasis[i].co) + if j > ng: + ng = j + + #convert atom class properties to c views + mx = np.empty([na,3], dtype = np.double) + mz = np.empty([na], dtype = np.short) + cdef: + double[:,:] alo_x = mx + short[:] alo_z = mz + for p in range(0, na): + for q in range(0, 3): + alo_x[p,q] = molAtom[p].center[q] + alo_z[p] = molAtom[p].number + + #convert basis class properties to c-variables + me = np.empty([nb,ng], dtype = np.double) + mc = np.empty([nb,ng], dtype = np.double) + mn = np.empty([nb,ng], dtype = np.double) + ma = np.empty([nb,3], dtype = np.short) + mo = np.empty([nb,3], dtype = np.double) + ml = np.empty([nb], dtype = np.short) + mp = np.empty([nb], dtype = np.short) + + cdef: + double[:,:] alo_e = me + double[:,:] alo_c = mc + double[:,:] alo_n = mn + short[:,:] alo_a = ma + double[:,:] alo_o = mo + short[:] alo = ml + short[:] ala = mp + + for p in range(0, nb): + alo[p] = len(molBasis[p].co) + ala[p] = molBasis[p].atom + for q in range(0, len(molBasis[p].co)): + alo_e[p,q] = molBasis[p].ex[q] + alo_c[p,q] = molBasis[p].co[q] + alo_n[p,q] = molBasis[p].normal[q] + for q in range(0, 3): + alo_a[p,q] = molBasis[p].momentum[q] + alo_o[p,q] = molBasis[p].center[q] + + #matrix definitions + cdef: + double ss, sk, sj, sh, si, sf, f, ra, rb, force + int cart + Sx = np.zeros([nb,nb], dtype = np.double) + Ix = np.zeros([nb,nb,nb,nb], dtype = np.double) + Hx = np.zeros([nb,nb], dtype = np.double) + Fx = np.zeros([nb,nb], dtype = np.double) + Wx = np.zeros([nb,nb], dtype = np.double) + Ex = np.zeros([nb,nb], dtype = np.double) + + Vx = np.zeros([na,3], dtype = np.double) + cdef: + double[:,:] overlapfx = Sx + double[:,:,:,:] teifx = Ix + double[:,:] oeifx = Hx + double[:,:] fockfx= Fx + double[:,:] weightedEnergy = Wx + double[:,:] energy = Ex + double[:,:] vires = Vx + + #----------------------------------------Begin derivatives ------------------------------------| + + #---------------------------------------Begin one electron-------------------------------------| + #don't need overlapfx for fock but included anyway for completeness + for atom in range(0, na): + for cart in range(0, 3): + + for p in range(0, nb): + for q in range(0, p+1): + + ss = 0.0 + sk = 0.0 + sj = 0.0 + sh = 0.0 + for i in range(0, alo[p]): + for j in range(0, alo[q]): + + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + if ala[p] == atom: + ss += ovlpfx(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2], \ + alo_e[p,i], alo_e[q,j], alo_o[p,0], alo_o[p,1], alo_o[p,2], alo_o[q,0], alo_o[q,1], alo_o[q,2], \ + [0,0,0], [0,0,0], cart, 0 ) * f + + sk += kntcfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + [0,0,0], [0,0,0], cart, 0 ) * f + + if ala[q] == atom: + ss += ovlpfx(alo_a[p,0], alo_a[p,1], alo_a[p,2], alo_a[q,0], alo_a[q,1], alo_a[q,2], \ + alo_e[p,i], alo_e[q,j], alo_o[p,0], alo_o[p,1], alo_o[p,2], alo_o[q,0], alo_o[q,1], alo_o[q,2], \ + [0,0,0], [0,0,0], cart, 1 ) * f + + sk += kntcfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + [0,0,0], [0,0,0], cart, 1 ) * f + + sh -= clmbhfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + alo_x[atom], [0,0,0], [0,0,0], cart ) * f * alo_z[atom] + + for r in range(0, na): + for i in range(0, alo[p]): + for j in range(0, alo[q]): + f = alo_n[p,i] * alo_n[q,j] * alo_c[p,i] * alo_c[q,j] + if ala[p] == atom: + sj -= clmbsfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + alo_x[r], [0,0,0], [0,0,0], cart, 0 ) * f * alo_z[r] + + if ala[q] == atom: + sj -= clmbsfx([alo_a[p,0], alo_a[p,1], alo_a[p,2]], [alo_a[q,0], alo_a[q,1], alo_a[q,2]], \ + alo_e[p,i], alo_e[q,j], [alo_o[p,0], alo_o[p,1], alo_o[p,2]], [alo_o[q,0], alo_o[q,1], alo_o[q,2]], \ + alo_x[r], [0,0,0], [0,0,0], cart, 1 ) * f * alo_z[r] + + + oeifx[p,q] = oeifx[q,p] = sk + sj + sh + overlapfx[p,q] = overlapfx[q,p] = ss + + #----------------------------------------End one electron--------------------------------------| + + #---------------------------------------Begin two electron-------------------------------------| + + for p in range(0, nb): + for q in range(0, p+1): + + si = 0.0 + + i = p*(p+1)//2 + q + for r in range(0, nb): + for s in range(0, r+1): + + j = r*(r+1)//2 + s + + if i >= j: + si = 0.0 + if ala[p] == atom: + si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 0) + if ala[q] == atom: + si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 1) + if ala[r] == atom: + si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 2) + if ala[s] == atom: + si += erifx(alo , p ,q ,r ,s ,alo_n ,alo_c ,alo_e ,alo_a , alo_o, cart, 3) + + teifx[p,q,r,s] = teifx[p,q,s,r] = teifx[q,p,s,r] = teifx[q,p,r,s] = \ + teifx[r,s,p,q] = teifx[r,s,q,p] = teifx[s,r,q,p] = teifx[s,r,p,q] = si + + #----------------------------------------End two electron--------------------------------------| + + #-------------------------------------------build Fock-----------------------------------------| + + for p in range(0, nb): + for q in range(0, nb): + sf = 0.0 + for r in range(0, nb): + for s in range(0, nb): + sf += (2.0 * teifx[p,q,r,s] - teifx[p,s,q,r]) * density[s,r] + + fockfx[p,q] = oeifx[p,q] + sf + + #|----------------------------------------build energy-----------------------------------------| + + force = 0.0 + for p in range(0, nb): + for q in range(0, nb): + force -= density[p,q] * (fockfx[q,p] + oeifx[q,p]) + + #|-----------------------------------density weighted energy-----------------------------------| + for p in range(0, nb): + for q in range(0, nb): + energy[p,q] = 0.0 + for r in range(0, nb): + energy[p,q] += fock[p,r] * density[r,q] + for p in range(0, nb): + for q in range(0, nb): + weightedEnergy[p,q] = 0.0 + for r in range(0, nb): + weightedEnergy[p,q] += density[p,r] * energy[r,q] + + #|-------------------------------------overlap contribution------------------------------------| + + for p in range(0, nb): + for q in range(0, nb): + force += 2.0 * overlapfx[p,q] * weightedEnergy[q,p] + + #|---------------------------------------nuclear repulsion-------------------------------------| + + for i in range(0, na): + ra = sqrt((alo_x[atom,0] - alo_x[i,0])*(alo_x[atom,0] - alo_x[i,0]) + (alo_x[atom,1] - alo_x[i,1])*(alo_x[atom,1] - alo_x[i,1]) + \ + (alo_x[atom,2] - alo_x[i,2])*(alo_x[atom,2] - alo_x[i,2])) + rb = alo_x[atom,cart] - alo_x[i,cart] + if ra != 0: + force += rb * alo_z[i] * alo_z[atom]/(ra*ra*ra) + #|------------------------------------------final forces---------------------------------------| + if abs(force) > 1e-12: + vires[atom,cart] = force + + return Vx diff --git a/source/post.py b/source/post.py new file mode 100644 index 0000000..50cd273 --- /dev/null +++ b/source/post.py @@ -0,0 +1,504 @@ +from __future__ import division +from scipy.linalg import fractional_matrix_power as fractPow +from numpy.linalg import solve, eigvals, norm +from numpy import zeros, dot, trace, eye, mean, asarray, sqrt, zeros_like, round, einsum, argsort +from view import postSCF +from mp import mp2UnrelaxedDensity +from atom import gaugeCenter, getConstant +from integral import mu, buildEriMO, q, electricField, iEri, expandEri + +def charges(D, S, atoms, bases): + #currently Mulliken -m , Lowdin - l + + #Mulliken charges + mulliken(D, S, atoms, bases) + + #Lowdin charges + lowdin(D, S, atoms, bases) + +def mulliken(D, S, atoms, bases): + #compute a mulliken population analysis + n = D.shape[0] + orbitalPopulation = zeros(n) + + #orbital populations + for i in range(0, n): + for j in range(0, n): + orbitalPopulation[i] += 2.0 * D[i,j] * S[i,j] + + #gross atomic population - orbital reduced to atoms + m = len(atoms) + grossAtomicPopulation = zeros(m) + for i in range(0, n): + grossAtomicPopulation[bases[i].atom] += orbitalPopulation[i] + + #write results to output file + postSCF([orbitalPopulation, bases, grossAtomicPopulation, atoms], 'mulliken') + + return grossAtomicPopulation + +def lowdin(D, S, atoms, bases): + #compute the lowdin population analysis + n = D.shape[0] + m = len(atoms) + grossAtomicPopulation = zeros(m) + + U = fractPow(S, 0.5) + + #gross atomic population - orbital reduced to atoms + for i in range(0, n): + grossAtomicPopulation[bases[i].atom] += 2.0 * dot(dot(U, D) ,U)[i,i] + + + #write results to output file + postSCF([grossAtomicPopulation, atoms], 'lowdin') + + return grossAtomicPopulation + +def bondOrder(D, S, atoms, basis): + #compute Mayer bond orders + + beta_density = alpha_density = D + alpha_mayer = dot(alpha_density, S) ; beta_mayer = dot(beta_density, S) + + nBasis = D.shape[0] + nAtoms = len(atoms) + + bond_orders = zeros((nAtoms, nAtoms)) + valence = zeros(nAtoms) + + for mu in range(nBasis): + for nu in range(mu): + + atom_mu = basis[mu].atom + atom_nu = basis[nu].atom + + if atom_mu == atom_nu: continue + + alpha = alpha_mayer[mu,nu] * alpha_mayer[nu,mu] + beta = beta_mayer[mu,nu] * beta_mayer[nu,mu] + + bond_orders[atom_mu, atom_nu] += 2 * (alpha + beta) + bond_orders[atom_nu, atom_mu] += 2 * (alpha + beta) + + for i in range(nAtoms): + for j in range(nAtoms): + + valence[i] += bond_orders[i,j] + + postSCF([atoms, round(bond_orders,4), round(valence,2)],'bonds') + + +def energyPartition(E, N, D, T, V, G, e, en): + #energy partitioning + partition = {'e' : [E, 'electronic', 't+v + g'], 'n' : [N, 'nuclear', 'n'], 'k' : [0.0, 'kinetic', 't'], 'j' : [0.0, 'coulomb', 'v'], \ + '1' : [0.0, 'one electron', 't+v'], '2' : [0.0, 'two electron', 'g'] ,'t' : [0.0, 'total', 't+v + 2g + n'] , \ + 'p' : [0.0, ' total potential', 'v + g + n'], 'tk' : [0.0, ' total kinetic', 't'], 'v' : [0.0, 'viral ratio', '(v+g+n)/t'], \ + 'b' : [0.0, 'bare hamiltonian', 't+v'] , 'e~' : [0.0, 'orbital', '2ε']} + n = D.shape[0] + + k = v = g = 0 + for i in range(0, n): + for j in range(0, n): + d = 2*D[i,j] + k += d*T[i,j] + v += d*V[i,j] + g += d*G[i,j] + + partition['k'][0] = k + partition['j'][0] = v + partition['1'][0] = v+k + partition['2'][0] = g*0.5 + partition['t'][0] = k + v + g*0.5 + partition['n'][0] + partition['p'][0] = v + g*0.5 + partition['n'][0] + partition['tk'][0] = k + partition['v'][0] = partition['p'][0] / k + partition['b'][0] = k+v + #orbital energies doubly occupied + sum = 0.0 + for i in range(0, int(en/2)): + sum += e[i] + partition['e~'][0] = 2*sum + + postSCF(partition, 'energy') + +def dipoleComponent(atoms, bases, type, gauge): + #compute dipole matrices + n = len(bases) + dipole = zeros((n,n)) + + gaugeOrigin = gaugeCenter(atoms, gauge) + + for i in range(0, n): + for j in range(i, -1, -1): + dipole[i,j] = mu(bases[i], bases[j], gaugeOrigin, type) + if i != j: + dipole[j,i] = dipole[i,j] + + return dipole + + +def buildDipole(atoms, bases, density, gauge, engine = 'aello'): + #compute the components of the dipole moment + + dipoles = zeros(4) + + if engine == 'aello': + import aello + dipoles[:3] = aello.aello(atoms, bases, 'dipole', density, gauge) + + dipoles[3] = dipoles[0]*dipoles[0] + dipoles[1]*dipoles[1] + dipoles[2]*dipoles[2] + + elif engine == 'native': + gaugeOrigin = gaugeCenter(atoms, gauge) + cartesians = ('x', 'y', 'z') + + for dim in range(0, 3): + for i in range(0, len(atoms)): + #nuclear and gauge displacement + dipoles[dim] += atoms[i].number * (atoms[i].center[dim] - gaugeOrigin[dim]) + + #electronic + dipoles[dim] += -2.0 * trace(dot(density, dipoleComponent(atoms, bases, cartesians[dim], gauge))) + dipoles[3] += dipoles[dim]*dipoles[dim] + + #dipoles has [0,1,2] = electron dipole, [3]=square of resultant + postSCF(dipoles, 'dipole') + + return dipoles + +def buildMp2Dipole(atoms, bases, gauge, c, e, eri, nOccupied): + #compute the mp2 level dipole from the unrelaxed mp2 density matrix + + #get electric and nuclear dipole components + hfDipoleElectric = asarray([dipoleComponent(atoms, bases, type ,gauge) for type in ['x','y','z']]) + charges = [a.number for a in atoms] + centers = [a.center for a in atoms] + hfDipoleNuclear = einsum('i,ix->x', charges, centers, optimize=True) + + #ao to mo basis + mu_mo = einsum('rp,xrs,sq->xpq', c, hfDipoleElectric, c, optimize=True) + + #get unrelaxed mp2 density + nbf = len(bases) + mp2Density = mp2UnrelaxedDensity(c, e, eri, nbf, nOccupied) + + mp2DipoleElectric = einsum('xij,ij->x', mu_mo, mp2Density, optimize=True) + mp2Dipole = list(hfDipoleNuclear - mp2DipoleElectric) + + mp2Dipole.append(norm(mp2Dipole)**2) + + postSCF(mp2Dipole, 'mp2-dipole') + + return mp2Dipole + +def quadrupoleComponent(atoms, bases, direction, gauge): + #compute quadrupole matrices + n = len(bases) + qupole = zeros((n,n)) + + gaugeOrigin = gaugeCenter(atoms, gauge) + for i in range(0, n): + for j in range(i, -1, -1): + qupole[i,j] = -q(bases[i], bases[j], gaugeOrigin, direction) + if i != j: + qupole[j,i] = qupole[i,j] + + return qupole + +def buildQuadrupole(atoms, bases, density, gauge): + #build the quadrupole + + + quadrupoleMoments = zeros(14) + cartesians = {0 : ['xx',0,0], 1 : ['yy',1,1], 2 : ['zz',2,2], 3 : ['xy',0,1], 4 : ['yz',1,2], 5 : ['zx',2,0]} + + for axis in range(len(cartesians)): + + #nuclear + for atom in range(len(atoms)): + quadrupoleMoments[axis] += atoms[atom].center[cartesians[axis][1]]*atoms[atom].center[cartesians[axis][2]]*atoms[atom].number + + quadrupoleMoments[axis] += 2.0 * trace(dot(density, quadrupoleComponent(atoms, bases, cartesians[axis][0], gauge))) + + #quadrupoles has [xx,yy,zz,xy,yz,zx] + quadrupoleMoments = quadrupoleMoments * getConstant('bohr->angstrom') * getConstant('au->debye') + + #traceless + traceless = (quadrupoleMoments[0]+quadrupoleMoments[1]+quadrupoleMoments[2])/3.0 + for i in range(3): + quadrupoleMoments[6+i] = quadrupoleMoments[i] - traceless + + #eigenvalues -construct traceless tensor + quad = zeros((3,3)) + quad[0,1] = quadrupoleMoments[3] + quad[0,2] = quadrupoleMoments[5] + quad[1,2] = quadrupoleMoments[4] + quad = quad + quad.T + for i in range(3): + quad[i,i] = quadrupoleMoments[i+6] + + q = eigvals(quad) + q = q[argsort(q)][::-1] + + for i in range(3): + quadrupoleMoments[9+i] = q[i] + + #amplitude and asymmetry + quadrupoleMoments[12] = sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]) + quadrupoleMoments[13] = (q[1]-q[2])/q[0] + + #[0-5 are quadrupole, 6-8 traceless diagonals, 9-11 eigenvalues of traceless, 12 amplitude, 13 asymmetry] + postSCF(quadrupoleMoments, 'quad') + + return quadrupoleMoments + + +def polarizabilities(atoms, bases, c, f, ERI, nOccupied, gauge): + + nBasis = c.shape[0] + nVirtual = nBasis - nOccupied + nRotation = nOccupied * nVirtual + + #fock to molecular basis + f = dot(c.T, f).dot(c) + + #2-electron repulsion integrals to molecular basis tensor + eri = buildEriMO(c, ERI) + eriMO = expandEri(eri, nBasis) + + unit = eye(nBasis) + #construct orbital rotation matrices + alpha = zeros((nBasis, nBasis, nBasis, nBasis)) + for i in range(0, nBasis): + for j in range(0, nBasis): + for a in range(0, nBasis): + for b in range(0, nBasis): + alpha[i,a,j,b] += unit[i,j] * f[a,b] - unit[a,b] * f[i,j] \ + + 2.0 * eriMO[a,i,j,b] - eriMO[j,i,a,b] + + beta = zeros((nBasis, nBasis, nBasis, nBasis)) + for i in range(0, nBasis): + for j in range(0, nBasis): + for a in range(0, nBasis): + for b in range(0, nBasis): + beta[i,a,j,b] += 2.0 * eriMO[a,i,j,b] - eriMO[a,j,b,i] + + #electronic Hessian + hessian = alpha + beta + + #transform Hessian to square form + h = zeros((nRotation, nRotation)) + for i in range(0, nOccupied): + for a in range(nOccupied, nBasis): + for j in range(0, nOccupied): + for b in range(nOccupied, nBasis): + h[i*(nVirtual)+(a-nOccupied),j*(nVirtual)+(b-nOccupied)] = hessian[i,a,j,b] + + #get dipole tensors + dipoleTensor = [] + cartesianDict = {0:'x', 1:'y', 2:'z'} + for direction in range(0, 3): + dipoleTensor.append(-2.0 * dipoleComponent(atoms, bases, cartesianDict[direction], gauge)) + + #responses + responseTensor = [] + for p in range(0, len(dipoleTensor)): + dipoleTensor[p] = dot(c.T, dipoleTensor[p]).dot(c) + i = 0 + ravelTensor= zeros(nOccupied*nVirtual) + for r in range(0, nOccupied): + for s in range(0, nVirtual): + ravelTensor[i] = dipoleTensor[p][r,s+nOccupied] + i += 1 + responseTensor.append(ravelTensor) + + responses = [] + for perturbation in responseTensor: + responses.append(solve(h, -perturbation)) + + #polarizabilities + polarizabilities = zeros((3, 3)) + for i in range(3): + for j in range(3): + polarizabilities[i, j] = -dot(responseTensor[i], responses[j]) + + principalComponents = eigvals(polarizabilities) + isotropicPolarizability = mean(principalComponents) + + postSCF([principalComponents, isotropicPolarizability], 'po') + + return principalComponents, isotropicPolarizability, asarray(responses), asarray(dipoleTensor)*0.5 + +def electricFieldNuclear(atoms, gauge): + #compute the nuclear contribution to electric field + + gaugeOrigin = gaugeCenter(atoms, gauge) + n = len(atoms) + + coordinates = zeros((n,3)) + field = zeros(4) + + for atom in range(n): + for axis in range(3): + coordinates[atom, axis] = atoms[atom].center[axis] - gaugeOrigin[axis] + + r2 = coordinates[atom,0]*coordinates[atom,0] + coordinates[atom,1]*coordinates[atom,1] + \ + coordinates[atom,2]*coordinates[atom,2] + r = sqrt(r2) + + if r < 1e-10: continue + + #field + field[0] += atoms[atom].number * coordinates[atom,0] / (r2 * r) + field[1] += atoms[atom].number * coordinates[atom,1] / (r2 * r) + field[2] += atoms[atom].number * coordinates[atom,2] / (r2 * r) + #potential + field[3] += atoms[atom].number / r + + return field + +def buildElectricField(atoms, bases, density, gauge): + #compute expectation values for electric field components and electric potential + + electrics = zeros(8) + + cartesians = ('x', 'y', 'z', 'p') + for dim in range(0, 4): + + electrics[dim] = 2.0 * trace(dot(density, electricField(atoms, bases, cartesians[dim], gauge))) + + #get nuclear contributions + electrics[4:] = electricFieldNuclear(atoms, gauge) + + return electrics + +def hyperPolarizabilities(atoms, bases, c, eri, e, f, nOccupied, gauge): + + #get responses and dipole tensors + _, _, responses , dipoles_mo = polarizabilities(atoms, bases, c, f, eri, nOccupied, gauge) + + #number of components + nComponents = responses.shape[0] + + nOrbitals = c.shape[0] + nVirtual = nOrbitals - nOccupied + + #reshape responses (3, vo) -> (3,o+v,o+v) compatible with dipoles + u = zeros_like(dipoles_mo) + uv = zeros((nComponents, nOccupied, nVirtual)) + for comp in range(nComponents): + k = 0 + for p in range(nOccupied): + for q in range(nVirtual): + u[comp, p, nOccupied+q] = 0.5 * responses[comp, k] + uv[comp, p, q] = responses[comp, k] + u[comp, q + nOccupied, p] = -0.5 * responses[comp, k] + k += 1 + + #get occupied and virtual c matrices + co = zeros((nOrbitals, nOccupied)) + co = c[:, :nOccupied] + cv = zeros((nOrbitals, nVirtual)) + cv = c[:,nOccupied:] + + #define matrices needed for fock build + r = zeros((nOrbitals, nOccupied)) + V = zeros_like(c) + T = zeros_like(c) + G = zeros_like(u) + + for comp in range(nComponents): + + #build right density component from responses + r = dot(uv[comp], cv.T).T + #build density + d = dot(co, r.T) + + #build new V and T with response density + for i in range(0, nOrbitals): + for m in range(0, nOrbitals): + V[i,m] = 0.0 + T[i,m] = 0.0 + for k in range(0, nOrbitals): + for l in range(0, nOrbitals): + V[i,m] += 0.5 * d[k,l] * eri[iEri(i,m,k,l)] + T[i,m] += 0.5 * d[k,l] * eri[iEri(i,k,m,l)] + + #build response Fock + F = (c.T).dot(4 * V - T.T - T).dot(c) + + #add dipole field + G[comp,...] = F + dipoles_mo[comp] + + #epsilon + epsilon = G.copy() + + #static case + omega = 0.0 + + #left multiply by orbital energies + eUl = zeros((nOrbitals, nOrbitals)) + eUr = zeros((nOrbitals, nOrbitals)) + for comp in range(nComponents): + for p in range(nOrbitals): + for q in range(nOrbitals): + eUl[p,q] = (e[p] + omega) * u[comp,p,q] + #right multiply by orbital energies + for p in range(nOrbitals): + for q in range(nOrbitals): + eUr[p,q] = u[comp,p,q] * e[q] + + epsilon[comp, :,:] += (eUl - eUr) + + #use Kleinman symmetry to reduce calculations + syma = [0,1,2,0,0,1] + symb = [0,1,2,1,2,2] + + #define tensor for final results + hyperpolarizability = zeros((6, 3)) + + ''' + hyperpolarizability tensor is + [xxx xxy xxz] + [yyx yyy yyz] + [zzx zzy zzz] + [xyx xyy xyz] + [xzx xzy xzz] + [yzx yzy yzz] + ''' + for r in range(6): + b = syma[r] + c = symb[r] + for a in range(3): + + traceLeft = 2.0 * trace(dot(u[a,:,:], dot(G[b,:,:], u[c,:,:]))[:nOccupied, :nOccupied]) + \ + 2.0 * trace(dot(u[a,:,:], dot(G[c,:,:], u[b,:,:]))[:nOccupied, :nOccupied]) + \ + 2.0 * trace(dot(u[c,:,:], dot(G[a,:,:], u[b,:,:]))[:nOccupied, :nOccupied]) + + traceRight = trace(dot(u[c,:,:], dot(u[b,:,:], epsilon[a,:,:]))[:nOccupied, :nOccupied]) + \ + trace(dot(u[b,:,:], dot(u[c,:,:], epsilon[a,:,:]))[:nOccupied, :nOccupied]) + \ + trace(dot(u[c,:,:], dot(u[a,:,:], epsilon[b,:,:]))[:nOccupied, :nOccupied]) + \ + trace(dot(u[a,:,:], dot(u[c,:,:], epsilon[b,:,:]))[:nOccupied, :nOccupied]) + \ + trace(dot(u[b,:,:], dot(u[a,:,:], epsilon[c,:,:]))[:nOccupied, :nOccupied]) + \ + trace(dot(u[a,:,:], dot(u[b,:,:], epsilon[c,:,:]))[:nOccupied, :nOccupied]) + + hyperpolarizability[r, a] = -2.0 * (traceLeft - traceRight) + + #calculate defined propeties + beta = zeros(3) + #beta[i] = ixx+iyy+izz + beta[0] = (hyperpolarizability[0,0]+hyperpolarizability[1,0]+hyperpolarizability[2,0]) + beta[1] = (hyperpolarizability[0,1]+hyperpolarizability[1,1]+hyperpolarizability[2,1]) + beta[2] = (hyperpolarizability[1,2]+hyperpolarizability[1,2]+hyperpolarizability[2,2]) + + #magnitude + amplitude = sqrt(beta[0]*beta[0] + beta[1]*beta[1] + beta[2]*beta[2]) + + #parallel and perpendicular components wrt z axis + parallel = 0.2 * beta[2] + perpendicular = 0.6 * beta[2] + + postSCF([beta, amplitude, parallel, perpendicular], 'hyper') + + return [beta, amplitude, parallel, perpendicular], hyperpolarizability diff --git a/source/project.hpf b/source/project.hpf new file mode 100644 index 0000000..e9a8dd7 --- /dev/null +++ b/source/project.hpf @@ -0,0 +1,173 @@ +name=h2o +matrix=c +basis=dz +diis=on +post={} +cogus={} +#Crawford geometry + +O1 8 0.000000000000 -0.143225816552 0.000000000000 +H1 1 1.638036840407 1.136548822547 0.000000000000 +H2 1 -1.638036840407 1.136548822547 0.000000000000 + +end +#---------------------------------------------- +name=moxy +matrix=c +basis=sto-3g +post={} +units=angstrom +#Psi4 +C1 6 0.152133 -0.035800 0.485797 +C2 6 -1.039475 0.615938 -0.061249 +C3 6 1.507144 0.097806 -0.148460 +O1 8 -0.828215 -0.788248 -0.239431 +H1 1 0.153725 -0.249258 1.552136 +H2 1 -1.863178 0.881921 0.593333 +H3 1 -0.949807 1.214210 -0.962771 +H4 1 2.076806 -0.826189 -0.036671 +H5 1 2.074465 0.901788 0.325106 +H6 1 1.414895 0.315852 -1.212218 + +end +#--------------------------------------------- +name=nwchem +matrix=c +basis=6-31g +units=angstrom +post={rp} +#nwchem water coordinates + +O1 8 0.00000000 -0.00001441 -0.34824012 +H1 1 -0.00000000 0.76001092 -0.93285191 +H2 1 0.00000000 -0.75999650 -0.93290797 + +end +#---------------------------------------------- +name=h2 +matrix=c +diis=off +units=angstrom +post={} +basis=3-21g +#h2 in angstroms + +H1 1 0.00000000 0.00000000 0.00000000000 +H2 1 0.00000000 0.00000000 0.74 + +end +#---------------------------------------------- +name=h2 +matrix=c +diis=off +basis=sto-3g +post={} +#h2 in bohr + +H1 1 0.00000000000000 0.00000000 0.00000000000 +H2 1 1.39838996182773 0.00000000 0.00000000000 + +end +#---------------------------------------------- +name=hf +units=angstrom +matrix=c +#hf in angstrom + +H1 1 0.0 0.0 0.0 +F1 9 0.0 0.0 0.96 + +end +#---------------------------------------------- +name=ch4 +matrix=c +#methane Crawford coordinates + +C1 6 -0.000000000000 0.000000000000 0.000000000000 +H1 1 1.183771681898 -1.183771681898 -1.183771681898 +H2 1 1.183771681898 1.183771681898 1.183771681898 +H3 1 -1.183771681898 1.183771681898 -1.183771681898 +H4 1 -1.183771681898 -1.183771681898 1.183771681898 + +end +#--------------------------------------------- +name=methylamine +matrix=z +basis=sto-3g +units=bohr +post={ch} +#methylamine z-file + +C +N 1 R1 +H 1 H1 2 109.4712 +H 1 H1 2 109.4712 3 120 +H 1 H1 2 109.4712 3 240 +H 2 H2 1 109.4712 3 60 +H 2 H2 1 109.4712 3 300 + +R1 2.77788276200915 +H1 2.05979061944896 +H2 1.90861332627839 + +end +#----------------------------------------------- +name=h2o +matrix=z +basis=sto-3g +units=angstrom +post={ch} +#h2o z file format + +O +H 1 0.9435 +H 1 0.9435 2 105.9443 + +end +#---------------------------------------------- +name=acetaldehyde +matrix=c +#acetaldehyde Crawford + +C1 6 0.000000000000 0.000000000000 0.000000000000 +C2 6 0.000000000000 0.000000000000 2.845112131228 +O1 8 1.899115961744 0.000000000000 4.139062527233 +H1 1 -1.894048308506 0.000000000000 3.747688672216 +H2 1 1.942500819960 0.000000000000 -0.701145981971 +H3 1 -1.007295466862 -1.669971842687 -0.705916966833 +H4 1 -1.007295466862 1.669971842687 -0.705916966833 + +end +#---------------------------------------------- +name=h +matrix=c +diis=off +multiplicity=2 +#hydrogen uhf test + +H1 1 0.00000000000000 0.00000000 0.00000000000 + +end +#---------------------------------------------- +name=ch2 +basis=dz +charge=0 +multiplicity=3 +matrix=c + +C1 6 0.0 0.0 -0.11431662956154022 +H1 1 0.0 -1.8694696463993394 0.6805742619435168 +H2 1 0.0 1.8694696463993394 0.6805742619435168 + +end +#---------------------------------------------- +name=oh- +basis=dz +multiplicity=2 +matrix=c + +O 8 0.000000000 0.000000000 0.000000000 +H 1 1.85192184133943 0.0000 0.000000000 + +end +#---------------------------------------------- diff --git a/source/rESP.py b/source/rESP.py new file mode 100644 index 0000000..fe7ae48 --- /dev/null +++ b/source/rESP.py @@ -0,0 +1,443 @@ +from __future__ import division +import rhf +from numpy import zeros,pi, asarray, trace, dot, savez, load, all, sqrt +from numpy.linalg import norm, solve +from atom import getConstant, getNumber, bondMatrix +from post import buildElectricField +from view import pre, post, postSCF +import os + +def writerESP(mData, rData, qc, qr, metrics, stage): + #write results to 'harpy.html' + + if stage == '1': + name = mData['name'] + pre(name, 'rhf') + postSCF([mData, rData, qc, qr, metrics, stage], 'resp') + if stage == '2': + postSCF([mData, rData, qc, qr, metrics, stage], 'resp') + + +def deltaRMS(esp, qr , invRadii): + #calculate root mean square difference between classical restrained charges + #and qm derived charges + + rms = 0.0 + for p in range(invRadii.shape[0]): + + # q/r classical + q = 0.0 + for atom in range(invRadii.shape[1]): + q += qr[atom] * invRadii[p, atom] + + rms += pow(q - esp[p],2) + + return sqrt(rms/esp.shape[0]) + + + +def equiDistribution(points=45, variant='con'): + + from math import cos, sin, pi, sqrt + + surfacePoints = [] + + if variant == 'fib': + #based on fibonacci sphere algorithm + + dTheta = pi*(3.0-sqrt(5.0)) + dZ = 2.0/points + theta = 0.0 + z = 1.0 - dZ/2.0 + + for i in range(points): + + r = sqrt(1.0 - z*z) + p = (cos(theta)*r, sin(theta)*r, z) + surfacePoints.append(p) + + #update positions + z = z - dZ + theta += dTheta + + elif variant == 'con': + #connolly algorithm + + nxy = int(sqrt(pi*points)) + nz = int(nxy/2) + + tol = 1e-10 + nu = 0 + + for i in range(nz + 1): + + phi = pi*i/nz + z = cos(phi) + xy = sin(phi) + nh = int(nxy * xy + tol) + + if nh < 1: nh = 1 + + for j in range(nh): + + psi = 2*pi*j/nh + x = cos(psi)*xy + y = sin(psi)*xy + + if nu >= points: return surfacePoints + + nu += 1 + surfacePoints.append((x , y , z )) + + return surfacePoints + +def surfaceView(distribution): + #plot the molecular VdW surface + + import pylab as p + import mpl_toolkits.mplot3d.axes3d as p3 + + fig=p.figure() + ax = p3.Axes3D(fig) + x_s=[];y_s=[]; z_s=[] + + for i in range(len(distribution)): + x_s.append( distribution[i][0]); y_s.append( distribution[i][1]); z_s.append( distribution[i][2]) + + ax.scatter3D( asarray( x_s), asarray( y_s), asarray( z_s)) + + ax.set_xlabel('X'); ax.set_ylabel('Y'); ax.set_zlabel('Z') + ax.view_init(azim=60, elev=60) + p.show() + +def respData(molAtom, molBasis, molData, options): + #restrained electrostatic potentials + + vdwRadius = [1.20, \ + 1.20, 1.37, 1.45, 1.45, 1.50, 1.50, 1.40, 1.35, + 1.30, 1.57, 1.36, 1.24, 1.17, 1.80, 1.75, 1.70 ] + + if 'points' not in options: options['points'] = ['density', 1.0] + if 'shell' not in options : options['shell'] = [1, 0.0, 1.0] + if 'file' not in options : options['file'] = ['w', 'esp.npz', 'clear'] + if 'constrain' not in options: options['constrain'] = [] + if 'radii' not in options: options['radii'] = [] + if 'sphere' not in options: options['sphere'] = 'con' + if 'view' not in options: options['view'] = False + + #work in Angstroms + charge = [molData['charge']] + nAtoms = len(molAtom) + if options['radii'] != []: + for i in options['radii'] : + vdwRadius[getNumber(i[0])-1] = i[1] + + #geometry and Van der Waals scaled to bohr + geo = zeros((nAtoms,3)) + radii = zeros(nAtoms) + + for i in range(nAtoms): + geo[i,:] = molAtom[i].center[:] * getConstant('bohr->angstrom') + radii[i] = vdwRadius[molAtom[i].number - 1] + + distribution = [] + esp = [] + + #number of points to evaluate if not function of radius + if options['points'][0] == 'atom': + nPoints = int(options['points'][1]) + + for iShell in range(options['shell'][0]): + + scaleFactor = options['shell'][2] + (iShell * options['shell'][1]) + + for i in range(nAtoms): + + #effective shell radius accounting for scale factor + shellRadius = radii[i] * scaleFactor + + #density depends on radius - recalculate for scaling + if options['points'][0] == 'density': + nPoints = int(4.0 * pi * shellRadius * shellRadius * options['points'][1]) + + surface = asarray(equiDistribution(points = nPoints, variant = options['sphere']) ) + + #translate to atom center + for j in range(len(surface)): + surface[j][:] = surface[j][:] * shellRadius + geo[i,:] + + #remove points inside other atoms + for j in range(len(surface)): + + valid = True + + for k in range(nAtoms): + + if i == k: continue + + if (norm(surface[j][:] - geo[k,:])) < (radii[k] * scaleFactor): + valid = False + break + + if valid: + distribution.append(surface[j]) + + if options['view']: surfaceView(distribution) + + #build [points, atoms] matrix of inverse distances for each point to each atom + #switch to bohr for electrostatic calculation + invRadii = zeros((len(distribution), nAtoms)) + for p in range(len(distribution)): + for atom in range(nAtoms): + invRadii[p, atom] = 1.0/norm(distribution[p][:] - geo[atom][:]) + invRadii[p, atom] *= getConstant('bohr->angstrom') + + #we need density so do a scf calculation + e = rhf.scf(molAtom, molBasis, molData,[]) + + #compute the electrostatic potentials + for p in range(len(distribution)): + + x, y, z = distribution[p] / getConstant('bohr->angstrom') + t = buildElectricField(molAtom, molBasis, rhf.density, asarray([x, y, z])) + + #build return electric components [0-3] and nuclear [4-7], field first then potential + esp.append(t[7]-t[3]) + + if options['file'][0] == 'w': + savez(options['file'][1], distribution = distribution, esp = esp, inv = invRadii, n = nPoints) + + +def buildmatrix(invRadii, constraintLength, nAtoms): + + n = nAtoms + 1 + constraintLength + a = zeros((n,n)) + + for i in range(nAtoms): + for j in range(nAtoms): + for k in range(invRadii.shape[0]): + a[i,j] += invRadii[k,i] * invRadii[k,j] + + a[:nAtoms, nAtoms] = 1.0 + a[nAtoms, :nAtoms] = 1.0 + + return a + +def buildvector(invRadii, esp, constraintLength, nAtoms, charge): + + n = nAtoms + 1 + constraintLength + b = zeros(n) + for i in range(nAtoms): + for j in range(invRadii.shape[0]): + b[i] += esp[j] * invRadii[j,i] + + b[nAtoms] = charge + + return b + + +def doRestraint(q, a, parameters, z): + #apply hyperbolic restraints + + A = a.copy() + + for atom in range(len(z)): + + if not parameters['h'] or z[atom] != 1 : + A[atom, atom] = a[atom, atom] + (parameters['a'] / sqrt(q[atom]*q[atom] + parameters['b']*parameters['b'])) + + return A + +def carbonGroups(molAtom): + #get all groups with hydrogen attached to carbon + + groups = [] + for atom in range(len(molAtom)): + + if molAtom[atom].number == 6: + group = [] + #get connections + row = bondMatrix(molAtom)[atom,:] + for i in range(row.shape[0]): + if (row[i] == 1) and (molAtom[i].number == 1): group.append(i+1) + + groups.append([atom+1, group]) + + return groups + +def stageTwoConstraints(options, groups, nAtoms, q): + #translate groups into constraints + + if 'a' in options['stage two']: options['restrain']['a'] = options['stage two']['a'] + else: options['restrain']['a'] = 0.001 + if 'b' in options['stage two']: options['restrain']['b'] = options['stage two']['b'] + + #build new constraints + options['constrain'] = [] + atomlist = list(range(1, nAtoms+1)) + + #for each CH grouping constrain hydrogens to be equal [0, [-n,m,..]] + for group in groups: + options['constrain'].append([0, group[1]]) + for i in group[1]: atomlist.remove(i) + atomlist.remove(group[0]) + options['constrain'][-1][1][0] *= -1 + + #other atoms take restained charge + for i in atomlist: + options['constrain'].append([q[i-1],[i]]) + + return options + +def doRestraintIteration(q, a, b, parameters, z): + #main loop for restraints + + Q = q.copy() + nAtoms = len(z) + iteration = 0 + + while iteration < parameters['cycles'] : + + iteration += 1 + A = doRestraint(q, a, parameters, z) + + q = solve(A, b) + + if sqrt( max(pow(q[:nAtoms] - Q[:nAtoms],2))) < parameters['tol'] : return q[:nAtoms], iteration + + Q = q.copy() + + return -1, iteration + +def processConstraints(option): + #expand equal charge constraints + + if option == [] : return [], [] + + chargeGroup = [] + indexGroup = [] + + for i in option: + if i[1][0] > 0: + chargeGroup.append(i[0]) + indexGroup.append(i[1]) + else: + for j in range(len(i[1])-1): + chargeGroup.append(0) + group = [] + group.append(-abs(i[1][j])) + group.append((i[1][j+1])) + indexGroup.append(group) + + return chargeGroup, indexGroup + +def rESPsolve(molAtom, nAtoms, charge, options, invRadii, esp): + #do the constraint and restraint solve + + #process constraints + conCharge, conIndex = processConstraints(options['constrain']) + + constraintLength = len(conCharge) + + #construct a-matrix with total charge constraints + a = buildmatrix(invRadii, constraintLength, nAtoms) + b = buildvector(invRadii, esp, constraintLength, nAtoms, charge) + + #add applied constraints + for i in range(constraintLength): + b[nAtoms +1+i] = conCharge[i] + + for j in conIndex[i] : + if j > 0: + a[nAtoms+1+i, j-1] = 1 + a[j-1, nAtoms+1+i] = 1 + else: + a[nAtoms+1+i, -j-1] = -1 + a[-j-1, nAtoms+1+i] = -1 + + #remove zero rows or columns from a + a = a[~all(a == 0, axis=1)] + a = a[~all(a == 0, axis=0)] + + #solve + try: + q = solve(a,b) + except: + print('solve failure in rESP') + exit('solve') + + constrainedCharges = q[:nAtoms] + + #atoms types + z = zeros(nAtoms) + for atom in range(nAtoms): + z[atom] = molAtom[atom].number + + if 'restrain' in options: + q, nCycles = doRestraintIteration(q, a, b, options['restrain'], z) + if q[0] == -1: + print ('restraint iteration failure in rESP') + exit('iteration') + + restrainedCharges = q[:nAtoms] + + rms = deltaRMS(esp, restrainedCharges, invRadii) + + else: rms = deltaRMS(esp, constrainedCharges, invRadii) + + return constrainedCharges, restrainedCharges, nCycles, rms + +def restrainedESP(molAtom, molBasis, molData, options): + + #get molecular objects and options - passed values + + nAtoms = len(molAtom) + charge = molData['charge'] + + if options['file'][0] == 'w': + + respData(molAtom, molBasis, molData, options ) + options['file'][0] = 'r' + + + if options['file'][0] == 'r': + #get data from npz file + data = load(options['file'][1]) + distribution = data['distribution'] + esp = data['esp'] + invRadii = data['inv'] + nPoints = data['n'] + + #restraint options (set defaults if necessary) + if 'restrain' not in options: options['restrain'] = {} + else: + if 'a' not in options['restrain']: options['restrain']['a'] = 5e-4 + if 'b' not in options['restrain']: options['restrain']['b'] = 0.1 + if 'h' not in options['restrain']: options['restrain']['h'] = True + if 'tol' not in options['restrain']: options['restrain']['tol'] = 1e-6 + if 'cycles' not in options['restrain']: options['restrain']['cycles'] = 30 + + #solve the system (stage one) + constrainedCharges, restrainedCharges, nCycles, rms = rESPsolve(molAtom, nAtoms, charge, options, invRadii, esp) + + stagetwo = 'stage two' in options + + writerESP(molData, options, constrainedCharges, restrainedCharges, [nPoints, nCycles, rms], '1') + + #solve for stage two if selected + if stagetwo: + + groups = carbonGroups(molAtom) + if groups == []: exit('no stage two') + + options = stageTwoConstraints(options, groups, nAtoms, restrainedCharges) + + constrainedCharges, restrainedCharges, nCycles, rms = rESPsolve(molAtom, nAtoms, charge, options, invRadii, esp) + writerESP(molData, options, constrainedCharges, restrainedCharges, [nCycles, rms], '2') + + #html Output file exit and clear data file + post() + if options['file'][2] == 'clear': os.remove(options['file'][1]) + + return constrainedCharges, restrainedCharges + diff --git a/source/rhf.py b/source/rhf.py new file mode 100644 index 0000000..81acc2e --- /dev/null +++ b/source/rhf.py @@ -0,0 +1,378 @@ +from __future__ import division +#import system modules +from scipy.linalg import fractional_matrix_power as fractPow +import sys + +#import class modules +from atom import atom, nuclearRepulsion, zMatrix, getConstant, atomList +from basis import checkBasis, buildBasis, electronCount +#import user modules +from view import geometry, orbitals, pre, preSCF, SCF, post, postSCF +from integral import buildOverlap, buildKinetic, buildCoulomb, buildEri, \ + buildHamiltonian, buildFock, buildDensity +from diis import diis_f +from post import charges, energyPartition, buildDipole, polarizabilities, buildQuadrupole, hyperPolarizabilities, \ + bondOrder, buildMp2Dipole +from mp import mollerPlesset, orbitalOptimisedMP2, mp2LaplaceTransform +from mbpt import mbptEvaluateMPn +from ci import cis, ciSpinAdaptedSingles, ciSpinAdaptedTriples, randomPhaseApproximation +from cc.scc import ccsd, lccd, ccd, cc2, lccsd +from force import forces +from ep import electronPropagator2, electronPropagator2spin, electronPropagator3spin, koopmanAGFcorrection +from fci import fci, cisd, ciss +from cc.fcc import fastCoupledCluster +from cc.cctn import coupledClusterTriplesVariations +import numpy as np + + +def rmsDensity(Da, Db): + #compute rms difference of last two cycles of density matrix + n = Da.shape[0] + sum = 0.0 + + for i in range(0, n): + for j in range(0, n): + sum += pow((Da[i,j] - Db[i,j]),2) + + return np.sqrt(sum) + +def mol(show, file = 'project.hpf', molecule='', method='rhf'): + #read input file + + coordinates = [] + cartesian = False + + #loop over input file + with open(file,'r') as data: + f = data.read().split('\n') + + #commands, options and check flags + valid = {'name':[False,'string'],'basis':[False,'string'],'diis':[False,'on','off'],'engine':[False,'aello','native'], \ + 'gauge':[False,'origin','nuclear','mass'],'guess':[False,'core','gwh'],'charge':[False,'int'],'multiplicity':[False,'int'], \ + 'cycles':[False,'int'],'capacity':[False,'init'],'tolerance':[False,'float'],'uhfmix':[False, 'float'],'post':[False,'string'],'cogus':[False,'string'], \ + 'matrix':[False,'c','z'],'units':[False,'bohr','angstrom'],'no_mint_density':[False]} + values = {'name':'','basis':'sto-3g','diis':'on','engine':'aello','gauge':'origin','guess':'core','charge':0,'multiplicity':1, \ + 'cycles':100,'capacity':8,'tolerance':1e-8,'uhfmix':0.0,'post':'','cogus':'{}','matrix':'','units':'bohr','no_mint_density':False} + + for nline, line in enumerate(f): + + line = line.strip() + + #find requested molecule + if molecule != '': + if not ('name=' + molecule) == line: + continue + else: + molecule = '' + + if line.strip() == 'end': break + + if (len(line.split()) != 0) and (line.split()[0][0] == '#'): continue + + if '=' in line: + + #string commands + if any(element in line for element in ['diis','engine','gauge','guess', 'matrix','units']): + + data = line.split('=') + key = data[0] + value = data[1] + if value in valid[key]: + values[key] = value + valid[key][0] = True + if value == 'c': cartesian = True + + #integer commands + if any(element in line for element in ['charge', 'multiplicity','cycles','capacity']): + + data = line.split('=') + key = data[0] + if data[1].replace('-','',1).replace('+','',1).isnumeric(): + values[key] = int(data[1]) + valid[key][0] = True + + #float command + if any(element in line for element in ['tolerance', 'uhfmix']): + + data = line.split('=') + key = data[0] + if data[1].replace('e','',1).replace('-','',1).replace('.','').isnumeric(): + values[key] = float(data[1]) + valid[key][0] = True + + if any(element in line for element in['name','basis','post','cogus']): + + data = line.split('=') + key = data[0] + values[key] = data[1] + valid[key][0] = True + + elif 'no_mint_density' in line: + data = line.split('=') + key = data[0] + values[key] = True + valid[key][0] = True + else: + + #process atom definitions - 'cartesian' flags cartesian or z-matrix + data = line.split() + if (len(data) != 0): + if cartesian: + coordinates.append([data[0], int(data[1]), float(data[2]), float(data[3]), float(data[4])]) + if not cartesian: + coordinates.append(line) + + #check options and defaults [no default for matrix - critical error] + for i in valid: + if i[0] == 'False': + exit('critical input error') + + #construct atom object array + molAtom = [] + + #convert to bohr if necessary + conversion = 1.0 + if values['units'] == 'angstrom': + conversion = 1.0/getConstant('bohr->angstrom') + + if cartesian: + for i in range(len(coordinates)): + molAtom.append(atom(coordinates[i][0], coordinates[i][1], [coordinates[i][2]*conversion, \ + coordinates[i][3]*conversion, \ + coordinates[i][4]*conversion])) + else: + z = zMatrix(coordinates) + for i in range(len(z)): + molAtom.append(atom(z[i][0], int(z[i][1]), [float(z[i][2])*conversion, \ + float(z[i][3])*conversion, \ + float(z[i][4])*conversion])) + + #check to see if valid basis + basisName = values['basis'] + if not checkBasis(basisName,molAtom): + exit('basis not in library') + + #get charge + charge = values['charge'] ; multiplicity = values['multiplicity'] + + #build molecular basis + molBasis = buildBasis(molAtom, basisName) + + #write output if requested + name = values['name'] + if show != []: + pre(name, method) + if 'geometry' in show: + geometry(molAtom) + #output orbital and basis information + if 'orbitals' in show: + orbitals(molAtom, charge, multiplicity, basisName, molBasis, method) + + #return atom object array, basis object array and [name,basis,diis,integral engine,gauge origin, + # initial hamiltonian guess,charge,multiplicity,cycles,tolerance,,units] + + return molAtom, molBasis, values + +def rebuildCenters(molAtom, molBasis, geo): + #a change of geometry means atom.center and basis.center need updating + for atom in range(0, len(molAtom)): + molAtom[atom].center = geo[atom, :] + + for basis in range(0, len(molBasis)): + if molBasis[basis].atom == atom: + molBasis[basis].center = geo[atom, :] + + return molAtom, molBasis + +def scf(molAtom, molBasis, run, show, cptDensity = None): + + global gaugeOrigin + + #options + name, basisName, diisStatus, integralEngine, gaugeOrigin, hamiltonianGuess, charge, multiplicity, \ + iterations, diisCapacity, convergence, uhfmix, p, cogus, matrix, units, no_mint_density = run.values() + cogus = cogus.replace('{','').replace('}','') + + if gaugeOrigin == 'nuclear': gaugeOrigin = 'nuclear charge' + + #check closed shell + if (electronCount(molAtom, charge) % 2) != 0: + exit('open shell molecule') + + #globals so molecular dynamics can be run seperately + global C, fock, density, S, ERI, coreH, SCFenergy, e + + #pre-SCF matrices - S{overlap} T{1e kinetic/exchange/resonance} V{1e Coulomb} ERI(2e electron repulsion) + if integralEngine == 'native': + S = buildOverlap(molBasis) + T = buildKinetic(molBasis) + V = buildCoulomb(molAtom, molBasis) + ERI = buildEri(molBasis) + elif integralEngine == 'aello': + from aello import aello + S, T, V, ERI = aello(molAtom, molBasis) + + #orthogonalising matrix X + X = fractPow(S, -0.5) + + #initial core guess + coreH, _ = buildHamiltonian(hamiltonianGuess,S,T,V) + e, orthogonalC = np.linalg.eigh(np.dot(X.T, np.dot(coreH, X))) + + C = np.dot(X, orthogonalC) + + occupiedOrbitals = electronCount(molAtom, charge)//2 + basisFunctions = len(molBasis) + + #check-point density - use if there + if (type(cptDensity) != np.ndarray) or (cptDensity.shape[0] != S.shape[0]) or not no_mint_density: + density = buildDensity(basisFunctions, occupiedOrbitals, C) + else: + density = cptDensity + + #define storage for diis + if diisStatus == 'on': + diis = diis_f(diisCapacity) + + + #the SCF loop + for cycle in range(0 , iterations): + + #build initial fock matrix as core Hamiltonian + fock, G = buildFock(coreH, ERI, density, integralEngine) + + #do diis if selected + if (cycle != 0) and (diisStatus == 'on'): + fock = diis.build(fock, density, S, X) + + #compute SCF energy + energy = 0.0 + for i in range(0, basisFunctions): + for k in range(0, basisFunctions): + energy += density[i,k] * (fock[i,k] + coreH[i,k]) + + #orthogonalise Fock + orthogonalFock = np.dot(X.T , np.dot(fock , X)) + + #diagonalise Fock + e, orthogonalC = np.linalg.eigh(orthogonalFock) + + #transform eigenvalues back to non-orthogonal AO basis + C = np.dot(X,orthogonalC) + + #build density matrix + density = buildDensity(basisFunctions, occupiedOrbitals, C) + + #convergence control + if cycle != 0: + deltaEnergy = np.abs(preEnergy - energy) + deltaDensity = rmsDensity(preDensity, density) + if 'SCF' in show: + SCF(energy, deltaEnergy, deltaDensity, cycle, diisStatus, iterations, convergence) + if (deltaEnergy < convergence) and (deltaDensity < convergence) : + break + + preEnergy = energy + preDensity = density + + #output pre-SCF details + if cycle==0 and ('preSCF' in show): + preSCF(S, T, V, ERI, X, orthogonalFock, density, energy, hamiltonianGuess) + + #if failed to converge exit with messages + if (cycle + 1) == (iterations): + print('SCF failed to converge in ' + str(cycle + 1) + ' iterations') + if diisStatus == 'off': print('Try diis = \'on\'') + + post(False) + sys.exit('convergence failure') + + #final eigensolution of final Fock matrix are orbital energies (e) and MO coefficients(C) + SCFenergy = energy + nuclearRepulsion(molAtom) + + if 'SCF' in show: + postSCF([SCFenergy, cycle, C, e, density],'eigen') + + if 'postSCF' in show: + + if 'ch' in p: charges(density ,S, molAtom, molBasis) + if 'bo' in p: bondOrder(density, S, molAtom, molBasis) + if 'en' in p: energyPartition(energy, nuclearRepulsion(molAtom), density, T, V, G, e, \ + electronCount(molAtom,charge)) + if 'di' in p: + buildDipole(molAtom, molBasis, density, gaugeOrigin, integralEngine) + buildMp2Dipole(molAtom, molBasis, gaugeOrigin, C, e, ERI, occupiedOrbitals) + if 'qu' in p: buildQuadrupole(molAtom, molBasis, density, gaugeOrigin) + + if 'mp' in p: mollerPlesset(molAtom, charge, molBasis, C, e, fock, ERI, SCFenergy) + if 'om' in p: orbitalOptimisedMP2(C, coreH, e, molBasis, nuclearRepulsion(molAtom), ERI, electronCount(molAtom,charge)) + if 'ml' in p: mp2LaplaceTransform(molBasis, C, ERI, e, occupiedOrbitals, SCFenergy) + if 'mb' in p: mbptEvaluateMPn(molAtom, molBasis, run, SCFenergy) + + if 'ci' in p: cis(molAtom,charge,molBasis,C,fock,ERI) + if 'ss' in p: ciSpinAdaptedSingles(molAtom,charge,molBasis,C,fock,ERI) + if 'st' in p: ciSpinAdaptedTriples(molAtom,charge,molBasis,C,fock,ERI) + if 'rp' in p: randomPhaseApproximation(molAtom,charge,molBasis,C,fock,ERI,type='block') + if 'fc' in p: fci(molAtom, molBasis, charge, C, ERI, coreH) + if 'sd' in p: cisd(molAtom, molBasis, charge, C, ERI, coreH) + if 'cs' in p: ciss(molAtom, molBasis, charge, C, ERI, coreH) + + if 'ct' in p: ccsd(molAtom, C, charge, fock, ERI, iterations, convergence, SCFenergy, diisStatus) + if 'c2' in p: cc2(molAtom, C, charge, fock, ERI, iterations, convergence, SCFenergy, diisStatus) + if 'lc' in p: lccd(molAtom, C, charge, fock, ERI, iterations, convergence, SCFenergy) + if 'cd' in p: ccd(molAtom, C, charge, fock, ERI, iterations, convergence, SCFenergy) + if 'ld' in p: lccsd(molAtom, C, charge, fock, ERI, iterations, convergence, diisStatus, SCFenergy) + + if 'fo' in p: forces(molAtom, molBasis, density, fock, integralEngine, 'both') + + if 'ep' in p: electronPropagator2(molBasis ,C ,ERI ,e , occupiedOrbitals ,2 ,4 ) + if 'e2' in p: electronPropagator2spin(molBasis, C, ERI, e, occupiedOrbitals, 5) + if 'e3' in p: electronPropagator3spin(molBasis, C, ERI, e, occupiedOrbitals, 5) + if 'ko' in p: koopmanAGFcorrection(molBasis ,C ,ERI, e, occupiedOrbitals, 5) + + if 'po' in p: polarizabilities(molAtom, molBasis, C, fock, ERI, occupiedOrbitals, gaugeOrigin) + if 'hy' in p: hyperPolarizabilities(molAtom, molBasis, C, ERI, e, fock, occupiedOrbitals, gaugeOrigin) + + #symbolic generated code + if cogus != '': + from cogus import symbolicGeneratedCoupledCluster + + repertoire = {'d':'ccd','sd':'ccsd','sd(t)':'ccsd_t','2':'cc2','ld':'lccd','lsd':'lccsd','3':'cc3', 'sdt':'ccsdt'} + cogusList = cogus.split(',') + results = [] + + for cogusItem in cogusList: + name, cluster, perturbation = symbolicGeneratedCoupledCluster(repertoire[cogusItem], fock, ERI, C, e, \ + [charge, nuclearRepulsion(molAtom), electronCount(molAtom,charge)]) + results.append([('CC'+cogusItem.upper()).replace('(t)','(T)').replace('CCL','LCC'), cluster, perturbation]) + + postSCF(results, 'cogus') + + #process any fast coupled-cluster + if '+' in p: + repertoire = {'+d':'ccd','+s':'ccsd','+t':'ccsd(t)','+2':'cc2','+l':'lccd','+L':'lccsd','+^':'lambda', '+q':'qcisd'} + data = {'cycle_limit': 50, 'precision':1e-10, 'electrons': electronCount(molAtom,charge)} + for key in repertoire.keys(): + method = repertoire[key] + if key in p: fastCoupledCluster(method, fock, e, C, ERI, nuclearRepulsion(molAtom), data) + + #process triples and triples approximations + if '-' in p: + repertoire = {'-T':'ccsdt','-t':'ccsd(t)','-1a':'ccsdt-1a','-1b':'ccsdt-1b','-2':'ccsdt-2','-3':'ccsdt-3','-4':'ccsdt-4'} + for key in repertoire.keys(): + method = repertoire[key] + if key in p: coupledClusterTriplesVariations(method, fock, ERI, C, e, + [charge, nuclearRepulsion(molAtom), electronCount(molAtom,charge)], + [True, 50, 1e-10, True]) + + #save molecular integrals to zip archive + if 'mints' in show: + np.savez_compressed('../mints/' + name + '-' + basisName + '-mints.npz', s=S, k=T, j=V, i=ERI, \ + f=fock, d=density, c=C, e=e, E=SCFenergy, m=[charge, name, basisName, nuclearRepulsion(molAtom)], \ + a=atomList(molAtom)) + + #clean up outfile + if show != []: post() + + return SCFenergy + diff --git a/source/rohf.py b/source/rohf.py new file mode 100644 index 0000000..b8c02d8 --- /dev/null +++ b/source/rohf.py @@ -0,0 +1,294 @@ +from __future__ import division +import numpy as np +import scipy + +from integral import buildOverlap, buildKinetic, buildCoulomb, buildEri, \ + buildHamiltonian, iEri, expandEri +from basis import electronCount +from atom import nuclearRepulsion +from view import geometry, orbitals, pre, preSCF, SCF, postSCF, post, uhfOrbitals +from post import buildDipole + +from diis import diis_f + +def rmsDensity(density, preDensity): + #compute RMS of density matrix + + return np.sqrt(np.mean(np.square(density - preDensity))) + +def get_occupations(eps_list, atoms, charge, multiplicity): + #compute the orbital occupancies from orbital energies + + if len(eps_list) == 1: + eps = eps_list[0] + eps_alpha = eps_beta = eps + else: + eps, eps_alpha, eps_beta = eps_list + + nmo = len(eps) + + mo_occupied = np.zeros(nmo) + ne = electronCount(atoms, charge) + + #spin (unpaired electrons) + spin = multiplicity - 1 + electrons = ((ne-spin)//2 + spin, (ne-spin)//2) + + #fill occupancies + mo_occupancy = np.zeros((nmo)) + eps_sorted = np.argsort(eps) + core_indices = eps_sorted[:electrons[1]] + + if spin != 0: + open_indices = eps_sorted[electrons[1]:] + open_indices = open_indices[np.argsort(eps_alpha[open_indices])[:spin]] + mo_occupancy[open_indices] = 1 + + mo_occupancy[core_indices] = 2 + + return mo_occupancy + +def get_densities(c, occupations): + #get the one-particle density matrices for closed and open + + alpha = occupations > 0 + beta = occupations == 2 + + dm_alpha = np.einsum('pr,r,qr', c, alpha, c, optimize=True) + dm_beta = np.einsum('pr,r,qr', c, beta, c, optimize=True) + + return np.array([dm_alpha, dm_beta]) + + +def get_coulomb_exchange(density, eri): + #form the coulomb and exchange HF integrals + + j = np.zeros_like(density) ; k = np.zeros_like(density) + for spin in range(density.shape[0]): + j[spin] = np.einsum('ijkl,ji->kl', eri, density[spin], optimize=True) + k[spin] = np.einsum('ikjl,ji->kl', eri, density[spin], optimize=True) + + return j, k + +def make_fock(h, v, dm, s): + #construct the rohf Roothaan effective fock matrix components + + #uhf fock operators + f_alpha = h + v[0] ; f_beta = h + v[1] + + #Roothaan effective Fock + + nbf = s.shape[0] + + f_core = (f_alpha + f_beta) * 0.5 + + #project uhf focks - alpha all non-zero , beta - all doubly occupied + core = np.einsum('pr,rq->pq', dm[1], s, optimize=True) + open = np.einsum('pr,rq->pq', dm[0] - dm[1], s, optimize=True) + virtual = np.eye(nbf) - np.einsum('pr,rq->pq', dm[0], s, optimize=True) + + #make fock + fock = 0.5 * np.einsum('sp,sr,rq->pq', core, f_core, core, optimize=True) + fock += 0.5 * np.einsum('sp,sr,rq->pq', open, f_core, open, optimize=True) + fock += 0.5 * np.einsum('sp,sr,rq->pq', virtual, f_core, virtual, optimize=True) + + fock += np.einsum('sp,sr,rq->pq', open, f_beta, core, optimize=True) + fock += np.einsum('sp,sr,rq->pq', open, f_alpha, virtual, optimize=True) + fock += np.einsum('sp,sr,rq->pq', virtual, f_core, core, optimize=True) + + roothaan_fock = fock + fock.transpose(1,0) + + return f_alpha, f_beta, roothaan_fock + +def eigensolution(fock, x): + #solve the fock, S system + + fock_prime = np.einsum('rp,rs,sq->pq', x, fock[2], x, optimize=True) + e , c =np.linalg.eigh(fock_prime) + c = np.einsum('pr,rq->pq',x, c, optimize=True) + + e_alpha = np.einsum('pi,ps,si->i', c, fock[0], c, optimize=True) + e_beta = np.einsum('pi,ps,si->i', c, fock[1], c, optimize=True) + + return e, e_alpha, e_beta, c + +def get_rohf_energy(density, h1e, v): + #compute the rohf energy + + e = np.einsum('ij,ji->', h1e, density[0], optimize=True) + e += np.einsum('ij,ji->', h1e, density[1], optimize=True) + + e_coulomb = (np.einsum('ij,ji->', v[0], density[0]) + np.einsum('ij,ji->', v[1], density[1])) * 0.5 + + return (e, e_coulomb) + +def scf(molAtom, molBasis, run, show): + + global density_total + + #options + name, basisName, diisStatus, integralEngine, gaugeOrigin, hamiltonianGuess, charge, multiplicity, \ + iterations, diisCapacity, convergence, uhfmix, p, _, _, _, _ = run.values() + + #pre-SCF matrices - s{overlap} t{1e kinetic/exchange/resonance} v{1e Coulomb} ERI(2e electron repulsion) + if integralEngine == 'native': + s = buildOverlap(molBasis) + t = buildKinetic(molBasis) + v = buildCoulomb(molAtom, molBasis) + eri = buildEri(molBasis) + elif integralEngine == 'aello': + from aello import aello + s, t, v, eri = aello(molAtom, molBasis) + + #get nuclear repulsion energy + nuclear_repulsion = nuclearRepulsion(molAtom) + + #get eri to tensor from linear form + nbf = s.shape[0] + eri = expandEri(eri, nbf) + + #get one-electron hamiltonian + one_electron_h = t + v + eps, c = scipy.linalg.eigh(one_electron_h, s) + + #determine the alpha and beta occupancies + mo_occupancy = get_occupations([eps], molAtom, charge, multiplicity) + + #check we have right number of electrons + if electronCount(molAtom, charge) != np.sum(mo_occupancy): + exit('charge and multiplicity incompatible') + + #report if requested + if 'orbitals' in show: + uhfOrbitals(sum(i > 0 for i in mo_occupancy), sum(i == 2 for i in mo_occupancy), multiplicity) + + #get alpha and beta density matrices + dm = get_densities(c, mo_occupancy) + + #coulomb and exchange integrals + j, k = get_coulomb_exchange(dm, eri) + jk = j - k + + #rohf energy components + rohf_energy = get_rohf_energy(dm, one_electron_h, jk) + + #symmetric orthogonalization + x = scipy.linalg.fractional_matrix_power(s, -0.5) + + #convergence buffers + scf_energy = [np.sum(rohf_energy)] + scf_density = [dm] + + #define storage for diis + if diisStatus == 'on': + diis = diis_f(diisCapacity) + + for cycle in range(iterations): + + #get cycle fock's and solve for orbital energies and coefficients + f_alpha, f_beta, fock = make_fock(one_electron_h, jk, dm, s) + + #do diis if selected + if (cycle != 0) and (diisStatus == 'on'): + fock = diis.build(fock, dm[0]+dm[1], s, x) + + e, e_alpha, e_beta, c = eigensolution((f_alpha, f_beta, fock), x) + + mo_occupancy = get_occupations([e, e_alpha, e_beta], molAtom, charge, multiplicity) + + dm = get_densities(c, mo_occupancy) + + #recalculate jk and get new energy for this cycle + j, k = get_coulomb_exchange(dm, eri) + jk = j[0] + j[1] - k + + rohf_energy = get_rohf_energy(dm, one_electron_h, jk) + + #update buffers + scf_energy.append(np.sum(rohf_energy)) + scf_density.append(dm) + + #convergence control + if cycle != 0: + rms_alpha = rmsDensity(scf_density[-1][0], scf_density[-2][0]) ; rms_beta = rmsDensity(scf_density[-1][1], scf_density[-2][1]) + if (abs(scf_energy[1] - scf_energy[0]) < convergence) and (rms_alpha < convergence) and (rms_beta < convergence): + break + else: + SCF(scf_energy[-1], abs(scf_energy[1] - scf_energy[0]), (rms_alpha + rms_beta)*0.5, cycle, 'off', iterations, convergence) + + del scf_energy[0] + del scf_density[0] + + if cycle == iterations: + print('SCF failed to converge in ' + str(cycle) + ' iterations') + if diisStatus == 'off': print('Try diis = \'on\'') + post(False) + sys.exit('convergence failure') + + if 'SCF' in show: + postSCF([scf_energy[-1 ] + nuclear_repulsion, cycle, scf_energy[-1 ]],'uhf') + + if 'postSCF' in show: + def spin_analysis(c, occupancy, s): + #spin contamination and spin statistics + + alpha = (occupancy > 0).astype(np.int) ; beta = (occupancy == 2).astype(np.int) + + #get occupied molecular eigenvectors + c_occ = [c[0]*alpha, c[1]*beta] + mo_occ = [c_occ[0][:,~np.all(c_occ[0]==0, axis=0)], c_occ[1][:,~np.all(c_occ[1]==0, axis=0)]] + nalpha, nbeta = [mo_occ[0].shape[1], mo_occ[1].shape[1]] + + #components of total spin + spin = np.einsum('rp,rs,sq->pq',mo_occ[0], s, mo_occ[1], optimize=True) + spin_xy = (nalpha + nbeta) * 0.5 - np.einsum('ij,ij->', spin, spin, optimize=True) + spin_z = (nalpha - nbeta)**2 * 0.25 + spin_total = (spin_xy + spin_z) + + multiplicity = np.sqrt(spin_total + 0.25) - 0.5 + + return spin_total, multiplicity*2 + 1, nalpha, nbeta + + spin_total, spin_multiplicity, nalpha, nbeta = spin_analysis([c,c], mo_occupancy, s) + + spin_matrix = np.einsum('rp,rs,sq->pq', c[:, :nbeta], s, c[:, :nalpha], optimize=True) + spin_contamination = nbeta - np.einsum('pq,pq->',spin_matrix, spin_matrix, optimize=True) + density_total = dm[0] + dm[1] ; spin_density = dm[0] - dm[1] + postSCF([e_alpha, e_beta, density_total, spin_density, spin_total, spin_contamination, spin_multiplicity], 'uhf-post') + + #if requested Mulliken populations + if 'ch' in p: + population = [] + population.append(np.einsum('ij,ji->i', dm[0], s, optimize=True)) + population.append(np.einsum('ij,ji->i', dm[1], s, optimize=True)) + + mulliken = [] + atom_charge = np.zeros((2,len(molAtom))) + atom_spin_charge = np.zeros(atom_charge.shape[1]) + total_charge = np.zeros(2) + + for spin in range(2): + for i in range(population[spin].shape[0]): + mulliken.append([molBasis[i].symbol, molAtom[molBasis[i].atom].id, round(population[spin][i],6)]) + atom_charge[spin][molBasis[i].atom] += round(population[spin][i],6) + total_charge[spin] += population[spin][i] + + spin_population = np.einsum('ij,ji->i', spin_density, s) + for i in range(spin_population.shape[0]): + atom_spin_charge[molBasis[i].atom] += spin_population[i] + + atoms = [] + for atom in molAtom: + atoms.append([atom.id, atom.number]) + + postSCF([nbf, mulliken, total_charge, atom_charge, atoms, spin_population, atom_spin_charge], 'uhf-mull') + + #if requested dipole moment + if 'di' in p: + import aello + dipoles = buildDipole(molAtom, molBasis, density_total*0.5, gaugeOrigin) + + #clean up outfile + post() + + return scf_energy[-1 ] + nuclear_repulsion \ No newline at end of file diff --git a/source/setup.py b/source/setup.py new file mode 100644 index 0000000..a685953 --- /dev/null +++ b/source/setup.py @@ -0,0 +1,9 @@ +from distutils.core import setup +from distutils.extension import Extension +from Cython.Build import cythonize + +ext_modules=[Extension("aello",["aello.pyx"],libraries=["m"],extra_compile_args=["-ffast-math"])] +ext_modules=[Extension("ocypete",["ocypete.pyx"],libraries=["m"],extra_compile_args=["-ffast-math"])] +setup(name='aello',ext_modules = cythonize('aello.pyx',language_level=3)) +setup(name='ocypete',ext_modules = cythonize('ocypete.pyx',language_level=3)) + diff --git a/source/tdhf.py b/source/tdhf.py new file mode 100644 index 0000000..d638d36 --- /dev/null +++ b/source/tdhf.py @@ -0,0 +1,795 @@ +from __future__ import division +from scipy.linalg import expm, norm +from numpy import dot, conjugate, zeros, pi, zeros_like, sin, array, hstack, trace, kron +from numpy import arange, where, all, sqrt, sum, log, max, min, linspace, exp, eye +import rhf +from scipy.linalg import fractional_matrix_power as fractPow +from post import buildDipole, dipoleComponent +from integral import iEri, buildAngular, buildNabla, buildFockMOspin +from atom import nuclearRepulsion, getConstant +from aello import tdhfFock +from numpy.linalg import solve +from ci import randomPhaseApproximation, ciDegeneracy + +def tdhf(do, run, shape, units ): + #time-dependent Hartree-Fock by Magnus expansion + + #arguments + timeIncrement, iterations, direction = run + + #pulse definition + if len(shape) == 2: + pulseType, fieldStrength = shape + rho = 0.1 + elif len(shape) == 3: + pulseType, fieldStrength, rho = shape + + #initial molecule properties + molAtom, molBasis, molData = rhf.mol([]) + + SCFenergy = rhf.scf(molAtom, molBasis, molData, []) + S = rhf.S + density = rhf.density + ERI = rhf.ERI + fock = rhf.fock + coreH = rhf.coreH + + reset = False + + #transform AO <-> AO orthogonal + X = fractPow(S, -0.5) + U = fractPow(S, 0.5) + + #initial AO orthogonal matrices + orthoDensity = dot(U, dot(density, U.T)) + orthoFock = dot(X.T , dot(fock , X)) + + h = -1j * timeIncrement + + #|---------------------------------subroutines----------------------------------| + + def initialise(): + #ground state initialiation + + rhf.scf(molAtom, molBasis, molData, []) + + S = rhf.S + density = rhf.density + ERI = rhf.ERI + fock = rhf.fock + coreH = rhf.coreH + + def pulse(t, type = 'gaussian'): + + if type == 'kick': + if t == 0: return 1.0 + else: return 0.0 + elif type == 'gaussian': + return exp(-(t**2)/ (2 * rho * rho)) + + def commutator(a, b): + #commutator bracket of a,b + + return dot(a,b) - dot(b,a) + + def orthoField(t): + #add dipole field to fock - in orthogonal basis + + axis = ['x','y','z'].index(direction) + + profile = pulse(t, type=pulseType) * fieldStrength + + dp = dipoleComponent(molAtom, molBasis, direction, 'nuclear charge') + + fockCorrection = profile * dp + + return dot(X.T , dot(fockCorrection , X)) + + def updateFock(density, engine = 'aello'): + #updating Fock complex version + n = density.shape[0] + fock = zeros((n,n), dtype=complex) + + if engine == 'aello': + fock = tdhfFock(n, density, coreH.astype('complex'), ERI.astype('complex')) + + elif engine == 'native': + G = zeros((n,n), dtype=complex) + + for i in range(0, n): + for m in range(0, n): + G[i,m] = 0.0 + for k in range(0, n): + for l in range(0, n): + G[i,m] += density[k,l] * ( 2* ERI[iEri(i,m,k,l)].astype('complex') - ERI[iEri(i,k,m,l)].astype('complex')) + fock[i,m] = coreH[i,m].astype('complex') + G[i,m] + + return fock + + def updateState(u, cycleDensity): + #propagate time U(t) -> U(t+timeIncrement) + + orthoDensity = dot(u, dot(cycleDensity, conjugate(u).T)) + + #build fock in non-orthogonal ao basis + density = dot(X, dot(orthoDensity, X.T)) + fock = updateFock(density) + + #orthogonalize for next step + orthoFock = dot(X.T, dot(fock, X)) + + return orthoFock, orthoDensity + + def updateEnergy(molAtom, molBasis, fock, density): + #compute SCF energy + + energy = 0.0 + for i in range(0, len(molBasis)): + for k in range(0, len(molBasis)): + energy += density[i,k] * (fock[i,k] + coreH[i,k]) + + return energy + nuclearRepulsion(molAtom) + + def magnus2(h, orthoFock, orthoDensity, density): + #second order Magnus expansion + + time = [] + HFenergy = [] + dipole = [] + field = [] + + axis = ['x','y','z'].index(direction) + nbf = orthoDensity.shape[0] + energy = SCFenergy + + for cycle in range(iterations): + + k = zeros((2,nbf,nbf)).astype('complex') + + dipole.append(buildDipole(molAtom, molBasis, density.real,'nuclear charge', 'aello')[axis]) + + time.append(cycle * timeIncrement) + HFenergy.append(energy) + field.append(pulse(cycle * timeIncrement, type=pulseType)) + + cycleDensity = orthoDensity.copy() + + #equation (13) + k[0] = h * (orthoFock + orthoField(cycle * timeIncrement)) + l = k[0] + u = expm(l) + + orthoFock, orthoDensity = updateState(u, cycleDensity) + k[1] = h * (orthoFock + orthoField((cycle+1) * timeIncrement)) + l = 0.5*(k[0] + k[1]) + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + #unorthogonalise for energy calculation + fock = dot(U.T, dot(orthoFock, U)) + density = dot(X, dot(orthoDensity, X.T)) + energy = updateEnergy(molAtom, molBasis, fock, density) + + return time, HFenergy, dipole, field + + def magnus4(h, orthoFock, orthoDensity, density): + #second order Magnus expansion + + #reset plotted quantities and return to ground state + time = [] + HFenergy = [] + dipole = [] + field = [] + + axis = ['x','y','z'].index(direction) + nbf = orthoDensity.shape[0] + energy = SCFenergy + + for cycle in range(iterations): + + k = zeros((6,nbf,nbf)).astype('complex') + q = zeros_like(k).astype('complex') + + dipole.append(buildDipole(molAtom, molBasis, density.real,'nuclear charge', 'aello')[axis]) + + time.append(cycle * timeIncrement) + HFenergy.append(energy) + field.append(pulse(cycle * timeIncrement, type=pulseType)) + + cycleDensity = orthoDensity.copy() + + #equation (14) - with reordering of terms, [] is line in (14), <> line in 15 + k[0] = h * (orthoFock + orthoField(cycle * timeIncrement)) + q[0] = k[0] + l = k[0] * 0.5 + u = expm(l) #[2] + orthoFock, orthoDensity = updateState(u, cycleDensity) + + k[1] = h * (orthoFock + orthoField((cycle+0.5) * timeIncrement)) + q[1] = k[1] - k[0] #[4] + l = 0.5 * q[0] + 0.25 * q[1] #[3] + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + k[2] = h * (orthoFock + orthoField((cycle+0.5) * timeIncrement)) + q[2] = k[2] - k[1] #[2] + l = q[0] + q[1] + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + k[3] = h * (orthoFock + orthoField((cycle+1.0) * timeIncrement)) + q[3] = k[3] -2.0 * k[1] + k[0] #[6] + l = 0.5 * q[0] + 0.25 * q[1] + q[2]/3.0 - q[3]/24.0 - commutator(q[0], q[1])/48.0 #<1> + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + k[4] = h * (orthoFock + orthoField((cycle+0.5) * timeIncrement)) + q[4] = k[4] - k[1] + l = q[0] + q[1] + 2.0 * q[2]/3.0 + q[3]/6.0 - commutator(q[0], q[1]) /6.0 #[7] + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + k[5] = h * (orthoFock + orthoField((cycle+1.0) * timeIncrement)) + q[5] = k[5] - 2.0 * k[1] + k[0] #<3> + l = q[0] + q[1] + 2.0 * q[4]/3.0 + q[5]/6.0 - commutator(q[0], q[1]-q[2]+q[4]+0.5*q[5])/6.0 #<4> + u = expm(l) + orthoFock, orthoDensity = updateState(u, cycleDensity) + + #unorthogonalise for energy calculation + fock = dot(U.T, dot(orthoFock, U)) + density = dot(X, dot(orthoDensity, X.T)) + energy = updateEnergy(molAtom, molBasis, fock, density) + + return time, HFenergy, dipole, field + + def tdhfFile(ft,fe, fd, ff, fs): + #write time and dipole to file + + from numpy import savez + fileName = molData['name'] + '-' + molData['basis'] + '-tdhf.npz' + savez(fileName, p =[fs, units[0], units[1], pulseType, fieldStrength, timeIncrement, iterations, direction], \ + t = ft,e = fe, d = fd, f= ff) + + #|-------------------------------------main-------------------------------------| + + if not 'noplot' in do: + import matplotlib.pyplot as plt + plt.grid() + plt.title(molData['name'] + ' (' + molData['basis'] + ')') + plt.xlabel('time (' + units[0] + ')') + plt.ylabel(direction + '-dipole (' + units[1] + ')') + + #call Magnus 2nd order + if '2' in do: + if reset: initialise() + reset = not reset + + t, e, d, f = magnus2(h, orthoFock, orthoDensity, density) + if units[0] == 'fs': t = array(t) * getConstant('atu->femtosecond') + if units[1] == 'debye': d = array(d) * getConstant('au->debye') + if not 'noplot' in do: plt.plot(t,d,'r',label='Magnus2', linewidth=0.1) + + if 'file[2]' in do: tdhfFile(t, e, d, f, '2') + + #call Magnus 4th order + if '4' in do: + if reset: initialise() + reset = not reset + + t, e, d, f = magnus4(h, orthoFock, orthoDensity, density) + if units[0] == 'fs': t = array(t) * getConstant('atu->femtosecond') + if units[1] == 'debye': d = array(d) * getConstant('au->debye') + if not 'noplot' in do: plt.plot(t,d,'k',label='Magnus4', linewidth=0.2) + + if 'file[4]' in do: tdhfFile(t, e, d, f, '4') + + if not 'noplot' in do: + plt.legend(loc=1) + plt.show() + + return array(t), array(e), array(d), array(f) + +#reference for Pade: Accelerated Broadband Spectra Using Transition Dipole Decomposition +#and Pade Approximants - Bruner, LaMaster and Lopata + +def pade(a, b, w): + #Compute Pade approximant via extended Euclidean algorithm for + #polynomial greatest common divisor - ref equations (28)(29) + + sp = 0.0 + sq = 0.0 + n = len(a) + + #evaluate power series + for i in range(n): + sp += a[i] * pow(w, n-1-i) + for i in range(n): + sq += b[i] * pow(w, n-1-i) + + return sp / sq + + +def toeplitz(type, col, row = 0): + #Toeplitz manipulations - 'make' and 'lower triangular' + + n = len(col) + toeplitz = zeros((n,n)) + + if all(row) == 0: row = col + + if type == 'make': + for i in range(n): + for j in range(n-i): + toeplitz[j, i+j] = row[i] + toeplitz[i+j, j] = col[i] + + if type == 'Ltri': + for i in range(1,n): + for j in range(n-i): + toeplitz[i+j, j] = col[i] + + return toeplitz + +def solveSpectrum(x, y, options): + #solve for spectrum, ref equations (30)-(35) + + dampFactor, maxPoints, elimit, eticks = options + + #zero at t=0, y[0] = 0 ! + y -= y[0] + + #apply damping - Lorentzian shape + step = x[1] - x[0] + damping = exp(-(step*arange(len(y)))/float(dampFactor)) + y *= damping + + #diagonal Pade scheme + n = len(y)//2 + if n > maxPoints: n = maxPoints + + #generate vector and limit points + X = -y[n+1:2*n] + + #compute Toeplitz matrix [n-1, n-1] and solve + A = toeplitz('make', y[n:2*n-1], y[n:1:-1]) + try: + b = solve(A,X) + except: + exit('singular matrix - no field') + + #[1, [n-1]] -> [n] column vector + b = hstack((1.0,b)) + + #v[n]*toeplitz[n,n] a strictly lower triangular matrix + a = dot(toeplitz('Ltri',y[0:n]),b) + + #frequency range + frequency = arange(0.0 ,elimit ,eticks) + + w = exp(-1j*frequency*step) + + #Pade approximant via extended Euclidean algorithm + fw = pade(a, b, w) + + return fw, frequency + +def getSpectrum(time, dipole, options): + #solve from spectra + + spd , frequency = solveSpectrum(time, dipole, options[:4]) + + #get return spectrum type real, imaginary or absolute + type = options[4] + if type == 'r': + omega = spd.real + elif type == 'i': + omega = spd.imag + elif type == 'a': + omega = abs(spd) + + #absorption formula + field = options[5] + spectrum = (4.0*pi*getConstant('alpha')*frequency*(omega))/field + + return spectrum, frequency + +def getPeaks(spectrum, frequency, tolerance): + #find the peaks in the spectrum aove tolerance + + from scipy.signal import argrelmax as pks + + extrema = pks(abs(spectrum)) + + #apply tolerance + idx = where((abs(spectrum[extrema]) >= tolerance)) + jdx = extrema[0][idx[0]] + + nPeaks = len(jdx) + peaks = zeros(nPeaks) + for i in range(nPeaks): + peaks[i] = frequency[jdx][i] + + return peaks + +def TDHFproperties(molAtom, molBasis, charge, c, fock, ERI, method, TDHFdata): + #compute a dictionary of TD properties + + def integral(type, molAtom, molBasis, co, cv): + #compute the required property integral + + a = zeros((3, nBasis, nBasis)) + axes = ['x', 'y', 'z'] + + if type == 'dipole': + #electric transition dipole in length gauge + for i, axis in enumerate(axes): + a[i] = -dipoleComponent(molAtom, molBasis, axis, 'nuclear charge') + + elif type == 'nabla': + #electric transition dipole in velocity gauge + for i, axis in enumerate(axes): + a[i] = buildNabla(molAtom, molBasis, axis) + + elif type == 'angular': + #magnetic transition dipole in length gauge + for i, axis in enumerate(axes): + a[i] = buildAngular(molAtom, molBasis, axis, 'origin') + + aMO = [] + for i in range(3): + aMO.append(kron(dot(co.T, dot(a[i], cv)), eye(2))) + + return array(aMO) + + #only tamm-dancoff at moment + if method != 'tamm-dancoff': return {} + + [nOccupied, nVirtual, roots] = TDHFdata + + #get excited states + e, v = randomPhaseApproximation(molAtom, charge, molBasis, c, fock, ERI, method) + + #get shaping matrices + co = c[:,:nOccupied] + cv = c[:,nOccupied:] + + #get singlets + ciMultiplicity = ciDegeneracy(e) + i = 0 + for j, mult in enumerate(ciMultiplicity): + if 's' in mult: + v[:,i] = v[:, where(e == mult[0])[0][0]] + e[i] = mult[0] + + i +=1 + + properties = [] + responses = {'excitation energy' : 0, 'electric transition dipole (length gauge)' : [], 'oscillator strength (length gauge)' : 0, \ + 'electric transition dipole (length gauge)' : [], 'oscillator strength (length gauge)' : 0 ,\ + 'magnetic transition dipole (length gauge)' : [], 'rotatory strength (length gauge)' : 0, 'rotatory strength (velocity gauge)' : 0 } + + nBasis = c.shape[0] + + muMO = integral('dipole', molAtom, molBasis, co, cv) + nabMO = integral('nabla', molAtom, molBasis, co, cv) + angMO = integral('angular', molAtom, molBasis, co, cv) + + #get properties for each root + for root in range(roots): + + responses['excitation energy'] = e[root] + + alpha = v[:, root].reshape(2*nOccupied, 2*nVirtual) + + #electric transition dipole (length) + tdm = [] + for i in range(3): + tdm.append(sum(alpha * muMO[i])) + + responses['electric transition dipole (length gauge)'] = tdm + + #oscillator strength (length) + responses['oscillator strength (length gauge)'] = 2 * e[root] * sum(array(tdm)**2)/3 + + #electric transition dipole (velocity) + tdm = [] + for i in range(3): + tdm.append(sum(alpha * nabMO[i])) + responses['electric transition dipole (velocity gauge)'] = tdm + + #oscillator strength (length) + responses['oscillator strength (velocity gauge)'] = 2 / (3 * e[root]) * sum(array(tdm)**2) + + #magnetic transition dipole (velocity) + tdm = [] + for i in range(3): + tdm.append(0.5 * sum(alpha * angMO[i])) + responses['magnetic transition dipole (length gauge)'] = tdm + + #rotatory strengths + responses['rotatory strength (length gauge)'] = sum(array(responses['electric transition dipole (length gauge)']) * \ + array(responses['magnetic transition dipole (length gauge)'])) + + responses['rotatory strength (velocity gauge)'] = -sum(array(responses['electric transition dipole (velocity gauge)']) * \ + array(responses['magnetic transition dipole (length gauge)']) ) / \ + responses['excitation energy'] + + properties.append(responses.copy()) + + return properties + +def TDHFspectrum(spectrum): + #compute the opa or ecd convolutions and bars + + def profile(p, d = None, mode = 'wave'): + #compute the waveform profile + + if spectrum['units'] == 'nm': + g = lambda x : (x * x * spectrum['gamma'] * getConstant('Eh')) / (getConstant('planck') * getConstant('c') * 1e7) + elif spectrum['units'] == 'eV': + g = lambda x: spectrum['gamma'] * getConstant('hartree->eV') + + if spectrum['shape'] == 'gaussian': + + if mode == 'max': return 2.0 / (g(p) * sqrt(2.0 * pi)) + + factor = 2.0 / (g(p) * sqrt(2.0 * pi)) + exponent = -2.0 * ((d - p) / g(p))**2 + + return factor * exp(exponent) + + elif spectrum['shape'] == 'lorentzian': + + if mode == 'max': return 2.0 / (pi * g(p)) + + factor = 1.0 / pi + + return factor * g(p) * 0.5 / ((d - p)**2 + (g(p) * 0.5)**2) + + def prefactor(): + #calculate the prefactor for the residue expression + + + units = {'au to Coulomb cm' : getConstant('e') * getConstant('bohr->cm') * 100, \ + 'au to Joules inverse Tesla' : 2.0 * getConstant('bohr magneton') * 100 } + + if spectrum['type'] == 'opa': + conversion = units['au to Coulomb cm'] * units['au to Coulomb cm'] + return 8.0 * pow(pi, 3.0) * getConstant('avogadro') * conversion / \ + (3.0 * 1000 * log(10) * (4.0 * pi * getConstant('electric constant')) * \ + (getConstant('c')/100) * getConstant('planck')) + + if spectrum['type'] == 'ecd': + conversion = units['au to Coulomb cm'] * units['au to Joules inverse Tesla'] + return 32.0 * pow(pi, 3.0) * getConstant('avogadro') * conversion/ \ + (3.0 * 1000 * log(10) * (4.0 * pi * getConstant('electric constant')) * \ + pow(getConstant('c')/100, 2.0) * getConstant('planck')) + + #set defaults + defaults = [['type','opa'],['shape','gaussian'],['units','nm'],['points',5000],['gamma',0.02]] + for default in defaults: + spectrum.setdefault(default[0],default[1]) + + #get poles and residues + poles = array([sub['excitation energy'] for sub in spectrum['data']]) + if spectrum['type'] == 'opa': + residues = array([norm(sub['electric transition dipole (length gauge)'])**2 for sub in spectrum['data']]) + transform = lambda x: x*x + elif spectrum['type'] == 'ecd': + residues = array([sub['rotatory strength (length gauge)'] for sub in spectrum['data']]) + transform = lambda x: x + + #units - 'c' in cm, m->nm + units = spectrum['units'] + if units == 'nm': + unitFactor = getConstant('c') * getConstant('planck') * 1e7 / getConstant('Eh') + poles = unitFactor/poles + if units == 'eV': + unitFactor = getConstant('hartree->eV') + poles *= unitFactor + + #pole axis + margin = (max(poles) - min(poles)) * 0.2 + x = linspace(min(poles) - margin, max(poles) + margin, spectrum['points']) + + #get prefactors + multiplier = prefactor() + + #residues axis + y = multiplier * x * sum([transform(r) * profile(p, d=x, mode='wave') for p, r in zip(poles, residues)], axis=0) + + #bars + bars = multiplier * array([p * transform(r) * profile(p, mode='max') for p, r in zip(poles, residues)]) + + return {'x' : x, 'y' : y, 'poles' : poles, 'bars' : bars} + +def td_ccsd(molAtom, molBasis, ts, td, ls, ld, ims, fockMOspin, eriMOspin, run, metrics): + #time-dependent coupled-cluster singles and doubles Nascimento-2016 (see md file) + + interval, cycles, polarization = run + spinOrbitals, nElectrons = metrics + + #get spin MO dipole + from post import dipoleComponent + + mu = dipoleComponent(molAtom, molBasis, polarization, 'origin') + muMOspin = buildFockMOspin(spinOrbitals, rhf.C, mu) + + #we have full spin dimensioned arrays rather than sliced o,v + dipoleTrace = trace(muMOspin[:nElectrons, :nElectrons]) + + #right dipole function #[18] + rightHandFunction = [] + rightHandFunction.append(dipoleTrace) + rightHandFunction.append(muMOspin) + rightHandFunction.append(zeros_like(ld)) + + #left dipole function + leftHandFunction = [] + lhf = dipoleTrace + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + lhf += muMOspin[i,a] * ls[i,a] + leftHandFunction.append(lhf) + + lhf = muMOspin + dipoleTrace *ls + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for e in range(nElectrons, spinOrbitals): + lhf[i,a] += muMOspin[e,a] * ls[i,e] + for m in range(0, nElectrons): + lhf[i,a] -= muMOspin[i,m] * ls[m,a] + for e in range(nElectrons, spinOrbitals): + lhf[i,a] += ld[i,m,a,e] * muMOspin[e,m] + leftHandFunction.append(lhf) + + lhf = dipoleTrace * ld + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + lhf[i,j,a,b] += ls[i,a] * muMOspin[j,b] - ls[i,b] * muMOspin[j,a] - \ + ls[j,a] * muMOspin[i,b] + ls[j,b] * muMOspin[i,a] + for e in range(nElectrons, spinOrbitals): + lhf[i,j,a,b] += ld[i,j,e,b] * muMOspin[e,a] - ld[i,j,e,a] * muMOspin[e,b] + for m in range(0, nElectrons): + lhf[i,j,a,b] += -muMOspin[i,m] * ld[m,j,a,b] + muMOspin[j,m] * ld[m,i,a,b] + leftHandFunction.append(lhf) + + #get explicit lambda intermediates - put back diagonals + fae, fmi, fme, wmnij, wabef, wmbej, wmnie, wamef, wmbij, wabei = ims + fae += fockMOspin[:, :] + fmi += fockMOspin[:, :] + + def dtRightDipoleFunction0(mr1, mr2): + #time derivative of rightHandFunction[0] #[24] + + dt = 0.0 + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + dt += mr1[i,a] * fae[i,a] + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + dt += 0.25 * mr2[i,j,a,b] * eriMOspin[i,j,a,b] + return dt * -1j + + def dtRightDipoleFunction1(mr1, mr2): + #time derivative of rightHandFunction[1] #[25] + #x is offset because dipole function is [o,v] not [s,s] + + dt = zeros_like(mr1, dtype=complex) + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + dt[i,a] += mr1[i,b] * fae[a,b] + for j in range(0, nElectrons): + dt[i,a] += mr1[j,b] * wmbej[j,a,b,i] + dt[i,a] += mr2[i,j,a,b] * fme[j,b] + for k in range(0, nElectrons): + dt[i,a] -= 0.5 * wmnie[j,k,i,b] * mr2[j,k,a,b] + for c in range(nElectrons, spinOrbitals): + dt[i,a] += 0.5 * mr2[i,j,b,c] * wamef[a,j,b,c] + for j in range(0, nElectrons): + dt[i,a] -= fmi[j,i] * mr1[j,a] + return dt * -1j + + def dtRightDipoleFunction2(mr1, mr2): + #time derivative of rightHandFunction[2] #[26]+ccsd terms + + #intermediates + ia = zeros_like(mr1) + ic = zeros_like(mr1) + for m in range(0, nElectrons): + for n in range(0, nElectrons): + for i in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + ia[i,m] += mr1[n,e] * wmnie[m,n,i,e] + for f in range(nElectrons, spinOrbitals): + ic[i,m] += 0.5 * mr2[i,n,e,f] * eriMOspin[m,n,e,f] + + ib = zeros_like(mr1) + id = zeros_like(mr1) + for a in range(nElectrons, spinOrbitals): + for m in range(0, nElectrons): + for e in range(nElectrons, spinOrbitals): + for f in range(nElectrons, spinOrbitals): + ib[a,e] -= mr1[m,f] * wamef[a,m,e,f] + for n in range(0, nElectrons): + id[a,e] += 0.5 * mr2[m,n,a,f] * eriMOspin[m,n,e,f] + + dt = zeros_like(mr2, dtype=complex) + for i in range(0, nElectrons): + for j in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + for b in range(nElectrons, spinOrbitals): + for m in range(0, nElectrons): + dt[i,j,a,b] += mr1[m,b] * wmbij[m,a,i,j] - mr1[m,a] * wmbij[m,b,i,j] + dt[i,j,a,b] += mr2[j,m,a,b] * fmi[m,i] - mr2[i,m,a,b] * fmi[m,j] + dt[i,j,a,b] += ic[i,m] * td[a,b,j,m] - ic[j,m] * td[a,b,i,m] + dt[i,j,a,b] += ia[i,m] * td[a,b,j,m] - ia[j,m] * td[a,b,i,m] + for n in range(0, nElectrons): + dt[i,j,a,b] += 0.5 * mr2[m,n,a,b] * wmnij[m,n,i,j] + for e in range(nElectrons, spinOrbitals): + dt[i,j,a,b] += -mr1[j,e] * wabei[a,b,e,i] + mr1[i,e] * wabei[a,b,e,j] + dt[i,j,a,b] += mr2[i,j,a,e] * fae[b,e] - mr2[i,j,b,e] * fae[a,e] + dt[i,j,a,b] += ib[a,e] * td[b,e,i,j] - ib[b,e] * td[a,e,i,j] + dt[i,j,a,b] += id[a,e] * td[b,e,i,j] - id[b,e] * td[a,e,i,j] + for m in range(0, nElectrons): + dt[i,j,a,b] += mr2[m,j,a,e] * wmbej[m,b,e,i] - mr2[m,j,b,e] * wmbej[m,a,e,i] - \ + mr2[m,i,a,e] * wmbej[m,b,e,j] + mr2[m,i,b,e] * wmbej[m,a,e,j] + for f in range(nElectrons, spinOrbitals): + dt[i,j,a,b] += 0.5 * mr2[i,j,e,f] * wabef[a,b,e,f] + + return dt * -1j + + + M = [] + for i in range(3): + M.append(rightHandFunction[i] + 1j * 0.0) + dt = [dtRightDipoleFunction0, dtRightDipoleFunction1, dtRightDipoleFunction2] + + #list of results + time = [] + dipoles = [] + + #begin time propogation using Runge-Kutta(4th order) + for cycle in range(cycles): + + t = cycle * interval + + #step 1 + k = [[], [], [], []] + for i in range(3): + k[0].append(dt[i](M[1], M[2])) + + next = [] + for i in range(3): + next.append(M[i] + 0.5 * interval * k[0][i]) + + #steps 2,3,4 + for j in range(1,4): + f = 0.5 + for i in range(3): + k[j].append(dt[i](next[1], next[2])) + if j == 3 : break + if j == 2 : f = 1.0 + for i in range(3): + next[i] = M[i] + f * interval * k[j][i] + + #re-compute dipole function at time + interval + for j in range(3): + M[j] += (interval/6) * (k[0][j] + 2.0 * k[1][j] + 2.0 * k[2][j] + k[3][j]) + + #compute autocorrelation function for this step [13] + autoCorrelation = leftHandFunction[0] * M[0] + for i in range(0, nElectrons): + for a in range(nElectrons, spinOrbitals): + autoCorrelation += leftHandFunction[1][i,a] * M[1][i,a] + for j in range(0, nElectrons): + for b in range(nElectrons, spinOrbitals): + autoCorrelation += 0.25 * leftHandFunction[2][i,j,a,b] * M[2][i,j,a,b] + + time.append(t) + dipoles.append(autoCorrelation) + + return time, dipoles diff --git a/source/uhf.py b/source/uhf.py new file mode 100644 index 0000000..1f6577d --- /dev/null +++ b/source/uhf.py @@ -0,0 +1,255 @@ +from __future__ import division +#import system modules +import numpy as np +from scipy.linalg import fractional_matrix_power as fractPow +from numpy.linalg import eigh, solve, LinAlgError +import sys +#import class modules +from atom import atom, nuclearRepulsion, getConstant +from basis import checkBasis, buildBasis, electronCount +#import user modules +from post import buildDipole +from view import geometry, orbitals, pre, preSCF, SCF, postSCF, post, uhfOrbitals +from integral import buildOverlap, buildKinetic, buildCoulomb, buildEri, \ + buildHamiltonian, iEri, expandEri +from diis import diis_f + +def getOccupancy(e, orbitals, nBasis): + #make occupancy lists + + occupancy = np.zeros((2,nBasis)) + + for spin in range(2): + idx = np.argsort(e[spin]) + + occupancy[spin][idx[:orbitals[spin]]] = 1 + + return occupancy + +def buildUnrestrictedFock(H, eri, cycle, density): + #the unrestricted spin Fock matrices + + nBasis = H.shape[0] + n = nBasis + fock = np.array([H, H]) + + #initial guess for each spin is core Hamiltonian + if cycle == 0: + return fock + + fock[0] += np.einsum('rs,pqrs->pq', density[0], eri, optimize=True) - np.einsum('rs,psrq->pq', density[0], eri, optimize=True) + fock[0] += np.einsum('rs,pqrs->pq', density[1], eri, optimize=True) + fock[1] += np.einsum('rs,pqrs->pq', density[1], eri, optimize=True) - np.einsum('rs,psrq->pq', density[1], eri, optimize=True) + fock[1] += np.einsum('rs,pqrs->pq', density[0], eri, optimize=True) + + return fock + +def buildUnrestrictedDensity(c, orbitals): + #alpha and beta spin density matrices + + nBasis = c[0].shape[0] + density = np.zeros((2, nBasis, nBasis)) + + for spin in range(2): + density[spin] = np.einsum('pr,qr->pq', c[spin][:, :orbitals[spin]], c[spin][:, :orbitals[spin]], optimize=True) + return density + +def rmsDensity(density, preDensity): + #compute RMS of density matrix + + return np.sqrt(np.mean(np.square(density - preDensity))) + + +def rebuildCenters(molAtom, molBasis, geo): + #a change of geometry means atom.center and basis.center need updating + for atom in range(0, len(molAtom)): + molAtom[atom].center = geo[atom, :] + + for basis in range(0, len(molBasis)): + if molBasis[basis].atom == atom: + molBasis[basis].center = geo[atom, :] + + return molAtom, molBasis + +def scf(molAtom, molBasis, run, show): + + global density_total, c, occupancy + + #options + name, basisName, diisStatus, integralEngine, gaugeOrigin, hamiltonianGuess, charge, multiplicity, \ + iterations, diisCapacity, convergence, uhfmix, p, _, _, _, _ = run.values() + + #pre-SCF matrices - S{overlap} T{1e kinetic/exchange/resonance} V{1e Coulomb} ERI(2e electron repulsion) + if integralEngine == 'native': + S = buildOverlap(molBasis) + T = buildKinetic(molBasis) + V = buildCoulomb(molAtom, molBasis) + ERI = buildEri(molBasis) + elif integralEngine == 'aello': + from aello import aello + S, T, V, ERI = aello(molAtom, molBasis) + + coreH, initialFock = buildHamiltonian(hamiltonianGuess,S,T,V) + + nBasis = S.shape[0] + ERI = expandEri(ERI, nBasis) + + density = np.zeros((2, nBasis, nBasis)) + + #orthogonalise matrix X + X = np.zeros((nBasis, nBasis)) + X = fractPow(S, -0.5) + + #check multiplicity valid for electron count + electrons = electronCount(molAtom, charge) + + unpaired = (multiplicity - 1) + paired = electrons - unpaired + + if ((paired + unpaired) != electrons): + print('multiplicity not compatible') + post(False) + sys.exit('multiplicity not compatible') + + #alpha and beta spin orbital counts + orbitals = [(electrons - unpaired)//2 + unpaired, (electrons - unpaired)//2] + if 'orbitals' in show: + uhfOrbitals(orbitals[0], orbitals[1], multiplicity) + + #define storage for diis + if diisStatus == 'on': + diis = diis_f(diisCapacity) + + #SCF loop + for cycle in range(iterations): + + #build fock matrices and orthogonalise + if cycle == 0: + fock = buildUnrestrictedFock(initialFock, ERI, cycle , density) + else: + fock = buildUnrestrictedFock(coreH, ERI, cycle , density) + + #do diis if selected + if (cycle != 0) and (diisStatus == 'on'): + fock = diis.build(fock, density, S, X) + + #compute SCF energy + energy = 0.0 + for i in range(0, len(molBasis)): + for j in range(0, len(molBasis)): + energy += 0.5 * density[0][i,j] * (fock[0][i,j] + coreH[i,j]) + for i in range(0, len(molBasis)): + for j in range(0, len(molBasis)): + energy += 0.5 * density[1][i,j] * (fock[1][i,j] + coreH[i,j]) + + #orthogonalise fock matrix + e = np.zeros((2, nBasis)) + c = np.zeros_like(density) + for spin in range(2): + orthogonal_fock = np.dot(X.T, np.dot(fock[spin], X)) + e[spin] , orthogonal_c = eigh(orthogonal_fock) + c[spin] = np.dot(X, orthogonal_c) + + #break symmetry + if (orbitals[0] == orbitals[1]) and (cycle == 0): + #mix the AOs (rows) + cHOMO = c[0][orbitals[0]-1,:] + cLUMO = c[0][orbitals[0],:] + c[0][orbitals[0]-1,:] = 1.0/((1 + uhfmix**2))**0.5*(cHOMO + uhfmix*cLUMO) + c[0][orbitals[0],:] = 1.0/((1 + uhfmix**2))**0.5*(-uhfmix*cHOMO + cLUMO) + + #calculate densities over occupied MO + occupancy = getOccupancy(e, orbitals, nBasis) + density = buildUnrestrictedDensity(c, orbitals) + + #convergence control + if cycle != 0: + deltaEnergy = abs(preEnergy - energy) + if 'SCF' in show: + SCF(energy, deltaEnergy, (rmsDensity(density[0], preDensity[0]) + rmsDensity(density[1], preDensity[1]))*0.5 ,\ + cycle, diisStatus, iterations, convergence) + + if (deltaEnergy < convergence) and (rmsDensity(density[0], preDensity[0]) < convergence) \ + and (rmsDensity(density[1], preDensity[1]) < convergence) : + break + + preEnergy = energy + preDensity = density + + #if failed to converge exit with messages + if cycle == iterations: + print('SCF failed to converge in ' + str(cycle) + ' iterations') + if diisStatus == 'off': print('Try diis = \'on\'') + + post(False) + sys.exit('convergence failure') + + #final eigensolution of final Fock matrix are orbital energies (e) and MO coefficients(C) + totalEnergy = energy + nuclearRepulsion(molAtom) + + #spin analysis + spinMatrix = np.dot(c[1][:, :orbitals[1]].T, np.dot(S, c[0][:, :orbitals[0]])) + spinContamination = orbitals[1] - np.vdot(spinMatrix, spinMatrix) + density_total = density[0] + density[1] + spin_density = density[0] - density[1] + + def spinSquare(c, occupancy, S): + #compute + + #get occupied molecular eigenvectors + cOccupied = [c[0]*occupancy[0], c[1]*occupancy[1]] + moOccupied = [cOccupied[0][:,~np.all(cOccupied[0]==0, axis=0)], cOccupied[1][:,~np.all(cOccupied[1]==0, axis=0)]] + nOccupied = [moOccupied[0].shape[1], moOccupied[1].shape[1]] + + #components of total spin + spin = np.dot(moOccupied[0].T, np.dot(S, moOccupied[1])) + spin_xy = (nOccupied[0] + nOccupied[1]) * 0.5 - np.einsum('ij,ij->', spin, spin) + spin_z = (nOccupied[0] - nOccupied[1])**2 * 0.25 + spin_total = (spin_xy + spin_z) + + multiplicity = np.sqrt(spin_total + 0.25) - 0.5 + + return spin_total, multiplicity*2 + 1 + + total_spin, multiplicity = spinSquare(c, occupancy, S) + + if 'SCF' in show: + postSCF([totalEnergy, cycle, energy],'uhf') + + if 'postSCF' in show: + postSCF([e[0], e[1], density_total, spin_density, total_spin, spinContamination, multiplicity], 'uhf-post') + + if 'ch' in p: + population = [] + population.append(np.einsum('ij,ji->i', density[0], S, optimize=True)) + population.append(np.einsum('ij,ji->i', density[1], S, optimize=True)) + + mulliken = [] + atomCharge = np.zeros((2,len(molAtom))) + atomSpinCharge = np.zeros(atomCharge.shape[1]) + totalCharge = np.zeros(2) + + for spin in range(2): + for i in range(population[spin].shape[0]): + mulliken.append([molBasis[i].symbol, molAtom[molBasis[i].atom].id, round(population[spin][i],6)]) + atomCharge[spin][molBasis[i].atom] += round(population[spin][i],6) + totalCharge[spin] += population[spin][i] + + spinPopulation = np.einsum('ij,ji->i', spin_density, S) + for i in range(spinPopulation.shape[0]): + atomSpinCharge[molBasis[i].atom] += spinPopulation[i] + + atoms = [] + for atom in molAtom: + atoms.append([atom.id, atom.number]) + + postSCF([nBasis, mulliken, totalCharge, atomCharge, atoms, spinPopulation, atomSpinCharge], 'uhf-mull') + + if 'di' in p: + import aello + dipoles = buildDipole(molAtom, molBasis, density_total*0.5, gaugeOrigin) + + #clean up outfile + post() + + return totalEnergy \ No newline at end of file diff --git a/source/view.py b/source/view.py new file mode 100644 index 0000000..1e2a7fb --- /dev/null +++ b/source/view.py @@ -0,0 +1,1051 @@ +from __future__ import division +from atom import weight, seperation, angle, oopAngle, dihedral, massCenter, bondMatrix, \ + inertiaTensor, principalMoments, rotor, rotationalConstants, symbol, \ + nuclearRepulsion, getConstant, isBond, covalentRadius +from basis import electronCount, orbitalType, aufbau +from integral import iEri +from numpy import sqrt, zeros, linspace, sum +import math +import matplotlib.pyplot as py + +def delimiter(f): + #horizontal line + f.write('

') + +def pre(name, type): + + # open HTML output file and write and \n\n') + # start + f.write('\n') + f.write('\t

') + f.write('\tHARPY ' + type.upper() + ' output for ' + name + '

') + f.close() + +def geometry(atoms): + + f = open('harpy.html','a') + # start ATOMS section======================================================================================================== + f.write('\n\t

atoms

\n') + f.write('\t

number of atoms is ' + str(len(atoms)) + '

') + # list in input data + f.write('\n\n\t\n\t\t') + f.write('\n\t\t') + for i in range(0, len(atoms)): + f.write('\n\t\t',) + for j in range(0,3): + f.write('',) + f.write('') + f.write('\n\t
atomic input data
idnumberxyzweight
' + str(i+1) + '' + atoms[i].id + '' + str(atoms[i].number) + '' + str(atoms[i].center[j]) + '' + str(weight[atoms[i].number-1]) + '
') + + # bond lengths + if len(atoms) != 1: + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0, len(atoms)): + for j in range(i+1, len(atoms)): + # only seperation under 4 bohr + if isBond(atoms, i, j): + d = seperation(atoms,i,j) + f.write('\n\t\t') + f.write('\n\t
interatom seperations
atomsd (bohr)
' + atoms[i].id + '-' + atoms[j].id + '' + str(round(d,3)) + '
') + + # angles + if len(atoms) > 2: + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0, len(atoms)): + if sum(bondMatrix(atoms)[i,:]) <= 1: + continue + for j in range(i+1, len(atoms)): + if isBond(atoms,i,j): + for k in range(j+1, len(atoms)): + if k!=j and isBond(atoms,i,k): + f.write('\n\t\t') + f.write('\n\t
interatom angles
atomsangle
' + atoms[j].id + '-' + atoms[i].id + '-' + atoms[k].id + \ + '' + str(round(angle(atoms,j,i,k),2)) + '
') + + #out-of-plane angles + if len(atoms) > 3: + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0, len(atoms)): + for k in range(0, len(atoms)): + for j in range(0, len(atoms)): + for l in range(0, j): + if (i!=j) and (i!=k) and (i!=l) and (j!=k) and (k!=l): + if isBond(atoms,i,k) and isBond(atoms,k,j) and isBond(atoms,k,l) : + f.write('\n\t\t
out-of-plane angles
atomsangle
' + atoms[i].id + '-' + atoms[j].id + '-' + atoms[k].id + '-' + atoms[l].id + \ + '' + str(round(oopAngle(atoms,i,j,k,l),2)) + '') + f.write('\n\t
') + + #dihedral + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0, len(atoms)): + for j in range(0, i): + for k in range(0, j): + for l in range(0, k): + if (seperation(atoms,i,j) < 4) and (seperation(atoms,k,j) < 4) and (seperation(atoms,k,l) < 4): + f.write('\n\t\t
dihedral angles
atomsangle
' + atoms[i].id + '-' + atoms[j].id + '-' + atoms[k].id + '-' + atoms[l].id + \ + '' + str(round(dihedral(atoms,i,j,k,l),2)) + '') + f.write('\n\t
') + + #center of mass + f.write('\n\t
\n\t\n\t\t\n\t\t',) + com = massCenter(atoms) + for i in range(0, 3): + f.write('',) + f.write('\n\t
center of mass
xyz
' + str(round(com[i],3)) + '
') + + #connection matrix + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0,len(atoms)): + f.write('',) + f.write('') + bonds = bondMatrix(atoms) + for i in range(0, len(atoms)): + f.write('') + for j in range(0, len(atoms)): + if bonds[i,j] == 1: + f.write('') + else: + f.write('') + f.write('') + f.write('\n\t
inferred bonds
' + atoms[i].id + '
' + atoms[i].id + 'X
') + + #inertia tensor + tensor = inertiaTensor(atoms) + + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0,3): + f.write('\n\t\t') + f.write('\n\t
inertia tensor
xyz
' + str(round(tensor[i,0],6)) + '' + str(round(tensor[i,1],6)) + '' \ + + str(round(tensor[i,2],6))+ '
') + + #principal moments + pm = principalMoments(atoms) + + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t\n\t\t') + f.write('\n\t\t') + f.write('\n\t
principal moments (amu bohr2)
IaIbIc
' + str(round(pm[0],6)) + '' + str(round(pm[1],6)) + '' \ + + str(round(pm[2],6))+ '
') + + #rotor type + f.write('\n\t
\n\t
rotor type' + rotor(atoms) + '
') + + #rotational constants + rc = rotationalConstants(atoms) + + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t\n\t\t') + f.write('\n\t\t') + f.write('\n\t
rotational constants (g cm-1)
ABC
' + str(round(rc[0],4)) + '' + str(round(rc[1],4)) + '' \ + + str(round(rc[2],4))+ '
') + + #nuclear repulsion energy + f.write('\n\t
\n\t
nuclear repulsion energy' + str(round(nuclearRepulsion(atoms),8)) \ + + '
') + f.close() + +def orbitals(atoms, charge, multiplicity, name, bases, method): + f = open('harpy.html','a') + # start ORBITALS section======================================================================================================== + f.write('\n\t
\n\t

orbitals

\n') + + #number of electrons + f.write('\n\t
\n\t
number of electrons' + str(electronCount(atoms,charge)) + '
') + + #selected basis + f.write('\n\t
\n\t
basis set' + name + '
') + + #basis set information + h = open('../basis/' + name + '.gbf', 'r') + text='' + while True: + line = h.readline() + if line.strip() == '' or line[:2] == '!-' : + continue + if line.strip() == '****': + break + text += line[1:].lstrip() + '
' + h.close() + if text[0] == 'a': + text = 'C' + text + elif text[0] == 'p': + text = 'S' + text + + f.write('\n\t
\n\t
' + text + '
') + + if method == 'rhf': + #orbital information + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
orbital occupancy
number of basis functions' + str(len(bases)) + '
number doubly occupied orbitals' + str(int(electronCount(atoms,charge)/2)) + '
number of virtual orbitals' + str(len(bases) - int(electronCount(atoms,charge)/2)) + '
') + else: + alpha = electronCount(atoms,charge) - (multiplicity-1) + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
orbital spin occupancy
number of alpha orbitals' + str(alpha//2+(multiplicity-1)) + '
number of beta orbitals' + str(alpha//2) + '
multiplicity' + str(multiplicity) + '
') + + #atomic orbitals + f.write('\n\t
\n\t\n\t\t\n\t\t',) + if (i+1) % 4 == 0: + f.write('\n\t\t\n\t
atomic orbitals
') + for i in range(0, len(bases)): + type = orbitalType(bases[i].momentum) + + f.write('\n\t\t' + str(i+1) + '' + atoms[bases[i].atom].id + '' + \ + symbol[atoms[bases[i].atom].number-1] + '' + type[0] + '' + type[1:] + '
') + f.write('\n\t\t
') + + #aufbau occupancy + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t') + for i in range(0 , len(atoms)): + f.write('\n\t\t') + f.write('\n\t\t\n\t
aufbau atomic occupancies
idorbitals
' + str(i+1) + '' + atoms[i].id + '' + aufbau(atoms[i]) + '
') + + f.close() + +def uhfOrbitals(alpha, beta, multiplicity): + f = open('harpy.html','a') + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
orbital spin occupancy
number of alpha orbitals' + str(alpha) + '
number of beta orbitals' + str(beta) + '
multiplicity' + str(multiplicity) + '
') + f.close() + +def preSCF(S,K,J,ERI,U, FO, D, IE, guess): + f = open('harpy.html','a') + # start PRE-SCF section======================================================================================================== + f.write('\n\t
\n\t

pre-scf

\n') + f.write('\n\t
\n\t\n\t\t\n\t
initial fock guess',) + if guess == 'core': + f.write('core hamiltonian
') + elif guess == 'gwh': + f.write('generalised wolfsberg-helmholtz\n\t') + + showMatrix('overlap', S, f) + showMatrix('kinetic', K, f) + showMatrix('Coulomb', J, f) + + f.write('\n\t\n\t
') + f.write('\t\n\t\t') + f.write('\t\t\n\t\t') + + n = S.shape[0] + resume = True + count = 0 + totalEri = n*(n+1)*(n*n + n + 2)/8 + for i in range(0 , n): + for j in range(0 , n): + for k in range(0 , n): + for l in range(0 , n): + value = ERI[iEri(i,j,k,l)] + if abs(value) >= 1e-15: + f.write('\n\t\t\t') + count += 1 + if count == 30: + resume = False + break + if not resume: + break + if not resume: + break + if not resume: + break + f.write('\n\t\t\n\t
two electron repulsion integrals *
< i j | k l >
< ' + str(i+1) + ' ' + str(j+1) + ' | ' + str(k+1) + ' ' + str(l+1) + \ + ' >' + str(round(value, 6)) + '
') + f.write('\n\t\t

* non-zero integrals (total ' \ + + str(int(totalEri)) + ') first 30 shown

') + + showMatrix('S', U, f) + showMatrix('orthogonal initial Fock', FO , f) + showMatrix('initial density', D ,f) + + f.write('\n\t
\n\t
initial SCF electronic energy' + str(round(IE,8)) + '
') + + f.close() + +def SCF(e, de, dd, cycle, diis, iterations, convergence): + f = open('harpy.html','a') + # start SCF section======================================================================================================== + if cycle == 1: + f.write('\n\t
\n\t

scf

\n') + f.write('\n\t\t
iteration limit' + str(iterations) + '
convergence criterion' \ + + str(convergence) + '
') + f.write('\n\t

direct inversion of the iterative sub-space (diis) is ' \ + + diis + '

') + f.write('\n\t\n\t\t') + f.write('\n\t\t') + + else: + f.write('\n\t\t') + +def postSCF(data, type): + f = open('harpy.html','a') + # start post-SCF section======================================================================================================== + #close table from SCF section + if type == 'uhf': + f.write('\n\t
electronic energy (E)Δ(E)rms(D)
' + "%.10f" % (de - e) + '00
' + "%.10f" % (e) + '' + "%.6e" % (de) + '' + "%.6e" % (dd) + '
') + f.write('\n\t

SCF converged in ' + str(data[1]) + ' cycles

') + f.write('\n\t
\n\t',) + f.write('\n\t
\n\t
final scf electronic energy' + "%.10f" % (data[2]) + '
final scf total energy' + "%.10f" % (data[0]) + '
') + + if type == 'eigen': + f.write('\n\t') + f.write('\n\t

SCF converged in ' + str(data[1]) + ' cycles

') + + f.write('\n\t
\n\t

post-scf

\n') + f.write('\n\t
\n\t
final scf total energy' + "%.10f" % (data[0]) + '
') + f.write('\n\t
\n\t\n\t\t') + + for i in range(0, data[2].shape[0]): + f.write('\n\t\t') + f.write('') + for i in range(0, data[2].shape[0]): + f.write('\n\t\t') + f.write('\n\t
final orbital energies
' + str(i+1) + '
' + "%.6f" % (data[3][i]) + '
') + showMatrix('orbital coeffiecients', data[2], f, '%.6f') + showMatrix('final density matrix', data[4], f, '%.6f') + + if type == 'uhf-post': + f.write('\n\t
\n\t') + f.write('\n\t\t\n\t\t') + for i in range(0, data[0].shape[0]): + f.write('\n\t\t') + f.write('') + for i in range(0, data[0].shape[0]): + f.write('\n\t\t') + f.write('\n\t\t\n\t\t') + for i in range(0, data[1].shape[0]): + f.write('\n\t\t') + f.write('') + for i in range(0, data[1].shape[0]): + f.write('\n\t\t') + + f.write('\n\t
final orbital energies
alpha
' + str(i+1) + '
' + "%.6f" % (data[0][i]) + '
beta
' + str(i+1) + '
' + "%.6f" % (data[1][i]) + '
') + showMatrix('total density matrix',data[2],f, '%.6f') + showMatrix('spin density matrix',data[3 ],f, '%.6f') + + f.write('\n\t

<S2> is ' \ + + str(round(data[4],6))) + f.write('\n\t

spin contamination is ' \ + + "%.6f" % data[5]) + f.write('\n\t

multiplicity is ' \ + + "%.6f" % data[6]) + + if type == 'uhf-mull': + f.write('\n\t

\n\t') + f.write('\n\t\t') + for i in range(data[0]): + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
mulliken population analysis
atomorbitalαβspin density
' + data[1][i][1] + '' + data[1][i][0] + '' + str(data[1][i][2]) + \ + '' + str(data[1][i+data[0]][2]) + '' + str(round(data[5][i],6)) + '
Σ' + str(round(data[2][0])) + '' + str(round(data[2][1])) + '' + \ + str(round(sum(data[5]),6)) + '
') + + f.write('\n\t

\n\t') + f.write('\n\t\t') + for i in range(data[3].shape[1]): + f.write('\n\t\t') + f.write('\n\t
reduced to atomic centers
atomαβα+βchargespin density
' + data[4][i][0] + '' + str(round(data[3][0][i],6)) + '' + str(data[3][1][i]) + \ + '' + str(round(data[3][0][i]+data[3][1][i],6)) + '' + str(round(data[4][i][1] - \ + data[3][0][i]-data[3][1][i],6)) + '' + str(round(data[6][i],6)) +'
') + + + if type == 'mulliken': + delimiter(f) + f.write('\n\t') + f.write('\n\t') + f.write('') + for i in range(0, len(data[1])): + f.write('',) + f.write('') + for i in range(0, len(data[3])): + f.write('',) + f.write('') + for i in range(0, len(data[3])): + f.write('',) + + if type == 'lowdin': + f.write('') + for i in range(0, len(data[0])): + f.write('',) + f.write('') + for i in range(0, len(data[0])): + f.write('',) + + f.write('\n\t
charge analysis
orbitalatomdensity
Mulliken
' + str(i+1) + '' + data[3][data[1][i].atom].id + '' \ + + str(round(data[0][i], 4)) + '
reduced To atoms centers
' + data[3][i].id + '' \ + + str(round(data[2][i], 4)) + '
corrected for charge
' + data[3][i].id + '' \ + + str(round(-data[2][i] + data[3][i].number, 4)) + '
' + type[0].upper() + type[1:] + '
' + data[1][i].id + '' \ + + str(round(data[0][i], 4)) + '
corrected for charge
' + data[1][i].id + '' \ + + str(round(-data[0][i] + data[1][i].number, 4)) + '
') + + if type == 'bonds': + delimiter(f) + f.write('\n\t') + f.write('\n\t',) + for i in range(1,len(data[0])): + f.write('',) + f.write('') + for i in range(len(data[0])): + f.write('\n\t\t',) + if i != 0: f.write('',) + for j in range(1,len(data[0])): + if j > i: + f.write('',) + f.write('') + + f.write('\n\t
Mayer bond orders and valence
' + data[0][i].id + 'valence
' + data[0][i].id + '' + str(data[1][i,j]) + '' + str(data[2][i]) + '
') + + if type == 'energy': + delimiter(f) + f.write('\n\t') + f.write('\n\t') + lookup = ['k','n', 'j','1','2','t','p','tk','v','b','e~'] + for i in range(0, len(lookup)): + f.write('\t\t') + f.write('\n\t
energy partition
descriptioncomponentsenergy
' + data[lookup[i]][1] + '' + data[lookup[i]][2] + '' + \ + str(round( data[lookup[i]][0], 6)) + '
') + + if type == 'dipole': + delimiter(f) + f.write('\n\t') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t
dipoles
xyz(au)(debye)
' + str(round(data[0], 4)) + '' + \ + str(round(data[1], 4)) + '' + str(round(data[2], 4)) + '' + \ + str(round( sqrt(data[3]), 4)) + '' + str(round( sqrt(data[3])* getConstant('au->debye'), 4) ) + '
') + + if type == 'mp2-dipole': + f.write('\n\t') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t
mp2 dipoles
xyz(au)(debye)
' + str(round(data[0], 4)) + '' + \ + str(round(data[1], 4)) + '' + str(round(data[2], 4)) + '' + \ + str(round( sqrt(data[3]), 4)) + '' + str(round( sqrt(data[3])* getConstant('au->debye'), 4) ) + '
') + + if type == 'quad': + delimiter(f) + f.write('\n\t') + f.write('\n\t' + \ + '') + f.write('\n\t\t' + \ + '') + f.write('\n\t\t') + + f.write('\n\t\t' + '') + f.write('\n\t\t') + f.write('\n\t\t') + + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + + f.write('\n\t
quadrupoles (debye Å)
x2y2z2xyyzzx
' + str(round(data[0], 4)) + '' + str(round(data[1], 4)) + '' + str(round(data[2], 4)) + '' + str(round(data[3], 4)) + '' + str(round(data[4], 4)) + '' + str(round(data[5], 4)) + '
traceless
' + str(round(data[6], 4)) + '' + str(round(data[7], 4)) + '' + \ + str(round(data[8], 4)) + '' + str(round(data[3], 4)) + '' + str(round(data[4], 4)) + '' + \ + str(round(data[5], 4)) + '
eigenvalues
' + str(round(data[9], 4)) + '' + str(round(data[10], 4)) + '' + \ + str(round(data[11], 4)) +'
trace is close to zero' + str((data[9]+data[10]+data[11]) < 1e-8) + '
amplitude' + str(round(data[12], 4)) + '
asymmetry' + str(round(data[13], 4)) + '
') + + if type == 'mp': + delimiter(f) + f.write('\n\t') + f.write('\n\t') + f.write('\n\t') + f.write('\n\t') + + f.write('') + f.write('\n\t') + f.write('') + f.write('\n\t') + f.write('') + f.write('\n\t') + f.write('\n\t
moller-plesset
{mp2} parallel spin' + "%.8f" % round(data[0], 8) + '
{mp2} anti-parallel spin' + "%.8f" % round(data[1], 8) + '
{mp2} total' + "%.8f" % round(data[0]+data[1], 8)+ '
{mp3} total' + "%.8f" % round(data[2], 8) + '
{mp2+mp3} total' + "%.8f" % round(data[0]+data[1]+data[2], 8) + '
{total energy + mp correction} total' + "%.8f" % \ + round(data[0]+data[1]+data[2]+data[3], 8) + '
') + + if type == 'omp': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
orbital optimised mp2
cycletotal energyΔ(E)
' + str(data[0]) + '' + "%15.8f" % data[1] + '' + "%2.5e" % data[2] + '
') + + if type == 'mbpt': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
many-body perturbation diagrams
mp2 correlation' + "%10.8f" % data[0] + '
mp3 correlation' + "%10.8f" % data[1] + '
mp4 correlation' + "%10.8f" % data[2] + '
SCF energy' + "%10.8f" % data[3] + '
Total corrected energy' + "%10.8f" % data[4] + '
') + + if type == 'mplp': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
Laplace transform generated mp2
method
reference scf energy' + "%10.8f" % data[1] + '
parallel spin correlation' + "%10.8f" % (data[0][1]) + '
anti-parallel spin correlation' + "%10.8f" % (data[0][0]) + '
total spin correlation' + "%10.8f" % (data[0][0]+data[0][1]) + '
corrected scf energy' + "%10.8f" % (data[0][0]+data[0][1]+data[1]) + '
total spin-component scaled' + "%10.8f" % (data[0][0]*1.2+data[0][1]/3) + '
corrected spin-component scaled' + "%10.8f" % (data[0][0]*1.2+data[0][1]/3+data[1]) + '
') + + if (type == 'ci') or (type == 'rpa'): + if type == 'ci': + title = 'configuration interaction' + if type == 'rpa': + title = 'random phase approximation' + delimiter(f) + f.write('\n\t\n\t\t') + for i in range(0, len(data)): + f.write('\n\t\t') + if ((i % 6) == 5) and (i != len(data)): + f.write('\n\t\t\n\t\t') + f.write('\n\t\t\n\t
' + title + ' *
' + "%.6f" % round(data[i][0], 6) + ' (' + data[i][1] + ')
') + f.write('\n\t\t

* s -singlet, t -triplet

') + + if type[:4] == 'cisa': + if type[4] == 's': + degeneracy = 'singles' + elif type[4] == 't': + degeneracy = 'triplets' + + delimiter(f) + f.write('\n\t\n\t\t') + for i in range(0, len(data)): + f.write('\n\t\t') + if ((i % 6) == 5) and (i != len(data)): + f.write('\n\t\t\n\t\t') + f.write('\n\t\t\n\t
configuration interaction spin-adapted ' + degeneracy + \ + '
' + "%.6f" % round(data[i], 6) + '
') + + if type == 'fci': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
full configuration interaction
number of electrons' + str(data[0]) + '
number of spin orbitals' + str(data[1]) + '
number of determinants' + str(data[2]) + '
SCF energy' + "%10.6f" % data[3] + '
FCI energy' + "%10.6f" % (data[4] + data[5]) + '
FCI correction' + "%10.6f" % (data[4] + data[5] - data[3]) + '
') + + if type == 'cisd': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
ci singles and doubles
number of electrons' + str(data[0]) + '
number of spin orbitals' + str(data[1]) + '
number of determinants' + str(data[2]) + '
SCF energy' + "%10.6f" % data[3] + '
CISD energy' + "%10.6f" % (data[4] + data[5]) + '
CISD correction' + "%10.6f" % (data[4] + data[5] - data[3]) + '
') + + if type == 'cis': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(0, len(data[3])): + f.write('\n\t\t') + if ((i % 6) == 5) and (i != len(data)): + f.write('\n\t\t\n\t\t') + f.write('\n\t\t\n\t
ci singles (slater determinants)
number of electrons' + str(data[0]) + '
number of spin orbitals' + str(data[1]) + '
number of determinants' + str(data[2]) + '
' + "%.6f" % round(data[3][i]*getConstant('hartree->eV'), 6) + '
') + + if type == 'bd': + if len(data) == 0: + f.write('\n\t\t

block Davidson failed

') + else: + f.write('\n\t
\n\t\n\t\t') + for i in range(0, len(data)): + f.write('\n\t\t') + f.write('\n\t\t\n\t
block Davidson
' + "%.6f" % round(data[i], 6) + '
') + + if type == 'ju': + state = -1 + count = 0 + f.write('\n\t
\n\t\n\t\t') + f.write('\n\t\t') + for i in range(0, len(data)): + if count == 10: + break + if data[i][0] != state: + f.write('\n\t\t') + f.write('\n\t\t\n\t
CIS significant excitations
stateenergy(%) excitation
' + str(data[i][0]) + '' + "%.6f" % round(data[i][1], 6) + '(' + str(data[i][2]) + \ + ') ' + data[i][3] + '') + state = data[i][0] + count += 1 + else: + f.write('\n\t\t(' + str(data[i][2]) + ') ' + data[i][3] + '
') + + f.write('\n\t\t

contributions over 10% of 10 lowest energy levels

') + + + if 'diis' in type: + if data[3] == 2: + delimiter(f) + f.write('

direct inversion of the iterative sub-space (diis) is ' \ + + data[4] + '

') + f.write('\n\t\n\t\t\n\t\t \ + \n\t\t') + f.write('\n\t\t') + else: + f.write('\n\t\t') + + if type == 'ccsd(t)': + f.write('\n\t
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
' + "%.10f" % (data[0] - data[1]) + '00
' + "%.10f" % data[0] + '' + "%.6e" % data[1] + '' + "%.6e" % data[2] + '
') + f.write('\n\t

ccsd converged in ' + str(data[0]) + ' cycles

') + f.write('\n\t') + f.write('\n\t\t') + f.write('') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('') + f.write('\n\t\t') + f.write('\n\t
coupled cluster
mp2 correction' + "%.8f" % round(data[3], 8) + '
singles and doubles CCSD' + "%.8f" % round(data[1], 8) + '
perturbative triples CCSD(T)' + "%.8f" % round(data[2], 8) + '
total ccsd correction' + "%.8f" % round(data[2]+data[1], 8) + '
total energy ccsd corrected' + "%.8f" % round(data[4]+data[1]+data[2], 8) + '
') + + if type == 'lccd': + f.write('\n\t') + f.write('\n\t

lccd converged in ' + str(data[0]) + ' cycles

') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
linear coupled cluster doubles *
lccd correction' + "%.8f" % round(data[1], 8) + '
corrected energy' + "%.8f" % round(data[2]+data[1], 8) + '
') + f.write('\n\t\t

*coupled electron pair approximation (zero)

') + + if type == 'ccd': + f.write('\n\t') + f.write('\n\t

ccd converged in ' + str(data[0]) + ' cycles

') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
coupled cluster doubles
ccd correction' + "%.8f" % round(data[1], 8) + '
corrected energy' + "%.8f" % round(data[2]+data[1], 8) + '
') + + if type == 'cc2': + f.write('\n\t') + f.write('\n\t

cc2 converged in ' + str(data[0]) + ' cycles

') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
coupled cluster CC2
cc2 correction' + "%.8f" % round(data[1], 8) + '
corrected energy' + "%.8f" % round(data[3]+data[1], 8) + '
') + + if type == 'lccsd': + f.write('\n\t') + f.write('\n\t

lccsd converged in ' + str(data[0]) + ' cycles

') + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
linear coupled-cluster singles and doubles
lccsd correction' + "%.8f" % round(data[1], 8) + '
corrected energy' + "%.8f" % round(data[2]+data[1], 8) + '
') + + if type == '+c': + f.write('\n\t
') + if data[0] in ['ccd','ccsd','cc2','lccd','lccsd']: + f.write('\n\t\t') + elif data[0] in ['ccsd(t)']: + f.write('\n\t\t') + else: + f.write('\n\t\t') + + eTotal = data[1]['eHF'] + data[1]['cc'] + f.write('\n\t\t') + if data[0] in ['ccsd(t)']: + f.write('\n\t\t') + eTotal += data[1]['pt'] + if data[0] != 'lambda': f.write('\n\t\t') + f.write('') + f.write('\n\t
methodcorrectionmp2total electronictotal
methodsd correctiont perturbationmp2total electronictotal
methodcorrectiontotal electronictotal
' + 'fast ' + data[0] + '' + "%.8f" % round(data[1]['cc'], 8) + '' + "%.8f" % round(data[1]['pt'],8) + '' + "%.8f" % round(data[1]['mp2'], 8) + '' + "%.8f" % round(eTotal, 8) + \ + '' + "%.8f" % round(eTotal+data[1]['nuclear'], 8) + '
') + + if type == 'fa': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(0, len(data[1])): + f.write('\n\t\t') + f.write('\n\t
molecular forces (Eha0-1)
atomxyz
analytic
' + data[1][i].id + '' + "%.6f" % data[0][i,0] + '' + "%.6f" % data[0][i,1] + '' \ + + "%.6f" % data[0][i,2] + '
') + + if type == 'fn': + f.write('\n\t') + f.write('\n\t\t') + for i in range(0, len(data[1])): + f.write('\n\t\t') + f.write('\n\t
molecular forces (Eha0-1)
numeric
' + data[1][i].id + '' + "%.6f" % data[0][i,0] + '' + "%.6f" % data[0][i,1] + '' \ + + "%.6f" % data[0][i,2] + '
') + + if type == 'ep': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + koopman = data[2] * data[3] + + for orbital in range(0, len(data[1])): + kpOrbital = data[0] + orbital + 1 + f.write('\n\t\t\t') + if type == 'eps': + f.write('\n\t') + koopman = zeros(len(data[0])) + for i in range(0, len(data[0])): + koopman[i] = data[1][i*2] * getConstant('hartree->eV') + for orbital in range(0, len(data[0])): + f.write('\n\t\t\t') + if type == 'ep3': + f.write('\n\t') + koopman = zeros(len(data[0])) + for i in range(0, len(data[0])): + koopman[i] = data[1][i*2] * getConstant('hartree->eV') + for orbital in range(0, len(data[0])): + f.write('\n\t\t\t') + f.write('\n\t
electron propogator - Koopman\'s theorem
HOMO - nKoopman (eV)EP2 (eV)
ep2 spatial
' + "% 4d" % (kpOrbital - data[4] + 1) + '' + "%.4f" % koopman[kpOrbital] + \ + '' + "%.4f" % data[1][orbital] + '
ep2 spin
' + "% 4d" % (len(data[0])-orbital-1) + '' + "%.4f" % koopman[orbital] + \ + '' + "%.4f" % data[0][orbital] + '
ep3 spin
' + "% 4d" % (len(data[0])-orbital-1) + '' + "%.4f" % koopman[orbital] + \ + '' + "%.4f" % data[0][orbital] + '
') + + if type == 'gfa': + if data[0] == -1: + delimiter(f) + f.write('\n\t') + f.write('\n\t\t' + \ + '') + f.write('\n\t\t
Approximate Greens function correction to Koopmans theorem (eV)
HOMO - nKoopmanorbital relaxationpair relaxationpair removalcorrectionKP + correction
' + "% 2d" % data[1] + '' + "%.4f" % data[2] + '' + "%.4f" % data[3] + \ + '' + "%.4f" % data[4] + '' + "%.4f" % data[5] + '' + "%.4f" % data[6] \ + + '' + "%.4f" % data[7] ) + if data[0] == 1: + f.write('\n\t
') + + if type == 'po': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t
polarizability (α) (coupled-perturbed SCF)
principal polarizabilities
' + "%.4f" % data[0][0] + '' + "%.4f" % data[0][1] + '' \ + + "%.4f" % data[0][2] + '
isotropic' + "%.4f" % data[1] + '
') + + if type == 'hyper': + delimiter(f) + f.write('\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + + f.write('\n\t
static hyperpolarizability (β) (au)
xyz
' + "%.4f" % data[0][0] + ''+ "%.4f" % data[0][1] + ''+ "%.4f" % data[0][2] + '
amplitude' + "%.4f" % data[1] + '
z' + "%.4f" % data[2] + '
z' + "%.4f" % data[3] + '
') + + if type == 'resp': + delimiter(f) + if data[5] == '1': + f.write('

') + f.write('\trestrained electrostatic potential charges

') + + f.write('
\n\t') + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + if data[1]['sphere'] == 'con' : s = 'Connolly' + else: s = 'Fibonacci' + f.write('\n\t\t') + if data[1]['points'][0] == 'density': + f.write('\n\t\t') + else: f.write('\n\t\t') + f.write('\n\t\t') + if data[1]['shell'][0] == 1: + f.write('\n\t\t') + f.write('\n\t\t') + else: + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + + f.write('\n\t\t') + f.write('\n\t\t') + + for i in range(len(data[1]['constrain'])): + s = data[1]['constrain'][i] + t = '' + for j in range(len(s[1])): t += str(abs(s[1][j])) + ' ' + if s[1][0] < 0 : + f.write('\n\t\t') + else: + f.write('\n\t\t') + + f.write('\n\t\t') + s = data[1]['restrain'] + f.write('\n\t\t') + f.write('\n\t\t') + if s['h'] : f.write('\n\t\t') + else: f.write('\n\t\t') + + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(len(data[2])): + f.write('\n\t\t') + f.write('\n\t\t') + + t = len(data[2]) + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(len(data[3])): + f.write('\n\t\t') + f.write('\n\t\t') + if data[5] == '2': + t = len(data[2]) + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(len(data[1]['constrain'])): + s = data[1]['constrain'][i] + t = '' + for j in range(len(s[1])): t += str(abs(s[1][j])) + ' ' + if s[1][0] < 0 : + f.write('\n\t\t') + else: + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(len(data[2])): + f.write('\n\t\t') + f.write('\n\t\t') + + t = len(data[2]) + f.write('\n\t\t') + f.write('\n\t\t') + f.write('\n\t\t') + for i in range(len(data[3])): + f.write('\n\t\t') + f.write('\n\t\t') + + if type == 'eom': + delimiter(f) + f.write('\n\t

equation of motion

') + f.write('\n\t

coupled-cluster singles and doubles calculation
') + f.write('\n\t

molecular basis' + data[0]['basis']+ 'molecular charge' + str(data[0]['charge']) + '
spherical distribution model' + s + 'surface density' + str(data[1]['points'][1]) + '
specified points' + str(data[1]['points'][1]) + '
number of shells' + str(data[1]['shell'][0]) + 'VdW scaling factor' + str(data[1]['shell'][2]) + '
shell increment' + str(data[1]['shell'][1]) + 'base shell' + str(data[1]['shell'][2]) + '
effective evaluation points' + str(data[4][0]) + 'restrained iterations' + \ + str(data[4][1]) + 'Δrms (resp - classical)' + str(round(data[4][2],4)) + '
constrained charges on atoms ' + t + ' are equal
constrained charges on atoms ' + t + ' sum to ' + str(round(s[0],4)) + '
A scaling' + str(s['a']) + 'b scaling' + str(s['b']) + 'convergence tolerance' + str(s['tol']) + 'iteration limit' + str(s['cycles']) + '
hydrogens are restrained
hydrogens are not restrained
constrained electrostatic potential charges
' + str(round(data[2][i],4)) + '
restrained electrostatic potential charges
' + str(round(data[3][i],4)) + '
stage two constraints
restrained iterations' + str(data[4][0]) + 'Δrms (resp - classical)' + \ + str(round(data[4][1],4)) + '
constrained charges on atoms ' + t + ' are equal
constrained charges on atoms ' + t + ' sum to ' + str(round(s[0],5)) + '
constrained electrostatic potential charges
' + str(round(data[2][i],4)) + '
restrained electrostatic potential charges
' + str(round(data[3][i],4)) + '
') + f.write('\n\t') + f.write('\n\t
scf energy   ' + str(round(data[0][0],10)) \ + + '
ccsd energy' + str(round(data[0][1],10)) \ + + '
total energy' + str(round(data[0][0]+data[0][1],10)) \ + + '
') + + f.write('\n\t

        most significant amplitudes
') + f.write('\n\t
\n\t\t\t') + for i in data[1][0]: + if not '0.0 ' in i: f.write('\n\t\t\t') + f.write('\n\t\t\t') + for i in data[1][1]: + if not '0.0 ' in i: f.write('\n\t\t\t') + f.write('\n\t
tai
' + i + '
tabij
' + i + '
') + f.write('\n\t') + l = data[4][0] + u = data[4][1] + n = 0 + for i,e in enumerate(data[2]): + if e[0] > l and e[0] < u: + f.write('\n\t\t') + n += 1 + if ((n % 6) == 5) and (n != len(data[2])): + f.write('\n\t\t\n\t\t') + f.write('\n\t\t\n\t
eom-ccsd
' + "%.6f" % round(e[0], 6) + ' (' + e[1] + ')
') + f.write('\n\t
') + n = 0 + for i,e in enumerate(data[3]): + if e[0] > l and e[0] < u: + f.write('\n\t\t') + n += 1 + if ((n % 6) == 5) and (n != len(data[3])): + f.write('\n\t\t\n\t\t') + f.write('\n\t\t\n\t
eom-mbpt(2)
' + "%.6f" % round(e[0], 6) + ' (' + e[1] + ')
') + + if type == 'cogus': + delimiter(f) + f.write('\n\t') + for cluster in data: + if cluster[2] != 0.0: + f.write('\n\t\t') + else: + f.write('\n\t\t') + + f.write('\n\t
Cluster Operator Generator Using Sympy
' + cluster[0] + '' + str(round(cluster[1],10)) + '' + \ + str(round(cluster[2],10)) + '
' + cluster[0] + '' + str(round(cluster[1],10)) + '' + \ + '' + '
') + f.close() + +def post(exit = True): + f = open('harpy.html','a') + if not exit: + f.write('\n\t

SCF failed to converged in maximum cycles

') + f.write('\n') + f.close() + +def showMatrix(title, matrix, f, precision = '%.4f'): + f.write('\n\t
\n\t\n\t\t\n\t\t') + for i in range(0, matrix.shape[1]): + f.write('\n\t\t',) + f.write('') + for i in range(0, matrix.shape[0]): + f.write('\n\t\t',) + for j in range(0, matrix.shape[1]): + f.write('\n\t\t',) + f.write('') + f.write('\n\t\t\n\t
' + title + '
' + str(i+1) + '
' + str(i+1) + '' + precision % round(matrix[i,j],int(precision[2])) + '
') + + +def matrixHeatPlot(a, title=''): + #display a heat map of matrix 'a' + + py.title(title) + py.imshow(a, interpolation = 'nearest', cmap='jet', alpha=0.5) + py.colorbar() + py.show() + +def evaluateGaussian(iBasis, x ,y , plane, z, normal): + #compute electron distribution due to a Gaussian wavefunction + + planes = { 'xy' : (0,1,2), 'yz' : (1,2,0), 'zx' : (2,0,1)} + axes = planes[plane] + + density = 0.0 + + r = (x - iBasis.center[axes[0]])*(x - iBasis.center[axes[0]]) + \ + (y - iBasis.center[axes[1]])*(y - iBasis.center[axes[1]]) + \ + (z - iBasis.center[axes[2]])*(z - iBasis.center[axes[2]]) + + c = (x - iBasis.center[axes[0]])**(iBasis.momentum[axes[0]]) * \ + (y - iBasis.center[axes[1]])**(iBasis.momentum[axes[1]]) * \ + (z - iBasis.center[axes[2]])**(iBasis.momentum[axes[2]]) + + for i in range(0, len(iBasis.co)): + prims = iBasis.co[i] + exp = math.exp(-iBasis.ex[i]*r) + + if normal: density += prims * c * exp * iBasis.normal[i] + else: density += prims * c * exp + + return density + + +def plotGaussianOverlap(iBasis, jBasis, plane, z, extent, grid, atoms, options = [False, 20]): + #make matrix of plotting points and plot contours + # plane = 'xy'|'yz'|'zx' z displacement from plane, limits [min, max, min, max] + + planes = { 'xy' : (0,1,2), 'yz' : (1,2,0), 'zx' : (2,0,1)} + planeAxes = planes[plane] + + normalise, nContours = options + + fig = py.figure(figsize=(5,5)) + ax = fig.gca() + + if jBasis == None: + ax.set_title('atom ' + atoms[iBasis.atom].id + ' orbitals ' + iBasis.symbol) + else: + ax.set_title(atoms[iBasis.atom].id + '(' + iBasis.symbol + ') ' + atoms[jBasis.atom].id + '(' + jBasis.symbol + ')') + + for i in range(0, len(atoms)): + c = py.Circle(([atoms[i].center[planeAxes[0]], atoms[i].center[planeAxes[1]]]), \ + covalentRadius[atoms[i].number-1]/500, color = '0') + ax.add_artist(c) + for j in range(i+1, len(atoms)): + if isBond(atoms,i,j): + py.plot([atoms[i].center[planeAxes[0]],atoms[j].center[planeAxes[0]]], \ + [atoms[i].center[planeAxes[1]],atoms[j].center[planeAxes[1]]], color = 'k') + + #grid is mesh size, generate grid points + x = linspace(extent[0], extent[1], grid) + y = linspace(extent[2], extent[3], grid) + + #get values + Z = zeros((grid, grid)) + for i in range(0, len(x)): + for j in range(0, len(y)): + Z[j,i] = evaluateGaussian(iBasis, x[i], y[j], plane, z, normalise) + if jBasis != None: Z[j,i] *= evaluateGaussian(jBasis, x[i], y[j], plane, z, normalise) + + heights = linspace(min([min(i) for i in Z]), max([max(i) for i in Z]), nContours) + + if iBasis == jBasis: + map = 'Reds' + else: + map = 'seismic' + + try: + cs = py.contour(x, y, Z, heights, cmap = map) + py.text(extent[0]+0.4, extent[2]+0.4, 'plane is ' + str(plane) + ', elevation ' + str(z)) + py.show() + except: + print('no density') + +def plotMO(C, orbital, plane, z, extent, grid, atoms, bases, options = [True, 60, 1e-8]): + #make matrix of plotting points and plot contours + # plane = 'xy'|'yz'|'zx' z displacement from plane, limits [min, max, min, max] + + planes = { 'xy' : (0,1,2), 'yz' : (1,2,0), 'zx' : (2,0,1)} + planeAxes = planes[plane] + + #options + normalise, nContours, cutoff = options + + fig = py.figure(figsize=(5,5)) + ax = fig.gca() + ax.set_title('molecular orbital ' + str(orbital)) + + #draw molecule + for i in range(0, len(atoms)): + c = py.Circle(([atoms[i].center[planeAxes[0]], atoms[i].center[planeAxes[1]]]), \ + covalentRadius[atoms[i].number-1]/500, color = '0') + ax.add_artist(c) + for j in range(i+1, len(atoms)): + if isBond(atoms,i,j): + py.plot([atoms[i].center[planeAxes[0]],atoms[j].center[planeAxes[0]]], \ + [atoms[i].center[planeAxes[1]],atoms[j].center[planeAxes[1]]], color = 'k') + + #grid is mesh size, generate grid points + x = linspace(extent[0], extent[1], grid) + y = linspace(extent[2], extent[3], grid) + + mo = C[:, orbital] + + #get values + Z = zeros((grid, grid)) + for i in range(0, len(x)): + for j in range(0, len(y)): + Z[j,i] = 0.0 + for m in range(0, len(mo)): + amplitude = evaluateGaussian(bases[m], x[i], y[j], plane, z, normalise) * mo[m] + if abs(amplitude) > cutoff: Z[j,i] += amplitude + + heights = linspace(min([min(i) for i in Z]), max([max(i) for i in Z]),nContours) + + try: + cs = py.contourf(x, y, Z, heights, cmap = 'seismic') + py.text(extent[0]+0.4, extent[2]+0.4, 'plane is ' + str(plane) + ', elevation ' + str(z)) + py.show() + except: + print('no density') + \ No newline at end of file diff --git a/test/ch4-sto-3g.md b/test/ch4-sto-3g.md new file mode 100644 index 0000000..039f98d --- /dev/null +++ b/test/ch4-sto-3g.md @@ -0,0 +1,82 @@ +# Methane in STO-3G basis + +Reference is Crawford project #3 [see](https://github.com/CrawfordGroup/ProgrammingProjects/blob/master/Project%2303/output/ch4/STO-3G/output.txt). Crawford first and harpy second. + +| Nuclear repulsion | | +|--------------------|----------------| +| | 13.4973044620 | +| | 13.4973044620 | + +| Overlap (1st row) | | | | | | | | | | +|--------------------|-------------|-------------|-------------|-------------|------------|------------|------------|-----------|-----------| +| | 1.0000000 | 0.2483624 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0630068 | 0.0630068 | 0.0630068 | 0.0630068 | +| | 1. | 0.2483624 | 0. | 0. | 0. | 0.0630068 | 0.0630068 | 0.0630068 | 0.0630068 | + +| Kinetic (diagonal) | | | | | | | | | | +|--------------------|-------------|-------------|-------------|-------------|------------|------------|------------|-----------|-----------| +| | 15.8911236 | 0.4722500 | 1.4777281 | 1.4777281 | 1.4777281 | 0.7600318 | 0.7600318 | 0.7600318 | 0.7600318 | +| | 15.8911218 | 0.4722500 | 1.4777281 | 1.4777281 | 1.4777281 | 0.7600319 | 0.7600319 | 0.7600319 | 0.7600319 | + +| Coulomb (diagonal) | | | | | | | | | | +|--------------------|-------------|-------------|-------------|-------------|------------|------------|------------|-----------|-----------| +| | -35.6036270 | -7.0845291 | -7.0427086 | -7.0427086 | -7.0427086 | -4.9835182 | -4.9835182 |-4.9835182 |-4.9835182 | +| | -35.6036251 | -7.0845291 | -7.0427085 | -7.0427085 | -7.0427085 | -4.9835183 | -4.9835183 |-4.9835183 |4.9835183 | + +| Core Hamiltonian | | | | | | | | | | +|--------------------|-------------|-------------|-------------|-------------|------------|------------|------------|-----------|-----------| +| | -19.7125033 | -6.6122791 | -5.5649805 | -5.5649805 | -5.5649805 | -4.2234865 | -4.2234865 |-4.2234865 |-4.2234865 | +| | -19.7125033 | -6.6122791 | -5.5649804 | -5.5649804 | -5.5649804 | -4.2234865 | -4.2234865 |4.2234865 |-4.2234865 | + +| Initial electronic energy | | +|----------------------------|------------------| +| | -85.245230708238 | +| | -85.245230223581 | + +| Final electronic energy | | +|----------------------------|------------------| +| | -53.224154786383 | +| | -53.224154775919 | + + +| Final total energy | | +|----------------------------|------------------| +| | -39.726850324347 | +| | -39.726850313886 | + +| Final density trace | | | | | | | | | | +|---------------------|-------------|-------------|-------------|-------------|------------|------------|------------|-----------|-----------| +| | 1.0329323 | 0.3960228 | 0.3268651 | 0.3268651 | 0.3268651 | 0.3045239 | 0.3045239 | 0.3045239 | 0.3045239 | +| | 1.0329323 | 0.3960228 | 0.3268651 | 0.3268651 | 0.3268651 | 0.3045239 | 0.3045239 | 0.3045239 | 0.3045239 | + +| Dipole | x | y | z | resultant | +|---------------------|-----------------|-----------------|-----------------|----------------| +| | 0.000000000000 | 0.000000000000 | 0.000000000000 | 0.000000000000 | +| | 0.000000000000 | 0.000000000000 | 0.000000000000 | 0.000000000000 | + +| Charges (Mulliken) | C | H | H | H | H | +|---------------------|-------------------|-----------------|-----------------|----------------|----------------| +| | -0.260430681332 | 0.065107670333 | 0.065107670333 | 0.065107670333 | 0.065107670333 | +| | -0.2604308 | 0.0651077 | 0.0651077 | 0.0651077 | 0.0651077 | + +| moller-plesset 2 | | +|----------------------------|------------------| +| | -0.056046676165 | +| | -0.056046675156 | + + + +| CIS | | | | | | +|---------------------|----------------|----------------|----------------|----------------|----------------| +| | 0.6020603967 | 0.6546366260 | 0.7925534416 | 0.8104989266 | 0.8170915540 | +| | 0.60206043 | 0.65463667 | 0.7925535 | 0.81049898 | 0.81709161 | + + +| RPA | | | | | | +|---------------------|----------------|----------------|----------------|----------------|----------------| +| | 0.5656719613 | 0.6390526798 | 0.7914475213 | 0.8103245505 | 0.8167562952 | +| | 0.565672 | 0.63905272 | 0.79144758 | 0.81032461 | 0.81675635 | + +| Coupled cluster | mp2 | sd | t | +|---------------------|------------------|------------------|------------------| +| | -0.056046676165 | -0.078335022658 | -0.000136278738 | +| | -0.056046675157 | -0.078335022268 | -0.000136278714 | diff --git a/test/conformation.md b/test/conformation.md new file mode 100644 index 0000000..d2a2eca --- /dev/null +++ b/test/conformation.md @@ -0,0 +1,166 @@ +# molecular conformation + +One important question is 'what conformation does an individual molecule adopt?'. For example in acetaldehyde H3C-CH-O what conformation does the methyl group adopt with respect to the plane of the aldehyde group? + +![image](https://user-images.githubusercontent.com/73105740/120186892-025d5800-c20c-11eb-8796-3b6501894e85.png) + +There are two logical answers, either 1) a methyl hydrogen lies in the plane and adjacent to the oxygen or 2) it lies in the plane adjacent to the aldehyde hydrogen. Intuition tells us that the (+) hydrogen will be attracted to the (-) oxygen so we expect case 1). This is backed-up by the geometry of the reference acetaldehyde molecule in project.hpf which has geometry 1. But let's assume we don't know the answer and see how to do a conformational analysis. + +We will need some imports + + import rhf + import math + import numpy as np + import atom + + +First we need to know how to rotate a point in space about an arbitrary axis. [This is good site to explain the procedure](https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-formulas/rotation-about-an-arbitrary-axis-in-3-dimensions). A python('ish') version of the algorithm is + + def rotate( a, molAtom, theta): + #rotate by angle theta about axis a + + #radians + theta *= np.pi/180.0 + + #get axis + i = int(a[:a.find('-')]) + j = int(a[a.find('>')+1:]) + + #vector along axis + a,b,c = molAtom[i].center[:] + d,e,f = molAtom[j].center[:] + + #normalise axis + axis = molAtom[j].center[:] - molAtom[i].center[:] + axis /= np.linalg.norm(axis) + u,v,w = axis[:] + + #evaluate trigonmetric functions + s = math.sin(theta) + c = math.cos(theta) + + #tranformation matrix + T = np.eye(4) + T[0,0] = u*u + (v*v+w*w)*c + T[0,1] = u*v*(1.0-c) - w*s + T[0,2] = u*w*(1.0-c) + v*s + T[0,3] = (a*(v*v+w*w) - u*(b*v+c*w))*(1.0-c) + (b*w-c*v)*s + + T[1,0] = u*v*(1.0-c) + w*s + T[1,1] = v*v + (w*w+u*u)*c + T[1,2] = v*w*(1.0-c) - u*s + T[1,3] = (b*(u*u+w*w) - v*(a*u+c*w))*(1.0-c) + (c*u-a*w)*s + + T[2,0] = u*w*(1.0-c) - v*s + T[2,1] = v*w*(1.0-c) + u*s + T[2,2] = w*w + (u*u+v*v)*c + T[2,3] = (c*(u*u+v*v) - w*(a*u+b*v))*(1.0-c) + (a*v-b*u)*s + + return T + +This takes a definition of the rotation axis given as eg '0->1' the arrow points towards the rotated atoms. So in out example C1 (atom 0) is the methyl carbon (and has the atoms to be rotated) and C2 (atom 1) is the aldehyde carbon, so out rotor will be '1->0'. *molAtom* is the molecular atom object containing the geometry and *theta* is the angle to be rotated through in **degrees**. The routine returns a transformation matrix which has dimension [**4**, **4**]. + +Next we can define the conformation analysis by + + #define conformation range + angles = {'start' : 0, 'increment' : 5, 'number' : 25, 'rotor' : '1->0'} + + +We need to know which subset of the atoms to rotate, we could give them as a manually prepared list or write an automatic procedure along the lines of + + def rotationGroup(i, group, rotor): + #get the atoms to be rotated + + #atom connections + bond = atom.bondMatrix(molAtom) + row = bond[i,:] + + #recurse connections of this atom + for j in range(bond.shape[1]): + + if rotor == j: continue + if (i != j) and (row[j] == 1) and not (j in group): + group.append(j) + rotationGroup(j, group, rotor) + + return group + +This takes *i* the atom who's connected atoms are required, *group* is a list of the atoms in the rotated group found so far and *rotor* is the atom i in the axis definition 'i->k. The connections of the atom i are found from the bond matrix row (i), if the atom is the *rotor* we go on the the next atom as we don't want any atoms connected to that end of the axis of rotation. Now if the atom is not the atom i and there is a connection (bond matrix element is 1) and we don't already have the atom in our group, then add it to the group and see whats connected to that atom. Thus we end up with a list of atoms to be rotated, in our case the list is + + [4, 0, 5, 6] + +We finally have to remove the k end of 'i->k' when group is returned. This is done by + + #get axis + a = angles['rotor'] + i = int(a[:a.find('-')]) + j = int(a[a.find('>')+1:]) + + #get matrix of column vectors of atoms to be rotated + group = [] + group = rotationGroup(j, group, i) + group.remove(j) + +We now have our group of atom to rotate + + [4, 5, 6] + +get the molecular geometry, define a matrix of the geometry of the atoms to be rotated, and a matrix to hold the transformed molecular geometry after rotation. Note the column vector must be [x, y, z, 1] to be compatible which transformation matrix which is why we initialise rotationGroup matrix to ones not zeros. + + nRotate = len(group) + rotationGroup = np.ones((4, nRotate)) + + for p in range(nRotate): + rotationGroup[:3, p] = molAtom[group[p]].center[:] + + geo = np.zeros((nAtoms,3)) + + +Now the main loop + + for theta in range(angles['number']): + + #get rotation matrix + phi = angles['start'] + angles['increment'] * theta + T = rotate(angles['rotor'], molAtom, phi) + + #rotate about axis + for p in range(nAtoms): + if p in group: + idx = group.index(p) + geo[p,:] = np.dot(T, rotationGroup)[:3,idx] + else: + geo[p,:] = molAtom[p].center[:] + + #update geometry + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + +Calulate the angle to be rotated through, get transformation matrix for that rotation, update rotated atom positions, rebuild the atomic centers and we're ready to do the scf calculation. + +Finally if we initialise a list for the energies before the loop + + e = [] + +and after the rebuild add + + #solve + e.append(rhf.scf(molAtom, molBasis, molData, [])) + +then we can finish up with + + import matplotlib.pyplot as pl + + pl.figure() + pl.title('acetaldehyde methyl rotation') + pl.xlabel('angle (degrees)') + pl.yLabel('energy (au)') + pl.plot(range(0, 121,5), e) + pl.show() + +If we run the above code we get + +![](../media/ch3coh.png) + +This shows that scenario 1. is the minimum energy conformation and scenario 2 is, in fact, a maximum. (the geometry is not quite symmetrical so the energy curve is slightly asymmetric). This is the basic idea of how you can explore conformational energy curves and surfaces. + + diff --git a/test/h2-ccsd-eom.md b/test/h2-ccsd-eom.md new file mode 100644 index 0000000..0d30650 --- /dev/null +++ b/test/h2-ccsd-eom.md @@ -0,0 +1,53 @@ +### CCSD +These are the results for H2 in a 3-21g basis + +scf energy is -1.1229402577 Hartree\ +CCSD correction is -0.0248728759 Hartree + +most significant amplitudes +| | +|----------------------------| +|                tai | +|-0.005758 (0, 4) | +|-0.005758 (1, 5) | +|                tabij| +|-0.084054 (1, 0, 3, 2) | +|-0.084054 (0, 1, 2, 3)| +|-0.047829 (0, 1, 4, 5)| +|-0.047829 (1, 0, 5, 4)| +|-0.043512 (1, 0, 3, 6)| + +### EOM-CCSD +| | | | | +|---|---|---|---| +|10.852655 (t)| 15.898409 (s) | 26.471206 (t) | 30.521616 (s) | +|31.881401 (s)| 40.401958 (t) | 41.140826 (s) | 43.232126 (t) | + +results from Gaussian +| | | | | +|---|---|---|---| +|10.8527|10.8527|10.8527|15.8984| +|26.4712|26.4712|26.4712|30.5216| +|31.8814|40.4020|40.4020|40.4020| + +### EOM-MBPT(2) +| | | | | +|---|---|---|---| +|10.657194 (t) | 15.708727 (s) | 26.265493 (t) |30.222336 (s) | +|31.678520 (s) | 40.207311 (t) |40.912816 (s) |43.016807 (t) | + +results from Gaussian +| | | | | +|---|---|---|---| +|10.6572| 10.6572| 10.6572| 15.7087| +| 26.2655| 26.2655| 26.2655| 30.2223| +|31.6785| 40.2073| 40.2073| 40.2073| + +*Gaussian results from JJ Goings* + +### Λ-CCSD +| | | +|-------|----------| +|pseudo-energy | -0.02451418 | + +*agrees with psi4numpy* diff --git a/test/h2-dissociation.md b/test/h2-dissociation.md new file mode 100644 index 0000000..a5b9c85 --- /dev/null +++ b/test/h2-dissociation.md @@ -0,0 +1,27 @@ +# H2 dissociation - a comparison of RHF and UHF + +This follows the study in Szabo & Ostlund on pages 165-167. The idea is to see what happens to a hydrogen molecule as the bond length is moved through the range 0.5 to 12 bohr. With RHF we see an improvement in the energy to a minimum (~-1.2 at ~1.5 bohr) and then a gradual increase asymptotically to a level of ~-5.5 au. Logically one would expect the final energy of the system to be the energy of two individual hydrogen atoms. The energy of a single hydrogen atom is ~0.4666 au so one would expect the total energy of the system given by RHF to be ~-0.9332 not ~-5.5! + +With UHF we see initially a similar behaviour, the curves follow each other through the minimum but then the behaviour changes. Although again the curve tends asymptotically to a value this time it's the expected energy of 2 hydrogen atoms. + +![](../media/h2-dissociation.png) + +In the UHF case for the dissociated molecules there are two MO's so each hydrogen has one to accomodate it's electron, however in the RHF case both electrons must occupy the same MO, this leads to a H+ - H- configuration rather than H - H. This means in the RHF case in addition to the two isolated hydrogen atoms there is still a extra contribution from the one-center electron repulsions due to the fact there are still two electrons sharing an MO. This contribution is half the [00|00] contribution in the H2 case. + +You can run this (given the directory structure here from harpy/source) as + + python3 ../test/h2-dissociation.py + +These plots are using the following molecule definition +``` +name=h2 +matrix=c +diis=off +basis=sto-3g +post={} + +H1 1 0.00000000000000 0.00000000 0.00000000000 +H2 1 1.39838996182773 0.00000000 0.00000000000 + +end +``` \ No newline at end of file diff --git a/test/h2-dissociation.png b/test/h2-dissociation.png new file mode 100644 index 0000000..278fd6b Binary files /dev/null and b/test/h2-dissociation.png differ diff --git a/test/h2-dissociation.py b/test/h2-dissociation.py new file mode 100644 index 0000000..a9ffb20 --- /dev/null +++ b/test/h2-dissociation.py @@ -0,0 +1,101 @@ +import sys +sys.path.append('../source') + +import rhf +import uhf +from integral import iEri +import numpy as np +import os +''' +This illustrates the difference in RHF and UHF when dealing +with the dissociation of the hydrogen molecule as the bond +length is increased from 0.5-12 bohr. Compare with Szabo & +Ostlund pg 166 fig.3.5 + +Molecule is aligned along x-axis with H1 at [0,0,0]. +''' +mol = """name=h2 +matrix=c +diis=off +basis=sto-3g +uhfmix=0.02 +post={} + +H1 1 0.00000000000000 0.00000000 0.00000000000 +H2 1 1.39838996182773 0.00000000 0.00000000000 + +end +""" +fileName = 'h2.hpf' +f = open(fileName, 'w') +f.write(mol) +f.close() + +#create molecular atom and basis objects +molAtom, molBasis, molData = rhf.mol([], file = fileName) + +#clean up file +if os.path.exists(fileName): + os.remove(fileName) + +#solve base geometry for <00|00> +rhf.scf(molAtom, molBasis, molData, []) +Heri = rhf.ERI[iEri(0,0,0,0)] * 0.5 + +#initial position of H2 +a = molAtom[1].center[:] + +#definition of range +start = 0.5 +points = 100 + +nAtoms = len(molAtom) + +erhf = [] +euhf = [] +separation = [] + +#set geo to original geometry +geo = np.zeros((nAtoms,3)) +for atom in range(nAtoms): + geo[atom,:] = molAtom[atom].center + +for i in range(points): + + #update geometry and rebuild centers with it + geo[1,0] = start + i * 0.125 + molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) + + #calculate energies + separation.append(geo[1,0]) + erhf.append(rhf.scf(molAtom, molBasis, molData, [])) + euhf.append(uhf.scf(molAtom, molBasis, molData, [])) + +#get single hydrogen atom energy +molAtom = molAtom[:1] +molBasis = molBasis[:1] +molAtom, molBasis = rhf.rebuildCenters(molAtom, molBasis, geo) +molData['multiplicity'] = 2 +H = uhf.scf(molAtom, molBasis, molData, []) + +#plot results +import matplotlib.pyplot as pl + +pl.plot(separation, erhf, '.r') +pl.plot(separation, euhf, '.m') + +pl.plot([0,13], [2*H, 2*H], 'k.--') +pl.plot([0,13], [2*H + Heri,2*H + Heri], 'k.--') + +pl.text(12, -0.65, 'rhf') +pl.text(12, -1.00, 'uhf') +pl.text(1.8,-0.52,'2H + <11|11>/2', size='x-small') +pl.text(1.8,-0.91,'2H', size='x-small') + +pl.xlabel('bond length (bohr)') +pl.ylabel('energy (Hartree)') + +pl.title('H$_2$' + ' dissociation rhf v uhf') + +pl.show() + diff --git a/test/h2-eom.md b/test/h2-eom.md new file mode 100644 index 0000000..19c6b96 --- /dev/null +++ b/test/h2-eom.md @@ -0,0 +1,45 @@ +## CCSD +These are the results for H2 in a 3-21g basis + +scf energy is -1.1229402577 Hartree +CCSD correction is -0.0248728759 Hartree + +most significant amplitudes +| tai | +|----------------------------| +|-0.005758 (0, 4) | +|-0.005758 (1, 5) | +| tabij| +|-0.084054 (1, 0, 3, 2) | +|-0.084054 (0, 1, 2, 3)| +|-0.047829 (0, 1, 4, 5)| +|-0.047829 (1, 0, 5, 4)| +|-0.043512 (1, 0, 3, 6)| + +## EOM-CCSD +| | | | | +|---|---|---|---| +|10.852655 (t)| 15.898409 (s) | 26.471206 (t) | 30.521616 (s) | +|31.881401 (s)| 40.401958 (t) | 41.140826 (s) | 43.232126 (t) | + +results from Gaussian +| | | | | +|---|---|---|---| +|10.8527|10.8527|10.8527|15.8984| +|26.4712|26.4712|26.4712|30.5216| +|31.8814|40.4020|40.4020|40.4020| + +## EOM-MBPT(2) +| | | | | +|---|---|---|---| +|10.657194 (t) | 15.708727 (s) | 26.265493 (t) |30.222336 (s) | +|31.678520 (s) | 40.207311 (t) |40.912816 (s) |43.016807 (t) | + +results from Gaussian +| | | | | +|---|---|---|---| +|10.6572| 10.6572| 10.6572| 15.7087| +| 26.2655| 26.2655| 26.2655| 30.2223| +|31.6785| 40.2073| 40.2073| 40.2073| + +*Gaussian results from JJ Goings. \ No newline at end of file diff --git a/test/h2o-dz.html b/test/h2o-dz.html new file mode 100644 index 0000000..a7831df --- /dev/null +++ b/test/h2o-dz.html @@ -0,0 +1,2549 @@ + + + + +

HARPY RHF output for h2o

+

atoms

+

number of atoms is 3

+ + + + + + + +
atomic input data
idnumberxyzweight
1O180.0-0.1432258165520.015.99903
2H111.6380368404071.1365488225470.01.00784
3H21-1.6380368404071.1365488225470.01.00784
+
+ + + + + +
interatom seperations
atomsd (bohr)
O1-H12.079
O1-H22.079
+
+ + + + +
interatom angles
atomsangle
H1-O1-H2104.0
+
+ + + +
center of mass
xyz
0.0-0.00.0
+
+ + + +
inferred bonds
O1H1H2
O1XX
H1X
H2X
+
+ + + + + + +
inertia tensor
xyz
2.9319390.00.0
0.05.4084010.0
0.00.08.340341
+
+ + + + + +
principal moments (amu bohr2)
IaIbIc
2.9319395.4084018.340341
+
+
rotor typeasymmetric top
+
+ + + + + +
rotational constants (g cm-1)
ABC
20.532411.13087.2179
+
+
nuclear repulsion energy8.00236706
+
+

orbitals

+ +
+
number of electrons10
+
+
basis setdz
+
+
Cartesian +
DZ (Dunning) EMSL Basis Set Exchange Library 2/9/11 8:30 AM +
T.H. DUNNING, JR., J. CHEM. PHYS. 53, 2823 (1970). +
T.H. DUNNING, JR. AND P.J. HAY, IN METHODS OF ELECTRONIC STRUCTURE THEORY, +
VOL. 2, H.F. SCHAEFER III, ED., PLENUM PRESS (1977). +

+
+ + + + + +
orbital occupancy
number of basis functions14
number doubly occupied orbitals5
number of virtual orbitals9
+
+ + + + + + + + + + + + + + + + + +
atomic orbitals
+ 1O1Os2O1Os3O1Os4O1Os
+ 5O1Opx6O1Opy7O1Opz8O1Opx
+ 9O1Opy10O1Opz11H1Hs12H1Hs
+ 13H2Hs14H2Hs
+
+ + + + + + + +
aufbau atomic occupancies
idorbitals
1O11s22s22p4
2H11s1
3H21s1
+
+

pre-scf

+ +
+ + +
initial fock guesscore hamiltonian
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
overlap
1234567891011121314
11.00000.83810.33940.16100.00000.00000.00000.00000.00000.00000.01800.05530.01800.0553
20.83811.00000.43220.19440.00000.00000.00000.00000.00000.00000.02000.06530.02000.0653
30.33940.43221.00000.77640.00000.00000.00000.00000.00000.00000.15960.32790.15960.3279
40.16100.19440.77641.00000.00000.00000.00000.00000.00000.00000.33960.59820.33960.5982
50.00000.00000.00000.00001.00000.00000.00000.50600.00000.00000.20710.1605-0.2071-0.1605
60.00000.00000.00000.00000.00001.00000.00000.00000.50600.00000.16180.12540.16180.1254
70.00000.00000.00000.00000.00000.00001.00000.00000.00000.50600.00000.00000.00000.0000
80.00000.00000.00000.00000.50600.00000.00001.00000.00000.00000.42360.4491-0.4236-0.4491
90.00000.00000.00000.00000.00000.50600.00000.00001.00000.00000.33100.35090.33100.3509
100.00000.00000.00000.00000.00000.00000.50600.00000.00001.00000.00000.00000.00000.0000
110.01800.02000.15960.33960.20710.16180.00000.42360.33100.00001.00000.68310.02090.1482
120.05530.06530.32790.59820.16050.12540.00000.44910.35090.00000.68311.00000.14820.3856
130.01800.02000.15960.3396-0.20710.16180.0000-0.42360.33100.00000.02090.14821.00000.6831
140.05530.06530.32790.5982-0.16050.12540.0000-0.44910.35090.00000.14820.38560.68311.0000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
kinetic
1234567891011121314
152.614915.66100.83400.13070.00000.00000.00000.00000.00000.0000-0.02240.0144-0.02240.0144
215.661014.29831.10920.16120.00000.00000.00000.00000.00000.0000-0.02830.0170-0.02830.0170
30.83401.10921.40970.50880.00000.00000.00000.00000.00000.0000-0.03910.0837-0.03910.0837
40.13070.16120.50880.42690.00000.00000.00000.00000.00000.00000.08460.13440.08460.1344
50.00000.00000.00000.00003.63500.00000.00000.43230.00000.00000.10890.0876-0.1089-0.0876
60.00000.00000.00000.00000.00003.63500.00000.00000.43230.00000.08510.06850.08510.0685
70.00000.00000.00000.00000.00000.00003.63500.00000.00000.43230.00000.00000.00000.0000
80.00000.00000.00000.00000.43230.00000.00000.53420.00000.00000.24990.1813-0.2499-0.1813
90.00000.00000.00000.00000.00000.43230.00000.00000.53420.00000.19520.14170.19520.1417
100.00000.00000.00000.00000.00000.00000.43230.00000.00000.53420.00000.00000.00000.0000
11-0.0224-0.0283-0.03910.08460.10890.08510.00000.24990.19520.00001.41570.2926-0.0302-0.0012
120.01440.01700.08370.13440.08760.06850.00000.18130.14170.00000.29260.2664-0.00120.0375
13-0.0224-0.0283-0.03910.0846-0.10890.08510.0000-0.24990.19520.0000-0.0302-0.00121.41570.2926
140.01440.01700.08370.1344-0.08760.06850.0000-0.18130.14170.0000-0.00120.03750.29260.2664
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coulomb
1234567891011121314
1-82.4990-47.8120-12.5270-5.44910.0000-0.01870.00000.0000-0.00310.0000-0.5421-1.8162-0.5421-1.8162
2-47.8120-40.3767-13.0408-5.68490.0000-0.02180.00000.0000-0.00210.0000-0.5621-1.8920-0.5621-1.8920
3-12.5270-13.0408-13.3380-8.50190.0000-0.14100.00000.0000-0.07670.0000-1.4779-3.3425-1.4779-3.3425
4-5.4491-5.6849-8.5019-7.74710.0000-0.16040.00000.0000-0.20040.0000-2.2377-3.9493-2.2377-3.9493
50.00000.00000.00000.0000-11.75870.00000.0000-3.88670.00000.0000-1.5650-1.18771.56501.1877
6-0.0187-0.0218-0.1410-0.16040.0000-11.72470.00000.0000-3.85380.0000-1.2381-0.9928-1.2381-0.9928
70.00000.00000.00000.00000.00000.0000-11.67140.00000.0000-3.80230.00000.00000.00000.0000
80.00000.00000.00000.0000-3.88670.00000.0000-4.85750.00000.0000-2.3210-2.02492.32102.0249
9-0.0031-0.0021-0.0767-0.20040.0000-3.85380.00000.0000-4.78080.0000-1.8322-1.6873-1.8322-1.6873
100.00000.00000.00000.00000.00000.0000-3.80230.00000.0000-4.66070.00000.00000.00000.0000
11-0.5421-0.5621-1.4779-2.2377-1.5650-1.23810.0000-2.3210-1.83220.0000-5.8164-3.6035-0.1505-0.9123
12-1.8162-1.8920-3.3425-3.9493-1.1877-0.99280.0000-2.0249-1.68730.0000-3.6035-4.5176-0.9123-2.1255
13-0.5421-0.5621-1.4779-2.23771.5650-1.23810.00002.3210-1.83220.0000-0.1505-0.9123-5.8164-3.6035
14-1.8162-1.8920-3.3425-3.94931.1877-0.99280.00002.0249-1.68730.0000-0.9123-2.1255-3.6035-4.5176
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
two electron repulsion integrals *
< i j | k l >
< 1 1 | 1 1 >6.35419
< 1 1 | 1 2 >4.387899
< 1 1 | 1 3 >1.241928
< 1 1 | 1 4 >0.54541
< 1 1 | 1 11 >0.054861
< 1 1 | 1 12 >0.182287
< 1 1 | 1 13 >0.054861
< 1 1 | 1 14 >0.182287
< 1 1 | 2 1 >4.387899
< 1 1 | 2 2 >4.238794
< 1 1 | 2 3 >1.437384
< 1 1 | 2 4 >0.628974
< 1 1 | 2 11 >0.062423
< 1 1 | 2 12 >0.20952
< 1 1 | 2 13 >0.062423
< 1 1 | 2 14 >0.20952
< 1 1 | 3 1 >1.241928
< 1 1 | 3 2 >1.437384
< 1 1 | 3 3 >1.515598
< 1 1 | 3 4 >0.9563
< 1 1 | 3 11 >0.15855
< 1 1 | 3 12 >0.371485
< 1 1 | 3 13 >0.15855
< 1 1 | 3 14 >0.371485
< 1 1 | 4 1 >0.54541
< 1 1 | 4 2 >0.628974
< 1 1 | 4 3 >0.9563
< 1 1 | 4 4 >0.845781
< 1 1 | 4 11 >0.218496
< 1 1 | 4 12 >0.415693
+

* non-zero integrals (total 5565) first 30 shown

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S
1234567891011121314
11.6168-0.8736-0.0169-0.04010.00000.0008-0.00000.0000-0.0067-0.00000.00290.00630.00290.0063
2-0.87361.7127-0.34260.1530-0.0000-0.00370.0000-0.00000.02050.0000-0.0007-0.0255-0.0007-0.0255
3-0.0169-0.34261.7188-1.0454-0.00000.0196-0.0000-0.0000-0.1493-0.00000.05710.13620.05710.1362
4-0.04010.1530-1.04542.39900.0000-0.04680.00000.00000.47530.0000-0.1529-0.6090-0.1529-0.6090
50.0000-0.00000.00000.00001.1353-0.00000.0000-0.3602-0.00000.0000-0.05110.08690.0511-0.0869
60.0008-0.00370.0196-0.0468-0.00001.1253-0.0000-0.0000-0.3202-0.0000-0.03360.0388-0.03360.0388
7-0.0000-0.0000-0.00000.00000.0000-0.00001.11880.00000.0000-0.3040-0.0000-0.00000.0000-0.0000
8-0.0000-0.0000-0.0000-0.0000-0.36020.0000-0.00001.70170.0000-0.0000-0.1330-0.61280.13300.6128
9-0.00670.0205-0.14930.47530.0000-0.32020.00000.00001.37450.0000-0.1600-0.2764-0.1600-0.2764
10-0.00000.00000.0000-0.0000-0.0000-0.0000-0.3040-0.00000.00001.1188-0.00000.00000.0000-0.0000
110.0029-0.00070.0571-0.1529-0.0511-0.0336-0.0000-0.1330-0.1600-0.00001.3434-0.41770.02780.0503
120.0063-0.02550.1362-0.60900.08690.03880.0000-0.6128-0.27640.0000-0.41771.91270.0503-0.3714
130.0029-0.00070.0571-0.15290.0511-0.03360.00000.1330-0.16000.00000.02780.05031.3434-0.4177
140.0063-0.02550.1362-0.6090-0.08690.0388-0.00000.6128-0.2764-0.00000.0503-0.3714-0.41771.9127
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
orthogonal initial Fock
1234567891011121314
18.7602-31.3929-0.9828-1.81710.00000.0021-0.00000.0000-0.1702-0.00000.02810.01070.02810.0107
2-31.392914.3617-3.94270.7833-0.0000-0.04120.0000-0.00000.17980.0000-0.0054-0.3547-0.0054-0.3547
3-0.9828-3.9427-0.2298-1.56240.00000.0140-0.00000.0000-0.0003-0.0000-0.1189-0.2036-0.1189-0.2036
4-1.81710.7833-1.56240.38110.0000-0.03000.0000-0.00000.1373-0.0000-0.2508-0.2494-0.2508-0.2494
50.0000-0.00000.00000.00000.1539-0.0000-0.0000-0.5966-0.00000.0000-0.2965-0.03140.29650.0314
60.0021-0.04120.0140-0.0300-0.00000.0847-0.00000.0000-0.6085-0.0000-0.2219-0.0438-0.2219-0.0438
7-0.00000.0000-0.00000.0000-0.0000-0.0000-0.03670.0000-0.0000-0.6468-0.0000-0.00000.00000.0000
80.0000-0.00000.0000-0.0000-0.59660.00000.00000.56970.0000-0.0000-0.2222-0.13580.22220.1358
9-0.17020.1798-0.00030.1373-0.0000-0.6085-0.00000.00000.4722-0.0000-0.2104-0.0641-0.2104-0.0641
10-0.00000.0000-0.0000-0.00000.0000-0.0000-0.6468-0.0000-0.00000.4024-0.00000.00000.0000-0.0000
110.0281-0.0054-0.1189-0.2508-0.2965-0.2219-0.0000-0.2222-0.2104-0.00000.6554-0.50640.0585-0.0180
120.0107-0.3547-0.2036-0.2494-0.0314-0.0438-0.0000-0.1358-0.06410.0000-0.50640.2499-0.0180-0.1305
130.0281-0.0054-0.1189-0.25080.2965-0.22190.00000.2222-0.21040.00000.0585-0.01800.6554-0.5064
140.0107-0.3547-0.2036-0.24940.0314-0.04380.00000.1358-0.0641-0.0000-0.0180-0.1305-0.50640.2499
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
initial density
1234567891011121314
10.35730.2952-0.0775-0.0748-0.00000.0149-0.0000-0.00000.00910.0000-0.00770.0023-0.00770.0023
20.29520.2503-0.1072-0.1042-0.00000.0205-0.0000-0.00000.01290.0000-0.01060.0033-0.01060.0033
3-0.0775-0.10720.30460.30040.0000-0.0669-0.00000.0000-0.0428-0.00000.0273-0.01130.0273-0.0113
4-0.0748-0.10420.30040.29930.0000-0.09890.00000.0000-0.05960.00000.0175-0.01660.0175-0.0166
5-0.0000-0.00000.00000.00000.30920.00000.00000.12070.00000.00000.12850.0874-0.1285-0.0874
60.01490.0205-0.0669-0.09890.00000.37850.00000.00000.20220.00000.09870.06230.09870.0623
7-0.0000-0.0000-0.00000.00000.00000.00000.5364-0.00000.00000.2963-0.00000.00000.0000-0.0000
8-0.0000-0.00000.00000.00000.12070.0000-0.00000.04710.0000-0.00000.05020.0341-0.0502-0.0341
90.00910.0129-0.0428-0.05960.00000.20220.00000.00000.10820.00000.05170.03330.05170.0333
100.00000.0000-0.00000.00000.00000.00000.2963-0.00000.00000.1637-0.00000.00000.0000-0.0000
11-0.0077-0.01060.02730.01750.12850.0987-0.00000.05020.0517-0.00000.08600.0525-0.0208-0.0201
120.00230.0033-0.0113-0.01660.08740.06230.00000.03410.03330.00000.05250.0350-0.0201-0.0145
13-0.0077-0.01060.02730.0175-0.12850.09870.0000-0.05020.05170.0000-0.0208-0.02010.08600.0525
140.00230.0033-0.0113-0.0166-0.08740.0623-0.0000-0.03410.0333-0.0000-0.0201-0.01450.05250.0350
+
+
initial SCF electronic energy-83.98024604
+
+

scf

+ +
iteration limit100
convergence criterion1e-08
+

direct inversion of the iterative sub-space (diis) is on

+ + + +
electronic energy (E)Δ(E)rms(D)
83.980246037200
+

SCF converged in 1 cycles

+
+

post-scf

+ +
+
final scf total energy-75.9778789754
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
final orbital energies
1234567891011121314
-20.584168-1.298253-0.643919-0.545852-0.5002150.1750500.2592010.8658460.9090540.9779871.0887331.1076691.63622843.282673
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
orbital coeffiecients
1234567891011121314
10.5811320.1329270.000000-0.0436490.0000000.047750-0.000000-0.0000000.0174210.0000000.051310-0.000000-0.140459-1.731226
20.4612750.1838900.000000-0.0610700.0000000.064150-0.000000-0.0000000.0256740.0000000.080604-0.000000-0.2454571.875412
3-0.000573-0.518188-0.0000000.190046-0.000000-0.1152920.0000000.000000-0.097095-0.000000-0.4303270.0000001.890290-0.381402
40.001897-0.4922790.0000000.238642-0.000000-0.9786790.000000-0.000000-0.253072-0.0000000.515208-0.000000-2.4912170.311474
50.000000-0.0000000.556054-0.0000000.000000-0.000000-0.4417130.000000-0.0000000.633531-0.0000000.730348-0.000000-0.000000
60.001490-0.093918-0.000000-0.6080020.000000-0.3263450.0000000.0000000.9289010.000000-0.120819-0.0000000.118636-0.009629
7-0.000000-0.0000000.000000-0.000000-0.7323850.0000000.0000000.898755-0.000000-0.0000000.000000-0.000000-0.0000000.000000
8-0.000000-0.0000000.2171320.0000000.000000-0.000000-0.866497-0.0000000.000000-1.4446320.000000-0.9627590.000000-0.000000
9-0.000425-0.0373080.000000-0.3267520.000000-0.5223990.000000-0.000000-1.244406-0.000000-0.229739-0.000000-0.6769190.060523
100.000000-0.0000000.000000-0.000000-0.4046210.0000000.000000-1.0864760.0000000.000000-0.0000000.0000000.0000000.000000
110.000041-0.1062220.231020-0.1459890.0000000.0896160.0851500.000000-0.0406780.5704070.941064-0.7806140.364598-0.011644
12-0.000153-0.0148830.157227-0.1002040.0000000.9216081.2219270.0000000.3556730.125559-0.6980241.2521090.495288-0.068134
130.000041-0.106222-0.231020-0.145989-0.0000000.089616-0.085150-0.000000-0.040678-0.5704070.9410640.7806140.364598-0.011644
14-0.000153-0.014883-0.157227-0.1002040.0000000.921608-1.221927-0.0000000.355673-0.125559-0.698024-1.2521090.495288-0.068134
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
final density matrix
1234567891011121314
10.3572890.295171-0.077509-0.0747510.0000000.014920-0.000000-0.0000000.0090560.000000-0.0077240.002306-0.0077240.002306
20.2951710.250319-0.107160-0.1042240.0000000.020547-0.000000-0.0000000.0128980.000000-0.0105990.003312-0.0105990.003312
3-0.077509-0.1071600.3046370.300445-0.000000-0.066882-0.0000000.000000-0.042765-0.0000000.027298-0.0113310.027298-0.011331
4-0.074751-0.1042240.3004450.2992920.000000-0.0988580.0000000.000000-0.0596110.0000000.017452-0.0165870.017452-0.016587
50.0000000.000000-0.0000000.0000000.3091960.0000000.0000000.1207370.0000000.0000000.1284600.087427-0.128460-0.087427
60.0149200.020547-0.066882-0.0988580.0000000.378489-0.000000-0.0000000.202169-0.0000000.0987380.0623220.0987380.062322
7-0.000000-0.000000-0.0000000.0000000.000000-0.0000000.536388-0.0000000.0000000.296338-0.0000000.0000000.000000-0.000000
8-0.000000-0.0000000.0000000.0000000.120737-0.000000-0.0000000.047146-0.000000-0.0000000.0501620.034139-0.050162-0.034139
90.0090560.012898-0.042765-0.0596110.0000000.2021690.000000-0.0000000.1081590.0000000.0516650.0332970.0516650.033297
100.0000000.000000-0.0000000.0000000.000000-0.0000000.296338-0.0000000.0000000.163718-0.0000000.0000000.000000-0.000000
11-0.007724-0.0105990.0272980.0174520.1284600.098738-0.0000000.0501620.051665-0.0000000.0859660.052532-0.020775-0.020113
120.0023060.003312-0.011331-0.0165870.0874270.0623220.0000000.0341390.0332970.0000000.0525320.034983-0.020113-0.014458
13-0.007724-0.0105990.0272980.017452-0.1284600.0987380.000000-0.0501620.0516650.000000-0.020775-0.0201130.0859660.052532
140.0023060.003312-0.011331-0.016587-0.0874270.062322-0.000000-0.0341390.033297-0.000000-0.020113-0.0144580.0525320.034983


+ + +
charge analysis
orbitalatomdensity
Mulliken
1O11.1326
2O10.8623
3O10.9332
4O10.9846
5O10.9031
6O11.0567
7O11.3727
8O10.3628
9O10.5361
10O10.6273
11H10.4186
12H10.1958
13H20.4186
14H20.1958
reduced To atoms centers
O18.7713
H10.6143
H20.6143
corrected for charge
O1-0.7713
H10.3857
H20.3857
Lowdin
O18.6269
H10.6866
H20.6866
corrected for charge
O1-0.6269
H10.3134
H20.3134


+ + +
energy partition
descriptioncomponentsenergy
kinetict75.615449
nuclearn8.002367
coulombv-196.431128
one electront+v-120.815679
two electrong36.835433
totalt+v + 2g + n-75.977879
total potentialv + g + n-151.593328
total kinetict75.615449
viral ratio(v+g+n)/t-2.004793
bare hamiltoniant+v-120.815679
orbital-47.144813


+ + + +
dipoles
xyz(au)(debye)
0.01.071-0.01.0712.722


+ + + + + + + +
moller-plesset
{mp2} parallel spin-0.03315064
{mp2} anti-parallel spin-0.11955924
{mp2} total-0.15270988
{mp3} total0.00025664
{mp2+mp3} total-0.15245323
{total energy + mp correction} total-76.13033221


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
configuration interaction *
0.252173 (t)0.292974 (s)0.295141 (t)0.317586 (t)0.337254 (t)0.346602 (s)
0.384421 (s)0.412976 (t)0.438247 (s)0.448240 (t)0.491233 (s)0.612842 (s)
0.760997 (t)0.853591 (t)0.888961 (t)0.899729 (s)0.917223 (t)0.919604 (s)
0.936062 (s)0.990091 (t)1.019664 (s)1.020829 (t)1.043013 (t)1.043521 (t)
1.058933 (s)1.068390 (t)1.081822 (s)1.084000 (s)1.096696 (t)1.104538 (s)
1.142910 (t)1.160842 (s)1.177555 (s)1.178873 (t)1.180255 (t)1.186421 (t)
1.190928 (t)1.199287 (s)1.205015 (s)1.270942 (s)1.284893 (s)1.302587 (t)
1.304810 (t)1.341793 (s)1.392391 (s)1.501521 (t)1.561657 (s)1.599884 (t)
1.630092 (s)1.670463 (t)1.695862 (s)1.705389 (s)1.708690 (t)1.719396 (t)
1.746895 (s)1.796183 (s)1.840066 (t)1.849445 (s)1.951492 (t)1.958594 (t)
1.991704 (s)2.007458 (s)2.351602 (t)2.526316 (s)20.108470 (t)20.130558 (t)
20.181686 (s)20.196648 (s)20.619273 (t)20.689382 (s)20.697142 (t)20.760728 (s)
20.908614 (t)20.942497 (s)21.152755 (t)21.206037 (s)21.228055 (t)21.230269 (s)
21.439050 (t)21.521817 (s)42.762168 (t)42.798125 (s)42.886230 (t)42.940321 (s)
43.114239 (t)43.136053 (s)43.552387 (t)43.685736 (s)59.394414 (t)61.499744 (s)
+

* s -singlet, t -triplet

+
+ + + + + + + + +
block Davidson (first 5 eigenvalues)
0.2521730.2521730.2929740.2951410.295141
+
+ + + + + + + + + +
CIS significant excitations
stateenergy(%) excitation
00.252173(96) 9 -> 10 +
10.252173(96) 8 -> 11 +
20.252173(48) 8 -> 10 + (48) 9 -> 11
30.292974(49) 8 -> 10 + (49) 9 -> 11
40.295141(76) 6 -> 11 + (12) 7 -> 10
50.295141(44) 6 -> 10 + (44) 7 -> 11
60.295141(12) 6 -> 11 + (76) 7 -> 10
70.317586(96) 8 -> 13 +
80.317586(96) 9 -> 12 +
90.317586(48) 8 -> 12 +
+

contributions over 10% of 10 lowest energy levels



+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
configuration interaction spin-adapted singles
0.2929740.3466020.3844210.4382470.4912330.612842
0.8997290.9196040.9360621.0196641.0589331.081822
1.0840001.1045381.1608421.1775551.1992871.205015
1.2709421.2848931.3417931.3923911.5616571.630092
1.6958621.7053891.7468951.7961831.8494451.991704
2.0074582.52631620.18168620.19664820.68938220.760728
20.94249721.20603721.23026921.52181742.79812542.940321
43.13605343.68573661.499744


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
configuration interaction spin-adapted triplets
0.2521730.2951410.3175860.3372540.4129760.448240
0.7609970.8535910.8889610.9172230.9900911.020829
1.0430131.0435211.0683901.0966961.1429101.178873
1.1802551.1864211.1909281.3025871.3048101.501521
1.5998841.6704631.7086901.7193961.8400661.951492
1.9585942.35160220.10847020.13055820.61927320.697142
20.90861421.15275521.22805521.43905042.76216842.886230
43.11423943.55238759.394414


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
random phase approximation *
0.245831 (t)0.263757 (t)0.289646 (s)0.307353 (t)0.311168 (t)0.342772 (s)
0.380074 (s)0.407038 (t)0.428448 (t)0.433407 (s)0.487321 (s)0.600841 (s)
0.743211 (t)0.845371 (t)0.878914 (t)0.896751 (s)0.911610 (t)0.914765 (s)
0.931575 (s)0.986155 (t)1.014289 (t)1.018321 (s)1.036387 (t)1.039801 (t)
1.054386 (s)1.060941 (t)1.079128 (s)1.079834 (s)1.091055 (t)1.101729 (s)
1.138872 (t)1.147556 (s)1.175309 (t)1.175833 (s)1.179273 (t)1.181460 (t)
1.190586 (t)1.199034 (s)1.204741 (s)1.269937 (s)1.283532 (s)1.301091 (t)
1.303941 (t)1.327288 (s)1.386351 (s)1.480753 (s)1.495241 (t)1.595762 (t)
1.629635 (s)1.668132 (t)1.694286 (s)1.698233 (s)1.705230 (t)1.717895 (t)
1.740857 (s)1.795553 (s)1.838988 (t)1.848499 (s)1.950709 (t)1.958024 (t)
1.990951 (s)1.996781 (s)2.349538 (t)2.491218 (s)20.108173 (t)20.130467 (t)
20.181343 (s)20.196496 (s)20.619220 (t)20.689188 (s)20.696939 (t)20.760507 (s)
20.908587 (t)20.942401 (s)21.152291 (t)21.205711 (s)21.228050 (t)21.230261 (s)
21.438584 (t)21.521041 (s)42.762153 (t)42.798084 (s)42.886051 (t)42.940145 (s)
43.114229 (t)43.136019 (s)43.551765 (t)43.685053 (s)59.383579 (t)61.489135 (s)
+

* s -singlet, t -triplet



direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.161064281800
-0.15893759681.171921e-037.003444e-03
-0.15944137225.037754e-043.208554e-03
-0.15966407262.227004e-041.484732e-03
-0.15976537221.012996e-046.969349e-04
-0.15985558309.021080e-056.448208e-04
-0.15985561823.520021e-082.566834e-07
-0.15985562304.822583e-091.061690e-07
-0.15985561983.193103e-091.644379e-08
-0.15985561871.133933e-093.433163e-09
+

ccsd converged in 11 cycles

+ + + + + + +
coupled cluster
mp2 correction-0.15270988
singles and doubles CCSD-0.15985562
perturbative triples CCSD(T)-0.00153807
total ccsd correction-0.16139368
total energy ccsd corrected-76.13927266


direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.154374122400
-0.15419312397.000825e-053.444033e-04
-0.15421372532.060133e-051.116802e-04
-0.15422042646.701174e-064.145895e-05
-0.15422282262.396135e-061.699238e-05
-0.15422447671.654128e-061.416319e-05
-0.15422447541.336946e-091.383721e-08
-0.15422447485.532902e-103.296166e-09
+

cc2 converged in 9 cycles

+ + + +
coupled cluster CC2
cc2 correction-0.15422447
corrected energy-76.13210345
+ \ No newline at end of file diff --git a/test/h2o-dz.md b/test/h2o-dz.md new file mode 100644 index 0000000..b6c7292 --- /dev/null +++ b/test/h2o-dz.md @@ -0,0 +1,119 @@ +# Water in STO-3G basis + +Reference is Crawford project #3 [see](https://github.com/CrawfordGroup/ProgrammingProjects/blob/master/Project%2303/output/h2o/STO-3G/output.txt). Crawford first and harpy second. + +| Nuclear repulsion | | +|------------------------|-------------------| +| | 8.0023670618 | +| | 8.0023670618 | + +| Overlap (1st row) | | | | | | | | | | | | | | | +|-----------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | 1. | 0.8380557 | 0.3393514 | 0.1609665 | 0. | 0. | 0. | 0. | 0. | 0. | 0.0179951 | 0.0552886 | 0.0179951 |0.0552886 | +| | 1. | 0.8380557 |0.3393514 |0.1609665 | 0. | 0. | 0. | 0. | 0. | 0. | 0.0179951 |0.0552886 |0.0179951 | 0.0552886 | + +| Kinetic (diagonal) | | | | | | | | | | | | | | | +|--------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | 52.6148950 |14.2983000 |1.4097000 |0.4269000 |3.6349776| 3.6349776| 3.6349776 |0.5342500| 0.5342500 |0.5342500 |1.4157260 | 0.2664000| 1.4157260 |0.2664000| +| | 52.6148950 |14.2983000| 1.4097000 |0.4269000 |3.6349776| 3.6349776 |3.6349776| 0.5342500 |0.5342500 |0.5342500 | 1.4157260 |0.2664000| 1.4157260| 0.2664000 | + +| Coulomb (diagonal) | | | | | | | | | | | | | | | +|--------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | -82.4990426 | -40.3766945 |-13.3380146| -7.7470598| -11.7587263 |-11.7247201 |-11.6714398| -4.8575277| -4.7808320| -4.6606664 | -5.8164327 | -4.5175558 |-5.8164327 | -4.5175558| +| | -82.4990426 |-40.3766945 |-13.3380146| -7.7470598 |-11.7587263| -11.7247201 |-11.6714398| -4.8575278 |-4.7808320| -4.6606664 |-5.8164327 | -4.5175558 |-5.8164327 | -4.5175558 | + +| Core Hamiltonian | | | | | | | | | | | | | | | +|---------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | -29.8841477 |-26.0783945 |-11.9283146 |-7.3201598| -8.1237488 |-8.0897426| -8.0364623 |-4.3232777| -4.2465820|-4.1264164 | -4.4007067| -4.2511558|-4.4007067 |-4.2511558 | +| | -29.8841477 |-26.0783945| -11.9283146| -7.3201598 |-8.1237488 |-8.0897426 |-8.0364623 |-4.3232778| -4.2465820| -4.1264164 | -4.4007067 | -4.2511558 |-4.4007067| -4.2511558| + +| Initial electronic energy | | +|----------------------------|----------------------| +| | -132.798981914282 | +| | -132.798981914281 | + +| Final electronic energy | | +|----------------------------|----------------------| +| | -83.980246037187 | +| | -83.980246037188 | + +| Final total energy | dz | aug-cc-pvdz | +|----------------------------|----------------------|----------------------| +| | -75.977878975377 | -76.0038462065 | +| | -75.977878975377 | -76.0038462395 | + +*aug-cc-pvdz comparison with McMurchie-Davidson program* + + +| Final density trace | | | | | | | | | | | | | | | +|--------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| | 0.3572894 |0.2503195 |0.3046369| 0.2992919| 0.3091959 |0.3784894 |0.5363885 |0.0471462 |0.1081589| 0.1637180| 0.0859661| 0.0349829 |0.0859661 |0.0349829 | +| | 0.3572894 |0.2503195 |0.3046369| 0.2992919| 0.3091959 |0.3784894 |0.5363885 |0.0471462 |0.1081589| 0.1637180|0.0859661 |0.0349829| 0.0859661| 0.0349829| + +| Dipole | x | y | z | resultant | +|----------------------------|----------------------|----------------------|-----------|----------| +| | 0.000000000000 | 1.070995737060 | 0.000000000000 | 1.070995737060 | +| | 0.000000000000 | 1.07099574 | 0.000000000000 | 1.07099574 | + +| Charge (Mulliken) | O | H | H | +|----------------------------|---------------------|----------------|-----------| +| | -0.771301809588 | 0.385650904794 | 0.385650904794 | +| | -0.77130181 | 0.3856509 | 0.3856509 | + +| moller-plesset 2 | | +| ------------------|------------| +| | -0.152709879075 | +| | -0.152709879075 | + +| CIS | | | | | | +|-------|--------|------|------|--------|----------| +| | 0.2521733734 | 0.2929742879 | 0.2951406202 | 0.3175855602 | 0.3372543633 | +| | |0.25217337 0.29297429 | 0.29514062 | 0.31758556 | 0.33725436 | + + +| RPA | | | | | | +|-------|--------|------|------|--------|----------| +| | 0.2458308730 | 0.2637567614 | 0.2896457262 | 0.3073528488 | 0.3111679098 | +| | 0.24583087 | 0.26375676 | 0.28964573 | 0.30735285 | 0.31116791| + +| Coupled cluster | mp2 | sd | t | +|----------------------------|-----------------------|----------------------|------------------| +| | -0.152709879075 | -0.159855618083 | -0.001538065776 | +| | -0.152709879075 | -0.159855618086 |-0.001538065776 | + +| CC2 | | +|-------------------------|-------------------| +| | -76.1321035 | +| correction | -0.1542245 | +| | -76.1321035 | + + +| Polarizabilities | principal polarizabilities | isotropic polarizability | +|-------------------------|-----------------------------------|-----------------------------| +| psi4 | 8.0314 12.5164 10.0903 | 10.2127 | +| harpy | 8.0313 12.5164 10.0905 | 10.2127 | + +*tested at aug-cc-pvdz level and compared with psi4 (with puream False so cartesian basis)* + +*psi4 uses nuclear charge gauge* + +**Hyperpolarizabilities** + +| psi4 | | | | harpy | | | +|---------|--------|-------------|--|----|-------|-------| +| 0.0 |-25.7868 | 0.0 | | 0.0 | -25.7868 | 0.0 | +| 0.0 | -11.5853 | 0.0 | | 0.0 | -11.5853 | 0.0 | +| 0.0 | 0.2452 | 0.0 | | 0.0 | 0.2452 | 0.0 | +| -0.2579 | 0.0 | 0.0 | | -0.2579 | 0.0 | 0.0 | +| 0.0 | 0.0 | 0.0 | | 0.0 | 0.0 | 0.0 | +| 0.0 | 0.0 | 0.2452 | | 0.0 | 0.0 | 0.2452 | + +*tested at aug-cc-pvdz level, psi4 puream=False, scf_type=direct, noreorient, using nuclear charge gauge in harpy.* + + +Note the saving using + +h2o-aug-cc-pvdz-mints.npz density matrix with aug-cc-pvdz basis - (without) 61 s (with) 35s + +h2o-dz-mints.npz density matrix with dz basis - (without) 1 s (with) 0.8s + diff --git a/test/h2o-sto-3g.html b/test/h2o-sto-3g.html new file mode 100644 index 0000000..ca2ee62 --- /dev/null +++ b/test/h2o-sto-3g.html @@ -0,0 +1,1224 @@ + + + + +

HARPY RHF output for h2o

+

atoms

+

number of atoms is 3

+ + + + + + + +
atomic input data
idnumberxyzweight
1O180.0-0.1432258165520.015.99903
2H111.6380368404071.1365488225470.01.00784
3H21-1.6380368404071.1365488225470.01.00784
+
+ + + + + +
interatom seperations
atomsd (bohr)
O1-H12.079
O1-H22.079
+
+ + + + +
interatom angles
atomsangle
H1-O1-H2104.0
+
+ + + +
center of mass
xyz
0.0-0.00.0
+
+ + + +
inferred bonds
O1H1H2
O1XX
H1X
H2X
+
+ + + + + + +
inertia tensor
xyz
2.9319390.00.0
0.05.4084010.0
0.00.08.340341
+
+ + + + + +
principal moments (amu bohr2)
IaIbIc
2.9319395.4084018.340341
+
+
rotor typeasymmetric top
+
+ + + + + +
rotational constants (g cm-1)
ABC
20.532411.13087.2179
+
+
nuclear repulsion energy8.00236706
+
+

orbitals

+ +
+
number of electrons10
+
+
basis setsto-3g
+
+
Spherical +
Basis Set Exchange +
Version v0.8.12 +
https://www.basissetexchange.org +
Basis set: STO-3G +
Description: STO-3G Minimal Basis (3 functions/AO) +
Role: orbital +
Version: 1 (Data from Gaussian09) +
+
+ + + + + +
orbital occupancy
number of basis functions7
number doubly occupied orbitals5
number of virtual orbitals2
+
+ + + + + + + + + + +
atomic orbitals
+ 1O1Os2O1Os3O1Opx4O1Opy
+ 5O1Opz6H1Hs7H2Hs
+
+ + + + + + + +
aufbau atomic occupancies
idorbitals
1O11s22s22p4
2H11s1
3H21s1
+
+

pre-scf

+ +
+ + +
initial fock guesscore hamiltonian
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
overlap
1234567
11.00000.23670.00000.00000.00000.03840.0384
20.23671.00000.00000.00000.00000.38610.3861
30.00000.00001.00000.00000.00000.2684-0.2684
40.00000.00000.00001.00000.00000.20970.2097
50.00000.00000.00000.00001.00000.00000.0000
60.03840.38610.26840.20970.00001.00000.1818
70.03840.3861-0.26840.20970.00000.18181.0000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
kinetic
1234567
129.0032-0.16800.00000.00000.0000-0.0084-0.0084
2-0.16800.80810.00000.00000.00000.07050.0705
30.00000.00002.52870.00000.00000.1471-0.1471
40.00000.00000.00002.52870.00000.11490.1149
50.00000.00000.00000.00002.52870.00000.0000
6-0.00840.07050.14710.11490.00000.7600-0.0040
7-0.00840.0705-0.14710.11490.0000-0.00400.7600
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coulomb
1234567
1-61.5806-7.41080.0000-0.01450.0000-1.2317-1.2317
2-7.4108-10.00910.0000-0.17690.0000-2.9772-2.9772
30.00000.0000-9.98760.00000.0000-1.82221.8222
4-0.0145-0.17690.0000-9.94400.0000-1.4718-1.4718
50.00000.00000.00000.0000-9.87590.00000.0000
6-1.2317-2.9772-1.8222-1.47180.0000-5.3002-1.0672
7-1.2317-2.97721.8222-1.47180.0000-1.0672-5.3002
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
two electron repulsion integrals *
< i j | k l >
< 1 1 | 1 1 >4.785066
< 1 1 | 1 2 >0.74138
< 1 1 | 1 6 >0.121785
< 1 1 | 1 7 >0.121785
< 1 1 | 2 1 >0.74138
< 1 1 | 2 2 >1.118947
< 1 1 | 2 6 >0.313334
< 1 1 | 2 7 >0.313334
< 1 1 | 3 3 >1.115814
< 1 1 | 3 6 >0.183539
< 1 1 | 3 7 >-0.183539
< 1 1 | 4 4 >1.115814
< 1 1 | 4 6 >0.143396
< 1 1 | 4 7 >0.143396
< 1 1 | 5 5 >1.115814
< 1 1 | 6 1 >0.121785
< 1 1 | 6 2 >0.313334
< 1 1 | 6 3 >0.183539
< 1 1 | 6 4 >0.143396
< 1 1 | 6 6 >0.470723
< 1 1 | 6 7 >0.105864
< 1 1 | 7 1 >0.121785
< 1 1 | 7 2 >0.313334
< 1 1 | 7 3 >-0.183539
< 1 1 | 7 4 >0.143396
< 1 1 | 7 6 >0.105864
< 1 1 | 7 7 >0.470723
< 1 2 | 1 1 >0.74138
< 1 2 | 1 2 >0.136873
< 1 2 | 1 6 >0.022309
+

* non-zero integrals (total 406) first 30 shown

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S
1234567
11.0236-0.1369-0.0000-0.00750.00000.01900.0190
2-0.13691.15790.00000.07220.0000-0.2223-0.2223
3-0.00000.00001.0733-0.00000.0000-0.17580.1758
4-0.00750.07220.00001.03830.0000-0.1185-0.1185
50.00000.00000.00000.00001.00000.00000.0000
60.0190-0.2223-0.1758-0.11850.00001.1297-0.0626
70.0190-0.22230.1758-0.11850.0000-0.06261.1297
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
orthogonal initial Fock
1234567
1-19.8799-2.6854-0.0000-0.05340.0000-0.0962-0.0962
2-2.6854-1.31200.00000.1020-0.0000-0.4050-0.4050
3-0.00000.0000-0.00940.0000-0.0000-0.40110.4011
4-0.05340.10200.0000-0.15060.0000-0.3003-0.3003
50.0000-0.0000-0.00000.0000-0.3876-0.00000.0000
6-0.0962-0.4050-0.4011-0.3003-0.0000-0.0197-0.0693
7-0.0962-0.40500.4011-0.30030.0000-0.0693-0.0197
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
initial density
1234567
11.0549-0.2328-0.00000.0526-0.0000-0.0082-0.0082
2-0.23281.0151-0.0000-0.28230.0000-0.0305-0.0305
3-0.0000-0.00000.3688-0.00000.00000.2751-0.2751
40.0526-0.2823-0.00000.5660-0.00000.25860.2586
5-0.00000.00000.0000-0.00001.00000.0000-0.0000
6-0.0082-0.03050.27510.25860.00000.3345-0.0759
7-0.0082-0.0305-0.27510.2586-0.0000-0.07590.3345
+
+
initial SCF electronic energy-82.94444702
+
+

scf

+ +
iteration limit100
convergence criterion1e-08
+

direct inversion of the iterative sub-space (diis) is on

+ + + +
electronic energy (E)Δ(E)rms(D)
82.944447015900
+

SCF converged in 1 cycles

+
+

post-scf

+ +
+
final scf total energy-74.9420799540
+
+ + + + + + + + + + + + + + + + +
final orbital energies
1234567
-20.262891-1.209697-0.547965-0.436527-0.3875870.4776190.588139
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
orbital coeffiecients
1234567
1-0.994435-0.2391590.000000-0.093683-0.0000000.1116400.000000
2-0.0240970.885736-0.0000000.4795860.000000-0.669579-0.000000
30.000000-0.000000-0.607285-0.0000000.0000000.000000-0.919234
4-0.0031620.0858960.000000-0.7474310.000000-0.738489-0.000000
50.000000-0.000000-0.000000-0.000000-1.000000-0.0000000.000000
60.0045940.144040-0.452998-0.3294710.0000000.7098500.732461
70.0045940.1440400.452998-0.329471-0.0000000.709850-0.732461
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
final density matrix
1234567
11.054874-0.2327980.0000000.0526230.000000-0.008151-0.008151
2-0.2327981.0151110.000000-0.282300-0.000000-0.030539-0.030539
30.0000000.0000000.368795-0.000000-0.0000000.275099-0.275099
40.052623-0.282300-0.0000000.5660420.0000000.2586150.258615
50.000000-0.000000-0.0000000.0000001.000000-0.0000000.000000
6-0.008151-0.0305390.2750990.258615-0.0000000.334527-0.075887
7-0.008151-0.030539-0.2750990.2586150.000000-0.0758870.334527


+ + +
charge analysis
orbitalatomdensity
Mulliken
1O11.9983
2O11.8728
3O11.033
4O11.349
5O12.0
6H10.8734
7H20.8734
reduced To atoms centers
O18.2531
H10.8734
H20.8734
corrected for charge
O1-0.2531
H10.1266
H20.1266
Lowdin
O18.1842
H10.9079
H20.9079
corrected for charge
O1-0.1842
H10.0921
H20.0921


+ + + + + +
Mayer bond orders and valence
H1H2valence
O10.97520.97521.95
H10.00880.98
H20.98


+ + +
energy partition
descriptioncomponentsenergy
kinetict74.334933
nuclearn8.002367
coulombv-194.534493
one electront+v-120.199559
two electrong37.255112
totalt+v + 2g + n-74.94208
total potentialv + g + n-149.277013
total kinetict74.334933
viral ratio(v+g+n)/t-2.008168
bare hamiltoniant+v-120.199559
orbital-45.689335


+ + + +
dipoles
xyz(au)(debye)
0.00.60350.00.60351.5339


+ + + + + + + + + + +
quadrupoles (debye Å)
x2y2z2xyyzzx
-4.3165-5.2051-6.20720.0-0.00.0
traceless
0.92640.0378-0.96420.0-0.00.0
eigenvalues
0.92640.0378-0.9642
trace is close to zeroTrue
amplitude1.3377
asymmetry0.8886


+ + + + + + + +
moller-plesset
{mp2} parallel spin-0.00310622
{mp2} anti-parallel spin-0.04604342
{mp2} total-0.04914964
{mp3} total-0.01418782
{mp2+mp3} total-0.06333746
{total energy + mp correction} total-75.00541741


+ + + +
orbital optimised mp2
cycletotal energyΔ(E)
7 -74.99147132-3.34074e-09


+ + + + + + + + + +
Laplace transform generated mp2
method
reference scf energy-74.94207995
parallel spin correlation-0.00310618
anti-parallel spin correlation-0.04603963
total spin correlation-0.04914581
corrected scf energy-74.99122576
total spin-component scaled-0.05628295
corrected spin-component scaled-74.99836290


+ + + + + + +
many-body perturbation diagrams
mp2 correlation-0.04914964
mp3 correlation-0.01418782
mp4 correlation-0.00469027
SCF energy-74.94207995
Total corrected energy-75.01010769


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
configuration interaction *
0.287256 (t)0.344425 (t)0.356462 (s)0.365989 (t)0.394514 (t)0.416072 (s)
0.505628 (s)0.514290 (t)0.555192 (s)0.563056 (t)0.655318 (s)0.910122 (s)
1.108771 (t)1.200096 (t)1.300785 (s)1.325762 (s)19.958526 (t)20.010979 (s)
20.011342 (t)20.050532 (s)
+

* s -singlet, t -triplet

+
+ + + + + + + + +
block Davidson (first 5 eigenvalues)
0.2872560.2872560.2872560.3444250.344425
+
+ + + + + + + + + + +
CIS significant excitations
stateenergy(%) excitation
00.287256(50) 8 -> 10 + (50) 9 -> 11
10.287256(94) 8 -> 11 +
20.287256(94) 9 -> 10 +
30.344425(44) 6 -> 10 + (44) 7 -> 11
40.344425(40) 6 -> 11 + (49) 7 -> 10
50.344425(49) 6 -> 11 + (40) 7 -> 10
60.356462(50) 8 -> 10 + (50) 9 -> 11
70.365989(50) 8 -> 12 + (50) 9 -> 13
80.365989(100) 9 -> 12 +
90.365989(100) 8 -> 13 +
+

contributions over 10% of 10 lowest energy levels



+ + + + + + + + + + + + + + + +
configuration interaction spin-adapted singles
0.3564620.4160720.5056280.5551920.6553180.910122
1.3007851.32576220.01097920.050532


+ + + + + + + + + + + + + + + +
configuration interaction spin-adapted triplets
0.2872560.3444250.3659890.3945140.5142900.563056
1.1087711.20009619.95852620.011342


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
random phase approximation *
0.285164 (t)0.299743 (t)0.352627 (t)0.354778 (s)0.365131 (t)0.415318 (s)
0.500101 (s)0.510661 (t)0.546072 (t)0.551372 (s)0.650271 (s)0.873425 (s)
1.103819 (t)1.195787 (t)1.283205 (s)1.323742 (s)19.958504 (t)20.010947 (s)
20.011307 (t)20.050492 (s)
+

* s -singlet, t -triplet



+ + + + + + + +
full configuration interaction
number of electrons10
number of spin orbitals14
number of determinants1001
SCF energy-74.942080
FCI energy-75.012980
FCI correction -0.070900


+ + + + + + + +
ci singles and doubles
number of electrons10
number of spin orbitals14
number of determinants1001
SCF energy-74.942080
CISD energy-75.011223
CISD correction -0.069143


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ci singles (slater determinants)
number of electrons10
number of spin orbitals14
number of determinants40
7.8166207.8166207.8166209.3722829.3722829.372282
9.6998199.9590689.9590689.95906810.73526710.735267
10.73526711.32188913.75884613.99454313.99454313.994543
15.10754015.32152715.32152715.32152717.83212324.765672
30.17119430.17119430.17119432.65627832.65627832.656278
35.39616736.075822543.099141543.099141543.099141544.526460
544.536329544.536329544.536329545.602739


direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.072139497800
-0.06932072861.779670e-031.331253e-02
-0.07007008467.493560e-045.854548e-03
-0.07039981353.297290e-042.649446e-03
-0.07054881141.489979e-041.222540e-03
-0.07067993511.311237e-041.110052e-03
-0.07068008071.455987e-077.933262e-07
-0.07068009141.070254e-086.703937e-08
-0.07068008892.569719e-098.026180e-10
+

ccsd converged in 10 cycles

+ + + + + + +
coupled cluster
mp2 correction-0.04914964
singles and doubles CCSD-0.07068009
perturbative triples CCSD(T)-0.00009988
total ccsd correction-0.07077997
total energy ccsd corrected-75.01285992


direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.049412919600
-0.04938391001.918532e-051.814295e-04
-0.04939225358.343588e-067.860032e-05
-0.04939599293.739376e-063.513481e-05
-0.04939768861.695677e-061.590804e-05
-0.04939911301.424448e-061.334692e-05
-0.04939911301.539879e-121.497513e-11
+

cc2 converged in 8 cycles

+ + + +
coupled cluster CC2
cc2 correction-0.04939911
corrected energy-74.99147907


direct inversion of the iterative sub-space (diis) is off

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.077525282200
-0.06832096344.983504e-033.423380e-02
-0.07032223662.001273e-031.470066e-02
-0.07119027318.680365e-046.646830e-03
-0.07158264923.923760e-043.081582e-03
-0.07176422521.815761e-041.450789e-03
-0.07184958778.536242e-056.914634e-04
-0.07189024524.065756e-053.334865e-04
-0.07190985561.961043e-051.628538e-04
-0.07191943949.583791e-068.060267e-05
-0.07192418924.749778e-064.047168e-05
-0.07192657852.389294e-062.063125e-05
-0.07192779921.220671e-061.068163e-05
-0.07192843276.335376e-075.616500e-06
-0.07192876673.339760e-072.997756e-06
-0.07192894541.787160e-071.622729e-06
-0.07192904249.698204e-088.898153e-07
-0.07192909575.330306e-084.935842e-07
-0.07192912532.962975e-082.765656e-07
-0.07192914191.663324e-081.563094e-07
-0.07192915149.416100e-098.898838e-08
-0.07192915675.368172e-095.096942e-08
-0.07192915983.078352e-092.933908e-08
-0.07192916161.773735e-091.695677e-08
-0.07192916261.026002e-099.832472e-09
+

lccd converged in 26 cycles

+ + + +
linear coupled cluster doubles *
lccd correction-0.07192916
corrected energy-75.01400912
+

*coupled electron pair approximation (zero)



direct inversion of the iterative sub-space (diis) is off

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.076402053700
-0.06724031704.464472e-033.081237e-02
-0.06892937671.689060e-031.244851e-02
-0.06962176096.923842e-045.297244e-03
-0.06991706652.953056e-042.308803e-03
-0.07004581091.287444e-041.021530e-03
-0.07010282825.701729e-054.578962e-04
-0.07012844222.561398e-052.080163e-04
-0.07014011851.167637e-059.588013e-05
-0.07014552515.406571e-064.489327e-05
-0.07014807052.545354e-062.137318e-05
-0.07014928971.219240e-061.035184e-05
-0.07014988415.943569e-075.100621e-06
-0.07015017882.947770e-072.555322e-06
-0.07015032751.486191e-071.300281e-06
-0.07015040357.607624e-086.711068e-07
-0.07015044303.947720e-083.507568e-07
-0.07015046382.073139e-081.853288e-07
-0.07015047481.099886e-089.882785e-08
-0.07015048065.885607e-095.310610e-08
-0.07015048383.171835e-092.871700e-08
-0.07015048551.719239e-091.560796e-08
-0.07015048659.362297e-108.517826e-09
+

ccd converged in 24 cycles

+ + + +
coupled cluster doubles
ccd correction-0.07015049
corrected energy-75.01223044


direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + + + +
coupled-cluster interations
ccsd energyΔ(E)Δrms(amplitudes)
-0.077897588100
-0.06866594075.142328e-033.550485e-02
-0.07077712842.111188e-031.564786e-02
-0.07171742039.402919e-047.298489e-03
-0.07215609154.386712e-043.509116e-03
-0.07257600914.199176e-043.491896e-03
-0.07257645954.504713e-072.608846e-06
-0.07257659281.332681e-077.407141e-07
-0.07257658785.026186e-097.013158e-09
+

lccsd converged in 10 cycles

+ + + +
linear coupled-cluster singles and doubles
lccsd correction-0.07257659
corrected energy-75.01465654


+ + + + + + + + + + +
molecular forces (Eha0-1)
atomxyz
analytic
O10.0000000.0974410.000000
H1-0.086300-0.0487210.000000
H20.086300-0.0487210.000000
numeric
O1-0.0000000.097441-0.000000
H1-0.086300-0.048721-0.000000
H20.086300-0.048721-0.000000


+ + + + + + + + + + + + + + + + + + + +
electron propogator - Koopman's theorem
HOMO - nKoopman (eV)EP2 (eV)
ep2 spatial
-1-11.8785-10.3403
0-10.5468-7.4044
112.996712.8950
216.004115.6734
ep2 spin
4-551.3813-541.7558
3-32.9175-29.8607
2-14.9109-14.5980
1-11.8785-10.3404
0-10.5468-7.4044
ep3 spin
4-551.3813-543.6306
3-32.9175-29.2271
2-14.9109-14.8363
1-11.8785-10.7673
0-10.5468-8.1825


+ + +
Approximate Greens function correction to Koopmans theorem (eV)
HOMO - nKoopmanorbital relaxationpair relaxationpair removalcorrectionKP + correction
0551.381312.64570.0171-0.0016-12.6644538.7169 +
132.91751.92543.1906-0.2181-5.334227.5834 +
214.91090.72150.2512-0.6473-1.620013.2909 +
311.87851.87330.2178-0.4429-2.53409.3445 +
410.54683.44790.0579-0.0276-3.53347.0134 +


+ + + + +
polarizability (α) (coupled-perturbed SCF)
principal polarizabilities
7.93560.05043.0682
isotropic3.6847


+ + + + +
polarizability (α) (coupled-perturbed SCF)
principal polarizabilities
7.93560.05043.0682
isotropic3.6847


+ + + + + + +
static hyperpolarizability (β) (au)
xyz
-0.0000-14.41060.0002
amplitude14.4106
z0.0000
z0.0001


+ + + + + + + + + +
Cluster Operator Generator Using Sympy
CCD-0.0701504876
CCSD-0.0706800888
CCSDT-0.0708128081
CCSD(T)-0.0706800888-9.98773e-05
CC2-0.0493991402
CC3-0.0707780329
LCCD-0.0719291641
LCCSD-0.0725765893
+ \ No newline at end of file diff --git a/test/h2o-sto-3g.md b/test/h2o-sto-3g.md new file mode 100644 index 0000000..39bf7e1 --- /dev/null +++ b/test/h2o-sto-3g.md @@ -0,0 +1,232 @@ +# Water in STO-3G basis + +Reference is Crawford project #3 [see](https://github.com/CrawfordGroup/ProgrammingProjects/blob/master/Project%2303/output/h2o/STO-3G/output.txt). **Crawford first and harpy second** + +| Nuclear repulsion | | +|-----------------------|-------------------| +| | 8.0023670618 | +| | 8.0023670618 | + +| Overlap (1st row) | | | | | | | | +|-----------------------|------------|-----------|-----------|-----------|-----------|-----------|-----------| +| | 1.0000000 | 0.2367039 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0384056 | 0.0384056 | +| | 1. | 0.2367039 | 0. | 0. | 0. | 0.0384056 | 0.0384056 | + +| Kinetic (diagonal) | | | | | | | | +|-----------------------|------------|-----------|-----------|-----------|-----------|-----------|-----------| +| | 29.0031999 | 0.8081280 | 2.5287312 | 2.5287312 | 2.5287312 | 0.7600319 | 0.7600319 | +| | 29.0032041 | 0.8081279 | 2.5287312 | 2.5287312 | 2.5287312 | 0.7600319 | 0.7600319 | + +| Coulomb (diagonal) | | | | | | | | +|-----------------------|------------|-----------|-----------|-----------|-----------|-----------|-----------| +| |-61.5805954 |-10.0090712| -9.9875505| -9.9440430| -9.8758761| -5.3002030| 5.3002030| +| |-61.5805996 |-10.0090710| -9.9875505|-9.9440430 | -9.8758761| -5.3002029| -5.3002029| + +| Core Hamiltonian | | | | | | | | +|-----------------------|------------|-----------|-----------|-----------|-----------|-----------|-----------| +| |-32.5773954 | -9.2009433| -7.4588193| -7.4153118| -7.3471449| -4.5401711| -4.5401711| +| |-32.5773956 | -9.2009431| -7.4588193| -7.4153117| -7.3471448| -4.5401711| -4.5401711| + +| Initial electronic energy | | +|-------------------------------|-------------------| +| | -125.842077437699 | +| | -125.842077855707 | + +| Final electronic energy | | +|-------------------------------|-------------------| +| | -82.944446990003 | +| | -82.944447015860 | + +| Final total energy | | +|-------------------------------|-------------------| +| | -74.942079928192 | +| | -74.942079954049 | + +| Final density trace | | | | | | | | +|-----------------------|------------|-----------|-----------|-----------|-----------|-----------|-----------| +| | 1.0548737 | 1.0151108 | 0.3687949 | 0.5660419 | 1.0000000 | 0.3345267 | 0.3345267 | +| | 1.0548737 | 1.0151108 | 0.3687949 | 0.5660419 | 1.0000000 | 0.3345267 | 0.3345267 | + +| Dipole | x | y | z | resultant | +|-----------------------|------------------|-----------------|-----------------|-----------------| +| | 0.000000000000 | 0.603521296525 | 0.000000000000 | 0.603521296525 | +| | 0.00000000 | 0.603521344 | 0.00000000 | 0.603521344 | + +| Charges (mulliken) | O | H | H | +|-----------------------|------------------|-----------------|-----------------| +| | -0.253146052405 | 0.126573026202 | 0.126573026202 | +| | -0.25314612 | 0.12657306 | 0.12657306 | + +| bond orders | H | H | valency | +|---------------|--------|---------|-----------| +| O | 0.9752 | 0.9752 | 1.95 | +| H | | 0.0088 | 0.98 | +| H | | | 0.98 | + +| moller-plesset (mp2) | | +|-----------------------|------------------| +| | -0.049149636120 | +| | -0.049149636690 | + +|CIS | | | | | | +|-----------------------|--------------|-------------|-------------|-------------|-------------| +| | 0.2872554996 | 0.3444249963| 0.3564617587| 0.3659889948| 0.3945137992| +| | 0.28725552 | 0.34442501 | 0.35646178 | 0.36598901 | 0.39451381 | + +|RPA | | | | | | +|-----------------------|--------------|-------------|-------------|-------------|-------------| +| | 0.2851637170 |0.2997434467 | 0.3526266606| 0.3547782530| 0.3651313107| +| | 0.28516373 |0.29974346 | 0.35262667 | 0.35477827 | 0.36513132 | + +| Coupled cluster | mp2 | sd | t | +|-----------------------|------------------|-----------------|-----------------| +| | -0.049149636120 | -0.070680088376 | -0.000099877272 | +| | -0.049149636690 | -0.070680088804 | -0.000099877268 | + +| Forces | Ox | Oy | Oz | Hx | Hy | Hz | Hx | Hy | Hz | +|-----------------------|----------|----------|----------|----------|----------|----------|----------|----------|----------| +| | 0.000000 | 0.097441 | 0.000000 |-0.086300 | -0.048721| 0.000000 | 0.086300 | -0.048721| 0.000000 | +| | 0.000000 | 0.097441 | 0.000000 |-0.086300 | -0.048721| 0.000000 | 0.086300 | -0.048721| 0.000000 | + +*Tested at STO-3G level against Joshua Goings McMurchie-Davidson program* + +| CCD | | +|-------------------------|----------------------| +| | -0.07015051 | +| | -0.07015048 | + + +*Tested on psi4numpy tutorial* + +| LCCD | | +|-----------------------|----------------------| +| | -0.07192915 | +| | -0.07192915 | + + *Tested on psi4numpy tutorial* + +| CC2 | | +|-------------------|---------------------| +| | -74.9914791 | +| correction (harpy)| -0.0493991 | +| | -74.9914791 | + + *Tested against psi4* + +| CCSD-Λ | | +|---------------|-----------------| +| | -0.068888201463 | +| | -0.06888820 | + +*Tested against psi4numpy* + + +| OOMP2 | iteration | psi4 numpy | harpy | +|-----------------------|-------------------------------|------------------------------------|------------------------------------| +| | OMP2 iteration: 0 | -76.09603493 dE: -7.60960E+01 | -76.09603494 dE: -7.60960E+01 | +| | OMP2 iteration: 1 | -76.09617336 dE: -1.38424E-04 | -76.09617337 dE: -1.38423E-04 | +| | OMP2 iteration: 2 | -76.09618834 dE: -1.49844E-05 | -76.09618835 dE: -1.49844E-05 | +| | OMP2 iteration: 3 | -76.09619159 dE: -3.24371E-06 | -76.09619160 dE: -3.24371E-06 | +| | OMP2 iteration: 4 | -76.09619246 dE: -8.72489E-07 | -76.09619247 dE: -8.72489E-07 | +| | OMP2 iteration: 5 | -76.09619281 dE: -3.48877E-07 | -76.09619282 dE: -3.48878E-07 | +| | OMP2 iteration: 6 | -76.09619295 dE: -1.38242E-07 | -76.09619296 dE: -1.38240E-07 | +| | OMP2 iteration: 7 | -76.09619301 dE: -6.80800E-08 | -76.09619302 dE: -6.80790E-08 | +| | OMP2 iteration: 8 | -76.09619305 dE: -3.19301E-08 | -76.09619306 dE: -3.19281E-08 | +| | OMP2 iteration: 9 | -76.09619306 dE: -1.65530E-08 | -76.09619307 dE: -1.65554E-08 | +| | OMP2 iteration: 10 | -76.09619307 dE: -8.24737E-09 | -76.09619308 dE: -8.24936E-09 | + +*Tested at 6-31G level against psi4numpy tutorial* + +| EP2 | HOMO - n | KP (eV) | EP2 (eV) | harpy | +|-----------------------|:---:|---------------|--------------|--------------| +| | -1 | -11.8785 | -10.3403 | -10.3403 | +| | 0 | -10.5468 | -7.4045 | -7.4044 | +| | 1 | 12.9967 | 12.8950 | 12.8950 | +| | 2 | 16.0041 | 15.6734 | 15.6734 | + +*Tested against Psi4 at STO-3G level (harpy output matches KP)* + +| EP2 spin adapted | HOMO - n | KP (eV) | EP2 (eV) | harpy | +|-----------------------|:---:|---------------|--------------|--------------| +| | 4 | -551.3813 | -541.7559 | -541.7558 | +| | 3 | -32.9175 | -29.8609 | -29.0607 | +| | 2 | -14.9109 | -14.5980 | -14.5980 | +| | 1 | -11.8785 | -10.3404 | -10.3404 | +| | 0 | -10.5468 | -7.4046 | -7.4044 | + +*Tested against psi4numpy at STO-3G level* + +| EP3 spin adapted | HOMO - n | KP (eV) | EP2 (eV) | EP3 (eV) | harpy | +|-----------------------|:---:|---------------|--------------|--------------|---------------| +| | 4 | -551.3813 | -541.7559 | -543.6307 | -543.6306 | +| | 3 | -32.9175 | -29.8609 | -29.2271 | -29.2271 | +| | 2 | -14.9109 | -14.5980 | -14.8363 | -14.8363 | +| | 1 | -11.8785 | -10.3404 | -10.7673 | -10.7673 | +| | 0 | -10.5468 | -7.4046 | -8.1825 | -8.1825 | + +*Tested against psi4numpy at STO-3G level* + + +|Coupled-Perturbed SCF | Principal polarizabilities | Isotropic polarizability | +|-----------------------|--------------------------------|-----------------------------| +| | 0.0504 7.9355 3.0682 | 3.6847 | +| | 0.0504 7.9356 3.0682 | 3.6847 | + +*Tested against psi4numpy at STO-3G level* + +| MP2 Laplace | Energy type | harpy | psi4numpy | +|-----------------------|------------------------------------|-------------------|------------------| +| | MP2 SS correlation energy | -0.0460396280 | -0.0460396451 | +| | MP2 OS correlation energy | -0.0031061810 | -0.0031061822 | +| | MP2 correlation energy | -0.0491458090 | -0.0491458273 | +| | MP2 total energy | -74.9912257631 | -74.9912257555 | +| | MP2 spin-component scaled | -0.0562829473 | -0.0562829682 | +| | MP2-SCS total energy | -74.9983629013 | 74.9983628964 | +| | SCF energy | -74.9420799540 | | + +*results test against psi4 (puream false and scf direct)* + + +| quadrupole | x2 | y2 | z2 | xy | yz | zx | +|----------------|----------------|----------------|---------------|-----|----|-----| +| |-4.3168 | -5.2054 | -6.2076 | 0.0 | 0.0 | 0.0 | +| traceless | 0.9265 | 0.0378 | -0.9643 | 0.0 | 0.0 | 0.0 | +| | -4.3165 |-5.2051 |-6.2072 | 0.0 | 0.0 |0.0 | +| traceless | 0.9264| 0.0378 |-0.9642| 0.0 |0.0| 0.0 | + +*tested against psi4 (psi4 first)* + +many-body perturbation theory +| order of theory | harpy | psi4 | +|-----------------|------------------|------------| +| mp2 | -0.0491496367 | -0.0491496272| +| mp3 | -0.0141878228 | -0.0141878317 | +| mp4 | -0.0046902727 | | + +| EOM-CCSD | | | | | | +|------------|-----------|------------|---------------|------------|---------------| +| 7.4901 | 8.7959 | 9.8321 | 10.0122 | 10.7445 | 11.6803 | +| 7.490148 | 8.795920 | 9.832138 | 10.012208 | 10.745541 | 11.680297 | + +*values from Gaussian supplied curtesy of Josh Goings* + +| EOM-CCSD | | | | | | +|------------|-----------|------------|---------------|------------|---------------| +| 7.1222 | 8.4365 | 9.4985 | 9.6904 | 10.4213 | 11.3431 | +| 7.122188 | 8.436496 | 9.498511 | 9.690388 | 10.421266 | 11.343091 | + +*values from Gaussian supplied curtesy of Josh Goings* + +# UHF +The first test is that UHF (charge 0 multiplicity 1) should agree with RHF for closed shell and no orbital mixing... + + RHF total energy -74.942079954 UHF total energy -74.942079954 OK + + CH2 triplet at dz basis level + + psi -38.918004 harpy -38.918003 (charge 0 multiplicity 3) + + OH- at dz basis level + + psi -75.386230 harpy -75.386228 (charge 0 multiplicity 2) + diff --git a/test/hhe+-sto-3g.html b/test/hhe+-sto-3g.html new file mode 100644 index 0000000..6ca1f56 --- /dev/null +++ b/test/hhe+-sto-3g.html @@ -0,0 +1,387 @@ + + + + +

HARPY RHF output for HHe+

+

atoms

+

number of atoms is 2

+ + + + + +
atomic input data +
idnumberxyzweight
1He121.7564911750.00.04.002602
2H110.00.00.01.00784
+
+ + + + +
interatom seperations
atomsd (bohr)
He1-H11.756
+
+ + + +
center of mass
xyz
1.4030.00.0
+
+ + + +
inferred bonds
He1H1
He1X
H1X
+
+ + + + + + +
inertia tensor
xyz
0.00.00.0
0.02.483990.0
0.00.02.48399
+
+ + + + + +
principal moments (amu bohr2)
IaIbIc
0.02.483992.48399
+
+
rotor typediatomic
+
+ + + + + +
rotational constants (g cm-1)
ABC
0.024.235124.2351
+
+
nuclear repulsion energy1.13863367
+
+

orbitals

+ +
+
number of electrons2
+
+
basis setsto-3g
+
+
Spherical +
Basis Set Exchange +
Version v0.8.12 +
https://www.basissetexchange.org +
Basis set: STO-3G +
Description: STO-3G Minimal Basis (3 functions/AO) +
Role: orbital +
Version: 1 (Data from Gaussian09) +
+
+ + + + + +
orbital occupancy
number of basis functions2
number of occupied orbitals1
number of virtual orbitals1
+
+ + + + + +
atomic orbitals
+ 1He1Hes2H1Hs
+
+ + + + + + +
aufbau atomic occupancies
idorbitals
1He11s2
2H11s1
+
+

pre-scf

+ +
+ + +
initial fock guesscore hamiltonian
+
+ + + + + + + + + + + + +
overlap
12
11.00000.4343
20.43431.0000
+
+ + + + + + + + + + + + +
kinetic
12
11.41180.1100
20.11000.7600
+
+ + + + + + + + + + + + +
Coulomb
12
1-3.9068-1.2210
2-1.2210-2.3191
+ +
+ + + + + + + + + + + + + + + + + + + +
two electron repulsion integrals *
< i j | k l >
< 1 1 | 1 1 >1.0557
< 1 1 | 1 2 >0.3432
< 1 1 | 2 1 >0.3432
< 1 1 | 2 2 >0.5234
< 1 2 | 1 1 >0.3432
< 1 2 | 1 2 >0.1406
< 1 2 | 2 1 >0.1406
< 1 2 | 2 2 >0.2789
< 2 1 | 1 1 >0.3432
< 2 1 | 1 2 >0.1406
< 2 1 | 2 1 >0.1406
< 2 1 | 2 2 >0.2789
< 2 2 | 1 1 >0.5234
< 2 2 | 1 2 >0.2789
< 2 2 | 2 1 >0.2789
< 2 2 | 2 2 >0.7746
+

* non-zero integrals (total 6)

+
+ + + + + + + + + + + + +
S
12
11.0823-0.2473
2-0.24731.0823
+
+ + + + + + + + + + + + +
orthogonal initial Fock
12
1-2.4231-0.2843
2-0.2843-1.3840
+
+ + + + + + + + + + + + +
initial density
12
10.97470.0282
20.02820.0008
+
+
initial SCF electronic energy-4.9915483
+
+

scf

+ +
iteration limit100
convergence criterion1e-10
+

direct inversion of the iterative sub-space (diis) is on

+ + + + + + + + + + + + + + + + + +
electronic energy (E)Δ(E)rms(D)
4.991548301600
-3.99436780024.489525e-025.842191e-02
-3.99325115221.116648e-032.312950e-03
-4.00484164101.159049e-022.307193e-02
-3.99027627441.456537e-022.932482e-02
-3.99017751099.876347e-052.103484e-04
-3.99296084252.783332e-035.860074e-03
-3.99299896383.812130e-057.848988e-05
-3.99298763911.132465e-052.330543e-05
-3.99300632171.868252e-053.844611e-05
-3.99300232943.992272e-068.215059e-06
-3.99300231751.190540e-082.449868e-08
-3.99300232446.921976e-091.424162e-08
-3.99300232435.556755e-111.143383e-10
-3.99300232447.768008e-121.599024e-11
+

SCF converged in 15 cycles

+
+

post-scf

+ +
+
final scf total energy-2.8543686503
+
+ + + + + + +
final orbital energies
12
-1.523787-0.267638
+
+ + + + + + + + + + + + +
orbital coeffiecients
12
1-0.9001280.649809
2-0.194385-1.093022
+
+ + + + + + + + + + + + +
final density matrix
12
10.8102300.174971
20.1749710.037785
+
+ + + + +
charge analysis
orbitalatomdensity
Mulliken
1He11.7724
2H10.2276
reduced To atoms centers
He11.7724
H10.2276
corrected for charge
He10.2276
H10.7724
Lowdin
He11.6958
H10.3042
corrected for charge
He10.3042
H10.6958
+
+ + +
energy partition
descriptioncomponentsenergy
exchangek2.422099
nuclearn1.138634
coulombj-7.36053
one electronk+j-4.938431
two electrong0.945429
totalk+j + 2g + n-2.854369
total potentialj + g + n-5.276468
total kinetick2.422099
viral ratio(j+g+n)/k-2.178469
bare hamiltoniank+j-4.938431
orbital-3.047573
+
+ + + + + +
dipoles
xyzresultant
electronic-0.824-0.0-0.00.824
nuclear3.5130.00.03.513
combined2.6890.00.04.337
+
+ + + + + + + +
moller-plesset
{mp2} parallel spin0.00000000
{mp2} anti-parallel spin-0.00640198
{mp2} total-0.00640198
{mp3} total-0.00114159
{mp2+mp3} total-0.00754357
{total energy + mp correction} total-2.86191222
+
+ + + + + +
configuration interaction *
0.657595 (t)0.911238 (s)
+

* s -singlet, t -triplet

+
+ + + + +
configuration interaction spin-adapted singles
0.911238
+
+ + + + +
configuration interaction spin-adapted triplets
0.657595
+
+ + + + + +
random phase approximation *
0.645250 (t)0.902370 (s)
+

* s -singlet, t -triplet

+

direct inversion of the iterative sub-space (diis) is on

+
+ + + + + + + + + + + + +
charged-couple singles and doubles
ccsd energyΔ(E)Δrms(amplitudes)
0.008412178600
-0.00817552381.014501e-041.698325e-03
-0.00820869663.317280e-055.608397e-04
-0.00821992111.122455e-051.904761e-04
-0.00822376603.844941e-066.533279e-05
-0.00822578462.018590e-063.431749e-05
-0.00822578406.889829e-101.201486e-08
-0.00822578411.088167e-101.906251e-09
-0.00822578413.451300e-127.155648e-11
+

ccsd converged in 10 cycles

+
+ + + + + + +
coupled cluster
mp2 correction-0.00640198
singles and doubles CCSD-0.00822578
perturbative triples CCSD(T)0.00000000
total ccsd correction-0.00822578
total energy ccsd corrected-2.86259443
+ diff --git a/test/hhe+-sto-3g.md b/test/hhe+-sto-3g.md new file mode 100644 index 0000000..f977038 --- /dev/null +++ b/test/hhe+-sto-3g.md @@ -0,0 +1,42 @@ +# HHe+ in STO-3G basis + +This is a test of a charged molecule. Reference is Joshua Goings articles [here](https://joshuagoings.com/2013/07/17/coupled-cluster-with-singles-and-doubles-ccsd-in-python/), mp2 and CIS [here](https://joshuagoings.com/blog/page8/). + +Values are Josh Goings first then underneath harpy. + +|Nuclear repulsion | | +|------------------------|----------| +| | 1.1386276671 | +| | 1.13863367 | + +| Final Electronic Energy | | +|---------------------------|--| +| | -3.99300007772 | +| | -3.9930023244 | + + +| Final orbital energies | | | +|-----------------------------------|--|---| +| | -1.52378656 | -0.26763148 | +| | -1.523787 | -0.267638 | + +| Coupled-cluster Singles and Doubles | | +|--------------------------------------|-----| +| | -2.8626 | +| | -2.86259443 | + +| Moller-plesset 2nd order | | +|-----------------------------|---| +| | -0.00640 | +| | -0.00640198 | + +| Configuration interaction | | +|------------------------------|--| +| | 0.911 | +| | 0.911238 | + +| Random Phase Approximation | | +|--------------------------------|-----| +| | 0.902 | +| | 0.902370 | + diff --git a/test/k-edge.md b/test/k-edge.md new file mode 100644 index 0000000..c895194 --- /dev/null +++ b/test/k-edge.md @@ -0,0 +1,44 @@ +# H2 k-edge spectra + +The K-edge spectrum is a spectrum obtained when an X-Ray excites a *1s* inner core electron. The resulting excitation state can be below the ionization potential (IP) of the *1s* orbital (**pre-edge**) or above the IP (**above-edge**). For one electron, the spectrum arises because of transitions from the *1s* core orbital to excited molecular orbitals. Here we use Koopman's theorem to do a crude k-edge analysis of H2O so an approximation of excitation energy is obtained by taking the sum of the absolute value of the two orbital energies involved in the transition. These are the routines used... + +1. **getMolecule(basis)** + + parameters - *basis* is the molecular basis object as returned by *rhf.mol*. We start by defining the water molecule in a code object and writing that to temporary file to be read by rhf.mol. We run an SCF compuation so we have access to integrals and return the atom, basis and data objects along with the converged SCF energy. + +2. **getOrbitalEnergies(fock, S)** + + parameters - *fock* the Fock matrix from a converged RHF calculation and *S* is the overlap matrix from an SCF calculation. Orthogonalizes the Fock matrix and gets the eigensolution. Returns the orbital energies. + +3. **getOrbitalCharacter(orbital, basis, atom)** + + parameters - *orbital* is a column of the eigenvectors matrix (dimension\[nbf,1]), *basis* is an array of basis objects and *atom* is an array of atom objects. Finds the predominant contributing AO and returns a tuple of the AO's atom center id and it's orbital symbol eg (2px', 'O1'). + +4. **getMOwithCharacter(character, c, basis, atom)** + + parameters - *character* is a tuple as returned by *getOrbitalCharacter*, *c* are the molecular eigenvectors, *basis* is an array of basis objects and *atom* is an array of atom objects. Finds the MO which most matches the character requested. Returns an integer. + +5. **getKedgeExcitations(k, n, c, basis, atom, eMO)** + + parameters - *k* is the starting AO for the excitations as a tuple (here it is ('1s','O1')), *n* the number of excitations required, *c* are the molecular eigenvectors, *basis* is an array of basis objects, *atom* is an array of atom objects and *eMO* is an array of orbital energies. This finds the LUMO and returns the *n* energy differences between *k* and lumo+0, lumo+1,...lumo+*n*. + +6. **getDipoles(atom, basis)** + + parameters - *atom* is an array of atom objects and *basis* is an array of basis objects.Returns the components matrices of the dipoles in the 'origin' gauge. + +7. **getTransitionProperties(mu, c, i, a)** + + parameters - *mu* are the dipole component matrices, *c* are the orbital eigenvectors, *i* is an occupied MO and *a* in an unoccupied MO - the excitation id *i*->*a*. Computes the components of the transition dipole moment and the oscillator strength. + +8. **lorentzian(e0, e, tau)** + + parameters - *e0* is the excitation energy, *e* are the energies over the broadening range and *tau* is the life-time of the shape. The life-time (τ) is the reciprocal of the full-width at half-maximum of the shape (FWHM). We use a *tau* of 40au corresponding to 10-15s, a reasonable value for core excitations. Returns an array of points representing the broadened line shape. + + +The procedure is to first call **getMolecule** to run an RHF SCF computation so integrals are calculated. Next from **getOrbitalEnergies** we calculate the orbital energies, which are used by **getKedgeExcitations** to get the energy differences between the *1s* oxygen dominant MO and, say, 5 levels (in 6-31g basis with 13 basis functions 5-occupied and 8-virtual) at LUMO and above (eg 0->5, 0->6, 0->7, 0->8 nd 0->9). We then use **getTransitionProperties** to calculate the transition dipoles and oscillator strengths for the 5 transitions. The oscillator strengths are then broadened and plotted. This gives the following plot + +![image](https://user-images.githubusercontent.com/73105740/130357664-df7a0970-62f6-4b72-9c8f-34a8b3e01bd7.png) + + +The broadened line shapes are in black and the orange bars represent the unbroadened values (normalised). The MO are numbered at the top and you can see the biggest strength is from 1s to MO9. This MO is the oxygen 2pz orbital. + diff --git a/test/k-edge.py b/test/k-edge.py new file mode 100644 index 0000000..02d1ff0 --- /dev/null +++ b/test/k-edge.py @@ -0,0 +1,174 @@ +from __future__ import division +#import system modules +import sys +sys.path.append('../source') + +import os +import numpy as np +import rhf +from basis import electronCount + +def getMolecule(basis): + #get the molecular definition objects + + mol = """name=h2o +matrix=c +diis=on +basis=sto-3g +charge=0 +multiplicity=1 + +O1 8 0.000000000000 -0.143225816552 0.000000000000 +H1 1 1.638036840407 1.136548822547 0.000000000000 +H2 1 -1.638036840407 1.136548822547 0.000000000000 + +end + """ + #replace basis if necessary + if basis != None: + mol = mol.replace('sto-3g', basis) + + fileName = 'h2o.hpf' + f = open(fileName, 'w') + f.write(mol) + f.close() + + molAtom, molBasis, molData = rhf.mol([], file = fileName) + + #clean up file + if os.path.exists(fileName): + os.remove(fileName) + + molData['basis'] = basis + eSCF = rhf.scf(molAtom, molBasis, molData, []) + + return eSCF, molAtom, molBasis, molData + +def getOrbitalEnergies(fock, S): + #compute the orbital energies + + from scipy.linalg import fractional_matrix_power as fractPow + X = fractPow(S, -0.5) + + orthogonal_fock = np.dot(X.T, np.dot(fock, X)) + e, _ = np.linalg.eigh(orthogonal_fock) + + return e + +def getOrbitalCharacter(orbital, basis, atom): + #get the AO characteristic of MO + + aoMax = np.where(orbital == np.amax(orbital)) + + return (basis[aoMax[0][0]].symbol, atom[basis[aoMax[0][0]].atom].id) + +def getMOwithCharacter(character, c, basis, atom): + #find the MO with the given AO character + + for i in range(c.shape[1]): + ao = getOrbitalCharacter(c[:,i], basis, atom) + if ao == character: + return i + +def getKedgeExcitations(k, n, c, basis, atom, eMO): + #get the n excitations + + lumo = electronCount(atom, data['charge'])//2 + + #get MO corresponding to 1s O1 and energy + mo = getMOwithCharacter(k, c, basis, atom) + + k = np.zeros((n)) + for i in range(n): + k[i] = abs(eMO[lumo + i]- eMO[mo]) + + return k + +def getDipoles(atom, basis): + #compute the dipole moments + + from post import dipoleComponent + + cartesians = ('x', 'y', 'z') + nbf = len(basis) + mu = np.zeros((3, nbf, nbf)) + + for i in range(mu.shape[0]): + mu[i] = dipoleComponent(atom, basis, cartesians[i], 'origin') + + return mu + +def getTransitionProperties(mu, c, i, a): + #compute the transition dipoles + + tmu = np.zeros(3) + for x in range(3): + tmu[x] = np.einsum('j,k,jk', c[:, i], c[:, a], mu[x]) + + oscillatorStrength = (2/3) * abs(eMO[a] - eMO[i]) + oscillatorStrength *= np.sum(abs(tmu)**2) + + return tmu, oscillatorStrength + +def lorentzian(e0, e, tau): +#Lorentzian broadening + + gamma = 1.0/tau + g = (gamma/2.0)**2.0/((e0-e)**2.0 + (gamma/2.0)**2.0) + + return g + +e, atom, basis, data = getMolecule('6-31g') +eMO = getOrbitalEnergies(rhf.fock, rhf.S) + +#get n k-edge excitations +n = 5 +kedge = getKedgeExcitations(('1s', 'O1'), n, rhf.C, basis, atom, eMO) + +#lumo +lumo = electronCount(atom, data['charge'])//2 + +#1s of oxygen O1 +mo = getMOwithCharacter(('1s','O1'), rhf.C, basis, atom) + +#get transition dipoles and oscillator strengths +transitionDipoles = [] +oscillatorStrength = [] +for i in range(n): + a = i + lumo + mu = getDipoles(atom, basis) + tmu, osc = getTransitionProperties(mu, rhf.C, mo , a) + transitionDipoles.append(tmu) + oscillatorStrength.append(osc) + +#normalize oscillator strength +oscillatorStrength /= max(oscillatorStrength) + +#plot broadened spectra +import matplotlib.pyplot as py +from atom import getConstant + +py.title('$H_2O$ k-edge spectrum') +py.grid() +points = 0 +margin, tau, npoints = [0.5, 40, 100] + +for i in range(n): + start = (kedge[i]) - margin + finish = (kedge[i]) + margin + x = np.linspace(start, finish, npoints) + + points = lorentzian(kedge[i], x, tau) * oscillatorStrength[i] + py.plot(x * getConstant('hartree->eV'), points,'k') + py.bar(kedge[i] * getConstant('hartree->eV'), oscillatorStrength[i], color='orange') + + py.text(kedge[i] * getConstant('hartree->eV') - margin, 1.0, str(i + lumo), fontsize='x-small') + +xl, xr = py.xlim() +py.text(xl + 2, 1,'0->', fontsize='x-small') +py.xlabel('excitation energy (eV)') +py.ylabel('oscillator strength (norm)') + +py.show() + +print('Largest oscillator strength from transition oxygen 1s ->', getOrbitalCharacter(rhf.C[:,9], basis, atom)[0]) \ No newline at end of file diff --git a/test/validation-h2o-sto-3g.md b/test/validation-h2o-sto-3g.md new file mode 100644 index 0000000..136dd08 --- /dev/null +++ b/test/validation-h2o-sto-3g.md @@ -0,0 +1,86 @@ +## Validation test on water using STO-3G basis + +The program validation-h2o-sto-3g.py executes an evaluation of most of the codes contained within the **harpy** system. It can be run with parameters 'Q' (quick) or 'F' (full). The 'Q' option will run in about 8 minutes while the 'F' option is best run overnight as the eom routines take a lot of time. The output shows ++ elapsed time of the validation-h2o-sto-3g run ++ time of the particular process being run ++ description of the process being tested ++ -if process produces multiples values the particular one displayed is given in \[ ]- ++ value returned by process ++ boolean, True is passed test, False is failed test ++ precision of test eg 6 means test passes if difference between computed and reference values is better than 1e-6. ++ the code of comparison source. **P4**-Psi4, **PN**-psi4numpy, **GA**-Gaussian, **CW**-Crawford Projects, **HA**-harpy (internal check), **MM**-McMurchie-Davidson, **PS**-pyscf, **AD**-ADCC + +**sto-3g should be the first entry in project.hpf** +Most tests are done to 1e-6 precision. The molecule geometry is defined within the routine and does not read the project.hpf file (but some called routines do). The expected output for a full run is +``` +===================================================================================================== + Water Test in STO-3G mode[ F ] +----------------------------------------------------------------------------------------------------- + Elapsed Step Process Value Pass Check +----------------------------------------------------------------------------------------------------- +00:00:00.2 00:00:00.2 SCF energy -74.94207995 True 6 CW +00:00:00.2 00:00:00.0 Mulliken oxygen charge -0.25314612 True 6 CW +00:00:00.2 00:00:00.0 Dipole Moment resultant 0.60352134 True 6 CW +00:00:00.6 00:00:00.4 Quadrupole Moment amplitude 1.33769187 True 6 HA +00:00:00.7 00:00:00.1 Polarizabilities [isotropic] 3.68471970 True 6 HA +00:00:00.9 00:00:00.2 Hyperpolarizabilities [0,1] -9.34242926 True 6 HA +===================================================================================================== +00:00:01.0 00:00:00.0 Moller-Plesset (2) -0.04914964 True 6 CW +00:00:01.0 00:00:00.0 Spin-Component Scaled MP (2) -0.05628751 True 6 PN +00:00:49.7 00:00:48.8 Orbital-Optimised MP (2) -0.04939137 True 6 HA +00:00:49.8 00:00:00.1 Laplace Transform MP (2) -0.04914581 True 6 PN +===================================================================================================== +00:00:50.6 00:00:00.8 CIS [0] 0.28725552 True 6 CW +00:00:51.4 00:00:00.8 Random Phase Approximation [0] 0.28516373 True 6 CW +00:00:51.4 00:00:00.0 Spin-Adapted CI singles [0] 0.35646178 True 6 CW +00:00:51.5 00:00:00.0 Spin-Adapted CI triples [0] 0.28725552 True 6 CW +===================================================================================================== +00:01:46.0 00:00:54.5 Coupled-Cluster Singles and Doubles -0.07068009 True 6 CW +00:01:57.9 00:00:11.9 CCSD Perturbative Triples -0.00009988 True 6 CW +00:21:44.3 00:19:46.5 Coupled-Cluster Doubles -0.07015049 True 6 PN +00:22:12.3 00:00:28.0 Linear Coupled-Cluster Doubles -0.07192916 True 6 P4 +00:22:25.0 00:00:12.7 Linear Coupled-Cluster Singles and Doubles -0.07257659 True 6 HA +00:24:45.3 00:02:20.3 Coupled-Cluster (2) -0.04939911 True 6 P4 +00:25:23.4 00:00:38.1 Coupled-Cluster Singles and Doubles-Λ -0.06888820 True 6 P4 +===================================================================================================== +00:25:23.5 00:00:00.0 Electron Propagator (2) [0] -10.34032984 True 4 HA +00:25:24.5 00:00:01.0 Spin-Adapted Electron Propagator (2) [0] -541.75575877 True 4 HA +00:25:46.8 00:00:22.3 Spin-Adapted Electron Propagator (3) [0] -543.63064680 True 4 PN +00:25:47.7 00:00:00.9 Koopman Green Function Correction [0] -12.66439467 True 4 HA +===================================================================================================== +00:25:56.7 00:00:09.0 Full Configuration Interaction [0] -0.07090027 True 6 P4 +00:25:57.6 00:00:00.9 Determinant CIS [0] 0.28725552 True 6 MM +00:25:59.4 00:00:01.8 Determinant CISD [0] -0.06914307 True 6 MM +===================================================================================================== +00:26:11.8 00:00:03.2 Forces (ocypete - cython) [0,1] 0.09744138 True 6 MM +00:34:54.8 00:08:42.9 Forces (native - python) [0,1] 0.09744138 True 6 MM +===================================================================================================== +00:35:58.8 00:01:04.0 Restrained Electrostatic Potential [0] -0.47703059 True 6 PN +===================================================================================================== +07:31:49.1 06:55:50.3 EOM-CCSD [0] 7.49020351 True 4 GA +10:01:08.5 02:29:19.5 EOM-MBPT (2) [0] 7.12218877 True 4 GA +===================================================================================================== +10:01:10.0 00:00:01.5 TDHF transition properties [excitation] 0.35646178 True 6 P4 +10:01:10.0 00:00:00.0 TDHF OPA spectrum [x] 57.87004982 True 6 P4 +===================================================================================================== +10:01:10.3 00:00:00.3 cogus - ccd -0.07015049 True 8 PN +10:01:11.1 00:00:00.8 cogus - ccsd -0.07068009 True 8 P4 +10:01:29.6 00:00:18.5 cogus - ccsdt -0.07081281 True 8 P4 +10:01:31.5 00:00:01.9 cogus - ccsd(t) -0.00009988 True 8 P4 +10:01:31.8 00:00:00.3 cogus - cc2 -0.04939914 True 8 P4 +10:01:39.4 00:00:07.5 cogus - cc3 -0.07077803 True 8 P4 +10:01:39.5 00:00:00.1 cogus - lccd -0.07192916 True 8 HA +10:01:39.7 00:00:00.2 cogus - lccsd -0.07257659 True 8 HA +10:01:39.9 00:00:02.8 cogus - Λ -0.07068009 True 8 HA ===================================================================================================== +10:01:49.9 00:00:10.1 Many-Bodied Perturbation Theory [2] -0.04914964 True 6 P4 +10:01:49.9 00:00:10.1 Many-Bodied Perturbation Theory [3] -0.01418782 True 6 P4 +10:01:49.9 00:00:10.1 Many-Bodied Perturbation Theory [4] -0.00469027 True 6 HA +===================================================================================================== +10:01:50.1 00:00:00.2 uhf energy -74.94207995 True 6 PS +10:01:50.5 00:00:00.5 uhf energy cation -74.48785027 True 6 PS + +``` +The fast EOM has been added and will produce a line +``` +00:10:09.0 00:03:33.2 EOM-CCSD (fast) [0] 7.49014856 True 4 GA +``` diff --git a/test/validation-h2o-sto-3g.py b/test/validation-h2o-sto-3g.py new file mode 100644 index 0000000..54df2f9 --- /dev/null +++ b/test/validation-h2o-sto-3g.py @@ -0,0 +1,504 @@ +from __future__ import division +import numpy as np +import time +import os +from numpy.linalg import eigh +from scipy.linalg import fractional_matrix_power as fractPow +import sys +sys.path.append('../source') +import rhf +from atom import getConstant + +''' +Test of water in STO-3G basis for all testable codes +''' + +#read command line for 'F' +args = sys.argv[1:] +if args == []: + mode = 'Q' +else: + mode = args[0] + +sysStart = time.time() +processTime = sysStart + +def stepTime(step): + #elapsed time for current step + + if step == 1: + t = time.time() - sysStart + else: + t = time.time() - processTime + + h = 0 + if t >3600: + h = int(t//3600) + t -= h*3600 + m = 0 + if t > 60: + m = int(t//60) + t -= m*60 + s = round(t,1) + + return ('00' + str(h))[-2:] + ':' + ('00' + str(m))[-2:] + ':' + ('00' + str(s))[-4:] + +def passing(actual, reference, tol): + + if abs(actual-reference) < 10 **(-tol-1): + return 'True' + else: + return 'False' + +def validityCheck(actual, reference, tolerance = 1e-6): + + if np.allclose(actual, reference, tolerance): + return 'True' + else: + return 'False' + +outputScheme = "{:<12} {:<12} {:<48} {:>13.8f} {:<6} {:<2} {:<3}" + +#define molecule and run parameters +molecule = """name=h2o +matrix=c +basis=sto-3g +post={} +diis=on + +O1 8 0.000000000000 -0.143225816552 0.000000000000 +H1 1 1.638036840407 1.136548822547 0.000000000000 +H2 1 -1.638036840407 1.136548822547 0.000000000000 + +end +""" +fileName = '../test/h2o.hpf' +f = open(fileName, 'w') +f.write(molecule) +f.close() + +molAtom, molBasis, molData = rhf.mol([], file = fileName) +#clean up file +if os.path.exists(fileName): + os.remove(fileName) + +#do basis EHF SCF calculation +eSCF = rhf.scf(molAtom, molBasis, molData, []) + +#==================Header +print('='*101) +print(' '*40, 'Water Test in STO-3G mode[', mode, ']') +print('-'*101) +print(' Elapsed Step Process Value Pass Check') +print('-'*101) +#==================SCF energy +value = eSCF +print(outputScheme.format(stepTime(1), stepTime(0), 'SCF energy',\ + value, validityCheck(value, -74.942079928192), 6, 'CW')) + +#==================Mulliken charges +processTime = time.time() +from post import mulliken +value = 8 - mulliken(rhf.density, rhf.S, molAtom, molBasis)[0] +print(outputScheme.format(stepTime(1), stepTime(0), 'Mulliken oxygen charge ', \ + value, validityCheck(value, -0.253146052405), 6, 'CW')) + +#==================dipole moment +processTime = time.time() +from post import buildDipole +value = np.sqrt(buildDipole(molAtom, molBasis, rhf.density, 'origin')[3]) +print(outputScheme.format(stepTime(1), stepTime(0), 'Dipole Moment resultant', \ + value, validityCheck(value, 0.603521296525), 6, 'CW')) + +#==================quadrupole moment +processTime = time.time() +from post import buildQuadrupole +value = buildQuadrupole(molAtom, molBasis, rhf.density, 'origin')[12] +print(outputScheme.format(stepTime(1), stepTime(0), 'Quadrupole Moment amplitude', \ + value, validityCheck(value, 1.3376918702067326), 6, 'HA')) + +#==================Polarizabilities +processTime = time.time() +from post import polarizabilities +value, isotropic, _, _ = polarizabilities(molAtom, molBasis, rhf.C, rhf.fock, rhf.ERI, 5, 'nuclear charge') +reference = [7.93556215, 3.06821073, 0.05038621, 3.68471969539233] +comparison = [value[0], value[1], value[2], isotropic] +print(outputScheme.format(stepTime(1), stepTime(0), 'Polarizabilities [isotropic]', \ + isotropic, validityCheck(reference, comparison), 6, 'HA')) + +#==================Hyperpolarizabilities +processTime = time.time() +from post import hyperPolarizabilities +X = fractPow(rhf.S, -0.5) +orthogonalFock = np.dot(X.T , np.dot(rhf.fock , X)) +#diagonalise Fock +e, orthogonalC = eigh(orthogonalFock) +_, value = hyperPolarizabilities(molAtom, molBasis, rhf.C, rhf.ERI, e, rhf.fock, 5, 'nuclear charge') +reference = [-9.34242926,-5.20670354, 1.38579626e-01, -9.34242926e+00, 1.38579626e-01 ] +comparison = [value[0,1], value[1,1], value[2,1], value[3,0], value[5,2]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Hyperpolarizabilities [0,1]', \ + value[0,1], validityCheck(reference, comparison), 6, 'HA')) + +print('='*101) +#==================Moller-Plesset (2) +processTime = time.time() +from mp import mp2 +p, ap = mp2(molAtom, 0, molBasis, rhf.C, e, rhf.ERI, 'p-ap') +print(outputScheme.format(stepTime(1), stepTime(0), 'Moller-Plesset (2)', \ + p+ap, validityCheck(p+ap, -0.049149636120), 6, 'CW')) + +#==================Moller-Plesset spin-component (2) +processTime = time.time() +from mp import mp2 +value = mp2(molAtom, 0, molBasis, rhf.C, e, rhf.ERI, 'scs') +print(outputScheme.format(stepTime(1), stepTime(0), 'Spin-Component Scaled MP (2)', \ + value, validityCheck(value, -0.0562875057281451), 6, 'PN')) + +#==================Orbital-Optimised MP2 +processTime = time.time() +from mp import orbitalOptimisedMP2 +from atom import nuclearRepulsion +value = orbitalOptimisedMP2(rhf.C, rhf.coreH, e, molBasis, nuclearRepulsion(molAtom), rhf.ERI, 10) -eSCF +print(outputScheme.format(stepTime(1), stepTime(0), 'Orbital-Optimised MP (2)', \ + value, validityCheck(value, -0.04939136780163267), 6, 'HA')) + +# #==================Laplace Transform MP2 +processTime = time.time() +from mp import mp2LaplaceTransform +value = mp2LaplaceTransform(molBasis, rhf.C, rhf.ERI, e, 5, eSCF, meshSize=40) +value = sum(value) +print(outputScheme.format(stepTime(1), stepTime(0), 'Laplace Transform MP (2)', \ + value, validityCheck(value, -0.0491458273 ), 6, 'PN')) + +print('='*101) +#==================CIS +processTime = time.time() +from ci import cis, ciDegeneracy +value, _ = cis(molAtom, 0, molBasis, rhf.C, rhf.fock, rhf.ERI) +degen = ciDegeneracy(value) +reference = [0.2872554996 , 0.3444249963, 0.3564617587, 0.3659889948, 0.3945137992] +comparison = [degen[0][0], degen[1][0], degen[2][0], degen[3][0], degen[4][0]] +print(outputScheme.format(stepTime(1), stepTime(0), 'CIS [0]', \ + degen[0][0], validityCheck(reference, comparison), 6, 'CW')) + +#==================RPA +processTime = time.time() +from ci import randomPhaseApproximation +value = randomPhaseApproximation(molAtom, 0, molBasis, rhf.C, rhf.fock, rhf.ERI, 'linear') +degen = ciDegeneracy(value) +reference = [0.2851637170 ,0.2997434467 , 0.3526266606, 0.3547782530, 0.3651313107] +comparison = [degen[0][0], degen[1][0], degen[2][0], degen[3][0], degen[4][0]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Random Phase Approximation [0]', \ + degen[0][0], validityCheck(reference, comparison), 6, 'CW')) + +#==================sa-CIS-singles +processTime = time.time() +from ci import ciSpinAdaptedSingles +value = ciSpinAdaptedSingles(molAtom, 0, molBasis, rhf.C, rhf.fock, rhf.ERI) +reference = [0.3564617587, 0.4160717386, 0.5056282877 , 0.5551918860 , 0.6553184485] +comparison = [value[0], value[1], value[2], value[3], value[4]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Spin-Adapted CI singles [0]', \ + value[0], validityCheck(reference, comparison), 6, 'CW')) + +#==================sa-CIS-triples +processTime = time.time() +from ci import ciSpinAdaptedTriples +value = ciSpinAdaptedTriples(molAtom, 0, molBasis, rhf.C, rhf.fock, rhf.ERI) +reference = [0.2872554996, 0.3444249963, 0.3659889948, 0.3945137992, 0.5142899971] +comparison = [value[0], value[1], value[2], value[3], value[4]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Spin-Adapted CI triples [0]', \ + value[0], validityCheck(reference, comparison), 6, 'CW')) + +print('='*101) +#==================CCSD +processTime = time.time() +from cc.scc import ccsd +value, ts, td = ccsd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF, 'on') +print(outputScheme.format(stepTime(1), stepTime(0), 'Coupled-Cluster Singles and Doubles', \ + value, validityCheck(value, -0.070680088376), 6, 'CW')) + +#==================(T) +processTime = time.time() +from cc.scc import amplitudesT3 +from integral import buildFockMOspin, buildEriMO, buildEriDoubleBar +#get fock in MO spin basis +fockMOspin = buildFockMOspin(14, rhf.C, rhf.fock) +#get two-electron repulsion integrals in MO basis +eriMO = buildEriMO(rhf.C, rhf.ERI) +#transform eri from MO to spin basis +eriMOspin = buildEriDoubleBar(14, eriMO) +value = amplitudesT3(fockMOspin, ts, td, eriMOspin, 10) +print(outputScheme.format(stepTime(1), stepTime(0), 'CCSD Perturbative Triples', \ + value, validityCheck(value, -0.000099877272), 6, 'CW')) + +if mode == 'F': + #==================CCD + processTime = time.time() + from cc.scc import ccd + value = ccd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF) + print(outputScheme.format(stepTime(1), stepTime(0), 'Coupled-Cluster Doubles', \ + value, validityCheck(value, -0.07015051), 6, 'PN')) + +#==================LCCD +processTime = time.time() +from cc.scc import lccd +value = lccd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF) +print(outputScheme.format(stepTime(1), stepTime(0), 'Linear Coupled-Cluster Doubles', \ + value, validityCheck(value, -0.07192915), 6, 'P4')) + +#==================LCCSD +processTime = time.time() +from cc.scc import lccsd +value, _, _ = lccsd(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, 'on', eSCF) +print(outputScheme.format(stepTime(1), stepTime(0), 'Linear Coupled-Cluster Singles and Doubles', \ + value, validityCheck(value, -0.07257659), 6, 'HA')) + +#==================CC2 +processTime = time.time() +from cc.scc import cc2 +value, _, _ = cc2(molAtom, rhf.C, 0, rhf.fock, rhf.ERI, 50, 1e-8, eSCF, 'on') +print(outputScheme.format(stepTime(1), stepTime(0), 'Coupled-Cluster (2)', \ + value, validityCheck(value, -74.9914791 + 74.94207992818629), 6, 'P4')) + +#==================CCSD-Lambda +processTime = time.time() +from cc.scc import ccsd_lambda +value, l1, l2, _ = ccsd_lambda(fockMOspin, eriMOspin, ts, td, 10, 50, 1e-8) +print(outputScheme.format(stepTime(1), stepTime(0), 'Coupled-Cluster Singles and Doubles-\u039B', \ + value, validityCheck(value, -0.068888201463), 6, 'P4')) + +print('='*101) +#===================Electron Propagator 2 +processTime = time.time() +from ep import electronPropagator2 +value = electronPropagator2(molBasis, rhf.C, rhf.ERI, e, 5, startOrbital = 2, nOrbitals = 4) +reference = [-10.3403, -7.4044, 12.8950, 15.6734] +comparison = [value[0], value[1], value[2], value[3]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Electron Propagator (2) [0]', \ + value[0], validityCheck(reference, comparison, 1e-4), 4, 'HA')) + +#===================spin-adapted Electron Propagator 2 +processTime = time.time() +from ep import electronPropagator2spin +value = electronPropagator2spin(molBasis, rhf.C, rhf.ERI, e, 5, nOrbitals = 5) +reference = [-541.7558, -29.8607, -14.5980, -10.3404, -7.4044] +comparison = [value[0], value[1], value[2], value[3], value[4]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Spin-Adapted Electron Propagator (2) [0]', \ + value[0], validityCheck(reference, comparison, 1e-4), 4, 'HA')) + +#===================spin-adapted Electron Propagator 3 +processTime = time.time() +from ep import electronPropagator3spin +value = electronPropagator3spin(molBasis, rhf.C, rhf.ERI, e, 5, nOrbitals = 5) +reference = [-543.6307, -29.2271, -14.8363, -10.7673, -8.1825] +comparison = [value[0], value[1], value[2], value[3], value[4]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Spin-Adapted Electron Propagator (3) [0]', \ + value[0], validityCheck(reference, comparison, 1e-4), 4, 'PN')) + +#==================Associated Green's Function Correction to Koopman +processTime = time.time() +from ep import koopmanAGFcorrection +value = koopmanAGFcorrection(molBasis ,rhf.C ,rhf.ERI, e, 5, nOrbitals = 5) +reference = [-12.6644, -5.3342, -1.6200, -2.5340, -3.5334] +comparison = [value[0][1], value[1][1], value[2][1], value[3][1], value[4][1]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Koopman Green Function Correction [0]', \ + value[0][1], validityCheck(reference, comparison, 1e-4), 4, 'HA')) + +print('='*101) +#==================FCI +processTime = time.time() +from fci import fci +value = fci(molAtom, molBasis, 0, rhf.C, rhf.ERI, rhf.coreH)[0] - eSCF + nuclearRepulsion(molAtom) +print(outputScheme.format(stepTime(1), stepTime(0), 'Full Configuration Interaction [0]', \ + value, validityCheck(value, -0.07090027025095935), 6, 'P4')) + +#==================CIS slater +processTime = time.time() +from fci import ciss +value, _ = ciss(molAtom, molBasis, 0, rhf.C, rhf.ERI, rhf.coreH) +degen = ciDegeneracy(value) +reference = [0.28725544 , 0.34442492, 0.35646170, 0.36598893, 0.39451371] +comparison = [degen[0][0], degen[1][0], degen[2][0], degen[3][0], degen[4][0]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Determinant CIS [0]', \ + degen[0][0], validityCheck(reference, comparison), 6, 'MM')) + +#===================CISD slater +processTime = time.time() +from fci import cisd +from atom import nuclearRepulsion +value = cisd(molAtom, molBasis, 0, rhf.C, rhf.ERI, rhf.coreH)[0] - eSCF + nuclearRepulsion(molAtom) +print(outputScheme.format(stepTime(1), stepTime(0), 'Determinant CISD [0]', \ + value, validityCheck(value, -0.06914309), 6, 'MM')) + +print('='*101) +#==================Forces - Ocypete +processTime = time.time() +from force import forces +value = forces(molAtom, molBasis, rhf.density, rhf.fock, engine = 'aello', type = 'analytic') +reference = [9.74414370e-02, -8.63000979e-02, -4.87207185e-02, 8.63000979e-02, -4.87207185e-02] +comparison = [value[0,1], value[1,0], value[1,1], value[2,0], value[2,1]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Forces (ocypete - cython) [0,1]', \ + value[0,1], validityCheck(reference, comparison), 6, 'MM')) + +if mode == 'F': + #===================Forces - native + processTime = time.time() + from force import forces + value = forces(molAtom, molBasis, rhf.density, rhf.fock, engine = 'native', type = 'analytic') + reference = [9.74414370e-02, -8.63000979e-02, -4.87207185e-02, 8.63000979e-02, -4.87207185e-02] + comparison = [value[0,1], value[1,0], value[1,1], value[2,0], value[2,1]] + print(outputScheme.format(stepTime(1), stepTime(0), 'Forces (native - python) [0,1]', \ + value[0,1], validityCheck(reference, comparison), 6, 'MM')) + +print('='*101) +#===================rESP +processTime = time.time() +from rESP import restrainedESP +con, res = restrainedESP(molAtom, molBasis, molData, { 'sphere' : 'con', 'points' : ['density', 1], 'shell' : [4, 0.2, 1.4], + 'file' : ['w', 'esp.npz', 'clear'], 'view' : False, 'constrain' : [[0,[-2,3]]], 'restrain' : {} } ) +reference = [-0.47703059, 0.23851529 ,0.23851529, -0.47551183, 0.23775591, 0.23775591] +comparison = [con[0], con[1], con[2], res[0], res[1], res[2]] +print(outputScheme.format(stepTime(1), stepTime(0), 'Restrained Electrostatic Potential [0]', \ + con[0], validityCheck(reference, comparison), 6, 'PN')) + +print('='*101) +#=======================EOM-CCSD +processTime = time.time() +data = {'method':'ccsd','electrons':10, 'cycle_limit': 50, 'precision':1e-10, 'verbose':False} +from cc.fcc import coupledCluster +cc = coupledCluster(fockMOspin, eriMOspin, rhf.e, data) + +from cc.fcc import eom_ccsd +eom = eom_ccsd(cc, roots=[7,11], partitioned = False) +reference = [7.4901, 8.7959, 9.8321, 10.0122, 10.7445] +comparison = [i[0] for i in eom.excitations] +print(outputScheme.format(stepTime(1), stepTime(0), 'EOM-CCSD (fast) [0]', \ + comparison[0], validityCheck(reference, comparison, 1e-4), 4, 'GA')) + +if mode == 'F': + print('='*101) + #===================EOM-CCSD + processTime = time.time() + from eom import eomccsd + value, _ = eomccsd(fockMOspin, eriMOspin, ts, td, 10, 4, 14, partitioned = False, dialog = False) + reference = [7.4901, 8.7959, 9.8321, 10.0122, 10.7445] + value = np.sort(value * getConstant('hartree->eV')) + degen = ciDegeneracy(value) + comparison = [] + for excitation in degen: + if excitation[0] > 5 and excitation[0] < 11: + comparison.append(excitation[0]) + print(outputScheme.format(stepTime(1), stepTime(0), 'EOM-CCSD [0]', \ + comparison[0], validityCheck(reference, comparison, 1e-4), 4, 'GA')) + + #====================EOM-MBPT(2) + processTime = time.time() + from eom import eommbpt2 + value, _ = eommbpt2(fockMOspin, eriMOspin, 10, 4, 14, partitioned = False, dialog = False) + reference = [7.1222, 8.4365, 9.4985, 9.6904, 10.4213] + value = np.sort(value * getConstant('hartree->eV')) + degen = ciDegeneracy(value) + comparison = [] + for excitation in degen: + if excitation[0] > 5 and excitation[0] < 11: + comparison.append(excitation[0]) + print(outputScheme.format(stepTime(1), stepTime(0), 'EOM-MBPT (2) [0]', \ + comparison[0], validityCheck(reference, comparison, 1e-4), 4, 'GA')) + +print('='*101) +#========================TDHF-transition +processTime = time.time() +from tdhf import TDHFproperties +residues = TDHFproperties(molAtom, molBasis, 0, rhf.C, rhf.fock, rhf.ERI, 'tamm-dancoff', [5, 2, 5]) +reference = [0.35646177543487845, 0.09925794226244171, 0.0023412739974616056, -0.30230280991042413, \ + -5.925026183856348e-16, -1.0994804162166085e-15, 0.1305217446887937, 0.03186115503468884] +r = residues[0] +comparison = [r['excitation energy'], r['electric transition dipole (length gauge)'][2], r['oscillator strength (length gauge)'],\ + r['magnetic transition dipole (length gauge)'][0], r['rotatory strength (length gauge)'],r['rotatory strength (velocity gauge)'],\ + r['electric transition dipole (velocity gauge)'][2], r[ 'oscillator strength (velocity gauge)']] +print(outputScheme.format(stepTime(1), stepTime(0), 'TDHF transition properties [excitation]', \ + comparison[0], validityCheck(reference, comparison), 6, 'P4')) + +#========================TDHF-spectrum +processTime = time.time() +from tdhf import TDHFspectrum +dict = {'data' : residues, 'units' : 'nm', 'type' : 'opa', 'points' : 5000, 'shape' : 'gaussian', 'gamma' : 0.02} +spectrum = TDHFspectrum(dict) +reference = [ 57.87004982, 7.58675674e-22, 127.82114569, 9.70790360e-01] +comparison = [spectrum['x'][0], spectrum['y'][0], spectrum['poles'][0], spectrum['bars'][0]] +print(outputScheme.format(stepTime(1), stepTime(0), 'TDHF OPA spectrum [x]', \ + comparison[0], validityCheck(reference, comparison), 6, 'P4')) + +print('='*101) +#========================cogus +processTime = time.time() +from cogus import symbolicGeneratedCoupledCluster +_, value, _ = symbolicGeneratedCoupledCluster('ccd', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - ccd', \ + value, validityCheck(value, -0.07015048), 8, 'PN')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('ccsd', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - ccsd', \ + value, validityCheck(value, -0.07068008709615015), 8, 'P4')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('ccsdt', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - ccsdt', \ + value, validityCheck(value, -0.07081280801921253), 8, 'P4')) + +processTime = time.time() +_, value, cp = symbolicGeneratedCoupledCluster('ccsd_t', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - ccsd(t)', \ + cp, validityCheck(cp, -9.987726961762642e-05), 8, 'P4')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('cc2', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - cc2', \ + value, validityCheck(value, -0.0493991397445086), 8, 'P4')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('cc3', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - cc3', \ + value, validityCheck(value, -0.07077803146036388), 8, 'P4')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('lccd', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - lccd', \ + value, validityCheck(value, -0.07192916394222108), 8, 'HA')) + +processTime = time.time() +_, value, _ = symbolicGeneratedCoupledCluster('lccsd', rhf.fock, rhf.ERI, rhf.C, e, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - lccsd', \ + value, validityCheck(value, -0.07257658934412553), 8, 'HA')) + +processTime = time.time() +from cogus import symbolicGeneratedLambda +_, value, _, _ = symbolicGeneratedLambda('ccsd', rhf.fock, rhf.ERI, rhf.C, e, rhf.coreH, [0, nuclearRepulsion(molAtom), 10]) +print(outputScheme.format(stepTime(1), stepTime(0), 'cogus - \u039B', \ + value, validityCheck(value, -0.07068008881678622), 8, 'HA')) + +print('='*101) +#==================MBPT +processTime = time.time() +from mbpt import mbptEvaluateMPn +value = mbptEvaluateMPn(molAtom, molBasis, molData, eSCF) +print(outputScheme.format(stepTime(1), stepTime(0), 'Many-Bodied Perturbation Theory [2]', \ + value[0], validityCheck(value[0], -0.0491496272), 6, 'P4')) +print(outputScheme.format(stepTime(1), stepTime(0), 'Many-Bodied Perturbation Theory [3]', \ + value[1], validityCheck(value[1], -0.0141878317), 6, 'P4')) +print(outputScheme.format(stepTime(1), stepTime(0), 'Many-Bodied Perturbation Theory [4]', \ + value[2], validityCheck(value[2], -0.0046902727), 6, 'HA')) + +print('='*101) +#==================UHF +processTime = time.time() +import uhf +value = uhf.scf(molAtom, molBasis, molData, []) +print(outputScheme.format(stepTime(1), stepTime(0), 'uhf energy', \ + value, validityCheck(value, -74.942079928192356), 6, 'PS')) +molData['charge'] = -1 +molData['multiplicity'] = 2 +value = uhf.scf(molAtom, molBasis, molData, []) +print(outputScheme.format(stepTime(1), stepTime(0), 'uhf energy cation', \ + value, validityCheck(value, -74.487850244828891 ), 6, 'PS'))