From 3659afd1308d0dba95eae7ae5974dce3eda4a2e7 Mon Sep 17 00:00:00 2001 From: tradke Date: Tue, 24 Jun 2003 14:26:06 +0000 Subject: 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 --- src/Mapping.c | 77 +++++++++++++++++++++++------------------------------------ 1 file 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 -- cgit v1.2.3