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/pbc/tdscf/kuhf.py
CHANGED
|
@@ -17,41 +17,250 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
from functools import reduce
|
|
20
|
-
import numpy
|
|
20
|
+
import numpy as np
|
|
21
21
|
from pyscf import lib
|
|
22
22
|
from pyscf.lib import logger
|
|
23
23
|
from pyscf.tdscf import uhf
|
|
24
|
+
from pyscf.tdscf._lr_eig import eigh as lr_eigh, eig as lr_eig
|
|
24
25
|
from pyscf.pbc import scf
|
|
25
|
-
from pyscf.pbc.tdscf.krhf import KTDBase, _get_e_ia
|
|
26
|
-
from pyscf.pbc.lib.kpts_helper import
|
|
26
|
+
from pyscf.pbc.tdscf.krhf import KTDBase, _get_e_ia
|
|
27
|
+
from pyscf.pbc.lib.kpts_helper import is_gamma_point, get_kconserv_ria, conj_mapping
|
|
27
28
|
from pyscf.pbc.scf import _response_functions # noqa
|
|
28
29
|
from pyscf import __config__
|
|
29
30
|
|
|
30
31
|
REAL_EIG_THRESHOLD = getattr(__config__, 'pbc_tdscf_uhf_TDDFT_pick_eig_threshold', 1e-3)
|
|
31
32
|
|
|
33
|
+
def get_ab(mf, kshift=0):
|
|
34
|
+
r'''A and B matrices for TDDFT response function.
|
|
35
|
+
|
|
36
|
+
A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (ai||jb)
|
|
37
|
+
B[i,a,j,b] = (ai||bj)
|
|
38
|
+
|
|
39
|
+
Ref: Chem Phys Lett, 256, 454
|
|
40
|
+
|
|
41
|
+
Kwargs:
|
|
42
|
+
kshift : integer
|
|
43
|
+
The index of the k-point that represents the transition between
|
|
44
|
+
k-points in the excitation coefficients.
|
|
45
|
+
'''
|
|
46
|
+
cell = mf.cell
|
|
47
|
+
mo_energy = scf.addons.mo_energy_with_exxdiv_none(mf)
|
|
48
|
+
mo_a, mo_b = mo = np.asarray(mf.mo_coeff)
|
|
49
|
+
mo_occ = np.asarray(mf.mo_occ)
|
|
50
|
+
kpts = mf.kpts
|
|
51
|
+
nkpts, nao, nmo = mo_a.shape
|
|
52
|
+
noccs = np.count_nonzero(mo_occ!=0, axis=2)
|
|
53
|
+
nocc = noccs[0,0]
|
|
54
|
+
nvir = nmo - nocc
|
|
55
|
+
assert np.all(noccs == nocc)
|
|
56
|
+
nocc_a = nocc_b = nocc
|
|
57
|
+
nvir_a = nvir_b = nvir
|
|
58
|
+
orbo_a = mo_a[:,:,:nocc]
|
|
59
|
+
orbo_b = mo_b[:,:,:nocc]
|
|
60
|
+
orbv_a = mo_a[:,:,nocc:]
|
|
61
|
+
orbv_b = mo_b[:,:,nocc:]
|
|
62
|
+
|
|
63
|
+
kconserv = get_kconserv_ria(cell, kpts)[kshift]
|
|
64
|
+
e_ia_a = np.asarray(_get_e_ia(mo_energy[0], mo_occ[0], kconserv)).astype(mo.dtype)
|
|
65
|
+
e_ia_b = np.asarray(_get_e_ia(mo_energy[1], mo_occ[1], kconserv)).astype(mo.dtype)
|
|
66
|
+
a_aa = np.diag(e_ia_a.ravel()).reshape(nkpts,nocc_a,nvir_a,nkpts,nocc_a,nvir_a)
|
|
67
|
+
a_bb = np.diag(e_ia_b.ravel()).reshape(nkpts,nocc_b,nvir_b,nkpts,nocc_b,nvir_b)
|
|
68
|
+
a_ab = np.zeros((nkpts,nocc_a,nvir_a,nkpts,nocc_b,nvir_b), dtype=a_aa.dtype)
|
|
69
|
+
b_aa = np.zeros_like(a_aa)
|
|
70
|
+
b_bb = np.zeros_like(a_bb)
|
|
71
|
+
b_ab = np.zeros_like(a_ab)
|
|
72
|
+
a = (a_aa, a_ab, a_bb)
|
|
73
|
+
b = (b_aa, b_ab, b_bb)
|
|
74
|
+
weight = 1./nkpts
|
|
75
|
+
|
|
76
|
+
def add_hf_(a, b, hyb=1):
|
|
77
|
+
eri_aa = mf.with_df.ao2mo_7d([mo_a,orbo_a,mo_a,mo_a], kpts)
|
|
78
|
+
eri_ab = mf.with_df.ao2mo_7d([mo_a,orbo_a,mo_b,mo_b], kpts)
|
|
79
|
+
eri_bb = mf.with_df.ao2mo_7d([mo_b,orbo_b,mo_b,mo_b], kpts)
|
|
80
|
+
eri_aa *= weight
|
|
81
|
+
eri_ab *= weight
|
|
82
|
+
eri_bb *= weight
|
|
83
|
+
eri_aa.reshape(nkpts,nkpts,nkpts,nmo,nocc_a,nmo,nmo)
|
|
84
|
+
eri_ab.reshape(nkpts,nkpts,nkpts,nmo,nocc_a,nmo,nmo)
|
|
85
|
+
eri_bb.reshape(nkpts,nkpts,nkpts,nmo,nocc_b,nmo,nmo)
|
|
86
|
+
a_aa, a_ab, a_bb = a
|
|
87
|
+
b_aa, b_ab, b_bb = b
|
|
88
|
+
|
|
89
|
+
for ki, ka in enumerate(kconserv):
|
|
90
|
+
for kj, kb in enumerate(kconserv):
|
|
91
|
+
a_aa[ki,:,:,kj] += np.einsum('aijb->iajb', eri_aa[ka,ki,kj,nocc_a:,:,:nocc_a,nocc_a:])
|
|
92
|
+
a_aa[ki,:,:,kj] -= np.einsum('jiab->iajb', eri_aa[kj,ki,ka,:nocc_a,:,nocc_a:,nocc_a:]) * hyb
|
|
93
|
+
a_bb[ki,:,:,kj] += np.einsum('aijb->iajb', eri_bb[ka,ki,kj,nocc_b:,:,:nocc_b,nocc_b:])
|
|
94
|
+
a_bb[ki,:,:,kj] -= np.einsum('jiab->iajb', eri_bb[kj,ki,ka,:nocc_b,:,nocc_b:,nocc_b:]) * hyb
|
|
95
|
+
a_ab[ki,:,:,kj] += np.einsum('aijb->iajb', eri_ab[ka,ki,kj,nocc_a:,:,:nocc_b,nocc_b:])
|
|
96
|
+
|
|
97
|
+
for kb, kj in enumerate(kconserv):
|
|
98
|
+
b_aa[ki,:,:,kj] += np.einsum('aibj->iajb', eri_aa[ka,ki,kb,nocc_a:,:,nocc_a:,:nocc_a])
|
|
99
|
+
b_aa[ki,:,:,kj] -= np.einsum('ajbi->iajb', eri_aa[ka,kj,kb,nocc_a:,:,nocc_a:,:nocc_a]) * hyb
|
|
100
|
+
b_bb[ki,:,:,kj] += np.einsum('aibj->iajb', eri_bb[ka,ki,kb,nocc_b:,:,nocc_b:,:nocc_b])
|
|
101
|
+
b_bb[ki,:,:,kj] -= np.einsum('ajbi->iajb', eri_bb[ka,kj,kb,nocc_b:,:,nocc_b:,:nocc_b]) * hyb
|
|
102
|
+
b_ab[ki,:,:,kj] += np.einsum('aibj->iajb', eri_ab[ka,ki,kb,nocc_a:,:,nocc_b:,:nocc_b])
|
|
103
|
+
|
|
104
|
+
if isinstance(mf, scf.hf.KohnShamDFT):
|
|
105
|
+
ni = mf._numint
|
|
106
|
+
omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, cell.spin)
|
|
107
|
+
|
|
108
|
+
add_hf_(a, b, hyb)
|
|
109
|
+
if omega != 0: # For RSH
|
|
110
|
+
raise NotImplementedError
|
|
111
|
+
|
|
112
|
+
xctype = ni._xc_type(mf.xc)
|
|
113
|
+
dm0 = mf.make_rdm1(mo, mo_occ)
|
|
114
|
+
make_rho = ni._gen_rho_evaluator(cell, dm0, hermi=1, with_lapl=False)[0]
|
|
115
|
+
mem_now = lib.current_memory()[0]
|
|
116
|
+
max_memory = max(2000, mf.max_memory*.8-mem_now)
|
|
117
|
+
cmap = conj_mapping(cell, kpts)
|
|
118
|
+
|
|
119
|
+
if xctype == 'LDA':
|
|
120
|
+
ao_deriv = 0
|
|
121
|
+
for ao, _, mask, weight, coords \
|
|
122
|
+
in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
|
|
123
|
+
rho0a = make_rho(0, ao, mask, xctype)
|
|
124
|
+
rho0b = make_rho(1, ao, mask, xctype)
|
|
125
|
+
rho = (rho0a, rho0b)
|
|
126
|
+
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
|
|
127
|
+
wfxc = fxc[0,0] * weight
|
|
128
|
+
|
|
129
|
+
rho_o_a = lib.einsum('krp,kpi->kri', ao, orbo_a)
|
|
130
|
+
rho_v_a = lib.einsum('krp,kpi->kri', ao, orbv_a)
|
|
131
|
+
rho_o_b = lib.einsum('krp,kpi->kri', ao, orbo_b)
|
|
132
|
+
rho_v_b = lib.einsum('krp,kpi->kri', ao, orbv_b)
|
|
133
|
+
rho_ov_a = np.einsum('kri,kra->kria', rho_o_a, rho_v_a)
|
|
134
|
+
rho_ov_b = np.einsum('kri,kra->kria', rho_o_b, rho_v_b)
|
|
135
|
+
rho_vo_a = rho_ov_a.conj()[cmap]
|
|
136
|
+
rho_vo_b = rho_ov_b.conj()[cmap]
|
|
137
|
+
w_vo_aa = np.einsum('kria,r->kria', rho_vo_a, wfxc[0,0]) * (1/nkpts)
|
|
138
|
+
w_vo_ab = np.einsum('kria,r->kria', rho_vo_a, wfxc[0,1]) * (1/nkpts)
|
|
139
|
+
w_vo_bb = np.einsum('kria,r->kria', rho_vo_b, wfxc[1,1]) * (1/nkpts)
|
|
140
|
+
|
|
141
|
+
a_aa += lib.einsum('kria,lrjb->kialjb', w_vo_aa, rho_ov_a)
|
|
142
|
+
b_aa += lib.einsum('kria,lrjb->kialjb', w_vo_aa, rho_vo_a)
|
|
143
|
+
|
|
144
|
+
a_ab += lib.einsum('kria,lrjb->kialjb', w_vo_ab, rho_ov_b)
|
|
145
|
+
b_ab += lib.einsum('kria,lrjb->kialjb', w_vo_ab, rho_vo_b)
|
|
146
|
+
|
|
147
|
+
a_bb += lib.einsum('kria,lrjb->kialjb', w_vo_bb, rho_ov_b)
|
|
148
|
+
b_bb += lib.einsum('kria,lrjb->kialjb', w_vo_bb, rho_vo_b)
|
|
149
|
+
|
|
150
|
+
elif xctype == 'GGA':
|
|
151
|
+
ao_deriv = 1
|
|
152
|
+
for ao, _, mask, weight, coords \
|
|
153
|
+
in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
|
|
154
|
+
rho0a = make_rho(0, ao, mask, xctype)
|
|
155
|
+
rho0b = make_rho(1, ao, mask, xctype)
|
|
156
|
+
rho = (rho0a, rho0b)
|
|
157
|
+
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
|
|
158
|
+
wfxc = fxc * weight
|
|
159
|
+
|
|
160
|
+
rho_o_a = lib.einsum('kxrp,kpi->kxri', ao, orbo_a)
|
|
161
|
+
rho_v_a = lib.einsum('kxrp,kpi->kxri', ao, orbv_a)
|
|
162
|
+
rho_o_b = lib.einsum('kxrp,kpi->kxri', ao, orbo_b)
|
|
163
|
+
rho_v_b = lib.einsum('kxrp,kpi->kxri', ao, orbv_b)
|
|
164
|
+
rho_ov_a = np.einsum('kxri,kra->kxria', rho_o_a, rho_v_a[:,0])
|
|
165
|
+
rho_ov_b = np.einsum('kxri,kra->kxria', rho_o_b, rho_v_b[:,0])
|
|
166
|
+
rho_ov_a[:,1:4] += np.einsum('kri,kxra->kxria', rho_o_a[:,0], rho_v_a[:,1:4])
|
|
167
|
+
rho_ov_b[:,1:4] += np.einsum('kri,kxra->kxria', rho_o_b[:,0], rho_v_b[:,1:4])
|
|
168
|
+
rho_vo_a = rho_ov_a.conj()[cmap]
|
|
169
|
+
rho_vo_b = rho_ov_b.conj()[cmap]
|
|
170
|
+
w_vo_aa = np.einsum('xyr,kxria->kyria', wfxc[0,:,0], rho_vo_a) * (1/nkpts)
|
|
171
|
+
w_vo_ab = np.einsum('xyr,kxria->kyria', wfxc[0,:,1], rho_vo_a) * (1/nkpts)
|
|
172
|
+
w_vo_bb = np.einsum('xyr,kxria->kyria', wfxc[1,:,1], rho_vo_b) * (1/nkpts)
|
|
173
|
+
|
|
174
|
+
a_aa += lib.einsum('kxria,lxrjb->kialjb', w_vo_aa, rho_ov_a)
|
|
175
|
+
b_aa += lib.einsum('kxria,lxrjb->kialjb', w_vo_aa, rho_vo_a)
|
|
176
|
+
|
|
177
|
+
a_ab += lib.einsum('kxria,lxrjb->kialjb', w_vo_ab, rho_ov_b)
|
|
178
|
+
b_ab += lib.einsum('kxria,lxrjb->kialjb', w_vo_ab, rho_vo_b)
|
|
179
|
+
|
|
180
|
+
a_bb += lib.einsum('kxria,lxrjb->kialjb', w_vo_bb, rho_ov_b)
|
|
181
|
+
b_bb += lib.einsum('kxria,lxrjb->kialjb', w_vo_bb, rho_vo_b)
|
|
182
|
+
|
|
183
|
+
elif xctype == 'HF':
|
|
184
|
+
pass
|
|
185
|
+
|
|
186
|
+
elif xctype == 'NLC':
|
|
187
|
+
raise NotImplementedError('NLC')
|
|
188
|
+
|
|
189
|
+
elif xctype == 'MGGA':
|
|
190
|
+
ao_deriv = 1
|
|
191
|
+
for ao, _, mask, weight, coords \
|
|
192
|
+
in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
|
|
193
|
+
rho0a = make_rho(0, ao, mask, xctype)
|
|
194
|
+
rho0b = make_rho(1, ao, mask, xctype)
|
|
195
|
+
rho = (rho0a, rho0b)
|
|
196
|
+
fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
|
|
197
|
+
wfxc = fxc * weight
|
|
198
|
+
|
|
199
|
+
rho_o_a = lib.einsum('kxrp,kpi->kxri', ao, orbo_a)
|
|
200
|
+
rho_o_b = lib.einsum('kxrp,kpi->kxri', ao, orbo_b)
|
|
201
|
+
rho_v_a = lib.einsum('kxrp,kpi->kxri', ao, orbv_a)
|
|
202
|
+
rho_v_b = lib.einsum('kxrp,kpi->kxri', ao, orbv_b)
|
|
203
|
+
rho_ov_a = np.einsum('kxri,kra->kxria', rho_o_a, rho_v_a[:,0])
|
|
204
|
+
rho_ov_b = np.einsum('kxri,kra->kxria', rho_o_b, rho_v_b[:,0])
|
|
205
|
+
rho_ov_a[:,1:4] += np.einsum('ri,xra->xria', rho_o_a[:,0], rho_v_a[:,1:4])
|
|
206
|
+
rho_ov_b[:,1:4] += np.einsum('ri,xra->xria', rho_o_b[:,0], rho_v_b[:,1:4])
|
|
207
|
+
tau_ov_a = np.einsum('kxri,kxra->kria', rho_o_a[:,1:4], rho_v_a[:,1:4]) * .5
|
|
208
|
+
tau_ov_b = np.einsum('kxri,kxra->kria', rho_o_b[:,1:4], rho_v_b[:,1:4]) * .5
|
|
209
|
+
rho_ov_a = np.vstack([rho_ov_a, tau_ov_a[:,np.newaxis]])
|
|
210
|
+
rho_ov_b = np.vstack([rho_ov_b, tau_ov_b[:,np.newaxis]])
|
|
211
|
+
rho_vo_a = rho_ov_a.conj()[cmap]
|
|
212
|
+
rho_vo_b = rho_ov_b.conj()[cmap]
|
|
213
|
+
w_vo_aa = np.einsum('xyr,kxria->kyria', wfxc[0,:,0], rho_vo_a) * (1/nkpts)
|
|
214
|
+
w_vo_ab = np.einsum('xyr,kxria->kyria', wfxc[0,:,1], rho_vo_a) * (1/nkpts)
|
|
215
|
+
w_vo_bb = np.einsum('xyr,kxria->kyria', wfxc[1,:,1], rho_vo_b) * (1/nkpts)
|
|
216
|
+
|
|
217
|
+
a_aa += lib.einsum('kxria,lxrjb->kilajb', w_vo_aa, rho_ov_a)
|
|
218
|
+
b_aa += lib.einsum('kxria,lxrjb->kilajb', w_vo_aa, rho_vo_a)
|
|
219
|
+
|
|
220
|
+
a_ab += lib.einsum('kxria,lxrjb->kilajb', w_vo_ab, rho_ov_b)
|
|
221
|
+
b_ab += lib.einsum('kxria,lxrjb->kilajb', w_vo_ab, rho_vo_b)
|
|
222
|
+
|
|
223
|
+
a_bb += lib.einsum('kxria,lxrjb->kilajb', w_vo_bb, rho_ov_b)
|
|
224
|
+
b_bb += lib.einsum('kxria,lxrjb->kilajb', w_vo_bb, rho_vo_b)
|
|
225
|
+
else:
|
|
226
|
+
add_hf_(a, b)
|
|
227
|
+
|
|
228
|
+
return a, b
|
|
229
|
+
|
|
32
230
|
class TDA(KTDBase):
|
|
33
|
-
conv_tol = getattr(__config__, 'pbc_tdscf_rhf_TDA_conv_tol', 1e-6)
|
|
34
231
|
|
|
35
|
-
def
|
|
36
|
-
|
|
37
|
-
|
|
232
|
+
def get_ab(self, mf=None, kshift=0):
|
|
233
|
+
if mf is None: mf = self._scf
|
|
234
|
+
return get_ab(mf, kshift)
|
|
235
|
+
|
|
236
|
+
def gen_vind(self, mf, kshift=0):
|
|
237
|
+
'''Compute Ax
|
|
238
|
+
|
|
239
|
+
Kwargs:
|
|
240
|
+
kshift : integer
|
|
241
|
+
The index of the k-point that represents the transition between
|
|
242
|
+
k-points in the excitation coefficients.
|
|
243
|
+
'''
|
|
244
|
+
kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
|
|
245
|
+
|
|
38
246
|
mo_coeff = mf.mo_coeff
|
|
39
247
|
mo_occ = mf.mo_occ
|
|
40
248
|
nkpts = len(mo_occ[0])
|
|
41
249
|
nao, nmo = mo_coeff[0][0].shape
|
|
42
|
-
occidxa = [
|
|
43
|
-
occidxb = [
|
|
44
|
-
viridxa = [
|
|
45
|
-
viridxb = [
|
|
250
|
+
occidxa = [mo_occ[0][k]> 0 for k in range(nkpts)]
|
|
251
|
+
occidxb = [mo_occ[1][k]> 0 for k in range(nkpts)]
|
|
252
|
+
viridxa = [mo_occ[0][k]==0 for k in range(nkpts)]
|
|
253
|
+
viridxb = [mo_occ[1][k]==0 for k in range(nkpts)]
|
|
46
254
|
orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)]
|
|
47
255
|
orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)]
|
|
48
|
-
orbva = [mo_coeff[0][
|
|
49
|
-
orbvb = [mo_coeff[1][
|
|
256
|
+
orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)]
|
|
257
|
+
orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)]
|
|
258
|
+
dtype = np.result_type(*mo_coeff[0])
|
|
50
259
|
|
|
51
260
|
moe = scf.addons.mo_energy_with_exxdiv_none(mf)
|
|
52
261
|
e_ia_a = _get_e_ia(moe[0], mo_occ[0], kconserv)
|
|
53
262
|
e_ia_b = _get_e_ia(moe[1], mo_occ[1], kconserv)
|
|
54
|
-
hdiag =
|
|
263
|
+
hdiag = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
|
|
55
264
|
|
|
56
265
|
mem_now = lib.current_memory()[0]
|
|
57
266
|
max_memory = max(2000, self.max_memory*.8-mem_now)
|
|
@@ -60,32 +269,31 @@ class TDA(KTDBase):
|
|
|
60
269
|
def vind(zs):
|
|
61
270
|
nz = len(zs)
|
|
62
271
|
zs = [_unpack(z, mo_occ, kconserv) for z in zs]
|
|
63
|
-
|
|
272
|
+
dms = np.empty((2,nz,nkpts,nao,nao), dtype=dtype)
|
|
64
273
|
for i in range(nz):
|
|
65
274
|
dm1a, dm1b = zs[i]
|
|
66
|
-
for k in
|
|
67
|
-
|
|
68
|
-
|
|
275
|
+
for k, kp in enumerate(kconserv):
|
|
276
|
+
dms[0,i,kp] = lib.einsum('ov,pv,qo->pq', dm1a[k], orbva[kp], orboa[k].conj())
|
|
277
|
+
dms[1,i,kp] = lib.einsum('ov,pv,qo->pq', dm1b[k], orbvb[kp], orbob[k].conj())
|
|
69
278
|
|
|
70
279
|
with lib.temporary_env(mf, exxdiv=None):
|
|
71
|
-
|
|
72
|
-
v1ao = vresp(dmov, kshift)
|
|
280
|
+
v1ao = vresp(dms, kshift)
|
|
73
281
|
v1ao = v1ao.reshape(2,nz,nkpts,nao,nao)
|
|
74
282
|
|
|
75
283
|
v1s = []
|
|
76
284
|
for i in range(nz):
|
|
77
285
|
dm1a, dm1b = zs[i]
|
|
78
|
-
v1as = []
|
|
79
|
-
v1bs = []
|
|
80
|
-
for k in
|
|
81
|
-
v1a =
|
|
82
|
-
v1b =
|
|
286
|
+
v1as = [None] * nkpts
|
|
287
|
+
v1bs = [None] * nkpts
|
|
288
|
+
for k, kp in enumerate(kconserv):
|
|
289
|
+
v1a = lib.einsum('pq,qo,pv->ov', v1ao[0,i,kp], orboa[k], orbva[kp].conj())
|
|
290
|
+
v1b = lib.einsum('pq,qo,pv->ov', v1ao[1,i,kp], orbob[k], orbvb[kp].conj())
|
|
83
291
|
v1a += e_ia_a[k] * dm1a[k]
|
|
84
292
|
v1b += e_ia_b[k] * dm1b[k]
|
|
85
|
-
v1as
|
|
86
|
-
v1bs
|
|
87
|
-
v1s.append(
|
|
88
|
-
return
|
|
293
|
+
v1as[k] = v1a.ravel()
|
|
294
|
+
v1bs[k] = v1b.ravel()
|
|
295
|
+
v1s.append( np.concatenate(v1as + v1bs) )
|
|
296
|
+
return np.stack(v1s)
|
|
89
297
|
|
|
90
298
|
return vind, hdiag
|
|
91
299
|
|
|
@@ -94,18 +302,18 @@ class TDA(KTDBase):
|
|
|
94
302
|
|
|
95
303
|
mo_energy = mf.mo_energy
|
|
96
304
|
mo_occ = mf.mo_occ
|
|
97
|
-
kconserv =
|
|
305
|
+
kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
|
|
98
306
|
e_ia_a = _get_e_ia(mo_energy[0], mo_occ[0], kconserv)
|
|
99
307
|
e_ia_b = _get_e_ia(mo_energy[1], mo_occ[1], kconserv)
|
|
100
|
-
e_ia =
|
|
308
|
+
e_ia = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
|
|
101
309
|
|
|
102
310
|
nov = e_ia.size
|
|
103
311
|
nstates = min(nstates, nov)
|
|
104
|
-
e_threshold =
|
|
312
|
+
e_threshold = np.partition(e_ia, nstates-1)[nstates-1]
|
|
105
313
|
e_threshold += self.deg_eia_thresh
|
|
106
314
|
|
|
107
|
-
idx =
|
|
108
|
-
x0 =
|
|
315
|
+
idx = np.where(e_ia <= e_threshold)[0]
|
|
316
|
+
x0 = np.zeros((idx.size, nov))
|
|
109
317
|
for i, j in enumerate(idx):
|
|
110
318
|
x0[i, j] = 1 # Koopmans' excitations
|
|
111
319
|
return x0
|
|
@@ -123,18 +331,16 @@ class TDA(KTDBase):
|
|
|
123
331
|
mo_occ = mf.mo_occ
|
|
124
332
|
|
|
125
333
|
def pickeig(w, v, nroots, envs):
|
|
126
|
-
idx =
|
|
334
|
+
idx = np.where(w > self.positive_eig_threshold)[0]
|
|
127
335
|
return w[idx], v[:,idx], idx
|
|
128
336
|
|
|
129
337
|
log = logger.Logger(self.stdout, self.verbose)
|
|
130
|
-
precision = self.cell.precision * 1e-2
|
|
131
|
-
hermi = 1
|
|
132
338
|
|
|
133
339
|
self.converged = []
|
|
134
340
|
self.e = []
|
|
135
341
|
self.xy = []
|
|
136
342
|
for i,kshift in enumerate(self.kshift_lst):
|
|
137
|
-
kconserv =
|
|
343
|
+
kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
|
|
138
344
|
|
|
139
345
|
vind, hdiag = self.gen_vind(self._scf, kshift)
|
|
140
346
|
precond = self.get_precond(hdiag)
|
|
@@ -144,15 +350,10 @@ class TDA(KTDBase):
|
|
|
144
350
|
else:
|
|
145
351
|
x0k = x0[i]
|
|
146
352
|
|
|
147
|
-
converged, e, x1 =
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
nroots=self.nstates,
|
|
152
|
-
lindep=self.lindep,
|
|
153
|
-
max_space=self.max_space, pick=pickeig,
|
|
154
|
-
fill_heff=purify_krlyov_heff(precision, hermi, log),
|
|
155
|
-
verbose=self.verbose)
|
|
353
|
+
converged, e, x1 = lr_eigh(
|
|
354
|
+
vind, x0k, precond, tol_residual=self.conv_tol, lindep=self.lindep,
|
|
355
|
+
nroots=self.nstates, pick=pickeig, max_cycle=self.max_cycle,
|
|
356
|
+
max_memory=self.max_memory, verbose=log)
|
|
156
357
|
self.converged.append( converged )
|
|
157
358
|
self.e.append( e )
|
|
158
359
|
self.xy.append( [(_unpack(xi, mo_occ, kconserv), # (X_alpha, X_beta)
|
|
@@ -165,30 +366,34 @@ class TDA(KTDBase):
|
|
|
165
366
|
CIS = KTDA = TDA
|
|
166
367
|
|
|
167
368
|
|
|
168
|
-
class TDHF(
|
|
169
|
-
|
|
170
|
-
|
|
369
|
+
class TDHF(KTDBase):
|
|
370
|
+
|
|
371
|
+
get_ab = TDA.get_ab
|
|
372
|
+
|
|
373
|
+
def gen_vind(self, mf, kshift=0):
|
|
374
|
+
assert kshift == 0
|
|
375
|
+
|
|
171
376
|
mo_coeff = mf.mo_coeff
|
|
172
377
|
mo_occ = mf.mo_occ
|
|
173
378
|
nkpts = len(mo_occ[0])
|
|
174
379
|
nao, nmo = mo_coeff[0][0].shape
|
|
175
|
-
occidxa = [
|
|
176
|
-
occidxb = [
|
|
177
|
-
viridxa = [
|
|
178
|
-
viridxb = [
|
|
380
|
+
occidxa = [mo_occ[0][k]> 0 for k in range(nkpts)]
|
|
381
|
+
occidxb = [mo_occ[1][k]> 0 for k in range(nkpts)]
|
|
382
|
+
viridxa = [mo_occ[0][k]==0 for k in range(nkpts)]
|
|
383
|
+
viridxb = [mo_occ[1][k]==0 for k in range(nkpts)]
|
|
179
384
|
orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)]
|
|
180
385
|
orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)]
|
|
181
|
-
orbva = [mo_coeff[0][
|
|
182
|
-
orbvb = [mo_coeff[1][
|
|
386
|
+
orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)]
|
|
387
|
+
orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)]
|
|
388
|
+
dtype = np.result_type(*mo_coeff[0])
|
|
183
389
|
|
|
390
|
+
kconserv = np.arange(nkpts)
|
|
184
391
|
moe = scf.addons.mo_energy_with_exxdiv_none(mf)
|
|
185
392
|
e_ia_a = _get_e_ia(moe[0], mo_occ[0], kconserv)
|
|
186
393
|
e_ia_b = _get_e_ia(moe[1], mo_occ[1], kconserv)
|
|
187
|
-
hdiag =
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
tot_x_b = sum(x.size for x in e_ia_b)
|
|
191
|
-
tot_x = tot_x_a + tot_x_b
|
|
394
|
+
hdiag = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
|
|
395
|
+
tot_x = hdiag.size
|
|
396
|
+
hdiag = np.hstack((hdiag, -hdiag))
|
|
192
397
|
|
|
193
398
|
mem_now = lib.current_memory()[0]
|
|
194
399
|
max_memory = max(2000, self.max_memory*.8-mem_now)
|
|
@@ -198,53 +403,52 @@ class TDHF(TDA):
|
|
|
198
403
|
nz = len(xys)
|
|
199
404
|
x1s = [_unpack(x[:tot_x], mo_occ, kconserv) for x in xys]
|
|
200
405
|
y1s = [_unpack(x[tot_x:], mo_occ, kconserv) for x in xys]
|
|
201
|
-
|
|
406
|
+
dms = np.empty((2,nz,nkpts,nao,nao), dtype=dtype)
|
|
202
407
|
for i in range(nz):
|
|
203
408
|
xa, xb = x1s[i]
|
|
204
409
|
ya, yb = y1s[i]
|
|
205
410
|
for k in range(nkpts):
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
dmy = reduce(numpy.dot, (orbvb[k], yb[k].T, orbob[k].conj().T))
|
|
211
|
-
dmov[1,i,k] = dmx + dmy # AX + BY
|
|
411
|
+
dms[0,i,k] = lib.einsum('ov,pv,qo->pq', xa[k], orbva[k], orboa[k].conj())
|
|
412
|
+
dms[1,i,k] = lib.einsum('ov,pv,qo->pq', xb[k], orbvb[k], orbob[k].conj())
|
|
413
|
+
dms[0,i,k] += lib.einsum('ov,qv,po->pq', ya[k], orbva[k].conj(), orboa[k])
|
|
414
|
+
dms[1,i,k] += lib.einsum('ov,qv,po->pq', yb[k], orbvb[k].conj(), orbob[k])
|
|
212
415
|
|
|
213
416
|
with lib.temporary_env(mf, exxdiv=None):
|
|
214
|
-
|
|
215
|
-
v1ao = vresp(dmov, kshift)
|
|
417
|
+
v1ao = vresp(dms, kshift)
|
|
216
418
|
v1ao = v1ao.reshape(2,nz,nkpts,nao,nao)
|
|
217
419
|
|
|
218
420
|
v1s = []
|
|
219
421
|
for i in range(nz):
|
|
220
422
|
xa, xb = x1s[i]
|
|
221
423
|
ya, yb = y1s[i]
|
|
222
|
-
v1xsa = []
|
|
223
|
-
v1xsb = []
|
|
224
|
-
v1ysa = []
|
|
225
|
-
v1ysb = []
|
|
424
|
+
v1xsa = [0] * nkpts
|
|
425
|
+
v1xsb = [0] * nkpts
|
|
426
|
+
v1ysa = [0] * nkpts
|
|
427
|
+
v1ysb = [0] * nkpts
|
|
226
428
|
for k in range(nkpts):
|
|
227
|
-
v1xa =
|
|
228
|
-
v1xb =
|
|
229
|
-
v1ya =
|
|
230
|
-
v1yb =
|
|
231
|
-
v1xa+= e_ia_a[k] * xa[k]
|
|
232
|
-
v1xb+= e_ia_b[k] * xb[k]
|
|
233
|
-
v1ya+= e_ia_a[k] * ya[k]
|
|
234
|
-
v1yb+= e_ia_b[k] * yb[k]
|
|
235
|
-
v1xsa
|
|
236
|
-
v1xsb
|
|
237
|
-
v1ysa
|
|
238
|
-
v1ysb
|
|
239
|
-
v1s.append(
|
|
240
|
-
return
|
|
429
|
+
v1xa = lib.einsum('pq,qo,pv->ov', v1ao[0,i,k], orboa[k], orbva[k].conj())
|
|
430
|
+
v1xb = lib.einsum('pq,qo,pv->ov', v1ao[1,i,k], orbob[k], orbvb[k].conj())
|
|
431
|
+
v1ya = lib.einsum('pq,po,qv->ov', v1ao[0,i,k], orboa[k].conj(), orbva[k])
|
|
432
|
+
v1yb = lib.einsum('pq,po,qv->ov', v1ao[1,i,k], orbob[k].conj(), orbvb[k])
|
|
433
|
+
v1xa += e_ia_a[k] * xa[k]
|
|
434
|
+
v1xb += e_ia_b[k] * xb[k]
|
|
435
|
+
v1ya += e_ia_a[k] * ya[k]
|
|
436
|
+
v1yb += e_ia_b[k] * yb[k]
|
|
437
|
+
v1xsa[k] += v1xa.ravel()
|
|
438
|
+
v1xsb[k] += v1xb.ravel()
|
|
439
|
+
v1ysa[k] -= v1ya.ravel()
|
|
440
|
+
v1ysb[k] -= v1yb.ravel()
|
|
441
|
+
v1s.append( np.concatenate(v1xsa + v1xsb + v1ysa + v1ysb) )
|
|
442
|
+
return np.stack(v1s)
|
|
241
443
|
|
|
242
444
|
return vind, hdiag
|
|
243
445
|
|
|
244
446
|
def init_guess(self, mf, kshift, nstates=None, wfnsym=None):
|
|
245
447
|
x0 = TDA.init_guess(self, mf, kshift, nstates)
|
|
246
|
-
y0 =
|
|
247
|
-
return
|
|
448
|
+
y0 = np.zeros_like(x0)
|
|
449
|
+
return np.hstack([x0, y0])
|
|
450
|
+
|
|
451
|
+
get_precond = uhf.TDHF.get_precond
|
|
248
452
|
|
|
249
453
|
def kernel(self, x0=None):
|
|
250
454
|
'''TDHF diagonalization with non-Hermitian eigenvalue solver
|
|
@@ -258,23 +462,23 @@ class TDHF(TDA):
|
|
|
258
462
|
mf = self._scf
|
|
259
463
|
mo_occ = mf.mo_occ
|
|
260
464
|
|
|
261
|
-
real_system = (
|
|
262
|
-
self._scf.mo_coeff[0][0].dtype ==
|
|
465
|
+
real_system = (is_gamma_point(self._scf.kpts) and
|
|
466
|
+
self._scf.mo_coeff[0][0].dtype == np.double)
|
|
467
|
+
|
|
468
|
+
if any(k != 0 for k in self.kshift_lst):
|
|
469
|
+
raise RuntimeError('kshift != 0 for TDHF')
|
|
263
470
|
|
|
264
471
|
# We only need positive eigenvalues
|
|
265
472
|
def pickeig(w, v, nroots, envs):
|
|
266
|
-
realidx =
|
|
473
|
+
realidx = np.where((abs(w.imag) < REAL_EIG_THRESHOLD) &
|
|
267
474
|
(w.real > self.positive_eig_threshold))[0]
|
|
268
475
|
return lib.linalg_helper._eigs_cmplx2real(w, v, realidx, real_system)
|
|
269
476
|
|
|
270
|
-
log = logger.Logger(self.stdout, self.verbose)
|
|
271
|
-
precision = self.cell.precision * 1e-2
|
|
272
|
-
|
|
273
477
|
self.converged = []
|
|
274
478
|
self.e = []
|
|
275
479
|
self.xy = []
|
|
276
480
|
for i,kshift in enumerate(self.kshift_lst):
|
|
277
|
-
kconserv =
|
|
481
|
+
kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
|
|
278
482
|
|
|
279
483
|
vind, hdiag = self.gen_vind(self._scf, kshift)
|
|
280
484
|
precond = self.get_precond(hdiag)
|
|
@@ -284,15 +488,10 @@ class TDHF(TDA):
|
|
|
284
488
|
else:
|
|
285
489
|
x0k = x0[i]
|
|
286
490
|
|
|
287
|
-
converged, w, x1 =
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
nroots=self.nstates,
|
|
292
|
-
lindep=self.lindep,
|
|
293
|
-
max_space=self.max_space, pick=pickeig,
|
|
294
|
-
fill_heff=purify_krlyov_heff(precision, 0, log),
|
|
295
|
-
verbose=self.verbose)
|
|
491
|
+
converged, w, x1 = lr_eig(
|
|
492
|
+
vind, x0k, precond, tol_residual=self.conv_tol, lindep=self.lindep,
|
|
493
|
+
nroots=self.nstates, pick=pickeig, max_cycle=self.max_cycle,
|
|
494
|
+
max_memory=self.max_memory, verbose=log)
|
|
296
495
|
self.converged.append( converged )
|
|
297
496
|
|
|
298
497
|
e = []
|
|
@@ -300,13 +499,14 @@ class TDHF(TDA):
|
|
|
300
499
|
for i, z in enumerate(x1):
|
|
301
500
|
xs, ys = z.reshape(2,-1)
|
|
302
501
|
norm = lib.norm(xs)**2 - lib.norm(ys)**2
|
|
303
|
-
if norm
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
502
|
+
if norm < 0:
|
|
503
|
+
log.warn('TDDFT amplitudes |X| smaller than |Y|')
|
|
504
|
+
norm = abs(norm)**-.5
|
|
505
|
+
xs *= norm
|
|
506
|
+
ys *= norm
|
|
507
|
+
e.append(w[i])
|
|
508
|
+
xy.append((_unpack(xs, mo_occ, kconserv), _unpack(ys, mo_occ, kconserv)))
|
|
509
|
+
self.e.append( np.array(e) )
|
|
310
510
|
self.xy.append( xy )
|
|
311
511
|
|
|
312
512
|
log.timer(self.__class__.__name__, *cpu0)
|
|
@@ -318,17 +518,17 @@ def _unpack(vo, mo_occ, kconserv):
|
|
|
318
518
|
za = []
|
|
319
519
|
zb = []
|
|
320
520
|
p1 = 0
|
|
521
|
+
no_a_kpts = [np.count_nonzero(occ) for occ in mo_occ[0]]
|
|
522
|
+
no_b_kpts = [np.count_nonzero(occ) for occ in mo_occ[1]]
|
|
321
523
|
for k, occ in enumerate(mo_occ[0]):
|
|
322
|
-
no =
|
|
323
|
-
|
|
324
|
-
nv = occ.size - no1
|
|
524
|
+
no = no_a_kpts[k]
|
|
525
|
+
nv = occ.size - no_a_kpts[kconserv[k]]
|
|
325
526
|
p0, p1 = p1, p1 + no * nv
|
|
326
527
|
za.append(vo[p0:p1].reshape(no,nv))
|
|
327
528
|
|
|
328
529
|
for k, occ in enumerate(mo_occ[1]):
|
|
329
|
-
no =
|
|
330
|
-
|
|
331
|
-
nv = occ.size - no1
|
|
530
|
+
no = no_b_kpts[k]
|
|
531
|
+
nv = occ.size - no_b_kpts[kconserv[k]]
|
|
332
532
|
p0, p1 = p1, p1 + no * nv
|
|
333
533
|
zb.append(vo[p0:p1].reshape(no,nv))
|
|
334
534
|
return za, zb
|
|
@@ -336,55 +536,3 @@ def _unpack(vo, mo_occ, kconserv):
|
|
|
336
536
|
|
|
337
537
|
scf.kuhf.KUHF.TDA = lib.class_as_method(KTDA)
|
|
338
538
|
scf.kuhf.KUHF.TDHF = lib.class_as_method(KTDHF)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
if __name__ == '__main__':
|
|
342
|
-
from pyscf.pbc import gto
|
|
343
|
-
from pyscf.pbc import scf
|
|
344
|
-
from pyscf.pbc import df
|
|
345
|
-
cell = gto.Cell()
|
|
346
|
-
cell.unit = 'B'
|
|
347
|
-
cell.atom = '''
|
|
348
|
-
C 0. 0. 0.
|
|
349
|
-
C 1.68506879 1.68506879 1.68506879
|
|
350
|
-
'''
|
|
351
|
-
cell.a = '''
|
|
352
|
-
0. 3.37013758 3.37013758
|
|
353
|
-
3.37013758 0. 3.37013758
|
|
354
|
-
3.37013758 3.37013758 0.
|
|
355
|
-
'''
|
|
356
|
-
|
|
357
|
-
cell.basis = 'gth-szv'
|
|
358
|
-
cell.pseudo = 'gth-pade'
|
|
359
|
-
cell.mesh = [37]*3
|
|
360
|
-
cell.build()
|
|
361
|
-
mf = scf.KUHF(cell, cell.make_kpts([2,1,1])).set(exxdiv=None)
|
|
362
|
-
# mf.with_df = df.DF(cell, cell.make_kpts([2,1,1]))
|
|
363
|
-
# mf.with_df.auxbasis = 'weigend'
|
|
364
|
-
# mf.with_df._cderi = 'eri3d-df.h5'
|
|
365
|
-
# mf.with_df.build(with_j3c=False)
|
|
366
|
-
mf.run()
|
|
367
|
-
|
|
368
|
-
td = TDA(mf)
|
|
369
|
-
td.verbose = 5
|
|
370
|
-
td.nstates = 5
|
|
371
|
-
print(td.kernel()[0][0] * 27.2114)
|
|
372
|
-
|
|
373
|
-
td = TDHF(mf)
|
|
374
|
-
td.verbose = 5
|
|
375
|
-
td.nstates = 5
|
|
376
|
-
print(td.kernel()[0][0] * 27.2114)
|
|
377
|
-
|
|
378
|
-
cell.spin = 2
|
|
379
|
-
mf = scf.KUHF(cell, cell.make_kpts([2,1,1])).set(exxdiv=None)
|
|
380
|
-
mf.run()
|
|
381
|
-
|
|
382
|
-
td = TDA(mf)
|
|
383
|
-
td.verbose = 5
|
|
384
|
-
td.nstates = 5
|
|
385
|
-
print(td.kernel()[0][0] * 27.2114)
|
|
386
|
-
|
|
387
|
-
td = TDHF(mf)
|
|
388
|
-
td.verbose = 5
|
|
389
|
-
td.nstates = 5
|
|
390
|
-
print(td.kernel()[0][0] * 27.2114)
|