コード例 #1
0
ファイル: df.py プロジェクト: matk86/pyscf
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
コード例 #2
0
ファイル: df.py プロジェクト: v1j4y/pyscf
        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
コード例 #3
0
ファイル: df.py プロジェクト: matk86/pyscf
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
コード例 #4
0
ファイル: df.py プロジェクト: matk86/pyscf
 def get_jk(self, mol, dm, hermi=1):
     return dfhf.get_jk_(self, mol, dm, hermi=hermi)
コード例 #5
0
ファイル: df.py プロジェクト: v1j4y/pyscf
        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)
コード例 #6
0
ファイル: df.py プロジェクト: v1j4y/pyscf
 def get_veff(self, mol=None, dm=None, hermi=1):
     return dfhf.get_jk_(self, mol, dm, hermi=hermi)