some changes (still invalid pointer freed!)
authorhackbard <hackbard@sage.physik.uni-augsburg.de>
Fri, 1 Feb 2008 17:15:48 +0000 (18:15 +0100)
committerhackbard <hackbard@sage.physik.uni-augsburg.de>
Fri, 1 Feb 2008 17:15:48 +0000 (18:15 +0100)
Makefile
moldyn.c
pair_correlation_calc.c

index de46da4..28fd2b1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,13 @@
 CC = gcc
 
 CFLAGS = -Wall
+#CFLAGS += -Wextra -pedantic
 CFLAGS += -O3
 CFLAGS += -g
 #CFLAGS += -ffloat-store
 
 CFLAGS += -DALBE
-CFLAGS += -DSTATIC_LISTS
+#CFLAGS += -DSTATIC_LISTS
 #CFLAGS += -DDEBUG
 CFLAGS += -DDSTART=400 -DDEND=600
 #CFLAGS += -DVDEBUG
index 6d5f9e4..5681779 100644 (file)
--- a/moldyn.c
+++ b/moldyn.c
@@ -1244,13 +1244,10 @@ double estimate_time_step(t_moldyn *moldyn,double nn_dist) {
 
 /* linked list / cell method */
 
-#ifdef STATIC_LISTS
-
 int link_cell_init(t_moldyn *moldyn,u8 vol) {
 
        t_linkcell *lc;
        int i;
-       int *foo;
 
        lc=&(moldyn->lc);
 
@@ -1261,21 +1258,36 @@ int link_cell_init(t_moldyn *moldyn,u8 vol) {
        lc->y=moldyn->dim.y/lc->ny;
        lc->nz=moldyn->dim.z/moldyn->cutoff;
        lc->z=moldyn->dim.z/lc->nz;
-
        lc->cells=lc->nx*lc->ny*lc->nz;
+
+#ifdef STATIC_LISTS
        lc->subcell=malloc(lc->cells*sizeof(int*));
+#else
+       lc->subcell=malloc(lc->cells*sizeof(t_list));
+#endif
+
+       if(lc->subcell==NULL) {
+               perror("[moldyn] cell init (malloc)");
+               return -1;
+       }
 
        if(lc->cells<27)
                printf("[moldyn] FATAL: less then 27 subcells!\n");
 
        if(vol) {
+#ifdef STATIC_LISTS
                printf("[moldyn] initializing 'static' linked cells (%d)\n",
                       lc->cells);
+#else
+               printf("[moldyn] initializing 'dynamic' linked cells (%d)\n",
+                      lc->cells);
+#endif
                printf("  x: %d x %f A\n",lc->nx,lc->x);
                printf("  y: %d x %f A\n",lc->ny,lc->y);
                printf("  z: %d x %f A\n",lc->nz,lc->z);
        }
 
+#ifdef STATIC_LISTS
        /* list init */
        for(i=0;i<lc->cells;i++) {
                lc->subcell[i]=malloc((MAX_ATOMS_PER_LIST+1)*sizeof(int));
@@ -1283,8 +1295,16 @@ int link_cell_init(t_moldyn *moldyn,u8 vol) {
                        perror("[moldyn] list init (malloc)");
                        return -1;
                }
-//if(i==0) printf(" --- add one here! %d %p %p ----\n",i,lc->subcell,lc->subcell[0]);
+               /*
+               if(i==0)
+                       printf(" ---> %d malloc %p (%p)\n",
+                              i,lc->subcell[0],lc->subcell);
+               */
        }
+#else
+       for(i=0;i<lc->cells;i++)
+               list_init_f(&(lc->subcell[i]));
+#endif
 
        /* update the list */
        link_cell_update(moldyn);
@@ -1298,7 +1318,9 @@ int link_cell_update(t_moldyn *moldyn) {
        int nx,ny;
        t_atom *atom;
        t_linkcell *lc;
+#ifdef STATIC_LISTS
        int p;
+#endif
 
        atom=moldyn->atom;
        lc=&(moldyn->lc);
@@ -1307,13 +1329,18 @@ int link_cell_update(t_moldyn *moldyn) {
        ny=lc->ny;
 
        for(i=0;i<lc->cells;i++)
+#ifdef STATIC_LISTS
                memset(lc->subcell[i],0,(MAX_ATOMS_PER_LIST+1)*sizeof(int));
+#else
+               list_destroy_f(&(lc->subcell[i]));
+#endif
 
        for(count=0;count<moldyn->count;count++) {
                i=((atom[count].r.x+(moldyn->dim.x/2))/lc->x);
                j=((atom[count].r.y+(moldyn->dim.y/2))/lc->y);
                k=((atom[count].r.z+(moldyn->dim.z/2))/lc->z);
 
+#ifdef STATIC_LISTS
                p=0;
                while(lc->subcell[i+j*nx+k*nx*ny][p]!=0)
                        p++;
@@ -1324,12 +1351,27 @@ int link_cell_update(t_moldyn *moldyn) {
                }
 
                lc->subcell[i+j*nx+k*nx*ny][p]=count;
+#else
+               list_add_immediate_f(&(lc->subcell[i+j*nx+k*nx*ny]),
+                                    &(atom[count]));
+               /*
+               if(j==0&&k==0)
+                       printf(" ---> %d %d malloc %p (%p)\n",
+                              i,count,lc->subcell[i].current,lc->subcell);
+               */
+#endif
        }
 
        return 0;
 }
 
-int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,int **cell) {
+int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
+#ifdef STATIC_LISTS
+                              int **cell
+#else
+                              t_list *cell
+#endif
+                            ) {
 
        t_linkcell *lc;
        int a;
@@ -1389,170 +1431,24 @@ int link_cell_shutdown(t_moldyn *moldyn) {
 
        int i;
        t_linkcell *lc;
-       int *foo;
 
        lc=&(moldyn->lc);
 
-       for(i=0;i<lc->cells;i++)
-{
-//printf(" --- free %p , %d\n",lc->subcell[i],i);
+       for(i=0;i<lc->cells;i++) {
+#ifdef STATIC_LISTS
+               //printf(" ---> %d free %p\n",i,lc->subcell[i]);
                free(lc->subcell[i]);
-}
-
-       free(lc->subcell);
-
-       return 0;
-}
-
 #else
-
-int link_cell_init(t_moldyn *moldyn,u8 vol) {
-
-       t_linkcell *lc;
-       int i;
-
-       lc=&(moldyn->lc);
-
-       /* partitioning the md cell */
-       lc->nx=moldyn->dim.x/moldyn->cutoff;
-       lc->x=moldyn->dim.x/lc->nx;
-       lc->ny=moldyn->dim.y/moldyn->cutoff;
-       lc->y=moldyn->dim.y/lc->ny;
-       lc->nz=moldyn->dim.z/moldyn->cutoff;
-       lc->z=moldyn->dim.z/lc->nz;
-
-       lc->cells=lc->nx*lc->ny*lc->nz;
-       lc->subcell=malloc(lc->cells*sizeof(t_list));
-
-       if(lc->cells<27)
-               printf("[moldyn] FATAL: less then 27 subcells!\n");
-
-       if(vol) {
-               printf("[moldyn] initializing 'dynamic' linked cells (%d)\n",
-                      lc->cells);
-               printf("  x: %d x %f A\n",lc->nx,lc->x);
-               printf("  y: %d x %f A\n",lc->ny,lc->y);
-               printf("  z: %d x %f A\n",lc->nz,lc->z);
-       }
-
-       for(i=0;i<lc->cells;i++)
-               list_init_f(&(lc->subcell[i]));
-
-       link_cell_update(moldyn);
-       
-       return 0;
-}
-
-int link_cell_update(t_moldyn *moldyn) {
-
-       int count,i,j,k;
-       int nx,ny;
-       t_atom *atom;
-       t_linkcell *lc;
-       double x,y,z;
-
-       atom=moldyn->atom;
-       lc=&(moldyn->lc);
-
-       nx=lc->nx;
-       ny=lc->ny;
-
-       x=moldyn->dim.x/2;
-       y=moldyn->dim.y/2;
-       z=moldyn->dim.z/2;
-
-       for(i=0;i<lc->cells;i++)
+               //printf(" ---> %d free %p\n",i,lc->subcell[i].start);
                list_destroy_f(&(lc->subcell[i]));
-       
-       for(count=0;count<moldyn->count;count++) {
-               i=((atom[count].r.x+(moldyn->dim.x/2))/lc->x);
-               j=((atom[count].r.y+(moldyn->dim.y/2))/lc->y);
-               k=((atom[count].r.z+(moldyn->dim.z/2))/lc->z);
-               list_add_immediate_f(&(lc->subcell[i+j*nx+k*nx*ny]),
-                                    &(atom[count]));
-//if(i==0&&j==0&&k==0) printf(" --- add one here! %d %p ----\n",count,lc->subcell[0].current);
-       }
-
-       return 0;
-}
-
-int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,t_list *cell) {
-
-       t_linkcell *lc;
-       int a;
-       int count1,count2;
-       int ci,cj,ck;
-       int nx,ny,nz;
-       int x,y,z;
-       u8 bx,by,bz;
-
-       lc=&(moldyn->lc);
-       nx=lc->nx;
-       ny=lc->ny;
-       nz=lc->nz;
-       count1=1;
-       count2=27;
-       a=nx*ny;
-
-       cell[0]=lc->subcell[i+j*nx+k*a];
-       for(ci=-1;ci<=1;ci++) {
-               bx=0;
-               x=i+ci;
-               if((x<0)||(x>=nx)) {
-                       x=(x+nx)%nx;
-                       bx=1;
-               }
-               for(cj=-1;cj<=1;cj++) {
-                       by=0;
-                       y=j+cj;
-                       if((y<0)||(y>=ny)) {
-                               y=(y+ny)%ny;
-                               by=1;
-                       }
-                       for(ck=-1;ck<=1;ck++) {
-                               bz=0;
-                               z=k+ck;
-                               if((z<0)||(z>=nz)) {
-                                       z=(z+nz)%nz;
-                                       bz=1;
-                               }
-                               if(!(ci|cj|ck)) continue;
-                               if(bx|by|bz) {
-                                       cell[--count2]=lc->subcell[x+y*nx+z*a];
-                               }
-                               else {
-                                       cell[count1++]=lc->subcell[x+y*nx+z*a];
-                               }
-                       }
-               }
+#endif
        }
 
-       lc->dnlc=count1;
-
-       return count1;
-}
-
-int link_cell_shutdown(t_moldyn *moldyn) {
-
-       int i;
-       t_linkcell *lc;
-
-       lc=&(moldyn->lc);
-
-printf("FOO:\n");
-       for(i=0;i<lc->nx*lc->ny*lc->nz;i++) {
-printf(" %d\n",i);
-               list_destroy_f(&(moldyn->lc.subcell[i]));
-printf(" %d!\n",i);
-}
-
        free(lc->subcell);
 
        return 0;
 }
 
-#endif
-
 int moldyn_add_schedule(t_moldyn *moldyn,int runs,double tau) {
 
        int count;
@@ -2306,7 +2202,7 @@ int moldyn_read_save_file(t_moldyn *moldyn,char *file) {
                return cnt;
        }
 
-       // hooks
+       // hooks etc ...
 
        return 0;
 }
index 2f93ab7..f193614 100644 (file)
@@ -39,6 +39,8 @@ int main(int argc,char **argv) {
                return -1;
        }
 
+       memset(&moldyn,0,sizeof(t_moldyn));
+
        ret=moldyn_read_save_file(&moldyn,argv[1]);
        if(ret) {
                printf("[pair corr calc] exit!\n");