Ejemplo n.º 1
0
    def test_ft_aoao_with_kpts(self):
        numpy.random.seed(1)
        kpti, kptj = numpy.random.random((2, 3))
        dat = ft_ao.ft_aopair(cell, cell.Gv, kpti_kptj=(kpti, kptj))
        self.assertAlmostEqual(finger(dat),
                               -0.80184732435570638 + 2.4078835207597176j, 9)
        coords = pdft.gen_grid.gen_uniform_grids(cell)
        aoi = pdft.numint.eval_ao(cell, coords, kpt=kpti)
        aoj = pdft.numint.eval_ao(cell, coords, kpt=kptj)
        ngs, nao = aoj.shape
        q = kptj - kpti
        expmikr = numpy.exp(-1j * numpy.dot(coords, q))
        ref = numpy.asarray([
            tools.fftk(aoi[:, i].conj() * aoj[:, j], cell.gs, expmikr)
            for i in range(nao) for j in range(nao)
        ])
        ref = ref.reshape(nao, nao, -1).transpose(2, 0, 1) * (cell.vol / ngs)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 0, 0] - dat[:, 0, 0]),
                               0, 5)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 1, 1] - dat[:, 1, 1]),
                               0.023225471785938184, 4)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 2:] - dat[:, 2:, 2:]), 0, 9)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 0, 2:] - dat[:, 0, 2:]), 0, 9)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 0] - dat[:, 2:, 0]), 0, 9)

        coords = pdft.gen_grid.gen_uniform_grids(cell1)
        aoi = pdft.numint.eval_ao(cell1, coords, kpt=kpti)
        aoj = pdft.numint.eval_ao(cell1, coords, kpt=kptj)
        ngs, nao = aoj.shape
        q = kptj - kpti
        dat = ft_ao.ft_aopair(cell1, cell1.Gv, kpti_kptj=(kpti, kptj), q=q)
        self.assertAlmostEqual(finger(dat),
                               0.72664436503332241 + 3.2542145296611373j, 9)
        expmikr = numpy.exp(-1j * numpy.dot(coords, q))
        ref = numpy.asarray([
            tools.fftk(aoi[:, i].conj() * aoj[:, j], cell1.gs, expmikr)
            for i in range(nao) for j in range(nao)
        ])
        ref = ref.reshape(nao, nao, -1).transpose(2, 0, 1) * (cell1.vol / ngs)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 0, 0] - dat[:, 0, 0]),
                               0, 7)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 1, 1] - dat[:, 1, 1]),
                               0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 2:] - dat[:, 2:, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 0, 2:] - dat[:, 0, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 0] - dat[:, 2:, 0]), 0, 7)
Ejemplo n.º 2
0
    def test_ft_aoao(self):
        #coords = pdft.gen_grid.gen_uniform_grids(cell)
        #aoR = pdft.numint.eval_ao(cell, coords)
        #ngs, nao = aoR.shape
        #ref = numpy.asarray([tools.fft(aoR[:,i].conj()*aoR[:,j], cell.gs)
        #                     for i in range(nao) for j in range(nao)])
        #ref = ref.reshape(nao,nao,-1).transpose(2,0,1) * (cell.vol/ngs)
        #dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s1hermi')
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,0]-dat[:,0,0])    , 0, 5)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,1,1]-dat[:,1,1])    , 0.02315483195832373, 4)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,2:]-dat[:,2:,2:]), 0, 9)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,2:]-dat[:,0,2:])  , 0, 9)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,0]-dat[:,2:,0])  , 0, 9)
        #idx = numpy.tril_indices(nao)
        #ref = dat[:,idx[0],idx[1]]
        #dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s2')
        #self.assertAlmostEqual(abs(dat-ref).sum(), 0, 9)

        coords = pdft.gen_grid.gen_uniform_grids(cell1)
        aoR = pdft.numint.eval_ao(cell1, coords)
        ngs, nao = aoR.shape
        ref = numpy.asarray([
            tools.fft(aoR[:, i].conj() * aoR[:, j], cell1.gs)
            for i in range(nao) for j in range(nao)
        ])
        ref = ref.reshape(nao, nao, -1).transpose(2, 0, 1) * (cell1.vol / ngs)
        Gv, Gvbase, kws = cell1.get_Gv_weights(cell1.gs)
        b = cell1.reciprocal_vectors()
        gxyz = lib.cartesian_prod([numpy.arange(len(x)) for x in Gvbase])
        dat = ft_ao.ft_aopair(cell1,
                              cell1.Gv,
                              aosym='s1hermi',
                              b=b,
                              gxyz=gxyz,
                              Gvbase=Gvbase)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 0, 0] - dat[:, 0, 0]),
                               0, 7)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 1, 1] - dat[:, 1, 1]),
                               0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 2:] - dat[:, 2:, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 0, 2:] - dat[:, 0, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 0] - dat[:, 2:, 0]), 0, 7)
        idx = numpy.tril_indices(nao)
        ref = dat[:, idx[0], idx[1]]
        dat = ft_ao.ft_aopair(cell1, cell1.Gv, aosym='s2')
        self.assertAlmostEqual(abs(dat - ref).sum(), 0, 9)
