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())
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)