mirror feature + new std vis
[physik/posic.git] / vasp_tools / visualize
1 #!/bin/sh
2
3 #
4 # visualization script
5 # author: frank.zirkelbach@physik.uni-augsburg.de
6 #
7
8 # help function
9 draw_cyl() {
10         cat >> temp.pov <<-EOF
11 cylinder {
12 <$1, $3, $2>, <$4, $6, $5>, 0.05
13 pigment { color White }
14 }
15 EOF
16 }
17 draw_bond() {
18         cat >> temp.pov <<-EOF
19 cylinder {
20 <$1, $3, $2>, <$4, $6, $5>, $7
21 pigment { color Blue }
22 }
23 EOF
24 }
25
26 # defaults
27
28 lc=5.429
29 directory="doesnt_exist____for_sure"
30 width="640"
31 height="480"
32 radius="0.6"
33 x0="-0.6"; y0="-0.6"; z0="-0.6";
34 x1="0.6"; y1="0.6"; z1="0.6";
35 cx=""; cy=""; cz="";
36 lx="0"; ly="-100"; lz="100";
37 ortographic=""
38 bx0=""; by0=""; bz0="";
39 bx1=""; by1=""; bz1="";
40 bcr="";
41 clx="0"; cly="0"; clz="0";
42 extra=0
43 displace=""
44 mirror=0
45 mx1=0; mx2=0; mx3=0;
46 my1=0; my2=0; my3=0;
47 mz1=0; mz2=0; mz3=0;
48
49 # parse argv
50
51 while [ "$1" ]; do
52         case "$1" in
53                 -d)             directory=$2;           shift 2;;
54                 -w)             width=$2;               shift 2;;
55                 -h)             height=$2;              shift 2;;
56                 -r)             radius=$2;              shift 2;;
57                 -nll)           x0=$2; y0=$3; z0=$4;    shift 4;;
58                 -fur)           x1=$2; y1=$3; z1=$4;    shift 4;;
59                 -c)             cx=$2; cy=$3; cz=$4;    shift 4;;
60                 -L)             clx=$2; cly=$3; clz=$4; shift 4;;
61                 -l)             lx=$2; ly=$3; lz=$4;    shift 4;;
62                 -o)             ortographic=1;          shift 1;;
63                 -b)             bx0=$2; by0=$3; bz0=$4;
64                                 bx1=$5; by1=$6; bz1=$7; shift 7;;
65                 -B)             bcr=$2;                 shift 2;;
66                 -C)             lc=$2;                  shift 2;;
67                 -e)             extra=1;                shift 1;;
68                 -D)             displace=$2;            shift 2;;
69                 -m)             mx1=$2; mx2=$3; mx3=$4;
70                                 my1=$5; my2=$6; my3=$7;
71                                 mz1=$8; mz2=$9; mz3=${10};
72                                 mirror=1;               shift 10;;
73
74                 *)
75                                 echo "options:"
76                                 echo "########"
77                                 echo "directory to progress:"
78                                 echo "  -d <directory> (mandatory)"
79                                 echo "png dim:"
80                                 echo "  -w <width>"
81                                 echo "  -h <height>"
82                                 echo "atom size:"
83                                 echo "  -r <radius>"
84                                 echo "  -B <bond cylinder radius>"
85                                 echo "unit cell:"
86                                 echo "  -C <lattice constant>"
87                                 echo "  -m <dimX> <dimY> <dimZ> (mirror atoms)"
88                                 echo "visualization volume:"
89                                 echo "  -nll <x> <y> <z> (near lower left)"
90                                 echo "  -fur <x> <y> <z> (far upper right)"
91                                 echo "  -o (ortographic)"
92                                 echo "bounding box:"
93                                 echo "  -b <x0> <y0> <z0> <x1> <y1> <z1>"
94                                 echo "povray:"
95                                 echo "  -c <x> <y> <z> (camera position)"
96                                 echo "  -L <x> <y> <z> (camera look)"
97                                 echo "  -l <x> <y> <z> (light source)"
98                                 exit 1;;
99         esac
100 done
101
102 # calculation from lattic eunits to angstroms
103
104 [ "$lc" = "sic" ] && lc=4.359
105 [ "$lc" = "si" ] && lc=5.480
106 [ "$lc" = "c" ] && lc=3.566
107
108 #offset=`echo 0.125 \* $lc | bc`
109 offset=0.0
110
111 x0=`echo $x0 \* $lc + $offset | bc`
112 y0=`echo $y0 \* $lc + $offset | bc`
113 z0=`echo $z0 \* $lc + $offset | bc`
114 x1=`echo $x1 \* $lc + $offset | bc`
115 y1=`echo $y1 \* $lc + $offset | bc`
116 z1=`echo $z1 \* $lc + $offset | bc`
117
118 mx1=`echo $mx1 \* $lc + $offset | bc`
119 my1=`echo $my1 \* $lc + $offset | bc`
120 mz1=`echo $mz1 \* $lc + $offset | bc`
121 mx2=`echo $mx2 \* $lc + $offset | bc`
122 my2=`echo $my2 \* $lc + $offset | bc`
123 mz2=`echo $mz2 \* $lc + $offset | bc`
124 mx3=`echo $mx3 \* $lc + $offset | bc`
125 my3=`echo $my3 \* $lc + $offset | bc`
126 mz3=`echo $mz3 \* $lc + $offset | bc`
127
128 clx=`echo $clx \* $lc + $offset | bc`
129 cly=`echo $cly \* $lc + $offset | bc`
130 clz=`echo $clz \* $lc + $offset | bc`
131
132 if [ -n "$cx" -a -n "$cy" -a -n "$cz" ]; then
133         cx=`echo $cx \* $lc + $offset | bc`
134         cy=`echo $cy \* $lc + $offset | bc`
135         cz=`echo $cz \* $lc + $offset | bc`
136 fi
137
138 if [ -n "$bx0" ]; then
139         bx0=`echo $bx0 \* $lc + $offset | bc`
140         by0=`echo $by0 \* $lc + $offset | bc`
141         bz0=`echo $bz0 \* $lc + $offset | bc`
142         bx1=`echo $bx1 \* $lc + $offset | bc`
143         by1=`echo $by1 \* $lc + $offset | bc`
144         bz1=`echo $bz1 \* $lc + $offset | bc`
145 fi
146
147 # povray command
148
149 POVRAY="povray -W${width} -H${height} -d" 
150
151 # convert options
152
153 COPTS="-font /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"
154 COPTS="$COPTS -depth 8 -fill white -stroke blue -pointsize 24"
155
156 # do it ...
157
158 if [ -d $directory ]; then
159         filesource=$directory/atomic_conf_*.xyz
160 fi
161
162 if [ -f $directory ]; then
163         filesource=$directory
164 fi
165
166 for file in $filesource; do
167
168         cat > temp.pov <<-EOF
169 #include "colors.inc"
170 #include "textures.inc"
171 #include "shapes.inc"
172 #include "glass.inc"
173 #include "metals.inc"
174 #include "woods.inc"
175 #include "stones.inc"
176 EOF
177
178         # meta info
179         count=`grep '# \[P\]' $file | awk '{ print $3 }'`
180         time=`grep '# \[P\]' $file | awk '{ print $4 }'`
181         camloc=`grep '# \[P\]' $file | awk '{ print $5 }'`
182         [ -n "$cx" -a -n "$cy" -a -n "$cz" ] && camloc="<$cx,$cz,$cy>"
183
184         # atoms
185 #echo "-----> $x0 $y0 $z0 $x1 $y1 $z1 <-----"
186         if [ -n "$x0" ]; then
187                 export x0 y0 z0 x1 y1 z1 radius extra
188                 export mx1 mx2 mx3
189                 export my1 my2 my3
190                 export mz1 mz2 mz3
191                 export mirror
192                 cat $file | grep -v '#' | awk '\
193                 BEGIN {
194                         x0=ENVIRON["x0"]; y0=ENVIRON["y0"]; z0=ENVIRON["z0"];
195                         x1=ENVIRON["x1"]; y1=ENVIRON["y1"]; z1=ENVIRON["z1"];
196                         mx1=ENVIRON["mx1"]; my1=ENVIRON["my1"];
197                         mz1=ENVIRON["mz1"]; mx2=ENVIRON["mx2"];
198                         my2=ENVIRON["my2"]; mz2=ENVIRON["mz2"];
199                         mx3=ENVIRON["mx3"]; my3=ENVIRON["my3"];
200                         mz3=ENVIRON["mz3"]; mirror=ENVIRON["mirror"];
201                         radius=ENVIRON["radius"]; extra=ENVIRON["extra"];
202                         nx=0; ny=0; nz=0;
203                 }
204                 {
205                         if(($2>=x0)&&($3>=y0)&&($4>=z0)&&\
206                            ($2<=x1)&&($3<=y1)&&($4<=z1)) {
207                                 print "sphere { <"$2","$4","$3">, "radius" ";
208                                 if(extra)
209                 print "texture { pigment { color rgb<"$6/4.4",0,"1-$6/4.4"> } ";
210                                 else
211                 print "texture { pigment { color "$5" } ";
212                                 print "finish { phong 1 metallic } } }";
213                         }
214
215                         if(mirror) {
216
217                         nx=$2-mx1; ny=$3-mx2; nz=$4-mx3;
218                         if((nx>=x0)&&(ny>=y0)&&(nz>=z0)&&\
219                            (nx<=x1)&&(ny<=y1)&&(nz<=z1)) {
220 print "// translation: "$2/5.480" "$3/5.480" "$4/5.480" -> "nx/5.480" "ny/5.480" "nz/5.480" ...";
221                                 print "sphere { <"nx","nz","ny">, "radius" ";
222                                 if(extra)
223                 print "texture { pigment { color rgb<"$6/4.4",0,"1-$6/4.4"> } ";
224                                 else
225                 print "texture { pigment { color "$5" } ";
226                                 print "finish { phong 1 metallic } } }";
227                         }
228                         nx=$2-my1; ny=$3-my2; nz=$4-my3;
229                         if((nx>=x0)&&(ny>=y0)&&(nz>=z0)&&\
230                            (nx<=x1)&&(ny<=y1)&&(nz<=z1)) {
231                                 print "sphere { <"nx","nz","ny">, "radius" ";
232                                 if(extra)
233                 print "texture { pigment { color rgb<"$6/4.4",0,"1-$6/4.4"> } ";
234                                 else
235                 print "texture { pigment { color "$5" } ";
236                                 print "finish { phong 1 metallic } } }";
237                         }
238                         nx=$2-mz1; ny=$3-mz2; nz=$4-mz3;
239                         if((nx>=x0)&&(ny>=y0)&&(nz>=z0)&&\
240                            (nx<=x1)&&(ny<=y1)&&(nz<=z1)) {
241                                 print "sphere { <"nx","nz","ny">, "radius" ";
242                                 if(extra)
243                 print "texture { pigment { color rgb<"$6/4.4",0,"1-$6/4.4"> } ";
244                                 else
245                 print "texture { pigment { color "$5" } ";
246                                 print "finish { phong 1 metallic } } }";
247                         }
248
249                         }
250
251                 }' >> temp.pov
252         else
253                 cat $file | grep -v '#' | while read name x y z color temp; do
254                         cat >> temp.pov <<-EOF
255 sphere {
256 <$x, $z, $y>, $radius
257 texture {
258 pigment { color $color }
259 finish {
260 phong 1
261 metallic
262 }
263 }
264 }
265 EOF
266                 done
267         fi
268
269         # boundaries
270         if [ -z "$bx0" ]; then
271
272         #if [ -z "$x0" ]; then
273
274         cat $file | grep '# \[D\]' | while read foo bar x1 y1 z1 x2 y2 z2 ; do
275                 draw_cyl $x1 $y1 $z1 $x2 $y2 $z2 0.05
276         done
277
278         #else
279
280                 # manually drawing the 3x4 boundaries ...
281 #               draw_cyl $x0 $y0 $z0 $x1 $y0 $z0
282 #               draw_cyl $x0 $y0 $z0 $x0 $y1 $z0
283 #               draw_cyl $x1 $y1 $z0 $x1 $y0 $z0
284 #               draw_cyl $x0 $y1 $z0 $x1 $y1 $z0
285
286 #               draw_cyl $x0 $y0 $z1 $x1 $y0 $z1
287 #               draw_cyl $x0 $y0 $z1 $x0 $y1 $z1
288 #               draw_cyl $x1 $y1 $z1 $x1 $y0 $z1
289 #               draw_cyl $x0 $y1 $z1 $x1 $y1 $z1
290
291 #               draw_cyl $x0 $y0 $z1 $x0 $y0 $z0
292 #               draw_cyl $x0 $y1 $z1 $x0 $y1 $z0
293 #               draw_cyl $x1 $y0 $z1 $x1 $y0 $z0
294 #               draw_cyl $x1 $y1 $z1 $x1 $y1 $z0
295 #       fi
296
297         else
298
299                 # manually drawing the 3x4 boundaries specified by argv ...
300                 draw_cyl $bx0 $by0 $bz0 $bx1 $by0 $bz0
301                 draw_cyl $bx0 $by0 $bz0 $bx0 $by1 $bz0
302                 draw_cyl $bx1 $by1 $bz0 $bx1 $by0 $bz0
303                 draw_cyl $bx0 $by1 $bz0 $bx1 $by1 $bz0
304
305                 draw_cyl $bx0 $by0 $bz1 $bx1 $by0 $bz1
306                 draw_cyl $bx0 $by0 $bz1 $bx0 $by1 $bz1
307                 draw_cyl $bx1 $by1 $bz1 $bx1 $by0 $bz1
308                 draw_cyl $bx0 $by1 $bz1 $bx1 $by1 $bz1
309
310                 draw_cyl $bx0 $by0 $bz1 $bx0 $by0 $bz0
311                 draw_cyl $bx0 $by1 $bz1 $bx0 $by1 $bz0
312                 draw_cyl $bx1 $by0 $bz1 $bx1 $by0 $bz0
313                 draw_cyl $bx1 $by1 $bz1 $bx1 $by1 $bz0
314
315         fi      
316
317         # bonds
318         if [ -n "$bcr" ]; then
319
320                 if [ -z "$x0" ]; then
321
322         cat $file | grep '# \[B\]' | while read foo bar x1 y1 z1 x2 y2 z2 ; do
323                 draw_bond $x1 $z1 $y1 $x2 $z2 $y2 $bcr
324         done
325
326                 else
327
328                 export x0 y0 z0 x1 y1 z1 bcr
329                 cat $file | grep '# \[B\]' | awk '\
330                 BEGIN {
331                         x0=ENVIRON["x0"]; y0=ENVIRON["y0"]; z0=ENVIRON["z0"];
332                         x1=ENVIRON["x1"]; y1=ENVIRON["y1"]; z1=ENVIRON["z1"];
333                         bcr=ENVIRON["bcr"];
334                 }
335                 {
336                         if(($3>=x0)&&($4>=y0)&&($5>=z0)&&\
337                            ($3<=x1)&&($4<=y1)&&($5<=z1)) {
338                                 print "cylinder {";
339                                 print "<"$3","$5","$4">,";
340                                 print "<"$6","$8","$7">, "bcr;
341                                 print "pigment { color Blue }";
342                                 print "}";
343                         }
344                 }' >> temp.pov
345
346                 fi
347         fi      
348
349         # add camera and light source
350         cat >> temp.pov <<-EOF
351 camera {
352 EOF
353         if [ -n "$ortographic" ]; then  cat >> temp.pov <<-EOF
354 orthographic
355 EOF
356         fi
357         cat >> temp.pov <<-EOF
358 location $camloc
359 look_at <$clx,$clz,$clz>
360 }
361 light_source { <0,100,-100> color White shadowless }
362 EOF
363
364         # mv png
365         $POVRAY temp.pov > /dev/null 2>&1
366         time=`basename $file | awk -F. '{ print $1 }' | awk -F_ '{ print $3 }'`
367         if [ ! -z $displace ]; then
368         convert $COPTS -draw "text 5,20 'd = $displace %'" temp.png temp.png
369         else
370         convert $COPTS -draw "text 5,20 't = $time fs'" temp.png temp.png
371         fi
372         mv temp.png `echo $file | sed 's/\.xyz/\.png/'`
373
374 done
375
376 echo "done"