aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2003-06-24 14:26:06 +0000
committertradke <tradke@10716dce-81a3-4424-a2c8-48026a0d3035>2003-06-24 14:26:06 +0000
commit3659afd1308d0dba95eae7ae5974dce3eda4a2e7 (patch)
tree4e4d992175856c9d910340bba01599eba3bc8bdc
parent3a5791783cae167a1ae4439df3a5dde56c7a7ffc (diff)
Fix for the definition of local hyperslab mappings for periodic BC.
git-svn-id: http://svn.cactuscode.org/arrangements/CactusPUGH/PUGHSlab/trunk@104 10716dce-81a3-4424-a2c8-48026a0d3035
-rw-r--r--src/Mapping.c77
1 files changed, 30 insertions, 47 deletions
diff --git a/src/Mapping.c b/src/Mapping.c
index 2176494..5bb1d76 100644
--- a/src/Mapping.c
+++ b/src/Mapping.c
@@ -360,11 +360,9 @@ static CCTK_INT DefineMapping (const cGH *GH,
{
mapping->downsample[vdim] = downsample[dim];
}
- mapping->global_hsize[dim] = extent[dim] / mapping->downsample[vdim];
- if (extent[dim] % mapping->downsample[vdim])
- {
- mapping->global_hsize[dim]++;
- }
+ mapping->global_hsize[dim] =
+ (extent[dim] + mapping->downsample[vdim]-1) / mapping->downsample[vdim];
+
/* subtract ghostzones for periodic BC */
if (GA->connectivity->perme[vdim])
{
@@ -374,11 +372,9 @@ static CCTK_INT DefineMapping (const cGH *GH,
}
else if (mapping->is_diagonal_in_3D)
{
- mapping->totals = extent[0] / mapping->downsample[0];
- if (extent[0] % mapping->downsample[0])
- {
- mapping->totals++;
- }
+ mapping->totals =
+ (extent[0] + mapping->downsample[0]-1) / mapping->downsample[0];
+
/* subtract ghostzones for periodic BC */
if (GA->connectivity->perme[vdim])
{
@@ -454,24 +450,17 @@ static CCTK_INT DefineMapping (const cGH *GH,
my_global_startpoint = extras->lb[myproc][vdim] + my_local_startpoint;
my_global_endpoint = extras->lb[myproc][vdim] + my_local_endpoint;
+ mapping->global_startpoint[vdim] = -1;
if (origin[vdim] < my_global_endpoint)
{
mapping->global_startpoint[vdim] = origin[vdim];
if (origin[vdim] < my_global_startpoint)
{
- npoints = (my_global_startpoint - origin[vdim]) /
- mapping->downsample[vdim];
- if ((my_global_startpoint - origin[vdim]) % mapping->downsample[vdim])
- {
- npoints++;
- }
+ npoints = (my_global_startpoint - origin[vdim] +
+ mapping->downsample[vdim]-1) / mapping->downsample[vdim];
mapping->global_startpoint[vdim] += npoints*mapping->downsample[vdim];
}
}
- else
- {
- mapping->global_startpoint[vdim] = -1;
- }
}
/* compute the local start- and endpoint from the global ranges */
@@ -480,10 +469,10 @@ static CCTK_INT DefineMapping (const cGH *GH,
{
i = CCTK_StaggerDirIndex (vdim, vinfo.stagtype);
+ /* non-periodic local hyperslabs also include ghostzones */
my_local_startpoint = extras->ownership[i][0][vdim];
my_local_endpoint = extras->ownership[i][1][vdim];
- /* local hyperslabs include ghostzones, global ones don't */
- if (! is_global_hyperslab)
+ if (! is_global_hyperslab && ! GA->connectivity->perme[vdim])
{
my_local_startpoint -= extras->nghostzones[vdim];
my_local_endpoint += extras->nghostzones[vdim];
@@ -492,27 +481,22 @@ static CCTK_INT DefineMapping (const cGH *GH,
my_global_startpoint = extras->lb[myproc][vdim] + my_local_startpoint;
my_global_endpoint = extras->lb[myproc][vdim] + my_local_endpoint;
+ mapping->local_startpoint[vdim] = -1;
if (mapping->global_startpoint[vdim] >= 0 &&
mapping->global_startpoint[vdim] < my_global_endpoint)
{
- mapping->local_startpoint[vdim] = mapping->global_startpoint[vdim] -
- extras->lb[myproc][vdim];
- }
- else
- {
- mapping->local_startpoint[vdim] = -1;
+ mapping->local_startpoint[vdim] =
+ MAX (my_local_startpoint,
+ mapping->global_startpoint[vdim] - extras->lb[myproc][vdim]);
}
+ mapping->local_endpoint[vdim] = -1;
if (mapping->global_endpoint[vdim] > my_global_startpoint)
{
mapping->local_endpoint[vdim] =
MIN (my_local_endpoint,
mapping->global_endpoint[vdim] - extras->lb[myproc][vdim]);
}
- else
- {
- mapping->local_endpoint[vdim] = -1;
- }
#ifdef DEBUG
fprintf (stderr, "direction %d: global ranges [%d, %d), local ranges[%d, "
@@ -531,14 +515,9 @@ static CCTK_INT DefineMapping (const cGH *GH,
if (mapping->do_dir[vdim])
{
/* compute the local size in each hyperslab dimension */
- mapping->local_hsize[dim] = (mapping->local_endpoint[vdim] -
- mapping->local_startpoint[vdim]) /
- mapping->downsample[vdim];
- if ((mapping->local_endpoint[vdim] - mapping->local_startpoint[vdim]) %
- mapping->downsample[vdim])
- {
- mapping->local_hsize[dim]++;
- }
+ mapping->local_hsize[dim] =
+ (mapping->local_endpoint[vdim] - mapping->local_startpoint[vdim] +
+ mapping->downsample[vdim]-1) / mapping->downsample[vdim];
mapping->totals *= mapping->local_hsize[dim];
dim++;
}
@@ -559,17 +538,21 @@ static CCTK_INT DefineMapping (const cGH *GH,
{
if (mapping->do_dir[vdim])
{
- if (mapping->is_full_hyperslab)
- {
- mapping->global_hoffset[dim] = extras->lb[myproc][vdim];
- }
- else
+ mapping->global_hoffset[dim] = extras->lb[myproc][vdim];
+ if (! mapping->is_full_hyperslab)
{
mapping->global_hoffset[dim] = (mapping->global_startpoint[vdim] -
- origin[vdim]) / mapping->downsample[vdim];
+ origin[vdim]) / mapping->downsample[vdim];
if (GA->connectivity->perme[vdim])
{
- mapping->global_hoffset[dim] -= extras->nghostzones[vdim];
+ if (mapping->global_hoffset[dim] < extras->nghostzones[vdim])
+ {
+ mapping->global_hoffset[dim] = 0;
+ }
+ else
+ {
+ mapping->global_hoffset[dim] -= extras->nghostzones[vdim];
+ }
}
}
#ifdef DEBUG