コード例 #1
0
ファイル: test_ft_ao.py プロジェクト: chrinide/pyscf
    def test_ft_ao1(self):
        ref = ft_ao_o0(mol, Gv)
        dat = ft_ao.ft_ao(mol, Gv)
        self.assertTrue(numpy.allclose(ref, dat))

        dat = ft_ao.ft_ao(mol, Gv, b=b, gxyz=gxyz, Gvbase=Gvbase)
        self.assertTrue(numpy.allclose(ref, dat))
コード例 #2
0
ファイル: test_ft_ao.py プロジェクト: zwang123/pyscf
    def test_ft_ao1(self):
        ref = ft_ao_o0(mol, Gv)
        dat = ft_ao.ft_ao(mol, Gv)
        self.assertTrue(numpy.allclose(ref, dat))

        dat = ft_ao.ft_ao(mol, Gv, b=b, gxyz=gxyz, Gvbase=Gvbase)
        self.assertTrue(numpy.allclose(ref, dat))
コード例 #3
0
ファイル: test_ft_ao.py プロジェクト: zwang123/pyscf
    def test_ft_ao2(self):
        numpy.random.seed(12)
        invh = numpy.random.random(3) + numpy.eye(3) * 2.5
        b = 2 * numpy.pi * invh
        Gv = numpy.dot(lib.cartesian_prod(Gvbase), b)
        ref = ft_ao_o0(mol, Gv)
        dat = ft_ao.ft_ao(mol, Gv)
        self.assertTrue(numpy.allclose(ref, dat))

        mol1 = mol.copy()
        mol1.cart = True
        ref = ft_ao.ft_ao(mol1, Gv)
        dat = ft_ao.ft_ao(mol1, Gv, b=b, gxyz=gxyz, Gvbase=Gvbase)
        self.assertTrue(numpy.allclose(ref, dat))
コード例 #4
0
ファイル: test_ft_ao.py プロジェクト: chrinide/pyscf
    def test_ft_ao2(self):
        numpy.random.seed(12)
        invh = numpy.random.random(3) + numpy.eye(3) * 2.5
        b = 2*numpy.pi * invh
        Gv = numpy.dot(lib.cartesian_prod(Gvbase), b)
        ref = ft_ao_o0(mol, Gv)
        dat = ft_ao.ft_ao(mol, Gv)
        self.assertTrue(numpy.allclose(ref, dat))

        mol1 = mol.copy()
        mol1.cart = True
        ref = ft_ao.ft_ao(mol1, Gv)
        dat = ft_ao.ft_ao(mol1, Gv, b=b, gxyz=gxyz, Gvbase=Gvbase)
        self.assertTrue(numpy.allclose(ref, dat))
コード例 #5
0
ファイル: test_ft_ao.py プロジェクト: berquist/pyscf
 def test_ft_ao(self):
     numpy.random.seed(12)
     invh = numpy.diag(numpy.random.random(3))
     Gv = 2*numpy.pi* numpy.dot(gxyz, invh)
     ref = ft_ao_o0(mol, Gv)
     dat = ft_ao.ft_ao(mol, Gv)
     self.assertTrue(numpy.allclose(ref, dat))
コード例 #6
0
 def test_ft_ao(self):
     numpy.random.seed(12)
     invh = numpy.diag(numpy.random.random(3))
     Gv = 2 * numpy.pi * numpy.dot(gxyz, invh)
     ref = ft_ao_o0(mol, Gv)
     dat = ft_ao.ft_ao(mol, Gv)
     self.assertTrue(numpy.allclose(ref, dat))
コード例 #7
0
def get_eri_2c2e(mydf):
    from pyscf.gto.ft_ao import ft_ao
    eriR = 0
    kptijkl = numpy.zeros((4, 3))
    q = numpy.zeros(3)
    coulG = mydf.weighted_coulG(q, False, mydf.mesh)
    Gv, Gvbase, kws = cell.get_Gv_weights(mydf.mesh)
    ao = ft_ao(cell, Gv)
    return lib.dot(ao.T * coulG, ao.conj())
コード例 #8
0
ファイル: test_f12_with_aft.py プロジェクト: sunqm/libcint
def get_eri_2c2e(mydf):
    from pyscf.gto.ft_ao import ft_ao
    eriR = 0
    kptijkl = numpy.zeros((4,3))
    q = numpy.zeros(3)
    coulG = mydf.weighted_coulG(q, False, mydf.mesh)
    Gv, Gvbase, kws = cell.get_Gv_weights(mydf.mesh)
    ao = ft_ao(cell, Gv)
    return lib.dot(ao.T*coulG, ao.conj())
