pyscf 2.7.0__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 +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 +3 -3
- pyscf/ao2mo/r_outcore.py +2 -2
- pyscf/cc/ccsd.py +13 -5
- pyscf/cc/ccsd_rdm.py +6 -1
- pyscf/cc/gccsd.py +2 -2
- pyscf/cc/uccsd.py +6 -6
- pyscf/cc/uccsd_rdm.py +2 -2
- pyscf/df/addons.py +2 -2
- pyscf/df/autoaux.py +4 -0
- pyscf/df/df_jk.py +27 -25
- pyscf/df/grad/rhf.py +31 -1
- pyscf/df/incore.py +1 -1
- pyscf/df/outcore.py +6 -6
- pyscf/dft/gks.py +25 -21
- pyscf/dft/libxc.py +30 -10
- pyscf/dft/numint.py +33 -16
- pyscf/dft/radi.py +9 -2
- pyscf/dft/rks.py +28 -24
- pyscf/dft/roks.py +7 -1
- pyscf/dft/uks.py +34 -25
- pyscf/fci/direct_spin1.py +0 -1
- pyscf/grad/ccsd.py +3 -7
- pyscf/grad/ccsd_slow.py +2 -3
- pyscf/grad/mp2.py +12 -3
- pyscf/grad/uccsd.py +3 -7
- pyscf/grad/ump2.py +2 -4
- pyscf/gto/basis/__init__.py +10 -4
- 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_nwchem.py +25 -10
- pyscf/gto/eval_gto.py +1 -1
- pyscf/gto/ft_ao.py +6 -6
- pyscf/gto/mole.py +25 -28
- pyscf/gto/moleintor.py +1 -1
- pyscf/gw/rpa.py +133 -244
- pyscf/gw/urpa.py +79 -130
- pyscf/lib/CMakeLists.txt +6 -2
- pyscf/lib/config.h +0 -1
- pyscf/lib/config.h.in +0 -1
- 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/libxc_itrf.c +6 -6
- pyscf/lib/dft/nr_numint_sparse.c +3 -3
- pyscf/lib/diis.py +1 -1
- pyscf/lib/exceptions.py +3 -0
- 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 +5 -6
- pyscf/lib/logger.py +2 -1
- pyscf/lib/mcscf/fci_contract.c +8 -1
- pyscf/lib/misc.py +16 -8
- 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 +194 -10
- pyscf/lib/pbc/nr_direct.c +2 -7
- pyscf/lib/vhf/fblas.h +3 -0
- pyscf/lib/vhf/nr_sr_vhf.c +8 -12
- pyscf/lib/vhf/rkb_screen.c +139 -0
- pyscf/mcscf/casci.py +5 -1
- pyscf/mcscf/chkfile.py +2 -3
- pyscf/mcscf/mc1step.py +10 -6
- pyscf/mcscf/umc1step.py +5 -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 +19 -5
- pyscf/mp/ump2.py +23 -18
- pyscf/pbc/df/aft.py +6 -7
- pyscf/pbc/df/df.py +1 -1
- pyscf/pbc/df/df_jk.py +4 -1
- pyscf/pbc/df/fft.py +3 -3
- pyscf/pbc/df/fft_jk.py +7 -7
- pyscf/pbc/df/incore.py +1 -1
- pyscf/pbc/df/mdf_jk.py +2 -1
- pyscf/pbc/df/outcore.py +10 -10
- pyscf/pbc/df/rsdf_builder.py +2 -2
- pyscf/pbc/df/rsdf_helper.py +5 -5
- pyscf/pbc/df/rsdf_jk.py +2 -1
- 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 +17 -7
- pyscf/pbc/dft/multigrid/multigrid_pair.py +6 -1
- pyscf/pbc/dft/numint.py +26 -10
- pyscf/pbc/dft/rks.py +16 -24
- pyscf/pbc/dft/uks.py +21 -4
- pyscf/pbc/gto/_pbcintor.py +1 -0
- pyscf/pbc/gto/cell.py +157 -4
- pyscf/pbc/gto/eval_gto.py +1 -1
- pyscf/pbc/gto/neighborlist.py +4 -1
- pyscf/pbc/scf/_response_functions.py +141 -34
- pyscf/pbc/scf/hf.py +0 -8
- pyscf/pbc/scf/khf.py +32 -3
- pyscf/pbc/scf/khf_ksymm.py +15 -1
- pyscf/pbc/scf/kuhf.py +1 -1
- pyscf/pbc/scf/kuhf_ksymm.py +1 -1
- pyscf/pbc/scf/rsjk.py +1 -1
- pyscf/pbc/scf/stability.py +26 -14
- pyscf/pbc/tdscf/krhf.py +58 -56
- pyscf/pbc/tdscf/kuhf.py +273 -78
- pyscf/pbc/tdscf/rhf.py +17 -12
- pyscf/pbc/tdscf/uhf.py +46 -35
- pyscf/pbc/tools/k2gamma.py +13 -2
- pyscf/pbc/tools/lattice.py +3 -3
- pyscf/pbc/tools/pbc.py +48 -35
- pyscf/scf/_response_functions.py +85 -44
- pyscf/scf/_vhf.py +1 -0
- pyscf/scf/dhf.py +82 -28
- pyscf/scf/dispersion.py +1 -1
- pyscf/scf/hf.py +19 -3
- pyscf/scf/uhf.py +9 -3
- pyscf/solvent/__init__.py +2 -2
- pyscf/solvent/_attach_solvent.py +2 -0
- pyscf/solvent/cosmors.py +366 -0
- pyscf/solvent/pcm.py +4 -4
- pyscf/solvent/smd.py +5 -3
- pyscf/soscf/ciah.py +2 -10
- pyscf/soscf/newton_ah.py +4 -1
- pyscf/symm/geom.py +1 -5
- pyscf/tdscf/_lr_eig.py +554 -57
- pyscf/tdscf/dhf.py +58 -65
- pyscf/tdscf/ghf.py +63 -71
- pyscf/tdscf/gks.py +12 -10
- pyscf/tdscf/rhf.py +68 -68
- pyscf/tdscf/rks.py +12 -9
- pyscf/tdscf/uhf.py +59 -58
- pyscf/tdscf/uks.py +15 -13
- pyscf/tools/qcschema.py +265 -0
- pyscf/x2c/tdscf.py +37 -37
- {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/METADATA +29 -26
- {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/NOTICE +11 -0
- {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/RECORD +203 -173
- {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/WHEEL +1 -1
- 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.7.0.dist-info → pyscf-2.8.0.dist-info}/LICENSE +0 -0
- {pyscf-2.7.0.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):
|
|
@@ -2723,9 +2717,12 @@ class LibXCMixin:
|
|
|
2723
2717
|
'''
|
|
2724
2718
|
omega, alpha, beta = self.rsh_coeff(xc_code)
|
|
2725
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')
|
|
2726
2723
|
omega = self.omega
|
|
2727
2724
|
|
|
2728
|
-
if
|
|
2725
|
+
if omega != 0:
|
|
2729
2726
|
hyb = alpha + beta
|
|
2730
2727
|
else:
|
|
2731
2728
|
hyb = self.hybrid_coeff(xc_code, spin)
|
|
@@ -2856,12 +2853,32 @@ class NumInt(lib.StreamObject, LibXCMixin):
|
|
|
2856
2853
|
pair_mask = ovlp_cond < -numpy.log(self.cutoff)
|
|
2857
2854
|
pair_mask = numpy.asarray(pair_mask, dtype=numpy.uint8)
|
|
2858
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
|
+
|
|
2859
2868
|
def make_rho(idm, ao, sindex, xctype):
|
|
2860
|
-
|
|
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):
|
|
2861
2878
|
return self.eval_rho1(mol, ao, dms[idm], sindex, xctype, hermi,
|
|
2862
2879
|
with_lapl, cutoff=self.cutoff,
|
|
2863
2880
|
ao_cutoff=grids.cutoff, pair_mask=pair_mask)
|
|
2864
|
-
elif
|
|
2881
|
+
elif has_mo:
|
|
2865
2882
|
return self.eval_rho2(mol, ao, mo_coeff[idm], mo_occ[idm],
|
|
2866
2883
|
sindex, xctype, with_lapl)
|
|
2867
2884
|
else:
|
pyscf/dft/radi.py
CHANGED
|
@@ -47,14 +47,21 @@ SG1RADII = numpy.array((
|
|
|
47
47
|
def murray(n, *args, **kwargs):
|
|
48
48
|
raise RuntimeError('Not implemented')
|
|
49
49
|
|
|
50
|
-
# Gauss-Chebyshev of the first kind, and the transformed interval [0,\infty)
|
|
51
50
|
def becke(n, charge, *args, **kwargs):
|
|
52
51
|
'''Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033'''
|
|
53
52
|
if charge == 1:
|
|
54
53
|
rm = BRAGG_RADII[charge]
|
|
55
54
|
else:
|
|
56
55
|
rm = BRAGG_RADII[charge] * .5
|
|
57
|
-
|
|
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)
|
|
58
65
|
r = (1+t)/(1-t) * rm
|
|
59
66
|
w *= 2/(1-t)**2 * rm
|
|
60
67
|
return r, w
|
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:
|
|
@@ -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/fci/direct_spin1.py
CHANGED
pyscf/grad/ccsd.py
CHANGED
|
@@ -33,7 +33,7 @@ from pyscf.cc import ccsd_rdm
|
|
|
33
33
|
from pyscf.ao2mo import _ao2mo
|
|
34
34
|
from pyscf.scf import cphf
|
|
35
35
|
from pyscf.grad import rhf as rhf_grad
|
|
36
|
-
from pyscf.grad.mp2 import _shell_prange, _index_frozen_active
|
|
36
|
+
from pyscf.grad.mp2 import _shell_prange, _index_frozen_active, has_frozen_orbitals
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
#
|
|
@@ -71,9 +71,7 @@ def grad_elec(cc_grad, t1=None, t2=None, l1=None, l2=None, eris=None, atmlst=Non
|
|
|
71
71
|
mo_energy = mycc._scf.mo_energy
|
|
72
72
|
nao, nmo = mo_coeff.shape
|
|
73
73
|
nocc = numpy.count_nonzero(mycc.mo_occ > 0)
|
|
74
|
-
with_frozen =
|
|
75
|
-
or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
|
|
76
|
-
or (len(mycc.frozen) == 0))
|
|
74
|
+
with_frozen = has_frozen_orbitals(mycc)
|
|
77
75
|
OA, VA, OF, VF = _index_frozen_active(mycc.get_frozen_mask(), mycc.mo_occ)
|
|
78
76
|
|
|
79
77
|
log.debug('symmetrized rdm2 and MO->AO transformation')
|
|
@@ -267,9 +265,7 @@ class CCSD_GradScanner(lib.GradScanner):
|
|
|
267
265
|
def _response_dm1(mycc, Xvo, eris=None):
|
|
268
266
|
nvir, nocc = Xvo.shape
|
|
269
267
|
nmo = nocc + nvir
|
|
270
|
-
with_frozen =
|
|
271
|
-
or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
|
|
272
|
-
or (len(mycc.frozen) == 0))
|
|
268
|
+
with_frozen = has_frozen_orbitals(mycc)
|
|
273
269
|
if eris is None or with_frozen:
|
|
274
270
|
mo_energy = mycc._scf.mo_energy
|
|
275
271
|
mo_occ = mycc.mo_occ
|
pyscf/grad/ccsd_slow.py
CHANGED
|
@@ -29,6 +29,7 @@ from pyscf import lib
|
|
|
29
29
|
from pyscf import ao2mo
|
|
30
30
|
from pyscf.cc import ccsd_rdm
|
|
31
31
|
from pyscf.grad import ccsd as ccsd_grad
|
|
32
|
+
from pyscf.grad.mp2 import has_frozen_orbitals
|
|
32
33
|
|
|
33
34
|
def kernel(cc, t1, t2, l1, l2, eris=None):
|
|
34
35
|
if eris is None:
|
|
@@ -40,9 +41,7 @@ def kernel(cc, t1, t2, l1, l2, eris=None):
|
|
|
40
41
|
nocc = numpy.count_nonzero(cc.mo_occ > 0)
|
|
41
42
|
mo_e_o = mo_energy[:nocc]
|
|
42
43
|
mo_e_v = mo_energy[nocc:]
|
|
43
|
-
with_frozen =
|
|
44
|
-
or (isinstance(cc.frozen, (int, numpy.integer)) and cc.frozen == 0)
|
|
45
|
-
or (len(cc.frozen) == 0))
|
|
44
|
+
with_frozen = has_frozen_orbitals(cc)
|
|
46
45
|
|
|
47
46
|
d1 = _gamma1_intermediates(cc, t1, t2, l1, l2)
|
|
48
47
|
d2 = _gamma2_intermediates(cc, t1, t2, l1, l2)
|
pyscf/grad/mp2.py
CHANGED
|
@@ -46,9 +46,7 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
|
|
|
46
46
|
# nocc, nvir should be updated to include the frozen orbitals when proceeding
|
|
47
47
|
# the 1-particle quantities later.
|
|
48
48
|
mol = mp_grad.mol
|
|
49
|
-
with_frozen =
|
|
50
|
-
or (isinstance(mp.frozen, (int, numpy.integer)) and mp.frozen == 0)
|
|
51
|
-
or (len(mp.frozen) == 0))
|
|
49
|
+
with_frozen = has_frozen_orbitals(mp)
|
|
52
50
|
OA, VA, OF, VF = _index_frozen_active(mp.get_frozen_mask(), mp.mo_occ)
|
|
53
51
|
orbo = mp.mo_coeff[:,OA]
|
|
54
52
|
orbv = mp.mo_coeff[:,VA]
|
|
@@ -188,6 +186,17 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
|
|
|
188
186
|
log.timer('%s gradients' % mp.__class__.__name__, *time0)
|
|
189
187
|
return de
|
|
190
188
|
|
|
189
|
+
def has_frozen_orbitals(post_hf):
|
|
190
|
+
'''Test if frozen orbitlas are enabled in a post-HF object.'''
|
|
191
|
+
with_frozen = False
|
|
192
|
+
if getattr(post_hf, 'frozen', None) is not None:
|
|
193
|
+
if isinstance(post_hf.frozen, (int, numpy.integer)):
|
|
194
|
+
with_frozen = post_hf.frozen != 0
|
|
195
|
+
elif hasattr(post_hf.frozen, '__len__'):
|
|
196
|
+
with_frozen = len(post_hf.frozen) != 0
|
|
197
|
+
else:
|
|
198
|
+
raise TypeError(f'Unsupported .frozen attribute {post_hf.frozen}')
|
|
199
|
+
return with_frozen
|
|
191
200
|
|
|
192
201
|
def as_scanner(grad_mp):
|
|
193
202
|
'''Generating a nuclear gradients scanner/solver (for geometry optimizer).
|
pyscf/grad/uccsd.py
CHANGED
|
@@ -33,7 +33,7 @@ from pyscf.ao2mo import _ao2mo
|
|
|
33
33
|
from pyscf.scf import ucphf
|
|
34
34
|
from pyscf.grad import rhf as rhf_grad
|
|
35
35
|
from pyscf.grad import ccsd as ccsd_grad
|
|
36
|
-
|
|
36
|
+
from pyscf.grad.mp2 import has_frozen_orbitals
|
|
37
37
|
|
|
38
38
|
#
|
|
39
39
|
# Note: only works with canonical orbitals
|
|
@@ -72,9 +72,7 @@ def grad_elec(cc_grad, t1=None, t2=None, l1=None, l2=None, eris=None, atmlst=Non
|
|
|
72
72
|
nmob = mo_b.shape[1]
|
|
73
73
|
nocca = numpy.count_nonzero(mycc.mo_occ[0] > 0)
|
|
74
74
|
noccb = numpy.count_nonzero(mycc.mo_occ[1] > 0)
|
|
75
|
-
with_frozen =
|
|
76
|
-
or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
|
|
77
|
-
or (len(mycc.frozen) == 0))
|
|
75
|
+
with_frozen = has_frozen_orbitals(mycc)
|
|
78
76
|
moidx = mycc.get_frozen_mask()
|
|
79
77
|
OA_a, VA_a, OF_a, VF_a = ccsd_grad._index_frozen_active(moidx[0], mycc.mo_occ[0])
|
|
80
78
|
OA_b, VA_b, OF_b, VF_b = ccsd_grad._index_frozen_active(moidx[1], mycc.mo_occ[1])
|
|
@@ -249,9 +247,7 @@ def _response_dm1(mycc, Xvo, eris=None):
|
|
|
249
247
|
nmoa = nocca + nvira
|
|
250
248
|
nmob = noccb + nvirb
|
|
251
249
|
nova = nocca * nvira
|
|
252
|
-
with_frozen =
|
|
253
|
-
or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
|
|
254
|
-
or (len(mycc.frozen) == 0))
|
|
250
|
+
with_frozen = has_frozen_orbitals(mycc)
|
|
255
251
|
if eris is None or with_frozen:
|
|
256
252
|
mo_energy = mycc._scf.mo_energy
|
|
257
253
|
mo_occ = mycc.mo_occ
|
pyscf/grad/ump2.py
CHANGED
|
@@ -30,7 +30,7 @@ from pyscf.ao2mo import _ao2mo
|
|
|
30
30
|
from pyscf.mp import ump2
|
|
31
31
|
from pyscf.grad import rhf as rhf_grad
|
|
32
32
|
from pyscf.grad import mp2 as mp2_grad
|
|
33
|
-
|
|
33
|
+
from pyscf.grad.mp2 import has_frozen_orbitals
|
|
34
34
|
|
|
35
35
|
def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
|
|
36
36
|
mp = mp_grad.base
|
|
@@ -43,9 +43,7 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
|
|
|
43
43
|
log.debug('Build ump2 rdm2 intermediates')
|
|
44
44
|
|
|
45
45
|
mol = mp_grad.mol
|
|
46
|
-
with_frozen =
|
|
47
|
-
or (isinstance(mp.frozen, (int, numpy.integer)) and mp.frozen == 0)
|
|
48
|
-
or (len(mp.frozen) == 0))
|
|
46
|
+
with_frozen = has_frozen_orbitals(mp)
|
|
49
47
|
moidx = mp.get_frozen_mask()
|
|
50
48
|
OA_a, VA_a, OF_a, VF_a = mp2_grad._index_frozen_active(moidx[0], mp.mo_occ[0])
|
|
51
49
|
OA_b, VA_b, OF_b, VF_b = mp2_grad._index_frozen_active(moidx[1], mp.mo_occ[1])
|
pyscf/gto/basis/__init__.py
CHANGED
|
@@ -158,6 +158,8 @@ ALIAS = {
|
|
|
158
158
|
'def2tzvppd' : 'def2-tzvppd.dat',
|
|
159
159
|
'def2tzvpp' : 'def2-tzvpp.dat' ,
|
|
160
160
|
'def2tzvp' : 'def2-tzvp.dat' ,
|
|
161
|
+
'def2mtzvpp' : 'def2-mtzvpp.dat',
|
|
162
|
+
'def2mtzvp' : 'def2-mtzvp.dat' ,
|
|
161
163
|
'def2qzvpd' : 'def2-qzvpd.dat' ,
|
|
162
164
|
'def2qzvppd' : 'def2-qzvppd.dat',
|
|
163
165
|
'def2qzvpp' : 'def2-qzvpp.dat' ,
|
|
@@ -183,6 +185,12 @@ ALIAS = {
|
|
|
183
185
|
'def2qzvpri' : 'def2-qzvp-ri.dat' ,
|
|
184
186
|
'def2qzvppri' : 'def2-qzvpp-ri.dat' ,
|
|
185
187
|
'def2qzvppdri' : 'def2-qzvppd-ri.dat' ,
|
|
188
|
+
'madef2svpp' : 'ma-def2-svpp.dat' ,
|
|
189
|
+
'madef2svp' : 'ma-def2-svp.dat' ,
|
|
190
|
+
'madef2tzvpp' : 'ma-def2-tzvpp.dat' ,
|
|
191
|
+
'madef2tzvp' : 'ma-def2-tzvp.dat' ,
|
|
192
|
+
'madef2qzvpp' : 'ma-def2-qzvpp.dat' ,
|
|
193
|
+
'madef2qzvp' : 'ma-def2-qzvp.dat' ,
|
|
186
194
|
'tzv' : 'tzv.dat' ,
|
|
187
195
|
'weigend' : 'def2-universal-jfit.dat',
|
|
188
196
|
'weigend+etb' : 'def2-universal-jfit.dat',
|
|
@@ -647,8 +655,7 @@ def load(filename_or_basisname, symb, optimize=OPTIMIZE_CONTRACTION):
|
|
|
647
655
|
filename_or_basisname, elements=symb)
|
|
648
656
|
except KeyError:
|
|
649
657
|
raise BasisNotFoundError(filename_or_basisname)
|
|
650
|
-
|
|
651
|
-
return bse._orbital_basis(bse_obj)[0]
|
|
658
|
+
return bse._orbital_basis(bse_obj)[0][symb]
|
|
652
659
|
|
|
653
660
|
raise BasisNotFoundError(f'Unknown basis format or basis name for {filename_or_basisname}')
|
|
654
661
|
|
|
@@ -701,8 +708,7 @@ def load_ecp(filename_or_basisname, symb):
|
|
|
701
708
|
filename_or_basisname, elements=symb)
|
|
702
709
|
except KeyError:
|
|
703
710
|
raise BasisNotFoundError(filename_or_basisname)
|
|
704
|
-
|
|
705
|
-
return bse._ecp_basis(bse_obj)[0]
|
|
711
|
+
return bse._ecp_basis(bse_obj)[0][symb]
|
|
706
712
|
|
|
707
713
|
raise BasisNotFoundError('Unknown ECP format or ECP name')
|
|
708
714
|
|