Beispiel #1
0
 def test_0066_al_atom(self):
   """ Spin-resolved case GW procedure. """
   gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=16, nocc=3, nvrt=3)
   self.assertEqual(gw.nspin, 2)
   gw.kernel_gw()
   #gw.report()
   np.savetxt('eigvals_g0w0_pyscf_rescf_al_0066.txt', gw.mo_energy_gw[0,:,:].T)
Beispiel #2
0
    def test_rf0_ref(self):
        """ This is GW """
        mol = gto.M(
            verbose=1,
            atom='''H 0 0 0;  H 0.17 0.7 0.587''',
            basis='cc-pvdz',
        )
        gto_mf = scf.RHF(mol)
        gto_mf.kernel()
        gw = gw_c(mf=gto_mf, gto=mol)
        ww = [0.0 + 1j * 4.0, 1.0 + 1j * 0.1, -2.0 - 1j * 0.1]

        rf0_fm = gw.rf0_cmplx_vertex_ac(ww)
        rf0_mv = np.zeros_like(rf0_fm)
        vec = np.zeros((gw.nprod), dtype=gw.dtypeComplex)
        for iw, w in enumerate(ww):
            for mu in range(gw.nprod):
                vec[:] = 0.0
                vec[mu] = 1.0
                rf0_mv[iw, mu, :] = gw.apply_rf0(vec, w)

        #print(rf0_fm.shape, rf0_mv.shape)
        #print('abs(rf0_fm-rf0_mv)', abs(rf0_fm-rf0_mv).sum()/rf0_fm.size)
        #print(abs(rf0_fm[0,:,:]-rf0_mv[0,:,:]).sum())
        #print(rf0_fm[0,:,:])
        self.assertTrue(abs(rf0_fm - rf0_mv).sum() / rf0_fm.size < 1e-15)
  def test_rescf(self):
    """ reSCF then G0W0 """
    
    fc = \
      """-1.176137582599898090e+00
-6.697973984258517310e-01
-5.155143130039178123e-01
-4.365448724088398791e-01
2.104535161143837596e-01
2.985738190760626187e-01
5.383631831528181699e-01
5.960427511708059622e-01
6.298425248864513160e-01
6.702150570679562547e-01
7.488635881500678160e-01
1.030485556414411974e+00
1.133596236538136015e+00
1.308430815822860804e+00
1.322564760433334374e+00
1.444841711461231304e+00
1.831867938363858750e+00
1.902393397937107045e+00
1.977107479006525059e+00
2.119748779125555149e+00
2.150570967014801216e+00
2.899024682518652973e+00
3.912773887375614823e+00 """

    dname = os.path.dirname(os.path.abspath(__file__))
    gw = gw_c(label='water', cd=dname, verbosity=0, nocc=8, nvrt=6, nocc_conv=4, nvrt_conv=4, rescf=True, tol_ia=1e-6)
    gw.kernel_gw()
    np.savetxt('eigvals_g0w0_pyscf_rescf_water_0061.txt', gw.mo_energy_gw.T)
      
    for e,eref_str in zip(gw.mo_energy_gw[0,0,:],fc.splitlines()):
      self.assertAlmostEqual(e,float(eref_str))
Beispiel #4
0
  def test_si_ref(self):
    """ This is GW """
    mol = gto.M( verbose = 1, atom = '''H 0 0 0;  H 0.17 0.7 0.587''', basis = 'cc-pvdz',)
    gto_mf = scf.RHF(mol)
    gto_mf.kernel()
    gw = gw_c(mf=gto_mf, gto=mol)
    ww = [0.0+1j*4.0, 1.0+1j*0.1, -2.0-1j*0.1]

    si0_fm = gw.si_c(ww)
 def test_0061_gw_rescf_siesta_s2_triplet(self):
     """ reSCF then G0W0 """
     dname = os.path.dirname(os.path.abspath(__file__)) + '/S2_triplet'
     gw = gw_c(label='S2',
               cd=dname,
               verbosity=1,
               rescf=True,
               tol_ia=1e-6,
               magnetization=2)  #2 Unpaired electron
     gw.kernel_gw()
