pyscf 2.8.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/cc/__init__.py +2 -3
- pyscf/cc/dfccsd.py +3 -3
- pyscf/cc/dfuccsd.py +310 -0
- pyscf/cc/rccsd.py +5 -1
- pyscf/cc/uccsd.py +30 -21
- pyscf/df/addons.py +6 -1
- pyscf/df/df_jk.py +29 -0
- pyscf/df/hessian/uhf.py +2 -2
- pyscf/df/incore.py +1 -1
- pyscf/dft/libxc.py +1 -1
- pyscf/fci/fci_dhf_slow.py +15 -1
- pyscf/grad/sacasscf.py +2 -0
- pyscf/gto/basis/__init__.py +24 -3
- pyscf/gto/mole.py +7 -7
- pyscf/gto/moleintor.py +25 -0
- pyscf/gw/urpa.py +6 -2
- pyscf/hessian/uks.py +1 -1
- pyscf/lib/CMakeLists.txt +2 -2
- pyscf/lib/deps/lib/libcint.6.dylib +0 -0
- pyscf/lib/dft/libxc_itrf.c +21 -17
- 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/mcscf/__init__.py +1 -1
- pyscf/mcscf/casci.py +2 -2
- pyscf/mcscf/mc1step.py +2 -2
- pyscf/mcscf/newton_casscf.py +1 -1
- pyscf/mp/__init__.py +1 -2
- pyscf/mp/dfmp2.py +1 -1
- pyscf/mp/dfump2.py +1 -1
- pyscf/mrpt/nevpt2.py +11 -0
- pyscf/pbc/df/aft.py +3 -0
- pyscf/pbc/df/df.py +4 -5
- pyscf/pbc/df/df_jk.py +8 -5
- pyscf/pbc/df/rsdf.py +1 -0
- pyscf/pbc/df/rsdf_builder.py +1 -1
- pyscf/pbc/dft/rks.py +4 -2
- pyscf/pbc/gto/cell.py +18 -6
- pyscf/pbc/mpitools/mpi.py +0 -1
- pyscf/pbc/scf/hf.py +13 -2
- pyscf/pbc/tools/k2gamma.py +2 -1
- pyscf/pbc/x2c/sfx2c1e.py +5 -0
- pyscf/scf/addons.py +21 -2
- pyscf/solvent/cosmors.py +177 -165
- pyscf/solvent/grad/pcm.py +75 -19
- pyscf/solvent/hessian/pcm.py +957 -108
- pyscf/solvent/hessian/smd.py +7 -43
- pyscf/symm/geom.py +57 -8
- pyscf/tdscf/_lr_eig.py +14 -7
- pyscf/tools/fcidump.py +36 -9
- pyscf/tools/finite_diff.py +175 -0
- pyscf/x2c/x2c.py +101 -34
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/METADATA +5 -4
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/RECORD +70 -68
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/WHEEL +2 -1
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info/licenses}/NOTICE +2 -0
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info/licenses}/LICENSE +0 -0
- {pyscf-2.8.0.dist-info → pyscf-2.9.0.dist-info}/top_level.txt +0 -0
pyscf/__init__.py
CHANGED
pyscf/cc/__init__.py
CHANGED
|
@@ -120,15 +120,14 @@ RCCSD.__doc__ = ccsd.CCSD.__doc__
|
|
|
120
120
|
|
|
121
121
|
def UCCSD(mf, frozen=None, mo_coeff=None, mo_occ=None):
|
|
122
122
|
from pyscf.df.df_jk import _DFHF
|
|
123
|
+
from pyscf.cc import dfuccsd
|
|
123
124
|
|
|
124
125
|
mf = mf.remove_soscf()
|
|
125
126
|
if not mf.istype('UHF'):
|
|
126
127
|
mf = mf.to_uhf()
|
|
127
128
|
|
|
128
129
|
if isinstance(mf, _DFHF) and mf.with_df:
|
|
129
|
-
|
|
130
|
-
# similar to dfccsd.RCCSD
|
|
131
|
-
return uccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
|
|
130
|
+
return dfuccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
|
|
132
131
|
else:
|
|
133
132
|
return uccsd.UCCSD(mf, frozen, mo_coeff, mo_occ)
|
|
134
133
|
UCCSD.__doc__ = uccsd.UCCSD.__doc__
|
pyscf/cc/dfccsd.py
CHANGED
|
@@ -51,7 +51,7 @@ class RCCSD(ccsd.CCSD):
|
|
|
51
51
|
to_gpu = lib.to_gpu
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
|
|
54
|
+
def _contract_vvvv_t2(mycc, mol, vvL, VVL, t2, out=None, verbose=None):
|
|
55
55
|
'''Ht2 = numpy.einsum('ijcd,acdb->ijab', t2, vvvv)
|
|
56
56
|
|
|
57
57
|
Args:
|
|
@@ -103,7 +103,7 @@ def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
|
|
|
103
103
|
ijL = vvL0[tril2sq[i0:i1,j0:j1] - off0].reshape(-1,naux)
|
|
104
104
|
eri = numpy.ndarray(((i1-i0)*(j1-j0),nvir_pair), buffer=eribuf)
|
|
105
105
|
for p0, p1 in lib.prange(0, nvir_pair, vvblk):
|
|
106
|
-
vvL1 = _cp(
|
|
106
|
+
vvL1 = _cp(VVL[p0:p1])
|
|
107
107
|
eri[:,p0:p1] = lib.ddot(ijL, vvL1.T)
|
|
108
108
|
vvL1 = None
|
|
109
109
|
|
|
@@ -120,7 +120,7 @@ def _contract_vvvv_t2(mycc, mol, vvL, t2, out=None, verbose=None):
|
|
|
120
120
|
class _ChemistsERIs(ccsd._ChemistsERIs):
|
|
121
121
|
def _contract_vvvv_t2(self, mycc, t2, direct=False, out=None, verbose=None):
|
|
122
122
|
assert (not direct)
|
|
123
|
-
return _contract_vvvv_t2(mycc, self.mol, self.vvL, t2, out, verbose)
|
|
123
|
+
return _contract_vvvv_t2(mycc, self.mol, self.vvL, self.vvL, t2, out, verbose)
|
|
124
124
|
|
|
125
125
|
def _make_df_eris(cc, mo_coeff=None):
|
|
126
126
|
assert cc._scf.istype('RHF')
|
pyscf/cc/dfuccsd.py
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2014-2025 The PySCF Developers. All Rights Reserved.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
from pyscf import lib
|
|
19
|
+
from pyscf.lib import logger
|
|
20
|
+
from pyscf import df
|
|
21
|
+
from pyscf.cc import uccsd
|
|
22
|
+
from pyscf.cc import ccsd
|
|
23
|
+
from pyscf.cc import dfccsd
|
|
24
|
+
from pyscf import __config__
|
|
25
|
+
|
|
26
|
+
MEMORYMIN = getattr(__config__, 'cc_ccsd_memorymin', 2000)
|
|
27
|
+
|
|
28
|
+
class UCCSD(uccsd.UCCSD):
|
|
29
|
+
_keys = {'with_df'}
|
|
30
|
+
|
|
31
|
+
def __init__(self, mf, frozen=None, mo_coeff=None, mo_occ=None):
|
|
32
|
+
uccsd.UCCSD.__init__(self, mf, frozen, mo_coeff, mo_occ)
|
|
33
|
+
if getattr(mf, 'with_df', None):
|
|
34
|
+
self.with_df = mf.with_df
|
|
35
|
+
else:
|
|
36
|
+
self.with_df = df.DF(mf.mol)
|
|
37
|
+
self.with_df.auxbasis = df.make_auxbasis(mf.mol, mp2fit=True)
|
|
38
|
+
|
|
39
|
+
def reset(self, mol=None):
|
|
40
|
+
self.with_df.reset(mol)
|
|
41
|
+
return uccsd.UCCSD.reset(self, mol)
|
|
42
|
+
|
|
43
|
+
def ao2mo(self, mo_coeff=None):
|
|
44
|
+
return _make_df_eris(self, mo_coeff)
|
|
45
|
+
|
|
46
|
+
def _add_vvvv(self, t1, t2, eris, out=None, with_ovvv=False, t2sym=None):
|
|
47
|
+
assert (not self.direct)
|
|
48
|
+
return uccsd.UCCSD._add_vvvv(self, t1, t2, eris, out, with_ovvv, t2sym)
|
|
49
|
+
|
|
50
|
+
def _add_vvVV(self, t1, t2, eris, out=None):
|
|
51
|
+
assert (not self.direct)
|
|
52
|
+
return uccsd.UCCSD._add_vvVV(self, t1, t2, eris, out)
|
|
53
|
+
|
|
54
|
+
to_gpu = lib.to_gpu
|
|
55
|
+
|
|
56
|
+
class _ChemistsERIs(uccsd._ChemistsERIs):
|
|
57
|
+
def _contract_vvvv_t2(self, mycc, t2, direct=False, out=None, verbose=None):
|
|
58
|
+
assert (not direct)
|
|
59
|
+
return dfccsd._contract_vvvv_t2(mycc, self.mol, self.vvL, self.vvL, t2, out, verbose)
|
|
60
|
+
def _contract_VVVV_t2(self, mycc, t2, direct=False, out=None, verbose=None):
|
|
61
|
+
assert (not direct)
|
|
62
|
+
return dfccsd._contract_vvvv_t2(mycc, self.mol, self.VVL, self.VVL, t2, out, verbose)
|
|
63
|
+
def _contract_vvVV_t2(self, mycc, t2, direct=False, out=None, verbose=None):
|
|
64
|
+
assert (not direct)
|
|
65
|
+
return dfccsd._contract_vvvv_t2(mycc, self.mol, self.vvL, self.VVL, t2, out, verbose)
|
|
66
|
+
|
|
67
|
+
def _cp(a):
|
|
68
|
+
return np.asarray(a, order='C')
|
|
69
|
+
|
|
70
|
+
def _make_df_eris(mycc, mo_coeff=None):
|
|
71
|
+
assert mycc._scf.istype('UHF')
|
|
72
|
+
cput0 = (logger.process_clock(), logger.perf_counter())
|
|
73
|
+
log = logger.Logger(mycc.stdout, mycc.verbose)
|
|
74
|
+
eris = _ChemistsERIs()
|
|
75
|
+
eris._common_init_(mycc, mo_coeff)
|
|
76
|
+
|
|
77
|
+
moa, mob = eris.mo_coeff
|
|
78
|
+
nocca, noccb = eris.nocc
|
|
79
|
+
nao = moa.shape[0]
|
|
80
|
+
nmoa = moa.shape[1]
|
|
81
|
+
nmob = mob.shape[1]
|
|
82
|
+
nvira = nmoa - nocca
|
|
83
|
+
nvirb = nmob - noccb
|
|
84
|
+
nvira_pair = nvira * (nvira + 1) // 2
|
|
85
|
+
nvirb_pair = nvirb * (nvirb + 1) // 2
|
|
86
|
+
with_df = mycc.with_df
|
|
87
|
+
naux = eris.naux = with_df.get_naoaux()
|
|
88
|
+
|
|
89
|
+
# --- Three-center integrals
|
|
90
|
+
# (L|aa)
|
|
91
|
+
Loo = np.empty((naux, nocca, nocca))
|
|
92
|
+
Lov = np.empty((naux, nocca, nvira))
|
|
93
|
+
Lvo = np.empty((naux, nvira, nocca))
|
|
94
|
+
# (L|bb)
|
|
95
|
+
LOO = np.empty((naux, noccb, noccb))
|
|
96
|
+
LOV = np.empty((naux, noccb, nvirb))
|
|
97
|
+
LVO = np.empty((naux, nvirb, noccb))
|
|
98
|
+
|
|
99
|
+
# --- Four-center integrals
|
|
100
|
+
eris.feri = lib.H5TmpFile()
|
|
101
|
+
# (aa|aa)
|
|
102
|
+
eris.oooo = eris.feri.create_dataset('oooo', (nocca,nocca,nocca,nocca), 'f8')
|
|
103
|
+
eris.oovv = eris.feri.create_dataset('oovv', (nocca,nocca,nvira,nvira), 'f8', chunks=(nocca,nocca,1,nvira))
|
|
104
|
+
eris.ovoo = eris.feri.create_dataset('ovoo', (nocca,nvira,nocca,nocca), 'f8', chunks=(nocca,1,nocca,nocca))
|
|
105
|
+
eris.ovvo = eris.feri.create_dataset('ovvo', (nocca,nvira,nvira,nocca), 'f8', chunks=(nocca,1,nvira,nocca))
|
|
106
|
+
eris.ovov = eris.feri.create_dataset('ovov', (nocca,nvira,nocca,nvira), 'f8', chunks=(nocca,1,nocca,nvira))
|
|
107
|
+
# (bb|bb)
|
|
108
|
+
eris.OOOO = eris.feri.create_dataset('OOOO', (noccb,noccb,noccb,noccb), 'f8')
|
|
109
|
+
eris.OOVV = eris.feri.create_dataset('OOVV', (noccb,noccb,nvirb,nvirb), 'f8', chunks=(noccb,noccb,1,nvirb))
|
|
110
|
+
eris.OVOO = eris.feri.create_dataset('OVOO', (noccb,nvirb,noccb,noccb), 'f8', chunks=(noccb,1,noccb,noccb))
|
|
111
|
+
eris.OVVO = eris.feri.create_dataset('OVVO', (noccb,nvirb,nvirb,noccb), 'f8', chunks=(noccb,1,nvirb,noccb))
|
|
112
|
+
eris.OVOV = eris.feri.create_dataset('OVOV', (noccb,nvirb,noccb,nvirb), 'f8', chunks=(noccb,1,noccb,nvirb))
|
|
113
|
+
# (aa|bb)
|
|
114
|
+
eris.ooOO = eris.feri.create_dataset('ooOO', (nocca,nocca,noccb,noccb), 'f8')
|
|
115
|
+
eris.ooVV = eris.feri.create_dataset('ooVV', (nocca,nocca,nvirb,nvirb), 'f8', chunks=(nocca,nocca,1,nvirb))
|
|
116
|
+
eris.ovOO = eris.feri.create_dataset('ovOO', (nocca,nvira,noccb,noccb), 'f8', chunks=(nocca,1,noccb,noccb))
|
|
117
|
+
eris.ovVO = eris.feri.create_dataset('ovVO', (nocca,nvira,nvirb,noccb), 'f8', chunks=(nocca,1,nvirb,noccb))
|
|
118
|
+
eris.ovOV = eris.feri.create_dataset('ovOV', (nocca,nvira,noccb,nvirb), 'f8', chunks=(nocca,1,noccb,nvirb))
|
|
119
|
+
# (bb|aa)
|
|
120
|
+
eris.OOvv = eris.feri.create_dataset('OOvv', (noccb,noccb,nvira,nvira), 'f8', chunks=(noccb,noccb,1,nvira))
|
|
121
|
+
eris.OVoo = eris.feri.create_dataset('OVoo', (noccb,nvirb,nocca,nocca), 'f8', chunks=(noccb,1,nocca,nocca))
|
|
122
|
+
eris.OVvo = eris.feri.create_dataset('OVvo', (noccb,nvirb,nvira,nocca), 'f8', chunks=(noccb,1,nvira,nocca))
|
|
123
|
+
|
|
124
|
+
# nrow ~ 4e9/8/blockdim to ensure hdf5 chunk < 4GB
|
|
125
|
+
chunks = (min(nvira_pair, int(4e8 / with_df.blockdim)), min(naux, with_df.blockdim))
|
|
126
|
+
eris.vvL = eris.feri.create_dataset('vvL', (nvira_pair,naux), 'f8', chunks=chunks)
|
|
127
|
+
chunks = (min(nvirb_pair, int(4e8 / with_df.blockdim)), min(naux, with_df.blockdim))
|
|
128
|
+
eris.VVL = eris.feri.create_dataset('VVL', (nvirb_pair,naux), 'f8', chunks=chunks)
|
|
129
|
+
|
|
130
|
+
# Transform three-center integrals to MO basis
|
|
131
|
+
p1 = 0
|
|
132
|
+
for eri1 in with_df.loop():
|
|
133
|
+
eri1 = lib.unpack_tril(eri1).reshape(-1, nao, nao)
|
|
134
|
+
# (L|aa)
|
|
135
|
+
Lpq = lib.einsum('Lab,ap,bq->Lpq', eri1, moa, moa)
|
|
136
|
+
p0, p1 = p1, p1 + Lpq.shape[0]
|
|
137
|
+
blk = np.s_[p0:p1]
|
|
138
|
+
Loo[blk] = Lpq[:, :nocca, :nocca]
|
|
139
|
+
Lov[blk] = Lpq[:, :nocca, nocca:]
|
|
140
|
+
Lvo[blk] = Lpq[:, nocca:, :nocca]
|
|
141
|
+
eris.vvL[:, p0:p1] = lib.pack_tril(Lpq[:, nocca:, nocca:]).T
|
|
142
|
+
# (L|bb)
|
|
143
|
+
Lpq = None
|
|
144
|
+
Lpq = lib.einsum('Lab,ap,bq->Lpq', eri1, mob, mob)
|
|
145
|
+
LOO[blk] = Lpq[:, :noccb, :noccb]
|
|
146
|
+
LOV[blk] = Lpq[:, :noccb, noccb:]
|
|
147
|
+
LVO[blk] = Lpq[:, noccb:, :noccb]
|
|
148
|
+
eris.VVL[:, p0:p1] = lib.pack_tril(Lpq[:, noccb:, noccb:]).T
|
|
149
|
+
Lpq = None
|
|
150
|
+
|
|
151
|
+
Loo = Loo.reshape(naux, nocca * nocca)
|
|
152
|
+
Lov = Lov.reshape(naux, nocca * nvira)
|
|
153
|
+
Lvo = Lvo.reshape(naux, nocca * nvira)
|
|
154
|
+
LOO = LOO.reshape(naux, noccb * noccb)
|
|
155
|
+
LOV = LOV.reshape(naux, noccb * nvirb)
|
|
156
|
+
LVO = LVO.reshape(naux, noccb * nvirb)
|
|
157
|
+
|
|
158
|
+
eris.oooo[:] = lib.ddot(Loo.T, Loo).reshape(nocca,nocca,nocca,nocca)
|
|
159
|
+
eris.ovoo[:] = lib.ddot(Lov.T, Loo).reshape(nocca,nvira,nocca,nocca)
|
|
160
|
+
eris.ovvo[:] = lib.ddot(Lov.T, Lvo).reshape(nocca,nvira,nvira,nocca)
|
|
161
|
+
eris.ovov[:] = lib.ddot(Lov.T, Lov).reshape(nocca,nvira,nocca,nvira)
|
|
162
|
+
|
|
163
|
+
eris.OVoo[:] = lib.ddot(LOV.T, Loo).reshape(noccb,nvirb,nocca,nocca)
|
|
164
|
+
eris.OVvo[:] = lib.ddot(LOV.T, Lvo).reshape(noccb,nvirb,nvira,nocca)
|
|
165
|
+
|
|
166
|
+
Lvo = None
|
|
167
|
+
|
|
168
|
+
eris.OOOO[:] = lib.ddot(LOO.T, LOO).reshape(noccb,noccb,noccb,noccb)
|
|
169
|
+
eris.OVOO[:] = lib.ddot(LOV.T, LOO).reshape(noccb,nvirb,noccb,noccb)
|
|
170
|
+
eris.OVVO[:] = lib.ddot(LOV.T, LVO).reshape(noccb,nvirb,nvirb,noccb)
|
|
171
|
+
eris.OVOV[:] = lib.ddot(LOV.T, LOV).reshape(noccb,nvirb,noccb,nvirb)
|
|
172
|
+
|
|
173
|
+
eris.ooOO[:] = lib.ddot(Loo.T, LOO).reshape(nocca,nocca,noccb,noccb)
|
|
174
|
+
eris.ovOO[:] = lib.ddot(Lov.T, LOO).reshape(nocca,nvira,noccb,noccb)
|
|
175
|
+
eris.ovVO[:] = lib.ddot(Lov.T, LVO).reshape(nocca,nvira,nvirb,noccb)
|
|
176
|
+
eris.ovOV[:] = lib.ddot(Lov.T, LOV).reshape(nocca,nvira,noccb,nvirb)
|
|
177
|
+
|
|
178
|
+
LVO = None
|
|
179
|
+
|
|
180
|
+
mem_now = lib.current_memory()[0]
|
|
181
|
+
max_memory = max(0, mycc.max_memory - mem_now)
|
|
182
|
+
|
|
183
|
+
# eris.oovv
|
|
184
|
+
blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-nocca**2*nvira_pair)/(nocca**2+naux)))
|
|
185
|
+
oovv_tril = np.empty((nocca * nocca, nvira_pair))
|
|
186
|
+
for p0, p1 in lib.prange(0, nvira_pair, blksize):
|
|
187
|
+
oovv_tril[:, p0:p1] = lib.ddot(Loo.T, _cp(eris.vvL[p0:p1]).T)
|
|
188
|
+
eris.oovv[:] = lib.unpack_tril(oovv_tril).reshape(nocca, nocca, nvira, nvira)
|
|
189
|
+
oovv_tril = None
|
|
190
|
+
|
|
191
|
+
# eris.ooVV
|
|
192
|
+
blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-nocca**2*nvirb_pair)/(nocca**2+naux)))
|
|
193
|
+
oovv_tril = np.empty((nocca * nocca, nvirb_pair))
|
|
194
|
+
for p0, p1 in lib.prange(0, nvirb_pair, blksize):
|
|
195
|
+
oovv_tril[:, p0:p1] = lib.ddot(Loo.T, _cp(eris.VVL[p0:p1]).T)
|
|
196
|
+
eris.ooVV[:] = lib.unpack_tril(oovv_tril).reshape(nocca, nocca, nvirb, nvirb)
|
|
197
|
+
oovv_tril = Loo = None
|
|
198
|
+
|
|
199
|
+
mem_now = lib.current_memory()[0]
|
|
200
|
+
max_memory = max(0, mycc.max_memory - mem_now)
|
|
201
|
+
|
|
202
|
+
# eris.OOvv
|
|
203
|
+
blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-noccb**2*nvira_pair)/(noccb**2+naux)))
|
|
204
|
+
oovv_tril = np.empty((noccb * noccb, nvira_pair))
|
|
205
|
+
for p0, p1 in lib.prange(0, nvira_pair, blksize):
|
|
206
|
+
oovv_tril[:, p0:p1] = lib.ddot(LOO.T, _cp(eris.vvL[p0:p1]).T)
|
|
207
|
+
eris.OOvv[:] = lib.unpack_tril(oovv_tril).reshape(noccb, noccb, nvira, nvira)
|
|
208
|
+
oovv_tril = None
|
|
209
|
+
|
|
210
|
+
# eris.OOVV
|
|
211
|
+
blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-noccb**2*nvirb_pair)/(noccb**2+naux)))
|
|
212
|
+
oovv_tril = np.empty((noccb * noccb, nvirb_pair))
|
|
213
|
+
for p0, p1 in lib.prange(0, nvirb_pair, blksize):
|
|
214
|
+
oovv_tril[:, p0:p1] = lib.ddot(LOO.T, _cp(eris.VVL[p0:p1]).T)
|
|
215
|
+
eris.OOVV[:] = lib.unpack_tril(oovv_tril).reshape(noccb, noccb, nvirb, nvirb)
|
|
216
|
+
oovv_tril = LOO = None
|
|
217
|
+
|
|
218
|
+
mem_now = lib.current_memory()[0]
|
|
219
|
+
max_memory = max(0, mycc.max_memory - mem_now)
|
|
220
|
+
|
|
221
|
+
Lov = Lov.reshape(naux, nocca, nvira)
|
|
222
|
+
LOV = LOV.reshape(naux, noccb, nvirb)
|
|
223
|
+
|
|
224
|
+
# eris.ovvv
|
|
225
|
+
vblk = max(nocca, int((max_memory*.15e6/8)/(nocca*nvira_pair)))
|
|
226
|
+
vvblk = int(min(nvira_pair, 4e8/nocca, max(4, (max_memory*.8e6/8)/(vblk*nocca+naux))))
|
|
227
|
+
eris.ovvv = eris.feri.create_dataset('ovvv', (nocca, nvira, nvira_pair), 'f8', chunks=(nocca, 1, vvblk))
|
|
228
|
+
for q0, q1 in lib.prange(0, nvira_pair, vvblk):
|
|
229
|
+
vvL = _cp(eris.vvL[q0:q1])
|
|
230
|
+
for p0, p1 in lib.prange(0, nvira, vblk):
|
|
231
|
+
tmpLov = Lov[:, :, p0:p1].reshape(naux, -1)
|
|
232
|
+
eris.ovvv[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(nocca, p1 - p0, q1 - q0)
|
|
233
|
+
vvL = None
|
|
234
|
+
|
|
235
|
+
# eris.ovVV
|
|
236
|
+
vblk = max(nocca, int((max_memory*.15e6/8)/(nocca*nvirb_pair)))
|
|
237
|
+
vvblk = int(min(nvirb_pair, 4e8/nocca, max(4, (max_memory*.8e6/8)/(vblk*nocca+naux))))
|
|
238
|
+
eris.ovVV = eris.feri.create_dataset('ovVV', (nocca, nvira, nvirb_pair), 'f8', chunks=(nocca, 1, vvblk))
|
|
239
|
+
for q0, q1 in lib.prange(0, nvirb_pair, vvblk):
|
|
240
|
+
vvL = _cp(eris.VVL[q0:q1])
|
|
241
|
+
for p0, p1 in lib.prange(0, nvira, vblk):
|
|
242
|
+
tmpLov = Lov[:, :, p0:p1].reshape(naux, -1)
|
|
243
|
+
eris.ovVV[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(nocca, p1 - p0, q1 - q0)
|
|
244
|
+
vvL = None
|
|
245
|
+
Lov = None
|
|
246
|
+
|
|
247
|
+
mem_now = lib.current_memory()[0]
|
|
248
|
+
max_memory = max(0, mycc.max_memory - mem_now)
|
|
249
|
+
|
|
250
|
+
# eris.OVvv
|
|
251
|
+
vblk = max(noccb, int((max_memory*.15e6/8)/(noccb*nvira_pair)))
|
|
252
|
+
vvblk = int(min(nvira_pair, 4e8/noccb, max(4, (max_memory*.8e6/8)/(vblk*noccb+naux))))
|
|
253
|
+
eris.OVvv = eris.feri.create_dataset('OVvv', (noccb, nvirb, nvira_pair), 'f8', chunks=(noccb, 1, vvblk))
|
|
254
|
+
for q0, q1 in lib.prange(0, nvira_pair, vvblk):
|
|
255
|
+
vvL = _cp(eris.vvL[q0:q1])
|
|
256
|
+
for p0, p1 in lib.prange(0, nvirb, vblk):
|
|
257
|
+
tmpLov = LOV[:, :, p0:p1].reshape(naux, -1)
|
|
258
|
+
eris.OVvv[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(noccb, p1 - p0, q1 - q0)
|
|
259
|
+
vvL = None
|
|
260
|
+
|
|
261
|
+
# eris.OVVV
|
|
262
|
+
vblk = max(noccb, int((max_memory*.15e6/8)/(noccb*nvirb_pair)))
|
|
263
|
+
vvblk = int(min(nvirb_pair, 4e8/noccb, max(4, (max_memory*.8e6/8)/(vblk*noccb+naux))))
|
|
264
|
+
eris.OVVV = eris.feri.create_dataset('OVVV', (noccb, nvirb, nvirb_pair), 'f8', chunks=(noccb, 1, vvblk))
|
|
265
|
+
for q0, q1 in lib.prange(0, nvirb_pair, vvblk):
|
|
266
|
+
vvL = _cp(eris.VVL[q0:q1])
|
|
267
|
+
for p0, p1 in lib.prange(0, nvirb, vblk):
|
|
268
|
+
tmpLov = LOV[:, :, p0:p1].reshape(naux, -1)
|
|
269
|
+
eris.OVVV[:, p0:p1, q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(noccb, p1 - p0, q1 - q0)
|
|
270
|
+
vvL = None
|
|
271
|
+
LOV = None
|
|
272
|
+
|
|
273
|
+
log.timer('DF-UCCSD integral transformation', *cput0)
|
|
274
|
+
return eris
|
|
275
|
+
|
|
276
|
+
if __name__ == '__main__':
|
|
277
|
+
from pyscf import gto
|
|
278
|
+
from pyscf import scf
|
|
279
|
+
|
|
280
|
+
mol = gto.Mole()
|
|
281
|
+
mol.atom = [
|
|
282
|
+
[8 , (0. , 0. , 0.)],
|
|
283
|
+
[1 , (0. , -0.757 , 0.587)],
|
|
284
|
+
[1 , (0. , 0.757 , 0.587)]]
|
|
285
|
+
|
|
286
|
+
mol.basis = 'cc-pvdz'
|
|
287
|
+
mol.build()
|
|
288
|
+
mf = scf.UHF(mol).density_fit('weigend').run()
|
|
289
|
+
mycc = UCCSD(mf).run()
|
|
290
|
+
print(mycc.e_corr - -0.2133709727796199)
|
|
291
|
+
|
|
292
|
+
print("IP energies... (right eigenvector)")
|
|
293
|
+
e,v = mycc.ipccsd(nroots=8)
|
|
294
|
+
print(e)
|
|
295
|
+
print(e[0] - 0.4336428577342009)
|
|
296
|
+
print(e[2] - 0.5188000951518845)
|
|
297
|
+
print(e[4] - 0.6785158684375829)
|
|
298
|
+
|
|
299
|
+
print("EA energies... (right eigenvector)")
|
|
300
|
+
e,v = mycc.eaccsd(nroots=8)
|
|
301
|
+
print(e)
|
|
302
|
+
print(e[0] - 0.1673013569134136)
|
|
303
|
+
print(e[2] - 0.2399984284491973)
|
|
304
|
+
print(e[4] - 0.5096018470162480)
|
|
305
|
+
|
|
306
|
+
e, v = mycc.eeccsd(nroots=4)
|
|
307
|
+
print(e[0] - 0.2757563806054133)
|
|
308
|
+
print(e[1] - 0.2757563806171079)
|
|
309
|
+
print(e[2] - 0.2757563806183815)
|
|
310
|
+
print(e[3] - 0.3006896721085447)
|
pyscf/cc/rccsd.py
CHANGED
|
@@ -247,7 +247,11 @@ def _make_eris_incore(mycc, mo_coeff=None, ao2mofn=None):
|
|
|
247
247
|
eri1 = ao2mofn(eris.mo_coeff).reshape([nmo]*4)
|
|
248
248
|
else:
|
|
249
249
|
eri1 = ao2mo.incore.full(mycc._scf._eri, eris.mo_coeff)
|
|
250
|
-
|
|
250
|
+
if mycc._scf._eri.size == nmo**4:
|
|
251
|
+
# The N^4-sized full integral tensor.
|
|
252
|
+
eri1 = eri1.reshape([nmo]*4)
|
|
253
|
+
else:
|
|
254
|
+
eri1 = ao2mo.restore(1, eri1, nmo)
|
|
251
255
|
eris.oooo = eri1[:nocc,:nocc,:nocc,:nocc].copy()
|
|
252
256
|
eris.ovoo = eri1[:nocc,nocc:,:nocc,:nocc].copy()
|
|
253
257
|
eris.ovov = eri1[:nocc,nocc:,:nocc,nocc:].copy()
|
pyscf/cc/uccsd.py
CHANGED
|
@@ -236,8 +236,8 @@ def update_amps(cc, t1, t2, eris):
|
|
|
236
236
|
u1a -= np.einsum('imea,me->ia', t2aa, Fova)
|
|
237
237
|
u1a += np.einsum('iMaE,ME->ia', t2ab, Fovb)
|
|
238
238
|
u1b += fovb.conj()
|
|
239
|
-
u1b += np.einsum('ie,ae->ia',t1b,Fvvb)
|
|
240
|
-
u1b -= np.einsum('ma,mi->ia',t1b,Foob)
|
|
239
|
+
u1b += np.einsum('ie,ae->ia', t1b, Fvvb)
|
|
240
|
+
u1b -= np.einsum('ma,mi->ia', t1b, Foob)
|
|
241
241
|
u1b -= np.einsum('imea,me->ia', t2bb, Fovb)
|
|
242
242
|
u1b += np.einsum('mIeA,me->IA', t2ab, Fova)
|
|
243
243
|
|
|
@@ -246,8 +246,8 @@ def update_amps(cc, t1, t2, eris):
|
|
|
246
246
|
wovvo -= eris_oovv.transpose(0,2,3,1)
|
|
247
247
|
wovvo += eris_ovvo.transpose(0,2,1,3)
|
|
248
248
|
oovv = eris_oovv - eris_ovvo.transpose(0,3,2,1)
|
|
249
|
-
u1a-= np.einsum('nf,niaf->ia', t1a,
|
|
250
|
-
tmp1aa = lib.einsum('ie,mjbe->mbij', t1a,
|
|
249
|
+
u1a-= np.einsum('nf,niaf->ia', t1a, oovv)
|
|
250
|
+
tmp1aa = lib.einsum('ie,mjbe->mbij', t1a, oovv)
|
|
251
251
|
u2aa += 2*lib.einsum('ma,mbij->ijab', t1a, tmp1aa)
|
|
252
252
|
eris_ovvo = eris_oovv = oovv = tmp1aa = None
|
|
253
253
|
|
|
@@ -256,8 +256,8 @@ def update_amps(cc, t1, t2, eris):
|
|
|
256
256
|
wOVVO -= eris_OOVV.transpose(0,2,3,1)
|
|
257
257
|
wOVVO += eris_OVVO.transpose(0,2,1,3)
|
|
258
258
|
OOVV = eris_OOVV - eris_OVVO.transpose(0,3,2,1)
|
|
259
|
-
u1b-= np.einsum('nf,niaf->ia', t1b,
|
|
260
|
-
tmp1bb = lib.einsum('ie,mjbe->mbij', t1b,
|
|
259
|
+
u1b-= np.einsum('nf,niaf->ia', t1b, OOVV)
|
|
260
|
+
tmp1bb = lib.einsum('ie,mjbe->mbij', t1b, OOVV)
|
|
261
261
|
u2bb += 2*lib.einsum('ma,mbij->ijab', t1b, tmp1bb)
|
|
262
262
|
eris_OVVO = eris_OOVV = OOVV = None
|
|
263
263
|
|
|
@@ -356,16 +356,16 @@ def energy(cc, t1=None, t2=None, eris=None):
|
|
|
356
356
|
fovb = eris.fockb[:noccb,noccb:]
|
|
357
357
|
e = np.einsum('ia,ia', fova, t1a)
|
|
358
358
|
e += np.einsum('ia,ia', fovb, t1b)
|
|
359
|
-
e += 0.25*np.einsum('ijab,iajb',t2aa,eris_ovov)
|
|
360
|
-
e -= 0.25*np.einsum('ijab,ibja',t2aa,eris_ovov)
|
|
361
|
-
e += 0.25*np.einsum('ijab,iajb',t2bb,eris_OVOV)
|
|
362
|
-
e -= 0.25*np.einsum('ijab,ibja',t2bb,eris_OVOV)
|
|
363
|
-
e += np.einsum('iJaB,iaJB',t2ab,eris_ovOV)
|
|
364
|
-
e += 0.5*
|
|
365
|
-
e -= 0.5*
|
|
366
|
-
e += 0.5*
|
|
367
|
-
e -= 0.5*
|
|
368
|
-
e +=
|
|
359
|
+
e += 0.25*np.einsum('ijab,iajb',t2aa, eris_ovov)
|
|
360
|
+
e -= 0.25*np.einsum('ijab,ibja',t2aa, eris_ovov)
|
|
361
|
+
e += 0.25*np.einsum('ijab,iajb',t2bb, eris_OVOV)
|
|
362
|
+
e -= 0.25*np.einsum('ijab,ibja',t2bb, eris_OVOV)
|
|
363
|
+
e += np.einsum('iJaB,iaJB',t2ab, eris_ovOV)
|
|
364
|
+
e += 0.5*lib.einsum('ia,jb,iajb',t1a, t1a, eris_ovov)
|
|
365
|
+
e -= 0.5*lib.einsum('ia,jb,ibja',t1a, t1a, eris_ovov)
|
|
366
|
+
e += 0.5*lib.einsum('ia,jb,iajb',t1b, t1b, eris_OVOV)
|
|
367
|
+
e -= 0.5*lib.einsum('ia,jb,ibja',t1b, t1b, eris_OVOV)
|
|
368
|
+
e += lib.einsum('ia,jb,iajb',t1a, t1b, eris_ovOV)
|
|
369
369
|
if abs(e.imag) > 1e-4:
|
|
370
370
|
logger.warn(cc, 'Non-zero imaginary part found in UCCSD energy %s', e)
|
|
371
371
|
return e.real
|
|
@@ -687,11 +687,10 @@ class UCCSD(ccsd.CCSDBase):
|
|
|
687
687
|
return _make_eris_incore(self, mo_coeff)
|
|
688
688
|
|
|
689
689
|
elif getattr(self._scf, 'with_df', None):
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
# 'DF-CCSD calculations')
|
|
690
|
+
logger.warn(self, 'UCCSD detected DF being used in the HF object. '
|
|
691
|
+
'MO integrals are computed based on the DF 3-index tensors.\n'
|
|
692
|
+
'It\'s recommended to use dfuccsd.UCCSD for the '
|
|
693
|
+
'DF-UCCSD calculations')
|
|
695
694
|
return _make_df_eris_outcore(self, mo_coeff)
|
|
696
695
|
else:
|
|
697
696
|
return _make_eris_outcore(self, mo_coeff)
|
|
@@ -732,6 +731,16 @@ class UCCSD(ccsd.CCSDBase):
|
|
|
732
731
|
from pyscf.cc import eom_uccsd
|
|
733
732
|
return eom_uccsd.EOMEE(self)
|
|
734
733
|
|
|
734
|
+
def density_fit(self, auxbasis=None, with_df=None):
|
|
735
|
+
from pyscf.cc import dfuccsd
|
|
736
|
+
mycc = dfuccsd.UCCSD(self._scf, self.frozen, self.mo_coeff, self.mo_occ)
|
|
737
|
+
if with_df is not None:
|
|
738
|
+
mycc.with_df = with_df
|
|
739
|
+
if mycc.with_df.auxbasis != auxbasis:
|
|
740
|
+
mycc.with_df = mycc.with_df.copy()
|
|
741
|
+
mycc.with_df.auxbasis = auxbasis
|
|
742
|
+
return mycc
|
|
743
|
+
|
|
735
744
|
def nuc_grad_method(self):
|
|
736
745
|
from pyscf.grad import uccsd
|
|
737
746
|
return uccsd.Gradients(self)
|
pyscf/df/addons.py
CHANGED
|
@@ -52,8 +52,10 @@ DEFAULT_AUXBASIS = {
|
|
|
52
52
|
'def2svp' : ('def2-svp-jkfit' , 'def2-svp-ri' ),
|
|
53
53
|
'def2svpd' : ('def2-svp-jkfit' , 'def2-svpd-ri' ),
|
|
54
54
|
'def2tzvp' : ('def2-tzvp-jkfit' , 'def2-tzvp-ri' ),
|
|
55
|
+
'def2mtzvp' : ('def2-tzvp-jkfit' , 'def2-tzvp-ri' ),
|
|
55
56
|
'def2tzvpd' : ('def2-tzvp-jkfit' , 'def2-tzvpd-ri' ),
|
|
56
57
|
'def2tzvpp' : ('def2-tzvpp-jkfit' , 'def2-tzvpp-ri' ),
|
|
58
|
+
'def2mtzvpp' : ('def2-tzvpp-jkfit' , 'def2-tzvpp-ri' ),
|
|
57
59
|
'def2tzvppd' : ('def2-tzvpp-jkfit' , 'def2-tzvppd-ri' ),
|
|
58
60
|
'def2qzvp' : ('def2-qzvp-jkfit' , 'def2-qzvp-ri' ),
|
|
59
61
|
'def2qzvpd' : ('def2-qzvp-jkfit' , None ),
|
|
@@ -174,6 +176,9 @@ def make_auxbasis(mol, mp2fit=False):
|
|
|
174
176
|
_basis = {a: default_basis for a in uniq_atoms}
|
|
175
177
|
_basis.update(mol.basis)
|
|
176
178
|
del (_basis['default'])
|
|
179
|
+
elif (isinstance(mol.basis, dict) and
|
|
180
|
+
all([isinstance(basis, str) for basis in mol.basis.values()])):
|
|
181
|
+
_basis = {a: mol.basis[a] for a in uniq_atoms}
|
|
177
182
|
else:
|
|
178
183
|
_basis = mol._basis or {}
|
|
179
184
|
|
|
@@ -191,7 +196,7 @@ def make_auxbasis(mol, mp2fit=False):
|
|
|
191
196
|
if auxb is not None:
|
|
192
197
|
try:
|
|
193
198
|
# Test if basis auxb for element k is available
|
|
194
|
-
gto.basis.load(auxb, k)
|
|
199
|
+
gto.basis.load(auxb, elements._std_symbol_without_ghost(k))
|
|
195
200
|
except BasisNotFoundError:
|
|
196
201
|
pass
|
|
197
202
|
else:
|
pyscf/df/df_jk.py
CHANGED
|
@@ -258,6 +258,33 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):
|
|
|
258
258
|
vj = 0
|
|
259
259
|
vk = numpy.zeros_like(dms)
|
|
260
260
|
|
|
261
|
+
if numpy.iscomplexobj(dms):
|
|
262
|
+
if with_j:
|
|
263
|
+
vj = numpy.zeros_like(dms)
|
|
264
|
+
max_memory = dfobj.max_memory - lib.current_memory()[0]
|
|
265
|
+
blksize = max(4, int(min(dfobj.blockdim, max_memory*.22e6/8/nao**2)))
|
|
266
|
+
buf = numpy.empty((blksize,nao,nao))
|
|
267
|
+
buf1 = numpy.empty((nao,blksize,nao))
|
|
268
|
+
for eri1 in dfobj.loop(blksize):
|
|
269
|
+
naux, nao_pair = eri1.shape
|
|
270
|
+
eri1 = lib.unpack_tril(eri1, out=buf)
|
|
271
|
+
if with_j:
|
|
272
|
+
tmp = numpy.einsum('pij,nji->pn', eri1, dms.real)
|
|
273
|
+
vj.real += numpy.einsum('pn,pij->nij', tmp, eri1)
|
|
274
|
+
tmp = numpy.einsum('pij,nji->pn', eri1, dms.imag)
|
|
275
|
+
vj.imag += numpy.einsum('pn,pij->nij', tmp, eri1)
|
|
276
|
+
buf2 = numpy.ndarray((nao,naux,nao), buffer=buf1)
|
|
277
|
+
for k in range(nset):
|
|
278
|
+
buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].real)
|
|
279
|
+
vk[k].real += lib.einsum('ipk,pkj->ij', buf2, eri1)
|
|
280
|
+
buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].imag)
|
|
281
|
+
vk[k].imag += lib.einsum('ipk,pkj->ij', buf2, eri1)
|
|
282
|
+
t1 = log.timer_debug1('jk', *t1)
|
|
283
|
+
if with_j: vj = vj.reshape(dm_shape)
|
|
284
|
+
if with_k: vk = vk.reshape(dm_shape)
|
|
285
|
+
logger.timer(dfobj, 'df vj and vk', *t0)
|
|
286
|
+
return vj, vk
|
|
287
|
+
|
|
261
288
|
if with_j:
|
|
262
289
|
idx = numpy.arange(nao)
|
|
263
290
|
dmtril = lib.pack_tril(dms + dms.conj().transpose(0,2,1))
|
|
@@ -322,6 +349,7 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):
|
|
|
322
349
|
buf = numpy.empty((2,blksize,nao,nao))
|
|
323
350
|
for eri1 in dfobj.loop(blksize):
|
|
324
351
|
naux, nao_pair = eri1.shape
|
|
352
|
+
assert (nao_pair == nao*(nao+1)//2)
|
|
325
353
|
if with_j:
|
|
326
354
|
# uses numpy.matmul
|
|
327
355
|
vj += dmtril.dot(eri1.T).dot(eri1)
|
|
@@ -388,6 +416,7 @@ def get_j(dfobj, dm, hermi=0, direct_scf_tol=1e-13):
|
|
|
388
416
|
opt = dfobj._vjopt
|
|
389
417
|
fakemol = opt.fakemol
|
|
390
418
|
dm = numpy.asarray(dm, order='C')
|
|
419
|
+
assert dm.dtype == numpy.float64
|
|
391
420
|
dm_shape = dm.shape
|
|
392
421
|
nao = dm_shape[-1]
|
|
393
422
|
dm = dm.reshape(-1,nao,nao)
|
pyscf/df/hessian/uhf.py
CHANGED
|
@@ -465,9 +465,9 @@ def _gen_jk(hessobj, mo_coeff, mo_occ, chkfile=None, atmlst=None,
|
|
|
465
465
|
vj1_buf[i] += np.einsum('xp,pij->xij', wj1, coef3c)
|
|
466
466
|
if with_k:
|
|
467
467
|
rhok0_PlJ = lib.einsum('plj,Jj->plJ', rhok0a_Pl_[p0:p1], mocca)
|
|
468
|
-
vk1a_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ
|
|
468
|
+
vk1a_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ)
|
|
469
469
|
rhok0_PlJ = lib.einsum('plj,Jj->plJ', rhok0b_Pl_[p0:p1], moccb)
|
|
470
|
-
vk1b_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ
|
|
470
|
+
vk1b_buf += lib.einsum('xijp,plj->xil', int3c_ip1, rhok0_PlJ)
|
|
471
471
|
int3c_ip1 = None
|
|
472
472
|
vj1_buf = ftmp['vj1_buf'] = vj1_buf
|
|
473
473
|
|
pyscf/df/incore.py
CHANGED
|
@@ -62,7 +62,7 @@ def aux_e2(mol, auxmol_or_auxbasis, intor='int3c2e', aosym='s1', comp=None, out=
|
|
|
62
62
|
mol.nbas, mol.nbas+auxmol.nbas)
|
|
63
63
|
else:
|
|
64
64
|
assert len(shls_slice) == 6
|
|
65
|
-
assert shls_slice[5]
|
|
65
|
+
assert shls_slice[5] <= auxmol.nbas
|
|
66
66
|
shls_slice = list(shls_slice)
|
|
67
67
|
shls_slice[4] += mol.nbas
|
|
68
68
|
shls_slice[5] += mol.nbas
|
pyscf/dft/libxc.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/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)
|