aboutsummaryrefslogtreecommitdiff
path: root/src/Mapping.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mapping.c')
-rw-r--r--src/Mapping.c100
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)