Beispiel #6
0
 def test_gw(self):
   """ This is GW """
   mol = gto.M( verbose = 0, atom = '''H 0.0 0.0 -0.3707;  H 0.0 0.0 0.3707''', basis = 'cc-pvdz',)
   gto_mf = scf.RHF(mol)
   gto_mf.kernel()
   #print('gto_mf.mo_energy:', gto_mf.mo_energy)
   gw = gw_c(mf=gto_mf, gto=mol, verbosity=0)
   gw.kernel_gw()
   self.assertAlmostEqual(gw.mo_energy_gw[0,0,0], -0.59709476270318296)
   self.assertAlmostEqual(gw.mo_energy_gw[0,0,1], 0.19071318743971943)
 def test_sf_gw_corr(self):
   """ This is choice of wmin and wmax in GW """
   mol = gto.M( verbose = 1, atom = '''H 0.0 0.0 -0.3707;  H 0.0 0.0 0.3707''', basis = 'cc-pvdz',)
   gto_mf = scf.RHF(mol)
   gto_mf.kernel()
   gw = gw_c(mf=gto_mf, gto=mol)
   sn2eval_gw = np.copy(gw.ksn2e[0,:,gw.nn]).T    
   gw_corr_int = gw.gw_corr_int(sn2eval_gw)
   for c,cref in zip(gw_corr_int[0], [ -4.16459719e-02, -4.79778564e-03,-3.26848826e-03,-4.06138735e-05,
     -5.13947211e-03,  -5.13947211e-03, 8.42977051e-03]):
     self.assertAlmostEqual(c[0], cref)
 def test_sf_gw_res_corr(self):
   """ This is choice of wmin and wmax in GW """
   mol = gto.M( verbose = 1, atom = '''H 0 0 0;  H 0.17 0.7 0.587''', basis = 'cc-pvdz',)
   gto_mf = scf.RHF(mol)
   gto_mf.kernel()
   gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-6)
   sn2eval_gw = [np.copy(gw.ksn2e[0,s,nn]) for s,nn in enumerate(gw.nn) ]
   gw_corr_res = gw.gw_corr_res(sn2eval_gw)
   
   fc = """0.03105265 -0.00339984 -0.01294826 -0.06934852 -0.03335821 -0.03335821 0.46324024"""
   for e,eref_str in zip(gw_corr_res[0],fc.split(' ')):
     self.assertAlmostEqual(e,float(eref_str),7)    
Beispiel #9
0
 def test_o2_gw_0087(self):
   from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations
   """ Spin-resolved case GW procedure. """
   #print(__name__, dir(gto_mf_uhf))
   gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=6)
   print(__name__, 'nfermi =', gw.nfermi)
   print(__name__, 'e_tot =', e_tot)
   self.assertEqual(gw.nspin, 2)
   
   gw.kernel_gw()
   print(gw.mo_energy)
   print(gw.mo_energy_gw)
   print(gw.ksn2f)
Beispiel #10
0
    def test_o2_gw_0087(self):
        from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations
        """ Spin-resolved case GW procedure. """
        #print(__name__, dir(gto_mf_uhf))
        gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=6)
        print(__name__, 'nfermi =', gw.nfermi)
        print(__name__, 'e_tot =', e_tot)
        self.assertEqual(gw.nspin, 2)

        gw.kernel_gw()
        print(gw.mo_energy)
        print(gw.mo_energy_gw)
        print(gw.ksn2f)
Beispiel #11
0
 def test_gw(self):
     """ This is GW """
     mol = gto.M(
         verbose=0,
         atom='''H 0.0 0.0 -0.3707;  H 0.0 0.0 0.3707''',
         basis='cc-pvdz',
     )
     gto_mf = scf.RHF(mol)
     gto_mf.kernel()
     #print('gto_mf.mo_energy:', gto_mf.mo_energy)
     gw = gw_c(mf=gto_mf, gto=mol, verbosity=0)
     gw.kernel_gw()
     self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 0], -0.59709476270318296)
     self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 1], 0.19071318743971943)
 def test_wmin_wmax(self):
   """ This is choice of wmin and wmax in GW """
   mol = gto.M( verbose = 1, atom = '''H 0 0 0;  H 0.17 0.7 0.587''', basis = 'cc-pvdz',)
   gto_mf = scf.RHF(mol)
   gto_mf.kernel()
   gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-3)
   self.assertEqual(gw.nocc, 1)
   self.assertEqual(gw.nvrt, 6)
   self.assertEqual(gw.start_st, 0)
   self.assertEqual(gw.finish_st, 7)
   self.assertAlmostEqual(gw.wmin_ia, 0.010963536607965261)
   self.assertAlmostEqual(gw.wmax_ia, 10.396997096859502)
   self.assertAlmostEqual(gw.ww_ia.sum(), 60.588528092301765)
   self.assertAlmostEqual(gw.tt_ia.sum(), 57.489242777049725)
