IBRION=3 bulk optimization
To choose a proper value for the POTIM in case of a IBRION=3 bulk optimization
1. You first need to perform a frequency calculation, setting in the INCAR file
frequencies: IBRION = 5 # EDIFF = 1E-7 # POTIM = 0.010 # NFREE = 2 #
PLEASE NOTE: just the degrees of freedom of the investigated bonds must be relaxed.
2. When this calculation converge, based on the POSCAR and OUTCAR of the frequencies calculation, you need to execute
getdimer POSCAR OUTCAR POSCAR
which will generate a eigenvectors.dat file, presenting the following format
Info: 0 Eigenvalues -31.491683333336404 -29.378686935390292 -14.997850470930652 -9.6057143126896563 -5.4292953596452289 -1.6881155935524064 -1.3100285123688000 -1.1825456664410310 -0.59115181564548613
3. Taken the highest eigenvalue, the proper POTIM is given, in this case, by
1/31.491683333336404*0.7=0.0222280909
where 0.7 is set as a control parameter.
Script and Executable
Instructions
1. Download the program File:Dimerdiag.tgz. Extract it and put it in your ~/bin/exe/ folder
2. Copy the script in the ~/bin folder. Recommended name: getdimer. SCRIPT
#!/bin/bash
#
# Generates the POSCAR of a dimer calculation from the non mass-weighted Hessian matrix
# Rodrigo García-Muelas
# November 14th, 2014 - Created
# March 9th, 2015 - Debugged 1 (Thanks to Marçal & Luca)
#
# Use with VASP 5.x or higher
#
# INPUT
# $1 Path of the POSCAR file containing the coordinates
# $2 Path of the OUTCAR file containing the frequencies of the structure
# $3 <OUTPUT> POSCAR file
#
# PART 0 - SECURITY CHECKS
if [ -e $3 ] ; then
echo "Warning! $3 already exist. Overwrite? (y/Y for yes)"
read overwrite
case $overwrite in
y|Y|Yes|yes|YES) echo "$3 will be overwriten" ;;
*) echo "No actions taken " ; exit 1 ;;
esac
fi
IBRION=`grep IBRION $2 | awk '{print $3}'`
if [[ $IBRION -gt "8" || $IBRION -lt "5" ]] ; then
echo "$2 is not an OUTCAR of a frequency job."
echo "No actions taken" ; exit 1 ; fi
# PART 1 - READ POSCAR AND PREPARE INPUTS
cp $1 diagonalizer_poscar.tmp
# PART 2 - READ OUTCAR
grep "Degrees of freedom DOF " $2 > temp01.tmp
freedom=`awk '{print $6}' temp01.tmp`
echo "$freedom" > diagonalizer_matrix.tmp
grep -A $(($freedom+2)) 'SECOND DERIVATIVES' $2 > temp02.tmp
cut -b 5- temp02.tmp > temp03.tmp
tail -n $freedom temp03.tmp >> diagonalizer_matrix.tmp
# PART 3 - DIAGONALIZE
/home/rgarcia/bin/exe/dimerdiag
# PART 4 - CLEAN
head -n 9 $1 > $3
cat diagonalizer_taildm.tmp >> $3
mv -f diagonalizer_output.tmp eigenvectors.dat
rm -fv *.tmp
3. Edit the script; change "rgarcia" by your username in this part:
# PART 3 - DIAGONALIZE /home/rgarcia/bin/exe/dimerdiag