def _contract_vvVV_t2(self, mycc, t2, vvvv_or_direct=False, out=None, verbose=None): if isinstance(vvvv_or_direct, np.ndarray): vvvv = vvvv_or_direct elif vvvv_or_direct: vvvv = None else: vvvv = self.vvVV return ccsd._contract_vvvv_t2(mycc, self.mol, vvvv, t2, out, verbose)
def _contract_vvVV_t2(self, mycc, t2, vvvv_or_direct=False, out=None, verbose=None): if isinstance(vvvv_or_direct, np.ndarray): vvvv = vvvv_or_direct elif vvvv_or_direct: vvvv = None else: vvvv = self.vvVV return ccsd._contract_vvvv_t2(mycc, self.mol, vvvv, t2, out, verbose)
def _add_vvvv(mycc, t1, t2, eris, out=None, with_ovvv=False, t2sym=None): time0 = time.clock(), time.time() log = logger.Logger(mycc.stdout, mycc.verbose) if t1 is None: t2aa, t2ab, t2bb = t2 else: t2aa, t2ab, t2bb = make_tau(t2, t1, t1) nocca, nvira = t2aa.shape[1:3] noccb, nvirb = t2bb.shape[1:3] if mycc.direct: assert (t2sym is None) if with_ovvv: raise NotImplementedError if getattr(eris, 'mo_coeff', None) is not None: mo_a, mo_b = eris.mo_coeff else: moidxa, moidxb = mycc.get_frozen_mask() mo_a = mycc.mo_coeff[0][:, moidxa] mo_b = mycc.mo_coeff[1][:, moidxb] nao = mo_a.shape[0] otrila = np.tril_indices(nocca, -1) otrilb = np.tril_indices(noccb, -1) if nocca > 1: tauaa = lib.einsum('xab,pa->xpb', t2aa[otrila], mo_a[:, nocca:]) tauaa = lib.einsum('xab,pb->xap', tauaa, mo_a[:, nocca:]) else: tauaa = np.zeros((0, nao, nao)) if noccb > 1: taubb = lib.einsum('xab,pa->xpb', t2bb[otrilb], mo_b[:, noccb:]) taubb = lib.einsum('xab,pb->xap', taubb, mo_b[:, noccb:]) else: taubb = np.zeros((0, nao, nao)) tauab = lib.einsum('ijab,pa->ijpb', t2ab, mo_a[:, nocca:]) tauab = lib.einsum('ijab,pb->ijap', tauab, mo_b[:, noccb:]) tau = np.vstack((tauaa, taubb, tauab.reshape(nocca * noccb, nao, nao))) tauaa = taubb = tauab = None time0 = log.timer_debug1('vvvv-tau', *time0) buf = ccsd._contract_vvvv_t2(mycc, mycc.mol, None, tau, out, log) mo = np.asarray(np.hstack((mo_a[:, nocca:], mo_b[:, noccb:])), order='F') u2aa = np.zeros_like(t2aa) if nocca > 1: u2tril = buf[:otrila[0].size] u2tril = _ao2mo.nr_e2(u2tril.reshape(-1, nao**2), mo.conj(), (0, nvira, 0, nvira), 's1', 's1') u2tril = u2tril.reshape(otrila[0].size, nvira, nvira) u2aa[otrila[1], otrila[0]] = u2tril.transpose(0, 2, 1) u2aa[otrila] = u2tril u2bb = np.zeros_like(t2bb) if noccb > 1: u2tril = buf[otrila[0].size:otrila[0].size + otrilb[0].size] u2tril = _ao2mo.nr_e2(u2tril.reshape(-1, nao**2), mo.conj(), (nvira, nvira + nvirb, nvira, nvira + nvirb), 's1', 's1') u2tril = u2tril.reshape(otrilb[0].size, nvirb, nvirb) u2bb[otrilb[1], otrilb[0]] = u2tril.transpose(0, 2, 1) u2bb[otrilb] = u2tril u2ab = _ao2mo.nr_e2( buf[-nocca * noccb:].reshape(nocca * noccb, nao**2), mo, (0, nvira, nvira, nvira + nvirb), 's1', 's1') u2ab = u2ab.reshape(t2ab.shape) else: assert (not with_ovvv) if t2sym is None: tmp = eris._contract_vvvv_t2(mycc, t2aa[np.tril_indices(nocca)], mycc.direct, None) u2aa = ccsd._unpack_t2_tril(tmp, nocca, nvira, None, 'jiba') tmp = eris._contract_VVVV_t2(mycc, t2bb[np.tril_indices(noccb)], mycc.direct, None) u2bb = ccsd._unpack_t2_tril(tmp, noccb, nvirb, None, 'jiba') u2ab = eris._contract_vvVV_t2(mycc, t2ab, mycc.direct, None) else: u2aa = eris._contract_vvvv_t2(mycc, t2aa, mycc.direct, None) u2bb = eris._contract_VVVV_t2(mycc, t2bb, mycc.direct, None) u2ab = eris._contract_vvVV_t2(mycc, t2ab, mycc.direct, None) return u2aa, u2ab, u2bb
def _add_vvvv(mycc, t1, t2, eris, out=None, with_ovvv=False, t2sym=None): time0 = time.clock(), time.time() log = logger.Logger(mycc.stdout, mycc.verbose) if t1 is None: t2aa, t2ab, t2bb = t2 else: t2aa, t2ab, t2bb = make_tau(t2, t1, t1) nocca, nvira = t2aa.shape[1:3] noccb, nvirb = t2bb.shape[1:3] if mycc.direct: assert(t2sym is None) if with_ovvv: raise NotImplementedError if getattr(eris, 'mo_coeff', None) is not None: mo_a, mo_b = eris.mo_coeff else: moidxa, moidxb = mycc.get_frozen_mask() mo_a = mycc.mo_coeff[0][:,moidxa] mo_b = mycc.mo_coeff[1][:,moidxb] nao = mo_a.shape[0] otrila = np.tril_indices(nocca,-1) otrilb = np.tril_indices(noccb,-1) if nocca > 1: tauaa = lib.einsum('xab,pa->xpb', t2aa[otrila], mo_a[:,nocca:]) tauaa = lib.einsum('xab,pb->xap', tauaa, mo_a[:,nocca:]) else: tauaa = np.zeros((0,nao,nao)) if noccb > 1: taubb = lib.einsum('xab,pa->xpb', t2bb[otrilb], mo_b[:,noccb:]) taubb = lib.einsum('xab,pb->xap', taubb, mo_b[:,noccb:]) else: taubb = np.zeros((0,nao,nao)) tauab = lib.einsum('ijab,pa->ijpb', t2ab, mo_a[:,nocca:]) tauab = lib.einsum('ijab,pb->ijap', tauab, mo_b[:,noccb:]) tau = np.vstack((tauaa, taubb, tauab.reshape(nocca*noccb,nao,nao))) tauaa = taubb = tauab = None time0 = log.timer_debug1('vvvv-tau', *time0) buf = ccsd._contract_vvvv_t2(mycc, mycc.mol, None, tau, out, log) mo = np.asarray(np.hstack((mo_a[:,nocca:], mo_b[:,noccb:])), order='F') u2aa = np.zeros_like(t2aa) if nocca > 1: u2tril = buf[:otrila[0].size] u2tril = _ao2mo.nr_e2(u2tril.reshape(-1,nao**2), mo.conj(), (0,nvira,0,nvira), 's1', 's1') u2tril = u2tril.reshape(otrila[0].size,nvira,nvira) u2aa[otrila[1],otrila[0]] = u2tril.transpose(0,2,1) u2aa[otrila] = u2tril u2bb = np.zeros_like(t2bb) if noccb > 1: u2tril = buf[otrila[0].size:otrila[0].size+otrilb[0].size] u2tril = _ao2mo.nr_e2(u2tril.reshape(-1,nao**2), mo.conj(), (nvira,nvira+nvirb,nvira,nvira+nvirb), 's1', 's1') u2tril = u2tril.reshape(otrilb[0].size,nvirb,nvirb) u2bb[otrilb[1],otrilb[0]] = u2tril.transpose(0,2,1) u2bb[otrilb] = u2tril u2ab = _ao2mo.nr_e2(buf[-nocca*noccb:].reshape(nocca*noccb,nao**2), mo, (0,nvira,nvira,nvira+nvirb), 's1', 's1') u2ab = u2ab.reshape(t2ab.shape) else: assert(not with_ovvv) if t2sym is None: tmp = eris._contract_vvvv_t2(mycc, t2aa[np.tril_indices(nocca)], mycc.direct, None) u2aa = ccsd._unpack_t2_tril(tmp, nocca, nvira, None, 'jiba') tmp = eris._contract_VVVV_t2(mycc, t2bb[np.tril_indices(noccb)], mycc.direct, None) u2bb = ccsd._unpack_t2_tril(tmp, noccb, nvirb, None, 'jiba') u2ab = eris._contract_vvVV_t2(mycc, t2ab, mycc.direct, None) else: u2aa = eris._contract_vvvv_t2(mycc, t2aa, mycc.direct, None) u2bb = eris._contract_VVVV_t2(mycc, t2bb, mycc.direct, None) u2ab = eris._contract_vvVV_t2(mycc, t2ab, mycc.direct, None) return u2aa,u2ab,u2bb