Two bash scripts for VASP
October 20, 2008 Posted by Emre S. Tasci
It’s of great importance to have sufficient number of k-points when doing DFT calculations. The most practical (but CPU time costly) way is to check energies for different number of k-points until some kind of "convergence" is reached.
Here are the two scripts I’ve recently written for VASP to check for suitable k-point values.
The first code runs the calculation with increasing k-points (I have a cubic cell, so using same number of k-points for the 3 lattice axes).
Before running this code, make sure that the essential files (KPOINTS POSCAR POTCAR INCAR) are in the directory, also copy your KPOINTS file to a file named "KP" which has KPOINTS mesh defined as 2x2x2:
sururi@husniya Al3Li $ cat KP
Automatic
0
Gamma
2 2 2
0 0 0
The following script will then run the calculations, incrementing the number of K-Points by 1 per each axis. It will store the output (and the 4 input files) in archive files in the format k{%03d}.tar.bz2 where the value in the curly brackets is actually the number of k-points per axis. As you can easily see, it runs from k= 1x1x1 (silly but since this is tutorial) to k=13x13x13.
#!/bin/bash
# A script file to run the system for various k-points in order to find the optimal setting
# Emre S. Tasci, 20/10/2008
for (( i = 1; i <= 13; i++ ))
do
date
echo $i
# change the KPOINTS (KP is a copy of the KPOINTS with k=2:
cat KP|sed s/"2 2 2"/"$i $i $i"/ > KPOINTS
# run the vasp
vasp > vasp.out
# archive the existing files (except the archive files):
tar -cvjf $(printf "k%02d.tar.bz2" $i) $(ls |grep -v "\(.bz2\)\|\(runrunrun.sh\)\|\(KP$\)\|\(work\)")
# remove the output files:
rm $(ls *|grep -v "\(.bz2\)\|\(KPOINTS\)\|\(POSCAR\)\|\(POTCAR\)\|\(INCAR\)\|\(runrunrun.sh\)\|\(KP$\)") -f
date
echo "=================================================="
done
After it ends, you should see something like
-rw-r----- 1 sururi users 299K 2008-10-20 10:14 POTCAR
-rw-r--r-- 1 sururi users 283 2008-10-20 10:14 POSCAR
-rw-r--r-- 1 sururi users 604 2008-10-20 10:14 INCAR
-rw-r--r-- 1 sururi users 31 2008-10-20 11:06 KP
-rw-r--r-- 1 sururi users 34 2008-10-20 14:33 KPOINTS
-rw-r--r-- 1 sururi users 195K 2008-10-20 11:08 k01.tar.bz2
-rw-r--r-- 1 sururi users 196K 2008-10-20 11:08 k02.tar.bz2
-rw-r--r-- 1 sururi users 193K 2008-10-20 11:08 k03.tar.bz2
-rw-r--r-- 1 sururi users 195K 2008-10-20 11:08 k04.tar.bz2
-rw-r--r-- 1 sururi users 195K 2008-10-20 11:08 k05.tar.bz2
-rw-r--r-- 1 sururi users 197K 2008-10-20 11:09 k06.tar.bz2
-rw-r--r-- 1 sururi users 197K 2008-10-20 11:09 k07.tar.bz2
-rw-r--r-- 1 sururi users 200K 2008-10-20 11:10 k08.tar.bz2
-rw-r--r-- 1 sururi users 201K 2008-10-20 11:10 k09.tar.bz2
-rw-r--r-- 1 sururi users 205K 2008-10-20 11:11 k10.tar.bz2
-rw-r--r-- 1 sururi users 205K 2008-10-20 11:12 k11.tar.bz2
-rw-r--r-- 1 sururi users 211K 2008-10-20 11:13 k12.tar.bz2
-rw-r--r-- 1 sururi users 211K 2008-10-20 11:14 k13.tar.bz2
-rwxr--r-- 1 sururi users 732 2008-10-20 14:02 runrunrun.sh
Now, it’s time for the second script. Create a new directory (say “work”) and then type the following into a script file (don’t forget to set it as executable (or you can also always “sh
#!/bin/bash
# Script name: energy_extract_from_OUTCAR.sh
# Emre S. Tasci, 20/10/2008
# Reads the OUTCAR files from the archive files in the parent directory
# Stores the energies in corresponding ENE files.
# (Assuming filenames are given like "k05.tar.bz2")
k=00
for i in ../k*.bz2
do
kpre=$k
enepre="0.00000000"
# Extract OUTCAR
tar -xjf $i OUTCAR
# Parse file counter from filename
k=$(echo $(basename $i)|sed "s:k\([0-9]*\).*:\1:")
# write the energies calculated in this run
cat OUTCAR | grep "energy without"|awk '{print $8}' > $(printf "%s_ENE" $k)
#calculate the energy difference between this and the last run
if [ -e "$(printf "%s_ENE" $kpre)" ]
then
enepre=$(tail -n1 $(printf "%s_ENE" $kpre));
fi
enethis=$(tail -n1 $(printf "%s_ENE" $k));
# Using : awk '{ print ($1 >= 0) ? $1 : 0 - $1}' : for absolute value
echo -e $(printf "%s_ENE" $kpre) " :\t" $enepre "\t" $(printf "%s_ENE" $k) ":\t" $enethis "\t" $(echo $(awk "BEGIN { print $enepre - $enethis}") | awk '{ print ($1 >= 0) ? $1 : 0 - $1}')
rm -f OUTCAR
done;
when runned, this script will produce an output similar to the following:
sururi@husniya work $ ./energy_extract_from_OUTCAR.sh
00_ENE : 0.00000000 01_ENE : -6.63108952 6.63109
01_ENE : -6.63108952 02_ENE : -11.59096452 4.95988
02_ENE : -11.59096452 03_ENE : -12.96519853 1.37423
03_ENE : -12.96519853 04_ENE : -13.20466179 0.239463
04_ENE : -13.20466179 05_ENE : -13.26411934 0.0594576
05_ENE : -13.26411934 06_ENE : -13.26528991 0.00117057
06_ENE : -13.26528991 07_ENE : -13.40540825 0.140118
07_ENE : -13.40540825 08_ENE : -13.35505746 0.0503508
08_ENE : -13.35505746 09_ENE : -13.38130280 0.0262453
09_ENE : -13.38130280 10_ENE : -13.36356457 0.0177382
10_ENE : -13.36356457 11_ENE : -13.37065368 0.00708911
11_ENE : -13.37065368 12_ENE : -13.37249683 0.00184315
12_ENE : -13.37249683 13_ENE : -13.38342842 0.0109316
Which shows the final energies of the sequential runs as well as the difference of them. You can easily plot the energies in the gnuplot via as an example “plot “12_ENE”“. You can also plot the evolution of the energy difference with help from awk. To do this, make sure you first pipe the output of the script to a file (say “energies.txt”):
./energy_extract_from_OUTCAR.sh > energies.txt
And then, obtaining the last column via awk
cat energies.txt |awk '{print $7}' > enediff.txt
Now you can also easily plot the difference file.
Hope this scripts will be of any help.
September 29, 2014 at 2:56 pm
Dear Sir
I am VENKAT, a learner of VASP,
Actually we are submitting the jobs with a pbs script in queue policy as shown below
#! /bin/bash
#PBS -l nodes=1:ppn=12
#PBS -N WIR_S
#PBS -q short
#PBS -j oe
cd $PBS_O_WORKDIR
cat $PBS_NODEFILE > pbsnodes
mkdir /tmp/WIR_S
mkdir /tmp/WIR_S/TEMP
cp * /tmp/WIR_S/TEMP
cd /tmp/WIR_S/TEMP
count=101
mpirun -np 12 -r ssh /soft/murugan/vasp.mkl.band.x > outfile
cp pbsnodes TEMP.pbsnodes
mv OUTCAR WIR_S.outcar
tar -cjvf WIR_S.tar.bz2 *
mv *.* $PBS_O_WORKDIR
cd ..
rm -rf /tmp/WIR_S/
now how can i change/use your script to test the KPOINTS convergence
please help in this case
looking forward for your reply
Thanks in Advance