diff options
author | schnetter <> | 2002-01-11 16:19:00 +0000 |
---|---|---|
committer | schnetter <> | 2002-01-11 16:19:00 +0000 |
commit | f34dfb0a25cb9f18b87d3a89c45cbc099bcc7518 (patch) | |
tree | a4c53fa6d3bbe2a886ddd05f5f9aae96db146a4a /Carpet/CarpetRegrid | |
parent | b7eca3ba6f109f19209d9a37cbb1330d2ba51217 (diff) |
Restructured regridding. Instead of registering the new grid
Restructured regridding. Instead of registering the new grid
structure every time you want to regrid, you register a routine that
is called every time it is possible to regrid. This is much cleaner.
darcs-hash:20020111161945-07bb3-a03d269b8a81c5cc3e7196679535c3a4c21b3a78.gz
Diffstat (limited to 'Carpet/CarpetRegrid')
-rw-r--r-- | Carpet/CarpetRegrid/param.ccl | 40 | ||||
-rw-r--r-- | Carpet/CarpetRegrid/schedule.ccl | 6 | ||||
-rw-r--r-- | Carpet/CarpetRegrid/src/regrid.cc | 188 | ||||
-rw-r--r-- | Carpet/CarpetRegrid/src/regrid.hh | 19 |
4 files changed, 171 insertions, 82 deletions
diff --git a/Carpet/CarpetRegrid/param.ccl b/Carpet/CarpetRegrid/param.ccl index 0656918e7..eb2d7300f 100644 --- a/Carpet/CarpetRegrid/param.ccl +++ b/Carpet/CarpetRegrid/param.ccl @@ -1,5 +1,5 @@ # Parameter definitions for thorn CarpetRegrid -# $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/param.ccl,v 1.1 2001/12/14 16:34:38 schnetter Exp $ +# $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/param.ccl,v 1.2 2002/01/11 17:19:47 schnetter Exp $ @@ -29,86 +29,86 @@ KEYWORD refined_regions "Regions where the grid is refined" -# Regions specification for manual refinint +# Region specifications for manual refinement -CCTK_INT l1xmin "Lower boundary of level 1 box in x-direction" +CCTK_REAL l1xmin "Lower boundary of level 1 box in x-direction" { : :: "" } 0 -CCTK_INT l1ymin "Lower boundary of level 1 box in y-direction" +CCTK_REAL l1ymin "Lower boundary of level 1 box in y-direction" { : :: "" } 0 -CCTK_INT l1zmin "Lower boundary of level 1 box in z-direction" +CCTK_REAL l1zmin "Lower boundary of level 1 box in z-direction" { : :: "" } 0 -CCTK_INT l1xmax "Upper boundary of level 1 box in x-direction" +CCTK_REAL l1xmax "Upper boundary of level 1 box in x-direction" { : :: "" } -1 -CCTK_INT l1ymax "Upper boundary of level 1 box in y-direction" +CCTK_REAL l1ymax "Upper boundary of level 1 box in y-direction" { : :: "" } -1 -CCTK_INT l1zmax "Upper boundary of level 1 box in z-direction" +CCTK_REAL l1zmax "Upper boundary of level 1 box in z-direction" { : :: "" } -1 -CCTK_INT l2xmin "Lower boundary of level 2 box in x-direction" +CCTK_REAL l2xmin "Lower boundary of level 2 box in x-direction" { : :: "" } 0 -CCTK_INT l2ymin "Lower boundary of level 2 box in y-direction" +CCTK_REAL l2ymin "Lower boundary of level 2 box in y-direction" { : :: "" } 0 -CCTK_INT l2zmin "Lower boundary of level 2 box in z-direction" +CCTK_REAL l2zmin "Lower boundary of level 2 box in z-direction" { : :: "" } 0 -CCTK_INT l2xmax "Upper boundary of level 2 box in x-direction" +CCTK_REAL l2xmax "Upper boundary of level 2 box in x-direction" { : :: "" } -1 -CCTK_INT l2ymax "Upper boundary of level 2 box in y-direction" +CCTK_REAL l2ymax "Upper boundary of level 2 box in y-direction" { : :: "" } -1 -CCTK_INT l2zmax "Upper boundary of level 2 box in z-direction" +CCTK_REAL l2zmax "Upper boundary of level 2 box in z-direction" { : :: "" } -1 -CCTK_INT l3xmin "Lower boundary of level 3 box in x-direction" +CCTK_REAL l3xmin "Lower boundary of level 3 box in x-direction" { : :: "" } 0 -CCTK_INT l3ymin "Lower boundary of level 3 box in y-direction" +CCTK_REAL l3ymin "Lower boundary of level 3 box in y-direction" { : :: "" } 0 -CCTK_INT l3zmin "Lower boundary of level 3 box in z-direction" +CCTK_REAL l3zmin "Lower boundary of level 3 box in z-direction" { : :: "" } 0 -CCTK_INT l3xmax "Upper boundary of level 3 box in x-direction" +CCTK_REAL l3xmax "Upper boundary of level 3 box in x-direction" { : :: "" } -1 -CCTK_INT l3ymax "Upper boundary of level 3 box in y-direction" +CCTK_REAL l3ymax "Upper boundary of level 3 box in y-direction" { : :: "" } -1 -CCTK_INT l3zmax "Upper boundary of level 3 box in z-direction" +CCTK_REAL l3zmax "Upper boundary of level 3 box in z-direction" { : :: "" } -1 diff --git a/Carpet/CarpetRegrid/schedule.ccl b/Carpet/CarpetRegrid/schedule.ccl index 90bcaaacb..f667f7ec1 100644 --- a/Carpet/CarpetRegrid/schedule.ccl +++ b/Carpet/CarpetRegrid/schedule.ccl @@ -1,8 +1,8 @@ # Schedule definitions for thorn CarpetRegrid -# $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/schedule.ccl,v 1.2 2001/12/17 13:32:43 schnetter Exp $ +# $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/schedule.ccl,v 1.3 2002/01/11 17:19:47 schnetter Exp $ -schedule CarpetRegridRegrid at POSTSTEP as Driver_Regrid +schedule CarpetRegridStartup at STARTUP { LANG: C OPTIONS: global -} "Recompose the grid hierarchy (if desired)" +} "Register the regridding routine" diff --git a/Carpet/CarpetRegrid/src/regrid.cc b/Carpet/CarpetRegrid/src/regrid.cc index da3ea6edc..e8243fc4f 100644 --- a/Carpet/CarpetRegrid/src/regrid.cc +++ b/Carpet/CarpetRegrid/src/regrid.cc @@ -1,4 +1,5 @@ #include <assert.h> +#include <math.h> #include <stdarg.h> #include <stdlib.h> @@ -6,7 +7,6 @@ #include <vector> #include "cctk.h" -#include "cctk_Arguments.h" #include "cctk_Parameters.h" #include "Carpet/CarpetLib/src/bbox.hh" @@ -19,15 +19,10 @@ #include "carpet.hh" #include "regrid.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/src/regrid.cc,v 1.4 2002/01/09 17:45:42 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/src/regrid.cc,v 1.5 2002/01/11 17:19:48 schnetter Exp $"; -// That's a hack -namespace Carpet { - void Waypoint (const char* fmt, ...); -} - namespace CarpetRegrid { using namespace std; @@ -35,33 +30,45 @@ namespace CarpetRegrid { - int CarpetRegridRegrid (CCTK_ARGUMENTS) + int CarpetRegridStartup () + { + RegisterRegridRoutine (CarpetRegridRegrid); + return 0; + } + + + + int CarpetRegridRegrid (const cGH * const cctkGH, + gh<dim>::rexts& bbsss, + gh<dim>::rprocs& pss) { - DECLARE_CCTK_ARGUMENTS; DECLARE_CCTK_PARAMETERS; + assert (regrid_every == -1 || regrid_every == 0 + || regrid_every % maxmglevelfact == 0); + // Return if no regridding is desired if (regrid_every == -1) return 0; +#if 0 // Return if this is not the main hierarchy if (mglevel != 0) return 0; +#endif + assert (mglevel == -1); // Return if this is the finest possible level if (reflevel == maxreflevels-1) return 0; // Return if we want to regrid during initial data only, and this // is not the time for initial data - if (regrid_every == 0 && cctk_iteration != 0) return 0; + if (regrid_every == 0 && cctkGH->cctk_iteration != 0) return 0; // Return if we want to regrid regularly, but not at this time - const int invfact = maxreflevelfact / reflevelfact; - if (regrid_every > 0 && cctk_iteration != 0 - && (cctk_iteration + invfact - 1) % regrid_every != 0) { + if (regrid_every > 0 && cctkGH->cctk_iteration != 0 + && cctkGH->cctk_iteration % regrid_every != 0) { return 0; } - Waypoint ("%*sRegrid", 2*reflevel, ""); - list<bbox<int,dim> > bbl; if (CCTK_EQUALS(refined_regions, "none")) { @@ -77,14 +84,14 @@ namespace CarpetRegrid { if (refinement_levels > 4) { CCTK_WARN (0, "Cannot currently specify manual refinement regions for more than 4 refinement levels"); } - assert (refinement_levels<4); - vector<vect<int,dim> > lower(3), upper(3); - lower[0] = vect<int,dim> (l1xmin, l1ymin, l1zmin); - upper[0] = vect<int,dim> (l1xmax, l1ymax, l1zmax); - lower[1] = vect<int,dim> (l2xmin, l2ymin, l2zmin); - upper[1] = vect<int,dim> (l2xmax, l2ymax, l2zmax); - lower[2] = vect<int,dim> (l3xmin, l3ymin, l3zmin); - upper[2] = vect<int,dim> (l3xmax, l3ymax, l3zmax); + assert (refinement_levels<=4); + vector<vect<CCTK_REAL,dim> > lower(3), upper(3); + lower[0] = vect<CCTK_REAL,dim> (l1xmin, l1ymin, l1zmin); + upper[0] = vect<CCTK_REAL,dim> (l1xmax, l1ymax, l1zmax); + lower[1] = vect<CCTK_REAL,dim> (l2xmin, l2ymin, l2zmin); + upper[1] = vect<CCTK_REAL,dim> (l2xmax, l2ymax, l2zmax); + lower[2] = vect<CCTK_REAL,dim> (l3xmin, l3ymin, l3zmin); + upper[2] = vect<CCTK_REAL,dim> (l3xmax, l3ymax, l3zmax); MakeRegions_AsSpecified (cctkGH, refinement_levels, lower, upper, bbl); } else if (CCTK_EQUALS(refined_regions, "automatic")) { @@ -128,7 +135,7 @@ namespace CarpetRegrid { gh<dim>::cexts bbss; bbss = hh->make_reflevel_multigrid_boxes(bbs, mglevels); - gh<dim>::rexts bbsss = hh->extents; + bbsss = hh->extents; if (bbss.size() == 0) { // TODO: this might not work bbsss.resize(reflevel+1); @@ -141,12 +148,9 @@ namespace CarpetRegrid { } } - gh<dim>::rprocs pss; MakeProcessors (cctkGH, bbsss, pss); - RegisterRecomposeRegions (bbsss, pss); - - return 0; + return 1; // do recompose } @@ -206,25 +210,39 @@ namespace CarpetRegrid { void MakeRegions_AsSpecified (const cGH* cctkGH, const int reflevels, - const vector<vect<int,dim> > lower, - const vector<vect<int,dim> > upper, + const vector<vect<CCTK_REAL,dim> > lower, + const vector<vect<CCTK_REAL,dim> > upper, list<bbox<int,dim> >& bbl) { assert (bbl.empty()); if (reflevel+1 >= reflevels) return; + vect<CCTK_REAL,dim> global_lower, global_upper; + for (int d=0; d<dim; ++d) { + const int ierr = CCTK_CoordRange + (cctkGH, &global_lower[d], &global_upper[d], d+1, 0, "cart3d"); + if (ierr<0) { + global_lower[d] = 0; + global_upper[d] = 1; + } + } + const vect<int,dim> global_extent (hh->baseextent.upper() - hh->baseextent.lower() + hh->baseextent.stride() * (dd->lghosts + dd->ughosts)); + const vect<int,dim> rstr = hh->baseextent.stride(); const vect<int,dim> rlb = hh->baseextent.lower(); const vect<int,dim> rub = hh->baseextent.upper(); const int rl = reflevel+1; + const vect<int,dim> ilower = map(floor, (lower[rl-1] - global_lower) / (global_upper - global_lower) * global_extent + 0.5); + const vect<int,dim> iupper = map(floor, (upper[rl-1] - global_lower) / (global_upper - global_lower) * global_extent + 0.5); + const int levfac = ipow(hh->reffact, rl); assert (all (rstr % levfac == 0)); const vect<int,dim> str (rstr / levfac); - const vect<int,dim> lb (lower[rl-1]); - const vect<int,dim> ub (upper[rl-1]); + const vect<int,dim> lb (ilower); + const vect<int,dim> ub (iupper); if (! all(lb>=rlb && ub<=rub)) { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "The refinement region boundaries for refinement level #%d are not within the main grid", rl); @@ -250,8 +268,26 @@ namespace CarpetRegrid { MakeRegions_Adaptively_Recombine (list<bbox<int,dim> >& bbl1, list<bbox<int,dim> >& bbl2, list<bbox<int,dim> >& bbl, - const bbox<int,dim>& iface) + const bbox<int,dim>& iface, + const int dir) { + assert (!iface.empty()); + assert (iface.lower()[dir] == iface.upper()[dir]); + + const int oldnumboxes = bbl.size() + bbl1.size() + bbl2.size(); + int numcombinedboxes = 0; + + int oldnumpoints = 0; + for (list<bbox<int,dim> >::const_iterator ibb = bbl.begin(); ibb != bbl.end(); ++ibb) { + oldnumpoints += ibb->num_points(); + } + for (list<bbox<int,dim> >::const_iterator ibb1 = bbl1.begin(); ibb1 != bbl1.end(); ++ibb1) { + oldnumpoints += ibb1->num_points(); + } + for (list<bbox<int,dim> >::const_iterator ibb2 = bbl2.begin(); ibb2 != bbl2.end(); ++ibb2) { + oldnumpoints += ibb2->num_points(); + } + #if 0 // remember old bounding boxes bboxset<int,dim> oldboxes; @@ -272,14 +308,21 @@ namespace CarpetRegrid { cout << bbl2 << endl; #endif + const vect<int,dim> lo = iface.lower(); + const vect<int,dim> up = iface.upper(); + const vect<int,dim> str = iface.stride(); + { // prune boxes on the left list<bbox<int,dim> >::iterator ibb1 = bbl1.begin(); while (ibb1 != bbl1.end()) { // is this bbox just to the left of the interface? - const bbox<int,dim> iface1 (ibb1->upper()+ibb1->stride(), ibb1->upper()+ibb1->stride(), ibb1->stride()); - assert (!iface1.empty()); - if (!iface1.is_contained_in(iface)) { +// const vect<int,dim> lo1 = ibb1->lower(); + const vect<int,dim> up1 = ibb1->upper(); + const vect<int,dim> str1 = ibb1->stride(); + assert (up1[dir]+str1[dir] <= lo[dir]); + assert (all(str1 == str)); + if (up1[dir]+str1[dir] < lo[dir]) { // no: forget it bbl.push_back (*ibb1); ibb1 = bbl1.erase(ibb1); @@ -294,9 +337,12 @@ namespace CarpetRegrid { list<bbox<int,dim> >::iterator ibb2 = bbl2.begin(); while (ibb2 != bbl2.end()) { // is this bbox just to the right of the interface? - const bbox<int,dim> iface2 (ibb2->lower(), ibb2->lower(), ibb2->stride()); - assert (!iface2.empty()); - if (! iface2.is_contained_in(iface)) { + const vect<int,dim> lo2 = ibb2->lower(); +// const vect<int,dim> up2 = ibb2->upper(); + const vect<int,dim> str2 = ibb2->stride(); + assert (up[dir] <= lo2[dir]); + assert (all(str2 == str)); + if (up[dir] < lo2[dir]) { // no: forget it bbl.push_back (*ibb2); ibb2 = bbl2.erase(ibb2); @@ -310,23 +356,34 @@ namespace CarpetRegrid { // walk all boxes on the left list<bbox<int,dim> >::iterator ibb1 = bbl1.begin(); while (ibb1 != bbl1.end()) { - const bbox<int,dim> iface1 (ibb1->upper()+ibb1->stride(), ibb1->upper()+ibb1->stride(), ibb1->stride()); - assert (iface1.is_contained_in(iface)); + vect<int,dim> lo1 = ibb1->lower(); + vect<int,dim> up1 = ibb1->upper(); + vect<int,dim> str1 = ibb1->stride(); + assert (up1[dir]+str1[dir] == lo[dir]); + lo1[dir] = lo[dir]; + up1[dir] = up[dir]; + const bbox<int,dim> iface1 (lo1,up1,str1); { // walk all boxes on the right list<bbox<int,dim> >::iterator ibb2 = bbl2.begin(); while (ibb2 != bbl2.end()) { - const bbox<int,dim> iface2 (ibb2->lower(), ibb2->lower(), ibb2->stride()); - assert (iface2.is_contained_in(iface)); + vect<int,dim> lo2 = ibb2->lower(); + vect<int,dim> up2 = ibb2->upper(); + vect<int,dim> str2 = ibb2->stride(); + assert (lo2[dir] == up[dir]); + lo2[dir] = lo[dir]; + up2[dir] = up[dir]; + const bbox<int,dim> iface2 (lo2,up2,str2); // check for a match if (iface1 == iface2) { - assert (all(ibb1->stride() == ibb2->stride())); - const bbox<int,dim> combined (ibb1->lower(), ibb2->upper(), ibb1->stride()); + const bbox<int,dim> combined (ibb1->lower(), ibb2->upper(), str); bbl.push_back (combined); ibb1 = bbl1.erase(ibb1); ibb2 = bbl2.erase(ibb2); + ++numcombinedboxes; + cout << "MRA: Combining along " << "xyz"[dir] << " to " << bbl.back() << " size " << bbl.back().num_points() << endl; goto continue_search; } @@ -342,6 +399,17 @@ namespace CarpetRegrid { bbl.splice (bbl.end(), bbl1); bbl.splice (bbl.end(), bbl2); + assert (bbl1.empty() && bbl2.empty()); + + const int newnumboxes = bbl.size(); + assert (newnumboxes + numcombinedboxes == oldnumboxes); + + int newnumpoints = 0; + for (list<bbox<int,dim> >::const_iterator ibb = bbl.begin(); ibb != bbl.end(); ++ibb) { + newnumpoints += ibb->num_points(); + } + assert (newnumpoints == oldnumpoints); + #if 0 // find new bounding boxes bboxset<int,dim> newboxes; @@ -363,7 +431,8 @@ namespace CarpetRegrid { static void MakeRegions_Adaptively (const cGH* const cctkGH, - const int minwidth, const double minfraction, + const int minwidth, + const CCTK_REAL minfraction, const CCTK_REAL maxerror, const data<CCTK_REAL,dim>& error, list<bbox<int,dim> >& bbl, @@ -378,7 +447,7 @@ namespace CarpetRegrid { if (error[*it] > maxerror) ++cnt; } const CCTK_REAL fraction = (CCTK_REAL)cnt / region.num_points(); - const int width = minval(region.shape() / region.stride()); + const int width = maxval(region.shape() / region.stride()); if (cnt == 0) { // Don't refine @@ -388,17 +457,19 @@ namespace CarpetRegrid { const vect<int,dim> up(region.upper()); const vect<int,dim> str(region.stride()); bbl.push_back (bbox<int,dim>(lo,up+str-str/reffact,str/reffact)); + cout << "MRA: Refining to " << bbl.back() << " size " << bbl.back().num_points() << " fraction " << fraction << endl; } else { // Split the region and check recursively - const int d = maxloc(region.shape()); + const int dir = maxloc(region.shape()); const vect<int,dim> lo(region.lower()); const vect<int,dim> up(region.upper()); const vect<int,dim> str(region.stride()); vect<int,dim> lo1(lo), lo2(lo); vect<int,dim> up1(up), up2(up); const int mgstr = ipow(hh->mgfact, mglevels); // honour multigrid factors - up1[d] = ((up[d]+lo[d])/2/str[d]/mgstr)*str[d]*mgstr; - lo2[d] = up1[d]+str[d]; + const int step = str[dir]*mgstr; + lo2[dir] = ((up[dir]+lo[dir])/2/step)*step; + up1[dir] = lo2[dir]-str[dir]; const bbox<int,dim> region1(lo1,up1,str); const bbox<int,dim> region2(lo2,up2,str); assert (region1.is_contained_in(region)); @@ -411,15 +482,18 @@ namespace CarpetRegrid { MakeRegions_Adaptively (cctkGH, minwidth, minfraction, maxerror, error, bbl2, region2); // Combine regions if possible - const bbox<int,dim> iface(lo2,lo2,str); - MakeRegions_Adaptively_Recombine (bbl1, bbl2, bbl, iface); + up2 += str-str/reffact; + up2[dir] = lo2[dir]; + const bbox<int,dim> iface(lo2,up2,str/reffact); + MakeRegions_Adaptively_Recombine (bbl1, bbl2, bbl, iface, dir); } } void MakeRegions_Adaptively (const cGH* const cctkGH, - const int minwidth, const double minfraction, + const int minwidth, + const CCTK_REAL minfraction, const CCTK_REAL maxerror, const gf<CCTK_REAL,dim>& error, list<bbox<int,dim> >& bbl) @@ -436,6 +510,8 @@ namespace CarpetRegrid { const int tl = 0; const int ml = 0; + cout << endl << "MRA: Choosing regions to refine in " << hh->components(rl) << " components" << endl; + for (int c=0; c<hh->components(rl); ++c) { const bbox<int,dim> region = hh->extents[rl][c][ml]; assert (! region.empty()); @@ -445,6 +521,12 @@ namespace CarpetRegrid { MakeRegions_Adaptively (cctkGH, minwidth, minfraction, maxerror, errdata, bbl, region); } + + int numpoints = 0; + for (list<bbox<int,dim> >::const_iterator ibb = bbl.begin(); ibb != bbl.end(); ++ibb) { + numpoints += ibb->num_points(); + } + cout << "MRA: Chose " << bbl.size() << " regions with a total size of " << numpoints << " to refine." << endl << endl; } } // namespace CarpetRegrid diff --git a/Carpet/CarpetRegrid/src/regrid.hh b/Carpet/CarpetRegrid/src/regrid.hh index 8779d6a38..0491816b8 100644 --- a/Carpet/CarpetRegrid/src/regrid.hh +++ b/Carpet/CarpetRegrid/src/regrid.hh @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/src/regrid.hh,v 1.1 2001/12/14 16:34:39 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/src/regrid.hh,v 1.2 2002/01/11 17:19:49 schnetter Exp $ #ifndef REGRID_HH #define REGRID_HH @@ -6,9 +6,9 @@ #include <list> #include "cctk.h" -#include "cctk_Arguments.h" #include "Carpet/CarpetLib/src/gf.hh" +#include "Carpet/CarpetLib/src/gh.hh" #include "carpet.hh" @@ -21,11 +21,17 @@ namespace CarpetRegrid { // scheduled functions extern "C" { - int CarpetRegridRegrid (CCTK_ARGUMENTS); + int CarpetRegridStartup (); } + int CarpetRegridRegrid (const cGH * const cctkGH, + gh<dim>::rexts& bbsss, + gh<dim>::rprocs& pss); + + + void MakeRegions_BaseLevel (const cGH* cctkGH, list<bbox<int,dim> >& bbl); @@ -33,12 +39,13 @@ namespace CarpetRegrid { list<bbox<int,dim> >& bbl); void MakeRegions_AsSpecified (const cGH* cctkGH, const int reflevels, - const vector<vect<int,dim> > lower, - const vector<vect<int,dim> > upper, + const vector<vect<CCTK_REAL,dim> > lower, + const vector<vect<CCTK_REAL,dim> > upper, list<bbox<int,dim> >& bbl); void MakeRegions_Adaptively (const cGH* cctkGH, - const int minwidth, const double minfraction, + const int minwidth, + const CCTK_REAL minfraction, const CCTK_REAL maxerror, const gf<CCTK_REAL,dim>& error, list<bbox<int,dim> >& bbl); |