Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if unpack:
buf = numpy.empty((min(blksize, naux), nao * (nao + 1) // 2))
for b0, b1 in lib.prange(0, naux, blksize):
LpqR, LpqI = load(j3c, b0, b1, LpqR, LpqI)
yield LpqR, LpqI, 1
if cell.dimension == 2 and cell.low_dim_ft_type != 'inf_vacuum':
# Truncated Coulomb operator is not postive definite. Load the
# CDERI tensor of negative part.
LpqR = LpqI = None
with _load3c(self._cderi, 'j3c-', kpti_kptj, 'j3c-kptij',
ignore_key_error=True) as j3c:
naux = j3c.shape[0]
if unpack:
buf = numpy.empty((min(blksize, naux), nao * (nao + 1) // 2))
for b0, b1 in lib.prange(0, naux, blksize):
LpqR, LpqI = load(j3c, b0, b1, LpqR, LpqI)
yield LpqR, LpqI, -1
energy_t = 0.0
# Get location of padded elements in occupied and virtual space
nonzero_opadding, nonzero_vpadding = padding_k_idx(mycc, kind="split")
mem_now = lib.current_memory()[0]
max_memory = max(0, mycc.max_memory - mem_now)
blkmin = 4
# temporary t3 array is size: 2 * nkpts**3 * blksize**3 * nocc**3 * 16
vir_blksize = min(nvir, max(blkmin, int((max_memory*.9e6/16/nocc**3/nkpts**3/2)**(1./3))))
tasks = []
log.debug('max_memory %d MB (%d MB in use)', max_memory, mem_now)
log.debug('virtual blksize = %d (nvir = %d)', nvir, vir_blksize)
for a0, a1 in lib.prange(0, nvir, vir_blksize):
for b0, b1 in lib.prange(0, nvir, vir_blksize):
for c0, c1 in lib.prange(0, nvir, vir_blksize):
tasks.append((a0,a1,b0,b1,c0,c1))
for ka in range(nkpts):
for kb in range(ka+1):
for task_id, task in enumerate(tasks):
a0,a1,b0,b1,c0,c1 = task
my_permuted_w = np.zeros((nkpts,)*3 + (a1-a0,b1-b0,c1-c0) + (nocc,)*3, dtype=dtype)
my_permuted_v = np.zeros((nkpts,)*3 + (a1-a0,b1-b0,c1-c0) + (nocc,)*3, dtype=dtype)
for ki, kj, kk in product(range(nkpts), repeat=3):
# Find momentum conservation condition for triples
# amplitude t3ijkabc
kc = kpts_helper.get_kconserv3(cell, kpts, [ki, kj, kk, ka, kb])
if not (ka >= kb and kb >= kc):
continue
kpt_indices = [ki,kj,kk,ka,kb,kc]
Lpq = Lvv = None
Loo = Loo.reshape(naux,nocc**2)
Lvo = Lov.transpose(0,2,1).reshape(naux,nvir*nocc)
Lov = Lov.reshape(naux,nocc*nvir)
eris.oooo[:] = lib.ddot(Loo.T, Loo).reshape(nocc,nocc,nocc,nocc)
eris.ovoo[:] = lib.ddot(Lov.T, Loo).reshape(nocc,nvir,nocc,nocc)
ovov = lib.ddot(Lov.T, Lov).reshape(nocc,nvir,nocc,nvir)
eris.ovov[:] = ovov
eris.ovvo[:] = ovov.transpose(0,1,3,2)
ovov = None
mem_now = lib.current_memory()[0]
max_memory = max(0, cc.max_memory - mem_now)
blksize = max(ccsd.BLKMIN, int((max_memory*.9e6/8-nocc**2*nvir_pair)/(nocc**2+naux)))
oovv_tril = numpy.empty((nocc*nocc,nvir_pair))
for p0, p1 in lib.prange(0, nvir_pair, blksize):
oovv_tril[:,p0:p1] = lib.ddot(Loo.T, _cp(eris.vvL[p0:p1]).T)
eris.oovv[:] = lib.unpack_tril(oovv_tril).reshape(nocc,nocc,nvir,nvir)
oovv_tril = Loo = None
Lov = Lov.reshape(naux,nocc,nvir)
vblk = max(nocc, int((max_memory*.15e6/8)/(nocc*nvir_pair)))
vvblk = int(min(nvir_pair, 4e8/nocc, max(4, (max_memory*.8e6/8)/(vblk*nocc+naux))))
eris.ovvv = eris.feri.create_dataset('ovvv', (nocc,nvir,nvir_pair), 'f8',
chunks=(nocc,1,vvblk))
for q0, q1 in lib.prange(0, nvir_pair, vvblk):
vvL = _cp(eris.vvL[q0:q1])
for p0, p1 in lib.prange(0, nvir, vblk):
tmpLov = _cp(Lov[:,:,p0:p1]).reshape(naux,-1)
eris.ovvv[:,p0:p1,q0:q1] = lib.ddot(tmpLov.T, vvL.T).reshape(nocc,p1-p0,q1-q0)
vvL = None
return eris
exps = numpy.hstack(exps)
nprim, nmo = mo_cart.shape
fout.write('From PySCF\n')
fout.write('GAUSSIAN %3d MOL ORBITALS %3d PRIMITIVES %3d NUCLEI\n'
% (mo_cart.shape[1], mo_cart.shape[0], mol.natm))
for ia in range(mol.natm):
x, y, z = mol.atom_coord(ia)
fout.write(' %-4s %-4d (CENTRE%3d) %11.8f %11.8f %11.8f CHARGE = %.1f\n'
% (mol.atom_pure_symbol(ia), ia+1, ia+1, x, y, z,
mol.atom_charge(ia)))
for i0, i1 in lib.prange(0, nprim, 20):
fout.write('CENTRE ASSIGNMENTS %s\n' % ''.join('%3d'%x for x in centers[i0:i1]))
for i0, i1 in lib.prange(0, nprim, 20):
fout.write('TYPE ASSIGNMENTS %s\n' % ''.join('%3d'%x for x in types[i0:i1]))
for i0, i1 in lib.prange(0, nprim, 5):
fout.write('EXPONENTS %s\n' % ' '.join('%13.7E'%x for x in exps[i0:i1]))
for k in range(nmo):
mo = mo_cart[:,k]
if mo_energy is None and mo_occ is None:
fout.write('CANMO %d\n' % (k+1))
elif mo_energy is None:
fout.write('MO %-4d OCC NO = %12.8f ORB. ENERGY = 0.0000\n' %
(k+1, mo_occ[k]))
else:
fout.write('MO %-4d OCC NO = %12.8f ORB. ENERGY = %12.8f\n' %
(k+1, mo_occ[k], mo_energy[k]))
for i0, i1 in lib.prange(0, nprim, 5):
fout.write(' %s\n' % ' '.join('%15.8E'%x for x in mo[i0:i1]))
fout.write('END DATA\n')
if mo_energy is None or mo_occ is None:
ctr(et_sum, a0, a1, b0, b1, (cache_row_a,cache_col_a,
cache_row_b,cache_col_b))
cpu1 = log.timer_debug1('contract_bbb', *cpu1)
# Cache t2abT in t2ab to reduce memory footprint
assert(t2ab.flags.c_contiguous)
t2abT = lib.transpose(t2ab.copy().reshape(nocca*noccb,nvira*nvirb), out=t2ab)
t2abT = t2abT.reshape(nvira,nvirb,nocca,noccb)
# baa
bufsize = int(max(12, (max_memory*.5e6/8-noccb*nocca**2*5)*.7/(nocca*nmob)))
ts = t1aT, t1bT, t2aaT, t2abT
fock = (eris.focka, eris.fockb)
vooo = (eris_vooo, eris_vOoO, eris_VoOo)
contract = _gen_contract_baa(ts, vooo, fock, eris.mo_energy, orbsym, log)
with lib.call_in_background(contract, sync=not mycc.async_io) as ctr:
for a0, a1 in lib.prange(0, nvirb, int(bufsize/nvira+1)):
cache_row_a = numpy.asarray(eris_VvOp[a0:a1,:], order='C')
cache_col_a = numpy.asarray(eris_vVoP[:,a0:a1], order='C')
for b0, b1 in lib.prange_tril(0, nvira, bufsize/6/2):
cache_row_b = numpy.asarray(eris_vvop[b0:b1,:b1], order='C')
cache_col_b = numpy.asarray(eris_vvop[:b0,b0:b1], order='C')
ctr(et_sum, a0, a1, b0, b1, (cache_row_a,cache_col_a,
cache_row_b,cache_col_b))
cpu1 = log.timer_debug1('contract_baa', *cpu1)
t2baT = numpy.ndarray((nvirb,nvira,noccb,nocca), buffer=t2abT,
dtype=t2abT.dtype)
t2baT[:] = t2abT.copy().transpose(1,0,3,2)
# abb
ts = t1bT, t1aT, t2bbT, t2baT
fock = (eris.fockb, eris.focka)
mo_energy = (eris.mo_energy[1], eris.mo_energy[0])
exps = numpy.hstack(exps)
nprim, nmo = mo_cart.shape
fout.write('From PySCF\n')
fout.write('GAUSSIAN %3d MOL ORBITALS %3d PRIMITIVES %3d NUCLEI\n'
% (mo_cart.shape[1], mo_cart.shape[0], mol.natm))
for ia in range(mol.natm):
x, y, z = mol.atom_coord(ia)
fout.write(' %-4s %-4d (CENTRE%3d) %11.8f %11.8f %11.8f CHARGE = %.1f\n'
% (mol.atom_pure_symbol(ia), ia+1, ia+1, x, y, z,
mol.atom_charge(ia)))
for i0, i1 in lib.prange(0, nprim, 20):
fout.write('CENTRE ASSIGNMENTS %s\n' % ''.join('%3d'%x for x in centers[i0:i1]))
for i0, i1 in lib.prange(0, nprim, 20):
fout.write('TYPE ASSIGNMENTS %s\n' % ''.join('%3d'%x for x in types[i0:i1]))
for i0, i1 in lib.prange(0, nprim, 5):
fout.write('EXPONENTS %s\n' % ' '.join('%13.7E'%x for x in exps[i0:i1]))
for k in range(nmo):
mo = mo_cart[:,k]
if mo_energy is None and mo_occ is None:
fout.write('CANMO %d\n' % (k+1))
elif mo_energy is None:
fout.write('MO %-4d OCC NO = %12.8f ORB. ENERGY = 0.0000\n' %
(k+1, mo_occ[k]))
else:
fout.write('MO %-4d OCC NO = %12.8f ORB. ENERGY = %12.8f\n' %
(k+1, mo_occ[k], mo_energy[k]))
for i0, i1 in lib.prange(0, nprim, 5):
fout.write(' %s\n' % ' '.join('%15.8E'%x for x in mo[i0:i1]))
fout.write('END DATA\n')
if mo_energy is None or mo_occ is None:
theta = None
wVOov = lib.einsum('jbcd,kd->bjkc', eris_ovvv, t1)
wvOOv = lib.einsum('cbjd,kd->cjkb', eris_vvov,-t1)
g2vovv = eris_vvov.transpose(0,2,1,3) * 2 - eris_vvov.transpose(0,2,3,1)
for i0, i1 in lib.prange(0, nocc, blksize):
tau = t2[:,i0:i1] + numpy.einsum('ia,jb->ijab', t1, t1[i0:i1])
wvooo[p0:p1,i0:i1] += lib.einsum('cibd,jkbd->ckij', g2vovv, tau)
g2vovv = tau = None
# Watch out memory usage here, due to the t2 transpose
wvvov = lib.einsum('jabd,jkcd->abkc', eris_ovvv, t2) * -1.5
wvvov += eris_vvov.transpose(0,3,2,1) * 2
wvvov -= eris_vvov
g2vvov = eris_vvov * 2 - eris_ovvv.transpose(1,2,0,3)
for i0, i1 in lib.prange(0, nocc, blksize):
theta = t2[i0:i1] * 2 - t2[i0:i1].transpose(0,1,3,2)
vackb = lib.einsum('acjd,kjbd->ackb', g2vvov, theta)
wvvov[:,:,i0:i1] += vackb.transpose(0,3,2,1)
wvvov[:,:,i0:i1] -= vackb * .5
g2vvov = eris_ovvv = eris_vvov = theta = None
eris_ovoo = _cp(eris.ovoo[:,p0:p1])
w2 += numpy.einsum('kbij,kb->ij', eris_ovoo, t1[:,p0:p1]) * 2
w2 -= numpy.einsum('ibkj,kb->ij', eris_ovoo, t1[:,p0:p1])
theta = t2[:,:,p0:p1].transpose(1,0,2,3) * 2 - t2[:,:,p0:p1]
w3 -= lib.einsum('lckj,klcb->bj', eris_ovoo, theta)
tmp = lib.einsum('lc,jcik->ijkl', t1[:,p0:p1], eris_ovoo)
woooo += tmp
woooo += tmp.transpose(1,0,3,2)
theta = tmp = None
l2new -= lib.einsum('jbki,ka->jiba', eris_ovoo, l1)
eris_ovoo = None
tau = _ccsd.make_tau(t2, t1, t1)
l2tau = lib.einsum('ijcd,klcd->ijkl', l2, tau)
tau = None
l2t1 = lib.einsum('jidc,kc->ijkd', l2, t1)
max_memory = max(0, mycc.max_memory - lib.current_memory()[0])
unit = nocc*nvir**2*5
blksize = min(nocc, max(ccsd.BLKMIN, int(max_memory*.95e6/8/unit)))
log.debug1('block size = %d, nocc = %d is divided into %d blocks',
blksize, nocc, int((nocc+blksize-1)/blksize))
l1new -= numpy.einsum('jb,jiab->ia', l1, _cp(eris.oovv))
for p0, p1 in lib.prange(0, nvir, blksize):
eris_ovvv = eris.get_ovvv(slice(None), slice(p0,p1))
l1new[:,p0:p1] += numpy.einsum('iabc,bc->ia', eris_ovvv, mba1) * 2
l1new -= numpy.einsum('ibca,bc->ia', eris_ovvv, mba1[p0:p1])
l2new[:,:,p0:p1] += lib.einsum('jbac,ic->jiba', eris_ovvv, l1)
m4 = lib.einsum('ijkd,kadb->ijab', l2t1, eris_ovvv)
l2new[:,:,p0:p1] -= m4
l1new[:,p0:p1] -= numpy.einsum('ijab,jb->ia', m4, t1) * 2
l1new -= numpy.einsum('ijab,ia->jb', m4, t1[:,p0:p1]) * 2
l1new[:,p0:p1] += numpy.einsum('jiab,jb->ia', m4, t1)
l1new += numpy.einsum('jiab,ia->jb', m4, t1[:,p0:p1])
eris_ovvv = m4 = None
eris_voov = _cp(eris.ovvo[:,p0:p1].transpose(1,0,3,2))
l1new[:,p0:p1] += numpy.einsum('jb,aijb->ia', l1, eris_voov) * 2
l2new[:,:,p0:p1] += eris_voov.transpose(1,2,0,3) * .5
l2new[:,:,p0:p1] -= lib.einsum('bjic,ca->jiba', eris_voov, mba1)
Hr2aaba -= lib.einsum('mbij,mA->ijAb', imds.wovoo, r1ab*.5)
Hr1ab -= 0.5*lib.einsum('mine,mnAe->iA', imds.wooov, r2aaba)
Hr1ab -= lib.einsum('miNE,mNAE->iA', imds.wooOV, r2abbb)
Hr1ba -= 0.5*lib.einsum('MINE,MNaE->Ia', imds.wOOOV, r2bbab)
Hr1ba -= lib.einsum('MIne,Mnae->Ia', imds.wOOov, r2baaa)
tmp1ab = lib.einsum('MIne,Me->nI', imds.wOOov, r1ba)
tmp1ba = lib.einsum('miNE,mE->Ni', imds.wooOV, r1ab)
Hr2baaa += lib.einsum('nI,njab->Ijab', tmp1ab*.5, t2aa)
Hr2bbab += lib.einsum('nI,nJaB->IJaB', tmp1ab , t2ab)
Hr2abbb += lib.einsum('Ni,NJAB->iJAB', tmp1ba*.5, t2bb)
Hr2aaba += lib.einsum('Ni,jNbA->ijAb', tmp1ba , t2ab)
for p0, p1 in lib.prange(0, nvira, nocca):
Hr2baaa += lib.einsum('ejab,Ie->Ijab', imds.wvovv[p0:p1], r1ba[:,p0:p1]*.5)
Hr2bbab += lib.einsum('eJaB,Ie->IJaB', imds.wvOvV[p0:p1], r1ba[:,p0:p1] )
for p0, p1 in lib.prange(0, nvirb, noccb):
Hr2abbb += lib.einsum('EJAB,iE->iJAB', imds.wVOVV[p0:p1], r1ab[:,p0:p1]*.5)
Hr2aaba += lib.einsum('EjAb,iE->ijAb', imds.wVoVv[p0:p1], r1ab[:,p0:p1] )
Hr1ab += np.einsum('mAEi,mE->iA', imds.woVVo, r1ab)
Hr1ba += np.einsum('MaeI,Me->Ia', imds.wOvvO, r1ba)
Hr2baaa += lib.einsum('mbej,Imae->Ijab', imds.wovvo, r2baaa)
Hr2baaa += lib.einsum('MbeJ,Miae->Jiab', imds.wOvvO, r2baaa)
Hr2baaa += lib.einsum('MbEj,IMaE->Ijab', imds.wOvVo, r2bbab)
Hr2bbab += lib.einsum('MBEJ,IMaE->IJaB', imds.wOVVO, r2bbab)
Hr2bbab += lib.einsum('MbeJ,IMeA->IJbA', imds.wOvvO, r2bbab)
Hr2bbab += lib.einsum('mBeJ,Imae->IJaB', imds.woVvO, r2baaa)
Hr2aaba += lib.einsum('mbej,imAe->ijAb', imds.wovvo, r2aaba)
Hr2aaba += lib.einsum('mBEj,imEa->ijBa', imds.woVVo, r2aaba)
Hr2aaba += lib.einsum('MbEj,iMAE->ijAb', imds.wOvVo, r2abbb)
Hr2abbb += lib.einsum('MBEJ,iMAE->iJAB', imds.wOVVO, r2abbb)
Hr2abbb += lib.einsum('mBEj,mIAE->jIAB', imds.woVVo, r2abbb)
Hr1 += np.einsum('me,imae->ia',imds.Fov, rho)
#:eris_vvvv = ao2mo.restore(1,np.asarray(eris.vvvv), t1.shape[1])
#:Hr2 += lib.einsum('ijef,aebf->ijab', tau2, eris_vvvv) * .5
tau2 = _make_tau(r2, r1, t1, fac=2)
Hr2 = eom._cc._add_vvvv(None, tau2, eris, with_ovvv=False, t2sym='jiba')
Hr2 *= .5
Hr2 += lib.einsum('mnij,mnab->ijab', imds.woOoO, r2) * .5
Hr2 += lib.einsum('be,ijae->ijab', imds.Fvv , r2)
Hr2 -= lib.einsum('mj,imab->ijab', imds.Foo , r2)
mem_now = lib.current_memory()[0]
max_memory = max(0, lib.param.MAX_MEMORY - mem_now)
blksize = min(nocc, max(ccsd.BLKMIN, int(max_memory*1e6/8/(nvir**3*3))))
for p0,p1 in lib.prange(0, nocc, blksize):
ovvv = eris.get_ovvv(slice(p0,p1)) # ovvv = eris.ovvv[p0:p1]
Hr1 += lib.einsum('mfae,imef->ia', ovvv, rho[:,p0:p1])
tmp = lib.einsum('meaf,ijef->maij', ovvv, tau2)
Hr2 -= lib.einsum('ma,mbij->ijab', t1[p0:p1], tmp)
tmp = lib.einsum('meaf,me->af', ovvv, r1[p0:p1]) * 2
tmp -= lib.einsum('mfae,me->af', ovvv, r1[p0:p1])
Hr2 += lib.einsum('af,ijfb->ijab', tmp, t2)
ovvv = tmp = None
Hr2 -= lib.einsum('mbij,ma->ijab', imds.woVoO, r1)
Hr1-= lib.einsum('mnie,mnae->ia', imds.woOoV, rho)
tmp = lib.einsum('nmie,me->ni', imds.woOoV, r1) * 2
tmp-= lib.einsum('mnie,me->ni', imds.woOoV, r1)
Hr2 -= lib.einsum('ni,njab->ijab', tmp, t2)
tmp = None
for p0, p1 in lib.prange(0, nvir, nocc):