def build_3dgrid(me, sp1, R1, sp2, R2, level=3): from pyscf import dft from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_gauleg import leggauss_ab assert sp1 >= 0 assert sp2 >= 0 if ((R1 - R2)**2).sum() < 1e-7: mol = system_vars_c().init_xyzlike( [[int(me.aos[0].sp2charge[sp1]), R1]]) else: mol = system_vars_c().init_xyzlike( [[int(me.aos[0].sp2charge[sp1]), R1], [int(me.aos[1].sp2charge[sp2]), R2]]) atom2rcut = np.array([ me.aos[isp].sp_mu2rcut[sp].max() for isp, sp in enumerate([sp1, sp2]) ]) grids = dft.gen_grid.Grids(mol) grids.level = level # precision as implemented in pyscf grids.radi_method = leggauss_ab grids.build(atom2rcut=atom2rcut) #grids.build() return grids
def build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, level=3): from pyscf import dft from pyscf.nao.m_system_vars import system_vars_c d12 = ((R1 - R2)**2).sum() d13 = ((R1 - R3)**2).sum() d23 = ((R2 - R3)**2).sum() z1 = int(me.aos[0].sp2charge[sp1]) z2 = int(me.aos[0].sp2charge[sp2]) z3 = int(me.aos[1].sp2charge[sp3]) rc1 = me.aos[0].sp2rcut[sp1] rc2 = me.aos[0].sp2rcut[sp2] rc3 = me.aos[1].sp2rcut[sp3] if d12 < 1e-7 and d23 < 1e-7: mol = system_vars_c(atom=[[z1, R1]]) elif d12 < 1e-7 and d23 > 1e-7 and d13 > 1e-7: mol = system_vars_c(atom=[[z1, R1], [z3, R3]]) elif d23 < 1e-7 and d12 > 1e-7 and d13 > 1e-7: mol = system_vars_c(atom=[[z1, R1], [z2, R2]]) elif d13 < 1e-7 and d12 > 1e-7 and d23 > 1e-7: mol = system_vars_c(atom=[[z1, R1], [z2, R2]]) else: mol = system_vars_c(atom=[[z1, R1], [z2, R2], [z3, R3]]) atom2rcut = np.array([rc1, rc2, rc3]) grids = dft.gen_grid.Grids(mol) grids.level = level # precision as implemented in pyscf grids.radi_method = gauss_legendre grids.build(atom2rcut=atom2rcut) return grids
def build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, level=3): from pyscf import dft from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_gauleg import gauss_legendre d12 = ((R1-R2)**2).sum() d13 = ((R1-R3)**2).sum() d23 = ((R2-R3)**2).sum() z1 = int(me.aos[0].sp2charge[sp1]) z2 = int(me.aos[0].sp2charge[sp2]) z3 = int(me.aos[1].sp2charge[sp3]) rc1 = me.aos[0].sp2rcut[sp1] rc2 = me.aos[0].sp2rcut[sp2] rc3 = me.aos[1].sp2rcut[sp3] if d12<1e-7 and d23<1e-7 : mol = system_vars_c(atom=[ [z1, R1] ]) elif d12<1e-7 and d23>1e-7 and d13>1e-7: mol = system_vars_c(atom=[ [z1, R1], [z3, R3] ]) elif d23<1e-7 and d12>1e-7 and d13>1e-7: mol = system_vars_c(atom=[ [z1, R1], [z2, R2] ]) elif d13<1e-7 and d12>1e-7 and d23>1e-7: mol = system_vars_c(atom=[ [z1, R1], [z2, R2] ]) else : mol = system_vars_c(atom=[ [z1, R1], [z2, R2], [z3, R3] ]) atom2rcut=np.array([rc1, rc2, rc3]) grids = dft.gen_grid.Grids(mol) grids.level = level # precision as implemented in pyscf grids.radi_method = gauss_legendre grids.build(atom2rcut=atom2rcut) return grids
def test_siesta2sv_df(self): from pyscf import scf from pyscf.nao.m_siesta_utils import get_siesta_command, get_pseudo import subprocess import os siesta_fdf = """ xml.write .true. PAO.EnergyShift 100 meV %block ChemicalSpeciesLabel 1 11 Na %endblock ChemicalSpeciesLabel NumberOfAtoms 2 NumberOfSpecies 1 %block AtomicCoordinatesAndAtomicSpecies 0.77573521 0.00000000 0.00000000 1 -0.77573521 0.00000000 0.00000000 1 %endblock AtomicCoordinatesAndAtomicSpecies MD.NumCGsteps 0 COOP.Write .true. WriteDenchar .true. """ label = 'siesta' fi = open(label + '.fdf', 'w') print(siesta_fdf, file=fi) fi.close() for sp in ['Na']: try: os.remove(sp + '.psf') except: pass try: pppath = get_pseudo(sp) except: print('get_pseudo( ' + sp + ' ) is not working--> skip siesta run') return os.symlink(pppath, sp + '.psf') errorcode = subprocess.call(get_siesta_command(label), shell=True) if errorcode: raise RuntimeError( 'siesta returned an error: {0}'.format(errorcode)) # run test system_vars from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check sv = system_vars_c().init_siesta_xml(label) self.assertEqual(sv.norbs, 10) self.assertTrue(sv.diag_check()) self.assertTrue(sv.overlap_check())
if self._nelectron is None: return tot_electrons(self) else: return self._nelectron # # Example of reading pySCF orbitals. # if __name__=="__main__": from pyscf import gto from pyscf.nao.m_system_vars import system_vars_c import matplotlib.pyplot as plt """ Interpreting small Gaussian calculation """ mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0; Be 1 0 0', basis='ccpvtz') # coordinates in Angstrom! sv = system_vars_c(gto=mol, tol=1e-8, nr=512, rmin=1e-5) print(sv.ao_log.sp2norbs) print(sv.ao_log.sp2nmult) print(sv.ao_log.sp2rcut) print(sv.ao_log.sp_mu2rcut) print(sv.ao_log.nr) print(sv.ao_log.rr[0:4], sv.ao_log.rr[-1:-5:-1]) print(sv.ao_log.psi_log[0].shape, sv.ao_log.psi_log_rl[0].shape) sp = 0 for mu,[ff,j] in enumerate(zip(sv.ao_log.psi_log[sp], sv.ao_log.sp_mu2j[sp])): nc = abs(ff).max() if j==0 : plt.plot(sv.ao_log.rr, ff/nc, '--', label=str(mu)+' j='+str(j)) if j>0 : plt.plot(sv.ao_log.rr, ff/nc, label=str(mu)+' j='+str(j))
return tot_electrons(self) else: return self._nelectron # # Example of reading pySCF orbitals. # if __name__ == "__main__": from pyscf import gto from pyscf.nao.m_system_vars import system_vars_c import matplotlib.pyplot as plt """ Interpreting small Gaussian calculation """ mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0; Be 1 0 0', basis='ccpvtz') # coordinates in Angstrom! sv = system_vars_c(gto=mol, tol=1e-8, nr=512, rmin=1e-5) print(sv.ao_log.sp2norbs) print(sv.ao_log.sp2nmult) print(sv.ao_log.sp2rcut) print(sv.ao_log.sp_mu2rcut) print(sv.ao_log.nr) print(sv.ao_log.rr[0:4], sv.ao_log.rr[-1:-5:-1]) print(sv.ao_log.psi_log[0].shape, sv.ao_log.psi_log_rl[0].shape) sp = 0 for mu, [ff, j] in enumerate(zip(sv.ao_log.psi_log[sp], sv.ao_log.sp_mu2j[sp])): nc = abs(ff).max() if j == 0:
for mu1,l1,s1,f1 in self.ao1.sp2info[sp1]: f1f2_mom = self.ao1.psi_log_mom[sp2][mu2,:] * self.ao1.psi_log_mom[sp1][mu1,:] l2S.fill(0.0) for l3 in range( abs(l1-l2), l1+l2+1): l2S[l3] = (f1f2_mom[:]*bessel_pp[l3,:]).sum() + f1f2_mom[0]*bessel_pp[l3,0]/dkappa cS.fill(0.0) for m1 in range(-l1,l1+1): for m2 in range(-l2,l2+1): gc,m3 = self.get_gaunt(l1,-m1,l2,m2), m2-m1 for l3ind,l3 in enumerate(range(abs(l1-l2),l1+l2+1)): if abs(m3) > l3 : continue cS[m1+_j,m2+_j] = cS[m1+_j,m2+_j] + l2S[l3]*ylm[ l3*(l3+1)+m3] *\ gc[l3ind] * (-1.0)**((3*l1+l2+l3)//2+m2) self.c2r_( l1,l2, self.jmx,cS,rS,cmat) oo2co[s1:f1,s2:f2] = rS[-l1+_j:l1+_j+1,-l2+_j:l2+_j+1] #sys.exit() oo2co = oo2co * (4*np.pi)**2 * self.interp_pp.dg_jt return oo2co if __name__ == '__main__': from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_prod_log import prod_log_c from pyscf.nao.m_ao_matelem import ao_matelem_c sv = system_vars_c("siesta") ra = np.array([0.0, 0.1, 0.2]) rb = np.array([0.0, 0.1, 0.0]) coulo = ao_matelem_c(sv.ao_log).coulomb_am(me, 0, ra, 0, rb)
# # See above # def ao_eval_libnao(ao, ra, isp, coords): res = np.zeros((ao.sp2norbs[isp],coords.shape[0]), dtype='float64') ao_eval_libnao_(ao, ra, isp, coords, res) return res if __name__ == '__main__': from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_ao_eval import ao_eval from pyscf.nao.m_ao_eval_libnao import ao_eval_libnao sv = system_vars_c() ra = np.array([0.3, -0.5, 0.77], dtype='float64') #coords = np.array([[0.07716887, 2.82933578, 3.73214881]]) coords = np.random.rand(35580,3)*5.0 print('ao_val2 (reference)') ao_val1 = ao_eval(sv.ao_log, ra, 0, coords) print('ao_val2_libnao') ao_val2 = ao_eval_libnao(sv.ao_log, ra, 0, coords) print(np.allclose(ao_val1,ao_val2)) for iorb,[oo1,oo2] in enumerate(zip(ao_val1,ao_val2)): print(iorb, abs(oo1-oo2).argmax(), abs(oo1-oo2).max(), coords[abs(oo1-oo2).argmax(),:])
# # See above # def ao_eval_libnao(ao, ra, isp, coords): res = np.zeros((ao.sp2norbs[isp], coords.shape[0]), dtype='float64') ao_eval_libnao_(ao, ra, isp, coords, res) return res if __name__ == '__main__': from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_ao_eval import ao_eval from pyscf.nao.m_ao_eval_libnao import ao_eval_libnao sv = system_vars_c() ra = np.array([0.3, -0.5, 0.77], dtype='float64') #coords = np.array([[0.07716887, 2.82933578, 3.73214881]]) coords = np.random.rand(35580, 3) * 5.0 print('ao_val2 (reference)') ao_val1 = ao_eval(sv.ao_log, ra, 0, coords) print('ao_val2_libnao') ao_val2 = ao_eval_libnao(sv.ao_log, ra, 0, coords) print(np.allclose(ao_val1, ao_val2)) for iorb, [oo1, oo2] in enumerate(zip(ao_val1, ao_val2)): print(iorb, abs(oo1 - oo2).argmax(), abs(oo1 - oo2).max(), coords[abs(oo1 - oo2).argmax(), :])
l2S.fill(0.0) for l3 in range(abs(l1 - l2), l1 + l2 + 1): l2S[l3] = (f1f2_mom[:] * bessel_pp[l3, :]).sum( ) + f1f2_mom[0] * bessel_pp[l3, 0] / dkappa cS.fill(0.0) for m1 in range(-l1, l1 + 1): for m2 in range(-l2, l2 + 1): gc, m3 = self.get_gaunt(l1, -m1, l2, m2), m2 - m1 for l3ind, l3 in enumerate( range(abs(l1 - l2), l1 + l2 + 1)): if abs(m3) > l3: continue cS[m1+_j,m2+_j] = cS[m1+_j,m2+_j] + l2S[l3]*ylm[ l3*(l3+1)+m3] *\ gc[l3ind] * (-1.0)**((3*l1+l2+l3)//2+m2) self.c2r_(l1, l2, self.jmx, cS, rS, cmat) oo2co[s1:f1, s2:f2] = rS[-l1 + _j:l1 + _j + 1, -l2 + _j:l2 + _j + 1] #sys.exit() oo2co = oo2co * (4 * np.pi)**2 * self.interp_pp.dg_jt return oo2co if __name__ == '__main__': from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_ao_matelem import ao_matelem_c sv = system_vars_c("siesta") ra = np.array([0.0, 0.1, 0.2]) rb = np.array([0.0, 0.1, 0.0]) coulo = ao_matelem_c(sv.ao_log).coulomb_am(me, 0, ra, 0, rb)
grids = build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, **kvargs) ao1 = grids.weights * ao_eval(me.aos[0], R1, sp1, grids.coords) ao2 = ao_eval(me.aos[0], R2, sp2, grids.coords) aoao = np.einsum('ar,br->abr', ao1, ao2) pbf = ao_eval(me.aos[1], R3, sp3, grids.coords) abp2eri = np.einsum('abr,pr->abp', aoao, pbf) return abp2eri if __name__ == "__main__": from pyscf.nao.m_system_vars import system_vars_c, ao_matelem_c, prod_log_c from pyscf.nao.m_eri3c import eri3c sv = system_vars_c(label='siesta') R0 = sv.atom2coord[0, :] prod_log = prod_log_c(sv.ao_log) me_prod = ao_matelem_c(prod_log) vc = me_prod.coulomb_am(0, R0, 0, R0) eri_am = np.einsum('pab,pq->abq', prod_log.sp2vertex[0], vc) print(eri_am.shape) print(eri_am.sum(), eri_am.max(), np.argmax(eri_am), eri_am.min(), np.argmin(eri_am)) vhpf = prod_log.hartree_pot() me = ao_matelem_c(sv.ao_log, vhpf) eri_ni = eri3c(me, 0, 0, R0, R0, 0, R0, level=4) print(eri_ni.shape)
# def ao_log_hartree(ao, ao_log_hartree_method='lap'): if ao_log_hartree_method.upper() == 'LAP': return ao_log_hartree_lap_libnao(ao) if ao_log_hartree_method.upper() == 'SBT': return ao_log_hartree_sbt(ao) raise RuntimeError('!method') # # # if __name__ == '__main__': from pyscf.nao.m_system_vars import system_vars_c import matplotlib.pyplot as plt sv = system_vars_c('siesta') ao_h_lap = ao_log_hartree(sv.ao_log, ao_log_hartree_method='lap') ao_h_sbt = ao_log_hartree(sv.ao_log, ao_log_hartree_method='sbt') sp = 0 for mu, [ff_lap, ff_sbt, j] in enumerate( zip(ao_h_lap.psi_log[sp], ao_h_sbt.psi_log[sp], ao_h_sbt.sp_mu2j[sp])): nc = abs(ff_lap).max() if j == 0: plt.plot(ao_h_lap.rr, ff_lap / nc, '--', label=str(mu) + ' j=' + str(j)) plt.plot(ao_h_lap.rr,
for ib,[at,l,ngto,nctr,a,b,c,d] in enumerate(_bas): atom2bas_s[at] = min(atom2bas_s[at],ib) return atom2bas_s if __name__ == '__main__': """ Compute only bilocal part of the four-orbitals, two-center Coulomb integrals """ from pyscf import gto from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_conv_yzx2xyz import conv_yzx2xyz_c tol = 1e-5 mol = gto.M(atom='O 0 0 0; H 0 -0.1 1; H 0 0.1 -1', basis='ccpvdz') sv = system_vars_c(gto=mol) na = sv.natm for ia1,n1 in zip(range(na), sv.atom2s[1:]-sv.atom2s[0:na]): for ia2,n2 in zip(range(ia1+1,sv.natm+1), sv.atom2s[ia1+2:]-sv.atom2s[ia1+1:na]): mol2 = gto.Mole_pure(atom=[mol._atom[ia1], mol._atom[ia2]], basis=mol.basis).build() bs = get_atom2bas_s(mol2._bas) ss = (bs[0],bs[1], bs[1],bs[2], bs[0],bs[1], bs[1],bs[2]) eri = mol2.intor('cint2e_sph', shls_slice=ss).reshape([n1,n2,n1,n2]) eri = conv_yzx2xyz_c(mol2).conv_yzx2xyz_4d(eri, 'pyscf2nao', ss).reshape([n1*n2,n1*n2]) ee,xx = np.linalg.eigh(eri) nlinindep = list(ee>tol).count(True) print(' ia1, ia2, n1, n2: ', ia1, ia2, n1, n2, eri.shape, n1*n2, nlinindep, n1*n2/nlinindep)
AtomicCoordinatesFormat Ang NumberOfAtoms 3 NumberOfSpecies 2 %block AtomicCoordinatesAndAtomicSpecies 0.00000000 -0.00164806 0.00000000 1 1 O 0.77573521 0.59332141 0.00000000 2 2 H -0.77573521 0.59332141 0.00000000 2 3 H %endblock AtomicCoordinatesAndAtomicSpecies MD.NumCGsteps 0 MaxSCFIterations 100 COOP.Write .true. WriteDenchar .true. """ label = 'siesta' print(siesta_fdf, file=open(label+'.fdf', 'w')) for sp in ['O', 'H']: os.symlink(get_pseudo(sp), sp+'.psf') errorcode = subprocess.call(get_siesta_command(label), shell=True) if errorcode: raise RuntimeError('siesta returned an error: {0}'.format(errorcode)) # run test system_vars from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check sv = system_vars_c().init_siesta_xml(label = label) assert sv.norbs == 23 assert diag_check(sv) assert overlap_check(sv)
grids = build_3dgrid3c(me, sp1,sp2,R1,R2, sp3,R3, **kvargs) ao1 = grids.weights * ao_eval(me.aos[0], R1, sp1, grids.coords) ao2 = ao_eval(me.aos[0], R2, sp2, grids.coords) aoao = np.einsum('ar,br->abr', ao1, ao2) pbf = ao_eval(me.aos[1], R3, sp3, grids.coords) abp2eri = np.einsum('abr,pr->abp',aoao,pbf) return abp2eri if __name__=="__main__": from pyscf.nao.m_system_vars import system_vars_c, ao_matelem_c, prod_log_c from pyscf.nao.m_eri3c import eri3c sv = system_vars_c(label='siesta') R0 = sv.atom2coord[0,:] prod_log = prod_log_c(sv.ao_log) me_prod = ao_matelem_c(prod_log) vc = me_prod.coulomb_am(0, R0, 0, R0) eri_am = np.einsum('pab,pq->abq', prod_log.sp2vertex[0], vc) print( eri_am.shape ) print( eri_am.sum(), eri_am.max(), np.argmax(eri_am), eri_am.min(), np.argmin(eri_am)) vhpf = prod_log.hartree_pot() me = ao_matelem_c(sv.ao_log, vhpf) eri_ni = eri3c(me, 0, 0, R0, R0, 0, R0, level=4) print( eri_ni.shape ) print( eri_ni.sum(), eri_ni.max(), np.argmax(eri_ni), eri_ni.min(), np.argmin(eri_ni))
1 11 Na %endblock ChemicalSpeciesLabel NumberOfAtoms 2 NumberOfSpecies 1 %block AtomicCoordinatesAndAtomicSpecies 0.77573521 0.00000000 0.00000000 1 -0.77573521 0.00000000 0.00000000 1 %endblock AtomicCoordinatesAndAtomicSpecies MD.NumCGsteps 0 COOP.Write .true. WriteDenchar .true. """ label = 'siesta' print(siesta_fdf, file=open(label+'.fdf', 'w')) for sp in ['Na']: os.symlink(get_pseudo(sp), sp+'.psf') errorcode = subprocess.call(get_siesta_command(label), shell=True) if errorcode: raise RuntimeError('siesta returned an error: {0}'.format(errorcode)) # run test system_vars from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check sv = system_vars_c().init_siesta_xml(label = label) assert sv.norbs == 10 assert diag_check(sv) assert overlap_check(sv)
for ib,[at,l,ngto,nctr,a,b,c,d] in enumerate(_bas): atom2bas_s[at] = min(atom2bas_s[at],ib) return atom2bas_s if __name__ == '__main__': """ Compute only bilocal part of the four-orbitals, two-center Coulomb integrals """ from pyscf import gto from pyscf.nao.m_system_vars import system_vars_c from pyscf.nao.m_conv_yzx2xyz import conv_yzx2xyz_c tol = 1e-5 mol = gto.M(atom='O 0 0 0; H 0 -0.1 1; H 0 0.1 -1', basis='ccpvdz') sv = system_vars_c(gto=mol) na = sv.natm for ia1,n1 in zip(range(na), sv.atom2s[1:]-sv.atom2s[0:na]): for ia2,n2 in zip(range(ia1+1,sv.natm+1), sv.atom2s[ia1+2:]-sv.atom2s[ia1+1:na]): mol2 = gto.Mole_pure(atom=[mol._atom[ia1], mol._atom[ia2]], basis=mol.basis).build() bs = get_atom2bas_s(mol2._bas) ss = (bs[0],bs[1], bs[1],bs[2], bs[0],bs[1], bs[1],bs[2]) eri = mol2.intor('cint2e_sph', shls_slice=ss).reshape([n1,n2,n1,n2]) eri = conv_yzx2xyz_c(mol2).conv_yzx2xyz_4d(eri, 'pyscf2nao', ss).reshape([n1*n2,n1*n2]) ee,xx = np.linalg.eigh(eri) nlinindep = list(ee>tol).count(True) print(' ia1, ia2, n1, n2: ', ia1, ia2, n1, n2, eri.shape, n1*n2, nlinindep, n1*n2/nlinindep)