Micro and Nano Mechanics Group
Revision as of 22:12, 14 February 2009 by Caiwei (Talk)

VASP: Ideal Shear Strength of Au


Contents

Input files

Here are the basic input files required for VASP calculation. Some of the files need to be changed since we need to perform a large number of calculations.

INCAR

System = fcc Au
LWAVE = .FALSE.
ENCUT  =  400
ISMEAR  = 1
SIGMA = 0.2
ISIF = 2

To increase plane wave cutoff, we manually put PREC = HIGH or PREC = Accurate. Default value is PREC = Medium

KPOINTS

43x43x43
0        0 = automatic generation of k-points
Monkhorst
43 43 43
0 0 0

POSCAR

POSCAR for FCC Au (created by tcl)
4.0615
 0.612372435696  0.000000000000 -0.353553390593
 0.408248290464  0.577350269190  0.000000000000
 0.612372435696  0.000000000000  0.353553390593
1
Cartesian  (real coordinates r)
0    0    0

You also need to put the LDA pseudopotential file as POTCAR in this directory.

Results

Perfect crystal

First, we perform a test simulation in which we relax the electrons in a gold perfect crystal.

 qsub vasp.pbs

The vasp.pbs script is listed below.

#!/bin/bash
#PBS -N Au_perf.43.E4.8
#PBS -j oe
#PBS -l nodes=1:ppn=8,walltime=24:00:00
#PBS -V

### ---------------------------------------
### BEGINNING OF EXECUTION
### ---------------------------------------

echo The master node of this job is `hostname`
echo The working directory is `echo $PBS_O_WORKDIR`
echo This job runs on the following nodes:
echo `cat $PBS_NODEFILE`

ncpu=`cat $PBS_NODEFILE | wc -w`
echo "Number of processors = $ncpu "

### end of information preamble

cd $PBS_O_WORKDIR
echo $PWD
/opt/mpiexec/bin/mpiexec --comm=pmi -np $ncpu ../../../../bin/vasp.caiwei.mva2 >& $PBS_O_WORKDIR/vasp.log

We run this test case on SU-AHPCRC. The calculation takes 160 seconds (on 8 CPUs) to finish. The ground state energy is E = -4.3951 eV.

Shear deformation

Next, we apply shear strain on (111) plane along the [1 -1 0] direction. This coresponds to γxy in our coordinate system. Due to elastic anisotropy, we need to adjust other strain components, so that the only non-zero stress component is σxy. Due to the symmetry of this problem, it turns out that we only need to adjust normal strain components.

For each applied strain γxy, we need to run a series of VASP calculations to find the strain components that relax all other stress components except σxy. After that, γxy is increased a little further and the relaxation is repeated. For each γxy, the shear stress σxy at the end of the relaxation is recorded. The ideal shear stress is the maximum recorded value for σxy.

The entire calculation is submitted by the following command.

 qsub tcl.pbs

The tcl.pbs script is listed below.

#!/bin/bash
#PBS -N Au_shear.43.E4.rlx
#PBS -j oe
#PBS -l nodes=1:ppn=8,walltime=240:00:00
#PBS -V

### ---------------------------------------
### BEGINNING OF EXECUTION
### ---------------------------------------

echo The master node of this job is `hostname`
echo The working directory is `echo $PBS_O_WORKDIR`
echo This job runs on the following nodes:
echo `cat $PBS_NODEFILE`

ncpu=`cat $PBS_NODEFILE | wc -w`
echo "Number of processors = $ncpu "

### end of information preamble

cd $PBS_O_WORKDIR

echo $PWD

/usr/bin/tclsh shear_rlx.tcl $ncpu

The shear_rlx.tcl script is listed below.

