Exemple #1
0
    rank = comm.Get_rank()
    name = MPI.Get_processor_name()

    print "Hello, World! I am process %d of %d on %s." % (rank, size, name)

    HF_iter = open('ITERINFO', 'a')
    DM_iter = open('DMINFO', 'a')

    if os.path.exists("DMFT_mu.out"):
        fi = open('DMFT_mu.out', 'r')
    else:
        fi = open('DFT_mu.out', 'r')
    mu = float(fi.readline().split()[0])
    fi.close()
    if (os.path.exists('SigMdc.out')):
        SigMdc = Fileio.Read_float('SigMdc.out')
    else:
        print "SigMdc.out is missing"
        exit()
    if (os.path.exists('SigMdc_dn.out')):
        SigMdc_dn = Fileio.Read_float('SigMdc_dn.out')
    else:
        print "SigMdc_dn.out is missing"
        exit()

    if (os.path.exists('ksum.input')):
        fi = open('ksum.input', 'r')
        nspin = int(fi.readline().strip())
        ncor_orb = int(fi.readline().strip())
        norb = int(fi.readline().strip())
        n_tot = float(fi.readline().strip())
Exemple #2
0
   def Compute_HF(self,Nd_qmc,p,TB):
      """Compute Energy and Sigma"""
      nspin=p['nspin'];U=p['U'];J=p['J'];dc_type=p['dc_type'];Uprime=p['Uprime']
      self.VHF=zeros((len(self.cor_at),2*TB.max_cor_orb),dtype=float)
      self.VHF_latt=zeros((len(self.cor_at),2*TB.max_cor_orb),dtype=float)
      self.VHF_imp=zeros((len(self.cor_at),2*TB.max_cor_orb),dtype=float)
      self.VDC=zeros(len(self.cor_at),dtype=float)
      self.sig_st=[]#zeros(len(cor_at),dtype=float)
      self.EHF=0.0#zeros(len(self.cor_at),dtype=float)
      self.EHF_latt=0.0#zeros(len(self.cor_at),dtype=float)
      self.EHF_imp=0.0#zeros(len(self.cor_at),dtype=float)
      self.EDC=0.0;self.EDC_imp=0.0
      #self.EHF_cor=zeros(len(self.cor_at),dtype=float)
      self.SigMdc=zeros(TB.ncor_orb,dtype=float)
      if nspin==2: self.SigMdc_dn=zeros(TB.ncor_orb,dtype=float)
      for i,ats in enumerate(self.cor_at):
         d_orb=TB.TB_orbs[ats[0]]
         fi=open('UC'+str(i+1)+'.dat','r')
         UC=[]
         for line in fi.readlines():
            UC.append(map(float,line.split()))
         if len(UC)!=2*len(d_orb): print "The size of UC is not consistent with orb"; exit()
         UC=array(UC)+U[i]-diag(ones(2*len(d_orb))*U[i])
         if Nd_qmc==0:
            OCC=array(list((self.N_latt[i][:len(d_orb)]+self.MOM[i][:len(d_orb)])/2)+list((self.N_latt[i][:len(d_orb)]-self.MOM[i][:len(d_orb)])/2))
         else:
            OCC=array(list((self.N_imp[i][:len(d_orb)]+self.MOM_imp[i][:len(d_orb)])/2)+list((self.N_imp[i][:len(d_orb)]-self.MOM_imp[i][:len(d_orb)])/2))
         OCC_latt=array(list((self.N_latt[i][:len(d_orb)]+self.MOM[i][:len(d_orb)])/2)+list((self.N_latt[i][:len(d_orb)]-self.MOM[i][:len(d_orb)])/2))
         OCC_imp=array(list((self.N_imp[i][:len(d_orb)]+self.MOM_imp[i][:len(d_orb)])/2)+list((self.N_imp[i][:len(d_orb)]-self.MOM_imp[i][:len(d_orb)])/2))
         self.VHF[i,:2*len(d_orb)]=dot(UC,OCC)
         self.VHF_latt[i,:2*len(d_orb)]=dot(UC,OCC_latt)
         self.VHF_imp[i,:2*len(d_orb)]=dot(UC,OCC_imp)

         ###### Compute VDC #######
         if dc_type==1:
            if Nd_qmc==0:
               self.VDC[i]=Uprime[i]*(self.Nd_latt[i]-0.5)-J[i]/2*(self.Nd_latt[i]-1)
            else:
               self.VDC[i]=Uprime[i]*(self.Nd_imp[i]-0.5)-J[i]/2*(self.Nd_imp[i]-1)

         elif dc_type==2:
            if Nd_qmc==0:
               self.VDC[i]=(Uprime[i]-2*J[i])*(0.9*self.Nd_latt[i])-J[i]/2*(2*self.Nd_latt[i]/5)
            else:
               self.VDC[i]=(Uprime[i]-2*J[i])*(0.9*self.Nd_imp[i])-J[i]/2*(2*self.Nd_imp[i]/5)
         else: print "dc type is wrong!"; exit()

         self.sig_st.append([])
         for j,orbs in enumerate(self.cor_orb[i]):
            self.sig_st[i].append(0.0)
            for orb in orbs:
               idx=d_orb.index(orb)
               #for orb2 in orbs:
               #   idx2=d_orb.index(orb2)
               #   ########### This only works for one cor_orb #############
               #   self.EHF_cor[i]+=0.5*(OCC[idx]*UC[idx,idx2]*OCC[idx2]+OCC[idx]*UC[idx,idx2+5]*OCC[idx2+5]+OCC[idx+5]*UC[idx+5,idx2]*OCC[idx2]+OCC[idx+5]*UC[idx+5,idx2+5]*OCC[idx2+5])
               for orb2 in TB.TB_orbs[ats[0]]:
                  if TB.cor_idx[TB.idx[ats[0]][orb2]]==1:
                     idx2=d_orb.index(orb2)
                     self.sig_st[i][j]+=UC[idx,idx2]*OCC[idx2]+UC[idx,idx2+len(d_orb)]*OCC[idx2+len(d_orb)]
            self.sig_st[i][j]/=len(orbs)
            for orb in orbs:
               idx=d_orb.index(orb)
               if nspin==1 and Nd_qmc>1: self.VHF[i,idx]=self.Sigoo[i][j]; self.VHF[i,idx+len(d_orb)]=self.Sigoo[i][j]
               if nspin==2 and Nd_qmc>1: self.VHF[i,idx]=self.Sigoo[i][j]; self.VHF[i,idx+len(d_orb)]=self.Sigoo[i][j+len(self.cor_orb[i])]
            self.sig_st[i][j]-=self.VDC[i]
         self.EHF+=len(ats)*0.5*dot(OCC,self.VHF[i][:2*len(d_orb)])
         self.EHF_imp+=len(ats)*0.5*dot(OCC_imp,self.VHF_imp[i][:2*len(d_orb)])
         self.EHF_latt+=len(ats)*0.5*dot(OCC_latt,self.VHF_latt[i][:2*len(d_orb)])

         if dc_type==1:
            self.EDC+=len(ats)*(Uprime[i]*self.Nd_latt[i]*(self.Nd_latt[i]-1)/2.0-J[i]*self.Nd_latt[i]*(self.Nd_latt[i]-2)/4.0)
            self.EDC_imp+=len(ats)*(Uprime[i]*self.Nd_imp[i]*(self.Nd_imp[i]-1)/2.0-J[i]*self.Nd_imp[i]*(self.Nd_imp[i]-2)/4.0)
         elif dc_type==2:
            self.EDC+=self.Natom[i]*(Uprime[i]*self.Nd_latt[i]*(0.9*self.Nd_latt[i])/2-5*J[i]*self.Nd_latt[i]/2*(2*self.Nd_latt[i]/5))
            self.EDC_imp+=self.Natom[i]*(Uprime[i]*self.Nd_imp[i]*(0.9*self.Nd_imp[i])/2-5*J[i]*self.Nd_imp[i]/2*(2*self.Nd_imp[i]/5))
         else: print "This dc type is not supported!"; exit()

         for at in ats:
            for orb in TB.TB_orbs[at]:
               idx=TB.idx[at][orb]
               self.SigMdc[idx] = self.VHF[i,d_orb.index(orb)]-self.VDC[i]
         if nspin==2: 
            for at in ats:
               for orb in TB.TB_orbs[at]:
                  idx=TB.idx[at][orb]
                  self.SigMdc_dn[idx] = self.VHF[i,d_orb.index(orb)+len(d_orb)]-self.VDC[i]
      if (os.path.exists('SigMdc.out')):
         self.SigMdc_old=Fileio.Read_float('SigMdc.out')
      else: 
         self.SigMdc_old=copy.deepcopy(self.SigMdc)
      if nspin==2:
         if (os.path.exists('SigMdc_dn.out')):
            self.SigMdc_dn_old=Fileio.Read_float('SigMdc_dn.out')
         else:
            self.SigMdc_dn_old=copy.deepcopy(self.SigMdc_dn)