![](/profiles/wavemetrics/themes/wavemetrics/logo.png)
VaspUtilities
![](/sites/default/files/styles/thumbnail/public/Yuan%20Fang/profile-images/2020-11/01-1589457975-834716.jpg?itok=rYibQIgu)
Yuan Fang
#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access. function vaspbands(path1,fname1,path2,fname2,fermilevel) string path1,fname1,path2,fname2 variable fermilevel //fermilevel variable a,i,t,j,k 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 function vaspbands_mbj(path1,fname1,path2,fname2,fermilevel) string path1,fname1,path2,fname2 variable fermilevel //fermilevel variable a,i,t,j,k variable cc=120 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++) DeletePoints 0,cc, $"wave"+num2str(i) endfor DeletePoints 0,cc,kpt 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 function splitdos(path1,fname1,path2,fname2) //fname1=DOSCAR,fname2=POSCAR string path1,fname1,path2,fname2 variable a,b,i,t,j,k string str,fword,natms,nspin Open/R a path1 + ":" + fname1 FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==1) natms=fword endif if(t==3) nspin=fword endif endif i=i+1 while(t<3) for(i=0;i<4;i++) FReadLine a, str endfor printf "Number of atoms: %d\r Number of spin: %d\r" str2num(natms),str2num(nspin) Open/R b path2 + ":" + fname2 for(i=0;i<5;i++) FReadLine b, str endfor FReadLine b, str i=0 variable/g nspec=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) nspec=nspec+1 endif i=i+1 while(i<strlen(str)) make/t/n=(nspec)/o atmnam i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==nspec) variable memory=strlen(fword) string lastnm sscanf fword[0,memory-1],"%s",lastnm atmnam[t-1]=lastnm else atmnam[t-1]=cleanupname(fword,0) endif endif i=i+1 while(t<nspec) make/d/n=(nspec)/o atmnum FReadLine b, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 atmnum[t-1]=str2num(fword) endif i=i+1 while(t<nspec) close b printf "Number of species: %d\r" nspec variable temp=0 for(i=0;i<nspec;i++) temp+=atmnum[i] endfor if(str2num(natms)!=temp) printf "DOSCAR info & POSCAR does not match!\r" close a return -1 endif FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ",32) if (stringmatch(fword,"")!=1) t=t+1 if(t==1) variable/g nedos=str2num(fword) endif if(t==2) variable/g efermi=str2num(fword) endif endif i=i+1 while(t<2) for(i=0;i<nedos;i++) FReadLine a, str if(i==0) j=0 variable tl=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) tl=tl+1 endif j=j+1 while(j<strlen(str)) make/o/n=(nedos,tl)/d pdos_tot endif j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 pdos_tot[i][t-1]=str2num(fword) endif j=j+1 while(t<tl) endfor for(i=0;i<nspec;i++) for(j=0;j<atmnum[i];j++) FReadLine a, str for(k=0;k<nedos;k++) FReadLine a, str if(k==0) variable in=0 tl=0 do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) tl=tl+1 endif in=in+1 while(in<strlen(str)) make/o/n=(nedos,tl)/d tempwave endif in=0 t=0 do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) t=t+1 tempwave[k][t-1]=str2num(fword) endif in=in+1 while(t<tl) endfor duplicate/o tempwave, $"pdos_"+atmnam[i]+"_"+num2str(j+1) endfor endfor killwaves tempwave end function splitdosif(path1,fname1,path2,fname2) string path1,fname1,path2,fname2 variable a,b,i,t,j,k string str,fword,natms,nspin Open/R a path1 + ":" + fname1 FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==1) natms=fword endif if(t==3) nspin=fword endif endif i=i+1 while(t<3) for(i=0;i<4;i++) FReadLine a, str endfor printf "Number of atoms: %d\r Number of spin: %d\r" str2num(natms),str2num(nspin) Open/R b path2 + ":" + fname2 for(i=0;i<5;i++) FReadLine b, str endfor FReadLine b, str i=0 variable/g nspec=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) nspec=nspec+1 endif i=i+1 while(i<strlen(str)) make/t/n=(nspec)/o atmnam i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==nspec) variable memory=strlen(fword) string lastnm sscanf fword[0,memory-1],"%s",lastnm atmnam[t-1]=lastnm else atmnam[t-1]=cleanupname(fword,0) endif endif i=i+1 while(t<nspec) make/d/n=(nspec)/o atmnum FReadLine b, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 atmnum[t-1]=str2num(fword) endif i=i+1 while(t<nspec) close b printf "Number of species: %d\r" nspec variable temp=0 for(i=0;i<nspec;i++) temp+=atmnum[i] endfor if(str2num(natms)!=temp) printf "DOSCAR info & POSCAR does not match!\r" close a return -1 endif FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ",32) if (stringmatch(fword,"")!=1) t=t+1 if(t==1) variable/g nedos=str2num(fword) endif if(t==2) variable/g efermi=str2num(fword) endif endif i=i+1 while(t<2) for(i=0;i<nedos;i++) FReadLine a, str if(i==0) j=0 variable tl=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) tl=tl+1 endif j=j+1 while(j<strlen(str)) make/o/n=(nedos,tl)/d pdos_tot endif j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 pdos_tot[i][t-1]=str2num(fword) endif j=j+1 while(t<tl) endfor for(i=0;i<nspec;i++) for(j=0;j<atmnum[i];j++) FReadLine a, str for(k=0;k<(2*nedos);k++) FReadLine a, str if(k==0) variable in=0 tl=0 do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) tl=tl+1 endif in=in+1 while(in<strlen(str)) make/o/n=(nedos,tl)/d tempwave endif if(k==1) in=0 variable tll=0 do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) tll=tll+1 endif in=in+1 while(in<strlen(str)) redimension/n=(nedos,(tl+tll))/d tempwave endif in=0 t=0 if(mod(k,2)==0) do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) t=t+1 tempwave[(k/2)][t-1]=str2num(fword) endif in=in+1 while(t<tl) else do fword=stringfromlist(in,str," ") if (stringmatch(fword,"")!=1) t=t+1 tempwave[floor(k/2)][tl+t-1]=str2num(fword) endif in=in+1 while(t<tll) endif endfor duplicate/o tempwave, $"pdos_"+atmnam[i]+"_"+num2str(j+1) endfor endfor killwaves tempwave end function sumdos() variable i,j variable/g nspec,nedos wave atmnum wave/t atmnam for(i=0;i<nspec;i++) for(j=0;j<atmnum[i];j++) if(j==0) duplicate/o $"pdos_"+atmnam[i]+"_"+num2str(j+1),tempwave duplicate/o/r=[][0] $"pdos_"+atmnam[i]+"_"+num2str(j+1),energywave else duplicate/o $"pdos_"+atmnam[i]+"_"+num2str(j+1),tempwave2 tempwave+=tempwave2 killwaves tempwave2 endif endfor variable k for(k=0;k<nedos;k++) tempwave[k][0]=energywave[k] endfor duplicate/o tempwave $"pdos_"+atmnam[i]+"_tot" endfor killwaves tempwave,energywave end function plotdosif() variable i variable/g nspec wave/t atmnam for(i=0;i<nspec;i++) variable j for(j=0;j<65;j++) if(j==1) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" $"pdos_"+atmnam[i]+"_tot_s" endif if(j==5) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p endif if(j==9) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p_t temp_p+=temp_p_t endif if(j==13) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p_t temp_p+=temp_p_t duplicate/o temp_p,$"pdos_"+atmnam[i]+"_tot_p" killwaves temp_p_t,temp_p endif if(j==17) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d endif if(j==21) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==25) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==29) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==33) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t duplicate/o temp_d,$"pdos_"+atmnam[i]+"_tot_d" killwaves temp_d_t,temp_d endif if(j==37) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f endif if(j==41) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t endif if(j==45) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t endif if(j==49) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t endif if(j==53) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t endif if(j==57) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t endif if(j==61) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_f_t temp_f+=temp_f_t duplicate/o temp_f,$"pdos_"+atmnam[i]+"_tot_f" killwaves temp_f_t,temp_f endif endfor endfor for(i=0;i<nspec;i++) if(i==0) display $"pdos_"+atmnam[i]+"_tot_s" vs $"pdos_"+atmnam[i]+"_tot"[][0] else appendtograph $"pdos_"+atmnam[i]+"_tot_s" vs $"pdos_"+atmnam[i]+"_tot"[][0] endif appendtograph $"pdos_"+atmnam[i]+"_tot_p" vs $"pdos_"+atmnam[i]+"_tot"[][0] appendtograph $"pdos_"+atmnam[i]+"_tot_d" vs $"pdos_"+atmnam[i]+"_tot"[][0] appendtograph $"pdos_"+atmnam[i]+"_tot_f" vs $"pdos_"+atmnam[i]+"_tot"[][0] endfor end function plotdoslf() variable i variable/g nspec wave/t atmnam for(i=0;i<nspec;i++) variable j for(j=0;j<65;j++) if(j==1) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" $"pdos_"+atmnam[i]+"_tot_s" endif if(j==5) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p endif if(j==9) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p_t temp_p+=temp_p_t endif if(j==13) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_p_t temp_p+=temp_p_t duplicate/o temp_p,$"pdos_"+atmnam[i]+"_tot_p" killwaves temp_p_t,temp_p endif if(j==17) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d endif if(j==21) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==25) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==29) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t endif if(j==33) duplicate/o/r=[][j] $"pdos_"+atmnam[i]+"_tot" temp_d_t temp_d+=temp_d_t duplicate/o temp_d,$"pdos_"+atmnam[i]+"_tot_d" killwaves temp_d_t,temp_d endif endfor endfor for(i=0;i<nspec;i++) if(i==0) display $"pdos_"+atmnam[i]+"_tot_s" vs $"pdos_"+atmnam[i]+"_tot"[][0] else appendtograph $"pdos_"+atmnam[i]+"_tot_s" vs $"pdos_"+atmnam[i]+"_tot"[][0] endif appendtograph $"pdos_"+atmnam[i]+"_tot_p" vs $"pdos_"+atmnam[i]+"_tot"[][0] appendtograph $"pdos_"+atmnam[i]+"_tot_d" vs $"pdos_"+atmnam[i]+"_tot"[][0] endfor end function Findbands(numbnds,efermi) variable numbnds,efermi variable i make/o/n=(numbnds) mini,maxm for(i=0;i<numbnds;i++) loadwave/a/o/d/g/L={0,21+1030302*i,1030301,0,0} "C:\Users\Lenovo\Desktop\wannier90.bxsf" endfor for(i=0;i<numbnds;i++) wavestats $"wave"+num2str(i) mini[i]=V_min maxm[i]=V_max killwaves $"wave"+num2str(i) endfor for(i=0;i<numbnds;i++) if((efermi>mini[i])&&(efermi<maxm[i])) print i+1 endif endfor end function extract_fs(path1,fname1,path2,fname2,nstart,nend) //fname1 read;fname2 write string path1,fname1,path2,fname2 variable nstart,nend variable a,b,i,t,j,k string str,temp,fword variable nx,ny,nz Open/R a path1 + ":" + fname1 Open b path2 + ":" + fname2 for(i=0;i<14;i++) FReadLine a, str temp=str[0,strlen(str)-2] fprintf b,temp fprintf b,"\n" endfor FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==1) temp=fword[0,strlen(fword)-2] endif endif i=i+1 while(t<1) if((nend<nstart)||(str2num(temp)<nend)) fprintf b,"Wrong indices,exit...\n" close a close b return -1 endif fprintf b,"%15d\n",nend-nstart+1 FReadLine a, str temp=str[0,strlen(str)-2] fprintf b,temp fprintf b,"\n" i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==1) temp=fword[0,strlen(fword)-1] nx=str2num(temp) endif if(t==2) temp=fword[0,strlen(fword)-1] ny=str2num(temp) endif if(t==3) temp=fword[0,strlen(fword)-2] nz=str2num(temp) endif endif i=i+1 while(t<3) for(i=0;i<4;i++) FReadLine a, str temp=str[0,strlen(str)-2] fprintf b,temp fprintf b,"\n" endfor for(i=1;i<nstart;i++) for(j=0;j<(nx*ny*nz+1);j++) FReadLine a, str endfor endfor for(i=0;i<(nend-nstart+1);i++) FReadLine a, str fprintf b,"BAND:%12d\n",i+1 for(j=0;j<(nx*ny*nz);j++) FReadLine a, str temp=str[0,strlen(str)-2] fprintf b,temp fprintf b,"\n" endfor endfor fprintf b," END_BANDGRID_3D\n" fprintf b," END_BLOCK_BANDGRID_3D\n" close a close b end function vaspbands_proj(path1,fname1,atoms,orbitals) //read procar non-soc wave atoms wave orbitals string path1,fname1 variable a,i,t,j,k,u variable s variable inner,np,ccc string str,fword,nkpts,nbnds,nions Open/R a path1 + ":" + fname1 FReadLine a, str FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==4) nkpts=fword endif if(t==8) nbnds=fword endif if(t==12) nions=fword endif endif i=i+1 while(t<12) make/o/d/n=(str2num(nkpts),str2num(nbnds)) tem for(u=0;u<str2num(nkpts);u++) for(i=0;i<3;i++) FReadLine a, str endfor for(k=0;k<str2num(nbnds);k++) for(i=0;i<3;i++) FReadLine a, str endfor s=0 for(np=0;np<numpnts(atoms);np++) if(np==0) if(atoms[0]==1) FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif if(atoms[0]>1) for(inner=0;inner<(atoms[0]-1);inner++) FReadLine a, str endfor FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif else if((atoms[np]-atoms[np-1])==1) FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif if((atoms[np]-atoms[np-1])>1) for(inner=0;inner<(atoms[np]-atoms[np-1]-1);inner++) FReadLine a, str endfor FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif endif endfor if(str2num(nions)==atoms[numpnts(atoms)-1]) FReadLine a, str FReadLine a, str else for(i=0;i<(str2num(nions)-atoms[numpnts(atoms)-1]);i++) FReadLine a, str endfor FReadLine a, str FReadLine a, str endif tem[u][k]=s endfor endfor for(i=0;i<str2num(nbnds);i++) duplicate/o/r=[0,str2num(nkpts)-1][i,i] tem $"weight"+num2str(i) endfor close a end function vaspbands_projsoc(path1,fname1,atoms,orbitals) //read procar soc wave atoms wave orbitals string path1,fname1 variable a,i,t,j,k,u variable s variable inner,np,ccc string str,fword,nkpts,nbnds,nions Open/R a path1 + ":" + fname1 FReadLine a, str FReadLine a, str i=0 t=0 do fword=stringfromlist(i,str," ") if (stringmatch(fword,"")!=1) t=t+1 if(t==4) nkpts=fword endif if(t==8) nbnds=fword endif if(t==12) nions=fword endif endif i=i+1 while(t<12) make/o/d/n=(str2num(nkpts),str2num(nbnds)) tem for(u=0;u<str2num(nkpts);u++) for(i=0;i<3;i++) FReadLine a, str endfor for(k=0;k<str2num(nbnds);k++) for(i=0;i<3;i++) FReadLine a, str endfor s=0 for(np=0;np<numpnts(atoms);np++) if(np==0) if(atoms[0]==1) FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif if(atoms[0]>1) for(inner=0;inner<(atoms[0]-1);inner++) FReadLine a, str endfor FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif else if((atoms[np]-atoms[np-1])==1) FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif if((atoms[np]-atoms[np-1])>1) for(inner=0;inner<(atoms[np]-atoms[np-1]-1);inner++) FReadLine a, str endfor FReadLine a, str j=0 t=0 do fword=stringfromlist(j,str," ") if (stringmatch(fword,"")!=1) t=t+1 for(ccc=0;ccc<numpnts(orbitals);ccc++) if(t==orbitals[ccc]) s+=str2num(fword) endif endfor endif j=j+1 while(t<orbitals[numpnts(orbitals)-1]) endif endif endfor variable jjj for(jjj=0;jjj<(3*(str2num(nions)+1+1));jjj++) FReadLine a, str endfor if(str2num(nions)==atoms[numpnts(atoms)-1]) FReadLine a, str FReadLine a, str FReadLine a, str else for(i=0;i<(str2num(nions)-atoms[numpnts(atoms)-1]);i++) FReadLine a, str endfor FReadLine a, str FReadLine a, str FReadLine a, str endif tem[u][k]=s endfor endfor for(i=0;i<str2num(nbnds);i++) duplicate/o/r=[0,str2num(nkpts)-1][i,i] tem $"weight"+num2str(i) endfor close a end function projbulkbnds(m,n,p) //projected bulk bands plot.m:the number of points between two kpoints; //n:number of different kzs;p:numberof bands. variable m,n,p variable i,j,k wave kpt make/n=(2*m) refer for(i=0;i<(2*m);i++) refer[i]=kpt[i] endfor make/n=(2*m) tem1 for(i=0;i<p;i++) duplicate $"wave"+num2str(i),tem2 for(j=i;j<i+p*(n-1)+1;j=j+p) for(k=0;k<(2*m);k++) tem1[k]=tem2[k] endfor duplicate tem1,$"w"+num2str(j) if(j==0) display $"w"+num2str(j) vs refer else appendtograph $"w"+num2str(j) vs refer endif DeletePoints 0,3*m, tem2 endfor killwaves tem2 endfor killwaves tem1 end function difkzplot(nbnds,nkz,ymin,ymax,j) variable nbnds variable nkz variable ymin,ymax //display range variable j //j can take value 0-20,corresponding to kz=j/(nkz-1)*(gamma-z) variable kz=j/(nkz-1) wave xwave variable i for(i=0;i<nbnds;i++) if(i==0) display $"w"+num2str(j*nbnds) vs xwave TextBox/C/N=text0/F=0/A=MC num2str(kz)+"*G-Z" SetAxis left ymin,ymax else appendtograph $"w"+num2str(j*nbnds+i) vs xwave endif endfor end function fcc111() //for writing fcc 111 KPOINTS variable a,b,c a= 5.429 make/o/d/n=3 a1={0,a/2,a/2} make/o/d/n=3 a2={a/2,0,a/2} make/o/d/n=3 a3={a/2,a/2,0} cross a2,a3 variable vprim wave W_Cross vprim=matrixDot(a1,W_Cross) make/o/d/n=3 b1,b2,b3 b1=2*pi*W_Cross/vprim cross a3,a1 b2=2*pi*W_Cross/vprim cross a1,a2 b3=2*pi*W_Cross/vprim Concatenate/O {b1,b2,b3},primbasis make/o/d/n=3 aa1={-a/2,a/2,0} make/o/d/n=3 aa2={0,-a/2,a/2} make/o/d/n=3 aa3={a,a,a} cross aa2,aa3 variable vconv vconv=matrixDot(aa1,W_Cross) make/o/d/n=3 bb1,bb2,bb3 bb1=2*pi*W_Cross/vconv cross aa3,aa1 bb2=2*pi*W_Cross/vconv bb3=1/2*(b1+b2+b3) Concatenate/O {bb1,bb2,bb3},convbasis matrixinverse primbasis wave M_inverse matrixop/o matC=M_inverse x convbasis print vprim print vprim/vconv cross b2,b3 variable kvprim kvprim=matrixDot(b1,W_Cross) cross bb2,bb3 variable kvconv kvconv=matrixDot(bb1,W_Cross) print kvprim/kvconv end function simplecubic111() //for writing simple cubic 111 KPOINTS variable a,b,c a= 2.3537117117709037*2 make/o/d/n=3 a1={a,0,0} make/o/d/n=3 a2={0,a,0} make/o/d/n=3 a3={0,0,a} cross a2,a3 variable vprim wave W_Cross vprim=matrixDot(a1,W_Cross) make/o/d/n=3 b1,b2,b3 b1=2*pi*W_Cross/vprim cross a3,a1 b2=2*pi*W_Cross/vprim cross a1,a2 b3=2*pi*W_Cross/vprim Concatenate/O {b1,b2,b3},primbasis make/o/d/n=3 aa1={a,-a,0} make/o/d/n=3 aa2={0,a,-a} make/o/d/n=3 aa3={a,a,a} cross aa2,aa3 variable vconv vconv=matrixDot(aa1,W_Cross) make/o/d/n=3 bb1,bb2,bb3 bb1=2*pi*W_Cross/vconv cross aa3,aa1 bb2=2*pi*W_Cross/vconv bb3=1/2*(b1+b2+b3) Concatenate/O {bb1,bb2,bb3},convbasis matrixinverse primbasis wave M_inverse matrixop/o matC=M_inverse x convbasis print vprim/vconv cross b2,b3 variable kvprim kvprim=matrixDot(b1,W_Cross) cross bb2,bb3 variable kvconv kvconv=matrixDot(bb1,W_Cross) print kvprim/kvconv end function hr111() //for writing hr 111 KPOINTS variable a,c a= 3.6281/sqrt(3) c=26.233/3 make/o/d/n=3 a1={-a/2,sqrt(3)/2*a,c} make/o/d/n=3 a2={-a/2,-sqrt(3)/2*a,c} make/o/d/n=3 a3={a,0,c} cross a2,a3 variable vprim wave W_Cross vprim=matrixDot(a1,W_Cross) make/o/d/n=3 b1,b2,b3 b1=2*pi*W_Cross/vprim cross a3,a1 b2=2*pi*W_Cross/vprim cross a1,a2 b3=2*pi*W_Cross/vprim Concatenate/O {b1,b2,b3},primbasis make/o/d/n=3 aa1=a2-a3 make/o/d/n=3 aa2=a3-a1 make/o/d/n=3 aa3=a1+a2+a3 cross aa2,aa3 variable vconv wave W_cross vconv=matrixDot(aa1,W_Cross) make/o/d/n=3 bb1,bb2,bb3 bb1=2*pi*W_Cross/vconv cross aa3,aa1 bb2=2*pi*W_Cross/vconv bb3=1/2*(b1+b2+b3) Concatenate/O {bb1,bb2,bb3},convbasis matrixinverse primbasis wave M_inverse matrixop/o matC=M_inverse x convbasis print vprim print vprim/vconv cross b2,b3 variable kvprim kvprim=matrixDot(b1,W_Cross) cross bb2,bb3 variable kvconv kvconv=matrixDot(bb1,W_Cross) print kvprim/kvconv end function changecoord() //for KPOINTS coordinate transformation variable x,y,z variable m,n,l wave matC variable i variable k=0 for(i=0;i<21;i++) x=1/2;y=0;z=i/20 // M bar point m=matC[0][0]*x+matC[0][1]*y+matC[0][2]*z n=matC[1][0]*x+matC[1][1]*y+matC[1][2]*z l=matC[2][0]*x+matC[2][1]*y+matC[2][2]*z if(i==0) printf "%.12f %.12f %.12f\r" m, n, l else printf "%.12f %.12f %.12f\r" m, n, l printf "%.12f %.12f %.12f\r" m, n, l endif x=0;y=0;z=i/20 //gamma bar point m=matC[0][0]*x+matC[0][1]*y+matC[0][2]*z n=matC[1][0]*x+matC[1][1]*y+matC[1][2]*z l=matC[2][0]*x+matC[2][1]*y+matC[2][2]*z printf "%.12f %.12f %.12f\r" m, n, l printf "%.12f %.12f %.12f\r" m, n, l x=1/3;y=1/3;z=i/20 //K bar point m=matC[0][0]*x+matC[0][1]*y+matC[0][2]*z n=matC[1][0]*x+matC[1][1]*y+matC[1][2]*z l=matC[2][0]*x+matC[2][1]*y+matC[2][2]*z if(i==20) printf "%.12f %.12f %.12f\r" m, n, l else printf "%.12f %.12f %.12f\r" m, n, l printf "%.12f %.12f %.12f\r" m, n, l endif endfor end function fcc111slab(nlayer,a) //for writing fcc 111 slab POSCAR variable nlayer,a make/o/d matA={{-1/2,1/2,0},{0,-1/2,1/2},{1,1,1}} matrixinverse matA wave M_inverse make/o/d matB={{0,1/2,1/2},{1/2,0,1/2},{1/2,1/2,0}} matrixop/o matC=M_inverse x matB make/o/d/n=(3,3) Cefilm variable x,y,z,m,n,l,i for(i=0;i<3;i++) x=0;y=0;z=i m=matC[0][0]*x+matC[0][1]*y+matC[0][2]*z n=matC[1][0]*x+matC[1][1]*y+matC[1][2]*z l=matC[2][0]*x+matC[2][1]*y+matC[2][2]*z do if(m<0) m=m+1 elseif((m>1)||(m==1)) m=m-1 endif while((m<0)||(m>1)||(m==1)) do if(n<0) n=n+1 elseif((n>1)||(n==1)) n=n-1 endif while((n<0)||(n>1)||(n==1)) do if(l<0) l=l+1 elseif((l>1)||(l==1)) l=l-1 endif while((l<0)||(l>1)||(l==1)) Cefilm[i][0]=m ;Cefilm[i][1]=n ;Cefilm[i][2]=l endfor bubble(Cefilm,3) redimension/n=(nlayer,3) Cefilm for(i=3;i<nlayer;i++) Cefilm[i][0]=Cefilm[i-3][0] Cefilm[i][1]=Cefilm[i-3][1] Cefilm[i][2]=Cefilm[i-3][2]+1 endfor for(i=0;i<nlayer;i++) printf "%.12f %.12f %.12f\r",Cefilm[i][0],Cefilm[i][1], (Cefilm[i][2]*a*sqrt(3)/((Cefilm[nlayer-1][2]-Cefilm[0][2])*a*sqrt(3)+18)) endfor print "\r" printf "%.12f\r" (Cefilm[nlayer-1][2]-Cefilm[0][2])*a*sqrt(3)+18 end function bubble(w,n) wave w variable n variable i,j,k,t1,t2,t3 for(i=1;i<n;i++) k=0 for(j=0;j<(n-i);j++) if(w[j][2]>w[j+1][2]) t1=w[j][0];w[j][0]=w[j+1][0];w[j+1][0]=t1 t2=w[j][1];w[j][1]=w[j+1][1];w[j+1][1]=t2 t3=w[j][2];w[j][2]=w[j+1][2];w[j+1][2]=t3 else k++ endif endfor if(k==(n-i)) break endif endfor end function xcoordi() wave b1,b2 make/o/d/n=200 xwave variable i for(i=0;i<100;i++) xwave[i]=1/2*sqrt(b1[0]^2+b1[1]^2+b1[2]^2)/99*(i-99) endfor for(i=100;i<200;i++) xwave[i]=1/3*sqrt((b1[0]+b2[0])^2+(b1[1]+b2[1])^2+(b1[2]+b2[2])^2)/99*(i-100) endfor end
Vasp utilities written in Igor. It can be used to plot bands, projected dos, weighted bands and find bands cross the fermi level. It can also be used to write POSCAR and KPOINTS for several crystal structures.
November 3, 2020 at 05:47 am - Permalink
Would you be so kind to do two things: Package this as an Igor Pro pxp file and provide an example of the plots that it can produce.
November 3, 2020 at 09:25 am - Permalink
In reply to Would you be so kind to do… by jjweimer
I don't quite understand what is meant by "Package this as an Igor Pro pxp file". Could you explain it to me? If you want to do some plot, you can just run one of the functions, e.g. vaspbands("D","EIGENVAL","D","OUTCAR",1.2). As for the plots it can give, I can show some graphs I have done later.
November 3, 2020 at 05:45 pm - Permalink
In reply to Would you be so kind to do… by jjweimer
slab bands plot
projected bulk bands plot
dos
weighted bands read from EIGENVAL and PROCAR
Fermi surface extracted using Igor and plotted using Fermisurfer
November 3, 2020 at 06:20 pm - Permalink
In reply to I don't quite understand… by Yuan Fang
Well, it seems that some files are required which many of the forum users will not have readily available.
November 4, 2020 at 12:04 am - Permalink
In reply to Yuan Fang wrote: If you… by ChrLie
Yes. It requires output files from Vienna Ab initio Simulation Package (VASP). And for function extract_fs(), it requires output file from Wannier90.
November 4, 2020 at 12:12 am - Permalink
> I don't quite understand what is meant by "Package this as an Igor Pro pxp file".
* Open Igor Pro.
* Copy the code into the procedure window.
* Save the Igor Pro experiment (e.g. as VASP Utitlities Code.pxp).
* Post the pxp file.
The better approach for long code that does something specific such as your example is to create an Igor Pro project rather than post the raw code as forum discussion. See the brief information and longer list here. https://www.wavemetrics.com/projects
Finally, it would be helpful when the pxp project file contained sample raw data so that the functions could be run to create example plots directly. Then, it could be called VASP Utilities Demo.pxp by example.
November 4, 2020 at 06:07 am - Permalink
In reply to > I don't quite understand… by jjweimer
Thank you! I think if I create a project for this code maybe I will also need to upload some demo input files generated by VASP onto this site. Is it possible? Maybe I can do this when I have time later.
November 10, 2020 at 09:58 pm - Permalink
Here is a synopsis of the steps to make what you have posted into a project on Igor Exchange.
Create an Igor Pro experiment (pxp file) with the code. Include example data in the experiment. Make plots using the example data. Save that file as VASP Demo. Compress that file as a ZIP archive. Create a NEW PROJECT on this site. Upload the ZIP archive.
November 11, 2020 at 08:20 am - Permalink
In reply to Here is a synopsis of the… by jjweimer
I have created a new project based on your suggestion. Now the input and output of the files containing band information can be realized through a panel.
January 8, 2022 at 08:40 pm - Permalink