コード例 #9
0
    def pw_loop(self, mol, auxmol, gs, shls_slice=None, max_memory=2000):
        '''Plane wave part'''
        if isinstance(gs, int):
            gs = [gs]*3
        naux = auxmol.nao_nr()
        Gv, Gvbase, kws = non_uniform_kgrids(gs)
        nxyz = [i*2 for i in gs]
        gxyz = lib.cartesian_prod([range(i) for i in nxyz])
        kk = numpy.einsum('ki,ki->k', Gv, Gv)
        idx = numpy.argsort(kk)[::-1]
#        idx = idx[(kk[idx] < 300.) & (kk[idx] > 1e-4)]  # ~ Cut high energy plain waves
#        log.debug('Cut grids %d to %d', Gv.shape[0], len(idx))
        kk = kk[idx]
        Gv = Gv[idx]
        kws = kws[idx]
        gxyz = gxyz[idx]
        coulG = .5/numpy.pi**2 * kws / kk

        if shls_slice is None:
            ni = nj = mol.nao_nr()
        else:
            ao_loc = mol.ao_loc_nr()
            ni = ao_loc[shls_slice[1]] - ao_loc[shls_slice[0]]
            nj = ao_loc[shls_slice[3]] - ao_loc[shls_slice[2]]
        nij = ni * nj
        blksize = min(max(16, int(max_memory*1e6*.7/16/nij)), 16384)
        sublk = max(16,int(blksize//4))
        pqkRbuf = numpy.empty(nij*sublk)
        pqkIbuf = numpy.empty(nij*sublk)
        LkRbuf = numpy.empty(naux*sublk)
        LkIbuf = numpy.empty(naux*sublk)

        for p0, p1 in lib.prange(0, coulG.size, blksize):
            aoao = ft_ao.ft_aopair(mol, Gv[p0:p1], shls_slice, 's1',
                                   Gvbase, gxyz[p0:p1], nxyz)
            aoaux = ft_ao.ft_ao(auxmol, Gv[p0:p1], None, Gvbase, gxyz[p0:p1], nxyz)

            for i0, i1 in lib.prange(0, p1-p0, sublk):
                nG = i1 - i0
                pqkR = numpy.ndarray((ni,nj,nG), buffer=pqkRbuf)
                pqkI = numpy.ndarray((ni,nj,nG), buffer=pqkIbuf)
                LkR = numpy.ndarray((naux,nG), buffer=LkRbuf)
                LkI = numpy.ndarray((naux,nG), buffer=LkIbuf)
                pqkR[:] = aoao[i0:i1].real.transpose(1,2,0)
                pqkI[:] = aoao[i0:i1].imag.transpose(1,2,0)
                LkR [:] = aoaux[i0:i1].real.T
                LkI [:] = aoaux[i0:i1].imag.T
                yield (pqkR.reshape(-1,nG), LkR, pqkI.reshape(-1,nG), LkI,
                       coulG[p0+i0:p0+i1])
            aoao = aoaux = None
コード例 #10
0
def get_eri_3c2e(mydf):
    from pyscf.gto.ft_ao import ft_ao
    eriR = 0
    kptijkl = numpy.zeros((4, 3))
    q = numpy.zeros(3)
    coulG = mydf.weighted_coulG(q, False, mydf.mesh)
    Gv, Gvbase, kws = cell.get_Gv_weights(mydf.mesh)
    ao = ft_ao(cell, Gv)

    for pqkR, pqkI, p0, p1 \
            in mydf.pw_loop(mydf.mesh, kptijkl[:2], q, aosym='s2'):
        vG = coulG[p0:p1]
        pqkRv = pqkR * vG
        pqkIv = pqkI * vG
        # rho(G) v(G) rho(-G) = rho(G) v(G) [rho(G)]^*
        eriR += lib.ddot(pqkRv, ao[p0:p1].real)
        eriR += lib.ddot(pqkIv, ao[p0:p1].imag)
        pqkR = pqkI = None
    return eriR
コード例 #11
0
ファイル: test_f12_with_aft.py プロジェクト: sunqm/libcint
def get_eri_3c2e(mydf):
    from pyscf.gto.ft_ao import ft_ao
    eriR = 0
    kptijkl = numpy.zeros((4,3))
    q = numpy.zeros(3)
    coulG = mydf.weighted_coulG(q, False, mydf.mesh)
    Gv, Gvbase, kws = cell.get_Gv_weights(mydf.mesh)
    ao = ft_ao(cell, Gv)

    for pqkR, pqkI, p0, p1 \
            in mydf.pw_loop(mydf.mesh, kptijkl[:2], q, aosym='s2'):
        vG = coulG[p0:p1]
        pqkRv = pqkR * vG
        pqkIv = pqkI * vG
        # rho(G) v(G) rho(-G) = rho(G) v(G) [rho(G)]^*
        eriR += lib.ddot(pqkRv, ao[p0:p1].real)
        eriR += lib.ddot(pqkIv, ao[p0:p1].imag)
        pqkR = pqkI = None
    return eriR
コード例 #12
0
def _make_j3c(mydf, mol, auxmol):
    log = logger.Logger(mydf.stdout, mydf.verbose)
    atm, bas, env, ao_loc = incore._env_and_aoloc('cint3c2e_sph', mol, auxmol)
    nao = ao_loc[mol.nbas]
    naux = ao_loc[-1] - nao
    nao_pair = nao * (nao+1) // 2
    cintopt = gto.moleintor.make_cintopt(atm, bas, env, 'cint3c2e_sph')
    if mydf.approx_sr_level == 0:
        get_Lpq = _make_Lpq(mydf, mol, auxmol)
    else:
        get_Lpq = _make_Lpq_atomic_approx(mydf, mol, auxmol)

    feri = h5py.File(mydf._cderi)
    chunks = (min(256,naux), min(256,nao_pair)) # 512K
    feri.create_dataset('j3c', (naux,nao_pair), 'f8', chunks=chunks)
    feri.create_dataset('Lpq', (naux,nao_pair), 'f8', chunks=chunks)

    def save(label, dat, col0, col1):
        feri[label][:,col0:col1] = dat

    Gv, Gvbase, kws = non_uniform_kgrids(mydf.gs)
    nxyz = [i*2 for i in mydf.gs]
    gxyz = lib.cartesian_prod([range(i) for i in nxyz])
    kk = numpy.einsum('ki,ki->k', Gv, Gv)
    idx = numpy.argsort(kk)[::-1]
    kk = kk[idx]
    Gv = Gv[idx]
    kws = kws[idx]
    gxyz = gxyz[idx]
    coulG = .5/numpy.pi**2 * kws / kk

    aoaux = ft_ao.ft_ao(auxmol, Gv, None, Gvbase, gxyz, nxyz)
    kLR = numpy.asarray(aoaux.real, order='C')
    kLI = numpy.asarray(aoaux.imag, order='C')
    j2c = auxmol.intor('cint2c2e_sph', hermi=1).T  # .T to C-ordr
    lib.dot(kLR.T*coulG, kLR, -1, j2c, 1)
    lib.dot(kLI.T*coulG, kLI, -1, j2c, 1)

    kLR *= coulG.reshape(-1,1)
    kLI *= coulG.reshape(-1,1)
    aoaux = coulG = kk = kws = idx = None

    max_memory = max(2000, mydf.max_memory-lib.current_memory()[0])
    buflen = min(max(int(max_memory*.3*1e6/8/naux), 1), nao_pair)
    shranges = outcore._guess_shell_ranges(mol, buflen, 's2ij')
    buflen = max([x[2] for x in shranges])
    blksize = max(16, int(max_memory*.15*1e6/16/buflen))
    pqkbuf = numpy.empty(buflen*blksize)
    bufs1 = numpy.empty((buflen*naux))
    # bufs2 holds either Lpq and ft_aopair
    bufs2 = numpy.empty(max(buflen*(naux+1),buflen*blksize*2)) # *2 for cmplx

    col1 = 0
    for istep, sh_range in enumerate(shranges):
        log.debug('int3c2e [%d/%d], AO [%d:%d], ncol = %d', \
                  istep+1, len(shranges), *sh_range)
        bstart, bend, ncol = sh_range
        col0, col1 = col1, col1+ncol
        shls_slice = (bstart, bend, 0, bend, mol.nbas, mol.nbas+auxmol.nbas)

        Lpq = get_Lpq(shls_slice, col0, col1, bufs2)
        save('Lpq', Lpq, col0, col1)

        j3c = _ri.nr_auxe2('cint3c2e_sph', atm, bas, env, shls_slice, ao_loc,
                           's2ij', 1, cintopt, bufs1)
        j3c = j3c.T  # -> (L|pq) in C-order
        lib.dot(j2c, Lpq, -.5, j3c, 1)
        Lpq = None

        for p0, p1 in lib.prange(0, Gv.shape[0], blksize):
            aoao = ft_ao.ft_aopair(mol, Gv[p0:p1], shls_slice[:4], 's2',
                                   Gvbase, gxyz[p0:p1], nxyz, buf=bufs2)
            nG = p1 - p0
            pqkR = numpy.ndarray((ncol,nG), buffer=pqkbuf)
            pqkR[:] = aoao.real.T
            lib.dot(kLR[p0:p1].T, pqkR.T, -1, j3c, 1)
            pqkI = numpy.ndarray((ncol,nG), buffer=pqkbuf)
            pqkI[:] = aoao.imag.T
            lib.dot(kLI[p0:p1].T, pqkI.T, -1, j3c, 1)
            aoao = aoaux = None
        save('j3c', j3c, col0, col1)

    feri.close()