search bonds using infrastructure now, new visual atoms tool
[physik/posic.git] / visual_atoms.c
1 /*
2  * code visualize atoms
3  *
4  * author: frank.zirkelbach@physik.uni-augsburg.de
5  *
6  */
7
8 #define _GNU_SOURCE
9 #include <stdio.h>
10 //#include <stdlib.h>
11 //#include <unistd.h>
12 //#include <string.h>
13 //#include <sys/types.h>
14 //#include <sys/stat.h>
15 //#include <fcntl.h>
16
17 #include "moldyn.h"
18
19 int usage(char *prog) {
20
21         printf("\nusage:\n");
22         printf("  %s <file> <centre atom> <radius> [marked atom]\n\n",prog);
23
24         return -1;
25 }
26
27 int main(int argc,char **argv) {
28
29         t_moldyn moldyn;
30         t_atom *itom,*jtom;
31         int j;
32         int ret;
33         t_list n[27];
34         t_list *this;
35         t_linkcell *lc;
36         t_3dvec dist;
37         double d,radius;
38         int ma,ca;
39
40         if(argc<4) {
41                 usage(argv[0]);
42                 return -1;
43         }
44
45         ca=atoi(argv[2]);
46         radius=atof(argv[3]);
47
48         ma=-1;
49         if(argc==5)
50                 ma=atoi(argv[4]);
51
52         memset(&moldyn,0,sizeof(t_moldyn));
53
54         printf("[visual atoms] reading save file ...\n");
55         ret=moldyn_read_save_file(&moldyn,argv[1]);
56         if(ret) {
57                 printf("[visual atoms] exit!\n");
58                 return ret;
59         }
60
61         /* link cell init */
62         moldyn.cutoff=radius;
63         link_cell_init(&moldyn,VERBOSE);
64         lc=&(moldyn.lc);
65
66         /* serach atoms */
67         itom=&(moldyn.atom[ca]);
68         link_cell_neighbour_index(&moldyn,
69                                   (itom->r.x+moldyn.dim.x/2)/lc->x,
70                                   (itom->r.y+moldyn.dim.y/2)/lc->y,
71                                   (itom->r.z+moldyn.dim.z/2)/lc->z,
72                                   n);
73
74         
75         printf("%s %f %f %f %s %f\n",
76                pse_name[itom->element],itom->r.x,itom->r.y,itom->r.z,
77                "Green",itom->ekin);
78
79         for(j=0;j<27;j++) {
80                 this=&(n[j]);
81                 list_reset_f(this);
82
83                 if(this->start==NULL)
84                         continue;
85
86                 do {
87
88                         jtom=this->current->data;
89
90                         if(jtom==itom)
91                                 continue;
92
93                         v3_sub(&dist,&(itom->r),&(jtom->r));
94                         check_per_bound(&moldyn,&dist);
95                         d=v3_norm(&dist);
96
97                         if(d<=radius) {
98                                 printf("%s %f %f %f %s %f\n",
99                                        pse_name[jtom->element],
100                                        jtom->r.x,jtom->r.y,jtom->r.z,
101                                        (jtom->tag==ma)?"Red":pse_col[jtom->element],
102                                        jtom->ekin);
103                         }
104
105                 } while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
106         }
107
108         link_cell_shutdown(&moldyn);
109
110         moldyn_free_save_file(&moldyn);
111
112         return 0;
113 }