def _gamma1_intermediates(mp, mo_coeff, mo_energy, nocc, t2=None): nmo = mo_coeff.shape[1] nvir = nmo - nocc from pyscf.mp import mp2 eia = mo_energy[:nocc, None] - mo_energy[None, nocc:] if (t2 is None): for istep, qov in enumerate(mp.loop_ao2mo(mo_coeff, nocc)): if (istep == 0): dtype = qov.dtype dm1occ = np.zeros((nocc, nocc), dtype=dtype) dm1vir = np.zeros((nvir, nvir), dtype=dtype) for i in range(nocc): buf = np.dot(qov[:, i * nvir:(i + 1) * nvir].T, qov).reshape(nvir, nocc, nvir) gi = np.array(buf, copy=False) gi = gi.reshape(nvir, nocc, nvir).transpose(1, 0, 2) t2i = gi / lib.direct_sum('jb+a->jba', eia, eia[i]) l2i = t2i.conj() dm1vir += np.einsum('jca,jcb->ba', l2i, t2i) * 2 \ - np.einsum('jca,jbc->ba', l2i, t2i) dm1occ += np.einsum('iab,jab->ij', l2i, t2i) * 2 \ - np.einsum('iab,jba->ij', l2i, t2i) else: dtype = t2[0].dtype dm1occ = np.zeros((nocc, nocc), dtype=dtype) dm1vir = np.zeros((nvir, nvir), dtype=dtype) for i in range(nocc): t2i = t2[i] l2i = t2i.conj() dm1vir += np.einsum('jca,jcb->ba', l2i, t2i) * 2 \ - np.einsum('jca,jbc->ba', l2i, t2i) dm1occ += np.einsum('iab,jab->ij', l2i, t2i) * 2 \ - np.einsum('iab,jba->ij', l2i, t2i) return -dm1occ, dm1vir
def get_t2(mp, mo_coeff, mo_energy, nocc): '''basically identical to the DFMP2 kernel, returns t2''' from pyscf.mp import mp2 nmo = mo_coeff.shape[1] nvir = nmo - nocc eia = mo_energy[:nocc, None] - mo_energy[None, nocc:] emp2 = 0 t2 = [] for istep, qov in enumerate(mp.loop_ao2mo(mo_coeff, nocc)): for i in range(nocc): buf = np.dot(qov[:, i * nvir:(i + 1) * nvir].T, qov).reshape(nvir, nocc, nvir) gi = np.array(buf, copy=False) gi = gi.reshape(nvir, nocc, nvir).transpose(1, 0, 2) t2i = gi.conj() / lib.direct_sum('jb+a->jba', eia, eia[i]) t2.append(t2i) emp2 += np.einsum('jab,jab', t2i, gi) * 2 emp2 -= np.einsum('jab,jba', t2i, gi) return emp2, t2