def _add_vvvv(self, c2, eris, out=None, t2sym=None): return ccsd._add_vvvv(self, None, c2, eris, out, False, t2sym)
def update_amps(mycc, t1, t2, eris): assert (isinstance(eris, _ChemistsERIs)) time0 = logger.process_clock(), logger.perf_counter() log = logger.Logger(mycc.stdout, mycc.verbose) nocc, nvir = t1.shape fock = eris.fock mo_e_o = eris.mo_energy[:nocc] mo_e_v = eris.mo_energy[nocc:] + mycc.level_shift t1new = numpy.zeros_like(t1) t2new = _add_vvvv(mycc, 0 * t1, t2, eris, t2sym='jiba') t2new *= .5 # *.5 because t2+t2.transpose(1,0,3,2) in the end time1 = log.timer_debug1('vvvv', *time0) #** make_inter_F fov = fock[:nocc, nocc:].copy() t1new += fov foo = fock[:nocc, :nocc] - numpy.diag(mo_e_o) fvv = fock[nocc:, nocc:] - numpy.diag(mo_e_v) if mycc.incore_complete: fswap = None else: fswap = lib.H5TmpFile() fwVOov, fwVooV = _add_ovvv_(mycc, t1, t2, eris, fvv, t1new, t2new, fswap) time1 = log.timer_debug1('ovvv', *time1) woooo = numpy.asarray(eris.oooo).transpose(0, 2, 1, 3).copy() unit = nocc**2 * nvir * 7 + nocc**3 + nocc * nvir**2 mem_now = lib.current_memory()[0] max_memory = max(0, mycc.max_memory - mem_now) blksize = min(nvir, max(BLKMIN, int((max_memory * .9e6 / 8 - nocc**4) / unit))) log.debug1('max_memory %d MB, nocc,nvir = %d,%d blksize = %d', max_memory, nocc, nvir, blksize) for p0, p1 in lib.prange(0, nvir, blksize): wVOov = fwVOov[p0:p1] wVooV = fwVooV[p0:p1] eris_ovoo = eris.ovoo[:, p0:p1] eris_oovv = numpy.empty((nocc, nocc, p1 - p0, nvir)) def load_oovv(p0, p1): eris_oovv[:] = eris.oovv[:, :, p0:p1] with lib.call_in_background(load_oovv, sync=not mycc.async_io) as prefetch_oovv: #:eris_oovv = eris.oovv[:,:,p0:p1] prefetch_oovv(p0, p1) wVOov -= lib.einsum('jbik,ka->bjia', eris_ovoo, t1) t2new[:, :, p0:p1] += wVOov.transpose(1, 2, 0, 3) eris_ovoo = None load_oovv = prefetch_oovv = None wVOov *= 0 # QCI eris_ovvo = numpy.empty((nocc, p1 - p0, nvir, nocc)) def load_ovvo(p0, p1): eris_ovvo[:] = eris.ovvo[:, p0:p1] with lib.call_in_background(load_ovvo, sync=not mycc.async_io) as prefetch_ovvo: #:eris_ovvo = eris.ovvo[:,p0:p1] prefetch_ovvo(p0, p1) t1new[:, p0:p1] -= numpy.einsum('jb,jiab->ia', t1, eris_oovv) wVooV -= eris_oovv.transpose(2, 0, 1, 3) wVOov += wVooV * .5 #: bjia + bija*.5 load_ovvo = prefetch_ovvo = None t2new[:, :, p0:p1] += (eris_ovvo * 0.5).transpose(0, 3, 1, 2) eris_voov = eris_ovvo.conj().transpose(1, 0, 3, 2) t1new[:, p0:p1] += 2 * numpy.einsum('jb,aijb->ia', t1, eris_voov) eris_ovvo = None eris_oovv = tmp = None fov[:, p0:p1] += numpy.einsum('kc,aikc->ia', t1, eris_voov) * 2 fov[:, p0:p1] -= numpy.einsum('kc,akic->ia', t1, eris_voov) tau = t2[:, :, p0:p1] theta = tau.transpose(1, 0, 2, 3) * 2 theta -= tau fvv -= lib.einsum('cjia,cjib->ab', theta.transpose(2, 1, 0, 3), eris_voov) foo += lib.einsum('aikb,kjab->ij', eris_voov, theta) theta = None woooo += lib.einsum('ijab,aklb->ijkl', tau, eris_voov) tau = None def update_wVooV(q0, q1, tau): wVooV[:] += lib.einsum('bkic,jkca->bija', eris_voov[:, :, :, q0:q1], tau) with lib.call_in_background(update_wVooV, sync=not mycc.async_io) as update_wVooV: for q0, q1 in lib.prange(0, nvir, blksize): tau = t2[:, :, q0:q1] * .5 #:wVooV += lib.einsum('bkic,jkca->bija', eris_voov[:,:,:,q0:q1], tau) update_wVooV(q0, q1, tau) tau = update_wVooV = None def update_t2(q0, q1, tmp): t2new[:, :, q0:q1] += tmp.transpose(2, 0, 1, 3) tmp *= .5 t2new[:, :, q0:q1] += tmp.transpose(0, 2, 1, 3) with lib.call_in_background(update_t2, sync=not mycc.async_io) as update_t2: for q0, q1 in lib.prange(0, nvir, blksize): tmp = lib.einsum('jkca,ckib->jaib', t2[:, :, p0:p1, q0:q1], wVooV) #:t2new[:,:,q0:q1] += tmp.transpose(2,0,1,3) #:tmp *= .5 #:t2new[:,:,q0:q1] += tmp.transpose(0,2,1,3) update_t2(q0, q1, tmp) tmp = None wVOov += eris_voov eris_VOov = -.5 * eris_voov.transpose(0, 2, 1, 3) eris_VOov += eris_voov eris_voov = None def update_wVOov(q0, q1, tau): wVOov[:, :, :, q0:q1] += .5 * lib.einsum('aikc,kcjb->aijb', eris_VOov, tau) with lib.call_in_background(update_wVOov, sync=not mycc.async_io) as update_wVOov: for q0, q1 in lib.prange(0, nvir, blksize): tau = t2[:, :, q0:q1].transpose(1, 3, 0, 2) * 2 tau -= t2[:, :, q0:q1].transpose(0, 3, 1, 2) #:wVOov[:,:,:,q0:q1] += .5 * lib.einsum('aikc,kcjb->aijb', eris_VOov, tau) update_wVOov(q0, q1, tau) tau = None def update_t2(q0, q1, theta): t2new[:, :, q0:q1] += lib.einsum('kica,ckjb->ijab', theta, wVOov) with lib.call_in_background(update_t2, sync=not mycc.async_io) as update_t2: for q0, q1 in lib.prange(0, nvir, blksize): theta = t2[:, :, p0:p1, q0:q1] * 2 theta -= t2[:, :, p0:p1, q0:q1].transpose(1, 0, 2, 3) #:t2new[:,:,q0:q1] += lib.einsum('kica,ckjb->ijab', theta, wVOov) update_t2(q0, q1, theta) theta = None eris_VOov = wVOov = wVooV = update_wVOov = None time1 = log.timer_debug1('voov [%d:%d]' % (p0, p1), *time1) fwVOov = fwVooV = fswap = None for p0, p1 in lib.prange(0, nvir, blksize): theta = t2[:, :, p0:p1].transpose(1, 0, 2, 3) * 2 - t2[:, :, p0:p1] t1new += numpy.einsum('jb,ijba->ia', fov[:, p0:p1], theta) t1new -= lib.einsum('jbki,kjba->ia', eris.ovoo[:, p0:p1], theta) tau = t2[:, :, p0:p1] t2new[:, :, p0:p1] += .5 * lib.einsum('ijkl,klab->ijab', woooo, tau) theta = tau = None t2new += lib.einsum('ijac,bc->ijab', t2, fvv) t2new -= lib.einsum('ki,kjab->ijab', foo, t2) eia = mo_e_o[:, None] - mo_e_v t1new += numpy.einsum('ib,ab->ia', t1, fvv) t1new -= numpy.einsum('ja,ji->ia', t1, foo) t1new /= eia #: t2new = t2new + t2new.transpose(1,0,3,2) for i in range(nocc): if i > 0: t2new[i, :i] += t2new[:i, i].transpose(0, 2, 1) t2new[i, :i] /= lib.direct_sum('a,jb->jab', eia[i], eia[:i]) t2new[:i, i] = t2new[i, :i].transpose(0, 2, 1) t2new[i, i] = t2new[i, i] + t2new[i, i].T t2new[i, i] /= lib.direct_sum('a,b->ab', eia[i], eia[i]) time0 = log.timer_debug1('update t1 t2', *time0) return t1new, t2new