Example #1
0
    def __init__(self,
                 cc,
                 mo_coeff=None,
                 method='incore',
                 ao2mofn=ao2mo.outcore.general_iofree):
        if mo_coeff is None:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, cc.mo_coeff)
        else:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, mo_coeff)
        dm = cc._scf.make_rdm1(cc.mo_coeff, cc.mo_occ)
        fockao = cc._scf.get_hcore() + cc._scf.get_veff(cc.mol, dm)
        self.fock = reduce(np.dot, (mo_coeff.T, fockao, mo_coeff))

        nocc = cc.nocc
        nmo = cc.nmo
        eri1 = ao2mo.incore.full(cc._scf._eri, mo_coeff)
        eri1 = ao2mo.restore(1, eri1, nmo)
        self.oooo = eri1[:nocc, :nocc, :nocc, :nocc].copy()
        self.ooov = eri1[:nocc, :nocc, :nocc, nocc:].copy()
        self.ovoo = eri1[:nocc, nocc:, :nocc, :nocc].copy()
        self.ovov = eri1[:nocc, nocc:, :nocc, nocc:].copy()
        self.oovv = eri1[:nocc, :nocc, nocc:, nocc:].copy()
        self.ovvo = eri1[:nocc, nocc:, nocc:, :nocc].copy()
        self.ovvv = eri1[:nocc, nocc:, nocc:, nocc:].copy()
        self.vvvv = eri1[nocc:, nocc:, nocc:, nocc:].copy()
Example #2
0
    def __init__(self, cc, mo_coeff=None):
        cput0 = (time.clock(), time.time())
        if mo_coeff is None:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, cc.mo_coeff)
        else:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, mo_coeff)
        dm = cc._scf.make_rdm1(cc.mo_coeff, cc.mo_occ)
        fockao = cc._scf.get_hcore() + cc._scf.get_veff(cc.mol, dm)
        self.fock = reduce(numpy.dot, (mo_coeff.T, fockao, mo_coeff))
        self.nocc = cc.nocc

        self.oooo = None
        self.vooo = None
        self.voov = None
        self.vvoo = None
        self.vovv = None
        self.vvvv = None
Example #3
0
    def __init__(self, myci, mo_coeff=None):
        if mo_coeff is None:
            mo_coeff = ccsd._mo_without_core(myci, myci.mo_coeff)
        else:
            mo_coeff = ccsd._mo_without_core(myci, mo_coeff)
# Note: Recomputed fock matrix since SCF may not be fully converged.
        dm = myci._scf.make_rdm1(myci.mo_coeff, myci.mo_occ)
        fockao = myci._scf.get_hcore() + myci._scf.get_veff(myci.mol, dm)
        self.fock = reduce(numpy.dot, (mo_coeff.T, fockao, mo_coeff))
        self.mo_coeff = mo_coeff
        self.nocc = myci.nocc

        self.oooo = None
        self.vooo = None
        self.vvoo = None
        self.voov = None
        self.vovv = None
        self.vvvv = None
Example #4
0
    def __init__(self, cc, mo_coeff=None, method='incore',
                 ao2mofn=ao2mo.outcore.general_iofree):
        cput0 = (time.clock(), time.time())
        if mo_coeff is None:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, cc.mo_coeff)
        else:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, mo_coeff)
        dm = cc._scf.make_rdm1(cc.mo_coeff, cc.mo_occ)
        fockao = cc._scf.get_hcore() + cc._scf.get_veff(cc.mol, dm)
        self.fock = reduce(np.dot, (mo_coeff.T, fockao, mo_coeff))

        nocc = cc.nocc
        nmo = cc.nmo
        eri1 = ao2mo.incore.full(cc._scf._eri, mo_coeff)
        eri1 = ao2mo.restore(1, eri1, nmo)
        self.oooo = eri1[:nocc,:nocc,:nocc,:nocc].copy()
        self.ooov = eri1[:nocc,:nocc,:nocc,nocc:].copy()
        self.ovoo = eri1[:nocc,nocc:,:nocc,:nocc].copy()
        self.ovov = eri1[:nocc,nocc:,:nocc,nocc:].copy()
        self.oovv = eri1[:nocc,:nocc,nocc:,nocc:].copy()
        self.ovvo = eri1[:nocc,nocc:,nocc:,:nocc].copy()
        self.ovvv = eri1[:nocc,nocc:,nocc:,nocc:].copy()
        self.vvvv = eri1[nocc:,nocc:,nocc:,nocc:].copy()
