projects
/
physik
/
posic.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
introduced lowmem lists
[physik/posic.git]
/
moldyn.c
diff --git
a/moldyn.c
b/moldyn.c
index
7a9709e
..
6da2b95
100644
(file)
--- a/
moldyn.c
+++ b/
moldyn.c
@@
-600,6
+600,15
@@
int add_atom(t_moldyn *moldyn,int element,double mass,u8 brand,u8 attr,
}
moldyn->atom=ptr;
}
moldyn->atom=ptr;
+#ifdef LOWMEM_LISTS
+ ptr=realloc(moldyn->lc.subcell->list,(count+1)*sizeof(int));
+ if(!ptr) {
+ perror("[moldyn] list realloc (add atom)");
+ return -1;
+ }
+ moldyn->lc.subcell->list=ptr;
+#endif
+
atom=moldyn->atom;
/* initialize new atom */
atom=moldyn->atom;
/* initialize new atom */
@@
-1293,7
+1302,9
@@
double estimate_time_step(t_moldyn *moldyn,double nn_dist) {
int link_cell_init(t_moldyn *moldyn,u8 vol) {
t_linkcell *lc;
int link_cell_init(t_moldyn *moldyn,u8 vol) {
t_linkcell *lc;
+#ifndef LOWMEM_LISTS
int i;
int i;
+#endif
lc=&(moldyn->lc);
lc=&(moldyn->lc);
@@
-1308,8
+1319,8
@@
int link_cell_init(t_moldyn *moldyn,u8 vol) {
#ifdef STATIC_LISTS
lc->subcell=malloc(lc->cells*sizeof(int*));
#ifdef STATIC_LISTS
lc->subcell=malloc(lc->cells*sizeof(int*));
-#elif LOWMEM_LIST
- lc->subcell=malloc(
t_lowmem_list
);
+#elif LOWMEM_LIST
S
+ lc->subcell=malloc(
sizeof(t_lowmem_list)
);
#else
lc->subcell=malloc(lc->cells*sizeof(t_list));
#endif
#else
lc->subcell=malloc(lc->cells*sizeof(t_list));
#endif
@@
-1327,7
+1338,7
@@
int link_cell_init(t_moldyn *moldyn,u8 vol) {
#ifdef STATIC_LISTS
printf("[moldyn] initializing 'static' linked cells (%d)\n",
lc->cells);
#ifdef STATIC_LISTS
printf("[moldyn] initializing 'static' linked cells (%d)\n",
lc->cells);
-#elif LOWMEM_LIST
+#elif LOWMEM_LIST
S
printf("[moldyn] initializing 'lowmem' linked cells (%d)\n",
lc->cells);
#else
printf("[moldyn] initializing 'lowmem' linked cells (%d)\n",
lc->cells);
#else
@@
-1353,7
+1364,7
@@
int link_cell_init(t_moldyn *moldyn,u8 vol) {
i,lc->subcell[0],lc->subcell);
*/
}
i,lc->subcell[0],lc->subcell);
*/
}
-#elif LOWMEM_LIST
+#elif LOWMEM_LIST
S
lc->subcell->head=malloc(lc->cells*sizeof(int));
if(lc->subcell->head==NULL) {
perror("[moldyn] head init (malloc)");
lc->subcell->head=malloc(lc->cells*sizeof(int));
if(lc->subcell->head==NULL) {
perror("[moldyn] head init (malloc)");
@@
-1378,23
+1389,25
@@
int link_cell_init(t_moldyn *moldyn,u8 vol) {
int link_cell_update(t_moldyn *moldyn) {
int count,i,j,k;
int link_cell_update(t_moldyn *moldyn) {
int count,i,j,k;
- int nx,ny;
+ int nx,n
x
y;
t_atom *atom;
t_linkcell *lc;
#ifdef STATIC_LISTS
int p;
t_atom *atom;
t_linkcell *lc;
#ifdef STATIC_LISTS
int p;
+#elif LOWMEM_LISTS
+ int p;
#endif
atom=moldyn->atom;
lc=&(moldyn->lc);
nx=lc->nx;
#endif
atom=moldyn->atom;
lc=&(moldyn->lc);
nx=lc->nx;
- n
y=
lc->ny;
+ n
xy=nx*
lc->ny;
for(i=0;i<lc->cells;i++)
#ifdef STATIC_LISTS
memset(lc->subcell[i],-1,(MAX_ATOMS_PER_LIST+1)*sizeof(int));
for(i=0;i<lc->cells;i++)
#ifdef STATIC_LISTS
memset(lc->subcell[i],-1,(MAX_ATOMS_PER_LIST+1)*sizeof(int));
-#elif LOWMEM_LIST
+#elif LOWMEM_LIST
S
lc->subcell->head[i]=-1;
#else
list_destroy_f(&(lc->subcell[i]));
lc->subcell->head[i]=-1;
#else
list_destroy_f(&(lc->subcell[i]));
@@
-1407,7
+1420,7
@@
int link_cell_update(t_moldyn *moldyn) {
#ifdef STATIC_LISTS
p=0;
#ifdef STATIC_LISTS
p=0;
- while(lc->subcell[i+j*nx+k*nx
*n
y][p]!=-1)
+ while(lc->subcell[i+j*nx+k*nxy][p]!=-1)
p++;
if(p>=MAX_ATOMS_PER_LIST) {
p++;
if(p>=MAX_ATOMS_PER_LIST) {
@@
-1415,12
+1428,13
@@
int link_cell_update(t_moldyn *moldyn) {
return -1;
}
return -1;
}
- lc->subcell[i+j*nx+k*nx*ny][p]=count;
-#elif LOWMEM_LIST
- lc->subcell->list[count]=list->subcell->head[i+j*nx+k*nx*ny];
- list->subcell->head=count;
+ lc->subcell[i+j*nx+k*nxy][p]=count;
+#elif LOWMEM_LISTS
+ p=i+j*nx+k*nxy;
+ lc->subcell->list[count]=lc->subcell->head[p];
+ lc->subcell->head[p]=count;
#else
#else
- list_add_immediate_f(&(lc->subcell[i+j*nx+k*nx
*n
y]),
+ list_add_immediate_f(&(lc->subcell[i+j*nx+k*nxy]),
&(atom[count]));
/*
if(j==0&&k==0)
&(atom[count]));
/*
if(j==0&&k==0)
@@
-1436,6
+1450,8
@@
int link_cell_update(t_moldyn *moldyn) {
int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
#ifdef STATIC_LISTS
int **cell
int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
#ifdef STATIC_LISTS
int **cell
+#elif LOWMEM_LISTS
+ int *cell
#else
t_list *cell
#endif
#else
t_list *cell
#endif
@@
-1461,7
+1477,11
@@
int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
printf("[moldyn] WARNING: lcni %d/%d %d/%d %d/%d\n",
i,nx,j,ny,k,nz);
printf("[moldyn] WARNING: lcni %d/%d %d/%d %d/%d\n",
i,nx,j,ny,k,nz);
+#ifndef LOWMEM_LISTS
cell[0]=lc->subcell[i+j*nx+k*a];
cell[0]=lc->subcell[i+j*nx+k*a];
+#else
+ cell[0]=lc->subcell->head[i+j*nx+k*a];
+#endif
for(ci=-1;ci<=1;ci++) {
bx=0;
x=i+ci;
for(ci=-1;ci<=1;ci++) {
bx=0;
x=i+ci;
@@
-1485,10
+1505,19
@@
int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
}
if(!(ci|cj|ck)) continue;
if(bx|by|bz) {
}
if(!(ci|cj|ck)) continue;
if(bx|by|bz) {
+#ifndef LOWMEM_LISTS
cell[--count2]=lc->subcell[x+y*nx+z*a];
cell[--count2]=lc->subcell[x+y*nx+z*a];
+#else
+ cell[--count2]=lc->subcell->head[x+y*nx+z*a];
+#endif
+
}
else {
}
else {
+#ifndef LOWMEM_LISTS
cell[count1++]=lc->subcell[x+y*nx+z*a];
cell[count1++]=lc->subcell[x+y*nx+z*a];
+#else
+ cell[count1++]=lc->subcell->head[x+y*nx+z*a];
+#endif
}
}
}
}
}
}
@@
-1501,11
+1530,19
@@
int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,
int link_cell_shutdown(t_moldyn *moldyn) {
int link_cell_shutdown(t_moldyn *moldyn) {
+#ifndef LOWMEM_LISTS
int i;
int i;
+#endif
t_linkcell *lc;
lc=&(moldyn->lc);
t_linkcell *lc;
lc=&(moldyn->lc);
+#if LOWMEM_LISTS
+ free(lc->subcell->head);
+ free(lc->subcell->list);
+
+#else
+
for(i=0;i<lc->cells;i++) {
#ifdef STATIC_LISTS
free(lc->subcell[i]);
for(i=0;i<lc->cells;i++) {
#ifdef STATIC_LISTS
free(lc->subcell[i]);
@@
-1514,6
+1551,7
@@
int link_cell_shutdown(t_moldyn *moldyn) {
list_destroy_f(&(lc->subcell[i]));
#endif
}
list_destroy_f(&(lc->subcell[i]));
#endif
}
+#endif
free(lc->subcell);
free(lc->subcell);
@@
-1849,6
+1887,9
@@
int potential_force_calc(t_moldyn *moldyn) {
int *neighbour_i[27];
int p,q;
t_atom *atom;
int *neighbour_i[27];
int p,q;
t_atom *atom;
+#elif LOWMEM_LISTS
+ int neighbour_i[27];
+ int p,q;
#else
t_list neighbour_i[27];
t_list neighbour_i2[27];
#else
t_list neighbour_i[27];
t_list neighbour_i2[27];
@@
-1929,6
+1970,13
@@
int potential_force_calc(t_moldyn *moldyn) {
jtom=&(atom[neighbour_i[j][p]]);
p++;
jtom=&(atom[neighbour_i[j][p]]);
p++;
+#elif LOWMEM_LISTS
+ p=neighbour_i[j];
+
+ while(p!=-1) {
+
+ jtom=&(itom[p]);
+ p=lc->subcell->list[p];
#else
this=&(neighbour_i[j]);
list_reset_f(this);
#else
this=&(neighbour_i[j]);
list_reset_f(this);
@@
-1952,6
+2000,8
@@
int potential_force_calc(t_moldyn *moldyn) {
}
#ifdef STATIC_LISTS
}
}
#ifdef STATIC_LISTS
}
+#elif LOWMEM_LISTS
+ }
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif
@@
-1967,6
+2017,8
@@
int potential_force_calc(t_moldyn *moldyn) {
/* copy the neighbour lists */
#ifdef STATIC_LISTS
/* no copy needed for static lists */
/* copy the neighbour lists */
#ifdef STATIC_LISTS
/* no copy needed for static lists */
+#elif LOWMEM_LISTS
+ /* no copy needed for lowmem lists */
#else
memcpy(neighbour_i2,neighbour_i,27*sizeof(t_list));
#endif
#else
memcpy(neighbour_i2,neighbour_i,27*sizeof(t_list));
#endif
@@
-1982,6
+2034,13
@@
int potential_force_calc(t_moldyn *moldyn) {
jtom=&(atom[neighbour_i[j][p]]);
p++;
jtom=&(atom[neighbour_i[j][p]]);
p++;
+#elif LOWMEM_LISTS
+ p=neighbour_i[j];
+
+ while(p!=-1) {
+
+ jtom=&(itom[p]);
+ p=lc->subcell->list[p];
#else
this=&(neighbour_i[j]);
list_reset_f(this);
#else
this=&(neighbour_i[j]);
list_reset_f(this);
@@
-2026,6
+2085,13
@@
int potential_force_calc(t_moldyn *moldyn) {
ktom=&(atom[neighbour_i[k][q]]);
q++;
ktom=&(atom[neighbour_i[k][q]]);
q++;
+#elif LOWMEM_LISTS
+ q=neighbour_i[k];
+
+ while(q!=-1) {
+
+ ktom=&(itom[q]);
+ q=lc->subcell->list[q];
#else
that=&(neighbour_i2[k]);
list_reset_f(that);
#else
that=&(neighbour_i2[k]);
list_reset_f(that);
@@
-2053,6
+2119,8
@@
int potential_force_calc(t_moldyn *moldyn) {
bc_ik|bc_ij);
#ifdef STATIC_LISTS
}
bc_ik|bc_ij);
#ifdef STATIC_LISTS
}
+#elif LOWMEM_LISTS
+ }
#else
} while(list_next_f(that)!=\
L_NO_NEXT_ELEMENT);
#else
} while(list_next_f(that)!=\
L_NO_NEXT_ELEMENT);
@@
-2081,6
+2149,13
@@
int potential_force_calc(t_moldyn *moldyn) {
ktom=&(atom[neighbour_i[k][q]]);
q++;
ktom=&(atom[neighbour_i[k][q]]);
q++;
+#elif LOWMEM_LISTS
+ q=neighbour_i[k];
+
+ while(q!=-1) {
+
+ ktom=&(itom[q]);
+ q=lc->subcell->list[q];
#else
that=&(neighbour_i2[k]);
list_reset_f(that);
#else
that=&(neighbour_i2[k]);
list_reset_f(that);
@@
-2109,6
+2184,8
@@
int potential_force_calc(t_moldyn *moldyn) {
#ifdef STATIC_LISTS
}
#ifdef STATIC_LISTS
}
+#elif LOWMEM_LISTS
+ }
#else
} while(list_next_f(that)!=\
L_NO_NEXT_ELEMENT);
#else
} while(list_next_f(that)!=\
L_NO_NEXT_ELEMENT);
@@
-2126,6
+2203,8
@@
int potential_force_calc(t_moldyn *moldyn) {
}
#ifdef STATIC_LISTS
}
}
#ifdef STATIC_LISTS
}
+#elif LOWMEM_LISTS
+ }
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif
@@
-2367,6
+2446,9
@@
int process_2b_bonds(t_moldyn *moldyn,void *data,
#ifdef STATIC_LISTS
int *neighbour[27];
int p;
#ifdef STATIC_LISTS
int *neighbour[27];
int p;
+#elif LOWMEM_LISTS
+ int neighbour[27];
+ int p;
#else
t_list neighbour[27];
t_list *this;
#else
t_list neighbour[27];
t_list *this;
@@
-2397,6
+2479,13
@@
int process_2b_bonds(t_moldyn *moldyn,void *data,
jtom=&(moldyn->atom[neighbour[j][p]]);
p++;
jtom=&(moldyn->atom[neighbour[j][p]]);
p++;
+#elif LOWMEM_LISTS
+ p=neighbour[j];
+
+ while(p!=-1) {
+
+ jtom=&(itom[p]);
+ p=lc->subcell->list[p];
#else
this=&(neighbour[j]);
list_reset_f(this);
#else
this=&(neighbour[j]);
list_reset_f(this);
@@
-2414,6
+2503,8
@@
int process_2b_bonds(t_moldyn *moldyn,void *data,
#ifdef STATIC_LISTS
}
#ifdef STATIC_LISTS
}
+#elif LOWMEM_LISTS
+ }
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif
#else
} while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
#endif