/** Init cell interactions for cell system domain decomposition. * initializes the interacting neighbor cell list of a cell The * created list of interacting neighbor cells is used by the verlet * algorithm (see verlet.c) to build the verlet lists. */ void dd_init_cell_interactions() { int m,n,o,p,q,r,ind1,ind2,c_cnt=0,n_cnt; /* initialize cell neighbor structures */ dd.cell_inter = (IA_Neighbor_List *) realloc(dd.cell_inter,local_cells.n*sizeof(IA_Neighbor_List)); for(m=0; m<local_cells.n; m++) { dd.cell_inter[m].nList = NULL; dd.cell_inter[m].n_neighbors=0; } /* loop all local cells */ DD_LOCAL_CELLS_LOOP(m,n,o) { dd.cell_inter[c_cnt].nList = (IA_Neighbor *) realloc(dd.cell_inter[c_cnt].nList, CELLS_MAX_NEIGHBORS*sizeof(IA_Neighbor)); dd.cell_inter[c_cnt].n_neighbors = CELLS_MAX_NEIGHBORS; n_cnt=0; ind1 = get_linear_index(m,n,o,dd.ghost_cell_grid); /* loop all neighbor cells */ for(p=o-1; p<=o+1; p++) for(q=n-1; q<=n+1; q++) for(r=m-1; r<=m+1; r++) { ind2 = get_linear_index(r,q,p,dd.ghost_cell_grid); if(ind2 >= ind1) { dd.cell_inter[c_cnt].nList[n_cnt].cell_ind = ind2; dd.cell_inter[c_cnt].nList[n_cnt].pList = &cells[ind2]; init_pairList(&dd.cell_inter[c_cnt].nList[n_cnt].vList); n_cnt++; } } c_cnt++; }
/** Init cell interactions for the Lees-Edwards cell system. * initializes the interacting neighbor cell list of a cell. The * created list of interacting neighbor cells is used by the verlet * algorithm (see verlet.cpp) to build the verlet lists. */ void le_dd_init_cell_interactions() { int m,n,o,p,q,r,ind1,ind2,c_cnt=0,n_cnt=0; int extra_cells = 0; /* initialize cell neighbor structures */ dd.cell_inter = (IA_Neighbor_List *) realloc(dd.cell_inter,local_cells.n*sizeof(IA_Neighbor_List)); for(m=0; m<local_cells.n; m++) { dd.cell_inter[m].nList = NULL; dd.cell_inter[m].n_neighbors=0; } /* loop over non-ghost cells */ for(o=1; o<=dd.cell_grid[2]; o++) { for(n=1; n<=dd.cell_grid[1]; n++) { for(m=1; m<=dd.cell_grid[0]; m++) { /* plenty for most cases */ dd.cell_inter[c_cnt].nList = (IA_Neighbor *) realloc(dd.cell_inter[c_cnt].nList, 14*sizeof(IA_Neighbor)); n_cnt=0; ind1 = get_linear_index(m,n,o,dd.ghost_cell_grid); /* loop all 'conventional' neighbor cells */ for(p=o-1; p<=o+1; p++) { /*z-loop*/ for(q=n-1; q<=n+1; q++) { /*y-loop*/ for(r=m-1; r<=m+2; r++) { /*x-loop*/ /* Extra neighbours in x only for some cases */ if( (q == 0 && node_pos[1] == 0) || (q == dd.cell_grid[1]+1 && node_pos[1] == node_grid[1]-1) ){ extra_cells++; dd.cell_inter[c_cnt].nList = (IA_Neighbor *) realloc(dd.cell_inter[c_cnt].nList, (extra_cells+14)*sizeof(IA_Neighbor)); }else{ if( r == m + 2 ) continue; } ind2 = get_linear_index(r,q,p,dd.ghost_cell_grid); if(ind2 >= ind1) { dd.cell_inter[c_cnt].nList[n_cnt].cell_ind = ind2; dd.cell_inter[c_cnt].nList[n_cnt].pList = &cells[ind2]; init_pairList(&dd.cell_inter[c_cnt].nList[n_cnt].vList); #ifdef LE_DEBUG dd.cell_inter[c_cnt].nList[n_cnt].my_pos[0] = my_left[0] + r * dd.cell_size[0]; dd.cell_inter[c_cnt].nList[n_cnt].my_pos[1] = my_left[1] + q * dd.cell_size[1]; dd.cell_inter[c_cnt].nList[n_cnt].my_pos[2] = my_left[2] + p * dd.cell_size[2]; #endif n_cnt++; } } } } dd.cell_inter[c_cnt].n_neighbors = n_cnt; c_cnt++; } } } #ifdef LE_DEBUG FILE *cells_fp; char cLogName[64]; int c,nn,this_n; double myPos[3]; sprintf(cLogName, "cells_map%i.dat", this_node); cells_fp = fopen(cLogName,"w"); /* print out line segments showing the vector from each cell to each neighbour cell*/ for(c=0;c<c_cnt;c++){ myPos[0] = my_left[0] + dd.cell_size[0] * ( 1 + c % dd.cell_grid[0] ); myPos[1] = my_left[1] + dd.cell_size[1] * ( 1 + (c / dd.cell_grid[0]) % dd.cell_grid[1]); myPos[2] = my_left[2] + dd.cell_size[2] * ( 1 + (c / (dd.cell_grid[0] * dd.cell_grid[1]))); for(nn=0;nn<dd.cell_inter[c].n_neighbors;nn++){ this_n = dd.cell_inter[c].nList[nn].cell_ind; fprintf(cells_fp,"%i %i %i %f %f %f %f %f %f\n",c,nn,this_n, myPos[0], myPos[1], myPos[2], dd.cell_inter[c].nList[nn].my_pos[0], dd.cell_inter[c].nList[nn].my_pos[1], dd.cell_inter[c].nList[nn].my_pos[2]); } } fclose(cells_fp); #endif }