예제 #1
0
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
예제 #2
0
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