Beispiel #1
0
def kernel(mp, mo_energy=None, mo_coeff=None, eris=None, with_t2=WITH_T2,
           verbose=logger.NOTE):
    if mo_energy is None or mo_coeff is None:
        mo_coeff = mp2._mo_without_core(mp, mp.mo_coeff)
        mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
    else:
        # For backward compatibility.  In pyscf-1.4 or earlier, mp.frozen is
        # not supported when mo_energy or mo_coeff is given.
        assert(mp.frozen is 0 or mp.frozen is None)

    nocc = mp.nocc
    nvir = mp.nmo - nocc
    eia = mo_energy[:nocc,None] - mo_energy[None,nocc:]

    t2 = None
    emp2 = 0
    for istep, qov in enumerate(mp.loop_ao2mo(mo_coeff, nocc)):
        logger.debug(mp, 'Load cderi step %d', istep)
        for i in range(nocc):
            buf = numpy.dot(qov[:,i*nvir:(i+1)*nvir].T,
                            qov).reshape(nvir,nocc,nvir)
            gi = numpy.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])
            emp2 += numpy.einsum('jab,jab', t2i, gi) * 2
            emp2 -= numpy.einsum('jab,jba', t2i, gi)

    return emp2, t2
Beispiel #2
0
def kernel(mp,
           mo_energy=None,
           mo_coeff=None,
           eris=None,
           with_t2=WITH_T2,
           verbose=logger.NOTE):
    if mo_energy is None or mo_coeff is None:
        mo_coeff = mp2._mo_without_core(mp, mp.mo_coeff)
        mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
    else:
        # For backward compatibility.  In pyscf-1.4 or earlier, mp.frozen is
        # not supported when mo_energy or mo_coeff is given.
        assert (mp.frozen is 0 or mp.frozen is None)

    nocc = mp.nocc
    nvir = mp.nmo - nocc
    eia = mo_energy[:nocc, None] - mo_energy[None, nocc:]

    t2 = None
    emp2 = 0
    for istep, qov in enumerate(mp.loop_ao2mo(mo_coeff, nocc)):
        logger.debug(mp, 'Load cderi step %d', istep)
        for i in range(nocc):
            buf = numpy.dot(qov[:, i * nvir:(i + 1) * nvir].T,
                            qov).reshape(nvir, nocc, nvir)
            gi = numpy.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])
            emp2 += numpy.einsum('jab,jab', t2i, gi) * 2
            emp2 -= numpy.einsum('jab,jba', t2i, gi)

    return emp2, t2
Beispiel #3
0
def make_rdm2(mp2solver):
    nmo = nmo0 = mp2solver.nmo
    nocc = nocc0 = mp2solver.nocc
    nvir = nmo - nocc
    from pyscf.mp import mp2
    mo_coeff = mp2._mo_without_core(mp2solver, mp2solver.mo_coeff)
    mo_energy = mp2._mo_energy_without_core(mp2solver, mp2solver.mo_energy)
    eia = mo_energy[:nocc, None] - mo_energy[None, nocc:]

    moidx = oidx = vidx = None
    dm1 = make_rdm1(mp2solver)
    dm1[np.diag_indices(nocc0)] -= 2
    dm2 = np.zeros((nmo0, nmo0, nmo0, nmo0), dtype=dm1.dtype)

    if (t2 is None):
        for istep, qov in enumerate(mp2solver.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])
                dovov = t2i.transpose(1, 0, 2) * 2 - t2i.transpose(2, 0, 1)
                dovov *= 2
                if moidx is None:
                    dm2[i, nocc:, :nocc, nocc:] = dovov
                    dm2[nocc:, i,
                        nocc:, :nocc] = dovov.conj().transpose(0, 2, 1)
                else:
                    dm2[oidx[i], vidx[:, None, None], oidx[:, None],
                        vidx] = dovov
                    dm2[vidx[:, None, None], oidx[i], vidx[:, None],
                        oidx] = dovov.conj().transpose(0, 2, 1)

    else:
        for i in range(nocc):
            t2i = t2[i]
            dovov = t2i.transpose(1, 0, 2) * 2 - t2i.transpose(2, 0, 1)
            dovov *= 2
            if moidx is None:
                dm2[i, nocc:, :nocc, nocc:] = dovov
                dm2[nocc:, i, nocc:, :nocc] = dovov.conj().transpose(0, 2, 1)
            else:
                dm2[oidx[i], vidx[:, None, None], oidx[:, None], vidx] = dovov
                dm2[vidx[:, None, None], oidx[i], vidx[:, None],
                    oidx] = dovov.conj().transpose(0, 2, 1)

    for i in range(nocc0):
        dm2[i, i, :, :] += dm1.T * 2
        dm2[:, :, i, i] += dm1.T * 2
        dm2[:, i, i, :] -= dm1.T
        dm2[i, :, :, i] -= dm1

    for i in range(nocc0):
        for j in range(nocc0):
            dm2[i, i, j, j] += 4
            dm2[i, j, j, i] -= 2

    return dm2
