diff options
Diffstat (limited to 'src/Mapping.c')
-rw-r--r-- | src/Mapping.c | 100 |
1 files changed, 61 insertions, 39 deletions
diff --git a/src/Mapping.c b/src/Mapping.c index 0a701c1..87c8f7d 100644 --- a/src/Mapping.c +++ b/src/Mapping.c @@ -76,11 +76,12 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( int retval; int stagger_index; int myproc; - int npoints; + int i, j, k, npoints; hslab_mapping_t *mapping; const char *error_msg; const pGH *pughGH; /* pointer to the current pGH */ const pGA *GA; /* the variable's GA structure from PUGH */ + const pGExtras *extras; cGroup vinfo; @@ -146,7 +147,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( mapping = (hslab_mapping_t *) malloc (sizeof (hslab_mapping_t)); if (mapping) { - mapping->vectors = (int *) malloc ((6*vinfo.dim + 2*dim) * sizeof (int)); + mapping->vectors = (int *) malloc ((6*vinfo.dim + 3*dim) * sizeof (int)); } if (mapping == NULL || mapping->vectors == NULL) { @@ -180,6 +181,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( mapping->downsample = mapping->vectors + 5*vinfo.dim; mapping->local_hsize = mapping->vectors + 6*vinfo.dim + 0*dim; mapping->global_hsize = mapping->vectors + 6*vinfo.dim + 1*dim; + mapping->global_hoffset = mapping->vectors + 6*vinfo.dim + 2*dim; /* check direction vectors */ for (hdim = 0; hdim < mapping->hdim; hdim++) @@ -243,6 +245,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( /* get the pGH pointer and the variable's GA structure */ GA = (const pGA *) pughGH->variables[vindex][0]; + extras = GA->extras; myproc = CCTK_MyProc (GH); /* check extent */ @@ -250,7 +253,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( { if (mapping->do_dir[vdim] && hdim < mapping->hdim) { - if (origin[vdim] + extent[hdim] > GA->extras->nsize[vdim]) + if (origin[vdim] + extent[hdim] > extras->nsize[vdim]) { free (mapping->vectors); free (mapping); CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, @@ -261,7 +264,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( hdim++; } else if (mapping->is_diagonal_in_3D && - origin[vdim] + extent[0] > GA->extras->nsize[vdim]) + origin[vdim] + extent[0] > extras->nsize[vdim]) { free (mapping->vectors); free (mapping); CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, @@ -290,7 +293,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( /* subtract ghostzones for periodic BC */ if (GA->connectivity->perme[vdim]) { - mapping->global_hsize[hdim] -= 2 * GA->extras->nghostzones[vdim]; + mapping->global_hsize[hdim] -= 2 * extras->nghostzones[vdim]; } hdim++; } @@ -304,7 +307,7 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( /* subtract ghostzones for periodic BC */ if (GA->connectivity->perme[vdim]) { - mapping->totals -= 2 * GA->extras->nghostzones[vdim]; + mapping->totals -= 2 * extras->nghostzones[vdim]; } if ((unsigned int) mapping->global_hsize[0] > mapping->totals) { @@ -318,8 +321,8 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( if (mapping->is_full_hyperslab) { memset (mapping->local_startpoint, 0, vinfo.dim * sizeof (int)); - memcpy (mapping->local_endpoint, GA->extras->lnsize, vinfo.dim*sizeof(int)); - mapping->totals = GA->extras->npoints; + memcpy (mapping->local_endpoint, extras->lnsize, vinfo.dim*sizeof(int)); + mapping->totals = extras->npoints; } else if (mapping->is_diagonal_in_3D) { @@ -329,6 +332,24 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( mapping->downsample[vdim] = mapping->downsample[0]; mapping->global_startpoint[vdim] = origin[vdim]; } + + i = mapping->global_startpoint[0] - extras->lb[myproc][0]; + j = mapping->global_startpoint[1] - extras->lb[myproc][1]; + k = mapping->global_startpoint[2] - extras->lb[myproc][2]; + mapping->totals = 0; + for (npoints = 0; npoints < mapping->global_hsize[0]; npoints++) + { + if (i >= extras->ownership[0][0][0] && i < extras->ownership[0][1][0] && + j >= extras->ownership[0][0][1] && j < extras->ownership[0][1][1] && + k >= extras->ownership[0][0][2] && k < extras->ownership[0][1][2]) + { + mapping->totals++; + } + i += mapping->downsample[0]; + j += mapping->downsample[1]; + k += mapping->downsample[2]; + } + mapping->local_hsize[0] = mapping->totals; } else { @@ -344,14 +365,14 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( { stagger_index = CCTK_StaggerDirIndex (vdim, vinfo.stagtype); - if (origin[vdim] < MY_GLOBAL_EP (GA->extras, myproc, stagger_index, vdim)) + if (origin[vdim] < MY_GLOBAL_EP (extras, myproc, stagger_index, vdim)) { mapping->global_startpoint[vdim] = origin[vdim]; - if (origin[vdim] < MY_GLOBAL_SP (GA->extras, myproc,stagger_index,vdim)) + if (origin[vdim] < MY_GLOBAL_SP (extras, myproc,stagger_index,vdim)) { - npoints = (MY_GLOBAL_SP (GA->extras, myproc, stagger_index, vdim) + npoints = (MY_GLOBAL_SP (extras, myproc, stagger_index, vdim) - origin[vdim]) / mapping->downsample[vdim]; - if ((MY_GLOBAL_SP (GA->extras, myproc, stagger_index, vdim) + if ((MY_GLOBAL_SP (extras, myproc, stagger_index, vdim) - origin[vdim]) % mapping->downsample[vdim]) { npoints++; @@ -372,24 +393,24 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( stagger_index = CCTK_StaggerDirIndex (vdim, vinfo.stagtype); if (mapping->global_startpoint[vdim] >= 0 && - mapping->global_startpoint[vdim] < MY_GLOBAL_EP (GA->extras, myproc, + mapping->global_startpoint[vdim] < MY_GLOBAL_EP (extras, myproc, stagger_index,vdim)) { mapping->local_startpoint[vdim] = mapping->global_startpoint[vdim] - - GA->extras->lb[myproc][vdim]; + extras->lb[myproc][vdim]; } else { mapping->local_startpoint[vdim] = -1; } - if (mapping->global_endpoint[vdim] > MY_GLOBAL_SP (GA->extras, myproc, + if (mapping->global_endpoint[vdim] > MY_GLOBAL_SP (extras, myproc, stagger_index, vdim)) { mapping->local_endpoint[vdim] = - MIN (MY_LOCAL_EP (GA->extras, stagger_index, vdim), + MIN (MY_LOCAL_EP (extras, stagger_index, vdim), mapping->global_endpoint[vdim] - - GA->extras->lb[myproc][vdim]); + extras->lb[myproc][vdim]); } else { @@ -427,43 +448,44 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex ( } } /* end of else branch for 'if (mapping->is_full_hyperslab)' */ + fprintf (stderr, "proc %d: total number of local hyperslab data points: %d\n", CCTK_MyProc (GH), mapping->totals); +CCTK_Barrier (GH); #ifdef DEBUG printf ("total number of hyperslab data points: %d\n", mapping->totals); #endif -#if 0 - if (mapping->totals > 0) + /* calculate the offset of the local chunk into the global hyperslab */ + /* NOTE: the global offsets for diagonals are calculated later after + gathering all the local sizes */ + if (! mapping->is_diagonal_in_3D && mapping->totals > 0) { - /* if requested, compute the offsets into the global hyperslab */ - if (hoffset_global) + for (vdim = hdim = 0; vdim < (unsigned int) vinfo.dim; vdim++) { - for (i = hdim = 0; i < vinfo.dim; i++) + if (mapping->do_dir[vdim]) { - if (mapping->do_dir[i]) + if (mapping->is_full_hyperslab) { - if (mapping->is_full_hyperslab) - { - hoffset_global[hdim] = GA->extras->lb[myproc][i]; - } - else + mapping->global_hoffset[hdim] = extras->lb[myproc][vdim]; + } + else + { + mapping->global_hoffset[hdim] = (mapping->global_startpoint[vdim] - + origin[vdim]) / mapping->downsample[vdim]; + if (GA->connectivity->perme[vdim]) { - hoffset_global[hdim] = (mapping->global_startpoint[i] - - origin[i]) / mapping->downsample[i]; - if (GA->connectivity->perme[i]) - { - hoffset_global[hdim] -= GA->extras->nghostzones[i]; - } + mapping->global_hoffset[hdim] -= extras->nghostzones[vdim]; } + } +#define DEBUG 1 #ifdef DEBUG - printf ("hoffset_global, hsize in direction %d: %d, %d\n", - hdim, hoffset_global[hdim], mapping->local_hsize[hdim]); + fprintf (stderr, "proc %d: global_hoffset, local_hsize in direction " + "%d: %d, %d\n", CCTK_MyProc (GH), hdim, + mapping->global_hoffset[hdim], mapping->local_hsize[hdim]); #endif - hdim++; - } + hdim++; } } } -#endif /* add this mapping to the mapping list */ if (mapping_list) |