Ejemplo n.º 1
0
/** 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

}