diff options
Diffstat (limited to 'src/Mapping.c')
-rw-r--r-- | src/Mapping.c | 51 |
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, |