ETikhonov

ORCA out parser density of states

Aug 15th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.51 KB | None | 0 0
  1. #!/bin/bash
  2. # This shell script plots electron density of states from ORCA output file into txt data usable for plotting. It should work for any single-point calculation, but do not try using it for geometry jobs (i.e. where orbital energies are printed more than once)
  3. #There are no comments in code because I'm a bit lazy to write them, sorry :-)
  4. # (c) 2013 Evgeny Tikhonov; mail: lumbrius at gmail dot com
  5.  
  6. Nel=`grep "Number of Electrons" $1 | awk '{print $6}'`
  7.  
  8. IsOdd=`echo ${Nel}%2 | bc`
  9.  
  10. if [ $IsOdd == 1 ];
  11. then
  12.  
  13. Norb=`grep "Number of basis functions" $1 | awk '{print $6}'`
  14. Norb0=`echo ${Norb}-1 | bc`
  15. Norb0_2=`echo ${Norb0}+2 | bc`
  16.  
  17. echo "function gauss(a,b,c,x){" > gauss_uks_o.awk
  18. echo "  return a*exp(-(x-b)**2/(2*c))/sqrt(3.1415926535897932*2*c)" >> gauss_uks_o.awk
  19. echo "}" >> gauss_uks_o.awk
  20. echo "{" >> gauss_uks_o.awk
  21. echo "          for (i=x0;i<=x1;i+=0.01)" >> gauss_uks_o.awk
  22. echo "                  print i\"    \"gauss(\$1,\$2,w,i)" >> gauss_uks_o.awk
  23. echo "}" >> gauss_uks_o.awk
  24.  
  25. echo "Give me threshold for electron energy in valence orbitals region [eV] (usually about -30eV is more than enough) and press [ENTER]:"
  26. read Emin
  27.  
  28. grep -A${Norb0_2} "SPIN UP ORBITALS" $1 | tail -n${Norb} | awk -v nl=${Emin} '{if (($4 >= nl) && ($2 > 0) ) print $2" "$4}' > ./$1_list_a.tmp
  29. grep -A${Norb0_2} "SPIN DOWN ORBITALS" $1 | tail -n${Norb} | awk -v nl=${Emin} '{if (($4 >= nl) && ($2 > 0) ) print $2" "$4}' > ./$1_list_b.tmp
  30.  
  31. echo "Give me gaussian broadening [eV] and press [ENTER]:"
  32. read Width
  33.  
  34. X0=`echo \(${Emin}-$Width*5\)/1-1 | bc`
  35. X1=`tail -n1 ./$1_list_a.tmp | awk '{print $2}'`
  36. X2=`tail -n1 ./$1_list_b.tmp | awk '{print $2}'`
  37. [[ `echo ${X1}\>${X2}| bc` == 1 ]] && X1=$X1 || X1=$X2
  38. X1=`echo ${X1}/1+1 | bc`
  39.  
  40. echo Occupied region start point X0=$X0
  41. echo Occupied region end point X1=$X1
  42.  
  43. awk -f gauss_uks_o.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list_a.tmp > ./$1_unsorted_a.tmp 2>/dev/null
  44. awk -f gauss_uks_o.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list_b.tmp > ./$1_unsorted_b.tmp 2>/dev/null
  45. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted_a.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.occ_a.txt
  46. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted_b.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.occ_b.txt
  47. echo "Results for occupied states (spin up) should be in file $1.occ_a.txt"
  48. echo "Results for occupied states (spin down) should be in file $1.occ_b.txt"
  49. join ./$1.occ_a.txt ./$1.occ_b.txt | awk '{print $1"    "$2+$3}' > ./$1.occ.txt
  50. echo "Results for occupied states (both spin channels) should be in file $1.occ.txt"
  51.  
  52. echo "Give me threshhold for electron energy in free orbitals region [eV] (usually about 5eV is more than enough) and press [ENTER]:"
  53. read Emax
  54.  
  55. grep -A${Norb0_2} "SPIN UP ORBITALS" $1 | tail -n${Norb} | awk -v nl=${Emax} '{if (($4 <= nl) && ( $2 < 1)) print $2" "$4}' > ./$1_list_a.tmp
  56. grep -A${Norb0_2} "SPIN DOWN ORBITALS" $1 | tail -n${Norb} | awk -v nl=${Emax} '{if (($4 <= nl) && ( $2 < 1)) print $2" "$4}' > ./$1_list_b.tmp
  57.  
  58. cp gauss_uks_o.awk gauss_uks_f.awk
  59. sed -i 's/\$1/1/g' gauss_uks_f.awk
  60.  
  61. X0=`head -n1 ./$1_list_a.tmp | awk '{print $2}'`
  62. X2=`head -n1 ./$1_list_b.tmp | awk '{print $2}'`
  63. [[ `echo ${X0}\<${X2}| bc` == 1 ]] && X0=$X0 || X0=$X2
  64. X0=`echo ${X0}/1-2 | bc`
  65. X1=`echo ${Emax}/1+1 | bc`
  66. echo Free region start point X0=$X0
  67. echo Free region end point X1=$X1
  68.  
  69. awk -f gauss_uks_f.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list_a.tmp > ./$1_unsorted_a.tmp 2>/dev/null
  70. awk -f gauss_uks_f.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list_b.tmp > ./$1_unsorted_b.tmp 2>/dev/null
  71. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted_a.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.free_a.txt
  72. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted_b.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.free_b.txt
  73. echo "Results for occupied states (spin up) should be in file $1.free_a.txt"
  74. echo "Results for occupied states (spin down) should be in file $1.free_b.txt"
  75. join ./$1.free_a.txt ./$1.free_b.txt | awk '{print $1"    "$2+$3}' > ./$1.free.txt
  76. echo "Results for occupied states should be in file $1.free.txt"
  77.  
  78. rm ./$1_list_a.tmp
  79. rm ./$1_list_b.tmp
  80. rm ./$1_unsorted_a.tmp
  81. rm ./$1_unsorted_b.tmp
  82.  
  83. else
  84. echo Even number of electrons found, going restricted Kohm-Sham mode
  85.  
  86. Norb=`grep "Number of basis functions" $1 | awk '{print $6}'`
  87. Norb0=`echo ${Norb}-1 | bc`
  88. Norb0_4=`echo ${Norb0}+4 | bc`
  89.  
  90. echo "function gauss(a,b,c,x){" > gauss_rks_o.awk
  91. echo "  return a*exp(-(x-b)**2/(2*c))/sqrt(3.1415926535897932*2*c)" >> gauss_rks_o.awk
  92. echo "}" >> gauss_rks_o.awk
  93. echo "{" >> gauss_rks_o.awk
  94. echo "      for (i=x0;i<=x1;i+=0.01)" >> gauss_rks_o.awk
  95. echo "          print i\"    \"gauss(\$1,\$2,w,i)" >> gauss_rks_o.awk
  96. echo "}" >> gauss_rks_o.awk
  97.  
  98. echo "Give me threshold for electron energy in valence orbitals region [eV] (usually about -30eV is more than enough) and press [ENTER]:"
  99. read Emin
  100.  
  101. grep -A${Norb0_4} "ORBITAL ENERGIES" $1 | tail -n${Norb} | awk -v nl=${Emin} '{if (($4 >= nl) && ($2 > 0) ) print $2" "$4}' > ./$1_list.tmp
  102.  
  103. echo "Give me gaussian broadening [eV] and press [ENTER]:"
  104. read Width
  105.  
  106. X0=`echo \(${Emin}-$Width*5\)/1-1 | bc`
  107. X1=`tail -n1 ./$1_list.tmp | awk '{print $2}'`
  108. X1=`echo ${X1}/1+1 | bc`
  109.  
  110. echo Occupied region start point X0=$X0
  111. echo Occupied region end point X1=$X1
  112.  
  113. awk -f gauss_rks_o.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list.tmp > ./$1_unsorted.tmp 2>/dev/null
  114. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.occ.txt
  115. echo "Results for occupied states should be in file $1.occ.txt"
  116.  
  117. echo "Give me threshhold for electron energy in free orbitals region [eV] (usually about 5eV is more than enough) and press [ENTER]:"
  118. read Emax
  119.  
  120. grep -A${Norb0_4} "ORBITAL ENERGIES" $1 | tail -n${Norb} | awk -v nl=${Emax} '{if (($4 <= nl) && ( $2 < 1)) print $2" "$4}' > ./$1_list.tmp
  121.  
  122. cp gauss_rks_o.awk gauss_rks_f.awk
  123. sed -i 's/\$1/2/g' gauss_rks_f.awk
  124.  
  125. X0=`head -n1 ./$1_list.tmp | awk '{print $2}'`
  126. X0=`echo ${X0}/1-2 | bc`
  127. X1=`echo ${Emax}/1+1 | bc`
  128. echo Free region start point X0=$X0
  129. echo Free region end point X1=$X1
  130.  
  131. awk -f gauss_rks_f.awk -v w=${Width} x0=${X0} x1=${X1} ./$1_list.tmp > ./$1_unsorted.tmp 2>/dev/null
  132. awk '{a[$1]+=$2}; END{for (i in a) print i"    "a[i]}' ./$1_unsorted.tmp | LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 sort -g > ./$1.free.txt
  133. echo "Results for occupied states should be in file $1.free.txt"
  134.  
  135. rm ./$1_list.tmp
  136. rm ./$1_unsorted.tmp
  137. fi
Advertisement
Add Comment
Please, Sign In to add comment