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)
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)
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)
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)
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)
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)
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)
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)
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)
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)