def ao2mo_(casscf, mo): t0 = (time.clock(), time.time()) log = logger.Logger(casscf.stdout, casscf.verbose) # using dm=[], a hacky call to dfhf.get_jk, to generate casscf._cderi dfhf.get_jk_(casscf, casscf.mol, []) if log.verbose >= logger.DEBUG1: t1 = log.timer('Generate density fitting integrals', *t0) if hasattr(casscf._scf, '_tag_df') and casscf._scf._tag_df: eris = _ERIS(casscf, mo) else: # Only approximate the orbital rotation, call the 4-center integral # transformation. CASSCF is exact. eris = mc_ao2mo._ERIS(casscf, mo, 'incore', level=2) t0 = (time.clock(), time.time()) mo = numpy.asarray(mo, order='F') nao, nmo = mo.shape ncore = casscf.ncore eris.j_pc = numpy.zeros((nmo,ncore)) k_cp = numpy.zeros((ncore,nmo)) fmmm = _ao2mo._fpointer('AO2MOmmm_nr_s2_iltj') fdrv = _ao2mo.libao2mo.AO2MOnr_e2_drv ftrans = _ao2mo._fpointer('AO2MOtranse2_nr_s2') bufs1 = numpy.empty((dfhf.BLOCKDIM,nmo,nmo)) with df.load(casscf._cderi) as feri: for b0, b1 in dfhf.prange(0, casscf._naoaux, dfhf.BLOCKDIM): eri1 = numpy.asarray(feri[b0:b1], order='C') buf = bufs1[:b1-b0] if log.verbose >= logger.DEBUG1: t1 = log.timer('load buf %d:%d'%(b0,b1), *t1) fdrv(ftrans, fmmm, buf.ctypes.data_as(ctypes.c_void_p), eri1.ctypes.data_as(ctypes.c_void_p), mo.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(b1-b0), ctypes.c_int(nao), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_void_p(0), ctypes.c_int(0)) if log.verbose >= logger.DEBUG1: t1 = log.timer('transform [%d:%d]'%(b0,b1), *t1) bufd = numpy.einsum('kii->ki', buf) eris.j_pc += numpy.einsum('ki,kj->ij', bufd, bufd[:,:ncore]) k_cp += numpy.einsum('kij,kij->ij', buf[:,:ncore], buf[:,:ncore]) if log.verbose >= logger.DEBUG1: t1 = log.timer('j_pc and k_pc', *t1) eri1 = None eris.k_pc = k_cp.T.copy() log.timer('ao2mo density fit part', *t0) return eris
def ao2mo(self, mo_coeff): log = logger.Logger(self.stdout, self.verbose) # the exact integral transformation eris = casscf_class.ao2mo(self, mo_coeff) # using dm=[], a hacky call to dfhf.get_jk, to generate self._cderi dfhf.get_jk_(self, self.mol, []) # Add the approximate diagonal term for orbital hessian t0 = (time.clock(), time.time()) mo = numpy.asarray(mo_coeff, order='F') nao, nmo = mo.shape ncore = self.ncore eris.j_pc = numpy.zeros((nmo,ncore)) k_cp = numpy.zeros((ncore,nmo)) fmmm = _ao2mo._fpointer('AO2MOmmm_nr_s2_iltj') fdrv = _ao2mo.libao2mo.AO2MOnr_e2_drv ftrans = _ao2mo._fpointer('AO2MOtranse2_nr_s2') bufs1 = numpy.empty((dfhf.BLOCKDIM,nmo,nmo)) with df.load(self._cderi) as feri: for b0, b1 in dfhf.prange(0, self._naoaux, dfhf.BLOCKDIM): eri1 = numpy.asarray(feri[b0:b1], order='C') buf = bufs1[:b1-b0] if log.verbose >= logger.DEBUG1: t1 = log.timer('load buf %d:%d'%(b0,b1), *t1) fdrv(ftrans, fmmm, buf.ctypes.data_as(ctypes.c_void_p), eri1.ctypes.data_as(ctypes.c_void_p), mo.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(b1-b0), ctypes.c_int(nao), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_void_p(0), ctypes.c_int(0)) if log.verbose >= logger.DEBUG1: t1 = log.timer('transform [%d:%d]'%(b0,b1), *t1) bufd = numpy.einsum('kii->ki', buf) eris.j_pc += numpy.einsum('ki,kj->ij', bufd, bufd[:,:ncore]) k_cp += numpy.einsum('kij,kij->ij', buf[:,:ncore], buf[:,:ncore]) if log.verbose >= logger.DEBUG1: t1 = log.timer('j_pc and k_pc', *t1) eri1 = None eris.k_pc = k_cp.T.copy() log.timer('ao2mo density fit part', *t0) return eris
def ao2mo_aaaa(casscf, mo): dfhf.get_jk_(casscf, casscf.mol, []) nao, nmo = mo.shape buf = numpy.empty((casscf._naoaux,nmo*(nmo+1)//2)) mo = numpy.asarray(mo, order='F') fmmm = _ao2mo._fpointer('AO2MOmmm_nr_s2_s2') fdrv = _ao2mo.libao2mo.AO2MOnr_e2_drv ftrans = _ao2mo._fpointer('AO2MOtranse2_nr_s2') with df.load(casscf._cderi) as feri: for b0, b1 in dfhf.prange(0, casscf._naoaux, dfhf.BLOCKDIM): eri1 = numpy.asarray(feri[b0:b1], order='C') fdrv(ftrans, fmmm, buf[b0:b1].ctypes.data_as(ctypes.c_void_p), eri1.ctypes.data_as(ctypes.c_void_p), mo.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(b1-b0), ctypes.c_int(nao), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_int(0), ctypes.c_int(nmo), ctypes.c_void_p(0), ctypes.c_int(0)) eri1 = None eri = pyscf.lib.dot(buf.T, buf) return eri
def get_jk(self, mol, dm, hermi=1): return dfhf.get_jk_(self, mol, dm, hermi=hermi)
def ao2mo(self, mo_coeff): # using dm=[], a hacky call to dfhf.get_jk, to generate self._cderi dfhf.get_jk_(self, self.mol, []) return _ERIS(self, mo_coeff)
def get_veff(self, mol=None, dm=None, hermi=1): return dfhf.get_jk_(self, mol, dm, hermi=hermi)