From ece47455bad491c45b3136362e9239f505de23b9 Mon Sep 17 00:00:00 2001 From: eschnett <> Date: Thu, 1 Mar 2001 12:40:00 +0000 Subject: Initial revision darcs-hash:20010301124010-f6438-fca5ed1e25f84efd816aa0d13fc23b58add7195d.gz --- Carpet/CarpetSlab/src/carpetslab.cc | 455 +++++++++++++++++++++++++++++++++++ Carpet/CarpetSlab/src/carpetslab.hh | 36 +++ Carpet/CarpetSlab/src/make.code.defn | 4 +- 3 files changed, 493 insertions(+), 2 deletions(-) create mode 100644 Carpet/CarpetSlab/src/carpetslab.cc create mode 100644 Carpet/CarpetSlab/src/carpetslab.hh (limited to 'Carpet/CarpetSlab/src') diff --git a/Carpet/CarpetSlab/src/carpetslab.cc b/Carpet/CarpetSlab/src/carpetslab.cc new file mode 100644 index 000000000..e3b6548b5 --- /dev/null +++ b/Carpet/CarpetSlab/src/carpetslab.cc @@ -0,0 +1,455 @@ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetSlab/src/Attic/carpetslab.cc,v 1.1 2001/03/01 13:40:10 eschnett Exp $ + +#include +#include +#include + +#include + +#include "cctk.h" + +#include "Carpet/CarpetLib/src/bbox.hh" +#include "Carpet/CarpetLib/src/gdata.hh" +#include "Carpet/CarpetLib/src/dh.hh" +#include "Carpet/CarpetLib/src/ggf.hh" +#include "Carpet/CarpetLib/src/gh.hh" +#include "Carpet/CarpetLib/src/vect.hh" + +#include "Carpet/Carpet/src/carpet.hh" + +#include "carpetslab.hh" + +namespace Carpet { + + int Hyperslab_GetLocalHyperslab (cGH* cgh, + int n, + int tl, + int hdim, + const int origin [/*vdim*/], + const int dir [/*vdim*/], + const int len [/*hdim*/], + const int downsample [/*hdim*/], + void** hdata, + int hsize [/*hdim*/], + int ghsize [/*hdim*/], + int hoffset [/*hdim*/]) + { + // check current status + assert (mglevel>=0); + assert (reflevel>=0); + assert (component>=0); // local := this component + + // check arguments + assert (n>=0 && n=0); + assert (hdim>0 && hdim<=dim); + // the following assertion is too strict (better allow arbitrary values) + { + const int group = CCTK_GroupIndexFromVarI(n); + assert (group>=0); + switch (CCTK_GroupTypeFromVarI(n)) { + case CCTK_SCALAR: + abort(); + case CCTK_ARRAY: + { + assert (group<(int)arrdata.size()); + assert (arrdata[group].hh->is_local(reflevel, component)); + const bbox ext = + arrdata[group].dd->boxes[reflevel][component][mglevel].exterior; + for (int d=0; d= ext.lower()[d] / ext.stride()[d] + && origin[d] <= ext.upper()[d] / ext.stride()[d]); + } + } + break; + case CCTK_GF: + { + assert (group<(int)gfdata.size()); + assert (hh->is_local(reflevel, component)); + const bbox ext = + dd->boxes[reflevel][component][mglevel].exterior; + for (int d=0; d= ext.lower()[d] / ext.stride()[d] + && origin[d] <= ext.upper()[d] / ext.stride()[d]); + } + } + break; + default: + abort(); + } + } + // the following assertion is too strict (better allow arbitrary values) + for (int d=0; d0); + assert (hdata); + assert (hsize); + assert (ghsize); + assert (hoffset); + + // get variable info + const int group = CCTK_GroupIndexFromVarI(n); + assert (group>=0); + const int var = n - CCTK_FirstVarIndexI(group); + assert (var>=0); + + // get grid hierarchy data hierarchy and grid function + gh* myhh; + dh* mydd; + generic_gf* myff; + switch (CCTK_GroupTypeFromVarI(n)) { + case CCTK_SCALAR: + abort(); + case CCTK_ARRAY: + assert (group < (int)arrdata.size()); + myhh = arrdata[group].hh; + mydd = arrdata[group].dd; + assert (var < (int)arrdata[group].data.size()); + myff = arrdata[group].data[var]; + break; + case CCTK_GF: + myhh = hh; + mydd = dd; + assert (group < (int)gfdata.size()); + assert (var < (int)gfdata[group].data.size()); + myff = gfdata[group].data[var]; + break; + default: + abort(); + } + + // get data + const generic_data* mydata + = (*myff)(tl, reflevel, component, mglevel); + + // get local bounding box + assert (reflevel < (int)mydd->boxes.size()); + assert (component < (int)mydd->boxes[reflevel].size()); + assert (mglevel < (int)mydd->boxes[reflevel][component].size()); + const bbox intbox + = mydd->boxes[reflevel][component][mglevel].interior; + + // get global bounding box + assert (reflevel < (int)myhh->extents.size()); + assert (component < (int)myhh->extents[reflevel].size()); + assert (mglevel < (int)myhh->extents[reflevel][component].size()); + const bbox extbox = myhh->extents[reflevel][component][mglevel]; + assert (extbox.aligned_with(intbox)); + + // calculate more convenient representation of the direction + vect stride[hdim]; + // the following switch statement is written according to the definition + // of "dir". do not interchange the order of the case labels. + switch (hdim) { + case 1: + for (int d=0; d::dir(1); + stride[1] = vect::dir(2); + } else if (dir[1]==0) { + assert (dir[0]!=0 && dir[2]!=0); + stride[0] = vect::dir(0); + stride[1] = vect::dir(2); + } else if (dir[2]==0) { + assert (dir[0]!=0 && dir[1]!=0); + stride[0] = vect::dir(0); + stride[1] = vect::dir(1); + } else { + abort(); + } + for (int dd=0; dd lbound; + for (int d=0; d ubound = lbound; + for (int dd=0; dd box(lbound, ubound, intbox.stride()); + + // local size + int total_hsize = 1; + for (int dd=0; dd tmp = lbound; + for (int dd=0; dd glbound; + for (int d=0; d gubound = glbound; + for (int dd=0; dd tmp = glbound; + for (int dd=0; dd tmp = glbound; + for (int dd=0; ddproc() != CCTK_MyProc(cgh)) { + if (! myhh->is_local(reflevel, component)) { + *hdata = 0; + for (int dd=0; ddstorage(); + const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n)); + + int dest_index[hdim]; + for (int dd=0; dd src_index = lbound; + for (int dd=0; ddoffset(src_index); + + memcpy(dest + sz*di, src + sz*si, sz); + + for (int dd=0; dd=0); + assert (reflevel>=0); + + const int saved_component = component; + component = -1; + + // check arguments + assert (n>=0 && n=0); + assert (hdim>0 && hdim<=dim); + // the following assertion is too strict (better allow arbitrary values) + { + // TODO: make sure that origin is within the extent of this + // refinement / multigrid level + // (but no such extent is stored in dh) + const int group = CCTK_GroupIndexFromVarI(n); + assert (group>=0); + switch (CCTK_GroupTypeFromVarI(n)) { + case CCTK_SCALAR: + abort(); + case CCTK_ARRAY: + assert (group<(int)arrdata.size()); + break; + case CCTK_GF: + assert (group<(int)gfdata.size()); + break; + default: + abort(); + } + } + // the following assertion is too strict (better allow arbitrary values) + for (int d=0; d0); + assert (hdata); + assert (hsize); + + int collect_proc = target_proc; + if (collect_proc<0) collect_proc = 0; + + assert (hh->components(reflevel)>0); + *hdata = 0; + for (int dd=0; ddcomponents(reflevel); ++component) { + + void* myhdata; + int myhsize[hdim], ghsize[hdim], hoffset[hdim]; + + const int retval = Hyperslab_GetLocalHyperslab + (cgh, n, tl, hdim, origin, dir, len, downsample, + &myhdata, myhsize, ghsize, hoffset); + + int mytotalsize = 1; + for (int dd=0; dd