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/dft/numint.py
CHANGED
|
@@ -176,9 +176,9 @@ def eval_rho(mol, ao, dm, non0tab=None, xctype='LDA', hermi=0,
|
|
|
176
176
|
if hermi:
|
|
177
177
|
rho[1:4] *= 2 # *2 for + einsum('pi,ij,pj->p', ao[i], dm, ao[0])
|
|
178
178
|
else:
|
|
179
|
+
c1 = _dot_ao_dm(mol, ao[0], dm.conj().T, non0tab, shls_slice, ao_loc)
|
|
179
180
|
for i in range(1, 4):
|
|
180
|
-
|
|
181
|
-
rho[i] += _contract_rho(c1, ao[0])
|
|
181
|
+
rho[i] += _contract_rho(c1, ao[i])
|
|
182
182
|
else: # meta-GGA
|
|
183
183
|
if with_lapl:
|
|
184
184
|
# rho[4] = \nabla^2 rho, rho[5] = 1/2 |nabla f|^2
|
|
@@ -312,14 +312,14 @@ def eval_rho1(mol, ao, dm, screen_index=None, xctype='LDA', hermi=0,
|
|
|
312
312
|
|
|
313
313
|
rho[tau_idx] = 0
|
|
314
314
|
for i in range(1, 4):
|
|
315
|
-
c1 = _dot_ao_dm_sparse(ao[i], dm
|
|
315
|
+
c1 = _dot_ao_dm_sparse(ao[i], dm, nbins, screen_index, pair_mask, ao_loc)
|
|
316
316
|
rho[tau_idx] += _contract_rho_sparse(ao[i], c1, screen_index, ao_loc)
|
|
317
317
|
|
|
318
318
|
rho[i] = _contract_rho_sparse(ao[i], c0, screen_index, ao_loc)
|
|
319
319
|
if hermi:
|
|
320
320
|
rho[i] *= 2
|
|
321
321
|
else:
|
|
322
|
-
rho[i] += _contract_rho_sparse(
|
|
322
|
+
rho[i] += _contract_rho_sparse(ao[0], c1, screen_index, ao_loc)
|
|
323
323
|
|
|
324
324
|
# tau = 1/2 (\nabla f)^2
|
|
325
325
|
rho[tau_idx] *= .5
|
|
@@ -812,9 +812,8 @@ def _tau_dot(mol, bra, ket, wv, mask, shls_slice, ao_loc):
|
|
|
812
812
|
mat += _dot_ao_ao(mol, bra[3], aow, mask, shls_slice, ao_loc)
|
|
813
813
|
return mat
|
|
814
814
|
|
|
815
|
-
def _sparse_enough(screen_index):
|
|
815
|
+
def _sparse_enough(screen_index, threshold=0.5):
|
|
816
816
|
# TODO: improve the turnover threshold
|
|
817
|
-
threshold = 0.5
|
|
818
817
|
return numpy.count_nonzero(screen_index) < screen_index.size * threshold
|
|
819
818
|
|
|
820
819
|
def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
|
|
@@ -831,13 +830,8 @@ def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
|
|
|
831
830
|
return lib.ddot(ao1.T, ao2, 1, out, 1)
|
|
832
831
|
else:
|
|
833
832
|
assert wv.dtype == numpy.double
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
ao1.ctypes.data_as(ctypes.c_void_p),
|
|
837
|
-
ao2.ctypes.data_as(ctypes.c_void_p),
|
|
838
|
-
wv.ctypes.data_as(ctypes.c_void_p),
|
|
839
|
-
ctypes.c_int(nao), ctypes.c_int(ngrids))
|
|
840
|
-
return out
|
|
833
|
+
ao1 = _scale_ao(ao1, wv.ravel())
|
|
834
|
+
return lib.ddot(ao1.T, ao2, 1, out, 1)
|
|
841
835
|
|
|
842
836
|
def _dot_ao_ao_sparse(ao1, ao2, wv, nbins, screen_index, pair_mask, ao_loc,
|
|
843
837
|
hermi=0, out=None):
|
|
@@ -2633,7 +2627,7 @@ def get_rho(ni, mol, dm, grids, max_memory=2000):
|
|
|
2633
2627
|
class LibXCMixin:
|
|
2634
2628
|
libxc = libxc
|
|
2635
2629
|
|
|
2636
|
-
omega = None # RSH
|
|
2630
|
+
omega = None # RSH parameter
|
|
2637
2631
|
|
|
2638
2632
|
####################
|
|
2639
2633
|
# Overwrite following functions to use custom XC functional
|
|
@@ -2654,6 +2648,10 @@ class LibXCMixin:
|
|
|
2654
2648
|
return self.libxc.eval_xc(xc_code, rho, spin, relativity, deriv,
|
|
2655
2649
|
omega, verbose)
|
|
2656
2650
|
|
|
2651
|
+
def eval_xc1(self, xc_code, rho, spin=0, deriv=1, omega=None):
|
|
2652
|
+
if omega is None: omega = self.omega
|
|
2653
|
+
return self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)
|
|
2654
|
+
|
|
2657
2655
|
def eval_xc_eff(self, xc_code, rho, deriv=1, omega=None, xctype=None,
|
|
2658
2656
|
verbose=None):
|
|
2659
2657
|
r'''Returns the derivative tensor against the density parameters
|
|
@@ -2693,12 +2691,12 @@ class LibXCMixin:
|
|
|
2693
2691
|
else:
|
|
2694
2692
|
spin = 0
|
|
2695
2693
|
|
|
2696
|
-
out = self.
|
|
2694
|
+
out = self.eval_xc1(xc_code, rho, spin, deriv, omega)
|
|
2697
2695
|
evfk = [out[0]]
|
|
2698
2696
|
for order in range(1, deriv+1):
|
|
2699
2697
|
evfk.append(xc_deriv.transform_xc(rho, out, xctype, spin, order))
|
|
2700
2698
|
if deriv < 3:
|
|
2701
|
-
#
|
|
2699
|
+
# Returns at least [e, v, f, k] terms
|
|
2702
2700
|
evfk.extend([None] * (3 - deriv))
|
|
2703
2701
|
return evfk
|
|
2704
2702
|
|
|
@@ -2719,9 +2717,12 @@ class LibXCMixin:
|
|
|
2719
2717
|
'''
|
|
2720
2718
|
omega, alpha, beta = self.rsh_coeff(xc_code)
|
|
2721
2719
|
if self.omega is not None:
|
|
2720
|
+
if omega == 0 and self.omega != 0:
|
|
2721
|
+
raise RuntimeError(f'Not support assigning omega={self.omega}. '
|
|
2722
|
+
f'{xc_code} is not a RSH functional')
|
|
2722
2723
|
omega = self.omega
|
|
2723
2724
|
|
|
2724
|
-
if
|
|
2725
|
+
if omega != 0:
|
|
2725
2726
|
hyb = alpha + beta
|
|
2726
2727
|
else:
|
|
2727
2728
|
hyb = self.hybrid_coeff(xc_code, spin)
|
|
@@ -2852,12 +2853,32 @@ class NumInt(lib.StreamObject, LibXCMixin):
|
|
|
2852
2853
|
pair_mask = ovlp_cond < -numpy.log(self.cutoff)
|
|
2853
2854
|
pair_mask = numpy.asarray(pair_mask, dtype=numpy.uint8)
|
|
2854
2855
|
|
|
2856
|
+
if (mo_occ is not None) and (grids is not None):
|
|
2857
|
+
# eval_rho2 is more efficient unless we have a very large system
|
|
2858
|
+
# for which the pair_mask is significantly sparser than the
|
|
2859
|
+
# ratio of occupied to total molecular orbitals. So we use this ratio
|
|
2860
|
+
# to switch between eval_rho1 and eval_rho2.
|
|
2861
|
+
mo_ao_sparsity = max(0.5 * numpy.sum(mo_occ) / nao, 1e-8)
|
|
2862
|
+
wts = mol.ao_loc_nr()
|
|
2863
|
+
wts = (wts[1:] - wts[:-1]) / wts[-1]
|
|
2864
|
+
rho1_rho2_ratio = numpy.dot(wts, pair_mask).dot(wts) / mo_ao_sparsity
|
|
2865
|
+
else:
|
|
2866
|
+
rho1_rho2_ratio = 0.0
|
|
2867
|
+
|
|
2855
2868
|
def make_rho(idm, ao, sindex, xctype):
|
|
2856
|
-
|
|
2869
|
+
has_screening = sindex is not None and grids is not None
|
|
2870
|
+
has_mo = mo_coeff is not None
|
|
2871
|
+
if xctype == "GGA":
|
|
2872
|
+
# GGA has to do more contractions using rho2 compared to rho1,
|
|
2873
|
+
# so the threshold for switching to rho1 is less strict.
|
|
2874
|
+
is_sparse = rho1_rho2_ratio < 4
|
|
2875
|
+
else:
|
|
2876
|
+
is_sparse = rho1_rho2_ratio < 1
|
|
2877
|
+
if has_screening and (not has_mo or is_sparse):
|
|
2857
2878
|
return self.eval_rho1(mol, ao, dms[idm], sindex, xctype, hermi,
|
|
2858
2879
|
with_lapl, cutoff=self.cutoff,
|
|
2859
2880
|
ao_cutoff=grids.cutoff, pair_mask=pair_mask)
|
|
2860
|
-
elif
|
|
2881
|
+
elif has_mo:
|
|
2861
2882
|
return self.eval_rho2(mol, ao, mo_coeff[idm], mo_occ[idm],
|
|
2862
2883
|
sindex, xctype, with_lapl)
|
|
2863
2884
|
else:
|
pyscf/dft/radi.py
CHANGED
|
@@ -21,10 +21,20 @@
|
|
|
21
21
|
import numpy
|
|
22
22
|
from pyscf.data import radii
|
|
23
23
|
from pyscf.data.elements import charge as elements_proton
|
|
24
|
+
from pyscf import __config__
|
|
24
25
|
|
|
25
26
|
BRAGG_RADII = radii.BRAGG
|
|
26
27
|
COVALENT_RADII = radii.COVALENT
|
|
27
28
|
|
|
29
|
+
# The effective atomic radius in Treutler's original paper (JCP 102, 346) was
|
|
30
|
+
# omitted in PySCF versions 2.6 and earlier. This can cause discrepancies in the
|
|
31
|
+
# numerical grids when compared to other software (See issue #2178 for details).
|
|
32
|
+
# Note that using the atom-specific radius may slightly alter the results of
|
|
33
|
+
# numerical integration, potentially leading to differences of ~ 1e-6 per atom
|
|
34
|
+
# in total energy.
|
|
35
|
+
# Disable this flag to make DFT grids consistent with old PySCF versions.
|
|
36
|
+
ATOM_SPECIFIC_TREUTLER_GRIDS = getattr(__config__, 'ATOM_SPECIFIC_TREUTLER_GRIDS', True)
|
|
37
|
+
|
|
28
38
|
# P.M.W. Gill, B.G. Johnson, J.A. Pople, Chem. Phys. Letters 209 (1993) 506-512
|
|
29
39
|
SG1RADII = numpy.array((
|
|
30
40
|
0,
|
|
@@ -37,14 +47,21 @@ SG1RADII = numpy.array((
|
|
|
37
47
|
def murray(n, *args, **kwargs):
|
|
38
48
|
raise RuntimeError('Not implemented')
|
|
39
49
|
|
|
40
|
-
# Gauss-Chebyshev of the first kind, and the transformed interval [0,\infty)
|
|
41
50
|
def becke(n, charge, *args, **kwargs):
|
|
42
51
|
'''Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033'''
|
|
43
52
|
if charge == 1:
|
|
44
53
|
rm = BRAGG_RADII[charge]
|
|
45
54
|
else:
|
|
46
55
|
rm = BRAGG_RADII[charge] * .5
|
|
47
|
-
|
|
56
|
+
|
|
57
|
+
# Points and weights for Gauss-Chebyshev quadrature points of the second kind
|
|
58
|
+
# The weights are adjusted to integrate a function on the interval [-1, 1] with uniform weighting
|
|
59
|
+
# instead of weighted by sqrt(1 - t^2) = sin(i pi / (n+1)).
|
|
60
|
+
i = numpy.arange(n) + 1
|
|
61
|
+
t = numpy.cos(i * numpy.pi / (n + 1))
|
|
62
|
+
w = numpy.pi / (n + 1) * numpy.sin(i * numpy.pi / (n + 1))
|
|
63
|
+
|
|
64
|
+
# Change of variables to map the domain to [0, inf)
|
|
48
65
|
r = (1+t)/(1-t) * rm
|
|
49
66
|
w *= 2/(1-t)**2 * rm
|
|
50
67
|
return r, w
|
|
@@ -95,15 +112,41 @@ def gauss_chebyshev(n, *args, **kwargs):
|
|
|
95
112
|
dr = fac * numpy.sin(x1)**4 * ln2/(1+xi)
|
|
96
113
|
return r, dr
|
|
97
114
|
|
|
98
|
-
|
|
99
|
-
|
|
115
|
+
# Individually optimized Treutler/Ahlrichs radius parameter.
|
|
116
|
+
# H - Kr are taken from the original paper JCP 102, 346 (1995)
|
|
117
|
+
# Other elements are copied from Psi4 source code
|
|
118
|
+
_treutler_ahlrichs_xi = [1.0, # Ghost
|
|
119
|
+
0.8, 0.9, # 1s
|
|
120
|
+
1.8, 1.4, 1.3, 1.1, 0.9, 0.9, 0.9, 0.9, # 2s2p
|
|
121
|
+
1.4, 1.3, 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, # 3s3p
|
|
122
|
+
1.5, 1.4, # 4s
|
|
123
|
+
1.3, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.1, 1.1, 1.1, # 3d
|
|
124
|
+
1.1, 1.0, 0.9, 0.9, 0.9, 0.9, # 4p
|
|
125
|
+
2.000, 1.700, # 5s
|
|
126
|
+
1.500, 1.500, 1.350, 1.350, 1.250, 1.200, 1.250, 1.300, 1.500, 1.500, # 4d
|
|
127
|
+
1.300, 1.200, 1.200, 1.150, 1.150, 1.150, # 5p
|
|
128
|
+
2.500, 2.200, # 6s
|
|
129
|
+
2.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # La, Ce-Eu
|
|
130
|
+
1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # Gd, Tb-Lu
|
|
131
|
+
1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # 5d
|
|
132
|
+
1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # 6p
|
|
133
|
+
2.500, 2.100, # 7s
|
|
134
|
+
3.685, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500,
|
|
135
|
+
1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500,
|
|
136
|
+
] # noqa: E124
|
|
137
|
+
|
|
138
|
+
def treutler_ahlrichs(n, chg, *args, **kwargs):
|
|
100
139
|
'''
|
|
101
140
|
Treutler-Ahlrichs [JCP 102, 346 (1995); DOI:10.1063/1.469408] (M4) radial grids
|
|
102
141
|
'''
|
|
142
|
+
if ATOM_SPECIFIC_TREUTLER_GRIDS:
|
|
143
|
+
xi = _treutler_ahlrichs_xi[chg]
|
|
144
|
+
else:
|
|
145
|
+
xi = 1.
|
|
103
146
|
r = numpy.empty(n)
|
|
104
147
|
dr = numpy.empty(n)
|
|
105
148
|
step = numpy.pi / (n+1)
|
|
106
|
-
ln2 =
|
|
149
|
+
ln2 = xi / numpy.log(2)
|
|
107
150
|
for i in range(n):
|
|
108
151
|
x = numpy.cos((i+1)*step)
|
|
109
152
|
r [i] = -ln2*(1+x)**.6 * numpy.log((1-x)/2)
|
|
@@ -113,8 +156,6 @@ def treutler_ahlrichs(n, *args, **kwargs):
|
|
|
113
156
|
treutler = treutler_ahlrichs
|
|
114
157
|
|
|
115
158
|
|
|
116
|
-
|
|
117
|
-
|
|
118
159
|
def becke_atomic_radii_adjust(mol, atomic_radii):
|
|
119
160
|
'''Becke atomic radii adjust function'''
|
|
120
161
|
# Becke atomic size adjustment. J. Chem. Phys. 88, 2547
|
pyscf/dft/rks.py
CHANGED
|
@@ -92,36 +92,40 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
|
|
|
92
92
|
logger.debug(ks, 'nelec with nlc grids = %s', n)
|
|
93
93
|
t0 = logger.timer(ks, 'vxc', *t0)
|
|
94
94
|
|
|
95
|
+
incremental_jk = (ks._eri is None and ks.direct_scf and
|
|
96
|
+
getattr(vhf_last, 'vj', None) is not None)
|
|
97
|
+
if incremental_jk:
|
|
98
|
+
_dm = numpy.asarray(dm) - numpy.asarray(dm_last)
|
|
99
|
+
else:
|
|
100
|
+
_dm = dm
|
|
95
101
|
if not ni.libxc.is_hybrid_xc(ks.xc):
|
|
96
102
|
vk = None
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
|
|
100
|
-
vj = ks.get_j(mol, ddm, hermi)
|
|
103
|
+
vj = ks.get_j(mol, _dm, hermi)
|
|
104
|
+
if incremental_jk:
|
|
101
105
|
vj += vhf_last.vj
|
|
102
|
-
else:
|
|
103
|
-
vj = ks.get_j(mol, dm, hermi)
|
|
104
106
|
vxc += vj
|
|
105
107
|
else:
|
|
106
108
|
omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
|
|
107
|
-
if
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
if omega == 0:
|
|
110
|
+
vj, vk = ks.get_jk(mol, _dm, hermi)
|
|
111
|
+
vk *= hyb
|
|
112
|
+
elif alpha == 0: # LR=0, only SR exchange
|
|
113
|
+
vj = ks.get_j(mol, _dm, hermi)
|
|
114
|
+
vk = ks.get_k(mol, _dm, hermi, omega=-omega)
|
|
115
|
+
vk *= hyb
|
|
116
|
+
elif hyb == 0: # SR=0, only LR exchange
|
|
117
|
+
vj = ks.get_j(mol, _dm, hermi)
|
|
118
|
+
vk = ks.get_k(mol, _dm, hermi, omega=omega)
|
|
119
|
+
vk *= alpha
|
|
120
|
+
else: # SR and LR exchange with different ratios
|
|
121
|
+
vj, vk = ks.get_jk(mol, _dm, hermi)
|
|
111
122
|
vk *= hyb
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
123
|
+
vklr = ks.get_k(mol, _dm, hermi, omega=omega)
|
|
124
|
+
vklr *= (alpha - hyb)
|
|
125
|
+
vk += vklr
|
|
126
|
+
if incremental_jk:
|
|
116
127
|
vj += vhf_last.vj
|
|
117
128
|
vk += vhf_last.vk
|
|
118
|
-
else:
|
|
119
|
-
vj, vk = ks.get_jk(mol, dm, hermi)
|
|
120
|
-
vk *= hyb
|
|
121
|
-
if omega != 0:
|
|
122
|
-
vklr = ks.get_k(mol, dm, hermi, omega=omega)
|
|
123
|
-
vklr *= (alpha - hyb)
|
|
124
|
-
vk += vklr
|
|
125
129
|
vxc += vj - vk * .5
|
|
126
130
|
|
|
127
131
|
if ground_state:
|
|
@@ -228,7 +232,7 @@ def energy_elec(ks, dm=None, h1e=None, vhf=None):
|
|
|
228
232
|
ks : an instance of DFT class
|
|
229
233
|
|
|
230
234
|
dm : 2D ndarray
|
|
231
|
-
one-
|
|
235
|
+
one-particle density matrix
|
|
232
236
|
h1e : 2D ndarray
|
|
233
237
|
Core hamiltonian
|
|
234
238
|
|
|
@@ -322,6 +326,9 @@ class KohnShamDFT:
|
|
|
322
326
|
|
|
323
327
|
_keys = {'xc', 'nlc', 'grids', 'disp', 'nlcgrids', 'small_rho_cutoff'}
|
|
324
328
|
|
|
329
|
+
# Use rho to filter grids
|
|
330
|
+
small_rho_cutoff = getattr(__config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
|
|
331
|
+
|
|
325
332
|
def __init__(self, xc='LDA,VWN'):
|
|
326
333
|
# By default, self.nlc = '' and self.disp = None
|
|
327
334
|
self.xc = xc
|
|
@@ -333,9 +340,6 @@ class KohnShamDFT:
|
|
|
333
340
|
self.nlcgrids = gen_grid.Grids(self.mol)
|
|
334
341
|
self.nlcgrids.level = getattr(
|
|
335
342
|
__config__, 'dft_rks_RKS_nlcgrids_level', self.nlcgrids.level)
|
|
336
|
-
# Use rho to filter grids
|
|
337
|
-
self.small_rho_cutoff = getattr(
|
|
338
|
-
__config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
|
|
339
343
|
##################################################
|
|
340
344
|
# don't modify the following attributes, they are not input options
|
|
341
345
|
self._numint = numint.NumInt()
|
pyscf/dft/roks.py
CHANGED
|
@@ -30,12 +30,18 @@ from pyscf.dft import uks
|
|
|
30
30
|
|
|
31
31
|
@lib.with_doc(uks.get_veff.__doc__)
|
|
32
32
|
def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
|
|
33
|
-
if
|
|
33
|
+
if dm is None:
|
|
34
|
+
dm = ks.make_rdm1()
|
|
35
|
+
elif getattr(dm, 'mo_coeff', None) is not None:
|
|
34
36
|
mo_coeff = dm.mo_coeff
|
|
35
37
|
mo_occ_a = (dm.mo_occ > 0).astype(numpy.double)
|
|
36
38
|
mo_occ_b = (dm.mo_occ ==2).astype(numpy.double)
|
|
39
|
+
if dm.ndim == 2: # RHF DM
|
|
40
|
+
dm = numpy.repeat(dm[None]*.5, 2, axis=0)
|
|
37
41
|
dm = lib.tag_array(dm, mo_coeff=(mo_coeff,mo_coeff),
|
|
38
42
|
mo_occ=(mo_occ_a,mo_occ_b))
|
|
43
|
+
elif dm.ndim == 2: # RHF DM
|
|
44
|
+
dm = numpy.repeat(dm[None]*.5, 2, axis=0)
|
|
39
45
|
return uks.get_veff(ks, mol, dm, dm_last, vhf_last, hermi)
|
|
40
46
|
|
|
41
47
|
|
pyscf/dft/uks.py
CHANGED
|
@@ -36,7 +36,8 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
|
|
|
36
36
|
if not isinstance(dm, numpy.ndarray):
|
|
37
37
|
dm = numpy.asarray(dm)
|
|
38
38
|
if dm.ndim == 2: # RHF DM
|
|
39
|
-
dm
|
|
39
|
+
logger.warn(ks, 'Incompatible dm dimension. Treat dm as RHF density matrix.')
|
|
40
|
+
dm = numpy.repeat(dm[None]*.5, 2, axis=0)
|
|
40
41
|
ks.initialize_grids(mol, dm)
|
|
41
42
|
|
|
42
43
|
t0 = (logger.process_clock(), logger.perf_counter())
|
|
@@ -63,37 +64,44 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
|
|
|
63
64
|
logger.debug(ks, 'nelec with nlc grids = %s', n)
|
|
64
65
|
t0 = logger.timer(ks, 'vxc', *t0)
|
|
65
66
|
|
|
67
|
+
incremental_jk = (ks._eri is None and ks.direct_scf and
|
|
68
|
+
getattr(vhf_last, 'vj', None) is not None)
|
|
69
|
+
if incremental_jk:
|
|
70
|
+
dm_last = numpy.asarray(dm_last)
|
|
71
|
+
dm = numpy.asarray(dm)
|
|
72
|
+
assert dm_last.ndim == 0 or dm_last.ndim == dm.ndim
|
|
73
|
+
_dm = dm - dm_last
|
|
74
|
+
else:
|
|
75
|
+
_dm = dm
|
|
66
76
|
if not ni.libxc.is_hybrid_xc(ks.xc):
|
|
67
77
|
vk = None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
|
|
71
|
-
vj = ks.get_j(mol, ddm[0]+ddm[1], hermi)
|
|
78
|
+
vj = ks.get_j(mol, _dm[0]+_dm[1], hermi)
|
|
79
|
+
if incremental_jk:
|
|
72
80
|
vj += vhf_last.vj
|
|
73
|
-
else:
|
|
74
|
-
vj = ks.get_j(mol, dm[0]+dm[1], hermi)
|
|
75
81
|
vxc += vj
|
|
76
82
|
else:
|
|
77
83
|
omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
|
|
78
|
-
if
|
|
79
|
-
|
|
80
|
-
ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
|
|
81
|
-
vj, vk = ks.get_jk(mol, ddm, hermi)
|
|
84
|
+
if omega == 0:
|
|
85
|
+
vj, vk = ks.get_jk(mol, _dm, hermi)
|
|
82
86
|
vk *= hyb
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
elif alpha == 0: # LR=0, only SR exchange
|
|
88
|
+
vj = ks.get_j(mol, _dm, hermi)
|
|
89
|
+
vk = ks.get_k(mol, _dm, hermi, omega=-omega)
|
|
90
|
+
vk *= hyb
|
|
91
|
+
elif hyb == 0: # SR=0, only LR exchange
|
|
92
|
+
vj = ks.get_j(mol, _dm, hermi)
|
|
93
|
+
vk = ks.get_k(mol, _dm, hermi, omega=omega)
|
|
94
|
+
vk *= alpha
|
|
95
|
+
else: # SR and LR exchange with different ratios
|
|
96
|
+
vj, vk = ks.get_jk(mol, _dm, hermi)
|
|
92
97
|
vk *= hyb
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
vklr = ks.get_k(mol, _dm, hermi, omega=omega)
|
|
99
|
+
vklr *= (alpha - hyb)
|
|
100
|
+
vk += vklr
|
|
101
|
+
vj = vj[0] + vj[1]
|
|
102
|
+
if incremental_jk:
|
|
103
|
+
vj += vhf_last.vj
|
|
104
|
+
vk += vhf_last.vk
|
|
97
105
|
vxc += vj - vk
|
|
98
106
|
|
|
99
107
|
if ground_state:
|
|
@@ -178,7 +186,8 @@ class UKS(rks.KohnShamDFT, uhf.UHF):
|
|
|
178
186
|
ground_state = (isinstance(dm, numpy.ndarray)
|
|
179
187
|
and dm.ndim == 3 and dm.shape[0] == 2)
|
|
180
188
|
if ground_state:
|
|
181
|
-
|
|
189
|
+
dm = numpy.asarray(dm[0] + dm[1])
|
|
190
|
+
super().initialize_grids(mol, dm)
|
|
182
191
|
else:
|
|
183
192
|
super().initialize_grids(mol)
|
|
184
193
|
return self
|
pyscf/dft/xc_deriv.py
CHANGED
|
@@ -455,7 +455,7 @@ def _stack_fggg(fggg, axis=0, rho=None):
|
|
|
455
455
|
@lru_cache(100)
|
|
456
456
|
def _product_uniq_indices(nvars, order):
|
|
457
457
|
'''
|
|
458
|
-
Indexing the symmetry unique elements in
|
|
458
|
+
Indexing the symmetry unique elements in cartesian product
|
|
459
459
|
'''
|
|
460
460
|
# n = 0
|
|
461
461
|
# for i range(nvars):
|
pyscf/dft/xcfun.py
CHANGED
|
@@ -36,10 +36,61 @@ _itrf = lib.load_library('libxcfun_itrf')
|
|
|
36
36
|
_itrf.xcfun_splash.restype = ctypes.c_char_p
|
|
37
37
|
_itrf.xcfun_version.restype = ctypes.c_char_p
|
|
38
38
|
_itrf.XCFUN_eval_xc.restype = ctypes.c_int
|
|
39
|
+
_itrf.xcfun_enumerate_parameters.restype = ctypes.c_char_p
|
|
40
|
+
_itrf.XCFUN_xc_type.restype = ctypes.c_int
|
|
41
|
+
_itrf.xcfun_describe_short.restype = ctypes.c_char_p
|
|
42
|
+
_itrf.xcfun_describe_short.argtype = [ctypes.c_char_p]
|
|
43
|
+
_itrf.xcfun_describe_long.restype = ctypes.c_char_p
|
|
44
|
+
_itrf.xcfun_describe_long.argtype = [ctypes.c_char_p]
|
|
39
45
|
|
|
40
46
|
__version__ = _itrf.xcfun_version().decode("UTF-8")
|
|
41
47
|
__reference__ = _itrf.xcfun_splash().decode("UTF-8")
|
|
42
48
|
|
|
49
|
+
def print_XC_CODES():
|
|
50
|
+
'''
|
|
51
|
+
Dump the built-in xcfun XC_CODES in a readable format.
|
|
52
|
+
'''
|
|
53
|
+
lda_ids = []
|
|
54
|
+
gga_ids = []
|
|
55
|
+
mgga_ids = []
|
|
56
|
+
xc_codes = {}
|
|
57
|
+
|
|
58
|
+
print('XC = XC_CODES = {')
|
|
59
|
+
for i in range(78):
|
|
60
|
+
name = _itrf.xcfun_enumerate_parameters(ctypes.c_int(i))
|
|
61
|
+
sdescr = _itrf.xcfun_describe_short(name)
|
|
62
|
+
#ldescr = _itrf.xcfun_describe_long(ctypes.c_int(i))
|
|
63
|
+
if sdescr is not None:
|
|
64
|
+
name = name.decode('UTF-8')
|
|
65
|
+
key = f"'{name}'"
|
|
66
|
+
sdescr = sdescr.decode('UTF-8')
|
|
67
|
+
print(f'{key:<16s}: {i:2d}, #{sdescr}')
|
|
68
|
+
xc_codes[name] = i
|
|
69
|
+
|
|
70
|
+
fntype = _itrf.XCFUN_xc_type(ctypes.c_int(i))
|
|
71
|
+
if fntype == 0:
|
|
72
|
+
lda_ids.append(i)
|
|
73
|
+
elif fntype == 1:
|
|
74
|
+
gga_ids.append(i)
|
|
75
|
+
elif fntype == 2:
|
|
76
|
+
mgga_ids.append(i)
|
|
77
|
+
|
|
78
|
+
alias = {
|
|
79
|
+
'SLATER': 'SLATERX',
|
|
80
|
+
'LDA' : 'SLATERX',
|
|
81
|
+
'VWN' : 'VWN5C',
|
|
82
|
+
'VWN5' : 'VWN5C',
|
|
83
|
+
'B88' : 'BECKEX',
|
|
84
|
+
'LYP' : 'LYPC',
|
|
85
|
+
}
|
|
86
|
+
for k, v in alias.items():
|
|
87
|
+
key = f"'{k}'"
|
|
88
|
+
print(f'{key:<16s}: {xc_codes[v]:2d}, # {v}')
|
|
89
|
+
print('}')
|
|
90
|
+
print('LDA_IDS = %s' % lda_ids)
|
|
91
|
+
print('GGA_IDS = %s' % gga_ids)
|
|
92
|
+
print('MGGA_IDS = %s' % mgga_ids)
|
|
93
|
+
|
|
43
94
|
XC = XC_CODES = {
|
|
44
95
|
'SLATERX' : 0, #Slater LDA exchange
|
|
45
96
|
'PW86X' : 1, #PW86 exchange
|
|
@@ -449,7 +500,7 @@ def parse_xc(description):
|
|
|
449
500
|
fac, key = token.split('*')
|
|
450
501
|
if fac[0].isalpha():
|
|
451
502
|
fac, key = key, fac
|
|
452
|
-
fac = sign * float(fac.replace('
|
|
503
|
+
fac = sign * float(fac.replace('E_', 'E-'))
|
|
453
504
|
else:
|
|
454
505
|
fac, key = sign, token
|
|
455
506
|
|
|
@@ -833,7 +884,7 @@ XC_D0000003 = 119
|
|
|
833
884
|
|
|
834
885
|
def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):
|
|
835
886
|
r'''Interface to call xcfun library to evaluate XC functional, potential
|
|
836
|
-
and functional derivatives. Return
|
|
887
|
+
and functional derivatives. Return derivatives following libxc convention.
|
|
837
888
|
|
|
838
889
|
See also :func:`pyscf.dft.libxc.eval_xc`
|
|
839
890
|
'''
|
pyscf/eph/eph_fd.py
CHANGED
|
@@ -101,7 +101,7 @@ def kernel(mf, disp=1e-4, mo_rep=False, cutoff_frequency=CUTOFF_FREQUENCY, keep_
|
|
|
101
101
|
omega, vec = get_mode(mf, cutoff_frequency, keep_imag_frequency)
|
|
102
102
|
mass = mol.atom_mass_list() * MP_ME
|
|
103
103
|
vec = rhf_eph._freq_mass_weighted_vec(vec, omega, mass)
|
|
104
|
-
mols_a, mols_b = gen_moles(mol, disp/2.0) # generate a bunch of molecules with disp/2 on each
|
|
104
|
+
mols_a, mols_b = gen_moles(mol, disp/2.0) # generate a bunch of molecules with disp/2 on each cartesian coord
|
|
105
105
|
mfset = run_mfs(mf, mols_a, mols_b) # run mean field calculations on all these molecules
|
|
106
106
|
vmat = get_vmat(mf, mfset, disp) # extracting <p|dV|q>/dR
|
|
107
107
|
if mo_rep:
|
pyscf/eph/rhf.py
CHANGED
|
@@ -23,7 +23,7 @@ Analytical electron-phonon matrix for restricted hartree fock
|
|
|
23
23
|
import numpy as np
|
|
24
24
|
import scipy.linalg
|
|
25
25
|
from pyscf.hessian import rhf
|
|
26
|
-
from pyscf.lib import logger
|
|
26
|
+
from pyscf.lib import logger
|
|
27
27
|
from pyscf.scf._response_functions import _gen_rhf_response
|
|
28
28
|
from pyscf import __config__
|
|
29
29
|
from pyscf.data.nist import HARTREE2WAVENUMBER, MP_ME
|
|
@@ -37,16 +37,16 @@ def kernel(ephobj, mo_energy=None, mo_coeff=None, mo_occ=None, mo_rep=False):
|
|
|
37
37
|
if mo_coeff is None: mo_coeff = ephobj.base.mo_coeff
|
|
38
38
|
if mo_occ is None: mo_occ = ephobj.base.mo_occ
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
assert ephobj.chkfile is not None, 'chkfile is required to save first order orbitals'
|
|
40
|
+
h1ao = ephobj.make_h1(mo_coeff, mo_occ)
|
|
41
|
+
mo1, mo_e1 = ephobj.solve_mo1(mo_energy, mo_coeff, mo_occ, h1ao)
|
|
43
42
|
|
|
44
|
-
de = ephobj.hess_elec(mo_energy, mo_coeff, mo_occ
|
|
43
|
+
de = ephobj.hess_elec(mo_energy, mo_coeff, mo_occ,
|
|
44
|
+
mo1=mo1, mo_e1=mo_e1, h1ao=h1ao)
|
|
45
45
|
ephobj.de = de + ephobj.hess_nuc(ephobj.mol)
|
|
46
46
|
|
|
47
47
|
omega, vec = ephobj.get_mode(ephobj.mol, ephobj.de)
|
|
48
48
|
ephobj.omega, ephobj.vec = omega, vec
|
|
49
|
-
ephobj.eph = ephobj.get_eph(
|
|
49
|
+
ephobj.eph = ephobj.get_eph(mo1, omega, vec, mo_rep)
|
|
50
50
|
return ephobj.eph, ephobj.omega
|
|
51
51
|
|
|
52
52
|
def solve_hmat(mol, hmat, cutoff_frequency=CUTOFF_FREQUENCY,
|
|
@@ -143,10 +143,6 @@ def _freq_mass_weighted_vec(vec, omega, mass):
|
|
|
143
143
|
return vec
|
|
144
144
|
|
|
145
145
|
def get_eph(ephobj, mo1, omega, vec, mo_rep):
|
|
146
|
-
if isinstance(mo1, str):
|
|
147
|
-
mo1 = chkfile.load(mo1, 'scf_mo1')
|
|
148
|
-
mo1 = {int(k): mo1[k] for k in mo1}
|
|
149
|
-
|
|
150
146
|
mol = ephobj.mol
|
|
151
147
|
mf = ephobj.base
|
|
152
148
|
vnuc_deriv = ephobj.vnuc_generator(mol)
|
|
@@ -209,29 +205,3 @@ class EPH(rhf.Hessian):
|
|
|
209
205
|
get_eph = get_eph
|
|
210
206
|
vnuc_generator = vnuc_generator
|
|
211
207
|
kernel = kernel
|
|
212
|
-
|
|
213
|
-
if __name__ == '__main__':
|
|
214
|
-
from pyscf import gto, scf
|
|
215
|
-
|
|
216
|
-
mol = gto.M()
|
|
217
|
-
mol.atom = [['O', [0.000000000000, -0.000000000775, 0.923671924285]],
|
|
218
|
-
['H', [-0.000000000000, -1.432564848017, 2.125164039823]],
|
|
219
|
-
['H', [0.000000000000, 1.432564848792, 2.125164035930]]]
|
|
220
|
-
mol.unit = 'Bohr'
|
|
221
|
-
mol.basis = 'sto3g'
|
|
222
|
-
mol.verbose=4
|
|
223
|
-
mol.build() # this is a pre-computed relaxed geometry
|
|
224
|
-
|
|
225
|
-
mf = scf.RHF(mol)
|
|
226
|
-
mf.conv_tol = 1e-16
|
|
227
|
-
mf.conv_tol_grad = 1e-10
|
|
228
|
-
mf.kernel()
|
|
229
|
-
|
|
230
|
-
myeph = EPH(mf)
|
|
231
|
-
|
|
232
|
-
grad = mf.nuc_grad_method().kernel()
|
|
233
|
-
print("Force on the atoms/au:")
|
|
234
|
-
print(grad)
|
|
235
|
-
|
|
236
|
-
eph, omega = myeph.kernel(mo_rep=True)
|
|
237
|
-
print(np.amax(eph))
|
pyscf/eph/rks.py
CHANGED
|
@@ -100,10 +100,6 @@ def _get_vxc_deriv1(hessobj, mo_coeff, mo_occ, max_memory):
|
|
|
100
100
|
return vmat
|
|
101
101
|
|
|
102
102
|
def get_eph(ephobj, mo1, omega, vec, mo_rep):
|
|
103
|
-
if isinstance(mo1, str):
|
|
104
|
-
mo1 = lib.chkfile.load(mo1, 'scf_mo1')
|
|
105
|
-
mo1 = {int(k): mo1[k] for k in mo1}
|
|
106
|
-
|
|
107
103
|
mol = ephobj.mol
|
|
108
104
|
mf = ephobj.base
|
|
109
105
|
ni = mf._numint
|
pyscf/eph/uhf.py
CHANGED
|
@@ -54,18 +54,12 @@ def uhf_deriv_generator(mf, mo_coeff, mo_occ):
|
|
|
54
54
|
return fx
|
|
55
55
|
|
|
56
56
|
def get_eph(ephobj, mo1, omega, vec, mo_rep):
|
|
57
|
-
if isinstance(mo1, str):
|
|
58
|
-
mo1 = lib.chkfile.load(mo1, 'scf_mo1')
|
|
59
|
-
mo1a = mo1['0']
|
|
60
|
-
mo1b = mo1['1']
|
|
61
|
-
mo1a = {int(k): mo1a[k] for k in mo1a}
|
|
62
|
-
mo1b = {int(k): mo1b[k] for k in mo1b}
|
|
63
|
-
|
|
64
57
|
mol = ephobj.mol
|
|
65
58
|
mf = ephobj.base
|
|
66
59
|
vnuc_deriv = ephobj.vnuc_generator(mol)
|
|
67
60
|
aoslices = mol.aoslice_by_atom()
|
|
68
61
|
|
|
62
|
+
mo1a, mo1b = mo1
|
|
69
63
|
mo_coeff, mo_occ = mf.mo_coeff, mf.mo_occ
|
|
70
64
|
vind = uhf_deriv_generator(mf, mf.mo_coeff, mf.mo_occ)
|
|
71
65
|
nao, nmo = mo_coeff[0].shape
|
pyscf/eph/uks.py
CHANGED
|
@@ -124,13 +124,6 @@ def _get_vxc_deriv1(hessobj, mo_coeff, mo_occ, max_memory):
|
|
|
124
124
|
return vmata, vmatb
|
|
125
125
|
|
|
126
126
|
def get_eph(ephobj, mo1, omega, vec, mo_rep):
|
|
127
|
-
if isinstance(mo1, str):
|
|
128
|
-
mo1 = lib.chkfile.load(mo1, 'scf_mo1')
|
|
129
|
-
mo1a = mo1['0']
|
|
130
|
-
mo1b = mo1['1']
|
|
131
|
-
mo1a = {int(k): mo1a[k] for k in mo1a}
|
|
132
|
-
mo1b = {int(k): mo1b[k] for k in mo1b}
|
|
133
|
-
|
|
134
127
|
mol = ephobj.mol
|
|
135
128
|
mf = ephobj.base
|
|
136
129
|
ni = mf._numint
|
|
@@ -141,6 +134,7 @@ def get_eph(ephobj, mo1, omega, vec, mo_rep):
|
|
|
141
134
|
vnuc_deriv = ephobj.vnuc_generator(mol)
|
|
142
135
|
aoslices = mol.aoslice_by_atom()
|
|
143
136
|
|
|
137
|
+
mo1a, mo1b = mo1
|
|
144
138
|
mo_coeff, mo_occ = mf.mo_coeff, mf.mo_occ
|
|
145
139
|
vind = uhf_deriv_generator(mf, mf.mo_coeff, mf.mo_occ)
|
|
146
140
|
mem_now = lib.current_memory()[0]
|