##################################### 
# definition of functions
##################################### 
proc write_POSCAR { posfile a0 ax ay az bx by bz cx cy cz } {

  #set posfile "POSCAR"
  set fileID [open $posfile w ]

  puts $fileID "POSCAR for FCC Au (created by tcl)"
  puts $fileID "$a0"
  puts $fileID [format "%15.12f %15.12f %15.12f" $ax $ay $az]
  puts $fileID [format "%15.12f %15.12f %15.12f" $bx $by $bz]
  puts $fileID [format "%15.12f %15.12f %15.12f" $cx $cy $cz]
  puts $fileID "1"
  puts $fileID "Cartesian  (real coordinates r)"
  puts $fileID "0    0    0"

  close $fileID
} 

proc read_POSCAR { posfile } {

  #set posfile "POSCAR"
  set fileID [open $posfile r ]

  # first line is comment
  gets $fileID line

  # second line is a0
  gets $fileID line
  scan $line "%f" a0

  # now comes three lines specifying the cell
  gets $fileID line
  scan $line "%f %f %f" ax ay az

  gets $fileID line
  scan $line "%f %f %f" bx by bz

  gets $fileID line
  scan $line "%f %f %f" cx cy cz

  # skip the rest of the file
  close $fileID

  # return cell geometry as a list
  return [list $a0 $ax $ay $az $bx $by $bz $cx $cy $cz]
} 

proc get_stress { } {

  set fileID [open "get_stress" w ]
  puts $fileID "grep \"in kB\" OUTCAR | sed \'s/in kB //\' "
  close $fileID
  file attributes get_stress -permissions u+x

  exec ./get_stress

}

proc run_vasp { ncpu } {

  #if { $ncpu == 1 } { 
  #    exec ./vasp
  #} else {
      set fileID [open "run_vasp" w ]
      puts $fileID "mpiexec --comm=ib -np $ncpu ../../../../bin/vasp.2008-11-15"
      close $fileID
      file attributes run_vasp -permissions u+x
      exec ./run_vasp
  #}

}