Beispiel #13
0
 def test_0068_F_atom(self):
     """ Spin-resolved case GW procedure. """
     gw = gw_c(mf=gto_mf,
               gto=mol,
               verbosity=0,
               niter_max_ev=16,
               rescf=True,
               kmat_algo='dp_vertex_loops_sm')
     self.assertEqual(gw.nspin, 2)
     gw.kernel_gw()
     #gw.report()
     np.savetxt('eigvals_gw_pyscf_f_0068.txt', gw.mo_energy_gw[0, :, :].T)
     ev_ref = np.loadtxt('eigvals_gw_pyscf_f_0068.txt-ref').T
     for n2e, n2r in zip(gw.mo_energy_gw[0], ev_ref):
         for e, r in zip(n2e, n2r):
             self.assertAlmostEqual(e, r)
Beispiel #14
0
    def test_sf_iter(self):
        """ This compares matrix element of W calculated by G0W0 and G0W0_iter """
        mol = gto.M(atom='''C 0.0, 0.0, -0.611046 ; N 0.0, 0.0, 0.52375''',
                    basis='ccpvdz',
                    spin=1)
        gto_mf = scf.UHF(mol)
        gto_mf.kernel()

        gw = gw_c(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=20)
        gwi = gw_iter(mf=gto_mf, gto=mol, verbosity=0, niter_max_ev=20)

        sf = gw.get_snmw2sf()
        sf_it = gwi.get_snmw2sf_iter()
        self.assertEqual(len(sf), len(sf_it))
        self.assertEqual(sf[0].shape, sf_it[0].shape)
        self.assertTrue(np.allclose(sf, sf_it, atol=gwi.gw_iter_tol))
Beispiel #15
0
 def test_0089_he_atom(self):
     """ Spin-resolved case GW procedure. """
     gw = gw_c(mf=gto_mf,
               gto=mol,
               verbosity=0,
               niter_max_ev=16,
               kmat_timing=0.0,
               kmat_algo='sm0_sum')
     self.assertEqual(gw.nspin, 2)
     gw.kernel_gw()
     #if gw.kmat_timing is not None: print('gw.kmat_timing', gw.kmat_timing)
     #gw.report()
     np.savetxt('eigvals_gw_pyscf_he_0067.txt', gw.mo_energy_gw[0, :, :].T)
     ev_ref = np.loadtxt('eigvals_gw_pyscf_he_0067.txt-ref').T
     for n2e, n2r in zip(gw.mo_energy_gw[0], ev_ref):
         for e, r in zip(n2e, n2r):
             self.assertAlmostEqual(e, r)