Ejemplo n.º 3
0
 def test_ft_aoao_pair_vs_fft(self):
     numpy.random.seed(1)
     kpti, kptj = numpy.random.random((2, 3))
     coords = pdft.gen_grid.gen_uniform_grids(cell1)
     aoi = pdft.numint.eval_ao(cell1, coords, kpt=kpti)
     aoj = pdft.numint.eval_ao(cell1, coords, kpt=kptj)
     ngrids, nao = aoj.shape
     q = kptj - kpti
     dat = ft_ao.ft_aopair(cell1, cell1.Gv, kpti_kptj=(kpti, kptj), q=q)
     self.assertAlmostEqual(finger(dat),
                            0.72664436503332241 + 3.2542145296611373j, 9)
     expmikr = numpy.exp(-1j * numpy.dot(coords, q))
     ref = numpy.asarray([
         tools.fftk(aoi[:, i].conj() * aoj[:, j], cell1.mesh, expmikr)
         for i in range(nao) for j in range(nao)
     ])
     ref = ref.reshape(nao, nao, -1).transpose(2, 0,
                                               1) * (cell1.vol / ngrids)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:, 0, 0] - dat[:, 0, 0]),
                            0, 7)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:, 1, 1] - dat[:, 1, 1]),
                            0, 7)
     self.assertAlmostEqual(
         numpy.linalg.norm(ref[:, 2:, 2:] - dat[:, 2:, 2:]), 0, 7)
     self.assertAlmostEqual(
         numpy.linalg.norm(ref[:, 0, 2:] - dat[:, 0, 2:]), 0, 7)
     self.assertAlmostEqual(
         numpy.linalg.norm(ref[:, 2:, 0] - dat[:, 2:, 0]), 0, 7)
Ejemplo n.º 4
0
    def test_ft_aoao1(self):
        cell = pgto.Cell()
        cell.a = numpy.eye(3) * 5
        n = 15
        cell.mesh = numpy.array([n, n, n])
        cell.atom = '''C    1.3    .2       .3
                       C     .1    .1      1.1
                       '''
        cell.basis = {'C': [[1, (0.6, 1)]]}
        cell.unit = 'B'
        cell.build(0, 0)

        ao2 = ft_ao.ft_aopair(cell, cell.Gv)
        nao = cell.nao_nr()
        coords = cell.get_uniform_grids()
        aoR = cell.pbc_eval_gto('GTOval', coords)
        aoR2 = numpy.einsum('ki,kj->kij', aoR.conj(), aoR)
        ngrids = aoR.shape[0]

        ao2ref = [
            tools.fft(aoR2[:, i, j], cell.mesh) * cell.vol / ngrids
            for i in range(nao) for j in range(nao)
        ]
        ao2ref = numpy.array(ao2ref).reshape(6, 6, -1).transpose(2, 0, 1)
        self.assertAlmostEqual(abs(ao2ref - ao2).max(), 0, 6)

        aoG = ft_ao.ft_ao(cell, cell.Gv)
        aoref = [
            tools.fft(aoR[:, i], cell.mesh) * cell.vol / ngrids
            for i in range(nao)
        ]
        self.assertAlmostEqual(abs(numpy.array(aoref).T - aoG).max(), 0, 6)
