def __init__(self, cc, mo_coeff=None, method='incore'): cput0 = (time.clock(), time.time()) moidx = numpy.ones(cc.mo_energy.size, dtype=numpy.bool) if isinstance(cc.frozen, (int, numpy.integer)): moidx[:cc.frozen] = False elif len(cc.frozen) > 0: moidx[numpy.asarray(cc.frozen)] = False if mo_coeff is None: self.mo_coeff = mo_coeff = cc.mo_coeff[:,moidx] self.fock = numpy.diag(cc.mo_energy[moidx]) else: # If mo_coeff is not canonical orbital self.mo_coeff = mo_coeff = mo_coeff[:,moidx] 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)) nocc = cc.nocc() nmo = cc.nmo() nvir = nmo - nocc mem_incore, mem_outcore, mem_basic = _mem_usage(nocc, nvir) mem_now = pyscf.lib.current_memory()[0] log = logger.Logger(cc.stdout, cc.verbose) if (method == 'incore' and cc._scf._eri is not None and (mem_incore+mem_now < cc.max_memory) or cc.mol.incore_anyway): eri1 = pyscf.ao2mo.incore.full(cc._scf._eri, mo_coeff) #:eri1 = pyscf.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.oovv = eri1[:nocc,:nocc,nocc:,nocc:].copy() #:self.ovov = eri1[:nocc,nocc:,:nocc,nocc:].copy() #:ovvv = eri1[:nocc,nocc:,nocc:,nocc:].copy() #:self.ovvv = numpy.empty((nocc,nvir,nvir*(nvir+1)//2)) #:for i in range(nocc): #: for j in range(nvir): #: self.ovvv[i,j] = lib.pack_tril(ovvv[i,j]) #:self.vvvv = pyscf.ao2mo.restore(4, eri1[nocc:,nocc:,nocc:,nocc:], nvir) nvir_pair = nvir * (nvir+1) // 2 self.oooo = numpy.empty((nocc,nocc,nocc,nocc)) self.ooov = numpy.empty((nocc,nocc,nocc,nvir)) self.ovoo = numpy.empty((nocc,nvir,nocc,nocc)) self.oovv = numpy.empty((nocc,nocc,nvir,nvir)) self.ovov = numpy.empty((nocc,nvir,nocc,nvir)) self.ovvv = numpy.empty((nocc,nvir,nvir_pair)) self.vvvv = numpy.empty((nvir_pair,nvir_pair)) ij = 0 outbuf = numpy.empty((nmo,nmo,nmo)) for i in range(nocc): buf = _ccsd.unpack_tril(eri1[ij:ij+i+1], out=outbuf[:i+1]) for j in range(i+1): self.oooo[i,j] = self.oooo[j,i] = buf[j,:nocc,:nocc] self.ooov[i,j] = self.ooov[j,i] = buf[j,:nocc,nocc:] self.oovv[i,j] = self.oovv[j,i] = buf[j,nocc:,nocc:] ij += i + 1 ij1 = 0 for i in range(nocc,nmo): buf = _ccsd.unpack_tril(eri1[ij:ij+i+1], out=outbuf[:i+1]) self.ovoo[:,i-nocc] = buf[:nocc,:nocc,:nocc] self.ovov[:,i-nocc] = buf[:nocc,:nocc,nocc:] for j in range(nocc): self.ovvv[j,i-nocc] = lib.pack_tril(_cp(buf[j,nocc:,nocc:])) for j in range(nocc, i+1): self.vvvv[ij1] = lib.pack_tril(_cp(buf[j,nocc:,nocc:])) ij1 += 1 ij += i + 1 else: cput1 = time.clock(), time.time() _tmpfile1 = tempfile.NamedTemporaryFile() _tmpfile2 = tempfile.NamedTemporaryFile() self.feri1 = h5py.File(_tmpfile1.name) orbo = mo_coeff[:,:nocc] orbv = mo_coeff[:,nocc:] nvpair = nvir * (nvir+1) // 2 self.oooo = self.feri1.create_dataset('oooo', (nocc,nocc,nocc,nocc), 'f8') self.ooov = self.feri1.create_dataset('ooov', (nocc,nocc,nocc,nvir), 'f8') self.ovoo = self.feri1.create_dataset('ovoo', (nocc,nvir,nocc,nocc), 'f8') self.oovv = self.feri1.create_dataset('oovv', (nocc,nocc,nvir,nvir), 'f8') self.ovov = self.feri1.create_dataset('ovov', (nocc,nvir,nocc,nvir), 'f8') self.ovvv = self.feri1.create_dataset('ovvv', (nocc,nvir,nvpair), 'f8') self.feri2 = h5py.File(_tmpfile2.name, 'w') pyscf.ao2mo.full(cc.mol, orbv, self.feri2, verbose=log) self.vvvv = self.feri2['eri_mo'] cput1 = log.timer_debug1('transforming vvvv', *cput1) tmpfile3 = tempfile.NamedTemporaryFile() with h5py.File(tmpfile3.name, 'w') as feri: pyscf.ao2mo.general(cc.mol, (orbo,mo_coeff,mo_coeff,mo_coeff), feri, verbose=log) cput1 = log.timer_debug1('transforming oppp', *cput1) eri1 = feri['eri_mo'] outbuf = numpy.empty((nmo,nmo,nmo)) for i in range(nocc): buf = _ccsd.unpack_tril(_cp(eri1[i*nmo:(i+1)*nmo]), out=outbuf) self.oooo[i] = buf[:nocc,:nocc,:nocc] self.ooov[i] = buf[:nocc,:nocc,nocc:] self.ovoo[i] = buf[nocc:,:nocc,:nocc] self.oovv[i] = buf[:nocc,nocc:,nocc:] self.ovov[i] = buf[nocc:,:nocc,nocc:] self.ovvv[i] = _ccsd.pack_tril(_cp(buf[nocc:,nocc:,nocc:])) cput1 = log.timer_debug1('sorting %d'%i, *cput1) for key in feri.keys(): del(feri[key]) log.timer('CCSD integral transformation', *cput0)
def gamma2_incore(mycc, t1, t2, l1, l2): log = logger.Logger(mycc.stdout, mycc.verbose) nocc, nvir = t1.shape nov = nocc * nvir time1 = time.clock(), time.time() #:theta = make_theta(t2) #:mOvOv = numpy.einsum('ikca,jkcb->jbia', l2, t2) #:mOVov = -numpy.einsum('ikca,jkbc->jbia', l2, t2) #:mOVov += numpy.einsum('ikac,jkbc->jbia', l2, theta) l2a = numpy.empty((nocc,nvir,nocc,nvir)) t2a = numpy.empty((nocc,nvir,nocc,nvir)) for i in range(nocc): l2a[i] = l2[i].transpose(2,0,1) t2a[i] = t2[i].transpose(2,0,1) mOvOv = lib.dot(t2a.reshape(-1,nov), l2a.reshape(-1,nov).T).reshape(nocc,nvir,nocc,nvir) for i in range(nocc): t2a[i] = t2[i].transpose(1,0,2) mOVov = lib.dot(t2a.reshape(-1,nov), l2a.reshape(-1,nov).T, -1).reshape(nocc,nvir,nocc,nvir) theta = t2a for i in range(nocc): l2a[i] = l2[i].transpose(1,0,2) theta[i] *= 2 theta[i] -= t2[i].transpose(2,0,1) lib.dot(theta.reshape(-1,nov), l2a.reshape(nov,-1).T, 1, mOVov.reshape(nov,-1), 1) theta = l2a = t2a = None moo =(numpy.einsum('jdld->jl', mOvOv) * 2 + numpy.einsum('jdld->jl', mOVov)) mvv =(numpy.einsum('lbld->bd', mOvOv) * 2 + numpy.einsum('lbld->bd', mOVov)) mia =(numpy.einsum('kc,ikac->ia', l1, t2) * 2 - numpy.einsum('kc,ikca->ia', l1, t2)) mab = numpy.einsum('kc,kb->cb', l1, t1) mij = numpy.einsum('kc,jc->jk', l1, t1) + moo*.5 gooov = numpy.zeros((nocc,nocc,nocc,nvir)) tau = _ccsd.make_tau(t2, t1, t1) #:goooo = numpy.einsum('ijab,klab->klij', l2, tau)*.5 goooo = lib.dot(tau.reshape(-1,nvir**2), l2.reshape(-1,nvir**2).T, .5) goooo = goooo.reshape(-1,nocc,nocc,nocc) doooo = _cp(make_theta(goooo).transpose(0,2,1,3)) #:gooov -= numpy.einsum('ib,kjab->jkia', l1, tau) #:gooov -= numpy.einsum('kjab,ib->jkia', l2, t1) #:gooov += numpy.einsum('jkil,la->jkia', goooo, t1*2) gooov = lib.dot(_cp(tau.reshape(-1,nvir)), l1.T, -1) lib.dot(_cp(l2.reshape(-1,nvir)), t1.T, -1, gooov, 1) gooov = gooov.reshape(nocc,nocc,nvir,nocc) tmp = numpy.einsum('ji,ka->jkia', moo*-.5, t1) tmp += gooov.transpose(1,0,3,2) gooov, tmp = tmp, None lib.dot(goooo.reshape(-1,nocc), t1, 2, gooov.reshape(-1,nvir), 1) goovv = numpy.einsum('ia,jb->ijab', mia, t1) for i in range(nocc): goovv[i] += .5 * l2 [i] goovv[i] += .5 * tau[i] #:goovv -= numpy.einsum('jk,kiba->jiba', mij, tau) lib.dot(mij, tau.reshape(nocc,-1), -1, goovv.reshape(nocc,-1), 1) #:goovv -= numpy.einsum('cb,ijac->ijab', mab, t2) #:goovv -= numpy.einsum('bd,ijad->ijab', mvv*.5, tau) lib.dot(t2.reshape(-1,nvir), mab, -1, goovv.reshape(-1,nvir), 1) lib.dot(tau.reshape(-1,nvir), mvv.T, -.5, goovv.reshape(-1,nvir), 1) tau = None #:gooov += numpy.einsum('jaic,kc->jkia', mOvOv, t1) #:gooov -= numpy.einsum('kaic,jc->jkia', mOVov, t1) tmp = lib.dot(mOvOv.reshape(-1,nvir), t1.T).reshape(nocc,-1,nocc,nocc) gooov += tmp.transpose(0,3,2,1) lib.dot(t1, mOVov.reshape(-1,nvir).T, 1, tmp.reshape(nocc,-1), 0) gooov -= tmp.reshape(nocc,nocc,nvir,nocc).transpose(0,1,3,2) dooov = gooov.transpose(0,2,1,3)*2 - gooov.transpose(1,2,0,3) gooov = None #:tmp = numpy.einsum('ikac,jc->jaik', l2, t1) #:gOvVo -= numpy.einsum('jaik,kb->jabi', tmp, t1) #:gOvvO = numpy.einsum('jaki,kb->jabi', tmp, t1) + mOvOv.transpose(0,3,1,2) tmp = tmp.reshape(nocc,nocc,nocc,nvir) lib.dot(t1, l2.reshape(-1,nvir).T, 1, tmp.reshape(nocc,-1)) gOvVo = numpy.einsum('ia,jb->jabi', l1, t1) gOvvO = numpy.empty((nocc,nvir,nvir,nocc)) for i in range(nocc): gOvVo[i] -= lib.dot(_cp(tmp[i].transpose(0,2,1).reshape(-1,nocc)), t1).reshape(nocc,nvir,-1).transpose(1,2,0) gOvVo[i] += mOVov[i].transpose(2,0,1) gOvvO[i] = lib.dot(tmp[i].reshape(nocc,-1).T, t1).reshape(nocc,nvir,-1).transpose(1,2,0) gOvvO[i] += mOvOv[i].transpose(2,0,1) tmp = None dovvo = numpy.empty((nocc,nvir,nvir,nocc)) doovv = numpy.empty((nocc,nocc,nvir,nvir)) for i in range(nocc): tmp = gOvVo[i] * 2 + gOvvO[i] dovvo[i] = tmp.transpose(1,0,2) tmp = gOvvO[i] * -2 - gOvVo[i] doovv[i] = tmp.transpose(2,0,1) gOvvO = gOvVo = None tau2 = _ccsd.make_tau(t2, t1, t1) #:goovv += numpy.einsum('ijkl,klab->ijab', goooo[:,:,j0:j1], tau2) lib.dot(goooo.reshape(nocc*nocc,-1), tau2.reshape(-1,nvir**2), 1, goovv.reshape(-1,nvir**2), 1) tau2 += numpy.einsum('ia,jb->ijab', t1, t1) tau2p = tau2.reshape(nocc,nvir,nocc,nvir) for i in range(nocc): tau2p[i] = tau2[i].transpose(2,0,1) tau2, tau2p = tau2p.reshape(nov,-1), None #:goovv += numpy.einsum('ibld,jlda->ijab', mOvOv, tau2) * .5 #:goovv -= numpy.einsum('iald,jldb->ijab', mOVov, tau2) * .5 tmp = lib.dot(mOvOv.reshape(-1,nov), tau2.T, .5).reshape(nocc,nvir,-1,nvir) for i in range(nocc): tmp[i] = goovv[i].transpose(1,0,2) + tmp[i].transpose(2,1,0) goovv, tmp = tmp, None lib.dot(mOVov.reshape(-1,nov), tau2.T, -.5, goovv.reshape(nov,-1), 1) #:goovv += numpy.einsum('iald,jlbd->ijab', mOVov*2+mOvOv, t2) * .5 t2a, tau2 = tau2.reshape(nocc,nvir,nocc,nvir), None for i in range(nocc): t2a[i] = t2[i].transpose(1,0,2) tmp = mOVov*2 tmp += mOvOv lib.dot(tmp.reshape(-1,nov), t2a.reshape(nov,-1), .5, goovv.reshape(nov,-1), 1) t2a = tmp = None for i in range(nocc): goovv[i] = goovv[i] * 2 - goovv[i].transpose(2,1,0) dovov = goovv goooo = goovv = None #:gvovv += numpy.einsum('aick,kb->aibc', pvOVo, t1) mOVov = lib.transpose(mOVov.reshape(nov,-1)) gvovv = lib.dot(mOVov.reshape(nocc,-1).T, t1).reshape(nvir,nocc,nvir,nvir) mOVov = None tmp = numpy.einsum('ja,jb->ab', l1, t1) #:gvovv += numpy.einsum('ab,ic->aibc', tmp, t1) #:gvovv += numpy.einsum('ba,ic->aibc', mvv, t1*.5) for i in range(nvir): gvovv[i] += numpy.einsum('b,ic->icb', tmp[i], t1) gvovv[i] += numpy.einsum('b,ic->icb', mvv[:,i]*.5, t1) gvovv[i] = gvovv[i].transpose(0,2,1) #:gvovv += numpy.einsum('ja,jibc->aibc', l1, t2) #:gvovv += numpy.einsum('jibc,ja->aibc', l2, t1) #:gvovv -= numpy.einsum('aibk,kc->aibc', pvOvO, t1) mOvOv = lib.transpose(mOvOv.reshape(nov,-1)) lib.dot(mOvOv.reshape(nocc,-1).T, t1, -1, gvovv.reshape(-1,nvir), 1) mOvOv = None lib.dot(l1.T, t2.reshape(nocc,-1), 1, gvovv.reshape(nvir,-1), 1) lib.dot(t1.T, l2.reshape(nocc,-1), 1, gvovv.reshape(nvir,-1), 1) tmp = numpy.empty((nocc,nvir,nvir)) for i in range(nvir): #:gvovv*2 - gvovv.transpose(0,1,3,2) gvovv[i] = _ccsd.make_021(gvovv[i], gvovv[i], 2, -1, out=tmp) #:gvvvv = numpy.einsum('ijab,ijcd->abcd', l2, t2)*.5 #:jabc = numpy.einsum('ijab,ic->jabc', l2, t1) * .5 #:gvvvv += numpy.einsum('jabc,jd->abcd', jabc, t1) #:gvovv -= numpy.einsum('adbc,id->aibc', gvvvv, t1*2) tau = _ccsd.make_tau(t2, t1, t1) theta = make_theta(tau) tau = None l2tmp = _ccsd.pack_tril(l2.reshape(-1,nvir,nvir)) gtmp = lib.dot(l2tmp.T, theta.reshape(nocc**2,-1), .5).reshape(-1,nvir,nvir) l2tmp = theta = None nvir_pair = nvir * (nvir+1) //2 tmp = numpy.empty((nvir,nvir,nvir)) tmp1 = numpy.empty((nvir,nvir,nvir)) tmptril = numpy.empty((nvir,nvir_pair)) diag_idx = numpy.arange(nvir) diag_idx = diag_idx*(diag_idx+1)//2 + diag_idx dvvvv = numpy.empty((nvir_pair,nvir_pair)) dovvv = numpy.empty((nocc,nvir,nvir,nvir)) # dvvov = (gvovv*2 - gvovv.transpose(0,1,3,2)).transpose(0,2,1,3) # dovvv = dvvov.transpose(2,3,0,1) p0 = 0 for i in range(nvir): tmp[:i+1] = gtmp[p0:p0+i+1] for j in range(i+1, nvir): tmp[j] = gtmp[j*(j+1)//2+i].T lib.dot(t1, tmp.reshape(nvir,-1), -2, gvovv[i].reshape(nocc,-1), 1) dovvv[:,:,i] = gvovv[i].transpose(0,2,1) #:gvvvv[i] = (tmp*2-tmp.transpose(0,2,1)).transpose(1,0,2) #:gvvvv = .5*(gvvvv+gvvvv.transpose(0,1,3,2)) #:dvvvv = .5*(gvvvv+gvvvv.transpose(1,0,3,2)) tmp1[:] = tmp.transpose(1,0,2) _ccsd.precontract(tmp1, diag_fac=2, out=tmptril) dvvvv[p0:p0+i] += tmptril[:i] dvvvv[p0:p0+i] *= .25 dvvvv[i*(i+1)//2+i] = tmptril[i] * .5 for j in range(i+1, nvir): dvvvv[j*(j+1)//2+i] = tmptril[j] p0 += i + 1 gtmp = tmp = tmp1 = tmptril = gvovv = None dvvov = dovvv.transpose(2,3,0,1) return (dovov, dvvvv, doooo, doovv, dovvo, dvvov, dovvv, dooov)
def gamma2_incore(mycc, t1, t2, l1, l2): log = logger.Logger(mycc.stdout, mycc.verbose) nocc, nvir = t1.shape nov = nocc * nvir time1 = time.clock(), time.time() #:theta = make_theta(t2) #:mOvOv = numpy.einsum('ikca,jkcb->jbia', l2, t2) #:mOVov = -numpy.einsum('ikca,jkbc->jbia', l2, t2) #:mOVov += numpy.einsum('ikac,jkbc->jbia', l2, theta) l2a = numpy.empty((nocc, nvir, nocc, nvir)) t2a = numpy.empty((nocc, nvir, nocc, nvir)) for i in range(nocc): l2a[i] = l2[i].transpose(2, 0, 1) t2a[i] = t2[i].transpose(2, 0, 1) mOvOv = lib.dot(t2a.reshape(-1, nov), l2a.reshape(-1, nov).T).reshape(nocc, nvir, nocc, nvir) for i in range(nocc): t2a[i] = t2[i].transpose(1, 0, 2) mOVov = lib.dot(t2a.reshape(-1, nov), l2a.reshape(-1, nov).T, -1).reshape(nocc, nvir, nocc, nvir) theta = t2a for i in range(nocc): l2a[i] = l2[i].transpose(1, 0, 2) theta[i] *= 2 theta[i] -= t2[i].transpose(2, 0, 1) lib.dot(theta.reshape(-1, nov), l2a.reshape(nov, -1).T, 1, mOVov.reshape(nov, -1), 1) theta = l2a = t2a = None moo = (numpy.einsum('jdld->jl', mOvOv) * 2 + numpy.einsum('jdld->jl', mOVov)) mvv = (numpy.einsum('lbld->bd', mOvOv) * 2 + numpy.einsum('lbld->bd', mOVov)) mia = (numpy.einsum('kc,ikac->ia', l1, t2) * 2 - numpy.einsum('kc,ikca->ia', l1, t2)) mab = numpy.einsum('kc,kb->cb', l1, t1) mij = numpy.einsum('kc,jc->jk', l1, t1) + moo * .5 gooov = numpy.zeros((nocc, nocc, nocc, nvir)) tau = _ccsd.make_tau(t2, t1, t1) #:goooo = numpy.einsum('ijab,klab->klij', l2, tau)*.5 goooo = lib.dot(tau.reshape(-1, nvir**2), l2.reshape(-1, nvir**2).T, .5) goooo = goooo.reshape(-1, nocc, nocc, nocc) doooo = _cp(make_theta(goooo).transpose(0, 2, 1, 3)) #:gooov -= numpy.einsum('ib,kjab->jkia', l1, tau) #:gooov -= numpy.einsum('kjab,ib->jkia', l2, t1) #:gooov += numpy.einsum('jkil,la->jkia', goooo, t1*2) gooov = lib.dot(_cp(tau.reshape(-1, nvir)), l1.T, -1) lib.dot(_cp(l2.reshape(-1, nvir)), t1.T, -1, gooov, 1) gooov = gooov.reshape(nocc, nocc, nvir, nocc) tmp = numpy.einsum('ji,ka->jkia', moo * -.5, t1) tmp += gooov.transpose(1, 0, 3, 2) gooov, tmp = tmp, None lib.dot(goooo.reshape(-1, nocc), t1, 2, gooov.reshape(-1, nvir), 1) goovv = numpy.einsum('ia,jb->ijab', mia, t1) for i in range(nocc): goovv[i] += .5 * l2[i] goovv[i] += .5 * tau[i] #:goovv -= numpy.einsum('jk,kiba->jiba', mij, tau) lib.dot(mij, tau.reshape(nocc, -1), -1, goovv.reshape(nocc, -1), 1) #:goovv -= numpy.einsum('cb,ijac->ijab', mab, t2) #:goovv -= numpy.einsum('bd,ijad->ijab', mvv*.5, tau) lib.dot(t2.reshape(-1, nvir), mab, -1, goovv.reshape(-1, nvir), 1) lib.dot(tau.reshape(-1, nvir), mvv.T, -.5, goovv.reshape(-1, nvir), 1) tau = None #:gooov += numpy.einsum('jaic,kc->jkia', mOvOv, t1) #:gooov -= numpy.einsum('kaic,jc->jkia', mOVov, t1) tmp = lib.dot(mOvOv.reshape(-1, nvir), t1.T).reshape(nocc, -1, nocc, nocc) gooov += tmp.transpose(0, 3, 2, 1) lib.dot(t1, mOVov.reshape(-1, nvir).T, 1, tmp.reshape(nocc, -1), 0) gooov -= tmp.reshape(nocc, nocc, nvir, nocc).transpose(0, 1, 3, 2) dooov = gooov.transpose(0, 2, 1, 3) * 2 - gooov.transpose(1, 2, 0, 3) gooov = None #:tmp = numpy.einsum('ikac,jc->jaik', l2, t1) #:gOvVo -= numpy.einsum('jaik,kb->jabi', tmp, t1) #:gOvvO = numpy.einsum('jaki,kb->jabi', tmp, t1) + mOvOv.transpose(0,3,1,2) tmp = tmp.reshape(nocc, nocc, nocc, nvir) lib.dot(t1, l2.reshape(-1, nvir).T, 1, tmp.reshape(nocc, -1)) gOvVo = numpy.einsum('ia,jb->jabi', l1, t1) gOvvO = numpy.empty((nocc, nvir, nvir, nocc)) for i in range(nocc): gOvVo[i] -= lib.dot(_cp(tmp[i].transpose(0, 2, 1).reshape(-1, nocc)), t1).reshape(nocc, nvir, -1).transpose(1, 2, 0) gOvVo[i] += mOVov[i].transpose(2, 0, 1) gOvvO[i] = lib.dot(tmp[i].reshape(nocc, -1).T, t1).reshape(nocc, nvir, -1).transpose(1, 2, 0) gOvvO[i] += mOvOv[i].transpose(2, 0, 1) tmp = None dovvo = numpy.empty((nocc, nvir, nvir, nocc)) doovv = numpy.empty((nocc, nocc, nvir, nvir)) for i in range(nocc): tmp = gOvVo[i] * 2 + gOvvO[i] dovvo[i] = tmp.transpose(1, 0, 2) tmp = gOvvO[i] * -2 - gOvVo[i] doovv[i] = tmp.transpose(2, 0, 1) gOvvO = gOvVo = None tau2 = _ccsd.make_tau(t2, t1, t1) #:goovv += numpy.einsum('ijkl,klab->ijab', goooo[:,:,j0:j1], tau2) lib.dot(goooo.reshape(nocc * nocc, -1), tau2.reshape(-1, nvir**2), 1, goovv.reshape(-1, nvir**2), 1) tau2 += numpy.einsum('ia,jb->ijab', t1, t1) tau2p = tau2.reshape(nocc, nvir, nocc, nvir) for i in range(nocc): tau2p[i] = tau2[i].transpose(2, 0, 1) tau2, tau2p = tau2p.reshape(nov, -1), None #:goovv += numpy.einsum('ibld,jlda->ijab', mOvOv, tau2) * .5 #:goovv -= numpy.einsum('iald,jldb->ijab', mOVov, tau2) * .5 tmp = lib.dot(mOvOv.reshape(-1, nov), tau2.T, .5).reshape(nocc, nvir, -1, nvir) for i in range(nocc): tmp[i] = goovv[i].transpose(1, 0, 2) + tmp[i].transpose(2, 1, 0) goovv, tmp = tmp, None lib.dot(mOVov.reshape(-1, nov), tau2.T, -.5, goovv.reshape(nov, -1), 1) #:goovv += numpy.einsum('iald,jlbd->ijab', mOVov*2+mOvOv, t2) * .5 t2a, tau2 = tau2.reshape(nocc, nvir, nocc, nvir), None for i in range(nocc): t2a[i] = t2[i].transpose(1, 0, 2) tmp = mOVov * 2 tmp += mOvOv lib.dot(tmp.reshape(-1, nov), t2a.reshape(nov, -1), .5, goovv.reshape(nov, -1), 1) t2a = tmp = None for i in range(nocc): goovv[i] = goovv[i] * 2 - goovv[i].transpose(2, 1, 0) dovov = goovv goooo = goovv = None #:gvovv += numpy.einsum('aick,kb->aibc', pvOVo, t1) mOVov = lib.transpose(mOVov.reshape(nov, -1)) gvovv = lib.dot(mOVov.reshape(nocc, -1).T, t1).reshape(nvir, nocc, nvir, nvir) mOVov = None tmp = numpy.einsum('ja,jb->ab', l1, t1) #:gvovv += numpy.einsum('ab,ic->aibc', tmp, t1) #:gvovv += numpy.einsum('ba,ic->aibc', mvv, t1*.5) for i in range(nvir): gvovv[i] += numpy.einsum('b,ic->icb', tmp[i], t1) gvovv[i] += numpy.einsum('b,ic->icb', mvv[:, i] * .5, t1) gvovv[i] = gvovv[i].transpose(0, 2, 1) #:gvovv += numpy.einsum('ja,jibc->aibc', l1, t2) #:gvovv += numpy.einsum('jibc,ja->aibc', l2, t1) #:gvovv -= numpy.einsum('aibk,kc->aibc', pvOvO, t1) mOvOv = lib.transpose(mOvOv.reshape(nov, -1)) lib.dot(mOvOv.reshape(nocc, -1).T, t1, -1, gvovv.reshape(-1, nvir), 1) mOvOv = None lib.dot(l1.T, t2.reshape(nocc, -1), 1, gvovv.reshape(nvir, -1), 1) lib.dot(t1.T, l2.reshape(nocc, -1), 1, gvovv.reshape(nvir, -1), 1) tmp = numpy.empty((nocc, nvir, nvir)) for i in range(nvir): #:gvovv*2 - gvovv.transpose(0,1,3,2) gvovv[i] = _ccsd.make_021(gvovv[i], gvovv[i], 2, -1, out=tmp) #:gvvvv = numpy.einsum('ijab,ijcd->abcd', l2, t2)*.5 #:jabc = numpy.einsum('ijab,ic->jabc', l2, t1) * .5 #:gvvvv += numpy.einsum('jabc,jd->abcd', jabc, t1) #:gvovv -= numpy.einsum('adbc,id->aibc', gvvvv, t1*2) tau = _ccsd.make_tau(t2, t1, t1) theta = make_theta(tau) tau = None l2tmp = _ccsd.pack_tril(l2.reshape(-1, nvir, nvir)) gtmp = lib.dot(l2tmp.T, theta.reshape(nocc**2, -1), .5).reshape(-1, nvir, nvir) l2tmp = theta = None nvir_pair = nvir * (nvir + 1) // 2 tmp = numpy.empty((nvir, nvir, nvir)) tmp1 = numpy.empty((nvir, nvir, nvir)) tmptril = numpy.empty((nvir, nvir_pair)) diag_idx = numpy.arange(nvir) diag_idx = diag_idx * (diag_idx + 1) // 2 + diag_idx dvvvv = numpy.empty((nvir_pair, nvir_pair)) dovvv = numpy.empty((nocc, nvir, nvir, nvir)) # dvvov = (gvovv*2 - gvovv.transpose(0,1,3,2)).transpose(0,2,1,3) # dovvv = dvvov.transpose(2,3,0,1) p0 = 0 for i in range(nvir): tmp[:i + 1] = gtmp[p0:p0 + i + 1] for j in range(i + 1, nvir): tmp[j] = gtmp[j * (j + 1) // 2 + i].T lib.dot(t1, tmp.reshape(nvir, -1), -2, gvovv[i].reshape(nocc, -1), 1) dovvv[:, :, i] = gvovv[i].transpose(0, 2, 1) #:gvvvv[i] = (tmp*2-tmp.transpose(0,2,1)).transpose(1,0,2) #:gvvvv = .5*(gvvvv+gvvvv.transpose(0,1,3,2)) #:dvvvv = .5*(gvvvv+gvvvv.transpose(1,0,3,2)) tmp1[:] = tmp.transpose(1, 0, 2) _ccsd.precontract(tmp1, diag_fac=2, out=tmptril) dvvvv[p0:p0 + i] += tmptril[:i] dvvvv[p0:p0 + i] *= .25 dvvvv[i * (i + 1) // 2 + i] = tmptril[i] * .5 for j in range(i + 1, nvir): dvvvv[j * (j + 1) // 2 + i] = tmptril[j] p0 += i + 1 gtmp = tmp = tmp1 = tmptril = gvovv = None dvvov = dovvv.transpose(2, 3, 0, 1) return (dovov, dvvvv, doooo, doovv, dovvo, dvvov, dovvv, dooov)
def __init__(self, cc, mo_coeff=None, method='incore'): cput0 = (time.clock(), time.time()) moidx = numpy.ones(cc.mo_energy.size, dtype=numpy.bool) if isinstance(cc.frozen, (int, numpy.integer)): moidx[:cc.frozen] = False elif len(cc.frozen) > 0: moidx[numpy.asarray(cc.frozen)] = False if mo_coeff is None: self.mo_coeff = mo_coeff = cc.mo_coeff[:, moidx] self.fock = numpy.diag(cc.mo_energy[moidx]) else: # If mo_coeff is not canonical orbital self.mo_coeff = mo_coeff = mo_coeff[:, moidx] 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)) nocc = cc.nocc() nmo = cc.nmo() nvir = nmo - nocc mem_incore, mem_outcore, mem_basic = _mem_usage(nocc, nvir) mem_now = pyscf.lib.current_memory()[0] log = logger.Logger(cc.stdout, cc.verbose) if (method == 'incore' and cc._scf._eri is not None and (mem_incore + mem_now < cc.max_memory) or cc.mol.incore_anyway): eri1 = pyscf.ao2mo.incore.full(cc._scf._eri, mo_coeff) #:eri1 = pyscf.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.oovv = eri1[:nocc,:nocc,nocc:,nocc:].copy() #:self.ovov = eri1[:nocc,nocc:,:nocc,nocc:].copy() #:ovvv = eri1[:nocc,nocc:,nocc:,nocc:].copy() #:self.ovvv = numpy.empty((nocc,nvir,nvir*(nvir+1)//2)) #:for i in range(nocc): #: for j in range(nvir): #: self.ovvv[i,j] = lib.pack_tril(ovvv[i,j]) #:self.vvvv = pyscf.ao2mo.restore(4, eri1[nocc:,nocc:,nocc:,nocc:], nvir) nvir_pair = nvir * (nvir + 1) // 2 self.oooo = numpy.empty((nocc, nocc, nocc, nocc)) self.ooov = numpy.empty((nocc, nocc, nocc, nvir)) self.ovoo = numpy.empty((nocc, nvir, nocc, nocc)) self.oovv = numpy.empty((nocc, nocc, nvir, nvir)) self.ovov = numpy.empty((nocc, nvir, nocc, nvir)) self.ovvv = numpy.empty((nocc, nvir, nvir_pair)) self.vvvv = numpy.empty((nvir_pair, nvir_pair)) ij = 0 outbuf = numpy.empty((nmo, nmo, nmo)) for i in range(nocc): buf = _ccsd.unpack_tril(eri1[ij:ij + i + 1], out=outbuf[:i + 1]) for j in range(i + 1): self.oooo[i, j] = self.oooo[j, i] = buf[j, :nocc, :nocc] self.ooov[i, j] = self.ooov[j, i] = buf[j, :nocc, nocc:] self.oovv[i, j] = self.oovv[j, i] = buf[j, nocc:, nocc:] ij += i + 1 ij1 = 0 for i in range(nocc, nmo): buf = _ccsd.unpack_tril(eri1[ij:ij + i + 1], out=outbuf[:i + 1]) self.ovoo[:, i - nocc] = buf[:nocc, :nocc, :nocc] self.ovov[:, i - nocc] = buf[:nocc, :nocc, nocc:] for j in range(nocc): self.ovvv[j, i - nocc] = lib.pack_tril( _cp(buf[j, nocc:, nocc:])) for j in range(nocc, i + 1): self.vvvv[ij1] = lib.pack_tril(_cp(buf[j, nocc:, nocc:])) ij1 += 1 ij += i + 1 else: cput1 = time.clock(), time.time() _tmpfile1 = tempfile.NamedTemporaryFile() _tmpfile2 = tempfile.NamedTemporaryFile() self.feri1 = h5py.File(_tmpfile1.name) orbo = mo_coeff[:, :nocc] orbv = mo_coeff[:, nocc:] nvpair = nvir * (nvir + 1) // 2 self.oooo = self.feri1.create_dataset('oooo', (nocc, nocc, nocc, nocc), 'f8') self.ooov = self.feri1.create_dataset('ooov', (nocc, nocc, nocc, nvir), 'f8') self.ovoo = self.feri1.create_dataset('ovoo', (nocc, nvir, nocc, nocc), 'f8') self.oovv = self.feri1.create_dataset('oovv', (nocc, nocc, nvir, nvir), 'f8') self.ovov = self.feri1.create_dataset('ovov', (nocc, nvir, nocc, nvir), 'f8') self.ovvv = self.feri1.create_dataset('ovvv', (nocc, nvir, nvpair), 'f8') max_memory = max(2000, cc.max_memory - pyscf.lib.current_memory()[0]) self.feri2 = h5py.File(_tmpfile2.name, 'w') pyscf.ao2mo.full(cc.mol, orbv, self.feri2, max_memory=max_memory, verbose=log) self.vvvv = self.feri2['eri_mo'] cput1 = log.timer_debug1('transforming vvvv', *cput1) tmpfile3 = tempfile.NamedTemporaryFile() with h5py.File(tmpfile3.name, 'w') as feri: max_memory = max(2000, cc.max_memory - pyscf.lib.current_memory()[0]) pyscf.ao2mo.general(cc.mol, (orbo, mo_coeff, mo_coeff, mo_coeff), feri, max_memory=max_memory, verbose=log) cput1 = log.timer_debug1('transforming oppp', *cput1) eri1 = feri['eri_mo'] outbuf = numpy.empty((nmo, nmo, nmo)) for i in range(nocc): buf = _ccsd.unpack_tril(_cp(eri1[i * nmo:(i + 1) * nmo]), out=outbuf) self.oooo[i] = buf[:nocc, :nocc, :nocc] self.ooov[i] = buf[:nocc, :nocc, nocc:] self.ovoo[i] = buf[nocc:, :nocc, :nocc] self.oovv[i] = buf[:nocc, nocc:, nocc:] self.ovov[i] = buf[nocc:, :nocc, nocc:] self.ovvv[i] = _ccsd.pack_tril( _cp(buf[nocc:, nocc:, nocc:])) cput1 = log.timer_debug1('sorting %d' % i, *cput1) for key in feri.keys(): del (feri[key]) log.timer('CCSD integral transformation', *cput0)