aboutsummaryrefslogtreecommitdiff
path: root/src/Mapping.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mapping.c')
-rw-r--r--src/Mapping.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/src/Mapping.c b/src/Mapping.c
index c74be93..8e80893 100644
--- a/src/Mapping.c
+++ b/src/Mapping.c
@@ -218,6 +218,17 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex (
return (-7);
}
}
+
+ /* diagonals can be extracted from non-staggered 3D variables only */
+ if (mapping->is_diagonal_in_3D && vinfo.stagtype != 0)
+ {
+ free (mapping->vectors); free (mapping);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Hyperslab_DefineGlobalMappingByIndex: diagonals can be "
+ "extracted from non-staggered 3D variables only");
+ return (-7);
+ }
+
for (vdim = 0; vdim < (unsigned int) vinfo.dim; vdim++)
{
mapping->do_dir[vdim] = 0;
@@ -256,6 +267,15 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex (
}
hdim++;
}
+ else if (mapping->is_diagonal_in_3D &&
+ origin[vdim] + extent[0] > GA->extras->nsize[vdim])
+ {
+ free (mapping->vectors); free (mapping);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Hyperslab_DefineGlobalMappingByIndex: extent in "
+ "%d-direction exceeds grid size", vdim);
+ return (-8);
+ }
}
/* now fill out the hyperslab mapping structure */
@@ -281,6 +301,23 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex (
}
hdim++;
}
+ else if (mapping->is_diagonal_in_3D)
+ {
+ mapping->totals = extent[0] / mapping->downsample[0];
+ if (extent[0] % mapping->downsample[0])
+ {
+ mapping->totals++;
+ }
+ /* subtract ghostzones for periodic BC */
+ if (GA->connectivity->perme[vdim])
+ {
+ mapping->totals -= 2 * GA->extras->nghostzones[vdim];
+ }
+ if ((unsigned int) mapping->global_hsize[0] > mapping->totals)
+ {
+ mapping->global_hsize[0] = mapping->totals;
+ }
+ }
}
/* check whether the full local data patch was requested as hyperslab */
@@ -293,17 +330,12 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex (
}
else if (mapping->is_diagonal_in_3D)
{
- /* diagonals in 3D are special: global_hsize is minimum of grid extents */
- mapping->global_hsize[0] = GH->cctk_gsh[0];
- if (mapping->global_hsize[0] > GH->cctk_gsh[1])
- {
- mapping->global_hsize[0] = GH->cctk_gsh[1];
- }
- if (mapping->global_hsize[0] > GH->cctk_gsh[2])
+ /* just initialize the downsample and global_startpoint vectors */
+ for (vdim = 0; vdim < (unsigned int) vinfo.dim; vdim++)
{
- mapping->global_hsize[0] = GH->cctk_gsh[2];
+ mapping->downsample[vdim] = mapping->downsample[0];
+ mapping->global_startpoint[vdim] = origin[vdim];
}
- mapping->totals = mapping->global_hsize[0];
}
else
{
@@ -371,7 +403,6 @@ CCTK_INT Hyperslab_DefineGlobalMappingByIndex (
mapping->local_endpoint[vdim] = -1;
}
-#define DEBUG 1
#ifdef DEBUG
printf ("direction %d: global ranges [%d, %d), local ranges[%d, %d)\n",
vdim,