Ejemplo n.º 5
0
 def test_ft_aoao(self):
     coords = pdft.gen_grid.gen_uniform_grids(cell)
     aoR = pdft.numint.eval_ao(cell, coords)
     ngs, nao = aoR.shape
     ref = numpy.asarray([tools.fft(aoR[:,i].conj()*aoR[:,j], cell.gs)
                          for i in range(nao) for j in range(nao)])
     ref = ref.reshape(nao,nao,-1).transpose(2,0,1) * (cell.vol/ngs)
     dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s1hermi')
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,0]-dat[:,0,0])    , 1.869103994619606e-06 , 7)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,1,1]-dat[:,1,1])    , 0.02315483195832373   , 4)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,2:]-dat[:,2:,2:]), 5.4648896424693173e-14, 9)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,2:]-dat[:,0,2:])  , 4.0352047774658308e-11, 9)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,0]-dat[:,2:,0])  , 4.0352047774658308e-11, 9)
     idx = numpy.tril_indices(nao)
     ref = dat[:,idx[0],idx[1]]
     dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s2')
     self.assertAlmostEqual(abs(dat-ref).sum(), 0, 9)
Ejemplo n.º 6
0
 def test_ft_aoao_with_kpts(self):
     numpy.random.seed(1)
     kpti, kptj = kpts = numpy.random.random((2,3))
     Gv = cell.get_Gv([5]*3)
     kpt = numpy.random.random(3)
     dat = ft_ao._ft_aopair_kpts(cell, Gv, kpt=kpt, kptjs=kpts)
     self.assertAlmostEqual(finger(dat[0]), (2.3753953914129382-2.5365192689115088j), 9)
     self.assertAlmostEqual(finger(dat[1]), (2.4951510097641840-3.1990956672116355j), 9)
     dat = ft_ao.ft_aopair(cell, Gv)
     self.assertAlmostEqual(finger(dat), (1.2534723618134684+1.830086071817564j), 9)
Ejemplo n.º 7
0
 def test_ft_aoao_pdotp(self):
     coords = pdft.gen_grid.gen_uniform_grids(cell1)
     Gv, Gvbase, kws = cell1.get_Gv_weights(cell1.mesh)
     dat = ft_ao.ft_aopair(cell1,
                           cell1.Gv,
                           aosym='s1',
                           intor='GTO_ft_pdotp_sph')
     self.assertAlmostEqual(finger(dat),
                            5.7858606710458078 - 8.654809509773056j, 9)
     aoR = pdft.numint.eval_ao(cell1, coords, deriv=1)
     ngrids, nao = aoR.shape[1:]
     aoaoR = numpy.einsum('xpi,xpj->ijp', aoR[1:4], aoR[1:4])
     ref = tools.fft(aoaoR.reshape(nao * nao, -1), cell1.mesh)
     ref = ref.reshape(nao, nao, -1).transpose(2, 0,
                                               1) * (cell1.vol / ngrids)
     self.assertAlmostEqual(abs(ref - dat).max(), 0, 7)
Ejemplo n.º 8
0
 def test_ft_aoao_with_kpts(self):
     numpy.random.seed(1)
     kpti, kptj = numpy.random.random((2,3))
     coords = pdft.gen_grid.gen_uniform_grids(cell)
     aoi = pdft.numint.eval_ao(cell, coords, kpt=kpti)
     aoj = pdft.numint.eval_ao(cell, coords, kpt=kptj)
     ngs, nao = aoj.shape
     q = kptj - kpti
     ref = numpy.asarray([tools.fftk(aoi[:,i].conj()*aoj[:,j], cell.gs, coords, q)
                          for i in range(nao) for j in range(nao)])
     ref = ref.reshape(nao,nao,-1).transpose(2,0,1) * (cell.vol/ngs)
     dat = ft_ao.ft_aopair(cell, cell.Gv, kpti_kptj=(kpti,kptj))
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,0]-dat[:,0,0])    , 1.8912693795904546e-06, 7)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,1,1]-dat[:,1,1])    , 0.023225471785938184  , 4)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,2:]-dat[:,2:,2:]), 3.9231124086361633e-14, 9)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,2:]-dat[:,0,2:])  , 3.6949758392853562e-11, 9)
     self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,0]-dat[:,2:,0])  , 4.1245047267152665e-11, 9)
