03c20a134e8eec805128d4fd89ffa93d9b8c10f7
[physik/posic.git] / visual / visual.c
1 /*
2  * visual.c - visualization functions
3  *
4  * author: Frank Zirkelbach <frank.zirkelbach@physik.uni-augsburg.de>
5  *
6  */
7
8 #define _GNU_SOURCE
9 #include <stdio.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <fcntl.h>
13 #include <unistd.h>
14 #include <string.h>
15
16 #include "visual.h"
17 #include "../moldyn.h"
18 #include "../math/math.h"
19
20 /* the pse, only needed here */
21 static char *pse[]={
22         "*",
23         "H",
24         "He",
25         "Li",
26         "Be",
27         "B",
28         "C",
29         "N",
30         "O",
31         "F",
32         "Ne",
33         "Na",
34         "Mg",
35         "Al",
36         "Si",
37         "P",
38         "S",
39         "Cl",
40         "Ar",
41 };
42
43 int visual_init(t_visual *v,char *filebase) {
44
45         char file[128+8];
46
47         strncpy(v->fb,filebase,128);
48         memset(file,0,128+8);
49         sprintf(file,"%s.scr",v->fb);
50
51         v->fd=open(file,O_WRONLY|O_CREAT|O_TRUNC);
52         if(v->fd<0) {
53                 perror("open visual fd");
54                 return -1;
55         }
56         dprintf(v->fd,"set write on\n");
57
58         memset(&(v->dim),0,sizeof(t_3dvec));
59
60         return 0;
61 }
62
63 int visual_tini(t_visual *v) {
64
65         if(v->fd) {
66                 dprintf(v->fd,"quit\n");
67                 close(v->fd);
68         }
69
70         return 0;
71 }
72
73 int visual_atoms(t_visual *v,double time,t_atom *atom,int n) {
74
75         int i,fd;
76         char file[128+64];
77         t_3dvec dim;
78
79         dim.x=10e9*v->dim.x;
80         dim.y=10e9*v->dim.y;
81         dim.z=10e9*v->dim.z;
82
83         sprintf(file,"%s-%.15f.xyz",v->fb,time);
84         fd=open(file,O_WRONLY|O_CREAT|O_TRUNC);
85         if(fd<0) {
86                 perror("open visual save file fd");
87                 return -1;
88         }
89
90         /* script file update */
91         dprintf(v->fd,"load xyz %s\n",file);
92         dprintf(v->fd,"spacefill 270\n");
93         dprintf(v->fd,"rotate x 100\n");
94         dprintf(v->fd,"rotate y 10\n");
95         dprintf(v->fd,"set ambient 20\n");
96         dprintf(v->fd,"set specular on\n");
97         dprintf(v->fd,"label\n");
98         sprintf(file,"%s-%.15f.ppm",v->fb,time);
99         dprintf(v->fd,"write ppm %s\n",file);
100         dprintf(v->fd,"zap\n");
101
102         /* write the actual data file */
103         dprintf(fd,"%d\n",(dim.x==0)?n:n+8);
104         dprintf(fd,"atoms at time %.15f\n",time);
105         for(i=0;i<n;i++)
106                 dprintf(fd,"%s %f %f %f\n",pse[atom[i].element],
107                                            10e9*atom[i].r.x,
108                                            10e9*atom[i].r.y,
109                                            10e9*atom[i].r.z);
110         if(dim.x) {
111                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,dim.y/2,dim.z/2);
112                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,dim.y/2,dim.z/2);
113                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,-dim.y/2,dim.z/2);
114                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,dim.y/2,-dim.z/2);
115                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,-dim.y/2,dim.z/2);
116                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,-dim.y/2,-dim.z/2);
117                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,dim.y/2,-dim.z/2);
118                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,-dim.y/2,-dim.z/2);
119         }
120         close(fd);
121
122         return 0;
123 }
124