def init_ao_log_gpaw(self, **kw): """ Reads radial orbitals from a previous GPAW calculation. """ from pyscf.nao.m_log_interp import log_interp_c #self.setups = setups if setup is saved in ao_log, we get the following error # while performing copy # File "/home/marc/anaconda2/lib/python2.7/copy.py", line 182, in deepcopy # rv = reductor(2) # TypeError: can't pickle Spline objects self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) setups = kw['setups'] sdic = setups.setups self.sp2key = sdic.keys() #key0 = sdic.keys()[0] #print(key0, sdic[key0].Z, dir(sdic[key0])) self.sp_mu2j = [np.array(sdic[key].l_orb_j, np.int64) for key in sdic.keys()] self.sp2nmult = np.array([len(mu2j) for mu2j in self.sp_mu2j], dtype=np.int64) self.sp2charge = np.array([sdic[key].Z for key in sdic.keys()], dtype=np.int64) self.nspecies = len(self.sp_mu2j) self.jmx = max([max(mu2j) for mu2j in self.sp_mu2j]) self.sp2norbs = np.array([sum(2*mu2j+1) for mu2j in self.sp_mu2j], dtype=np.int64) self.sp_mu2rcut = [] self.psi_log_rl = [] self.psi_log = [] for sp,[key,nmu,mu2j] in enumerate(zip(sdic.keys(), self.sp2nmult, self.sp_mu2j)): self.sp_mu2rcut.append(np.array([phit.get_cutoff() for phit in sdic[key].phit_j])) mu2ff = np.zeros([nmu, self.nr]) for mu,phit in enumerate(sdic[key].phit_j): for ir, r in enumerate(self.rr): mu2ff[mu,ir],deriv = phit.get_value_and_derivative(r) self.psi_log_rl.append(mu2ff) self.psi_log.append(mu2ff* (self.rr**mu2j[mu])) self.sp2rcut = np.array([np.amax(rcuts) for rcuts in self.sp_mu2rcut], dtype='float64') # derived from sp_mu2rcut self.sp_mu2s = [] # derived from sp_mu2j for mu2j in self.sp_mu2j: mu2s = np.zeros(len(mu2j)+1, dtype=np.int64) for mu,j in enumerate(mu2j): mu2s[mu+1] = mu2s[mu]+2*j+1 self.sp_mu2s.append(mu2s) #self._add_sp2info() #self._add_psi_log_mom() #print(self.sp_mu2j) #print(self.sp2nmult) #print(self.nspecies) #print(self.jmx) #print(self.sp2norbs) #print(self.sp_mu2rcut) #print(self.psi_log) #print(self.sp2charge) #print(self.sp2rcut) #print(self.sp_mu2s) return self
def init_ao_log_ion(self, sp2ion, **kw): """ Reads data from a previous SIESTA calculation, interpolates the orbitals on a single log mesh. """ from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_siesta_ion_interp import siesta_ion_interp from pyscf.nao.m_siesta_ion_add_sp2 import _siesta_ion_add_sp2 from pyscf.nao.m_spline_diff2 import spline_diff2 from pyscf.nao.m_spline_interp import spline_interp import numpy as np self.init_log_mesh_ion(sp2ion, **kw) #print(__name__, self.nr) #print(__name__, self.rr) #print(__name__, self.rmax) #print(__name__, self.rmin) #print(__name__, self.kmax) self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) _siesta_ion_add_sp2(self, sp2ion) # adds the fields for counting, .nspecies etc. self.jmx = max([mu2j.max() for mu2j in self.sp_mu2j]) self.sp2norbs = np.array([mu2s[self.sp2nmult[sp]] for sp,mu2s in enumerate(self.sp_mu2s)], dtype='int64') self.sp2ion = sp2ion rr = self.rr nr = len(rr) #print(__name__, 'self.jmx', self.jmx) #print(__name__, 'self.sp2norbs', self.sp2norbs) #print(__name__, 'self.sp2norbs', dir(self)) #print(__name__, 'self.sp_mu2j', self.sp_mu2j) #print(__name__, 'self.sp_mu2rcut', self.sp_mu2rcut) #print(__name__, 'self.sp_mu2s', self.sp_mu2s) self.psi_log = siesta_ion_interp(rr, sp2ion, 1) self.psi_log_rl = siesta_ion_interp(rr, sp2ion, 0) self.sp2vna = [] # Interpolate a Neutral-atom potential V_NA(r) for each specie for ion in sp2ion: vna = np.zeros(nr) if ion["vna"] is not None: h,dat = ion["vna"]["delta"], ion["vna"]["data"][0][:, 1] yy_diff2 = spline_diff2(h, dat, 0.0, 1.0e301) for ir,r in enumerate(rr): vna[ir] = spline_interp(h, dat, yy_diff2, r) self.sp2vna.append(vna*0.5) # given in Rydberg? self.sp_mu2rcut = [ np.array(ion["paos"]["cutoff"]) for ion in sp2ion] self.sp2rcut = np.array([np.amax(rcuts) for rcuts in self.sp_mu2rcut]) self.sp2charge = [int(ion['z']) for ion in self.sp2ion] self.sp2valence = [int(ion['valence']) for ion in self.sp2ion] #call sp2ion_to_psi_log(sv%sp2ion, sv%rr, sv%psi_log) #call init_psi_log_rl(sv%psi_log, sv%rr, sv%uc%mu_sp2j, sv%uc%sp2nmult, sv%psi_log_rl) #call sp2ion_to_core(sv%sp2ion, sv%rr, sv%core_log, sv%sp2has_core, sv%sp2rcut_core) return self
def __init__(self, rr, pp, sv=None, dm=None): """ Basic """ from pyscf.nao.m_init_dm_libnao import init_dm_libnao from pyscf.nao.m_init_dens_libnao import init_dens_libnao self.interp_rr = log_interp_c(rr) self.interp_pp = log_interp_c(pp) self.rr3_dr = rr**3 * np.log(rr[1] / rr[0]) self.four_pi = 4 * np.pi self.const = np.sqrt(np.pi / 2.0) self.sv = None if sv is None else sv.init_libnao() self.dm = None if dm is None else init_dm_libnao(dm) if dm is not None and sv is not None: init_dens_libnao()
def __init__(self, rr, pp, sv=None, dm=None): """ Basic """ from pyscf.nao.m_init_dm_libnao import init_dm_libnao from pyscf.nao.m_init_dens_libnao import init_dens_libnao self.interp_rr = log_interp_c(rr) self.interp_pp = log_interp_c(pp) self.rr3_dr = rr**3 * np.log(rr[1]/rr[0]) self.dr_jt = np.log(rr[1]/rr[0]) self.four_pi = 4*np.pi self.const = np.sqrt(np.pi/2.0) self.pp2 = pp**2 self.sv = None if sv is None else sv.init_libnao() self.dm = None if dm is None else init_dm_libnao(dm) if dm is not None and sv is not None : init_dens_libnao()
def __init__(self, log_mesh, jmx=7, ngl=96, lbdmx=14): """ Expansion of the products of two atomic orbitals placed at given locations and around a center between these locations [1] Talman JD. Multipole Expansions for Numerical Orbital Products, Int. J. Quant. Chem. 107, 1578--1584 (2007) ngl : order of Gauss-Legendre quadrature log_mesh : instance of log_mesh_c defining the logarithmic mesh (rr and pp arrays) jmx : maximal angular momentum quantum number of each atomic orbital in a product lbdmx : maximal angular momentum quantum number used for the expansion of the product phia*phib """ from numpy.polynomial.legendre import leggauss from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_csphar_talman_libnao import csphar_talman_libnao as csphar_jt assert ngl>2 assert jmx>-1 assert hasattr(log_mesh, 'rr') assert hasattr(log_mesh, 'pp') self.ngl = ngl self.lbdmx = lbdmx self.xx,self.ww = leggauss(ngl) log_mesh_c.__init__(self) self.init_log_mesh(log_mesh.rr, log_mesh.pp) self.plval=np.zeros([2*(self.lbdmx+jmx+1), ngl]) self.plval[0,:] = 1.0 self.plval[1,:] = self.xx for kappa in range(1,2*(self.lbdmx+jmx)+1): self.plval[kappa+1, :]= ((2*kappa+1)*self.xx*self.plval[kappa, :]-kappa*self.plval[kappa-1, :])/(kappa+1) self.log_interp = log_interp_c(self.rr) self.ylm_cr = csphar_jt([0.0,0.0,1.0], self.lbdmx+2*jmx) return
def __init__(self, log_mesh, jmx=7, ngl=96, lbdmx=14): """ Expansion of the products of two atomic orbitals placed at given locations and around a center between these locations [1] Talman JD. Multipole Expansions for Numerical Orbital Products, Int. J. Quant. Chem. 107, 1578--1584 (2007) ngl : order of Gauss-Legendre quadrature log_mesh : instance of log_mesh_c defining the logarithmic mesh (rr and pp arrays) jmx : maximal angular momentum quantum number of each atomic orbital in a product lbdmx : maximal angular momentum quantum number used for the expansion of the product phia*phib """ from numpy.polynomial.legendre import leggauss from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_csphar_talman_libnao import csphar_talman_libnao as csphar_jt assert ngl > 2 assert jmx > -1 assert hasattr(log_mesh, 'rr') assert hasattr(log_mesh, 'pp') self.ngl = ngl self.lbdmx = lbdmx self.xx, self.ww = leggauss(ngl) log_mesh_c.__init__(self) self.init_log_mesh(log_mesh.rr, log_mesh.pp) self.plval = np.zeros([2 * (self.lbdmx + jmx + 1), ngl]) self.plval[0, :] = 1.0 self.plval[1, :] = self.xx for kappa in range(1, 2 * (self.lbdmx + jmx) + 1): self.plval[kappa + 1, :] = ( (2 * kappa + 1) * self.xx * self.plval[kappa, :] - kappa * self.plval[kappa - 1, :]) / (kappa + 1) self.log_interp = log_interp_c(self.rr) self.ylm_cr = csphar_jt([0.0, 0.0, 1.0], self.lbdmx + 2 * jmx) return
def __init__(self, ao_log, sp): self.ion = ao_log.sp2ion[sp] self.rr,self.pp,self.nr = ao_log.rr,ao_log.pp,ao_log.nr self.interp_rr = log_interp_c(self.rr) self.interp_pp = log_interp_c(self.pp) self.mu2j = ao_log.sp_mu2j[sp] self.nmult= len(self.mu2j) self.mu2s = ao_log.sp_mu2s[sp] self.norbs= self.mu2s[-1] self.mu2ff = ao_log.psi_log[sp] self.mu2ff_rl = ao_log.psi_log_rl[sp] self.mu2rcut = ao_log.sp_mu2rcut[sp] self.rcut = np.amax(self.mu2rcut) self.charge = ao_log.sp2charge[sp]
def __init__(self, ao_log, sp): self.ion = ao_log.sp2ion[sp] self.rr, self.pp, self.nr = ao_log.rr, ao_log.pp, ao_log.nr self.interp_rr = log_interp_c(self.rr) self.interp_pp = log_interp_c(self.pp) self.mu2j = ao_log.sp_mu2j[sp] self.nmult = len(self.mu2j) self.mu2s = ao_log.sp_mu2s[sp] self.norbs = self.mu2s[-1] self.mu2ff = ao_log.psi_log[sp] self.mu2ff_rl = ao_log.psi_log_rl[sp] self.mu2rcut = ao_log.sp_mu2rcut[sp] self.rcut = np.amax(self.mu2rcut) self.charge = ao_log.sp2charge[sp]
def test_log_interp_vec(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr,pp = log_mesh(1024, 0.01, 20.0) log_interp = log_interp_c(rr) gcs = np.array([1.2030, 3.2030, 0.7, 10.0]) ff = np.array([[np.exp(-gc*r**2) for r in rr] for gc in gcs]) for r in np.linspace(0.009, 25.0, 100): yyref, yy = np.exp(-gcs*r**2), log_interp(ff, r) for y,yref in zip(yy, yyref): self.assertAlmostEqual(y,yref)
def test_log_interp_sca(self): """ Test the interpolation facility from the class log_interp_c """ rr, pp = log_mesh(1024, 0.01, 20.0) log_interp = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc * r**2) for r in rr]) for r in np.linspace(0.009, 25.0, 100): y = log_interp(ff, r) yrefa = np.exp(-gc * r**2) self.assertAlmostEqual(y, yrefa)
def test_log_interp_sca(self): """ Test the interpolation facility from the class log_interp_c """ rr,pp = log_mesh(1024, 0.01, 20.0) log_interp = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc*r**2) for r in rr]) for r in np.linspace(0.009, 25.0, 100): y = log_interp(ff, r) yrefa = np.exp(-gc*r**2) self.assertAlmostEqual(y, yrefa)
def test_log_interp_sparse_coeffs(self): """ Test the computation of interpolation coefficients """ rr,pp = funct_log_mesh(512, 0.01, 200.0) lgi = log_interp_c(rr) rrs = np.linspace(0.05, 250.0, 20000) kr2c_csr,j2r = lgi.coeffs_csr(rrs, rcut=10.0) j2r,j2k,ij2c = lgi.coeffs_rcut(rrs, rcut=10.0) for r,k,cc in zip(j2r[0], j2k, ij2c.T): for i in range(6): self.assertEqual(cc[i], kr2c_csr[k+i,r])
def init_ao_log_ion(self, **kw): """ Reads data from a previous SIESTA calculation, interpolates the Pseudo-Atomic Orbitals on a single log mesh. """ from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_spline_diff2 import spline_diff2 from pyscf.nao.m_spline_interp import spline_interp self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) sp2ion = self.sp2ion = kw['sp2ion'] fname = kw['fname'] if 'fname' in kw else 'paos' if fname in sp2ion[0]: self.siesta_ion_interp(sp2ion, fname=fname) self.sp2vna = [None]*len(sp2ion) # Interpolate a Neutral-Atom potential V_NA(r) for each specie self.sp2rcut_vna = np.zeros(len(sp2ion)) for isp, ion in enumerate(sp2ion): if "vna" not in ion.keys(): continue if ion["vna"] is None: continue self.sp2rcut_vna[isp] = ion["vna"]["cutoff"] h,dat = ion["vna"]["delta"][0], ion["vna"]["data"][0][:,1] d2 = spline_diff2(h, dat, 0.0, 1.0e301) self.sp2vna[isp] = np.array([0.5*spline_interp(h, dat, d2, r) for r in self.rr]) # given in Rydberg in sp2ion self.sp2chlocal = [None]*len(sp2ion) # Interpolate the atomic charges for each specie self.sp2rcut_chlocal = np.zeros(len(sp2ion)) for isp, ion in enumerate(sp2ion): if "chlocal" not in ion.keys(): continue if ion["chlocal"] is None: continue self.sp2rcut_chlocal[isp] = ion["chlocal"]["cutoff"] h,dat = ion["chlocal"]["delta"][0], ion["chlocal"]["data"][0][:,1] d2 = spline_diff2(h, dat, 0.0, 1.0e301) self.sp2chlocal[isp] = np.array([spline_interp(h, dat, d2, r) for r in self.rr]) return self
def test_log_interp_coeffs_vec(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr,pp = log_mesh(1024, 0.01, 20.0) lgi = log_interp_c(rr) rvecs = np.linspace(0.00, 25.0, 20) kk1,cc1 = np.zeros(len(rvecs), dtype=np.int32), np.zeros((6,len(rvecs))) for i,rv in enumerate(rvecs): kk1[i],cc1[:,i] = lgi.coeffs(rv) kk2,cc2 = lgi.coeffs_vv(rvecs) for k1,c1,k2,c2 in zip(kk1,cc1,kk2,cc2): self.assertEqual(k1,k2) for y1,y2 in zip(c1,c2): self.assertAlmostEqual(y1,y2)
def test_log_interp_sca(self): """ """ from pyscf.nao.m_log_mesh import log_mesh from pyscf.nao.m_log_interp import log_interp_c rr, pp = log_mesh(1024, 0.01, 20.0) log_interp = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc * r**2) for r in rr]) for r in np.linspace(0.009, 25.0, 100): y = log_interp(ff, r) yrefa = np.exp(-gc * r**2) self.assertAlmostEqual(y, yrefa)
def test_log_interp_vec(self): """ """ from pyscf.nao.m_log_mesh import log_mesh from pyscf.nao.m_log_interp import log_interp_c rr, pp = log_mesh(1024, 0.01, 20.0) log_interp = log_interp_c(rr) gcs = np.array([1.2030, 3.2030, 0.7, 10.0]) ff = np.array([[np.exp(-gc * r**2) for r in rr] for gc in gcs]) for r in np.linspace(0.009, 25.0, 100): yyref, yy = np.exp(-gcs * r**2), log_interp(ff, r) for y, yref in zip(yy, yyref): self.assertAlmostEqual(y, yref)
def test_log_interp_diff(self): """ Test the differentiation facility from the class log_interp_c """ import matplotlib.pyplot as plt rr, pp = log_mesh(1024, 0.001, 20.0) logi = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc * r**2) for r in rr]) ffd_ref = np.array([np.exp(-gc * r**2) * (-2.0 * gc * r) for r in rr]) ffd = logi.diff(ff) ffd_np = np.gradient(ff, rr) s = 3 for r, d, dref, dnp in zip(rr[s:], ffd[s:], ffd_ref[s:], ffd_np[s:]): self.assertAlmostEqual(d, dref)
def init_ao_log_ion(self, sp2ion, **kvargs): """ Reads data from a previous SIESTA calculation, interpolates the orbitals on a single log mesh. """ from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_siesta_ion_interp import siesta_ion_interp from pyscf.nao.m_siesta_ion_add_sp2 import _siesta_ion_add_sp2 import numpy as np self.init_log_mesh_ion(sp2ion, **kvargs) self.interp_rr, self.interp_pp = log_interp_c(self.rr), log_interp_c( self.pp) _siesta_ion_add_sp2( self, sp2ion) # adds the fields for counting, .nspecies etc. self.jmx = max([mu2j.max() for mu2j in self.sp_mu2j]) self.sp2norbs = np.array( [mu2s[self.sp2nmult[sp]] for sp, mu2s in enumerate(self.sp_mu2s)], dtype='int64') self.psi_log = siesta_ion_interp(self.rr, sp2ion, 1) self.psi_log_rl = siesta_ion_interp(self.rr, sp2ion, 0) self.sp2ion = sp2ion self.sp_mu2rcut = [ np.array(ion["paos"]["cutoff"], dtype='float64') for ion in sp2ion ] self.sp2rcut = np.array([np.amax(rcuts) for rcuts in self.sp_mu2rcut], dtype='float64') self.sp2charge = [int(ion['z']) for ion in self.sp2ion] self.sp2valence = [int(ion['valence']) for ion in self.sp2ion] #call sp2ion_to_psi_log(sv%sp2ion, sv%rr, sv%psi_log) #call init_psi_log_rl(sv%psi_log, sv%rr, sv%uc%mu_sp2j, sv%uc%sp2nmult, sv%psi_log_rl) #call sp2ion_to_core(sv%sp2ion, sv%rr, sv%core_log, sv%sp2has_core, sv%sp2rcut_core) return self
def test_log_interp_diff(self): """ Test the differentiation facility from the class log_interp_c """ import matplotlib.pyplot as plt rr,pp = log_mesh(1024, 0.001, 20.0) logi = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc*r**2) for r in rr]) ffd_ref = np.array([np.exp(-gc*r**2)*(-2.0*gc*r) for r in rr]) ffd = logi.diff(ff) ffd_np = np.gradient(ff, rr) s = 3 for r,d,dref,dnp in zip(rr[s:],ffd[s:],ffd_ref[s:],ffd_np[s:]): self.assertAlmostEqual(d,dref)
def test_log_interp_sv_call(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr,pp = log_mesh(256, 0.01, 20.0) lgi = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc*r**2) for r in rr]) rvecs = np.linspace(0.05, 25.0, 200) r2yy = lgi(ff, rvecs) for ir, r in enumerate(rvecs): yref = np.exp(-gc*r**2) y1 = lgi(ff, r) self.assertAlmostEqual(y1,yref) self.assertAlmostEqual(r2yy[ir],yref)
def test_log_interp_coeffs_vec(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr, pp = log_mesh(1024, 0.01, 20.0) lgi = log_interp_c(rr) rvecs = np.linspace(0.00, 25.0, 20) kk1, cc1 = np.zeros(len(rvecs), dtype=np.int32), np.zeros( (6, len(rvecs))) for i, rv in enumerate(rvecs): kk1[i], cc1[:, i] = lgi.coeffs(rv) kk2, cc2 = lgi.coeffs_vv(rvecs) for k1, c1, k2, c2 in zip(kk1, cc1, kk2, cc2): self.assertEqual(k1, k2) for y1, y2 in zip(c1, c2): self.assertAlmostEqual(y1, y2)
def test_log_interp_sv_call(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr, pp = log_mesh(256, 0.01, 20.0) lgi = log_interp_c(rr) gc = 1.2030 ff = np.array([np.exp(-gc * r**2) for r in rr]) rvecs = np.linspace(0.05, 25.0, 200) r2yy = lgi(ff, rvecs) for ir, r in enumerate(rvecs): yref = np.exp(-gc * r**2) y1 = lgi(ff, r) self.assertAlmostEqual(y1, yref) self.assertAlmostEqual(r2yy[ir], yref)
def test_log_interp_vv_speed(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr,pp = funct_log_mesh(1024, 0.01, 200.0) lgi = log_interp_c(rr) gcs = np.array([1.2030, 3.2030, 0.7, 10.0, 5.3]) ff = np.array([[np.exp(-gc*r**2) for r in rr] for gc in gcs]) rr = np.linspace(0.05, 250.0, 2000000) t1 = timer() fr2yy = lgi.interp_rcut(ff, rr, rcut=16.0) t2 = timer() #print(__name__, 't2-t1: ', t2-t1) yyref = np.exp(-(gcs.reshape(gcs.size,1)) * (rr.reshape(1,rr.size)**2)) self.assertTrue(np.allclose(fr2yy, yyref) )
def test_log_interp_vv(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr, pp = log_mesh(256, 0.01, 20.0) lgi = log_interp_c(rr) gcs = np.array([1.2030, 3.2030, 0.7, 10.0]) ff = np.array([[np.exp(-gc * r**2) for r in rr] for gc in gcs]) rvecs = np.linspace(0.05, 25.0, 200) fr2yy = lgi.interp_vv(ff, rvecs) yy_vv1 = np.zeros((len(ff), len(rvecs))) for ir, r in enumerate(rvecs): yyref = np.exp(-gcs * r**2) yy = yy_vv1[:, ir] = lgi.interp_vv(ff, r) for y1, yref, y2 in zip(yy, yyref, fr2yy[:, ir]): self.assertAlmostEqual(y1, yref) self.assertAlmostEqual(y2, yref)
def test_log_interp_vv(self): """ Test the interpolation facility for an array arguments from the class log_interp_c """ rr,pp = log_mesh(256, 0.01, 20.0) lgi = log_interp_c(rr) gcs = np.array([1.2030, 3.2030, 0.7, 10.0]) ff = np.array([[np.exp(-gc*r**2) for r in rr] for gc in gcs]) rvecs = np.linspace(0.05, 25.0, 200) fr2yy = lgi.interp_vv(ff, rvecs) yy_vv1 = np.zeros((len(ff),len(rvecs))) for ir, r in enumerate(rvecs): yyref = np.exp(-gcs*r**2) yy = yy_vv1[:,ir] = lgi.interp_vv(ff, r) for y1,yref,y2 in zip(yy, yyref,fr2yy[:,ir]): self.assertAlmostEqual(y1,yref) self.assertAlmostEqual(y2,yref)
def _init_ao_log_gto(self, **kw): """ supposed to be private """ import numpy as np from pyscf.nao.m_log_interp import log_interp_c self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) sv = nao = kw['nao'] rcut_tol = kw['rcut_tol'] gto = kw['gto'] if 'gto' in kw else nao.gto self.sp_mu2j = [0]*sv.nspecies self.psi_log = [0]*sv.nspecies self.psi_log_rl = [0]*sv.nspecies self.sp2nmult = np.zeros(sv.nspecies, dtype=np.int64) self.nspecies = sv.nspecies seen_species = [] # this is auxiliary to organize the loop over species for ia,sp in enumerate(sv.atom2sp): if sp in seen_species: continue seen_species.append(sp) self.sp2nmult[sp] = nmu = sum([gto.bas_nctr(sid) for sid in gto.atom_shell_ids(ia)]) mu2ff = np.zeros((nmu, self.nr)) mu2ff_rl = np.zeros((nmu, self.nr)) mu2j = np.zeros(nmu, dtype=np.int64) mu = -1 for sid in gto.atom_shell_ids(ia): pows, coeffss = gto.bas_exp(sid), gto.bas_ctr_coeff(sid) for coeffs in coeffss.T: mu=mu+1 l = mu2j[mu] = gto.bas_angular(sid) for ir, r in enumerate(self.rr): mu2ff_rl[mu,ir] = sum(pows[:]**((2*l+3)/4.0)*coeffs[:]*np.exp(-pows[:]*r**2)) mu2ff[mu,ir] = r**l*mu2ff_rl[mu,ir] self.sp_mu2j[sp] = mu2j norms = [np.sqrt(self.interp_rr.dg_jt*sum(ff**2*self.rr**3)) for ff in mu2ff] for mu,norm in enumerate(norms): mu2ff[mu,:] = mu2ff[mu,:]/norm mu2ff_rl[mu,:] = mu2ff_rl[mu,:]/norm self.psi_log[sp] = mu2ff self.psi_log_rl[sp] = mu2ff_rl self.jmx = max([mu2j.max() for mu2j in self.sp_mu2j]) self.sp_mu2s = [] for mu2j in self.sp_mu2j: mu2s = np.zeros(len(mu2j)+1, dtype=np.int64) for mu,j in enumerate(mu2j): mu2s[mu+1] = mu2s[mu]+2*j+1 self.sp_mu2s.append(mu2s) self.sp2norbs = np.array([mu2s[-1] for mu2s in self.sp_mu2s]) self.sp2charge = sv.sp2charge self.sp_mu2rcut = [] for sp, mu2ff in enumerate(self.psi_log): mu2rcut = np.zeros(len(mu2ff)) for mu,ff in enumerate(mu2ff): ffmx,irmx = abs(mu2ff[mu]).max(), abs(mu2ff[mu]).argmax() irrp = np.argmax(abs(ff[irmx:])<ffmx*rcut_tol) irrc = irmx+irrp if irrp>0 else -1 mu2rcut[mu] = self.rr[irrc] self.sp_mu2rcut.append(mu2rcut) self.sp2rcut = np.array([mu2rcut.max() for mu2rcut in self.sp_mu2rcut]) return self
def init_ao_log_ion(self, sp2ion, **kw): """ Reads data from a previous SIESTA calculation, interpolates the orbitals on a single log mesh. """ from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_siesta_ion_interp import siesta_ion_interp from pyscf.nao.m_siesta_ion_add_sp2 import _siesta_ion_add_sp2 from pyscf.nao.m_spline_diff2 import spline_diff2 from pyscf.nao.m_spline_interp import spline_interp import numpy as np self.init_log_mesh_ion(sp2ion, **kw) #print(__name__, self.nr) #print(__name__, self.rr) #print(__name__, self.rmax) #print(__name__, self.rmin) #print(__name__, self.kmax) self.interp_rr, self.interp_pp = log_interp_c(self.rr), log_interp_c( self.pp) _siesta_ion_add_sp2( self, sp2ion) # adds the fields for counting, .nspecies etc. self.jmx = max([mu2j.max() for mu2j in self.sp_mu2j]) self.sp2norbs = np.array( [mu2s[self.sp2nmult[sp]] for sp, mu2s in enumerate(self.sp_mu2s)], dtype='int64') self.sp2ion = sp2ion rr = self.rr nr = len(rr) #print(__name__, 'self.jmx', self.jmx) #print(__name__, 'self.sp2norbs', self.sp2norbs) #print(__name__, 'self.sp2norbs', dir(self)) #print(__name__, 'self.sp_mu2j', self.sp_mu2j) #print(__name__, 'self.sp_mu2rcut', self.sp_mu2rcut) #print(__name__, 'self.sp_mu2s', self.sp_mu2s) self.psi_log = siesta_ion_interp(rr, sp2ion, 1) self.psi_log_rl = siesta_ion_interp(rr, sp2ion, 0) self.sp2vna = [ ] # Interpolate a Neutral-atom potential V_NA(r) for each specie for ion in sp2ion: vna = np.zeros(nr) if ion["vna"] is not None: h, dat = ion["vna"]["delta"], ion["vna"]["data"][0][:, 1] yy_diff2 = spline_diff2(h, dat, 0.0, 1.0e301) for ir, r in enumerate(rr): vna[ir] = spline_interp(h, dat, yy_diff2, r) self.sp2vna.append(vna * 0.5) # given in Rydberg? self.sp_mu2rcut = [np.array(ion["paos"]["cutoff"]) for ion in sp2ion] self.sp2rcut = np.array([np.amax(rcuts) for rcuts in self.sp_mu2rcut]) self.sp2charge = [int(ion['z']) for ion in self.sp2ion] self.sp2valence = [int(ion['valence']) for ion in self.sp2ion] #call sp2ion_to_psi_log(sv%sp2ion, sv%rr, sv%psi_log) #call init_psi_log_rl(sv%psi_log, sv%rr, sv%uc%mu_sp2j, sv%uc%sp2nmult, sv%psi_log_rl) #call sp2ion_to_core(sv%sp2ion, sv%rr, sv%core_log, sv%sp2has_core, sv%sp2rcut_core) return self
def __init__(self, gg): #assert(type(rr)==np.ndarray) assert(len(gg)>2) self.nr = len(gg) self.gammin_jt = np.log(gg[0]) self.dg_jt = np.log(gg[1]/gg[0]) def __call__(self, ff, r): assert ff.shape[-1]==self.nr k,cc = comp_coeffs(self, r) result = np.zeros(ff.shape[0:-2]) for j,c in enumerate(cc): result = result + c*ff[...,j+k] return result # Example: # loginterp =log_interp_c(rr) if __name__ == '__main__': from pyscf.nao.m_log_interp import log_interp, log_interp_c, comp_coeffs_ from pyscf.nao.m_log_mesh import log_mesh rr,pp = log_mesh(1024, 0.01, 20.0) interp_c = log_interp_c(rr) gc = 0.234450 ff = np.array([np.exp(-gc*r**2) for r in rr]) rho_min_jt, dr_jt = np.log(rr[0]), np.log(rr[1]/rr[0]) for r in np.linspace(0.01, 25.0, 100): yref = log_interp(ff, r, rho_min_jt, dr_jt) k,coeffs = comp_coeffs(interp_c, r) y = sum(coeffs*ff[k:k+6]) if(abs(y-yref)>1e-15): print(r, yref, y, np.exp(-gc*r**2))
def init_ao_log_gto(self, **kw): """ supposed to be private """ import numpy as np from pyscf.nao.m_log_interp import log_interp_c self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) gto,rcut_tol = kw['gto'],self.rcut_tol a2s = [gto.atom_symbol(ia) for ia in range(gto.natm) ] self.sp2symbol = sorted(list(set(a2s))) nspecies = self.nspecies = len(self.sp2symbol) atom2sp = np.array([self.sp2symbol.index(s) for s in a2s], dtype=np.int64) self.sp2charge = np.array([-999]*self.nspecies, dtype=np.int64) for ia,sp in enumerate(atom2sp): self.sp2charge[sp]=gto.atom_charge(ia) self.sp_mu2j = [0]*nspecies self.psi_log = [0]*nspecies self.psi_log_rl = [0]*nspecies self.sp2nmult = np.zeros(nspecies, dtype=np.int64) seen_species = [] # this is auxiliary to organize the loop over species for ia,sp in enumerate(atom2sp): if sp in seen_species: continue seen_species.append(sp) self.sp2nmult[sp] = nmu = sum([gto.bas_nctr(sid) for sid in gto.atom_shell_ids(ia)]) mu2ff = np.zeros((nmu, self.nr)) mu2ff_rl = np.zeros((nmu, self.nr)) mu2j = np.zeros(nmu, dtype=np.int64) mu = -1 for sid in gto.atom_shell_ids(ia): pows, coeffss = gto.bas_exp(sid), gto.bas_ctr_coeff(sid) for coeffs in coeffss.T: mu=mu+1 l = mu2j[mu] = gto.bas_angular(sid) for ir, r in enumerate(self.rr): mu2ff_rl[mu,ir] = sum(pows[:]**((2*l+3)/4.0)*coeffs[:]*np.exp(-pows[:]*r**2)) mu2ff[mu,ir] = r**l*mu2ff_rl[mu,ir] self.sp_mu2j[sp] = mu2j norms = [np.sqrt(self.interp_rr.dg_jt*sum(ff**2*self.rr**3)) for ff in mu2ff] for mu,norm in enumerate(norms): mu2ff[mu,:] = mu2ff[mu,:]/norm mu2ff_rl[mu,:] = mu2ff_rl[mu,:]/norm self.psi_log[sp] = mu2ff self.psi_log_rl[sp] = mu2ff_rl self.jmx = max([mu2j.max() for mu2j in self.sp_mu2j]) self.sp_mu2s = [] for mu2j in self.sp_mu2j: mu2s = np.zeros(len(mu2j)+1, dtype=np.int64) for mu,j in enumerate(mu2j): mu2s[mu+1] = mu2s[mu]+2*j+1 self.sp_mu2s.append(mu2s) self.sp2norbs = np.array([mu2s[-1] for mu2s in self.sp_mu2s]) self.sp_mu2rcut = [] for sp, mu2ff in enumerate(self.psi_log): mu2rcut = np.zeros(len(mu2ff)) for mu,ff in enumerate(mu2ff): ffmx,irmx = abs(mu2ff[mu]).max(), abs(mu2ff[mu]).argmax() irrp = np.argmax(abs(ff[irmx:])<ffmx*rcut_tol) irrc = irmx+irrp if irrp>0 else -1 mu2rcut[mu] = self.rr[irrc] self.sp_mu2rcut.append(mu2rcut) self.sp2rcut = np.array([mu2rcut.max() for mu2rcut in self.sp_mu2rcut]) return self
def init_ao_log_gpaw(self, setups, **kvargs): """ Reads radial orbitals from a previous GPAW calculation. """ from pyscf.nao.m_log_interp import log_interp_c from pyscf.nao.m_siesta_ion_interp import siesta_ion_interp #self.setups = setups if setup is saved in ao_log, we grt the following error # while performing copy # File "/home/marc/anaconda2/lib/python2.7/copy.py", line 182, in deepcopy # rv = reductor(2) # TypeError: can't pickle Spline objects self.init_log_mesh_gpaw(setups, **kvargs) self.interp_rr,self.interp_pp = log_interp_c(self.rr), log_interp_c(self.pp) sdic = setups.setups self.sp2key = sdic.keys() #key0 = sdic.keys()[0] #print(key0, sdic[key0].Z, dir(sdic[key0])) self.sp_mu2j = [np.array(sdic[key].l_orb_j, np.int64) for key in sdic.keys()] self.sp2nmult = np.array([len(mu2j) for mu2j in self.sp_mu2j], dtype=np.int64) self.sp2charge = np.array([sdic[key].Z for key in sdic.keys()], dtype=np.int64) self.nspecies = len(self.sp_mu2j) self.jmx = max([max(mu2j) for mu2j in self.sp_mu2j]) self.sp2norbs = np.array([sum(2*mu2j+1) for mu2j in self.sp_mu2j], dtype=np.int64) self.sp_mu2rcut = [] self.psi_log_rl = [] self.psi_log = [] for sp,[key,nmu,mu2j] in enumerate(zip(sdic.keys(), self.sp2nmult, self.sp_mu2j)): self.sp_mu2rcut.append(np.array([phit.get_cutoff() for phit in sdic[key].phit_j])) mu2ff = np.zeros([nmu, self.nr]) for mu,phit in enumerate(sdic[key].phit_j): for ir, r in enumerate(self.rr): mu2ff[mu,ir],deriv = phit.get_value_and_derivative(r) self.psi_log_rl.append(mu2ff) self.psi_log.append(mu2ff* (self.rr**mu2j[mu])) self.sp2rcut = np.array([np.amax(rcuts) for rcuts in self.sp_mu2rcut], dtype='float64') # derived from sp_mu2rcut self.sp_mu2s = [] # derived from sp_mu2j for mu2j in self.sp_mu2j: mu2s = np.zeros(len(mu2j)+1, dtype=np.int64) for mu,j in enumerate(mu2j): mu2s[mu+1] = mu2s[mu]+2*j+1 self.sp_mu2s.append(mu2s) #self._add_sp2info() #self._add_psi_log_mom() #print(self.sp_mu2j) #print(self.sp2nmult) #print(self.nspecies) #print(self.jmx) #print(self.sp2norbs) #print(self.sp_mu2rcut) #print(self.psi_log) #print(self.sp2charge) #print(self.sp2rcut) #print(self.sp_mu2s) return self