def response_dm1(cc, t1, t2, l1, l2, eris=None, IX=None): from pyscf.grad import cphf if eris is None: # Note eris are in Chemist's notation eris = ccsd._ERIS(cc) if IX is None: Ioo, Ivv, Ivo, Xvo = IX_intermediates(cc, t1, t2, l1, l2, eris) else: Ioo, Ivv, Ivo, Xvo = IX nocc, nvir = t1.shape nmo = nocc + nvir def fvind(x): x = x.reshape(Xvo.shape) if eris is None: mo_coeff = cc.mo_coeff dm = reduce(numpy.dot, (mo_coeff[:,nocc:], x, mo_coeff[:,:nocc].T)) v = reduce(numpy.dot, (mo_coeff[:,nocc:].T, cc._scf.get_veff(mol, dm), mo_coeff[:,:nocc])) else: v = numpy.einsum('iajb,bj->ai', eris.ovov, x) * 4 v -= numpy.einsum('jiab,bj->ai', eris.oovv, x) v -= numpy.einsum('ibja,bj->ai', eris.ovov, x) return v mo_energy = eris.fock.diagonal() mo_occ = numpy.zeros_like(mo_energy) mo_occ[:nocc] = 2 dvo = cphf.solve(fvind, mo_energy, mo_occ, Xvo, max_cycle=30)[0] dm1 = numpy.zeros((nmo,nmo)) dm1[nocc:,:nocc] = dvo dm1[:nocc,nocc:] = dvo.T return dm1
def response_dm1(mycc, t1, t2, l1, l2, eris=None, IX=None, max_memory=2000): if eris is None: # Note eris are in Chemist's notation eris = ccsd._ERIS(mycc) if IX is None: Ioo, Ivv, Ivo, Xvo = IX_intermediates(mycc, t1, t2, l1, l2, eris, max_memory=2000) else: Ioo, Ivv, Ivo, Xvo = IX nocc, nvir = t1.shape nmo = nocc + nvir max_memory = max_memory - lib.current_memory()[0] blksize = max(ccsd.BLKMIN, int(max_memory*1e6/8/(nocc*nvir**2))) def fvind(x): x = x.reshape(Xvo.shape) if eris is None: mo_coeff = mycc.mo_coeff dm = reduce(numpy.dot, (mo_coeff[:,nocc:], x, mo_coeff[:,:nocc].T)) dm = (dm + dm.T) * 2 v = reduce(numpy.dot, (mo_coeff[:,nocc:].T, mycc._scf.get_veff(mol, dm), mo_coeff[:,:nocc])) else: v = numpy.zeros((nocc,nvir)) for p0, p1 in prange(0, nocc, blksize): eris_ovov = _cp(eris.ovov[p0:p1]) v[p0:p1] += numpy.einsum('iajb,bj->ia', eris_ovov, x) * 4 v[p0:p1] -= numpy.einsum('ibja,bj->ia', eris_ovov, x) eris_ovov = None v -= numpy.einsum('jiab,bj->ia', _cp(eris.oovv[p0:p1]), x[:,p0:p1]) return v.T mo_energy = eris.fock.diagonal() mo_occ = numpy.zeros_like(mo_energy) mo_occ[:nocc] = 2 dvo = cphf.solve(fvind, mo_energy, mo_occ, Xvo, max_cycle=30)[0] dm1 = numpy.zeros((nmo,nmo)) dm1[nocc:,:nocc] = dvo dm1[:nocc,nocc:] = dvo.T return dm1
def solve_mo1(self, mo_energy=None, mo_occ=None, h1=None, s1=None): cput1 = (time.clock(), time.time()) log = logger.Logger(self.stdout, self.verbose) if mo_energy is None: mo_energy = self._scf.mo_energy if mo_occ is None: mo_occ = self._scf.mo_occ mol = self.mol if h1 is None: mo_coeff = self._scf.mo_coeff dm0 = self._scf.make_rdm1(mo_coeff, mo_occ) h1 = _mat_ao2mo(self.make_h10(mol, dm0), mo_coeff, mo_occ) if s1 is None: s1 = _mat_ao2mo(self.make_s10(mol), mo_coeff, mo_occ) cput1 = log.timer('first order Fock matrix', *cput1) if self.cphf: mo10, mo_e10 = cphf.solve(self._vind, mo_energy, mo_occ, h1, s1, self.max_cycle_cphf, self.conv_tol, verbose=log) else: mo10, mo_e10 = solve_mo1(mo_energy, mo_occ, h1, s1) logger.timer(self, 'solving mo1 eqn', *cput1) return mo10, mo_e10