Beispiel #4
0
def kernel(mp,
           mo_energy=None,
           mo_coeff=None,
           eris=None,
           with_t2=False,
           verbose=logger.NOTE):
    _sync_(mp)
    if mo_energy is None or mo_coeff is None:
        if mp.mo_energy is None or mp.mo_coeff is None:
            raise RuntimeError(
                'mo_coeff, mo_energy are not initialized.\n'
                'You may need to call mf.kernel() to generate them.')
        mo_coeff = None
        mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
    else:
        assert (mp.frozen is 0 or mp.frozen is None)

    eris = getattr(mp, '_eris', None)
    if eris is None:
        mp.ao2mo(mo_coeff)
        eris = mp._eris

    nocc = mp.nocc
    nvir = mp.nmo - nocc
    oloc0, oloc1 = _task_location(nocc, rank)
    nocc_seg = oloc1 - oloc0
    eia = mo_energy[:nocc, None] - mo_energy[None, nocc:]

    if with_t2:
        t2 = numpy.empty((nocc_seg, nocc, nvir, nvir), dtype=eris.ovov.dtype)
    else:
        t2 = None

    emp2 = 0
    for i in range(nocc):
        gi = numpy.asarray(eris.ovov[i])
        gi = gi.reshape(nvir, nocc_seg, nvir).transpose(1, 2, 0)
        t2i = gi.conj() / (eia[oloc0:oloc1, :, None] + eia[i])
        emp2 += numpy.einsum('jab,jab', t2i, gi) * 2
        emp2 -= numpy.einsum('jab,jba', t2i, gi)
        if with_t2:
            t2[:, i] = t2i

    emp2 = comm.allreduce(emp2)
    return emp2.real, t2
Beispiel #5
0
 def get_t2(mp):
     '''basically identical to the DFMP2 kernel, returns t2'''
     from pyscf.mp import mp2
     mo_coeff  = mp2._mo_without_core(mp, mp.mo_coeff)
     # print("mo_coeff rdms", mo_coeff)
     mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
     nocc = mp.nocc
     nvir = mp.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
Beispiel #6
0
 def _gamma1_intermediates(mp,t2=None):
     nmo  = mp.nmo
     nocc = mp.nocc
     nvir = nmo - nocc
     from pyscf.mp import mp2
     mo_coeff  = mp2._mo_without_core(mp, mp.mo_coeff)
     print("mo coeff rdms", mo_coeff)
     print('nmo, nocc, nvir, mo_coeff shape')
     print(nmo, nocc, nvir, mp.mo_coeff.shape)
     mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
     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
Beispiel #7
0
def kernel(mp, mo_energy=None, mo_coeff=None, eris=None, with_t2=False,
           verbose=logger.NOTE):
    _sync_(mp)
    if mo_energy is None or mo_coeff is None:
        if mp.mo_energy is None or mp.mo_coeff is None:
            raise RuntimeError('mo_coeff, mo_energy are not initialized.\n'
                               'You may need to call mf.kernel() to generate them.')
        mo_coeff = None
        mo_energy = mp2._mo_energy_without_core(mp, mp.mo_energy)
    else:
        assert(mp.frozen is 0 or mp.frozen is None)

    eris = getattr(mp, '_eris', None)
    if eris is None:
        mp.ao2mo(mo_coeff)
        eris = mp._eris

    nocc = mp.nocc
    nvir = mp.nmo - nocc
    oloc0, oloc1 = _task_location(nocc, rank)
    nocc_seg = oloc1 - oloc0
    eia = mo_energy[:nocc,None] - mo_energy[None,nocc:]

    if with_t2:
        t2 = numpy.empty((nocc_seg,nocc,nvir,nvir), dtype=eris.ovov.dtype)
    else:
        t2 = None

    emp2 = 0
    for i in range(nocc):
        gi = numpy.asarray(eris.ovov[i])
        gi = gi.reshape(nvir,nocc_seg,nvir).transpose(1,2,0)
        t2i = gi.conj() / (eia[oloc0:oloc1,:,None] + eia[i])
        emp2 += numpy.einsum('jab,jab', t2i, gi) * 2
        emp2 -= numpy.einsum('jab,jba', t2i, gi)
        if with_t2:
            t2[:,i] = t2i

    emp2 = comm.allreduce(emp2)
    return emp2.real, t2
Beispiel #8
0
def my_kernel(mp, mo_energy=None, mo_coeff=None, eris=None, with_eij=True):
    if mo_energy is None or mo_coeff is None:
        if mp.mo_energy is None or mp.mo_coeff is None:
            raise RuntimeError(
                'mo_coeff, mo_energy are not initialized.\n'
                'You may need to call mf.kernel() to generate them.')
        mo_coeff = None
        mo_energy = _mo_energy_without_core(mp, mp.mo_energy)
    else:
        # For backward compatibility.  In pyscf-1.4 or earlier, mp.frozen is
        # not supported when mo_energy or mo_coeff is given.
        assert (mp.frozen is 0 or mp.frozen is None)

    if eris is None: eris = mp.ao2mo(mo_coeff)

    nocc = mp.nocc
    nvir = mp.nmo - nocc
    eia = mo_energy[:nocc, None] - mo_energy[None, nocc:]

    if with_eij:
        eij = np.empty((nocc, nocc), dtype=eia.dtype)
    else:
        eij = None

    emp2 = 0
    for i in range(nocc):
        gi = np.asarray(eris.ovov[i * nvir:(i + 1) * nvir])
        gi = gi.reshape(nvir, nocc, nvir).transpose(1, 0, 2)
        t2i = gi.conj() / lib.direct_sum('jb+a->jba', eia, eia[i])
        tmp_eij = 2 * np.einsum('jab,jab->j', t2i, gi) - np.einsum(
            'jab,jba->j', t2i, gi)
        emp2 += tmp_eij.sum()
        if with_eij:
            eij[i] = tmp_eij

    return emp2.real, eij.real