Beispiel #1
0
    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
Beispiel #2
0
  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
Beispiel #3
0
    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()
Beispiel #4
0
 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()
Beispiel #5
0
  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
Beispiel #6
0
    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
Beispiel #7
0
  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]
Beispiel #8
0
    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]
Beispiel #9
0
 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)
Beispiel #10
0
 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)
Beispiel #11
0
 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)
Beispiel #12
0
 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)
Beispiel #13
0
 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])
Beispiel #14
0
    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)
Beispiel #18
0
 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)
Beispiel #19
0
    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
Beispiel #20
0
 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)
Beispiel #24
0
  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)    
Beispiel #27
0
  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
Beispiel #28
0
    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
Beispiel #29
0
  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))
Beispiel #30
0
    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
Beispiel #31
0
  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