IDM: Difference between revisions

From Wiki
Jump to navigation Jump to search
Rgarcia (talk | contribs)
mNo edit summary
Rgarcia (talk | contribs)
No edit summary
Line 3: Line 3:
= Instructions =
= Instructions =


# Generate your initial guess for the structure.
Before start, please read about the Improved Dimer Method [[http://dx.doi.org/10.1063/1.2104507]].  
  To this end, you can either pre-converge with a NEB calculation, or do it by hand.


# Be sure the metal or solid phase is frozen and the molecule is relaxed. Do a frequency calculation based on your initial guess.
1. Generate your initial guess for the structure (POSCAR). To this end, you can either pre-converge with a NEB calculation, or do it by hand.
Specify the following in your INCAR file:  
 
2. Be sure the metal or solid phase is frozen and the molecule is relaxed. Do a frequency calculation based on your initial guess. Specify the following in your INCAR file:  


  frequencies:
  frequencies:
Line 15: Line 15:
   NFREE  =  2    #  
   NFREE  =  2    #  


# Specify the following in your INCAR file:
3. Based on your POSCAR and OUTCAR of the frequencies calculation, generate in a new folder the input of the IDM with the getdimer script. For example:
 
getdimer ../freq/POSCAR ../freq/OUTCAR POSCAR
 
4. Specify the following in your INCAR file:


  improved dimer method:
  improved dimer method:
Line 29: Line 33:
   NSW    = 500    #   
   NSW    = 500    #   


# ''' '''
# ''' '''


= Script =
= Script =
Line 43: Line 40:
  $ getdimer <input:POSCAR> <input:OUTCAR> <output:POSCAR>
  $ getdimer <input:POSCAR> <input:OUTCAR> <output:POSCAR>


Example of use:
You will also need the program
~/test/dimer$ getdimer ../freq/POSCAR ../freq/OUTCAR POSCAR


''''' SCRIPT '''''
''''' SCRIPT '''''
Line 51: Line 46:
  #!/bin/bash
  #!/bin/bash
  #  
  #  
  # Generates the POSCAR of a dimer calculation
  # Generates the POSCAR of a dimer calculation from the non mass-weighted Hessian matrix
  # Rodrigo García-Muelas
  # Rodrigo García-Muelas
  # July 18th, 2014. Tarragona.
  # November 14th, 2014. Tarragona.
  #  
  #  
  # Use with VASP 5.x or higher
  # Use with VASP 5.x or higher
Line 61: Line 56:
  # $2 Path of the OUTCAR file containing the frequencies of the structure
  # $2 Path of the OUTCAR file containing the frequencies of the structure
  # $3 <OUTPUT> POSCAR file
  # $3 <OUTPUT> POSCAR file
#
#
# Indexes
# a number of line
# b number of column
# c number of lattice vector, related to a
# d number of element, related to a
#
# VECTORS
# lattice
# element
# numelem
# coordin
  #  
  #  
   
   
  # PART 0 - SECURITY CHECKS
  # PART 0 - SECURITY CHECKS
   
   
  if [ -e $3 ] ; then  
  if [ -e $3 ] ; then
  echo "Warning! $3 already exist. Overwrite? (y/Y for yes)"
  echo "Warning! $3 already exist. Overwrite? (y/Y for yes)"
  read  overwrite
  read  overwrite
  case $overwrite in  
  case $overwrite in
  y|Y|Yes|yes|YES) echo "$3 will be overwriten"          ;;
  y|Y|Yes|yes|YES) echo "$3 will be overwriten"          ;;
  *)              echo "No actions taken "    ; exit 1 ;;
  *)              echo "No actions taken "    ; exit 1 ;;
  esac
  esac
  fi  
  fi
   
   
  IBRION=`grep IBRION $2 | awk '{print $3}'`
  IBRION=`grep IBRION $2 | awk '{print $3}'`
  if [[ $IBRION -gt "8" || $IBRION -lt "5" ]] ; then  
  if [[ $IBRION -gt "8" || $IBRION -lt "5" ]] ; then
  echo "$2 is not an OUTCAR of a frequency job."
  echo "$2 is not an OUTCAR of a frequency job."
  echo "No actions taken" ; exit 1 ; fi  
  echo "No actions taken" ; exit 1 ; fi
   
   
  # PART 1 - READ POSCAR
  # PART 1 - READ POSCAR AND PREPARE INPUTS
a=0
totalelem=0
totalatom=0
while read linea ; do  ##### 1 #####
a=$(($a+1)) ; b=0 ; d=$(($a-9)) ; line[$a]=$linea ;
# echo $a; #echo $line;  if [ $a -lt 10 ] ; then  echo "${line[$a]}" ;  fi
for word in ${line[$a]} ; do  ##### 2 #####
b=$(($b+1))
#if [ $a -lt 10 ] ; then echo "previous to case a is $a" ; fi
case $a in
1) title=${line[$a]} ;;
2) scaling=$word ;;
[3-5])  c=$(($a-2)) ; lattice[$c$b]=$word ;; #; echo "coordinates $c $b $word ${lattice[$c$b]}"
6) totalelem=$(($totalelem+1)) ; element[$b]=$word ;;
7) numelem[$b]=$word ; totalatom=$(($totalatom+$word))  ;;
8) selective=${line[$a]} ;;
9) directcartesian=${line[$a]} ;;
*) coord[$d$b]=$word ;; # echo "${coord[$d$b]}" ;;
esac
#if [ $a -lt 10 ] ; then echo "word value is $word" ; fi
done ##### 2 #####
done < "$1"  ##### 1 #####
   
   
cp $1 diagonalizer_poscar.tmp
   
   
  # PART 2 - READ OUTCAR  
  # PART 2 - READ OUTCAR  
   
   
  grep -A $(($totalatom+1)) 'cm-1' OUTCAR > temp1.tmp
  grep "Degrees of freedom DOF " $2 > temp01.tmp
  tail -n $totalatom temp1.tmp | awk '{printf " %12.6f%12.6f%12.6f\n",$4,$5,$6}' > temp2.tmp
  freedom=`awk '{print $6}' temp01.tmp`
