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()
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
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
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()
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)
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
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