Example #5
0
    def __init__(self, cc, mo_coeff=None):
        self.lib = cc.lib
        log = Logger(cc.stdout, cc.verbose)
        nocc, nmo = cc.nocc, cc.nmo
        nvir = nmo - nocc
        cput1 = cput0 = (time.clock(), time.time())

        if mo_coeff is None:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, cc.mo_coeff)
        else:
            self.mo_coeff = mo_coeff = ccsd._mo_without_core(cc, mo_coeff)

        fock = None
        if rank == 0:
            dm = cc._scf.make_rdm1(cc.mo_coeff, cc.mo_occ)
            fockao = cc._scf.get_hcore() + cc._scf.get_veff(cc.mol, dm)
            fock = reduce(np.dot, (mo_coeff.T, fockao, mo_coeff))

        fock = comm.bcast(fock, root=0)
        self.dtype = dtype = np.result_type(fock)

        self.foo = zeros([nocc, nocc], dtype, verbose=cc.SYMVERBOSE)
        self.fov = zeros([nocc, nvir], dtype, verbose=cc.SYMVERBOSE)
        self.fvv = zeros([nvir, nvir], dtype, verbose=cc.SYMVERBOSE)
        self.eia = zeros([nocc, nvir], verbose=cc.SYMVERBOSE)

        if rank == 0:
            mo_e = fock.diagonal().real
            eia = mo_e[:nocc, None] - mo_e[None, nocc:]
            self.foo.write(range(nocc * nocc), fock[:nocc, :nocc].ravel())
            self.fov.write(range(nocc * nvir), fock[:nocc, nocc:].ravel())
            self.fvv.write(range(nvir * nvir), fock[nocc:, nocc:].ravel())
            self.eia.write(range(nocc * nvir), eia.ravel())
        else:
            self.foo.write([], [])
            self.fov.write([], [])
            self.fvv.write([], [])
            self.eia.write([], [])
        cput1 = log.timer("Writing Fock", *cput1)
        self._foo = self.foo.diagonal(preserve_shape=True)
        self._fvv = self.fvv.diagonal(preserve_shape=True)
        eijab = self.eia.array.reshape(
            nocc, 1, nvir, 1) + self.eia.array.reshape(1, nocc, 1, nvir)
        self.eijab = tensor(eijab, verbose=cc.SYMVERBOSE)

        ppoo, ppov, ppvv = _make_ao_ints(cc.mol, mo_coeff, nocc, dtype)
        cput1 = log.timer('making ao integrals', *cput1)
        mo = ctf.astensor(mo_coeff)
        orbo, orbv = mo[:, :nocc], mo[:, nocc:]

        tmp = ctf.einsum('uvmn,ui->ivmn', ppoo, orbo.conj())
        oooo = ctf.einsum('ivmn,vj->ijmn', tmp, orbo)
        ooov = ctf.einsum('ivmn,va->mnia', tmp, orbv)

        tmp = ctf.einsum('uvma,vb->ubma', ppov, orbv)
        ovov = ctf.einsum('ubma,ui->ibma', tmp, orbo.conj())
        tmp = ctf.einsum('uvma,ub->mabv', ppov, orbv.conj())
        ovvo = ctf.einsum('mabv,vi->mabi', tmp, orbo)

        tmp = ctf.einsum('uvab,ui->ivab', ppvv, orbo.conj())
        oovv = ctf.einsum('ivab,vj->ijab', tmp, orbo)

        tmp = ctf.einsum('uvab,vc->ucab', ppvv, orbv)
        ovvv = ctf.einsum('ucab,ui->icab', tmp, orbo.conj())
        vvvv = ctf.einsum('ucab,ud->dcab', tmp, orbv.conj())

        self.oooo = tensor(oooo, verbose=cc.SYMVERBOSE)
        self.ooov = tensor(ooov, verbose=cc.SYMVERBOSE)
        self.ovov = tensor(ovov, verbose=cc.SYMVERBOSE)
        self.oovv = tensor(oovv, verbose=cc.SYMVERBOSE)
        self.ovvo = tensor(ovvo, verbose=cc.SYMVERBOSE)
        self.ovvv = tensor(ovvv, verbose=cc.SYMVERBOSE)
        self.vvvv = tensor(vvvv, verbose=cc.SYMVERBOSE)
        log.timer('ao2mo transformation', *cput0)
