more updates
authorhackbard <hackbard>
Tue, 21 Nov 2006 17:35:39 +0000 (17:35 +0000)
committerhackbard <hackbard>
Tue, 21 Nov 2006 17:35:39 +0000 (17:35 +0000)
moldyn.c
moldyn.h

index f92ce55..57f76c4 100644 (file)
--- a/moldyn.c
+++ b/moldyn.c
@@ -58,6 +58,7 @@ int moldyn_parse_argv(t_moldyn *moldyn,int argc,char **argv) {
        int i;
        t_ho_params hop;
        t_lj_params ljp;
+       t_tersoff_params tp;
        double s,e;
 
        memset(moldyn,0,sizeof(t_moldyn));
@@ -81,10 +82,6 @@ int moldyn_parse_argv(t_moldyn *moldyn,int argc,char **argv) {
                                        moldyn->mwrite=atoi(argv[++i]);
                                        strncpy(moldyn->mfb,argv[++i],64);
                                        break;
-                               case 'D':
-                                       moldyn->dwrite=atoi(argv[++i]);
-                                       strncpy(moldyn->dfb,argv[++i],64);
-                                       break;
                                case 'S':
                                        moldyn->swrite=atoi(argv[++i]);
                                        strncpy(moldyn->sfb,argv[++i],64);
@@ -187,16 +184,6 @@ int moldyn_log_init(t_moldyn *moldyn) {
        if(moldyn->swrite)
                moldyn->lvstat|=MOLDYN_LVSTAT_SAVE;
 
-       if(moldyn->dwrite) {
-               moldyn->dfd=open(moldyn->dfb,O_WRONLY|O_CREAT|O_TRUNC);
-                if(moldyn->dfd<0) {
-                       perror("[moldyn] dfd open");
-                       return moldyn->dfd;
-               }
-               write(moldyn->dfd,moldyn,sizeof(t_moldyn));
-               moldyn->lvstat|=MOLDYN_LVSTAT_DUMP;
-       }
-
        if((moldyn->vwrite)&&(vis)) {
                moldyn->visual=vis;
                visual_init(vis,moldyn->vfb);
@@ -544,6 +531,9 @@ int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,t_list *cell) {
                }
        }
 
+       lc->dnlc=count2;
+       lc->countn=27;
+
        return count2;
 }
 
@@ -632,14 +622,9 @@ int moldyn_integrate(t_moldyn *moldyn) {
                                        write(fd,moldyn->atom,
                                              moldyn->count*sizeof(t_atom));
                                }
+                               close(fd);
                        }       
                }
