pyscf 2.7.0__py3-none-macosx_11_0_arm64.whl → 2.9.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/__init__.py +2 -3
- pyscf/cc/ccsd.py +13 -5
- pyscf/cc/ccsd_rdm.py +6 -1
- pyscf/cc/dfccsd.py +3 -3
- pyscf/cc/dfuccsd.py +310 -0
- pyscf/cc/gccsd.py +2 -2
- pyscf/cc/rccsd.py +5 -1
- pyscf/cc/uccsd.py +36 -27
- pyscf/cc/uccsd_rdm.py +2 -2
- pyscf/df/addons.py +8 -3
- pyscf/df/autoaux.py +4 -0
- pyscf/df/df_jk.py +56 -25
- pyscf/df/grad/rhf.py +31 -1
- pyscf/df/hessian/uhf.py +2 -2
- pyscf/df/incore.py +2 -2
- pyscf/df/outcore.py +6 -6
- pyscf/dft/gks.py +25 -21
- pyscf/dft/libxc.py +31 -11
- 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/fci/fci_dhf_slow.py +15 -1
- pyscf/grad/ccsd.py +3 -7
- pyscf/grad/ccsd_slow.py +2 -3
- pyscf/grad/mp2.py +12 -3
- pyscf/grad/sacasscf.py +2 -0
- pyscf/grad/uccsd.py +3 -7
- pyscf/grad/ump2.py +2 -4
- pyscf/gto/basis/__init__.py +32 -5
- 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 +32 -35
- pyscf/gto/moleintor.py +26 -1
- pyscf/gw/rpa.py +133 -244
- pyscf/gw/urpa.py +84 -131
- pyscf/hessian/uks.py +1 -1
- pyscf/lib/CMakeLists.txt +8 -4
- 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 +25 -21
- 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/__init__.py +1 -1
- pyscf/mcscf/casci.py +7 -3
- pyscf/mcscf/chkfile.py +2 -3
- pyscf/mcscf/mc1step.py +12 -8
- pyscf/mcscf/newton_casscf.py +1 -1
- pyscf/mcscf/umc1step.py +5 -3
- pyscf/mp/__init__.py +2 -2
- 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/mrpt/nevpt2.py +11 -0
- pyscf/pbc/df/aft.py +9 -7
- pyscf/pbc/df/df.py +5 -6
- pyscf/pbc/df/df_jk.py +12 -6
- 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.py +1 -0
- pyscf/pbc/df/rsdf_builder.py +3 -3
- 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 +20 -26
- pyscf/pbc/dft/uks.py +21 -4
- pyscf/pbc/gto/_pbcintor.py +1 -0
- pyscf/pbc/gto/cell.py +170 -5
- pyscf/pbc/gto/eval_gto.py +1 -1
- pyscf/pbc/gto/neighborlist.py +4 -1
- pyscf/pbc/mpitools/mpi.py +0 -1
- pyscf/pbc/scf/_response_functions.py +141 -34
- pyscf/pbc/scf/hf.py +13 -10
- 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 +15 -3
- pyscf/pbc/tools/lattice.py +3 -3
- pyscf/pbc/tools/pbc.py +48 -35
- pyscf/pbc/x2c/sfx2c1e.py +5 -0
- pyscf/scf/_response_functions.py +85 -44
- pyscf/scf/_vhf.py +1 -0
- pyscf/scf/addons.py +21 -2
- 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 +378 -0
- pyscf/solvent/grad/pcm.py +75 -19
- pyscf/solvent/hessian/pcm.py +957 -108
- pyscf/solvent/hessian/smd.py +7 -43
- 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 +58 -13
- pyscf/tdscf/_lr_eig.py +561 -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/fcidump.py +36 -9
- pyscf/tools/finite_diff.py +175 -0
- pyscf/tools/qcschema.py +265 -0
- pyscf/x2c/tdscf.py +37 -37
- pyscf/x2c/x2c.py +101 -34
- {pyscf-2.7.0.dist-info → pyscf-2.9.0.dist-info}/METADATA +30 -26
- {pyscf-2.7.0.dist-info → pyscf-2.9.0.dist-info}/RECORD +224 -192
- {pyscf-2.7.0.dist-info → pyscf-2.9.0.dist-info}/WHEEL +2 -1
- {pyscf-2.7.0.dist-info → pyscf-2.9.0.dist-info/licenses}/NOTICE +13 -0
- 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.9.0.dist-info/licenses}/LICENSE +0 -0
- {pyscf-2.7.0.dist-info → pyscf-2.9.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/fci/fci_dhf_slow.py
CHANGED
|
@@ -76,7 +76,7 @@ def kernel(h1e, eri, norb, nelec, ecore=0, nroots=1, verbose=3):
|
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
# dm_pq = <|p^+ q|>
|
|
79
|
-
def
|
|
79
|
+
def make_rdm1_slow(fcivec, norb, nelec, link_index=None):
|
|
80
80
|
if link_index is None:
|
|
81
81
|
link_index = cistring.gen_linkstr_index(range(norb), nelec)
|
|
82
82
|
rdm1 = numpy.zeros((norb, norb), dtype=fcivec.dtype)
|
|
@@ -85,6 +85,20 @@ def make_rdm1(fcivec, norb, nelec, link_index=None):
|
|
|
85
85
|
rdm1[a, i] += sign * numpy.dot(fcivec[str1].conj(), fcivec[str0])
|
|
86
86
|
return rdm1
|
|
87
87
|
|
|
88
|
+
|
|
89
|
+
# dm_pq = <|p^+ q|>
|
|
90
|
+
def make_rdm1(fcivec, norb, nelec, link_index=None):
|
|
91
|
+
if nelec == 0:
|
|
92
|
+
return numpy.zeros((norb, norb), dtype=fcivec.dtype)
|
|
93
|
+
nd = cistring.num_strings(norb, nelec - 1)
|
|
94
|
+
index_d = cistring.gen_des_str_index(range(norb), nelec)
|
|
95
|
+
dci = numpy.zeros((nd, norb), dtype=fcivec.dtype)
|
|
96
|
+
for str0, tab in enumerate(index_d):
|
|
97
|
+
for _, i, str1, sign in tab:
|
|
98
|
+
dci[str1, i] += sign * fcivec[str0]
|
|
99
|
+
return dci.conj().T @ dci
|
|
100
|
+
|
|
101
|
+
|
|
88
102
|
# dm_pq,rs = <|p^+ q r^+ s|>
|
|
89
103
|
def make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True):
|
|
90
104
|
if link_index is None:
|
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/sacasscf.py
CHANGED
|
@@ -444,6 +444,8 @@ class Gradients (lagrange.Gradients):
|
|
|
444
444
|
self.e_states = np.asarray (mc.e_tot)
|
|
445
445
|
if isinstance (mc, StateAverageMCSCFSolver):
|
|
446
446
|
self.weights = np.asarray (mc.weights)
|
|
447
|
+
if np.amax (self.weights) - np.amin (self.weights) > 1e-8:
|
|
448
|
+
raise NotImplementedError ("Unequal weights in SA-CASSCF gradients")
|
|
447
449
|
assert (len (self.weights) == self.nroots), '{} {} {}'.format (
|
|
448
450
|
mc.fcisolver.__class__, self.weights, self.nroots)
|
|
449
451
|
lagrange.Gradients.__init__(self, mc, self.ngorb+self.nci)
|
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',
|
|
@@ -307,7 +315,7 @@ ALIAS = {
|
|
|
307
315
|
'pobtzvp' : 'pob-tzvp.dat',
|
|
308
316
|
'pobtzvpp' : 'pob-tzvpp.dat',
|
|
309
317
|
'crystalccpvdz' : 'crystal-cc-pvdz.dat',
|
|
310
|
-
# ccECP
|
|
318
|
+
# ccECP
|
|
311
319
|
'ccecp' : join('ccecp-basis', 'ccECP', 'ccECP.dat' ),
|
|
312
320
|
'ccecpccpvdz' : join('ccecp-basis', 'ccECP', 'ccECP_cc-pVDZ.dat'),
|
|
313
321
|
'ccecpccpvtz' : join('ccecp-basis', 'ccECP', 'ccECP_cc-pVTZ.dat'),
|
|
@@ -319,7 +327,7 @@ ALIAS = {
|
|
|
319
327
|
'ccecpaugccpvqz': join('ccecp-basis', 'ccECP', 'ccECP_aug-cc-pVQZ.dat'),
|
|
320
328
|
'ccecpaugccpv5z': join('ccecp-basis', 'ccECP', 'ccECP_aug-cc-pV5Z.dat'),
|
|
321
329
|
'ccecpaugccpv6z': join('ccecp-basis', 'ccECP', 'ccECP_aug-cc-pV6Z.dat'),
|
|
322
|
-
# ccECP_He_core
|
|
330
|
+
# ccECP_He_core
|
|
323
331
|
'ccecphe' : join('ccecp-basis', 'ccECP_He_core', 'ccECP.dat' ),
|
|
324
332
|
'ccecpheccpvdz' : join('ccecp-basis', 'ccECP_He_core', 'ccECP_cc-pVDZ.dat'),
|
|
325
333
|
'ccecpheccpvtz' : join('ccecp-basis', 'ccECP_He_core', 'ccECP_cc-pVTZ.dat'),
|
|
@@ -375,6 +383,13 @@ ALIAS = {
|
|
|
375
383
|
'dyallv4z' : 'dyall-basis.dyall_v4z',
|
|
376
384
|
}
|
|
377
385
|
|
|
386
|
+
USER_BASIS_DIR = getattr(__config__, 'USER_BASIS_DIR', '')
|
|
387
|
+
USER_BASIS_ALIAS = getattr(__config__, 'USER_BASIS_ALIAS', {})
|
|
388
|
+
USER_GTH_ALIAS = getattr(__config__, 'USER_GTH_ALIAS', {})
|
|
389
|
+
|
|
390
|
+
if USER_BASIS_ALIAS.keys() & ALIAS.keys():
|
|
391
|
+
raise KeyError('USER_BASIS_ALIAS keys conflict with predefined basis sets')
|
|
392
|
+
|
|
378
393
|
GTH_ALIAS = {
|
|
379
394
|
'gthaugdzvp' : 'gth-aug-dzvp.dat',
|
|
380
395
|
'gthaugqzv2p' : 'gth-aug-qzv2p.dat',
|
|
@@ -399,6 +414,9 @@ GTH_ALIAS = {
|
|
|
399
414
|
'gthdzvpmoloptsr' : 'gth-dzvp-molopt-sr.dat',
|
|
400
415
|
}
|
|
401
416
|
|
|
417
|
+
if USER_GTH_ALIAS.keys() & GTH_ALIAS.keys():
|
|
418
|
+
raise KeyError('USER_GTH_ALIAS keys conflict with predefined GTH basis sets')
|
|
419
|
+
|
|
402
420
|
PP_ALIAS = {
|
|
403
421
|
'gthblyp' : 'gth-blyp.dat' ,
|
|
404
422
|
'gthbp' : 'gth-bp.dat' ,
|
|
@@ -602,10 +620,17 @@ def load(filename_or_basisname, symb, optimize=OPTIMIZE_CONTRACTION):
|
|
|
602
620
|
basis_dir = _BASIS_DIR
|
|
603
621
|
if name in ALIAS:
|
|
604
622
|
basmod = ALIAS[name]
|
|
623
|
+
elif name in USER_BASIS_ALIAS:
|
|
624
|
+
basmod = USER_BASIS_ALIAS[name]
|
|
625
|
+
basis_dir = USER_BASIS_DIR
|
|
605
626
|
elif name in GTH_ALIAS:
|
|
606
627
|
basmod = GTH_ALIAS[name]
|
|
607
628
|
fload = parse_cp2k.load
|
|
608
629
|
basis_dir = _GTH_BASIS_DIR
|
|
630
|
+
elif name in USER_GTH_ALIAS:
|
|
631
|
+
basmod = USER_GTH_ALIAS[name]
|
|
632
|
+
fload = parse_cp2k.load
|
|
633
|
+
basis_dir = USER_BASIS_DIR
|
|
609
634
|
elif _is_pople_basis(name):
|
|
610
635
|
basmod = _parse_pople_basis(name, symb)
|
|
611
636
|
elif name in SAP_ALIAS:
|
|
@@ -647,8 +672,7 @@ def load(filename_or_basisname, symb, optimize=OPTIMIZE_CONTRACTION):
|
|
|
647
672
|
filename_or_basisname, elements=symb)
|
|
648
673
|
except KeyError:
|
|
649
674
|
raise BasisNotFoundError(filename_or_basisname)
|
|
650
|
-
|
|
651
|
-
return bse._orbital_basis(bse_obj)[0]
|
|
675
|
+
return bse._orbital_basis(bse_obj)[0][symb]
|
|
652
676
|
|
|
653
677
|
raise BasisNotFoundError(f'Unknown basis format or basis name for {filename_or_basisname}')
|
|
654
678
|
|
|
@@ -701,8 +725,11 @@ def load_ecp(filename_or_basisname, symb):
|
|
|
701
725
|
filename_or_basisname, elements=symb)
|
|
702
726
|
except KeyError:
|
|
703
727
|
raise BasisNotFoundError(filename_or_basisname)
|
|
728
|
+
ecp_basis = bse._ecp_basis(bse_obj)
|
|
729
|
+
if len(ecp_basis) > 0:
|
|
730
|
+
return ecp_basis[symb]
|
|
704
731
|
else:
|
|
705
|
-
return
|
|
732
|
+
return {}
|
|
706
733
|
|
|
707
734
|
raise BasisNotFoundError('Unknown ECP format or ECP name')
|
|
708
735
|
|