Beispiel #16
0
  def test_o2_gw_0087(self):
    from io import StringIO
    """ Spin-resolved case GW procedure. """
    #print(__name__, dir(gto_mf_uhf))
    gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0, niter_max_ev=6, jcutoff=12)
    #print(__name__, 'nfermi =', gw.nfermi)
    #print(__name__, 'e_tot =', e_tot)
    self.assertEqual(gw.nspin, 2)
    gw.kernel_gw()
    #gw.report()
    np.savetxt('eigvals_g0w0_pyscf_rescf_o2_0087.txt', gw.mo_energy_gw[0,:,:].T)

    reflines = u"""-2.066794262507180235e+01 -2.059606842160618001e+01 
-2.066739073401323168e+01 -2.026688493419162995e+01
-1.597844973588707695e+00 -1.404839916644314624e+00
-1.065759004553683331e+00 -9.223326834974986399e-01
-7.216185233670470156e-01 -6.604156965786966982e-01
-7.216185233670456833e-01 -5.819504613421641048e-01
-7.162888896288145402e-01 -5.819504613421628836e-01
-4.863444705681586600e-01 6.572791437724267993e-02
-4.863444705681552738e-01 6.572791437724459507e-02
3.374986529927169188e-01 3.989268256149947622e-01
9.723803394644109366e-01 9.945702181997964075e-01
1.012560504993975208e+00 1.085328723165654985e+00
1.012560504993977428e+00 1.085328723165656539e+00
1.097687223995805983e+00 1.116946344532482316e+00
1.110895503965524833e+00 1.221318278807398849e+00
1.120550633372836780e+00 1.221318278807399516e+00
1.274502871852798203e+00 1.289100602949988517e+00
1.871514450003718633e+00 1.907845159479740982e+00
2.323558750328121203e+00 2.380030399530845386e+00
2.323558750328121203e+00 2.380030399530846719e+00
2.594057749622432407e+00 2.699072541242792500e+00
2.594057749622432407e+00 2.699072541242792944e+00
2.863151521343340722e+00 2.996390061519241144e+00
2.863151521343342942e+00 2.996390061519242476e+00
2.986289867696291900e+00 3.043597277843169024e+00
3.519722767487217574e+00 3.582380444764414751e+00
3.519722767487221127e+00 3.582380444764418304e+00
4.112903441748526845e+00 4.146312536608574462e+00
    """ #u unicodes the string in python 2.7
    eeref = np.loadtxt(StringIO(reflines)).T
    for e1r,e2r, e1,e2 in zip(eeref[0], eeref[1], gw.mo_energy_gw[0,0,:], gw.mo_energy_gw[0,1,:]):
      #print(e1r,e1,e2r,e2)
      self.assertAlmostEqual(float(e1r), e1)
      self.assertAlmostEqual(float(e2r), e2)
Beispiel #17
0
 def test_wmin_wmax(self):
     """ This is choice of wmin and wmax in GW """
     mol = gto.M(
         verbose=1,
         atom='''H 0 0 0;  H 0.17 0.7 0.587''',
         basis='cc-pvdz',
     )
     gto_mf = scf.RHF(mol)
     gto_mf.kernel()
     gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-3)
     self.assertEqual(gw.nocc, 1)
     self.assertEqual(gw.nvrt, 6)
     self.assertEqual(gw.start_st, 0)
     self.assertEqual(gw.finish_st, 7)
     self.assertAlmostEqual(gw.wmin_ia, 0.010963536607965261)
     self.assertAlmostEqual(gw.wmax_ia, 10.396997096859502)
     self.assertAlmostEqual(gw.ww_ia.sum(), 60.588528092301765)
     self.assertAlmostEqual(gw.tt_ia.sum(), 57.489242777049725)
Beispiel #18
0
    def test_sf_gw_res_corr(self):
        """ This is choice of wmin and wmax in GW """
        mol = gto.M(
            verbose=1,
            atom='''H 0 0 0;  H 0.17 0.7 0.587''',
            basis='cc-pvdz',
        )
        gto_mf = scf.RHF(mol)
        gto_mf.kernel()
        gw = gw_c(mf=gto_mf, gto=mol, tol_ia=1e-6)
        sn2eval_gw = [
            np.copy(gw.ksn2e[0, s, nn]) for s, nn in enumerate(gw.nn)
        ]
        gw_corr_res = gw.gw_corr_res(sn2eval_gw)

        fc = """0.03105265 -0.00339984 -0.01294826 -0.06934852 -0.03335821 -0.03335821 0.46324024"""
        for e, eref_str in zip(gw_corr_res[0], fc.split(' ')):
            self.assertAlmostEqual(e, float(eref_str), 7)
Beispiel #19
0
    def test_beh_gw_0088(self):
        from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations
        """ Spin-resolved case GW procedure. """
        #print(__name__, dir(gto_mf_uhf))
        gw = gw_c(mf=gto_mf_uhf,
                  gto=mol,
                  verbosity=0,
                  niter_max_ev=8,
                  pb_algorithm='pp')
        self.assertEqual(gw.nspin, 2)

        #print(__name__, 'nfermi =', gw.nfermi)
        #print(__name__, 'e_tot =', e_tot)

        gw.kernel_gw()
        #gw.report()
        self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 2] * 27.2114,
                               -8.4558357834412305)