Example #6
0
def _make_eris(mycc, mo_coeff=None):
    mol = mycc.mol
    NS = ctf.SYM.NS
    SY = ctf.SYM.SY

    eris = ccsd._ChemistsERIs()
    if mo_coeff is None:
        mo_coeff = mycc.mo_coeff
    eris.mo_coeff = ccsd._mo_without_core(mycc, mo_coeff)
    nao, nmo = eris.mo_coeff.shape
    nocc = mycc.nocc
    nvir = nmo - nocc
    nvir_pair = nvir * (nvir + 1) // 2
    nao_pair = nao * (nao + 1) // 2

    mo = ctf.astensor(eris.mo_coeff)
    ppoo, ppov, ppvv = _make_ao_ints(mol, eris.mo_coeff, nocc)
    eris.nocc = mycc.nocc
    eris.mol = mycc.mol

    eris.fock = ctf.tensor((nmo, nmo))
    with omp(16):
        if rank == 0:
            dm = mycc._scf.make_rdm1(mycc.mo_coeff, mycc.mo_occ)
            fockao = mycc._scf.get_hcore() + mycc._scf.get_veff(mycc.mol, dm)
            fock = reduce(numpy.dot, (eris.mo_coeff.T, fockao, eris.mo_coeff))
            eris.fock.write(numpy.arange(nmo**2), fock.ravel())
        else:
            eris.fock.write([], [])

    orbo = mo[:, :nocc]
    orbv = mo[:, nocc:]

    print 'before contraction', rank, lib.current_memory()
    tmp = ctf.tensor([nao, nocc, nvir, nvir], sym=[NS, NS, SY, NS])
    otmp = ctf.einsum('pqrs,qj->pjrs', ppvv, orbo, out=tmp)
    eris.oovv = ctf.tensor([nocc, nocc, nvir, nvir], sym=[NS, NS, SY, NS])
    eris.ovvv = ctf.einsum('pjrs,pi->ijrs', otmp, orbo, out=eris.oovv)
    otmp = tmp = None

    print '___________  vvvv', rank, lib.current_memory()
    tmp = ctf.tensor([nao, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    print '___________  vvvv sub1', rank, lib.current_memory()
    vtmp = ctf.einsum('pqrs,qj->pjrs', ppvv, orbv, out=tmp)

    eris.ovvv = ctf.tensor([nocc, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    eris.ovvv = ctf.einsum('pjrs,pi->ijrs', vtmp, orbo, out=eris.ovvv)
    ppvv = None

    tmp = ctf.tensor([nvir, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    print '___________  vvvv sub2', rank, lib.current_memory()
    vtmp = ctf.einsum('pjrs,pi->ijrs', vtmp, orbv, out=tmp)
    eris.vvvv = ctf.tensor(sym=[SY, NS, SY, NS], copy=vtmp)
    vtmp = tmp = None

    vtmp = ctf.einsum('pqrs,qj->pjrs', ppov, orbv)
    eris.ovov = ctf.einsum('pjrs,pi->ijrs', vtmp, orbo)
    vtmp = None

    otmp = ctf.einsum('pqrs,qj->pjrs', ppov, orbo)
    eris.ooov = ctf.einsum('pjrs,pi->ijrs', otmp, orbo)
    ppov = otmp = None

    otmp = ctf.einsum('pqrs,qj->pjrs', ppoo, orbo)
    eris.oooo = ctf.einsum('pjrs,pi->ijrs', otmp, orbo)
    ppoo = otmp = None

    print '___________  fock', rank, lib.current_memory()
    eris.mo_energy = eris.fock.diagonal()
    eris.foo = eris.fock[:nocc, :nocc].copy()
    eris.foo.i('ii') << (eris.mo_energy[:nocc] * -1).i('i')
    eris.fvv = eris.fock[nocc:, nocc:].copy()
    eris.fvv.i('ii') << (eris.mo_energy[nocc:] * -1).i('i')
    eris.fov = ctf.astensor(eris.fock[:nocc, nocc:])
    return eris
Example #7
0
def _make_eris(mycc, mo_coeff=None, cutoff=None):
    mol = mycc.mol
    NS = ctf.SYM.NS
    SY = ctf.SYM.SY

    eris = ccsd._ChemistsERIs()
    if mo_coeff is None:
        mo_coeff = mycc.mo_coeff
    eris.mo_coeff = ccsd._mo_without_core(mycc, mo_coeff)
    nao, nmo = eris.mo_coeff.shape
    nocc = mycc.nocc
    nvir = nmo - nocc
    nvir_pair = nvir * (nvir + 1) // 2
    nao_pair = nao * (nao + 1) // 2

    mo = ctf.astensor(eris.mo_coeff)
    ppoo, ppov, ppvv = _make_ao_ints(mol, eris.mo_coeff, nocc)
    eris.nocc = mycc.nocc
    eris.mol = mycc.mol

    eris.fock = ctf.tensor((nmo, nmo))
    with omp(16):
        if rank == 0:
            dm = mycc._scf.make_rdm1(mycc.mo_coeff, mycc.mo_occ)
            fockao = mycc._scf.get_hcore() + mycc._scf.get_veff(mycc.mol, dm)
            fock = reduce(numpy.dot, (eris.mo_coeff.T, fockao, eris.mo_coeff))
            eris.fock.write(numpy.arange(nmo**2), fock.ravel())
        else:
            eris.fock.write([], [])

    orbo = mo[:, :nocc]
    orbv = mo[:, nocc:]

    if (ctf.comm().rank() == 0):
        print 'before contraction', rank, lib.current_memory()
    tmp = ctf.tensor([nao, nocc, nvir, nvir], sym=[NS, NS, SY, NS])
    otmp = ctf.einsum('pqrs,qj->pjrs', ppvv, orbo, out=tmp)
    eris.oovv = ctf.tensor([nocc, nocc, nvir, nvir], sym=[NS, NS, SY, NS])
    eris.ovvv = ctf.einsum('pjrs,pi->ijrs', otmp, orbo, out=eris.oovv)
    otmp = tmp = None

    if (ctf.comm().rank() == 0):
        print '___________  vvvv', rank, lib.current_memory()
    tmp = ctf.tensor([nao, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    if (ctf.comm().rank() == 0):
        print '___________  vvvv sub1', rank, lib.current_memory()
    vtmp = ctf.einsum('pqrs,qj->pjrs', ppvv, orbv, out=tmp)

    eris.ovvv = ctf.tensor([nocc, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    eris.ovvv = ctf.einsum('pjrs,pi->ijrs', vtmp, orbo, out=eris.ovvv)
    ppvv = None

    tmp = ctf.tensor([nvir, nvir, nvir, nvir], sym=[NS, NS, SY, NS])
    if (ctf.comm().rank() == 0):
        print '___________  vvvv sub2', rank, lib.current_memory()
    vtmp = ctf.einsum('pjrs,pi->ijrs', vtmp, orbv, out=tmp)
    eris.vvvv = ctf.tensor(sym=[SY, NS, SY, NS], copy=vtmp)
    vtmp = tmp = None

    vtmp = ctf.einsum('pqrs,qj->pjrs', ppov, orbv)
    eris.ovov = ctf.einsum('pjrs,pi->ijrs', vtmp, orbo)
    vtmp = None

    otmp = ctf.einsum('pqrs,qj->pjrs', ppov, orbo)
    eris.ooov = ctf.einsum('pjrs,pi->ijrs', otmp, orbo)
    ppov = otmp = None

    otmp = ctf.einsum('pqrs,qj->pjrs', ppoo, orbo)
    eris.oooo = ctf.einsum('pjrs,pi->ijrs', otmp, orbo)
    ppoo = otmp = None

    if cutoff != None:
        print("Using cutoff", cutoff)
        eris.ovvv = eris.ovvv.sparsify(ctf.vecnorm(eris.ovvv) * cutoff)
        eris.oovv = eris.oovv.sparsify(ctf.vecnorm(eris.oovv) * cutoff)
        eris.oooo = eris.oooo.sparsify(ctf.vecnorm(eris.oooo) * cutoff)
        eris.ooov = eris.ooov.sparsify(ctf.vecnorm(eris.ooov) * cutoff)
        eris.vvvv = eris.vvvv.sparsify(ctf.vecnorm(eris.vvvv) * cutoff)
        eris.ovov = eris.ovov.sparsify(ctf.vecnorm(eris.ovov) * cutoff)
        if (ctf.comm().rank() == 0):
            for e in [
                    eris.ovvv, eris.oovv, eris.oooo, eris.ooov, eris.vvvv,
                    eris.ovov
            ]:
                print "For integral tensor with shape,", e.shape, "symmetry", e.sym, "number of nonzeros with cutoff", cutoff, "is ", (
                    int(100000 * e.nnz_tot / e.size)) / 1000, "%"

    if (ctf.comm().rank() == 0):
        print '___________  fock', rank, lib.current_memory()
    eris.mo_energy = eris.fock.diagonal()
    eris.foo = eris.fock[:nocc, :nocc].copy()
    eris.foo.i('ii') << (eris.mo_energy[:nocc] * -1).i('i')
    eris.fvv = eris.fock[nocc:, nocc:].copy()
    eris.fvv.i('ii') << (eris.mo_energy[nocc:] * -1).i('i')
    eris.fov = ctf.astensor(eris.fock[:nocc, nocc:])
    return eris