echo "$freedom" > diagonalizer_matrix.tmp
   
   
  # PART 3 - PRINT POSCAR  
  grep -A $(($freedom+2)) 'SECOND DERIVATIVES' $2 > temp02.tmp
  cut -d ' ' -f3- temp02.tmp > temp03.tmp
tail -n $freedom temp03.tmp >> diagonalizer_matrix.tmp
   
   
  touch $3
  # PART 3 - DIAGONALIZE
echo "$title " >$3
  /home/rgarcia/bin/exe/dimerdiag
echo "$scaling " >>$3
echo "${lattice[11]}  ${lattice[12]}  ${lattice[13]} " >>$3
echo "${lattice[21]}  ${lattice[22]}  ${lattice[23]} " >>$3
echo "${lattice[31]}  ${lattice[32]}  ${lattice[33]} " >>$3
echo "${element[1]}  ${element[2]}  ${element[3]}  ${element[4]}  ${element[5]}  ${element[6]}  ${element[7]}  ${element[8]}  ${element[9]}  ${element[10]}  ${element[11]}  ${element[12]}  ${element[13]}  ${element[14]}  ${element[15]}  ${element[16]}  ${element[17]}  ${element[18]}  ${element[19]}  ${element[20]} " >>$3
echo "${numelem[1]}  ${numelem[2]}  ${numelem[3]}  ${numelem[4]}  ${numelem[5]}  ${numelem[6]}  ${numelem[7]}  ${numelem[8]}  ${numelem[9]}  ${numelem[10]}  ${numelem[11]}  ${numelem[12]}  ${numelem[13]}  ${numelem[14]}  ${numelem[15]}  ${numelem[16]}  ${numelem[17]}  ${numelem[18]}  ${numelem[19]}  ${numelem[20]} " >>$3
echo "$selective " >>$3
echo "$directcartesian " >>$3
d=0 ; until [ $d -eq $(($totalatom*10)) ] ; do d=$(($d+10)) ; echo "${coord[$(($d+1))]}  ${coord[$(($d+2))]}  ${coord[$(($d+3))]}  ${coord[$(($d+4))]}  ${coord[$(($d+5))]}  ${coord[$(($d+6))]}  " >>$3 ; done
  echo " " >>$3
   
   
  # PUT AS TAIL THE COORDINATES READ FROM THE OUTCAR
  # PART 4 - CLEAN
   
  head -n 9 $1 > $3
  cat temp2.tmp >> $3
  cat   diagonalizer_taildm.tmp >> $3
  echo ""      >> $3
  mv -f  diagonalizer_output.tmp eigenvectors.dat
  rm -f temp?.tmp
  rm -fv *.tmp
 


= Alternative (old) versions =
= Alternative (old) versions =


WARNING: Some of the topics discussed by David Karhánek are outdated. For instance, it is not necessary to set NWRITE=3 for the frequency calculation:  [[IDM-IRC]] [[get-dimer-dir.sh]] [[get-irc-path.sh]] (''by David Karhanek'')
WARNING: Some of the topics discussed by David Karhánek are outdated. For instance, it is not necessary to set NWRITE=3 for the frequency calculation:  [[IDM-IRC]] [[get-dimer-dir.sh]] [[get-irc-path.sh]] (''by David Karhanek'')

Revision as of 11:58, 18 November 2014

go back to Main Page, Computational Resources, Chemistry & More, Computational Codes, VASP, Scripts for VASP

Instructions

Before start, please read about the Improved Dimer Method [[1]].

1. Generate your initial guess for the structure (POSCAR). To this end, you can either pre-converge with a NEB calculation, or do it by hand.

2. Be sure the metal or solid phase is frozen and the molecule is relaxed. Do a frequency calculation based on your initial guess. Specify the following in your INCAR file:

frequencies:
  IBRION =   5     #     
  EDIFF  =  1E-7   # 
  POTIM  =   0.010 #                  
  NFREE  =   2     # 

3. Based on your POSCAR and OUTCAR of the frequencies calculation, generate in a new folder the input of the IDM with the getdimer script. For example:

getdimer ../freq/POSCAR ../freq/OUTCAR POSCAR

4. Specify the following in your INCAR file:

improved dimer method:
  IBRION =  44     # IDM    
  EDIFFG =  -0.015 # use force criteria
  POTIM  =   0.100 #                  
  NFREE  =   2     # 
  FINDIFF=   2     # 
  DIMER_DIST=0.010 #               
  MINROT =   0.010 # 
  STEP_SIZE= 0.010 #                
  STEP_MAX=  0.100 #                
  NSW    = 500     #  


Script

Please copy the following lines in your ~/bin folder. Recommended name: getdimer.

$ getdimer <input:POSCAR> <input:OUTCAR> <output:POSCAR>

You will also need the program

SCRIPT

#!/bin/bash
# 
# Generates the POSCAR of a dimer calculation from the non mass-weighted Hessian matrix
# Rodrigo García-Muelas
# November 14th, 2014. Tarragona.
# 
# 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 -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 -d ' ' -f3- 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


Alternative (old) versions

WARNING: Some of the topics discussed by David Karhánek are outdated. For instance, it is not necessary to set NWRITE=3 for the frequency calculation: IDM-IRC get-dimer-dir.sh get-irc-path.sh (by David Karhanek)