Ejemplo n.º 9
0
 def test_ft_aoao_pxp(self):
     coords = pdft.gen_grid.gen_uniform_grids(cell1)
     Gv, Gvbase, kws = cell1.get_Gv_weights(cell1.mesh)
     dat = ft_ao.ft_aopair(cell1,
                           cell1.Gv,
                           aosym='s1',
                           intor='GTO_ft_pxp_sph',
                           comp=3)
     self.assertAlmostEqual(finger(dat),
                            (6.4124798727215779 - 10.673712733378771j), 9)
     aoR = pdft.numint.eval_ao(cell1, coords, deriv=1)
     ngrids, nao = aoR.shape[1:]
     aox, aoy, aoz = aoR[1:]
     aoaoR = (numpy.einsum('pi,pj->ijp', aoy, aoz) -
              numpy.einsum('pi,pj->ijp', aoz, aoy),
              numpy.einsum('pi,pj->ijp', aoz, aox) -
              numpy.einsum('pi,pj->ijp', aox, aoz),
              numpy.einsum('pi,pj->ijp', aox, aoy) -
              numpy.einsum('pi,pj->ijp', aoy, aox))
     ref = tools.fft(
         numpy.array(aoaoR).reshape(3 * nao * nao, -1), cell1.mesh)
     ref = ref.reshape(3, nao, nao, -1).transpose(0, 3, 1,
                                                  2) * (cell1.vol / ngrids)
     self.assertAlmostEqual(abs(ref - dat).max(), 0, 7)
Ejemplo n.º 10
0
    def test_ft_aoao(self):
        #coords = pdft.gen_grid.gen_uniform_grids(cell)
        #aoR = pdft.numint.eval_ao(cell, coords)
        #ngrids, nao = aoR.shape
        #ref = numpy.asarray([tools.fft(aoR[:,i].conj()*aoR[:,j], cell.mesh)
        #                     for i in range(nao) for j in range(nao)])
        #ref = ref.reshape(nao,nao,-1).transpose(2,0,1) * (cell.vol/ngrids)
        #dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s1hermi')
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,0]-dat[:,0,0])    , 0, 5)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,1,1]-dat[:,1,1])    , 0.02315483195832373, 4)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,2:]-dat[:,2:,2:]), 0, 9)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,0,2:]-dat[:,0,2:])  , 0, 9)
        #self.assertAlmostEqual(numpy.linalg.norm(ref[:,2:,0]-dat[:,2:,0])  , 0, 9)
        #idx = numpy.tril_indices(nao)
        #ref = dat[:,idx[0],idx[1]]
        #dat = ft_ao.ft_aopair(cell, cell.Gv, aosym='s2')
        #self.assertAlmostEqual(abs(dat-ref).sum(), 0, 9)

        coords = pdft.gen_grid.gen_uniform_grids(cell1)
        Gv, Gvbase, kws = cell1.get_Gv_weights(cell1.mesh)
        b = cell1.reciprocal_vectors()
        gxyz = lib.cartesian_prod([numpy.arange(len(x)) for x in Gvbase])
        dat = ft_ao.ft_aopair(cell1,
                              cell1.Gv,
                              aosym='s1',
                              b=b,
                              gxyz=gxyz,
                              Gvbase=Gvbase)
        self.assertAlmostEqual(finger(dat),
                               1.5666516306798806 + 1.953555017583245j, 9)
        dat = ft_ao.ft_aopair(cell1,
                              cell1.Gv,
                              aosym='s2',
                              b=b,
                              gxyz=gxyz,
                              Gvbase=Gvbase)
        self.assertAlmostEqual(finger(dat),
                               -0.85276967757297917 + 1.0378751267506394j, 9)
        dat = ft_ao.ft_aopair(cell1,
                              cell1.Gv,
                              aosym='s1hermi',
                              b=b,
                              gxyz=gxyz,
                              Gvbase=Gvbase)
        self.assertAlmostEqual(finger(dat),
                               1.5666516306798806 + 1.953555017583245j, 9)
        aoR = pdft.numint.eval_ao(cell1, coords)
        ngrids, nao = aoR.shape
        aoaoR = numpy.einsum('pi,pj->ijp', aoR, aoR)
        ref = tools.fft(aoaoR.reshape(nao * nao, -1), cell1.mesh)
        ref = ref.reshape(nao, nao, -1).transpose(2, 0,
                                                  1) * (cell1.vol / ngrids)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 0, 0] - dat[:, 0, 0]),
                               0, 7)
        self.assertAlmostEqual(numpy.linalg.norm(ref[:, 1, 1] - dat[:, 1, 1]),
                               0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 2:] - dat[:, 2:, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 0, 2:] - dat[:, 0, 2:]), 0, 7)
        self.assertAlmostEqual(
            numpy.linalg.norm(ref[:, 2:, 0] - dat[:, 2:, 0]), 0, 7)
        idx = numpy.tril_indices(nao)
        ref = dat[:, idx[0], idx[1]]
        dat = ft_ao.ft_aopair(cell1, cell1.Gv, aosym='s2')
        self.assertAlmostEqual(abs(dat - ref).sum(), 0, 9)