Beispiel #20
0
    def test_0090_h_atom(self):
        """ Spin-resolved case GW procedure. """
        return
        gw = gw_c(mf=gto_mf,
                  gto=mol,
                  verbosity=2,
                  niter_max_ev=16,
                  kmat_algo='dp_vertex_loops_sm')
        #nao_rdm = gw.make_rdm1()
        #print(__name__, (gw.get_hcore()*nao_rdm).sum())
        #print((gw.get_j()*nao_rdm).sum())
        #print((gw.get_k()*nao_rdm).sum())

        self.assertEqual(gw.nspin, 1)
        gw.kernel_gw()
        gw.report()
        np.savetxt('eigvals_g0w0_pyscf_rescf_h_0090.txt',
                   gw.mo_energy_gw[0, :, :].T)
Beispiel #21
0
 def test_sf_gw_corr(self):
     """ This is choice of wmin and wmax in GW """
     mol = gto.M(
         verbose=1,
         atom='''H 0.0 0.0 -0.3707;  H 0.0 0.0 0.3707''',
         basis='cc-pvdz',
     )
     gto_mf = scf.RHF(mol)
     gto_mf.kernel()
     gw = gw_c(mf=gto_mf, gto=mol)
     sn2eval_gw = np.copy(gw.ksn2e[0, :, gw.nn]).T
     gw_corr_int = gw.gw_corr_int(sn2eval_gw)
     for c, cref in zip(gw_corr_int[0], [
             -4.16459719e-02, -4.79778564e-03, -3.26848826e-03,
             -4.06138735e-05, -5.13947211e-03, -5.13947211e-03,
             8.42977051e-03
     ]):
         self.assertAlmostEqual(c[0], cref)
Beispiel #22
0
    def test_clo_gw_0089(self):
        """ Spin-resolved case GW procedure. By using frozen_core convergence has been reached"""
        gw = gw_c(
            mf=gto_mf_UHF,
            gto=mol,
            verbosity=1,
            niter_max_ev=20,
            frozen_core=30
        )  #Frozen core is defined by True, False or a number(N) which corrects state index in a range btween N-fermi and N+fermi
        gw.kernel_gw()
        gw.report()

        self.assertEqual(gw.nspin, 2)
        self.assertAlmostEqual(gw.mo_energy_gw[0, 0, 2], -10.580537488540639)
        sf = gw.get_snmw2sf()
        self.assertEqual(len(sf), 2)  #without fz 2
        self.assertEqual(len(sf[0]), 18)  #without fz 12
        self.assertEqual(sf[0].shape, (18, 68, 32))  #without fz (12,68,32)
    def test_rescf(self):
        """ Hartree-Fock than G0W0 N2 example is marked with level-ordering change """

        dname = os.path.dirname(os.path.abspath(__file__))
        gw = gw_c(label='n2',
                  cd=dname,
                  verbosity=0,
                  jcutoff=9,
                  nff_ia=64,
                  tol_ia=1e-6,
                  rescf=True)
        gw.kernel_gw()
        gw.report()
        #np.savetxt('eigvals_g0w0_pyscf_rescf_n2_0062.txt', gw.mo_energy_gw.T)

        fc = """-1.294910390463269723e+00
-6.914426700260764003e-01
-5.800631098408213226e-01
-5.800630912944181317e-01
-5.488682018442180288e-01
1.831305221095872460e-01
1.831305925807518165e-01
7.003698201553041347e-01
7.609521815330196892e-01
7.953706485575250396e-01
7.953707042048162590e-01
9.385062725430328712e-01
9.553819617686154508e-01
9.557372926158315130e-01
9.769254942961748123e-01
9.769258344753622980e-01
1.033749364514201741e+00
1.323622829437763881e+00
1.323622831800760569e+00
1.631897154460114852e+00
1.632680402343911652e+00
1.657952682599951544e+00
2.729770515636606998e+00
3.002491147471110899e+00
3.002491923857071310e+00
3.191379493098387865e+00
"""
        for e, eref_str in zip(gw.mo_energy_gw[0, 0, :], fc.splitlines()):
            self.assertAlmostEqual(e, float(eref_str))
