added fractional output (search bonds) + video{.*} feature (stdvis)
[physik/posic.git] / vasp_tools / search_bonds
1 #!/bin/bash
2
3 file=$1
4 len=$2
5 delta=$3
6 tA=$4
7 tB=$5
8
9 echo
10 echo "usage:"
11 echo "$0 <contcar file> <len> <delta> <type a> <type b>"
12 echo
13 echo "args: $@"
14 echo
15
16 scale=`sed -n 2p $1`
17
18 X1=`sed -n 3p $file | awk '{ print $1 }'`
19 X2=`sed -n 3p $file | awk '{ print $2 }'`
20 X3=`sed -n 3p $file | awk '{ print $3 }'`
21
22 Y1=`sed -n 4p $file | awk '{ print $1 }'`
23 Y2=`sed -n 4p $file | awk '{ print $2 }'`
24 Y3=`sed -n 4p $file | awk '{ print $3 }'`
25
26 Z1=`sed -n 5p $file | awk '{ print $1 }'`
27 Z2=`sed -n 5p $file | awk '{ print $2 }'`
28 Z3=`sed -n 5p $file | awk '{ print $3 }'`
29
30 export X1 X2 X3
31 export Y1 Y2 Y3
32 export Z1 Z2 Z3
33
34 nsi=`sed -n 6p $file | awk '{ print $1 }'`
35 nc=`sed -n 6p $file | awk '{ print $2 }'`
36
37 ((nt=nsi+nc))
38
39 ((offset=8))
40 ((count=1))
41
42 echo "found $nt atoms: Si = $nsi / C = $nc"
43 echo "scale: $scale"
44 echo "X: $X1 $X2 $X3"
45 echo "Y: $Y1 $Y2 $Y3"
46 echo "Z: $Z1 $Z2 $Z3"
47 echo
48
49 while [ "1" ]; do
50
51         if [ $count -le $nsi ]; then
52                 typea=S
53         else
54                 typea=C
55         fi
56
57         if [ "$tA" != "$typea" ]; then
58                 ((count+=1))
59                 [ $count -gt $nt ] && break
60                 continue
61         fi
62
63         ((line=count+offset))
64
65         temp="`sed -n ${line}p $1`"
66         xa=`echo $temp | awk '{ print $1 }'`
67         ya=`echo $temp | awk '{ print $2 }'`
68         za=`echo $temp | awk '{ print $3 }'`
69
70         ((ic=1))
71         while [ "1" ]; do
72                 ((il=ic+offset))
73                 if [ $line != $il ]; then
74                         if [ $ic -le $nsi ] ; then
75                                 typeb=S
76                         else
77                                 typeb=C
78                         fi
79                         if [ "$typeb" != "$tB" ]; then
80                                 ((ic+=1))
81                                 [ $ic -gt $nt ] && break
82                                 continue
83                         fi
84                         tmpb="`sed -n ${il}p $1`"
85                         xb=`echo $tmpb | awk '{ print $1 }'`
86                         yb=`echo $tmpb | awk '{ print $2 }'`
87                         zb=`echo $tmpb | awk '{ print $3 }'`
88
89                         echo "$xa $ya $za $xb $yb $zb $scale $len $delta" | \
90                         awk ' \
91                         BEGIN {
92                         dxt=0; dyt=0; dzt=0
93                         dx=0; dy=0; dz=0; dist=0
94                         X=0; Y=0; Z=0
95                         X1=ENVIRON["X1"]; X2=ENVIRON["X2"]; X3=ENVIRON["X3"]
96                         Y1=ENVIRON["Y1"]; Y2=ENVIRON["Y2"]; Y3=ENVIRON["Y3"]
97                         Z1=ENVIRON["Z1"]; Z2=ENVIRON["Z2"]; Z3=ENVIRON["Z3"]
98                         }       
99                         {
100                         X=sqrt(X1^2+X2^2+X3^2)
101                         Y=sqrt(Y1^2+Y2^2+Y3^2)
102                         Z=sqrt(Z1^2+Z2^2+Z3^2)
103                         dx=$1-$4
104                         dy=$2-$5
105                         dz=$3-$6
106                         if(dx>1/2)
107                                 dx-=1
108                         if(dx<-1/2)
109                                 dx+=1
110                         if(dy>1/2)
111                                 dy-=1
112                         if(dy<-1/2)
113                                 dy+=1
114                         if(dz>1/2)
115                                 dz-=1
116                         if(dz<-1/2)
117                                 dz+=1
118                         dxt=dx*X1+dy*Y1+dz*Z1
119                         dyt=dx*X2+dy*Y2+dz*Z2
120                         dzt=dx*X3+dy*Y3+dz*Z3
121                         dist=sqrt(dxt^2+dyt^2+dzt^2)
122                         dist*=$7
123                         if((dist>=($8-$9))&&(dist<=($8+$9))) {
124                                 print ""
125                                 print $1 " " $2 " " $3
126                                 print $4 " " $5 " " $6 " (" dist " - " $8 ")"
127                                 print "displace: " dx*X " " dy*Y " " dz*Z
128                         }
129                         }'
130                 fi
131
132                 ((ic+=1))
133                 [ $ic -gt $nt ] && break
134
135         done
136
137         ((count+=1))
138         [ $count -gt $nt ] && break
139
140 done
141
142 echo "done"
143