pyscf 2.6.2__py3-none-macosx_11_0_arm64.whl → 2.8.0__py3-none-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyscf/__init__.py +2 -2
- pyscf/adc/__init__.py +3 -8
- pyscf/adc/dfadc.py +22 -6
- pyscf/adc/radc.py +106 -15
- pyscf/adc/radc_amplitudes.py +7 -1
- pyscf/adc/radc_ao2mo.py +4 -2
- pyscf/adc/radc_ea.py +524 -8
- pyscf/adc/radc_ip.py +492 -60
- pyscf/adc/radc_ip_cvs.py +4 -2
- pyscf/adc/uadc.py +116 -27
- pyscf/adc/uadc_amplitudes.py +215 -20
- pyscf/adc/uadc_ao2mo.py +30 -9
- pyscf/adc/uadc_ea.py +34 -44
- pyscf/adc/uadc_ip.py +9 -4
- pyscf/adc/uadc_ip_cvs.py +4 -1
- pyscf/agf2/__init__.py +2 -2
- pyscf/agf2/aux_space.py +1 -1
- pyscf/agf2/chkfile.py +1 -1
- pyscf/ao2mo/__init__.py +13 -2
- pyscf/ao2mo/_ao2mo.py +10 -1
- pyscf/ao2mo/incore.py +3 -0
- pyscf/ao2mo/nrr_outcore.py +2 -2
- pyscf/ao2mo/outcore.py +9 -7
- pyscf/ao2mo/r_outcore.py +2 -2
- pyscf/cc/__init__.py +21 -3
- pyscf/cc/bccd.py +0 -46
- pyscf/cc/ccsd.py +29 -13
- pyscf/cc/ccsd_rdm.py +6 -1
- pyscf/cc/gccsd.py +2 -2
- pyscf/cc/uccsd.py +7 -7
- pyscf/cc/uccsd_rdm.py +2 -2
- pyscf/data/elements.py +1 -1
- pyscf/df/__init__.py +2 -1
- pyscf/df/addons.py +79 -51
- pyscf/df/autoaux.py +195 -0
- pyscf/df/df.py +5 -1
- pyscf/df/df_jk.py +27 -25
- pyscf/df/grad/casscf.py +0 -41
- pyscf/df/grad/rhf.py +31 -1
- pyscf/df/hessian/rhf.py +2 -10
- pyscf/df/hessian/rks.py +1 -7
- pyscf/df/hessian/uhf.py +3 -13
- pyscf/df/hessian/uks.py +1 -8
- pyscf/df/incore.py +18 -6
- pyscf/df/outcore.py +6 -6
- pyscf/dft/dks.py +1 -1
- pyscf/dft/gks.py +25 -21
- pyscf/dft/libxc.py +91 -645
- pyscf/dft/numint.py +40 -19
- pyscf/dft/radi.py +48 -7
- pyscf/dft/rks.py +29 -25
- pyscf/dft/roks.py +7 -1
- pyscf/dft/uks.py +34 -25
- pyscf/dft/xc_deriv.py +1 -1
- pyscf/dft/xcfun.py +53 -2
- pyscf/eph/eph_fd.py +1 -1
- pyscf/eph/rhf.py +6 -36
- pyscf/eph/rks.py +0 -4
- pyscf/eph/uhf.py +1 -7
- pyscf/eph/uks.py +1 -7
- pyscf/fci/addons.py +117 -2
- pyscf/fci/cistring.py +1 -1
- pyscf/fci/direct_nosym.py +3 -3
- pyscf/fci/direct_spin0_symm.py +22 -43
- pyscf/fci/direct_spin1.py +65 -10
- pyscf/fci/direct_spin1_symm.py +49 -14
- pyscf/fci/direct_uhf.py +4 -4
- pyscf/fci/selected_ci_symm.py +1 -1
- pyscf/grad/ccsd.py +3 -7
- pyscf/grad/ccsd_slow.py +2 -3
- pyscf/grad/lagrange.py +11 -3
- pyscf/grad/mp2.py +13 -4
- pyscf/grad/sacasscf.py +1 -1
- pyscf/grad/tdrks.py +1 -1
- pyscf/grad/uccsd.py +3 -7
- pyscf/grad/ump2.py +2 -4
- pyscf/gto/basis/__init__.py +17 -4
- pyscf/gto/basis/bse.py +68 -15
- pyscf/gto/basis/def2-mtzvp.dat +4719 -0
- pyscf/gto/basis/def2-mtzvpp.dat +4739 -0
- pyscf/gto/basis/dyall-basis/__init__.py +0 -0
- pyscf/gto/basis/dyall-basis/dyall_2zp.py +6492 -0
- pyscf/gto/basis/dyall-basis/dyall_3zp.py +8343 -0
- pyscf/gto/basis/dyall-basis/dyall_4zp.py +10055 -0
- pyscf/gto/basis/dyall-basis/dyall_aae2z.py +1818 -0
- pyscf/gto/basis/dyall-basis/dyall_aae3z.py +2521 -0
- pyscf/gto/basis/dyall-basis/dyall_aae4z.py +3351 -0
- pyscf/gto/basis/dyall-basis/dyall_acv2z.py +1790 -0
- pyscf/gto/basis/dyall-basis/dyall_acv3z.py +2417 -0
- pyscf/gto/basis/dyall-basis/dyall_acv4z.py +3085 -0
- pyscf/gto/basis/dyall-basis/dyall_ae2z.py +6619 -0
- pyscf/gto/basis/dyall-basis/dyall_ae3z.py +9027 -0
- pyscf/gto/basis/dyall-basis/dyall_ae4z.py +11839 -0
- pyscf/gto/basis/dyall-basis/dyall_av2z.py +1742 -0
- pyscf/gto/basis/dyall-basis/dyall_av3z.py +2318 -0
- pyscf/gto/basis/dyall-basis/dyall_av4z.py +2905 -0
- pyscf/gto/basis/dyall-basis/dyall_cv2z.py +6558 -0
- pyscf/gto/basis/dyall-basis/dyall_cv3z.py +8767 -0
- pyscf/gto/basis/dyall-basis/dyall_cv4z.py +11098 -0
- pyscf/gto/basis/dyall-basis/dyall_v2z.py +6472 -0
- pyscf/gto/basis/dyall-basis/dyall_v3z.py +8539 -0
- pyscf/gto/basis/dyall-basis/dyall_v4z.py +10658 -0
- pyscf/gto/basis/ma-def2-qzvp.dat +5959 -0
- pyscf/gto/basis/ma-def2-qzvpp.dat +6195 -0
- pyscf/gto/basis/ma-def2-svp.dat +3504 -0
- pyscf/gto/basis/ma-def2-svpp.dat +3504 -0
- pyscf/gto/basis/ma-def2-tzvp.dat +4347 -0
- pyscf/gto/basis/ma-def2-tzvpp.dat +4549 -0
- pyscf/gto/basis/parse_cp2k.py +8 -7
- pyscf/gto/basis/parse_cp2k_pp.py +1 -1
- pyscf/gto/basis/parse_nwchem.py +26 -11
- pyscf/gto/basis/parse_nwchem_ecp.py +2 -1
- pyscf/gto/basis/sap_grasp_large.dat +2438 -0
- pyscf/gto/basis/sap_grasp_small.dat +1434 -0
- pyscf/gto/eval_gto.py +1 -1
- pyscf/gto/ft_ao.py +6 -6
- pyscf/gto/mole.py +123 -71
- pyscf/gto/moleintor.py +1 -1
- pyscf/gw/gw_ac.py +2 -2
- pyscf/gw/gw_cd.py +2 -2
- pyscf/gw/rpa.py +135 -246
- pyscf/gw/ugw_ac.py +2 -2
- pyscf/gw/urpa.py +80 -131
- pyscf/hessian/rhf.py +30 -128
- pyscf/hessian/rks.py +1 -6
- pyscf/hessian/uhf.py +28 -138
- pyscf/hessian/uks.py +1 -8
- pyscf/lib/CMakeLists.txt +6 -2
- pyscf/lib/ao2mo/nr_ao2mo.c +1 -1
- pyscf/lib/ao2mo/nrr_ao2mo.c +1 -1
- pyscf/lib/ao2mo/r_ao2mo.c +1 -1
- pyscf/lib/cc/ccsd_pack.c +1 -1
- pyscf/lib/cc/ccsd_t.c +6 -6
- pyscf/lib/cc/uccsd_t.c +4 -4
- pyscf/lib/config.h +0 -1
- pyscf/lib/config.h.in +0 -1
- pyscf/lib/deps/include/XCFun/XCFunExport.h +1 -0
- pyscf/lib/deps/include/xc.h +28 -18
- pyscf/lib/deps/include/xc_funcs.h +50 -2
- pyscf/lib/deps/include/xc_version.h +3 -3
- pyscf/lib/deps/lib/libcint.6.dylib +0 -0
- pyscf/lib/deps/lib/{libxc.12.dylib → libxc.15.dylib} +0 -0
- pyscf/lib/deps/lib/libxcfun.2.dylib +0 -0
- pyscf/lib/dft/grid_common.c +1 -1
- pyscf/lib/dft/libxc_itrf.c +10 -7
- pyscf/lib/dft/nr_numint_sparse.c +3 -3
- pyscf/lib/dft/xcfun_itrf.c +1 -1
- pyscf/lib/diis.py +2 -2
- pyscf/lib/exceptions.py +6 -0
- pyscf/lib/gto/fill_grids_int2c.c +11 -9
- pyscf/lib/gto/fill_int2e.c +7 -5
- pyscf/lib/gto/fill_r_4c.c +1 -1
- pyscf/lib/gto/ft_ao.c +1 -1
- pyscf/lib/gto/ft_ao.h +1 -1
- pyscf/lib/gto/gto.h +2 -2
- pyscf/lib/gto/nr_ecp.c +3 -2
- pyscf/lib/libagf2.dylib +0 -0
- pyscf/lib/libao2mo.dylib +0 -0
- pyscf/lib/libcc.dylib +0 -0
- pyscf/lib/libcgto.dylib +0 -0
- pyscf/lib/libcvhf.dylib +0 -0
- pyscf/lib/libdft.dylib +0 -0
- pyscf/lib/libfci.dylib +0 -0
- pyscf/lib/libmcscf.dylib +0 -0
- pyscf/lib/libmp.dylib +0 -0
- pyscf/lib/libnp_helper.dylib +0 -0
- pyscf/lib/libpbc.dylib +0 -0
- pyscf/lib/libri.dylib +0 -0
- pyscf/lib/libxc_itrf.dylib +0 -0
- pyscf/lib/libxcfun_itrf.dylib +0 -0
- pyscf/lib/linalg_helper.py +117 -198
- pyscf/lib/logger.py +2 -1
- pyscf/lib/mcscf/fci_contract.c +10 -3
- pyscf/lib/misc.py +63 -22
- pyscf/lib/mp/CMakeLists.txt +22 -0
- pyscf/lib/mp/mp2.c +518 -0
- pyscf/lib/mp/mp2.h +44 -0
- pyscf/lib/np_helper/CMakeLists.txt +1 -1
- pyscf/lib/np_helper/imatcopy.c +360 -0
- pyscf/lib/np_helper/np_helper.c +94 -0
- pyscf/lib/np_helper/np_helper.h +26 -0
- pyscf/lib/numpy_helper.py +195 -11
- pyscf/lib/pbc/nr_direct.c +2 -7
- pyscf/lib/pbc/nr_ecp.c +10 -3
- pyscf/lib/pbc/pbc.h +1 -1
- pyscf/lib/vhf/fblas.h +3 -0
- pyscf/lib/vhf/nr_sgx_direct.c +8 -6
- pyscf/lib/vhf/nr_sr_vhf.c +8 -12
- pyscf/lib/vhf/optimizer.c +2 -2
- pyscf/lib/vhf/rkb_screen.c +139 -0
- pyscf/lo/iao.py +1 -1
- pyscf/lo/ibo.py +3 -3
- pyscf/lo/pipek_jacobi.py +1 -1
- pyscf/mcscf/__init__.py +2 -2
- pyscf/mcscf/addons.py +3 -3
- pyscf/mcscf/apc.py +2 -2
- pyscf/mcscf/casci.py +13 -7
- pyscf/mcscf/chkfile.py +69 -41
- pyscf/mcscf/dmet_cas.py +2 -2
- pyscf/mcscf/mc1step.py +72 -44
- pyscf/mcscf/newton_casscf.py +5 -5
- pyscf/mcscf/ucasci.py +1 -1
- pyscf/mcscf/umc1step.py +49 -28
- pyscf/md/integrators.py +3 -3
- pyscf/mp/__init__.py +1 -0
- pyscf/mp/dfmp2.py +498 -59
- pyscf/mp/dfmp2_native.py +11 -1
- pyscf/mp/dfmp2_slow.py +133 -0
- pyscf/mp/dfump2.py +672 -0
- pyscf/mp/dfump2_native.py +9 -0
- pyscf/mp/dfump2_slow.py +161 -0
- pyscf/mp/gmp2.py +6 -47
- pyscf/mp/mp2.py +25 -10
- pyscf/mp/ump2.py +30 -24
- pyscf/pbc/adc/kadc_rhf.py +1 -1
- pyscf/pbc/adc/kadc_rhf_amplitudes.py +2 -2
- pyscf/pbc/ao2mo/eris.py +1 -1
- pyscf/pbc/cc/kccsd_rhf.py +3 -3
- pyscf/pbc/cc/kccsd_t_rhf.py +2 -2
- pyscf/pbc/ci/kcis_rhf.py +2 -2
- pyscf/pbc/df/aft.py +8 -9
- pyscf/pbc/df/aft_ao2mo.py +1 -1
- pyscf/pbc/df/df.py +85 -12
- pyscf/pbc/df/df_jk.py +6 -2
- pyscf/pbc/df/fft.py +9 -5
- pyscf/pbc/df/fft_ao2mo.py +4 -0
- pyscf/pbc/df/fft_jk.py +18 -10
- pyscf/pbc/df/ft_ao.py +4 -3
- pyscf/pbc/df/gdf_builder.py +5 -4
- pyscf/pbc/df/incore.py +2 -2
- pyscf/pbc/df/mdf.py +6 -3
- pyscf/pbc/df/mdf_jk.py +2 -1
- pyscf/pbc/df/outcore.py +10 -10
- pyscf/pbc/df/rsdf.py +2 -2
- pyscf/pbc/df/rsdf_builder.py +13 -8
- pyscf/pbc/df/rsdf_helper.py +6 -6
- pyscf/pbc/df/rsdf_jk.py +2 -1
- pyscf/pbc/dft/cdft.py +5 -5
- pyscf/pbc/dft/gen_grid.py +3 -2
- pyscf/pbc/dft/gks.py +14 -3
- pyscf/pbc/dft/kgks.py +15 -4
- pyscf/pbc/dft/krks.py +28 -10
- pyscf/pbc/dft/krks_ksymm.py +21 -9
- pyscf/pbc/dft/krkspu.py +1 -30
- pyscf/pbc/dft/krkspu_ksymm.py +0 -30
- pyscf/pbc/dft/kuks.py +30 -13
- pyscf/pbc/dft/kuks_ksymm.py +22 -10
- pyscf/pbc/dft/kukspu.py +0 -27
- pyscf/pbc/dft/kukspu_ksymm.py +0 -30
- pyscf/pbc/dft/multigrid/multigrid.py +36 -33
- pyscf/pbc/dft/multigrid/multigrid_pair.py +7 -2
- pyscf/pbc/dft/multigrid/pp.py +1 -1
- pyscf/pbc/dft/numint.py +56 -31
- pyscf/pbc/dft/rks.py +16 -24
- pyscf/pbc/dft/uks.py +21 -4
- pyscf/pbc/eph/eph_fd.py +1 -1
- pyscf/pbc/geomopt/geometric_solver.py +1 -1
- pyscf/pbc/gto/_pbcintor.py +1 -0
- pyscf/pbc/gto/cell.py +194 -23
- pyscf/pbc/gto/ecp.py +12 -12
- pyscf/pbc/gto/eval_gto.py +3 -3
- pyscf/pbc/gto/neighborlist.py +4 -1
- pyscf/pbc/gto/pseudo/pp.py +1 -1
- pyscf/pbc/gw/krgw_ac.py +4 -4
- pyscf/pbc/gw/krgw_cd.py +4 -4
- pyscf/pbc/gw/kugw_ac.py +3 -3
- pyscf/pbc/lib/kpts_helper.py +4 -3
- pyscf/pbc/lib/linalg_helper.py +1 -1
- pyscf/pbc/mp/kmp2.py +1 -1
- pyscf/pbc/mpitools/mpi.py +1 -1
- pyscf/pbc/scf/_response_functions.py +141 -34
- pyscf/pbc/scf/addons.py +15 -11
- pyscf/pbc/scf/cphf.py +1 -1
- pyscf/pbc/scf/ghf.py +1 -1
- pyscf/pbc/scf/hf.py +21 -32
- pyscf/pbc/scf/kghf.py +33 -29
- pyscf/pbc/scf/khf.py +103 -29
- pyscf/pbc/scf/khf_ksymm.py +15 -1
- pyscf/pbc/scf/krohf.py +5 -7
- pyscf/pbc/scf/kuhf.py +54 -23
- pyscf/pbc/scf/kuhf_ksymm.py +1 -1
- pyscf/pbc/scf/rsjk.py +14 -10
- pyscf/pbc/scf/scfint.py +1 -1
- pyscf/pbc/scf/stability.py +27 -15
- pyscf/pbc/scf/uhf.py +3 -1
- pyscf/pbc/symm/symmetry.py +2 -2
- pyscf/pbc/tdscf/krhf.py +238 -154
- pyscf/pbc/tdscf/krks.py +1 -45
- pyscf/pbc/tdscf/kuhf.py +319 -171
- pyscf/pbc/tdscf/kuks.py +0 -56
- pyscf/pbc/tdscf/rhf.py +116 -3
- pyscf/pbc/tdscf/rks.py +2 -1
- pyscf/pbc/tdscf/uhf.py +214 -1
- pyscf/pbc/tdscf/uks.py +2 -1
- pyscf/pbc/tools/k2gamma.py +20 -6
- pyscf/pbc/tools/lattice.py +3 -3
- pyscf/pbc/tools/pbc.py +111 -91
- pyscf/pbc/tools/pyscf_ase.py +0 -1
- pyscf/pbc/tools/pywannier90.py +1 -1
- pyscf/qmmm/mm_mole.py +1 -1
- pyscf/scf/_response_functions.py +87 -46
- pyscf/scf/_vhf.py +15 -10
- pyscf/scf/addons.py +29 -15
- pyscf/scf/cphf.py +14 -52
- pyscf/scf/dhf.py +121 -38
- pyscf/scf/dispersion.py +10 -9
- pyscf/scf/ghf.py +25 -13
- pyscf/scf/ghf_symm.py +2 -2
- pyscf/scf/hf.py +262 -30
- pyscf/scf/rohf.py +37 -5
- pyscf/scf/stability.py +142 -112
- pyscf/scf/ucphf.py +21 -16
- pyscf/scf/uhf.py +104 -61
- pyscf/sgx/sgx.py +1 -1
- pyscf/sgx/sgx_jk.py +4 -4
- pyscf/solvent/__init__.py +2 -2
- pyscf/solvent/_attach_solvent.py +2 -0
- pyscf/solvent/_ddcosmo_tdscf_grad.py +1 -1
- pyscf/solvent/cosmors.py +366 -0
- pyscf/solvent/ddcosmo.py +1 -1
- pyscf/solvent/pcm.py +4 -4
- pyscf/solvent/pol_embed.py +1 -1
- pyscf/solvent/smd.py +5 -3
- pyscf/soscf/ciah.py +3 -11
- pyscf/soscf/newton_ah.py +5 -2
- pyscf/symm/__init__.py +1 -1
- pyscf/symm/addons.py +5 -5
- pyscf/symm/geom.py +1 -5
- pyscf/tdscf/_lr_eig.py +1002 -0
- pyscf/tdscf/dhf.py +84 -87
- pyscf/tdscf/dks.py +0 -4
- pyscf/tdscf/ghf.py +139 -127
- pyscf/tdscf/gks.py +27 -25
- pyscf/tdscf/rhf.py +194 -147
- pyscf/tdscf/rks.py +26 -22
- pyscf/tdscf/uhf.py +166 -118
- pyscf/tdscf/uks.py +32 -31
- pyscf/tools/fcidump.py +3 -0
- pyscf/tools/qcschema.py +265 -0
- pyscf/x2c/sfx2c1e.py +1 -1
- pyscf/x2c/tdscf.py +41 -41
- pyscf/x2c/x2c.py +15 -11
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/METADATA +39 -36
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/NOTICE +14 -1
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/RECORD +348 -316
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/WHEEL +1 -1
- pyscf/dft/gen_libxc_param.py +0 -35
- pyscf/dft/gen_xcfun_param.py +0 -209
- pyscf/pbc/tdscf/kproxy.py +0 -189
- pyscf/pbc/tdscf/kproxy_supercell.py +0 -664
- pyscf/pbc/tdscf/krhf_slow.py +0 -300
- pyscf/pbc/tdscf/krhf_slow_gamma.py +0 -175
- pyscf/pbc/tdscf/krhf_slow_supercell.py +0 -250
- pyscf/pbc/tdscf/proxy.py +0 -39
- pyscf/pbc/tdscf/rhf_slow.py +0 -35
- pyscf/tdscf/common_slow.py +0 -799
- pyscf/tdscf/proxy.py +0 -258
- pyscf/tdscf/rhf_slow.py +0 -181
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/LICENSE +0 -0
- {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/top_level.txt +0 -0
pyscf/tdscf/uks.py
CHANGED
|
@@ -21,9 +21,8 @@ import numpy
|
|
|
21
21
|
from pyscf import symm
|
|
22
22
|
from pyscf import lib
|
|
23
23
|
from pyscf.lib import logger
|
|
24
|
-
from pyscf.tdscf import uhf
|
|
25
|
-
from pyscf.
|
|
26
|
-
from pyscf.data import nist
|
|
24
|
+
from pyscf.tdscf import uhf, rhf
|
|
25
|
+
from pyscf.tdscf._lr_eig import eigh as lr_eigh
|
|
27
26
|
from pyscf.dft.rks import KohnShamDFT
|
|
28
27
|
from pyscf import __config__
|
|
29
28
|
|
|
@@ -46,6 +45,7 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
46
45
|
'''
|
|
47
46
|
|
|
48
47
|
init_guess = TDA.init_guess
|
|
48
|
+
get_precond = TDA.get_precond
|
|
49
49
|
|
|
50
50
|
def gen_vind(self, mf=None):
|
|
51
51
|
if mf is None:
|
|
@@ -74,13 +74,9 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
74
74
|
if wfnsym is not None and mol.symmetry:
|
|
75
75
|
if isinstance(wfnsym, str):
|
|
76
76
|
wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)
|
|
77
|
-
orbsyma, orbsymb = uhf_symm.get_orbsym(mol, mo_coeff)
|
|
78
77
|
wfnsym = wfnsym % 10 # convert to D2h subgroup
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
sym_forbida = (orbsyma_in_d2h[occidxa,None] ^ orbsyma_in_d2h[viridxa]) != wfnsym
|
|
82
|
-
sym_forbidb = (orbsymb_in_d2h[occidxb,None] ^ orbsymb_in_d2h[viridxb]) != wfnsym
|
|
83
|
-
sym_forbid = numpy.hstack((sym_forbida.ravel(), sym_forbidb.ravel()))
|
|
78
|
+
x_sym_a, x_sym_b = uhf._get_x_sym_table(mf)
|
|
79
|
+
sym_forbid = numpy.append(x_sym_a.ravel(), x_sym_b.ravel()) != wfnsym
|
|
84
80
|
|
|
85
81
|
e_ia_a = (mo_energy[0][viridxa,None] - mo_energy[0][occidxa]).T
|
|
86
82
|
e_ia_b = (mo_energy[1][viridxb,None] - mo_energy[1][occidxb]).T
|
|
@@ -102,15 +98,15 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
102
98
|
|
|
103
99
|
dmsa = (zs[:,:nocca*nvira] * d_ia[:nocca*nvira]).reshape(nz,nocca,nvira)
|
|
104
100
|
dmsb = (zs[:,nocca*nvira:] * d_ia[nocca*nvira:]).reshape(nz,noccb,nvirb)
|
|
105
|
-
dmsa = lib.einsum('xov,
|
|
106
|
-
dmsb = lib.einsum('xov,
|
|
107
|
-
dmsa = dmsa + dmsa.
|
|
108
|
-
dmsb = dmsb + dmsb.
|
|
101
|
+
dmsa = lib.einsum('xov,pv,qo->xpq', dmsa, orbva, orboa)
|
|
102
|
+
dmsb = lib.einsum('xov,pv,qo->xpq', dmsb, orbvb, orbob)
|
|
103
|
+
dmsa = dmsa + dmsa.transpose(0,2,1)
|
|
104
|
+
dmsb = dmsb + dmsb.transpose(0,2,1)
|
|
109
105
|
|
|
110
106
|
v1ao = vresp(numpy.asarray((dmsa,dmsb)))
|
|
111
107
|
|
|
112
|
-
v1a = lib.einsum('xpq,
|
|
113
|
-
v1b = lib.einsum('xpq,
|
|
108
|
+
v1a = lib.einsum('xpq,qo,pv->xov', v1ao[0], orboa, orbva)
|
|
109
|
+
v1b = lib.einsum('xpq,qo,pv->xov', v1ao[1], orbob, orbvb)
|
|
114
110
|
|
|
115
111
|
hx = numpy.hstack((v1a.reshape(nz,-1), v1b.reshape(nz,-1)))
|
|
116
112
|
hx += ed_ia * zs
|
|
@@ -123,6 +119,7 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
123
119
|
'''TDDFT diagonalization solver
|
|
124
120
|
'''
|
|
125
121
|
cpu0 = (logger.process_clock(), logger.perf_counter())
|
|
122
|
+
mol = self.mol
|
|
126
123
|
mf = self._scf
|
|
127
124
|
if mf._numint.libxc.is_hybrid_xc(mf.xc):
|
|
128
125
|
raise RuntimeError('%s cannot be used with hybrid functional'
|
|
@@ -142,16 +139,19 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
142
139
|
idx = numpy.where(w > self.positive_eig_threshold)[0]
|
|
143
140
|
return w[idx], v[:,idx], idx
|
|
144
141
|
|
|
142
|
+
x0sym = None
|
|
145
143
|
if x0 is None:
|
|
146
|
-
x0 = self.init_guess(
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
144
|
+
x0, x0sym = self.init_guess(
|
|
145
|
+
self._scf, self.nstates, return_symmetry=True)
|
|
146
|
+
elif mol.symmetry:
|
|
147
|
+
x_sym_a, x_sym_b = uhf._get_x_sym_table(self._scf)
|
|
148
|
+
x_sym = numpy.append(x_sym_a.ravel(), x_sym_b.ravel())
|
|
149
|
+
x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]
|
|
150
|
+
|
|
151
|
+
self.converged, w2, x1 = lr_eigh(
|
|
152
|
+
vind, x0, precond, tol_residual=self.conv_tol, lindep=self.lindep,
|
|
153
|
+
nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,
|
|
154
|
+
max_memory=self.max_memory, verbose=log)
|
|
155
155
|
|
|
156
156
|
mo_energy = self._scf.mo_energy
|
|
157
157
|
mo_occ = self._scf.mo_occ
|
|
@@ -179,13 +179,14 @@ class CasidaTDDFT(TDDFT, TDA):
|
|
|
179
179
|
x = (zp + zm) * .5
|
|
180
180
|
y = (zp - zm) * .5
|
|
181
181
|
norm = lib.norm(x)**2 - lib.norm(y)**2
|
|
182
|
-
if norm
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
182
|
+
if norm < 0:
|
|
183
|
+
log.warn('TDDFT amplitudes |X| smaller than |Y|')
|
|
184
|
+
norm = abs(norm)**-.5
|
|
185
|
+
e.append(w)
|
|
186
|
+
xy.append(((x[:nocca*nvira].reshape(nocca,nvira) * norm, # X_alpha
|
|
187
|
+
x[nocca*nvira:].reshape(noccb,nvirb) * norm), # X_beta
|
|
188
|
+
(y[:nocca*nvira].reshape(nocca,nvira) * norm, # Y_alpha
|
|
189
|
+
y[nocca*nvira:].reshape(noccb,nvirb) * norm)))# Y_beta
|
|
189
190
|
self.e = numpy.array(e)
|
|
190
191
|
self.xy = xy
|
|
191
192
|
|
pyscf/tools/fcidump.py
CHANGED
|
@@ -372,6 +372,9 @@ def to_scf(filename, molpro_orbsym=MOLPRO_ORBSYM, mf=None, **kwargs):
|
|
|
372
372
|
mf.get_hcore = lambda *args: h1
|
|
373
373
|
mf.get_ovlp = lambda *args: numpy.eye(norb)
|
|
374
374
|
mf._eri = ctx['H2']
|
|
375
|
+
intor_symmetric = mf.mol.intor_symmetric
|
|
376
|
+
mf.mol.intor_symmetric = lambda intor, **kwargs: numpy.eye(norb) \
|
|
377
|
+
if intor == 'int1e_ovlp' else intor_symmetric(intor, **kwargs)
|
|
375
378
|
|
|
376
379
|
return mf
|
|
377
380
|
|
pyscf/tools/qcschema.py
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
'''
|
|
2
|
+
This lib loads results that are in a QCSchema format json.
|
|
3
|
+
Funcs below can recreate the mol and scf objects from the info in the json.
|
|
4
|
+
'''
|
|
5
|
+
import json
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pyscf
|
|
8
|
+
from pyscf.lib.parameters import BOHR
|
|
9
|
+
|
|
10
|
+
def load_qcschema_json( file_name ):
|
|
11
|
+
'''
|
|
12
|
+
Does: loads qcschema format json into a dictionary
|
|
13
|
+
Input:
|
|
14
|
+
file_name: qcschema format json file
|
|
15
|
+
|
|
16
|
+
Returns: dict in qcschema format
|
|
17
|
+
'''
|
|
18
|
+
# load qcschema output json file
|
|
19
|
+
data = None
|
|
20
|
+
with open(file_name,'r') as f:
|
|
21
|
+
data = json.load(f)
|
|
22
|
+
return data
|
|
23
|
+
|
|
24
|
+
def load_qcschema_go_final_json( file_name ):
|
|
25
|
+
'''
|
|
26
|
+
Does: loads qcschema format geometry optimization json
|
|
27
|
+
and returns only the optimized 'final' geometry
|
|
28
|
+
qcschema info as a dictionary.
|
|
29
|
+
|
|
30
|
+
Input:
|
|
31
|
+
file_name: qcschema format json file
|
|
32
|
+
|
|
33
|
+
Returns: dict in qcschema format
|
|
34
|
+
'''
|
|
35
|
+
# load qcschema GO output json file
|
|
36
|
+
# and return last 'trajectory' point's entries
|
|
37
|
+
# (this is the optimized molecule)
|
|
38
|
+
data = None
|
|
39
|
+
temp = None
|
|
40
|
+
with open(file_name,'r') as f:
|
|
41
|
+
temp = json.load(f)
|
|
42
|
+
data = temp["trajectory"][-1]
|
|
43
|
+
return data
|
|
44
|
+
|
|
45
|
+
def load_qcschema_molecule(qcschema_dict, to_Angstrom=False, xyz=False, mol_select=1, step=0):
|
|
46
|
+
'''
|
|
47
|
+
Does: Loads molecule from qcschema format dict.
|
|
48
|
+
Molecule may be single point molecule or from a geometry optimization/trajectory.
|
|
49
|
+
|
|
50
|
+
Input:
|
|
51
|
+
syms: atom symbols (qcschema format)
|
|
52
|
+
coords: x y z coordinates (in qcschema format)
|
|
53
|
+
mol_select: specifies which molecule to load from qcschema format results.
|
|
54
|
+
Default loads 'molecule' from qcschema.
|
|
55
|
+
Geometry optimizations or trajectories have mutliple geometries saved in the schema.
|
|
56
|
+
mol_select = 1 (default) molecule from standard qcschema format
|
|
57
|
+
= 2 initial_molecule in GO or traj qcschema
|
|
58
|
+
= 3 final_molecule in GO or traj qcschema
|
|
59
|
+
= 4 a specific step in the GO or traj qcschema, specify with 'step' arg.
|
|
60
|
+
step: for geometry optimization or trajectory, which have multiple molecules in a qcschema output.
|
|
61
|
+
This specifies which step to load the molecule from.
|
|
62
|
+
to_Angstrom (optional): convert coordinates to Angstrom (default is Bohr)
|
|
63
|
+
xyz (optional): controls output (see below)
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
xyz=False (default): 'atom x y z' format string
|
|
67
|
+
xyz=True: output a string in xyz file format
|
|
68
|
+
i.e. first line is number of atoms.
|
|
69
|
+
'''
|
|
70
|
+
if(mol_select == 1):
|
|
71
|
+
syms = np.array(qcschema_dict["molecule"]["symbols"])
|
|
72
|
+
geo = np.array(qcschema_dict["molecule"]["geometry"])
|
|
73
|
+
elif(mol_select == 2):
|
|
74
|
+
syms = np.array(qcschema_dict["initial_molecule"]["symbols"])
|
|
75
|
+
geo = np.array(qcschema_dict["initial_molecule"]["geometry"])
|
|
76
|
+
elif(mol_select == 3):
|
|
77
|
+
syms = np.array(qcschema_dict["final_molecule"]["symbols"])
|
|
78
|
+
geo = np.array(qcschema_dict["final_molecule"]["geometry"])
|
|
79
|
+
elif(mol_select == 4):
|
|
80
|
+
# for geometry or md, can load a specific geometry
|
|
81
|
+
syms = np.array(qcschema_dict["trajectory"][step]["molecule"]["symbols"])
|
|
82
|
+
geo = np.array(qcschema_dict["trajectory"][step]["molecule"]["geometry"])
|
|
83
|
+
|
|
84
|
+
if(to_Angstrom):
|
|
85
|
+
# convert Bohr to Angstrom
|
|
86
|
+
geo = geo*BOHR
|
|
87
|
+
|
|
88
|
+
NAtoms = len(syms)
|
|
89
|
+
geo = np.reshape(geo, (NAtoms,3))
|
|
90
|
+
|
|
91
|
+
PySCF_atoms = list(zip(syms, geo))
|
|
92
|
+
|
|
93
|
+
# Return as string or return as xyz-format string (i.e. top is NAtoms,blankline)
|
|
94
|
+
if(xyz):
|
|
95
|
+
bldstr = f'{NAtoms}\n\n'
|
|
96
|
+
for element, coordinates in PySCF_atoms:
|
|
97
|
+
bldstr += f'{element} {coordinates[0]}, {coordinates[1]}, {coordinates[2]}\n'
|
|
98
|
+
PySCF_atoms = bldstr
|
|
99
|
+
return PySCF_atoms
|
|
100
|
+
|
|
101
|
+
def load_qcschema_hessian(qcschema_dict):
|
|
102
|
+
'''
|
|
103
|
+
Does: loads hessian from qcschema format dictionary
|
|
104
|
+
Input:
|
|
105
|
+
qcschema_dict
|
|
106
|
+
|
|
107
|
+
Returns: hessian with format (N,N,3,3)
|
|
108
|
+
'''
|
|
109
|
+
# qcschema_dict: pass in dict that has the qcschema output json loaded into it
|
|
110
|
+
|
|
111
|
+
# load qcschema hessian
|
|
112
|
+
qc_h = []
|
|
113
|
+
qc_h = qcschema_dict["return_result"]
|
|
114
|
+
|
|
115
|
+
# Get Number of atoms N
|
|
116
|
+
syms = np.array(qcschema_dict["molecule"]["symbols"])
|
|
117
|
+
NAtom = len(syms)
|
|
118
|
+
|
|
119
|
+
# reshape from (3N)**2 array to (N,N,3,3)
|
|
120
|
+
hessian = np.array(qc_h).reshape(NAtom,NAtom,3,3)
|
|
121
|
+
return hessian
|
|
122
|
+
|
|
123
|
+
def load_qcschema_scf_info(qcschema_dict):
|
|
124
|
+
'''
|
|
125
|
+
Does: loads scf info from qcschema format dictionary
|
|
126
|
+
Input:
|
|
127
|
+
qcschema_dict
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
scf_dict: contains the relevent scf info only
|
|
131
|
+
'''
|
|
132
|
+
|
|
133
|
+
# Restricted wfn has schema scf_occupations_a occ of 1 or 0.
|
|
134
|
+
# Need to double if rhf/rks/rohf
|
|
135
|
+
method = qcschema_dict["keywords"]["scf"]["method"]
|
|
136
|
+
if(method == 'rks' or method == 'roks' or method == 'rhf' or method == 'rohf'):
|
|
137
|
+
OccFactor = 2.0
|
|
138
|
+
have_beta = False
|
|
139
|
+
elif(method == 'uks' or method == 'uhf'):
|
|
140
|
+
OccFactor = 1.0
|
|
141
|
+
have_beta = True
|
|
142
|
+
elif(method == 'gks' or method == 'ghf'):
|
|
143
|
+
OccFactor = 1.0
|
|
144
|
+
have_beta = False
|
|
145
|
+
else:
|
|
146
|
+
raise RuntimeError('qcschema: cannot determine method..exit')
|
|
147
|
+
return
|
|
148
|
+
|
|
149
|
+
# need to reshape MO coefficients for PySCF shape.
|
|
150
|
+
nao = qcschema_dict["properties"]["calcinfo_nbasis"]
|
|
151
|
+
# nmo info often missing
|
|
152
|
+
try:
|
|
153
|
+
nmo = qcschema_dict["properties"]["calcinfo_nmo"]
|
|
154
|
+
except KeyError:
|
|
155
|
+
# key not provided..so we make an assumption
|
|
156
|
+
# note: assumes nmo=nao which isn't the case if linear dependencies etc.
|
|
157
|
+
# ..so may give error when reading coeffs
|
|
158
|
+
nmo = nao
|
|
159
|
+
assert nmo == nao
|
|
160
|
+
|
|
161
|
+
# get the 4 things that PySCF wants
|
|
162
|
+
# ...remembering to reshape coeffs and scale occupancies.
|
|
163
|
+
e_tot = float( qcschema_dict["properties"]["return_energy"] )
|
|
164
|
+
mo_coeff = np.reshape(qcschema_dict["wavefunction"]["scf_orbitals_a"],(nao,nmo))
|
|
165
|
+
mo_occ = np.array( qcschema_dict["wavefunction"]["scf_occupations_a"] )*OccFactor
|
|
166
|
+
mo_energy = np.array( qcschema_dict["wavefunction"]["scf_eigenvalues_a"] )
|
|
167
|
+
if(have_beta):
|
|
168
|
+
# for each useful piece of info we need to combine alpha and beta into 2d array, with alpha first
|
|
169
|
+
# MO occupations
|
|
170
|
+
mo_occ_beta = qcschema_dict["wavefunction"]["scf_occupations_b"]
|
|
171
|
+
mo_occ = np.vstack( (mo_occ, mo_occ_beta) )
|
|
172
|
+
# MO coefficients
|
|
173
|
+
mo_coeff_beta = np.reshape(qcschema_dict["wavefunction"]["scf_orbitals_b"],(nao,nmo))
|
|
174
|
+
mo_coeff = np.vstack( (mo_coeff,mo_coeff_beta))
|
|
175
|
+
mo_coeff = np.reshape(mo_coeff,(2,nao,nmo))
|
|
176
|
+
# MO energies
|
|
177
|
+
mo_energy_beta = np.array( qcschema_dict["wavefunction"]["scf_eigenvalues_b"] )
|
|
178
|
+
mo_energy = np.vstack( (mo_energy, mo_energy_beta) )
|
|
179
|
+
# etot obviously doesn't need manipulation
|
|
180
|
+
|
|
181
|
+
# convert to dictionary for PySCF
|
|
182
|
+
scf_dic = {'e_tot' : e_tot,
|
|
183
|
+
'mo_energy': mo_energy,
|
|
184
|
+
'mo_occ' : mo_occ,
|
|
185
|
+
'mo_coeff' : mo_coeff}
|
|
186
|
+
|
|
187
|
+
return scf_dic
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def recreate_mol_obj(qcschema_dict,to_Angstrom=False):
|
|
191
|
+
'''
|
|
192
|
+
Does: recreates mol object from qcschema format dictionary
|
|
193
|
+
Input:
|
|
194
|
+
qcschema_dict
|
|
195
|
+
to_Angstrom: optional bool to convert geometry to Angstrom (default is Bohr)
|
|
196
|
+
|
|
197
|
+
Returns: mol object
|
|
198
|
+
'''
|
|
199
|
+
|
|
200
|
+
## Mol info: ##
|
|
201
|
+
PySCF_charge = int( qcschema_dict["molecule"]["molecular_charge"] )
|
|
202
|
+
# PySCF 'spin' is number of unpaired electrons, it will be mult-1
|
|
203
|
+
PySCF_spin = int( qcschema_dict["molecule"]["molecular_multiplicity"] ) - 1
|
|
204
|
+
PySCF_basis = str( qcschema_dict["model"]["basis"] )
|
|
205
|
+
|
|
206
|
+
# Cartesian/Pure basis
|
|
207
|
+
PySCF_cart = bool( qcschema_dict["keywords"]["basisSet"]["cartesian"] )
|
|
208
|
+
|
|
209
|
+
# Get molecular structure.
|
|
210
|
+
PySCF_atoms = load_qcschema_molecule(qcschema_dict, to_Angstrom,False)
|
|
211
|
+
|
|
212
|
+
# Unit Bohr or Angstrom. QCSchema default is Bohr but can change here.
|
|
213
|
+
if(to_Angstrom):
|
|
214
|
+
units='A'
|
|
215
|
+
else:
|
|
216
|
+
units='B'
|
|
217
|
+
|
|
218
|
+
## Create mol ##
|
|
219
|
+
mol = pyscf.gto.Mole(atom=PySCF_atoms,basis=PySCF_basis,ecp=PySCF_basis,
|
|
220
|
+
charge=PySCF_charge,spin=PySCF_spin,cart=PySCF_cart,unit=units)
|
|
221
|
+
mol.build(False,False)
|
|
222
|
+
|
|
223
|
+
return mol
|
|
224
|
+
|
|
225
|
+
def recreate_scf_obj(qcschema_dict,mol):
|
|
226
|
+
'''
|
|
227
|
+
Does: recreates scf object from qcschema format dictionary
|
|
228
|
+
Input:
|
|
229
|
+
qcschema_dict
|
|
230
|
+
mol object
|
|
231
|
+
|
|
232
|
+
Returns: scf object
|
|
233
|
+
'''
|
|
234
|
+
# load info from qcschema needed for scf obj
|
|
235
|
+
scf_dict = load_qcschema_scf_info(qcschema_dict)
|
|
236
|
+
|
|
237
|
+
# create scf object
|
|
238
|
+
method = qcschema_dict["keywords"]["scf"]["method"]
|
|
239
|
+
if(method =='rks'):
|
|
240
|
+
ks = mol.RKS()
|
|
241
|
+
elif(method =='uks'):
|
|
242
|
+
ks = mol.UKS()
|
|
243
|
+
elif(method =='rhf'):
|
|
244
|
+
ks = mol.RHF()
|
|
245
|
+
elif(method =='uhf'):
|
|
246
|
+
ks = mol.UHF()
|
|
247
|
+
elif(method =='gks'):
|
|
248
|
+
ks = mol.GKS()
|
|
249
|
+
elif(method =='ghf'):
|
|
250
|
+
ks = mol.GHF()
|
|
251
|
+
else:
|
|
252
|
+
raise RuntimeError('qcschema: cannot determine method..exit')
|
|
253
|
+
return
|
|
254
|
+
|
|
255
|
+
# get functional
|
|
256
|
+
if(method == 'rks' or method == 'uks' or method == 'gks'):
|
|
257
|
+
functional = qcschema_dict["keywords"]["xcFunctional"]["name"]
|
|
258
|
+
ks.xc = functional
|
|
259
|
+
|
|
260
|
+
# Load 4 key pieces of info we got from json into SCF object
|
|
261
|
+
ks.mo_coeff = scf_dict["mo_coeff"]
|
|
262
|
+
ks.mo_energy = scf_dict["mo_energy"]
|
|
263
|
+
ks.mo_occ = scf_dict["mo_occ"]
|
|
264
|
+
ks.e_tot = scf_dict["e_tot"]
|
|
265
|
+
return ks
|
pyscf/x2c/sfx2c1e.py
CHANGED
|
@@ -117,7 +117,7 @@ class SFX2C1E_SCF(x2c._X2C_SCF):
|
|
|
117
117
|
log = logger.new_logger(mol, verbose)
|
|
118
118
|
|
|
119
119
|
if not (isinstance(dm, numpy.ndarray) and dm.ndim == 2):
|
|
120
|
-
# UHF
|
|
120
|
+
# UHF density matrices
|
|
121
121
|
dm = dm[0] + dm[1]
|
|
122
122
|
|
|
123
123
|
if isinstance(self, ghf.GHF):
|
pyscf/x2c/tdscf.py
CHANGED
|
@@ -38,8 +38,8 @@ gen_tda_hop = gen_tda_operation
|
|
|
38
38
|
def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
39
39
|
r'''A and B matrices for TDDFT response function.
|
|
40
40
|
|
|
41
|
-
A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (
|
|
42
|
-
B[i,a,j,b] = (
|
|
41
|
+
A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (ai||jb)
|
|
42
|
+
B[i,a,j,b] = (ai||bj)
|
|
43
43
|
'''
|
|
44
44
|
if mo_energy is None: mo_energy = mf.mo_energy
|
|
45
45
|
if mo_coeff is None: mo_coeff = mf.mo_coeff
|
|
@@ -56,7 +56,7 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
56
56
|
nmo = nocc + nvir
|
|
57
57
|
mo = numpy.hstack((orbo, orbv))
|
|
58
58
|
|
|
59
|
-
e_ia =
|
|
59
|
+
e_ia = mo_energy[viridx] - mo_energy[occidx,None]
|
|
60
60
|
a = numpy.diag(e_ia.ravel()).reshape(nocc,nvir,nocc,nvir)
|
|
61
61
|
b = numpy.zeros_like(a)
|
|
62
62
|
|
|
@@ -64,10 +64,10 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
64
64
|
eri_mo = ao2mo.kernel(mol, [orbo, mo, mo, mo], intor='int2e_spinor')
|
|
65
65
|
eri_mo = eri_mo.reshape(nocc,nmo,nmo,nmo)
|
|
66
66
|
|
|
67
|
-
a = a + numpy.einsum('iabj->iajb', eri_mo[:nocc,nocc:,nocc:,:nocc])
|
|
68
|
-
a = a - numpy.einsum('ijba->iajb', eri_mo[:nocc,:nocc,nocc:,nocc:]) * hyb
|
|
69
|
-
b = b + numpy.einsum('iajb->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:])
|
|
70
|
-
b = b - numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:]) * hyb
|
|
67
|
+
a = a + numpy.einsum('iabj->iajb', eri_mo[:nocc,nocc:,nocc:,:nocc].conj())
|
|
68
|
+
a = a - numpy.einsum('ijba->iajb', eri_mo[:nocc,:nocc,nocc:,nocc:].conj()) * hyb
|
|
69
|
+
b = b + numpy.einsum('iajb->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:].conj())
|
|
70
|
+
b = b - numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:].conj()) * hyb
|
|
71
71
|
return a, b
|
|
72
72
|
|
|
73
73
|
if isinstance(mf, dft.KohnShamDFT):
|
|
@@ -123,9 +123,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
123
123
|
rho_ov_bb = numpy.einsum('ri,ra->ria', mo_ob.conj(), mo_vb)
|
|
124
124
|
rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
|
|
125
125
|
rho_vo = rho_ov.conj()
|
|
126
|
-
|
|
127
|
-
a += lib.einsum('sria,srjb->iajb',
|
|
128
|
-
b += lib.einsum('sria,srjb->iajb',
|
|
126
|
+
w_vo = numpy.einsum('tsr,tria->sria', wfxc, rho_vo)
|
|
127
|
+
a += lib.einsum('sria,srjb->iajb', w_vo, rho_ov)
|
|
128
|
+
b += lib.einsum('sria,srjb->iajb', w_vo, rho_vo)
|
|
129
129
|
elif ni.collinear[0] == 'c':
|
|
130
130
|
rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1)
|
|
131
131
|
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
|
|
@@ -135,13 +135,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
135
135
|
rho_ov_b = numpy.einsum('ri,ra->ria', mo_ob.conj(), mo_vb)
|
|
136
136
|
rho_vo_a = rho_ov_a.conj()
|
|
137
137
|
rho_vo_b = rho_ov_b.conj()
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
a += lib.einsum('ria,rjb->iajb',
|
|
142
|
-
a += lib.einsum('ria,rjb->iajb',
|
|
143
|
-
b += lib.einsum('ria,rjb->iajb',
|
|
144
|
-
b += lib.einsum('ria,rjb->iajb',
|
|
138
|
+
w_vo = wv_a[:,:,None,None] * rho_vo_a
|
|
139
|
+
w_vo += wv_b[:,:,None,None] * rho_vo_b
|
|
140
|
+
wa_vo, wb_vo = w_vo
|
|
141
|
+
a += lib.einsum('ria,rjb->iajb', wa_vo, rho_ov_a)
|
|
142
|
+
a += lib.einsum('ria,rjb->iajb', wb_vo, rho_ov_b)
|
|
143
|
+
b += lib.einsum('ria,rjb->iajb', wa_vo, rho_vo_a)
|
|
144
|
+
b += lib.einsum('ria,rjb->iajb', wb_vo, rho_vo_b)
|
|
145
145
|
else:
|
|
146
146
|
raise NotImplementedError(ni.collinear)
|
|
147
147
|
|
|
@@ -166,9 +166,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
166
166
|
rho_ov_bb[1:4] += numpy.einsum('xri,ra->xria', mo_ob[1:4].conj(), mo_vb[0])
|
|
167
167
|
rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
|
|
168
168
|
rho_vo = rho_ov.conj()
|
|
169
|
-
|
|
170
|
-
a += lib.einsum('syria,syrjb->iajb',
|
|
171
|
-
b += lib.einsum('syria,syrjb->iajb',
|
|
169
|
+
w_vo = numpy.einsum('txsyr,txria->syria', wfxc, rho_vo)
|
|
170
|
+
a += lib.einsum('syria,syrjb->iajb', w_vo, rho_ov)
|
|
171
|
+
b += lib.einsum('syria,syrjb->iajb', w_vo, rho_vo)
|
|
172
172
|
elif ni.collinear[0] == 'c':
|
|
173
173
|
rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1)
|
|
174
174
|
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
|
|
@@ -180,13 +180,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
180
180
|
rho_ov_b[1:4] += numpy.einsum('ri,xra->xria', mo_ob[0].conj(), mo_vb[1:4])
|
|
181
181
|
rho_vo_a = rho_ov_a.conj()
|
|
182
182
|
rho_vo_b = rho_ov_b.conj()
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
a += lib.einsum('xria,xrjb->iajb',
|
|
187
|
-
a += lib.einsum('xria,xrjb->iajb',
|
|
188
|
-
b += lib.einsum('xria,xrjb->iajb',
|
|
189
|
-
b += lib.einsum('xria,xrjb->iajb',
|
|
183
|
+
w_vo = numpy.einsum('xsyr,xria->syria', wv_a, rho_vo_a)
|
|
184
|
+
w_vo += numpy.einsum('xsyr,xria->syria', wv_b, rho_vo_b)
|
|
185
|
+
wa_vo, wb_vo = w_vo
|
|
186
|
+
a += lib.einsum('xria,xrjb->iajb', wa_vo, rho_ov_a)
|
|
187
|
+
a += lib.einsum('xria,xrjb->iajb', wb_vo, rho_ov_b)
|
|
188
|
+
b += lib.einsum('xria,xrjb->iajb', wa_vo, rho_vo_a)
|
|
189
|
+
b += lib.einsum('xria,xrjb->iajb', wb_vo, rho_vo_b)
|
|
190
190
|
else:
|
|
191
191
|
raise NotImplementedError(ni.collinear)
|
|
192
192
|
|
|
@@ -225,9 +225,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
225
225
|
rho_ov_bb = numpy.vstack([rho_ov_bb, tau_ov_bb[numpy.newaxis]])
|
|
226
226
|
rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
|
|
227
227
|
rho_vo = rho_ov.conj()
|
|
228
|
-
|
|
229
|
-
a += lib.einsum('syria,syrjb->iajb',
|
|
230
|
-
b += lib.einsum('syria,syrjb->iajb',
|
|
228
|
+
w_vo = numpy.einsum('txsyr,txria->syria', wfxc, rho_vo)
|
|
229
|
+
a += lib.einsum('syria,syrjb->iajb', w_vo, rho_ov)
|
|
230
|
+
b += lib.einsum('syria,syrjb->iajb', w_vo, rho_vo)
|
|
231
231
|
elif ni.collinear[0] == 'c':
|
|
232
232
|
rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1, with_lapl=False)
|
|
233
233
|
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
|
|
@@ -243,13 +243,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
|
|
|
243
243
|
rho_ov_b = numpy.vstack([rho_ov_b, tau_ov_b[numpy.newaxis]])
|
|
244
244
|
rho_vo_a = rho_ov_a.conj()
|
|
245
245
|
rho_vo_b = rho_ov_b.conj()
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
a += lib.einsum('xria,xrjb->iajb',
|
|
250
|
-
a += lib.einsum('xria,xrjb->iajb',
|
|
251
|
-
b += lib.einsum('xria,xrjb->iajb',
|
|
252
|
-
b += lib.einsum('xria,xrjb->iajb',
|
|
246
|
+
w_vo = numpy.einsum('xsyr,xria->syria', wv_a, rho_vo_a)
|
|
247
|
+
w_vo += numpy.einsum('xsyr,xria->syria', wv_b, rho_vo_b)
|
|
248
|
+
wa_vo, wb_vo = w_vo
|
|
249
|
+
a += lib.einsum('xria,xrjb->iajb', wa_vo, rho_ov_a)
|
|
250
|
+
a += lib.einsum('xria,xrjb->iajb', wb_vo, rho_ov_b)
|
|
251
|
+
b += lib.einsum('xria,xrjb->iajb', wa_vo, rho_vo_a)
|
|
252
|
+
b += lib.einsum('xria,xrjb->iajb', wb_vo, rho_vo_b)
|
|
253
253
|
else:
|
|
254
254
|
raise NotImplementedError(ni.collinear)
|
|
255
255
|
|
|
@@ -290,9 +290,9 @@ class TDA(TDBase, ghf.TDA):
|
|
|
290
290
|
mf = self._scf
|
|
291
291
|
return gen_tda_hop(mf)
|
|
292
292
|
|
|
293
|
-
def init_guess(self, mf, nstates=None, wfnsym=None):
|
|
293
|
+
def init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):
|
|
294
294
|
assert self.wfnsym is None
|
|
295
|
-
return ghf.TDA.init_guess(self, mf, nstates, None)
|
|
295
|
+
return ghf.TDA.init_guess(self, mf, nstates, None, return_symmetry)
|
|
296
296
|
|
|
297
297
|
kernel = ghf.TDA.kernel
|
|
298
298
|
|
|
@@ -313,9 +313,9 @@ class TDHF(TDBase, ghf.TDHF):
|
|
|
313
313
|
mf = self._scf
|
|
314
314
|
return gen_tdhf_operation(mf)
|
|
315
315
|
|
|
316
|
-
def init_guess(self, mf, nstates=None, wfnsym=None):
|
|
316
|
+
def init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):
|
|
317
317
|
assert self.wfnsym is None
|
|
318
|
-
return ghf.TDHF.init_guess(self, mf, nstates, None)
|
|
318
|
+
return ghf.TDHF.init_guess(self, mf, nstates, None, return_symmetry)
|
|
319
319
|
|
|
320
320
|
kernel = ghf.TDHF.kernel
|
|
321
321
|
|
pyscf/x2c/x2c.py
CHANGED
|
@@ -577,7 +577,7 @@ class SCF(hf.SCF):
|
|
|
577
577
|
log = logger.new_logger(mol, verbose)
|
|
578
578
|
|
|
579
579
|
if not (isinstance(dm, numpy.ndarray) and dm.ndim == 2):
|
|
580
|
-
# UHF
|
|
580
|
+
# UHF density matrices
|
|
581
581
|
dm = dm[0] + dm[1]
|
|
582
582
|
|
|
583
583
|
with mol.with_common_orig((0,0,0)):
|
|
@@ -774,17 +774,22 @@ class X2C1E_GSCF(_X2C_SCF):
|
|
|
774
774
|
charges = mol.atom_charges()
|
|
775
775
|
coords = mol.atom_coords()
|
|
776
776
|
nucl_dip = numpy.einsum('i,ix->x', charges, coords)
|
|
777
|
-
with mol.with_common_orig(
|
|
778
|
-
r = mol.intor_symmetric('int1e_r')
|
|
779
|
-
ao_dip = numpy.array([_block_diag(x) for x in r])
|
|
777
|
+
with mol.with_common_orig((0,0,0)):
|
|
780
778
|
if picture_change:
|
|
781
779
|
xmol = self.with_x2c.get_xmol()[0]
|
|
782
780
|
nao = xmol.nao
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
781
|
+
r = xmol.intor_symmetric('int1e_r')
|
|
782
|
+
r = numpy.array([_block_diag(x) for x in r])
|
|
783
|
+
c1 = 0.5/lib.param.LIGHT_SPEED
|
|
784
|
+
prp = xmol.intor_symmetric('int1e_sprsp').reshape(3,4,nao,nao)
|
|
785
|
+
prp = numpy.array([_sigma_dot(x*c1**2) for x in prp])
|
|
786
|
+
ao_dip = self.with_x2c.picture_change((r, prp))
|
|
787
|
+
else:
|
|
788
|
+
r = mol.intor_symmetric('int1e_r')
|
|
789
|
+
ao_dip = numpy.array([_block_diag(x) for x in r])
|
|
786
790
|
|
|
787
|
-
|
|
791
|
+
el_dip = numpy.einsum('xij,ji->x', ao_dip, dm).real
|
|
792
|
+
mol_dip = nucl_dip - el_dip
|
|
788
793
|
|
|
789
794
|
if unit.upper() == 'DEBYE':
|
|
790
795
|
mol_dip *= nist.AU2DEBYE
|
|
@@ -810,8 +815,7 @@ class X2C1E_GSCF(_X2C_SCF):
|
|
|
810
815
|
|
|
811
816
|
def _uncontract_mol(mol, xuncontract=None, exp_drop=0.2):
|
|
812
817
|
'''mol._basis + uncontracted steep functions'''
|
|
813
|
-
pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract)
|
|
814
|
-
contr_coeff = scipy.linalg.block_diag(*contr_coeff)
|
|
818
|
+
pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract, aggregate=True)
|
|
815
819
|
return pmol, contr_coeff
|
|
816
820
|
|
|
817
821
|
|
|
@@ -953,7 +957,7 @@ def _x2c1e_get_hcore(t, v, w, s, c):
|
|
|
953
957
|
|
|
954
958
|
w, u = numpy.linalg.eigh(reduce(numpy.dot, (cl.T.conj(), s, cl)))
|
|
955
959
|
idx = w > 1e-14
|
|
956
|
-
# Adopt (2) here
|
|
960
|
+
# Adopt (2) here because X is not appeared in Eq (2).
|
|
957
961
|
# R[A] = u w^{1/2} u^+, so R[A]^{-1} A^+ S in Eq (2) is
|
|
958
962
|
r = reduce(numpy.dot, (u[:,idx]/numpy.sqrt(w[idx]), u[:,idx].T.conj(),
|
|
959
963
|
cl.T.conj(), s))
|