##################################### 
# beginning of main program
##################################### 

  if { $argc == 0 } {
    set ncpu 1 
  } elseif { $argc > 0 } {
    set ncpu [lindex $argv 0]
  }
  puts "ncpu = $ncpu"

  # modulus in kilobar (100 MPa)
  set C11 2020
  set C12 1690
  set C44  450

  if { 0 } {
     # compute nu, E using isotropic approximation
     set lambda $C12
     set mu [expr ($C11-$C12)/2.0 ] 
     set nu [expr $lambda / (2.0*($lambda + $mu)) ]
     # lambda = 2*mu*nu / (1-2*nu)
     set YoungsModulus [expr 2*$mu*(1+$nu) ]
     puts "mu = $nu nu = $nu  E = $YoungsModulus"
  } else {
     # directly set nu, E
     set YoungsModulus 780
     set nu 0.44
     puts "nu = $nu  E = $YoungsModulus"
  }

  set S11 [expr 1/$YoungsModulus ]
  set S12 [expr -$nu/$YoungsModulus ]

  puts "S11 = $S11 S12 = $S12"

  set factor 0.4
  set sig_tol 0.1

  set a0 4.0615
  #set a0 4.062

  set ax0 [expr sqrt(6)/4]
  set ay0 0
  set az0 [expr -sqrt(2)/4]

  set bx0 [expr sqrt(6)/6]  
  set by0 [expr sqrt(3)/3]  
  set bz0 0

  set cx0 [expr sqrt(6)/4]
  set cy0 0
  set cz0 [expr sqrt(2)/4]

  write_POSCAR "POSCAR.0" $a0 $ax0 $ay0 $az0 $bx0 $by0 $bz0 $cx0 $cy0 $cz0
  #run_vasp $ncpu

  puts "bx0 = $bx0"

  set datafile "stress_rlx.dat"
  set rlxfileID [open $datafile w ]

  set max_dx_iter  50
  set stop_dx_iter 50
  set start_dx_iter 1
  set reset_poscar  1
  set max_rlx_iter 20

  for { set dx_iter $start_dx_iter } { $dx_iter <= $stop_dx_iter } { incr dx_iter 1 } {

      # set cell dimension: bx
      set dx [expr sqrt(6)/6 * $dx_iter/$max_dx_iter]
      set bx [expr $bx0 + $dx]
      puts "dx = $dx bx = $bx"

      # set cell dimensions other than bx
     if { $dx_iter == $start_dx_iter } {
      if { $reset_poscar } {
          # initialize cell value
          set ax $ax0
          set cx $cx0
          set by $by0
          set az $az0
          set cz $cz0
          write_POSCAR "POSCAR"          $a0 $ax $ay0 $az $bx $by $bz0 $cx $cy0 $cz
          write_POSCAR "POSCAR.$dx_iter" $a0 $ax $ay0 $az $bx $by $bz0 $cx $cy0 $cz

      } else {
          # read cell value from POSCAR 
          set cell [ read_POSCAR "POSCAR" ]
          set a0 [lindex $cell 0 ]
          set ax [lindex $cell 1 ]
          set ay [lindex $cell 2 ]
          set az [lindex $cell 3 ]
          # set bx [lindex $cell 4 ]
          set by [lindex $cell 5 ]
          set bz [lindex $cell 6 ]
          set cx [lindex $cell 7 ]
          set cy [lindex $cell 8 ]
          set cz [lindex $cell 9 ]

          puts "read cell geometry:"
          puts " $a0"
          puts " $ax $ay $az"
          puts " $bx $by $bz"
          puts " $cx $cy $cz"
      }
     }

      # adjusting box to relax normal stress components to zero
      for { set rlx_iter 0 } { $rlx_iter <= $max_rlx_iter } { incr rlx_iter 1 } {

          run_vasp $ncpu

          set stress [ get_stress ]
          scan $stress "%f %f %f %f %f %f" sig_xx sig_yy sig_zz sig_xy sig_yz sig_zx

          puts $rlxfileID "$dx $rlx_iter $stress"
          flush $rlxfileID

          if { $rlx_iter < $max_rlx_iter } {

              if { 0 } {
                  # account for Poisson's effect
                  set e_xx [expr $sig_xx * $S11 + $sig_yy * $S12 + $sig_zz * $S12]
                  set e_yy [expr $sig_xx * $S12 + $sig_yy * $S11 + $sig_zz * $S12]
                  set e_zz [expr $sig_xx * $S12 + $sig_yy * $S12 + $sig_zz * $S11]

                  set bx [expr $e_yy * ($bx0+$dx) * $factor + $bx ]
              } else {
                  # do not account for Poisson's effect
                  set e_xx [expr $sig_xx / $C11 ]
                  set e_yy [expr $sig_yy / $C11 ]
                  set e_zz [expr $sig_zz / $C11 ]
              }

              puts "sig_xx = $sig_xx  sig_yy = $sig_yy  sig_zz = $sig_zz"
              puts "e_xx = $e_xx  e_yy = $e_yy  e_zz = $e_zz"

              set ax [expr $e_xx * $ax0 * $factor + $ax ]
              set cx [expr $e_xx * $cx0 * $factor + $cx ]
              set by [expr $e_yy * $by0 * $factor + $by ]
              set az [expr $e_zz * $az0 * $factor + $az ]
              set cz [expr $e_zz * $cz0 * $factor + $cz ]

              write_POSCAR "POSCAR" $a0 $ax $ay0 $az $bx $by $bz0 $cx $cy0 $cz
              write_POSCAR "POSCAR.$dx_iter.[expr $rlx_iter+1]" $a0 $ax $ay0 $az $bx $by $bz0 $cx $cy0 $cz
          }
      }
  }  
  close $rlxfileID

# End of program

The TCL script uses the run_vasp script, which is listed below.

/opt/mpiexec/bin/mpiexec --comm=pmi -np 8 ../../../../bin/vasp.caiwei.mva2