search bonds using infrastructure now, new visual atoms tool
[physik/posic.git] / visual_atoms.c
diff --git a/visual_atoms.c b/visual_atoms.c
new file mode 100644 (file)
index 0000000..9baa487
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * code visualize atoms
+ *
+ * author: frank.zirkelbach@physik.uni-augsburg.de
+ *
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+//#include <stdlib.h>
+//#include <unistd.h>
+//#include <string.h>
+//#include <sys/types.h>
+//#include <sys/stat.h>
+//#include <fcntl.h>
+
+#include "moldyn.h"
+
+int usage(char *prog) {
+
+       printf("\nusage:\n");
+       printf("  %s <file> <centre atom> <radius> [marked atom]\n\n",prog);
+
+       return -1;
+}
+
+int main(int argc,char **argv) {
+
+       t_moldyn moldyn;
+       t_atom *itom,*jtom;
+       int j;
+       int ret;
+       t_list n[27];
+       t_list *this;
+       t_linkcell *lc;
+       t_3dvec dist;
+       double d,radius;
+       int ma,ca;
+
+       if(argc<4) {
+               usage(argv[0]);
+               return -1;
+       }
+
+       ca=atoi(argv[2]);
+       radius=atof(argv[3]);
+
+       ma=-1;
+       if(argc==5)
+               ma=atoi(argv[4]);
+
+       memset(&moldyn,0,sizeof(t_moldyn));
+
+       printf("[visual atoms] reading save file ...\n");
+       ret=moldyn_read_save_file(&moldyn,argv[1]);
+       if(ret) {
+               printf("[visual atoms] exit!\n");
+               return ret;
+       }
+
+       /* link cell init */
+       moldyn.cutoff=radius;
+       link_cell_init(&moldyn,VERBOSE);
+       lc=&(moldyn.lc);
+
+       /* serach atoms */
+       itom=&(moldyn.atom[ca]);
+       link_cell_neighbour_index(&moldyn,
+                                 (itom->r.x+moldyn.dim.x/2)/lc->x,
+                                 (itom->r.y+moldyn.dim.y/2)/lc->y,
+                                 (itom->r.z+moldyn.dim.z/2)/lc->z,
+                                 n);
+
+       
+       printf("%s %f %f %f %s %f\n",
+              pse_name[itom->element],itom->r.x,itom->r.y,itom->r.z,
+              "Green",itom->ekin);
+
+       for(j=0;j<27;j++) {
+               this=&(n[j]);
+               list_reset_f(this);
+
+               if(this->start==NULL)
+                       continue;
+
+               do {
+
+                       jtom=this->current->data;
+
+                       if(jtom==itom)
+                               continue;
+
+                       v3_sub(&dist,&(itom->r),&(jtom->r));
+                       check_per_bound(&moldyn,&dist);
+                       d=v3_norm(&dist);
+
+                       if(d<=radius) {
+                               printf("%s %f %f %f %s %f\n",
+                                      pse_name[jtom->element],
+                                      jtom->r.x,jtom->r.y,jtom->r.z,
+                                      (jtom->tag==ma)?"Red":pse_col[jtom->element],
+                                      jtom->ekin);
+                       }
+
+               } while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
+       }
+
+       link_cell_shutdown(&moldyn);
+
+       moldyn_free_save_file(&moldyn);
+
+       return 0;
+}