Пример #1
0
 def _add_vvvv(self, c2, eris, out=None, t2sym=None):
     return ccsd._add_vvvv(self, None, c2, eris, out, False, t2sym)
Пример #2
0
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