Esempio n. 1
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)
Esempio n. 2
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)
Esempio n. 3
0
 def test_log_mesh(self):
     """ Test construction of log mesh with predefined grids"""
     from pyscf.nao.m_log_mesh import log_mesh
     rr, pp = log_mesh(1024, 1e-3, 15.0)
     lm = log_mesh_c().init_log_mesh(rr, pp)
     self.assertEqual(lm.nr, 1024)
     self.assertAlmostEqual(lm.rr[0], 1e-3)
     self.assertAlmostEqual(lm.rr[-1], 15.0)
     self.assertAlmostEqual(lm.pp[-1], 318.3098861837907)
     self.assertAlmostEqual(lm.pp[0], 0.021220659078919384)
Esempio n. 4
0
 def test_log_mesh(self):
   """ Test construction of log mesh with predefined grids"""
   from pyscf.nao.m_log_mesh import log_mesh
   rr,pp=log_mesh(1024, 1e-3, 15.0)
   lm = log_mesh_c().init_log_mesh(rr,pp)
   self.assertEqual(lm.nr, 1024)
   self.assertAlmostEqual(lm.rr[0], 1e-3)
   self.assertAlmostEqual(lm.rr[-1], 15.0)
   self.assertAlmostEqual(lm.pp[-1], 318.3098861837907)
   self.assertAlmostEqual(lm.pp[0], 0.021220659078919384)
Esempio n. 5
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)
Esempio n. 6
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)
Esempio n. 7
0
 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)
Esempio n. 8
0
 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)
Esempio n. 9
0
 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)
Esempio n. 10
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)
Esempio n. 11
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)
Esempio n. 12
0
    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)
Esempio n. 13
0
 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)    
Esempio n. 14
0
 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)
Esempio n. 15
0
 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)    
Esempio n. 16
0
    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)
Esempio n. 17
0
    def __init__(self, **kw):
        from pyscf.nao.m_log_mesh import log_mesh
        """ Constructor G0W0 class """
        # how to exclude from the input the dtype and xc_code ?
        scf.__init__(self, **kw)
        #print(__name__, ' dtype ', self.dtype)

        self.xc_code_scf = copy(self.xc_code)
        self.niter_max_ev = kw['niter_max_ev'] if 'niter_max_ev' in kw else 15
        self.tol_ev = kw['tol_ev'] if 'tol_ev' in kw else 1e-6
        self.perform_gw = kw['perform_gw'] if 'perform_gw' in kw else False
        self.rescf = kw['rescf'] if 'rescf' in kw else False
        self.bsize = kw['bsize'] if 'bsize' in kw else min(40, self.norbs)

        if self.nspin == 1:
            self.nocc_0t = nocc_0t = np.array([int(self.nelec / 2)])
        elif self.nspin == 2:
            self.nocc_0t = nocc_0t = self.nelec
        else:
            raise RuntimeError('nspin>2?')

        if self.verbosity > 0:
            print(__name__, 'nocc_0t =', nocc_0t, 'spin =', self.spin,
                  'nspin =', self.nspin)

        if 'nocc' in kw:
            s2nocc = [kw['nocc']] if type(kw['nocc']) == int else kw['nocc']
            self.nocc = array([min(i, j) for i, j in zip(s2nocc, nocc_0t)])
        else:
            self.nocc = array([min(6, j) for j in nocc_0t])

        if 'nvrt' in kw:
            s2nvrt = [kw['nvrt']] if type(kw['nvrt']) == int else kw['nvrt']
            self.nvrt = array(
                [min(i, j) for i, j in zip(s2nvrt, self.norbs - nocc_0t)])
        else:
            self.nvrt = array([min(6, j) for j in self.norbs - nocc_0t])
        if self.verbosity > 0:
            print(__name__, 'nocc =', self.nocc, 'nvrt =', self.nvrt)

        self.start_st, self.finish_st = self.nocc_0t - self.nocc, self.nocc_0t + self.nvrt

        self.nn = [
            range(self.start_st[s], self.finish_st[s])
            for s in range(self.nspin)
        ]  # list of states to correct?
        if self.verbosity > 0: print(__name__, 'nn =', self.nn)

        if 'nocc_conv' in kw:
            s2nocc_conv = [kw['nocc_conv']] if type(
                kw['nocc_conv']) == int else kw['nocc_conv']
            self.nocc_conv = array(
                [min(i, j) for i, j in zip(s2nocc_conv, nocc_0t)])
        else:
            self.nocc_conv = self.nocc

        if 'nvrt_conv' in kw:
            s2nvrt_conv = [kw['nvrt_conv']] if type(
                kw['nvrt_conv']) == int else kw['nvrt_conv']
            self.nvrt_conv = array(
                [min(i, j) for i, j in zip(s2nvrt_conv, self.norbs - nocc_0t)])
        else:
            self.nvrt_conv = self.nvrt

        if self.rescf:
            self.kernel_scf(
            )  # here is rescf with HF functional tacitly assumed

        self.nff_ia = kw['nff_ia'] if 'nff_ia' in kw else 32
        self.tol_ia = kw['tol_ia'] if 'tol_ia' in kw else 1e-10
        (wmin_def, wmax_def, tmin_def,
         tmax_def) = self.get_wmin_wmax_tmax_ia_def(self.tol_ia)
        self.wmin_ia = kw['wmin_ia'] if 'wmin_ia' in kw else wmin_def
        self.wmax_ia = kw['wmax_ia'] if 'wmax_ia' in kw else wmax_def
        self.tmin_ia = kw['tmin_ia'] if 'tmin_ia' in kw else tmin_def
        self.tmax_ia = kw['tmax_ia'] if 'tmax_ia' in kw else tmax_def
        self.tt_ia, self.ww_ia = log_mesh(self.nff_ia, self.tmin_ia,
                                          self.tmax_ia, self.wmax_ia)
        #print('self.tmin_ia, self.tmax_ia, self.wmax_ia')
        #print(self.tmin_ia, self.tmax_ia, self.wmax_ia)
        #print(self.ww_ia[0], self.ww_ia[-1])

        self.dw_ia = self.ww_ia * (log(self.ww_ia[-1]) -
                                   log(self.ww_ia[0])) / (len(self.ww_ia) - 1)
        self.dw_excl = self.ww_ia[0]

        assert self.cc_da.shape[1] == self.nprod
        self.kernel_sq = self.hkernel_den
        #self.v_dab_ds = self.pb.get_dp_vertex_doubly_sparse(axis=2)

        self.x = require(self.mo_coeff[0, :, :, :, 0],
                         dtype=self.dtype,
                         requirements='CW')

        if self.perform_gw: self.kernel_gw()
Esempio n. 18
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))