-               if(d) {
-                       if(!(i%d))
-                               write(moldyn->dfd,moldyn->atom,
-                                     moldyn->count*sizeof(t_atom));
-
-               }
                if(v) {
                        if(!(i%v)) {
                                visual_atoms(moldyn->visual,i*moldyn->tau,
@@ -687,7 +672,8 @@ printf("done\n");
 
        /* forces depending on chosen potential */
 printf("calc potential/force ...\n");
-       moldyn->potential_force_function(moldyn);
+       potential_force_calc(moldyn);
+       //moldyn->potential_force_function(moldyn);
 printf("done\n");
 
        for(i=0;i<count;i++) {
@@ -706,6 +692,100 @@ printf("done\n");
  * 
  */
 
+/* generic potential and force calculation */
+
+#define                CREATE_CELL_LIST(nb_list) \
+       link_cell_neighbour_index(moldyn,\
+                                 (atom[i].r.x+moldyn->dim.x/2)/lc->x,\
+                                 (atom[i].r.y+moldyn->dim.y/2)/lc->y,\
+                                 (atom[i].r.z+moldyn->dim.z/2)/lc->z,\
+                                 nb_list);
+
+
+int potential_force_calc(t_moldyn *moldyn) {
+
+       int i,count;
+       t_atom *atom;
+       t_linkcell *lc;
+       t_list neighbour[27];
+       t_list *this;
+       double u;
+
+       count=moldyn->count;
+       atom=moldyn->atom;
+       lc=&(moldyn->lc);
+
+       /* reset energy */
+       u=0.0;
+
+       for(i=0;i<count;i++) {
+       
+               /* reset force */
+               v3_zero(&(atom[i].f));
+
+               /* single particle potential/force */
+               if(moldyn->status&MOLDYN_STAT_1BP)
+                       moldyn->pf_func1b(moldyn,&(atom[i]));
+
+               /* 2 body pair potential/force */
+               if(moldyn->status&MOLDYN_STAT_2BP) {
+               
+                       CREATE_CELL_LIST(neighbour);
+
+                       /*
+                        * processing cell of atom i
+                        * => no need to check for empty list
+                        *    (1 element at minimum)
+                        */
+
+                       this=&(neighbour[0]);
+                       list_reset(this);
+                       do {
+                               btom=this->current->data;
+                               if(btom!=&(atom[i]))
+                                       moldyn->pf_func2b(moldyn,
+                                                         &(atom[i]),btom);
+                       } while(list_next(this)!=L_NO_NEXT_ELEMENT);
+
+                       /*
+                        * direct neighbour cells
+                        * => no boundary condition check necessary
+                        */
+                       for(j=0;j<lc->dnlc;j++) {
+                               this=&(neighbour[j]);
+                               list_reset(this);
+                               if(this->start!=NULL) {
+                                       do {
+                                               btom=this->current->data;
+                                               moldyn->pf_func2b(moldyn,
+                                                                 &(atom[i]),
+                                                                 btom);
+                                       } while(list_next(this)!=\
+                                               L_NO_NEXT_ELEMENT);
+                       }
+
+                       /*
+                        * neighbour cells due to periodic bc
+                        * => check boundary conditions
+                        */
+                       for(j=lc->dnlc;j<lc->countn;j++) {
+                               this=&(neighbour[j]);
+                               list_reset(this);
+                               if(this->start!=NULL) {
+                                       do {
+                                               btom=this->current->data;
+                                               moldyn->pf_func2b(moldyn,
+                                                                 &(atom[i]),
+                                                                 btom);
+
+                       }
+
+               }
+
+       return 0;
+}
+
+
 /* harmonic oscillator potential and force */
 
 int harmonic_oscillator(t_moldyn *moldyn) {
index c6712ba..717388a 100644 (file)
--- a/moldyn.h
+++ b/moldyn.h
@@ -39,60 +39,73 @@ typedef struct s_linkcell {
        double x,y,z;           /* the actual cell lengthes */
        t_list *subcell;        /* pointer to the cell lists */
        int dnlc;               /* direct neighbour lists counter */
+       int countn;             /* amount of neighbours */
 } t_linkcell;
 
 #include "visual/visual.h"
 
-# moldyn properties structure */
+# moldyn structure */
 
 typedef struct s_moldyn {
 
        int count;              /* total amount of atoms */
        t_atom *atom;           /* pointer to the atoms */
+
        t_3dvec dim;            /* dimensions of the simulation volume */
-       /* potential, force & parameters */
 
-       /* potential force funtion created by the user */
-       int (*potential_force_function)(struct s_moldyn *moldyn);
+       /* potential force function pointer and parameters */
+       int (*pf_func1b)(struct s_moldyn *,t_atom *);
+       int (*pf_func2b)(struct s_moldyn *,t_atom *,t_atom *);
+       int (*pf_func3b)(struct s_moldyn *,t_atom *,t_atom *,t_atom *);
+       //int (*potential_force_function)(struct s_moldyn *moldyn);
        void *pot_params;       /* parameters describing the potential */ 
 
-       double cutoff;
-       double cutoff_square;
-       /* linked list / cell method */
-       t_linkcell lc;
-       /* temperature */
-       double t;
-       /* integration of newtons equations */
+       double cutoff;          /* cutoff radius */
+       double cutoff_square;   /* square of the cutoff radius */
+
+       t_linkcell lc;          /* linked cell method */
+
+       double t;               /* temperature */
+
+       /* integration function pointer */
        int (*integrate)(struct s_moldyn *moldyn);
-       int time_steps;
-       double tau;
-       double tau_square;
-       /* energy */
-       double energy;
-       /* logging & visualization */
-       t_visual vis;
-       unsigned char lvstat;
-       unsigned int ewrite;
-       char efb[64];
-       int efd;
-       unsigned int mwrite;
-       char mfb[64];
-       int mfd;
-       unsigned int swrite;
-       char sfb[64];
-       int sfd;
-       unsigned int dwrite;
-       char dfb[64];
-       int dfd;
-       unsigned int vwrite;
-       char vfb[64];
-       void *visual;
-       /* moldyn general status */
-       unsigned char status;
-       /* random */
-       t_random random;
+       int time_steps;         /* amount of iterations */
+       double tau;             /* delta t */
+       double tau_square;      /* delta t squared */
+
+       double energy;          /* energy */
+
+       t_visual vis;           /* visualization/log/save interface structure */
+       unsigned char lvstat;   /* log & vis properties */
+       unsigned int ewrite;    /* how often to log energy */
+       char efb[64];           /* energy log filename */
+       int efd;                /* fd for energy log */
+       unsigned int mwrite;    /* how often to log momentum */
+       char mfb[64];           /* momentum log filename */
+       int mfd;                /* fd for momentum log */
+       unsigned int vwrite;    /* how often to visualize atom information */
+       char vfb[64];           /* visualization file name base */
+       void *visual;           /* pointer (hack!) */
+       unsigned int swrite;    /* how often to create a save file */
+
+       unsigned char status;   /* general moldyn properties */
+
+       t_random random;        /* random interface */
 } t_moldyn;
 
+#define MOLDYN_LVSTAT_TOTAL_E          0x01
+#define MOLDYN_LVSTAT_TOTAL_M          0x02
+#define MOLDYN_LVSTAT_SAVE             0x04
+#define MOLDYN_LVSTAT_VISUAL           0x08
+#define MOLDYN_LVSTAT_INITIALIZED      0x10
+
+#define MOLDYN_STAT_1BP                        0x01
+#define MOLDYN_STAT_2BP                        0x02    /* define for pair potentials */
+#define MOLDYN_STAT_3BP                        0x04    /* define for 3 body pot */ 
+#define MOLDYN_STAT_PBX                        0x08    /* periodic boudaries in x */
+#define MOLDYN_STAT_PBY                        0x10    /* y */
+#define MOLDYN_STAT_PBZ                        0x20    /* and z direction */
+
 typedef struct s_ho_params {
        double spring_constant;
        double equilibrium_distance;
@@ -119,27 +132,17 @@ typedef struct s_tersoff_params {
 
 /* general defines */
 
-#define MOLDYN_LVSTAT_TOTAL_E          0x01
-#define MOLDYN_LVSTAT_TOTAL_M          0x02
-#define MOLDYN_LVSTAT_SAVE             0x04
-#define MOLDYN_LVSTAT_DUMP             0x08
-#define MOLDYN_LVSTAT_VISUAL           0x10
-#define MOLDYN_LVSTAT_INITIALIZED      0x80
-
-#define MOLDYN_STAT_POTENTIAL          0x01
-#define MOLDYN_STAT_FORCE              0x02
-
 #define MOLDYN_TEMP                    273.0
 #define MOLDYN_TAU                     1.0e-15
 #define MOLDYN_CUTOFF                  10.0e-9
 #define MOLDYN_RUNS                    1000000
 
 #define MOLDYN_INTEGRATE_VERLET                0x00
-#define MOLDYN_INTEGRATE_DEFAULT MOLDYN_INTEGRATE_VERLET
+#define MOLDYN_INTEGRATE_DEFAULT       MOLDYN_INTEGRATE_VERLET
 
 #define MOLDYN_POTENTIAL_HO            0x00
 #define MOLDYN_POTENTIAL_LJ            0x01
-#define MOLDYN_POTENTIAL_DEFAULT MOLDYN_POTENTIAL_LJ
+#define MOLDYN_POTENTIAL_DEFAULT       MOLDYN_POTENTIAL_LJ
 
 /* phsical values */