From 313504329f18e0bba86b7cf05c7a95a167e085f5 Mon Sep 17 00:00:00 2001 From: schnetter <> Date: Wed, 9 Jan 2002 20:15:00 +0000 Subject: Made multiple multigrid levels for the special case of a single Made multiple multigrid levels for the special case of a single multigrid level "work". That is, it runs wavetoy. darcs-hash:20020109201510-07bb3-1459e6d1a6ceca29b86c91fbbac6139e30581931.gz --- Carpet/Carpet/src/Evolve.cc | 34 +++++++------ Carpet/Carpet/src/Initialise.cc | 100 ++++++++++++++++++++----------------- Carpet/Carpet/src/Recompose.cc | 7 +-- Carpet/Carpet/src/SetupGH.cc | 16 +++--- Carpet/Carpet/src/Shutdown.cc | 18 +++---- Carpet/Carpet/src/Storage.cc | 4 +- Carpet/Carpet/src/carpet_public.hh | 62 ++++++++++++----------- Carpet/Carpet/src/helpers.cc | 65 ++++++++++++++---------- Carpet/Carpet/src/variables.cc | 28 +++++------ 9 files changed, 183 insertions(+), 151 deletions(-) (limited to 'Carpet') diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index 6c68cbd82..14bf0d799 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -9,7 +9,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Evolve.cc,v 1.7 2002/01/09 17:45:39 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Evolve.cc,v 1.8 2002/01/09 21:15:10 schnetter Exp $"; @@ -66,15 +66,16 @@ namespace Carpet { Waypoint ("Evolving iteration %d...", cgh->cctk_iteration); - BEGIN_MGLEVEL_LOOP(cgh) { - if ((cgh->cctk_iteration-1) % mglevelfact == 0) { + BEGIN_REFLEVEL_LOOP(cgh) { + const int do_every = maxreflevelfact/reflevelfact; + if ((cgh->cctk_iteration-1) % do_every == 0) { - Waypoint ("Evolving multigrid level %d...", mglevel); - - BEGIN_REFLEVEL_LOOP(cgh) { + BEGIN_MGLEVEL_LOOP(cgh) { const int do_every = mglevelfact * maxreflevelfact/reflevelfact; if ((cgh->cctk_iteration-1) % do_every == 0) { + Waypoint ("Evolving multigrid level %d...", mglevel); + // Cycle time levels CycleTimeLevels (cgh); @@ -110,19 +111,20 @@ namespace Carpet { // Checking PoisonCheck (cgh, currenttimebutnotifonly); - // Recompose grid hierarchy - Recompose (cgh); - } - } END_REFLEVEL_LOOP(cgh); + } END_MGLEVEL_LOOP(cgh); + + // Recompose grid hierarchy + Recompose (cgh); } - } END_MGLEVEL_LOOP(cgh); + } END_REFLEVEL_LOOP(cgh); - BEGIN_MGLEVEL_LOOP(cgh) { - if (cgh->cctk_iteration % mglevelfact == 0) { + BEGIN_REVERSE_REFLEVEL_LOOP(cgh) { + const int do_every = maxreflevelfact/reflevelfact; + if (cgh->cctk_iteration % do_every == 0) { - BEGIN_REVERSE_REFLEVEL_LOOP(cgh) { + BEGIN_MGLEVEL_LOOP(cgh) { const int do_every = mglevelfact * maxreflevelfact/reflevelfact; if (cgh->cctk_iteration % do_every == 0) { @@ -148,10 +150,10 @@ namespace Carpet { CheckChecksums (cgh, alltimes); } - } END_REVERSE_REFLEVEL_LOOP(cgh); + } END_MGLEVEL_LOOP(cgh); } - } END_MGLEVEL_LOOP(cgh); + } END_REVERSE_REFLEVEL_LOOP(cgh); } // main loop diff --git a/Carpet/Carpet/src/Initialise.cc b/Carpet/Carpet/src/Initialise.cc index a10a3bb3d..aeafbb3d5 100644 --- a/Carpet/Carpet/src/Initialise.cc +++ b/Carpet/Carpet/src/Initialise.cc @@ -9,7 +9,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Initialise.cc,v 1.4 2002/01/09 17:45:39 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Initialise.cc,v 1.5 2002/01/09 21:15:10 schnetter Exp $"; @@ -42,41 +42,47 @@ namespace Carpet { CCTKi_InitGHExtensions (cgh); // Check parameters + set_mglevel (cgh, 0); Waypoint ("PARAMCHECK"); CCTK_ScheduleTraverse ("CCTK_PARAMCHECK", cgh, CallFunction); CCTKi_FinaliseParamWarn(); + set_mglevel (cgh, -1); Waypoint ("Initialising iteration %d...", cgh->cctk_iteration); BEGIN_REFLEVEL_LOOP(cgh) { - // Checking - Poison (cgh, alltimes); - - // Set up the grid - Waypoint ("%*sScheduling BASEGRID", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_BASEGRID", cgh, CallFunction); - if (reflevel==0) { - base_delta_time = cgh->cctk_delta_time; - } else { + BEGIN_MGLEVEL_LOOP(cgh) { + + // Checking + Poison (cgh, alltimes); + + // Set up the grid + Waypoint ("%*sScheduling BASEGRID", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_BASEGRID", cgh, CallFunction); + if (reflevel==0) { + base_delta_time = cgh->cctk_delta_time; + } else { // assert (abs(cgh->cctk_delta_time - base_delta_time / reflevelfactor) // < 1e-6 * base_delta_time); // This circumvents a bug in CactusBase/Time cgh->cctk_delta_time = base_delta_time / reflevelfact; - } - - // Set up the initial data - Waypoint ("%*sScheduling INITIAL", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_INITIAL", cgh, CallFunction); - Waypoint ("%*sScheduling POSTINITIAL", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_POSTINITIAL", cgh, CallFunction); - - // Poststep - Waypoint ("%*sScheduling POSTSTEP", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_POSTSTEP", cgh, CallFunction); - - // Checking - PoisonCheck (cgh, alltimes); + } + + // Set up the initial data + Waypoint ("%*sScheduling INITIAL", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_INITIAL", cgh, CallFunction); + Waypoint ("%*sScheduling POSTINITIAL", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_POSTINITIAL", cgh, CallFunction); + + // Poststep + Waypoint ("%*sScheduling POSTSTEP", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_POSTSTEP", cgh, CallFunction); + + // Checking + PoisonCheck (cgh, alltimes); + + } END_MGLEVEL_LOOP(cgh); // Recompose grid hierarchy Recompose (cgh); @@ -85,28 +91,32 @@ namespace Carpet { BEGIN_REVERSE_REFLEVEL_LOOP(cgh) { - // Restrict - Restrict (cgh); - - // Checking - CalculateChecksums (cgh, allbutcurrenttime); - - // Recover - Waypoint ("%*sScheduling RECOVER_VARIABLES", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_RECOVER_VARIABLES", cgh, CallFunction); - Waypoint ("%*sScheduling CPINITIAL", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_CPINITIAL", cgh, CallFunction); - - // Analysis - Waypoint ("%*sScheduling ANALYSIS", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_ANALYSIS", cgh, CallFunction); - - // Output - Waypoint ("%*sOutputGH", 2*reflevel, ""); - CCTK_OutputGH (cgh); + BEGIN_MGLEVEL_LOOP(cgh) { + + // Restrict + Restrict (cgh); + + // Checking + CalculateChecksums (cgh, allbutcurrenttime); + + // Recover + Waypoint ("%*sScheduling RECOVER_VARIABLES", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_RECOVER_VARIABLES", cgh, CallFunction); + Waypoint ("%*sScheduling CPINITIAL", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_CPINITIAL", cgh, CallFunction); + + // Analysis + Waypoint ("%*sScheduling ANALYSIS", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_ANALYSIS", cgh, CallFunction); + + // Output + Waypoint ("%*sOutputGH", 2*reflevel, ""); + CCTK_OutputGH (cgh); - // Checking - CheckChecksums (cgh, allbutcurrenttime); + // Checking + CheckChecksums (cgh, allbutcurrenttime); + + } END_MGLEVEL_LOOP(cgh); } END_REVERSE_REFLEVEL_LOOP(cgh); diff --git a/Carpet/Carpet/src/Recompose.cc b/Carpet/Carpet/src/Recompose.cc index 544e2406e..a389a2429 100644 --- a/Carpet/Carpet/src/Recompose.cc +++ b/Carpet/Carpet/src/Recompose.cc @@ -15,7 +15,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Recompose.cc,v 1.16 2002/01/09 17:45:39 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Recompose.cc,v 1.17 2002/01/09 21:15:10 schnetter Exp $"; @@ -83,8 +83,6 @@ namespace Carpet { void RegisterRecomposeRegions (const gh::rexts& bbsss, const gh::rprocs& pss) { - assert (mglevel == 0); - // Check the regions CheckRegions (bbsss, pss); // Save the region information for the next regridding @@ -97,10 +95,9 @@ namespace Carpet { void Recompose (const cGH* cgh) { + assert (mglevel == -1); assert (component == -1); - if (mglevel > 0) return; - Waypoint ("%*sRecompose", 2*reflevel, ""); // Check whether to recompose diff --git a/Carpet/Carpet/src/SetupGH.cc b/Carpet/Carpet/src/SetupGH.cc index faa8a4561..ddae9d662 100644 --- a/Carpet/Carpet/src/SetupGH.cc +++ b/Carpet/Carpet/src/SetupGH.cc @@ -12,7 +12,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/SetupGH.cc,v 1.19 2002/01/09 17:45:40 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/SetupGH.cc,v 1.20 2002/01/09 21:15:10 schnetter Exp $"; @@ -243,7 +243,7 @@ namespace Carpet { // Initialise current position reflevel = 0; - mglevel = 0; + mglevel = -1; component = -1; // Invent a refinement structure @@ -273,16 +273,20 @@ namespace Carpet { iteration.resize(maxreflevels, 0); // Set current position (this time for real) - set_mglevel (cgh, 0); set_reflevel (cgh, 0); + set_mglevel (cgh, -1); set_component (cgh, -1); // Enable storage for all groups if desired // XXX if (true || enable_all_storage) { - for (int group=0; groupGH[convlev]; + set_mglevel (cgh, 0); + // Terminate - BEGIN_REFLEVEL_LOOP(cgh) { - Waypoint ("%*sScheduling TERMINATE", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_TERMINATE", cgh, CallFunction); - } END_REFLEVEL_LOOP(cgh); + Waypoint ("%*sScheduling TERMINATE", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_TERMINATE", cgh, CallFunction); // Shutdown - BEGIN_REFLEVEL_LOOP(cgh) { - Waypoint ("%*sScheduling SHUTDOWN", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_SHUTDOWN", cgh, CallFunction); - } END_REFLEVEL_LOOP(cgh); + Waypoint ("%*sScheduling SHUTDOWN", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_SHUTDOWN", cgh, CallFunction); + + set_mglevel (cgh, -1); CCTK_PRINTSEPARATOR; printf ("Done.\n"); diff --git a/Carpet/Carpet/src/Storage.cc b/Carpet/Carpet/src/Storage.cc index 18b49cc74..96bd542b8 100644 --- a/Carpet/Carpet/src/Storage.cc +++ b/Carpet/Carpet/src/Storage.cc @@ -9,7 +9,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Storage.cc,v 1.7 2001/12/14 16:39:08 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Storage.cc,v 1.8 2002/01/09 21:15:10 schnetter Exp $"; @@ -83,7 +83,7 @@ namespace Carpet { } // for // Reinitialise Cactus variables - set_component (cgh, component); + if (component!=-1) set_component (cgh, component); PoisonGroup (cgh, group, alltimes); // storage was not enabled previously diff --git a/Carpet/Carpet/src/carpet_public.hh b/Carpet/Carpet/src/carpet_public.hh index c16fd743a..3257002f1 100644 --- a/Carpet/Carpet/src/carpet_public.hh +++ b/Carpet/Carpet/src/carpet_public.hh @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/carpet_public.hh,v 1.14 2002/01/09 17:45:40 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/carpet_public.hh,v 1.15 2002/01/09 21:15:11 schnetter Exp $ // It is assumed that the number of components of all arrays is equal // to the number of components of the grid functions, and that their @@ -32,6 +32,12 @@ namespace Carpet { // Handle from CCTK_RegisterGHExtension extern int GHExtension; + // Refinement factor + extern int reffact; + + // Refinement factor on finest grid + extern int maxreflevelfact; + // Multigrid levels extern int mglevels; @@ -44,26 +50,20 @@ namespace Carpet { // Multigrid factor on coarsest grid extern int maxmglevelfact; - // Refinement factor - extern int reffact; - - // Refinement factor on finest grid - extern int maxreflevelfact; - // Current iteration per refinement level extern vector iteration; // Current position on the grid hierarchy - extern int mglevel; extern int reflevel; + extern int mglevel; extern int component; - // Current multigrid factor - extern int mglevelfact; - // Current refinement factor extern int reflevelfact; + // Current multigrid factor + extern int mglevelfact; + // Time step on base grid extern CCTK_REAL base_delta_time; @@ -154,24 +154,6 @@ namespace Carpet { - // Multigrid level iterator - -#define BEGIN_MGLEVEL_LOOP(cgh) \ - do { \ - int _mgl; \ - assert (mglevel==0); \ - for (int _ml=mglevels-1; _ml>=0; --_ml) { \ - set_mglevel ((cGH*)(cgh), _ml); \ - { -#define END_MGLEVEL_LOOP(cgh) \ - } \ - } \ - assert (mglevel==0); \ - _mgl = 0; \ - } while (0) - - - // Refinement level iterator #define BEGIN_REFLEVEL_LOOP(cgh) \ @@ -209,12 +191,33 @@ namespace Carpet { + // Multigrid level iterator + +#define BEGIN_MGLEVEL_LOOP(cgh) \ + do { \ + int _mgl; \ + assert (reflevel>=0 && reflevelreflevels()); \ + assert (mglevel==-1); \ + for (int _ml=mglevels-1; _ml>=0; --_ml) { \ + set_mglevel ((cGH*)(cgh), _ml); \ + { +#define END_MGLEVEL_LOOP(cgh) \ + } \ + } \ + set_mglevel ((cGH*)(cgh), -1); \ + assert (mglevel==-1); \ + _mgl = 0; \ + } while (0) + + + // Component iterator #define BEGIN_COMPONENT_LOOP(cgh) \ do { \ int _cl; \ assert (reflevel>=0 && reflevelreflevels()); \ + assert (mglevel>=0 && mglevelcomponents(reflevel); ++_c) { \ set_component ((cGH*)(cgh), _c); \ @@ -233,6 +236,7 @@ namespace Carpet { do { \ int _lcl; \ assert (reflevel>=0 && reflevelreflevels()); \ + assert (mglevel>=0 && mglevelcomponents(reflevel); ++_c) { \ if (hh->is_local(reflevel,_c)) { \ diff --git a/Carpet/Carpet/src/helpers.cc b/Carpet/Carpet/src/helpers.cc index 15a8c9f27..5e8b6ebbd 100644 --- a/Carpet/Carpet/src/helpers.cc +++ b/Carpet/Carpet/src/helpers.cc @@ -12,7 +12,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/helpers.cc,v 1.16 2002/01/09 17:45:40 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/helpers.cc,v 1.17 2002/01/09 21:15:11 schnetter Exp $"; @@ -176,45 +176,60 @@ namespace Carpet { - void set_mglevel (cGH* cgh, const int ml) + void set_reflevel (cGH* cgh, const int rl) { // Check - assert (ml>=0 && ml=0 && rlreflevels()); + assert (mglevel == -1); assert (component == -1); - mglevel = ml; - mglevelfact = ipow(mgfact, mglevel); - cgh->cctk_convlevel = mglevel; + // Change + reflevel = rl; + reflevelfact = ipow(reffact, reflevel); + vect::ref(cgh->cctk_levfac) = reflevelfact; } - void set_reflevel (cGH* cgh, const int rl) + void set_mglevel (cGH* cgh, const int ml) { // Check - assert (rl>=0 && rlreflevels()); + assert (ml==-1 || (ml>=0 && ml& base = hh->baseextent; - reflevelfact = ipow(reffact, reflevel); - cgh->cctk_delta_time = base_delta_time / reflevelfact * mglevelfact; - assert (all(base.shape() % base.stride() == 0)); - assert (all((base.shape() / base.stride()) % mglevelfact == 0)); - vect::ref(cgh->cctk_gsh) - = (((base.shape() / base.stride() - 1) / mglevelfact - + dd->lghosts + dd->ughosts) - * reflevelfact + 1); - vect::ref(cgh->cctk_levfac) = reflevelfact; - for (int group=0; group& base = arrdata[group].hh->baseextent; - vect::ref((int*)arrdata[group].info.gsh) + mglevel = ml; + mglevelfact = ipow(mgfact, mglevel); + cgh->cctk_convlevel = mglevel; + + // Set gsh + if (mglevel == -1) { + + cgh->cctk_delta_time = 0xdeadbeef; + vect::ref(cgh->cctk_gsh) = 0xdeadbeef; + for (int group=0; group::ref((int*)arrdata[group].info.gsh) = 0xdeadbeef; + } + + } else { + + const bbox& base = hh->baseextent; + cgh->cctk_delta_time = base_delta_time / reflevelfact * mglevelfact; + assert (all(base.shape() % base.stride() == 0)); + assert (all((base.shape() / base.stride()) % mglevelfact == 0)); + vect::ref(cgh->cctk_gsh) = (((base.shape() / base.stride() - 1) / mglevelfact - + arrdata[group].dd->lghosts + arrdata[group].dd->ughosts) + + dd->lghosts + dd->ughosts) * reflevelfact + 1); - } + for (int group=0; group& base = arrdata[group].hh->baseextent; + vect::ref((int*)arrdata[group].info.gsh) + = (((base.shape() / base.stride() - 1) / mglevelfact + + arrdata[group].dd->lghosts + arrdata[group].dd->ughosts) + * reflevelfact + 1); + } + + } // if mglevel != -1 } diff --git a/Carpet/Carpet/src/variables.cc b/Carpet/Carpet/src/variables.cc index a8a2a7c75..23c637099 100644 --- a/Carpet/Carpet/src/variables.cc +++ b/Carpet/Carpet/src/variables.cc @@ -5,7 +5,7 @@ #include "carpet.hh" -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/variables.cc,v 1.5 2002/01/09 17:45:40 schnetter Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/variables.cc,v 1.6 2002/01/09 21:15:11 schnetter Exp $"; @@ -18,15 +18,6 @@ namespace Carpet { // Handle from CCTK_RegisterGHExtension int GHExtension; - // Multigrid levels - int mglevels; - - // Multigrid factor - int mgfact; - - // Multigrid factor on coarsest grid - int maxmglevelfact; - // Maximum number of refinement levels int maxreflevels; @@ -36,20 +27,29 @@ namespace Carpet { // Refinement factor on finest grid int maxreflevelfact; + // Multigrid levels + int mglevels; + + // Multigrid factor + int mgfact; + + // Multigrid factor on coarsest grid + int maxmglevelfact; + // Current iteration per refinement level vector iteration; // Current position on the grid hierarchy - int mglevel; int reflevel; + int mglevel; int component; - // multigrid factor of current level: ipow(multigrid_factor, mglevel) - int mglevelfact; - // refinement factor of current level: ipow(refinement_factor, reflevel) int reflevelfact; + // multigrid factor of current level: ipow(multigrid_factor, mglevel) + int mglevelfact; + // Time step on base grid CCTK_REAL base_delta_time; -- cgit v1.2.3