make VASP bands using EIGENVAL and OUTCAR

#pragma TextEncoding = "UTF-8"
#pragma rtGlobals=3		// Use modern global access method and strict wave access.
function bandplot(path1,fname1,path2,fname2) //normal bands plot
    string path1,fname1,path2,fname2
    variable a,i,t,j,k
    variable fermilevel=7.0772  //fermilevel
    string str,fword,nkpts,nbnds
    Open/R a path1 + ":" + fname1
    for(i=0;i<5;i++)
	     FReadLine a, str
	 endfor
	 FReadLine a, str
	 i=0
	 t=0
	 do
	     fword=stringfromlist(i,str," ")
	     if (stringmatch(fword,"")!=1)
	        t=t+1
	        if(t==2)
	            nkpts=fword
	        endif
	        if(t==3)
	            nbnds=fword
	        endif
	     endif 
	     i=i+1
	 while(t<3)
	 make/d/n=(str2num(nkpts),str2num(nbnds)) w
	 for(i=0;i<str2num(nkpts);i++)
	     FReadLine a, str
	     FReadLine a, str
	     for(j=0;j<str2num(nbnds);j++)
	         FReadLine a, str
	          k=0
	          t=0
	          do
	              fword=stringfromlist(k,str," ")
	              if (stringmatch(fword,"")!=1)
	                  t=t+1
	                  if(t==2)
	                      w[i][j]=str2num(fword)
	                  endif
	              endif 
	              k=k+1
	          while(t<2)
	     endfor
	 endfor
	 for(i=0;i<str2num(nbnds);i++)
	     make/d/n=(str2num(nkpts)) tmp
	     tmp=w[p][i]-fermilevel
	     duplicate tmp $"wave"+num2str(i)
	     killwaves tmp
	 endfor
	 killwaves w
	 close a
	 Open/R a path2 + ":" + fname2
	 make/d/n=3 kold,knew
	 make/d/n=(str2num(nkpts)) kpt
	 do
	     FReadLine a, str
	     if(strlen(str)==0)
	         break
	     endif
	     if(stringmatch(str,"*k-points in units of 2pi/SCALE*")==1)
	         FReadLine a, str
	         i=0
	         t=0
	         do
	             fword=stringfromlist(i,str," ")
	             if (stringmatch(fword,"")!=1)
	                 t=t+1
	                 if(t==1)
	                     kold[0]=str2num(fword)
	                 elseif(t==2)
	                     kold[1]=str2num(fword)
	                 elseif(t==3)
	                     kold[2]=str2num(fword)
	                 endif 
	             endif
	             i=i+1
	         while(t<3)
	         kpt[0]=0
	         for(i=1;i<str2num(nkpts);i++)
	             FReadLine a, str
	             k=0
	             t=0
	             do
	                 fword=stringfromlist(k,str," ")
	                 if (stringmatch(fword,"")!=1)
	                     t=t+1
	                     if(t==1)
	                         knew[0]=str2num(fword)
	                     elseif(t==2)
	                         knew[1]=str2num(fword)
	                     elseif(t==3)
	                         knew[2]=str2num(fword)
	                     endif
	                 endif 
	                 k=k+1
	             while(t<3)
	             if(mod(i,100)==0)
	                 kpt[i]=kpt[i-1]
	             else
	                 kpt[i]=kpt[i-1]+sqrt((knew[0]-kold[0])^2+(knew[1]-kold[1])^2+(knew[2]-kold[2])^2)
	             endif
	             kold=knew
	         endfor
	     endif
	 while(1)
	 killwaves kold,knew
	 close a
	 for(i=0;i<str2num(nbnds);i++)
	     if(i==0)
	         display $"wave"+num2str(i) vs kpt
	     else
	         appendtograph $"wave"+num2str(i) vs kpt
	     endif
	 endfor
end

 

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More