Beispiel #24
0
  def test_rf0_ref(self):
    """ This is GW """
    mol = gto.M( verbose = 1, atom = '''H 0 0 0;  H 0.17 0.7 0.587''', basis = 'cc-pvdz',)
    gto_mf = scf.RHF(mol)
    gto_mf.kernel()
    gw = gw_c(mf=gto_mf, gto=mol)
    ww = [0.0+1j*4.0, 1.0+1j*0.1, -2.0-1j*0.1]

    rf0_fm = gw.rf0_cmplx_vertex_ac(ww)
    rf0_mv  = np.zeros_like(rf0_fm)
    vec = np.zeros((gw.nprod), dtype=gw.dtypeComplex)
    for iw,w in enumerate(ww):
      for mu in range(gw.nprod):
        vec[:] = 0.0; vec[mu] = 1.0
        rf0_mv[iw, mu,:] = gw.apply_rf0(vec, w)

    #print(rf0_fm.shape, rf0_mv.shape)
    #print('abs(rf0_fm-rf0_mv)', abs(rf0_fm-rf0_mv).sum()/rf0_fm.size)
    #print(abs(rf0_fm[0,:,:]-rf0_mv[0,:,:]).sum())
    #print(rf0_fm[0,:,:])
    self.assertTrue(abs(rf0_fm-rf0_mv).sum()/rf0_fm.size<1e-15)
Beispiel #25
0
 def test_mn_gw_0086(self):
     from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations
     """ Spin-resolved case GW procedure. """
     #print(__name__, dir(gto_mf_uhf))
     gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0)
     self.assertEqual(gw.nspin, 2)
Beispiel #26
0
            for i, (a, b) in enumerate(
                    zip(sigma_gw_c.T * HARTREE2EV, self.mo_occ[0].T)):
                if (i == self.nfermi[0] or i == self.nfermi[1]):
                    print('-' * 60)
                print(' %3d  %16.6f  %3d  | %13.6f  %3d' %
                      (i, a[0], b[0], a[1], b[1]))


#
# Example of reporting expectation values of mean-field calculations.
#
if __name__ == '__main__':
    import numpy as np
    from pyscf import gto, scf
    from pyscf.nao import gw as gw_c
    HARTREE2EV = 27.2114
    mol = gto.M(verbose=0,
                atom='O 0.0, 0.0, 0.622978 ; O 0.0, 0.0, -0.622978',
                basis='cc-pvdz',
                spin=2,
                charge=0)
    gto_mf = scf.UHF(mol)
    gto_mf.kernel()
    gw = gw_c(mf=gto_mf,
              gto=mol,
              verbosity=3,
              niter_max_ev=1,
              kmat_algo='sm0_sum')
    #gw.report_mf()  #prints the energy levels of mean-field components
    gw.report()  #gives G0W0 spectra
Beispiel #27
0
# Example of plotting DOS calculated by GW calculation.
#
if __name__ == '__main__':
    import numpy as np
    import matplotlib.pyplot as plt
    from pyscf import gto, scf
    from pyscf.nao import gw as gw_c

    mol = gto.M(verbose=0,
                atom='''C 0.0, 0.0, -0.611046 ; N 0.0, 0.0, 0.523753''',
                basis='cc-pvdz',
                spin=1,
                charge=0)
    gto_mf_UHF = scf.UHF(mol)
    gto_mf_UHF.kernel()
    gw = gw_c(mf=gto_mf_UHF, gto=mol, verbosity=1, niter_max_ev=20)
    omegas = np.arange(-1.0, 1.0, 0.005) + 1j * 0.01
    dos = lsoa_dos(mf=gw, zomegas=omegas)
    pdos = pdos(mf=gw, zomegas=omegas)
    data = np.zeros((pdos.shape[0] + 2, pdos.shape[1]))
    data[0, :] = omegas.real * 27.2114
    data[1, :] = dos.clip(min=0)
    data[2:, :] = pdos.clip(min=0)
    np.savetxt(
        'dos.dat',
        data.T,
        fmt='%14.6f',
        header=
        '  Energy(eV)\t     Total DOS\t    s_state\t   p_state\t  d_state')

    #plotting DOS and PDOS
Beispiel #28
0
from pyscf.nao import gw as gw_c
import os

