added harmonic potntial + bugfixes + boundings
[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 int visual_init(t_visual *v,char *filebase) {
21
22         char file[128+8];
23
24         strncpy(v->fb,filebase,128);
25         memset(file,0,128+8);
26         sprintf(file,"%s.scr",v->fb);
27
28         v->fd=open(file,O_WRONLY|O_CREAT|O_TRUNC);
29         if(v->fd<0) {
30                 perror("open visual fd");
31                 return -1;
32         }
33
34         memset(&(v->dim),0,sizeof(t_3dvec));
35
36         return 0;
37 }
38
39 int visual_tini(t_visual *v) {
40
41         if(v->fd) close(v->fd);
42
43         return 0;
44 }
45
46 int visual_atoms(t_visual *v,double time,t_atom *atom,int n) {
47
48         int i,fd;
49         char file[128+64];
50         t_3dvec dim;
51
52         dim.x=10e9*v->dim.x;
53         dim.y=10e9*v->dim.y;
54         dim.z=10e9*v->dim.z;
55
56         char pse[19][4]={
57                 "*",
58                 "H",
59                 "He",
60                 "Li",
61                 "Be",
62                 "B",
63                 "C",
64                 "N",
65                 "O",
66                 "F",
67                 "Ne",
68                 "Na",
69                 "Mg",
70                 "Al",
71                 "Si",
72                 "P",
73                 "S",
74                 "Cl",
75                 "Ar",
76         };
77
78         sprintf(file,"%s-%.15f.xyz",v->fb,time);
79         fd=open(file,O_WRONLY|O_CREAT|O_TRUNC);
80         if(fd<0) {
81                 perror("open visual save file fd");
82                 return -1;
83         }
84
85         /* script file update */
86         dprintf(v->fd,"load xyz %s\n",file);
87         dprintf(v->fd,"spacefill 300\n");
88         dprintf(v->fd,"rotate x 100\n");
89         dprintf(v->fd,"rotate y 10\n");
90         dprintf(v->fd,"set ambient 20\n");
91         dprintf(v->fd,"set specular on\n");
92         sprintf(file,"%s-%.15f.ppm",v->fb,time);
93         dprintf(v->fd,"write ppm %s\n",file);
94         dprintf(v->fd,"zap\n");
95
96         /* write the actual data file */
97         dprintf(fd,"%d\n",(dim.x==0)?n:n+8);
98         dprintf(fd,"atoms at time %.15f\n",time);
99         for(i=0;i<n;i++)
100                 dprintf(fd,"%s %f %f %f\n",pse[atom[i].element],
101                                            10e9*atom[i].r.x,
102                                            10e9*atom[i].r.y,
103                                            10e9*atom[i].r.z);
104         if(dim.x) {
105                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,dim.y/2,dim.z/2);
106                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,dim.y/2,dim.z/2);
107                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,-dim.y/2,dim.z/2);
108                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,dim.y/2,-dim.z/2);
109                 dprintf(fd,"%s %f %f %f\n",pse[0],-dim.x/2,-dim.y/2,dim.z/2);
110                 dprintf(fd,"%s %f %f %f\n",pse[0],dim.x/2,-dim.y/2,-dim.z/2);
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         }
114         close(fd);
115
116         return 0;
117 }
118