1
+ #! /bin/bash
2
+ # A utility for calculating the vibrational intensities from VASP output (OUTCAR)
3
+ # (C) David Karhanek, 2011-03-25, ICIQ Tarragona, Spain (www.iciq.es)
4
+
5
+ # extract Born effective charges tensors
6
+ printf " ..reading OUTCAR"
7
+ BORN_NROWS=` grep NIONS OUTCAR | awk ' {print $12*4+1}' `
8
+ if [ ` grep ' BORN' OUTCAR | wc -l` = 0 ] ; then \
9
+ printf " .. FAILED! Born effective charges missing! Bye! \n\n" ; exit 1 ; fi
10
+ grep " in e, cummulative" -A $BORN_NROWS OUTCAR > born.txt
11
+
12
+ # extract Eigenvectors and eigenvalues
13
+ if [ ` grep ' SQRT(mass)' OUTCAR | wc -l` != 1 ] ; then \
14
+ printf " .. FAILED! Restart VASP with NWRITE=3! Bye! \n\n" ; exit 1 ; fi
15
+ EIG_NVIBS=` grep -A 2000 ' SQRT(mass)' OUTCAR | grep ' cm-1' | wc -l`
16
+ EIG_NIONS=` grep NIONS OUTCAR | awk ' {print $12}' `
17
+ EIG_NROWS=` echo " ($EIG_NIONS +3)*$EIG_NVIBS +3" | bc`
18
+ grep -A $(( $EIG_NROWS + 2 )) ' SQRT(mass)' OUTCAR | tail -n $(( $EIG_NROWS + 1 )) | sed ' s/f\/i/fi /g' > eigenvectors.txt
19
+ printf " ..done\n"
20
+
21
+ # set up a new directory, split files - prepare for parsing
22
+ printf " ..splitting files"
23
+ mkdir intensities ; mv born.txt eigenvectors.txt intensities/
24
+ cd intensities/
25
+ let NBORN_NROWS=BORN_NROWS-1
26
+ let NEIG_NROWS=EIG_NROWS-3
27
+ let NBORN_STEP=4
28
+ let NEIG_STEP=EIG_NIONS+3
29
+ tail -n $NBORN_NROWS born.txt > temp.born.txt
30
+ tail -n $NEIG_NROWS eigenvectors.txt > temp.eige.txt
31
+ mkdir inputs ; mv born.txt eigenvectors.txt inputs/
32
+ split -a 3 -d -l $NEIG_STEP temp.eige.txt temp.ei.
33
+ split -a 3 -d -l $NBORN_STEP temp.born.txt temp.bo.
34
+ mkdir temps01 ; mv temp.born.txt temp.eige.txt temps01/
35
+ for nu in ` seq 1 $EIG_NVIBS ` ; do
36
+ let nud=nu-1 ; ei=` printf " %03u" $nu ` ; eid=` printf " %03u" $nud ` ; mv temp.ei.$eid eigens.vib.$ei
37
+ done
38
+ for s in ` seq 1 $EIG_NIONS ` ; do
39
+ let sd=s-1 ; bo=` printf " %03u" $s ` ; bod=` printf " %03u" $sd ` ; mv temp.bo.$bod borncs.$bo
40
+ done
41
+ printf " ..done\n"
42
+
43
+ # parse deviation vectors (eig)
44
+ printf " ..parsing eigenvectors"
45
+ let sad=$EIG_NIONS +1
46
+ for nu in ` seq 1 $EIG_NVIBS ` ; do
47
+ nuu=` printf " %03u" $nu `
48
+ tail -n $sad eigens.vib.$nuu | head -n $EIG_NIONS | awk ' {print $4,$5,$6}' > e.vib.$nuu .allions
49
+ split -a 3 -d -l 1 e.vib.$nuu .allions temp.e.vib.$nuu .ion.
50
+ for s in ` seq 1 $EIG_NIONS ` ; do
51
+ let sd=s-1; bo=` printf " %03u" $s ` ; bod=` printf " %03u" $sd ` ; mv temp.e.vib.$nuu .ion.$bod e.vib.$nuu .ion.$bo
52
+ done
53
+ done
54
+ printf " ..done\n"
55
+
56
+ # parse born effective charge matrices (born)
57
+ printf " ..parsing eff.charges"
58
+ for s in ` seq 1 $EIG_NIONS ` ; do
59
+ ss=` printf " %03u" $s `
60
+ awk ' {print $2,$3,$4}' borncs.$ss | tail -3 > bornch.$ss
61
+ done
62
+ mkdir temps02 ; mv eigens.* borncs.* temps02/
63
+ printf " ..done\n"
64
+
65
+ # parse matrices, multiply them and collect squares (giving intensities)
66
+ printf " ..multiplying matrices, summing "
67
+ for nu in ` seq 1 $EIG_NVIBS ` ; do
68
+ nuu=` printf " %03u" $nu `
69
+ int=0.0
70
+ for alpha in 1 2 3 ; do # summing over alpha coordinates
71
+ sumpol=0.0
72
+ for s in ` seq 1 $EIG_NIONS ` ; do # summing over atoms
73
+ ss=` printf " %03u" $s `
74
+ awk -v a=" $alpha " ' (NR==a){print}' bornch.$ss > z.ion.$ss .alpha.$alpha
75
+ # summing over beta coordinates and multiplying Z(s,alpha)*e(s) done by the following awk script
76
+ paste z.ion.$ss .alpha.$alpha e.vib.$nuu .ion.$ss | \
77
+ awk ' {pol=$1*$4+$2*$5+$3*$6; print $0," ",pol}' > matr-vib-${nuu} -alpha-${alpha} -ion-${ss}
78
+ done
79
+ sumpol=` cat matr-vib-${nuu} -alpha-${alpha} -ion-* | awk ' {sum+=$7} END {print sum}' `
80
+ int=` echo " $int +($sumpol )^2" | sed ' s/[eE]/*10^/g' | bc -l`
81
+ done
82
+ freq=` awk ' (NR==1){print $8}' temps02/eigens.vib.$nuu `
83
+ echo " $nuu $freq $int " >> exact.res.txt
84
+ printf " ."
85
+ done
86
+ printf " ..done\n"
87
+
88
+ # format results, normalize intensities
89
+ printf " ..normalizing intensities"
90
+ max=` awk ' (NR==1){max=$3} $3>=max {max=$3} END {print max}' exact.res.txt`
91
+ awk -v max=" $max " ' {printf "%03u %6.1f %5.3f\n",$1,$2,$3/max}' exact.res.txt > results.txt
92
+ printf " ..done\n"
93
+
94
+ # clean up, display results
95
+ printf " ..finalizing:\n"
96
+ mkdir temps03; mv bornch.* e.vib.* .allions temps03/
97
+ mkdir temps04; mv z.ion* e.vib.* .ion.* temps04/
98
+ mkdir temps05; mv matr-* temps05/
99
+ mkdir results; mv * res* txt results/
100
+ let NMATRIX=$EIG_NVIBS ** 2
101
+ printf " %5u atoms found\n%5u vibrations found\n%5u matrices evaluated" \
102
+ $EIG_NIONS $EIG_NVIBS $NMATRIX > results/statistics.txt
103
+ # fast switch to clean up all temporary files
104
+ rm -r temps*
105
+ cat results/results.txt
0 commit comments