dname = os.getcwd()
gw = gw_c(label='S2',
          cd=dname,
          verbosity=3,
          niter_max_ev=70,
          rescf=True,
          magnetization=2)
gw.kernel_gw()
gw.report()
Beispiel #29
0
 def test_mn_gw_0086(self):
   from pyscf.nao.m_fermi_dirac import fermi_dirac_occupations
   """ Spin-resolved case GW procedure. """
   #print(__name__, dir(gto_mf_uhf))
   gw = gw_c(mf=gto_mf_uhf, gto=mol, verbosity=0)
   self.assertEqual(gw.nspin, 2)
Beispiel #30
0
  def test_water_si_wgth(self):
    """ This is for initializing with SIESTA radial orbitals """
    from pyscf.nao import gw as gw_c
    from pyscf.nao import mf as mf_c
    from pyscf.nao.m_x_zip import detect_maxima
    from pyscf.nao.m_lorentzian import overlap, lorentzian, overlap_imag, overlap_real
    from pyscf.nao.m_sf2f_rf import sf2f_rf
    import numpy as np
    import os
    from numpy import arange, einsum, array, linalg, savetxt, column_stack, conj
    from scipy.integrate import simps
    dname = os.path.dirname(os.path.abspath(__file__))
    mf = gw_c(label='water', cd=dname, verbosity=0, nocc=8, nvrt=6, rescf=False, tol_ia=1e-9)
    #gw.kernel_gw()
    weps = 0.3
    wmax = 1.1*(mf.mo_energy[0,0,-1]-mf.mo_energy[0,0,0])
    ww = arange(0.0, wmax, weps/3.0)+1j*weps
    si0 = mf.si_c(ww)
    hk_inv = linalg.inv(mf.hkernel_den)
    print(__name__, si0.shape, hk_inv.shape)
    si0_dens = -einsum('wpq,pq->w', si0, hk_inv).imag
    si0_dens_re = einsum('wpq,pq->w', si0, hk_inv).real
    savetxt('w2scr_int.txt', column_stack((ww.real, si0_dens)))
    savetxt('w2scr_int_re.txt', column_stack((ww.real, si0_dens_re)))
    wwmx = list(detect_maxima(ww, si0_dens))
    print('nmax', len(wwmx))
    
    dww = ww[1].real-ww[0].real 
    # Method 1
    sf_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod))    
    for j,wmx in enumerate(wwmx): sf_si0[j] = -si0[np.argmin(abs(ww.real - wmx))].imag/np.pi

    # Method 2, using imaginary part
    sf_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod))
    for j,wmx in enumerate(wwmx):
      for i,fw in enumerate(ww.real): 
        sf_si0[j] += si0[i].imag*dww*lorentzian(fw, wmx, weps).imag

    loi = overlap_imag(wwmx, weps)
    iloi = np.linalg.inv(loi)
    sf_si0 = einsum('fg,gab->fab', iloi,sf_si0) 
    
    ## Method 3, using real part
    #re_si0 = np.zeros((len(wwmx), mf.nprod, mf.nprod))
    #for j,wmx in enumerate(wwmx):
      #for i,fw in enumerate(ww.real): 
        #re_si0[j] += si0[i].real*dww*lorentzian(fw, wmx, weps).real

    #lor = overlap_real(wwmx, weps)
    #ilor = np.linalg.inv(lor)
    #sf_si0 = einsum('fg,gab->fab', ilor,re_si0) 
    
    ivec = 0
    for i,sf in enumerate(sf_si0):
      ee,xx = np.linalg.eigh(sf)
      sf_si0[i] = 0.0;
      for e,x in zip(ee,xx.T):
        if e>0.01: 
          sf_si0[i] += np.outer(x*e, x)
          ivec += 1
    print('nvecs', ivec)

    si0_recon = sf2f_rf(ww.real, weps, wwmx, sf_si0)
    si0_dens_recon = -einsum('wpq,pq->w', si0_recon, hk_inv).imag
    si0_dens_recon_re = einsum('wpq,pq->w', si0_recon, hk_inv).real
    savetxt('w2scr_int_recon.txt', column_stack((ww.real, si0_dens_recon)))
    savetxt('w2scr_int_recon_re.txt', column_stack((ww.real, si0_dens_recon_re)))