diff options
author | schnetter <> | 2003-05-08 13:35:00 +0000 |
---|---|---|
committer | schnetter <> | 2003-05-08 13:35:00 +0000 |
commit | e639a79b9b9c715bc3213f2ed9fd7b80e509f9b3 (patch) | |
tree | ee121ff0ad95d5361cff3fe9d6af698131956010 /Carpet | |
parent | 53e40a949768a1161b57a8abc6cff5cb29384921 (diff) |
Implement a proper separation between global, level, and local mode.
Implement a proper separation between global, level, and local mode.
This is a major change that might break things.
darcs-hash:20030508133549-07bb3-95ccfb6eb2b64e72353d301afddd8722a92c64a3.gz
Diffstat (limited to 'Carpet')
-rw-r--r-- | Carpet/Carpet/src/CallFunction.cc | 9 | ||||
-rw-r--r-- | Carpet/Carpet/src/Evolve.cc | 32 | ||||
-rw-r--r-- | Carpet/Carpet/src/Initialise.cc | 32 | ||||
-rw-r--r-- | Carpet/Carpet/src/SetupGH.cc | 62 | ||||
-rw-r--r-- | Carpet/Carpet/src/Shutdown.cc | 28 | ||||
-rw-r--r-- | Carpet/Carpet/src/Storage.cc | 29 | ||||
-rw-r--r-- | Carpet/Carpet/src/carpet_public.hh | 19 | ||||
-rw-r--r-- | Carpet/Carpet/src/helpers.cc | 291 | ||||
-rw-r--r-- | Carpet/Carpet/src/variables.cc | 8 | ||||
-rw-r--r-- | Carpet/CarpetIOASCII/src/ioascii.cc | 35 | ||||
-rw-r--r-- | Carpet/CarpetInterp/src/interp.cc | 15 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/dh.cc | 6 | ||||
-rw-r--r-- | Carpet/README | 8 |
13 files changed, 333 insertions, 241 deletions
diff --git a/Carpet/Carpet/src/CallFunction.cc b/Carpet/Carpet/src/CallFunction.cc index a1b45641c..b1cd011d5 100644 --- a/Carpet/Carpet/src/CallFunction.cc +++ b/Carpet/Carpet/src/CallFunction.cc @@ -9,7 +9,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/CallFunction.cc,v 1.7 2003/05/07 10:03:21 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/CallFunction.cc,v 1.8 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_CallFunction_cc); } @@ -24,17 +24,14 @@ namespace Carpet { // Traverse one function on all components of one refinement level // of one multigrid level - assert (mglevel>=0); - assert (reflevel>=0); - // Checkpoint ("%*sStarting CallFunction...", 2*reflevel, ""); cGH* cgh = (cGH*)data; - if (attribute->global) { + if (attribute->global || reflevel==-1) { // Global operation: call once - if (reflevel==0) { + if (do_global_mode) { Waypoint ("%*sGlobal mode call at %s to %s::%s", 2*reflevel, "", attribute->where, attribute->thorn, attribute->routine); const int res = CCTK_CallFunction (function, attribute, data); diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index 5bdceab86..b20b7d1cd 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -18,7 +18,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Evolve.cc,v 1.20 2003/05/07 10:03:21 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Evolve.cc,v 1.21 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_Evolve_cc); } @@ -114,6 +114,10 @@ namespace Carpet { initial_time = 0; #endif + int next_global_mode_iter_loop1 = 0; + int next_global_mode_iter_loop2 = 0; + int next_global_mode_iter_loop3 = 0; + // Main loop while (! do_terminate(cgh, cgh->cctk_time, cgh->cctk_iteration)) { @@ -130,14 +134,19 @@ namespace Carpet { const int do_every = mglevelfact * maxreflevelfact/reflevelfact; if ((cgh->cctk_iteration-1) % do_every == 0) { + do_global_mode = cgh->cctk_iteration >= next_global_mode_iter_loop1; + next_global_mode_iter_loop1 = cgh->cctk_iteration + 1; + // Advance level times tt->advance_time (reflevel, mglevel); + // TODO: set cctk_time in set_mglevel cgh->cctk_time = tt->time (0, reflevel, mglevel) * base_delta_time; - Waypoint ("%*sCurrent time is %g", 2*reflevel, "", - cgh->cctk_time); + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); // Cycle time levels CycleTimeLevels (cgh); @@ -180,16 +189,20 @@ namespace Carpet { const int do_every = mglevelfact * maxreflevelfact/reflevelfact; if (cgh->cctk_iteration % do_every == 0) { + do_global_mode = cgh->cctk_iteration >= next_global_mode_iter_loop2; + next_global_mode_iter_loop2 = cgh->cctk_iteration + 1; + cgh->cctk_time = tt->time (0, reflevel, mglevel) * base_delta_time; // Restrict - Waypoint ("%*sCurrent time is %g", 2*reflevel, "", - cgh->cctk_time); + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); Restrict (cgh); Waypoint ("%*sScheduling POSTRESTRICT", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_POSTRESTRICT", cgh, CallFunction); + CCTK_ScheduleTraverse ("POSTRESTRICT", cgh, CallFunction); } } END_MGLEVEL_LOOP(cgh); @@ -207,8 +220,15 @@ namespace Carpet { const int do_every = mglevelfact * maxreflevelfact/reflevelfact; if (cgh->cctk_iteration % do_every == 0) { + do_global_mode = cgh->cctk_iteration >= next_global_mode_iter_loop3; + next_global_mode_iter_loop3 = cgh->cctk_iteration + 1; + cgh->cctk_time = tt->time (0, reflevel, mglevel) * base_delta_time; + + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); // Checkpoint Waypoint ("%*sScheduling CHECKPOINT", 2*reflevel, ""); diff --git a/Carpet/Carpet/src/Initialise.cc b/Carpet/Carpet/src/Initialise.cc index 5a79fca67..9dbc80b70 100644 --- a/Carpet/Carpet/src/Initialise.cc +++ b/Carpet/Carpet/src/Initialise.cc @@ -12,7 +12,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Initialise.cc,v 1.25 2003/05/02 14:22:32 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Initialise.cc,v 1.26 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_Initialise_cc); } @@ -43,6 +43,7 @@ namespace Carpet { // Initialise stuff cgh->cctk_iteration = 0; cgh->cctk_time = cctk_initial_time; + do_global_mode = true; // Enable storage and communtication CCTKi_ScheduleGHInit (cgh); @@ -51,12 +52,10 @@ namespace Carpet { CCTKi_InitGHExtensions (cgh); // Check parameters - set_mglevel (cgh, 0); Waypoint ("Current time is %g", cgh->cctk_time); Waypoint ("PARAMCHECK"); CCTK_ScheduleTraverse ("CCTK_PARAMCHECK", cgh, CallFunction); CCTKi_FinaliseParamWarn(); - set_mglevel (cgh, -1); Waypoint ("Initialising iteration %d...", cgh->cctk_iteration); @@ -66,7 +65,11 @@ namespace Carpet { BEGIN_MGLEVEL_LOOP(cgh) { - Waypoint ("%*sCurrent time is %g", 2*reflevel, "", cgh->cctk_time); + do_global_mode = reflevel == 0; + + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); // Checking Poison (cgh, alltimes); @@ -79,6 +82,9 @@ namespace Carpet { if (reflevel==0) { // Initialise time and time step on coarse grid base_delta_time = cgh->cctk_delta_time; + for (int d=0; d<dim; ++d) { + base_origin_space[d] = cgh->cctk_origin_space[d]; + } } else { // assert (abs(cgh->cctk_delta_time - base_delta_time / reflevelfactor) // < 1e-6 * base_delta_time); @@ -113,9 +119,16 @@ namespace Carpet { BEGIN_MGLEVEL_LOOP(cgh) { + do_global_mode = reflevel == 0; + // Restrict - Waypoint ("%*sCurrent time is %g", 2*reflevel, "", cgh->cctk_time); + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); Restrict (cgh); + + Waypoint ("%*sScheduling POSTRESTRICT", 2*reflevel, ""); + CCTK_ScheduleTraverse ("POSTRESTRICT", cgh, CallFunction); } END_MGLEVEL_LOOP(cgh); @@ -134,6 +147,12 @@ namespace Carpet { BEGIN_MGLEVEL_LOOP(cgh) { + do_global_mode = reflevel == 0; + + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); + // Checking CalculateChecksums (cgh, allbutcurrenttime); @@ -258,6 +277,9 @@ namespace Carpet { // Restrict cout << "3TL rl=" << reflevel << " restricting" << endl; Restrict (cgh); + + Waypoint ("%*sScheduling POSTRESTRICT", 2*reflevel, ""); + CCTK_ScheduleTraverse ("POSTRESTRICT", cgh, CallFunction); // Flip time levels cout << "3TL rl=" << reflevel << " flipping" << endl; diff --git a/Carpet/Carpet/src/SetupGH.cc b/Carpet/Carpet/src/SetupGH.cc index 500b55a5e..3c109f352 100644 --- a/Carpet/Carpet/src/SetupGH.cc +++ b/Carpet/Carpet/src/SetupGH.cc @@ -19,7 +19,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/SetupGH.cc,v 1.40 2003/04/30 12:43:21 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/SetupGH.cc,v 1.41 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_SetupGH_cc); } @@ -346,13 +346,60 @@ namespace Carpet { } for (int group=0; group<CCTK_NumGroups(); ++group) { for (int d=0; d<dim; ++d) { - ((int*)arrdata[group].info.nghostzones)[d] - = arrdata[group].dd->lghosts[d]; + ((int*)arrdata[group].info.nghostzones)[d] = arrdata[group].dd->lghosts[d]; } } + for (int group=0; group<CCTK_NumGroups(); ++group) { + if (CCTK_GroupTypeI(group) != CCTK_GF) { + + const int rl = 0; + const int ml = 0; + const int c = CCTK_MyProc(cgh); + + const bbox<int,dim>& base = arrdata[group].hh->baseextent; + const vect<vect<bool,2>,dim>& obnds = arrdata[group].hh->outer_boundaries[rl][c]; + const bbox<int,dim>& ext = arrdata[group].dd->boxes[rl][c][ml].exterior; + + for (int d=0; d<dim; ++d) { + ((int*)arrdata[group].info.gsh )[d] = (base.shape() / base.stride())[d]; + ((int*)arrdata[group].info.lsh )[d] = (ext.shape() / ext.stride())[d]; + ((int*)arrdata[group].info.lbnd)[d] = (ext.lower() / ext.stride())[d]; + ((int*)arrdata[group].info.ubnd)[d] = (ext.upper() / ext.stride())[d]; + for (int f=0; f<2; ++f) { + ((int*)arrdata[group].info.bbox)[2*d+f] = obnds[d][f]; + } + + assert (arrdata[group].info.lsh[d]>=0 && arrdata[group].info.lsh[d]<=arrdata[group].info.gsh[d]); + assert (arrdata[group].info.lbnd[d]>=0 && arrdata[group].info.ubnd[d]<arrdata[group].info.gsh[d]); + assert (arrdata[group].info.ubnd[d]-arrdata[group].info.lbnd[d]+1 == arrdata[group].info.lsh[d]); + assert (arrdata[group].info.lbnd[d]<=arrdata[group].info.ubnd[d]+1); + } + + const int firstvar = CCTK_FirstVarIndexI (group); + const int numvars = CCTK_NumVarsInGroupI (group); + const int num_tl = CCTK_NumTimeLevelsFromVarI (firstvar); + + assert (rl>=0 && rl<(int)arrdata[group].dd->boxes.size()); + assert (c>=0 && c<(int)arrdata[group].dd->boxes[rl].size()); + assert (ml>=0 && ml<(int)arrdata[group].dd->boxes[rl][c].size()); + assert (arrdata[group].hh->is_local(rl,c)); + + assert (group<(int)arrdata.size()); + for (int var=0; var<numvars; ++var) { + assert (var<(int)arrdata[group].data.size()); + for (int tl=0; tl<num_tl; ++tl) { + cgh->data[firstvar+var][tl] = 0; + } + } + + } // if grouptype + } // for group + + + // Initialise current position - reflevel = 0; + reflevel = -1; mglevel = -1; component = -1; @@ -401,17 +448,12 @@ namespace Carpet { // Initialise time step on coarse grid base_delta_time = 1.0; + base_origin_space = vect<CCTK_REAL,dim>((CCTK_REAL)0); // Current iteration iteration.resize(maxreflevels, 0); - // Set current position (this time for real) - 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) { BEGIN_REFLEVEL_LOOP(cgh) { BEGIN_MGLEVEL_LOOP(cgh) { diff --git a/Carpet/Carpet/src/Shutdown.cc b/Carpet/Carpet/src/Shutdown.cc index 3f6bb1991..67759e342 100644 --- a/Carpet/Carpet/src/Shutdown.cc +++ b/Carpet/Carpet/src/Shutdown.cc @@ -10,7 +10,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Shutdown.cc,v 1.8 2002/10/24 10:39:39 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Shutdown.cc,v 1.9 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_Shutdown_cc); } @@ -31,20 +31,32 @@ namespace Carpet { const int convlev = 0; cGH* cgh = fc->GH[convlev]; - set_mglevel (cgh, 0); - Waypoint ("Current time is %g", cgh->cctk_time); - // Terminate - Waypoint ("%*sScheduling TERMINATE", 2*reflevel, ""); - CCTK_ScheduleTraverse ("CCTK_TERMINATE", cgh, CallFunction); + BEGIN_REFLEVEL_LOOP(cgh) { + + BEGIN_MGLEVEL_LOOP(cgh) { + + do_global_mode = reflevel == 0; + + Waypoint ("%*sCurrent time is %g%s", 2*reflevel, "", + cgh->cctk_time, + do_global_mode ? " (global time)" : ""); + + // Terminate + Waypoint ("%*sScheduling TERMINATE", 2*reflevel, ""); + CCTK_ScheduleTraverse ("CCTK_TERMINATE", cgh, CallFunction); + + } END_MGLEVEL_LOOP(cgh); + + } END_REFLEVEL_LOOP(cgh); + + do_global_mode = true; // Shutdown 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 322b51b27..50ae6793a 100644 --- a/Carpet/Carpet/src/Storage.cc +++ b/Carpet/Carpet/src/Storage.cc @@ -10,7 +10,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Storage.cc,v 1.15 2003/05/02 14:20:26 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Storage.cc,v 1.16 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_Storage_cc); } @@ -39,6 +39,9 @@ namespace Carpet { const int group = CCTK_GroupIndex(groupname); assert (group>=0 && group<CCTK_NumGroups()); + // No storage change in local mode + assert (! (component!=-1 && CCTK_GroupTypeI(group)==CCTK_GF)); + if (CCTK_QueryGroupStorageI(cgh, group)) { // storage was enabled previously return 1; @@ -96,10 +99,15 @@ namespace Carpet { default: UnsupportedVarType(n); } // switch + + if (CCTK_GroupTypeI(group) != CCTK_GF) { + for (int tl=0; tl<num_tl; ++tl) { + cgh->data[n][tl] = ((*arrdata[group].data[var]) (-tl, 0, 0, 0)->storage()); + } + } + } // for - // Reinitialise Cactus variables - if (component!=-1) set_component (cgh, component); PoisonGroup (cgh, group, alltimes); // storage was not enabled previously @@ -115,6 +123,9 @@ namespace Carpet { const int group = CCTK_GroupIndex(groupname); assert (group>=0 && group<CCTK_NumGroups()); + // No storage change in local mode + assert (! (component!=-1 && CCTK_GroupTypeI(group)==CCTK_GF)); + if (! CCTK_QueryGroupStorageI(cgh, group)) { // storage was disabled previously return 0; @@ -125,6 +136,9 @@ namespace Carpet { return 1; const int n0 = CCTK_FirstVarIndexI(group); + assert (n0>=0); + const int num_tl = CCTK_NumTimeLevelsFromVarI(n0); + assert (num_tl>0); assert (arrdata[group].data.size()); assert (arrdata[group].data[0]); @@ -141,11 +155,14 @@ namespace Carpet { UnsupportedVarType(n); } // switch arrdata[group].data[var] = 0; + + if (CCTK_GroupTypeI(group) != CCTK_GF) { + for (int tl=0; tl<num_tl; ++tl) { + cgh->data[n][tl] = 0; + } + } } // for - // Reinitialise Cactus variables - set_component (cgh, component); - // storage was not disabled previously return 1; } diff --git a/Carpet/Carpet/src/carpet_public.hh b/Carpet/Carpet/src/carpet_public.hh index d26ffaaee..3b65786f4 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.25 2003/05/05 14:57:28 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/carpet_public.hh,v 1.26 2003/05/08 15:35:49 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 @@ -71,9 +71,15 @@ namespace Carpet { // Current multigrid factor extern int mglevelfact; + // Is this the time for a global mode call? + extern bool do_global_mode; + // Time step on base grid extern CCTK_REAL base_delta_time; + // Spatial origin on base grid + extern vect<CCTK_REAL,dim> base_origin_space; + // Data for grid functions @@ -159,15 +165,15 @@ namespace Carpet { #define BEGIN_REFLEVEL_LOOP(cgh) \ do { \ int _rll; \ - assert (reflevel==0); \ + assert (reflevel==-1); \ for (int _rl=0; _rl<hh->reflevels(); ++_rl) { \ set_reflevel ((cGH*)(cgh), _rl); \ { #define END_REFLEVEL_LOOP(cgh) \ } \ } \ - set_reflevel ((cGH*)(cgh), 0); \ - assert (reflevel==0); \ + set_reflevel ((cGH*)(cgh), -1); \ + assert (reflevel==-1); \ _rll = 0; \ } while (0) @@ -178,14 +184,15 @@ namespace Carpet { #define BEGIN_REVERSE_REFLEVEL_LOOP(cgh) \ do { \ int _rrll; \ - assert (reflevel==0); \ + assert (reflevel==-1); \ for (int _rl=hh->reflevels()-1; _rl>=0; --_rl) { \ set_reflevel ((cGH*)(cgh), _rl); \ { #define END_REVERSE_REFLEVEL_LOOP(cgh) \ } \ } \ - assert (reflevel==0); \ + set_reflevel ((cGH*)(cgh), -1); \ + assert (reflevel==-1); \ _rrll = 0; \ } while (0) diff --git a/Carpet/Carpet/src/helpers.cc b/Carpet/Carpet/src/helpers.cc index 236d30c5a..743faad90 100644 --- a/Carpet/Carpet/src/helpers.cc +++ b/Carpet/Carpet/src/helpers.cc @@ -13,7 +13,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/helpers.cc,v 1.29 2003/05/02 14:21:23 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/helpers.cc,v 1.30 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_helpers_cc); } @@ -190,13 +190,19 @@ namespace Carpet { void set_reflevel (cGH* cgh, const int rl) { // Check - assert (rl>=0 && rl<maxreflevels && rl<hh->reflevels()); + assert (rl==-1 || (rl>=0 && rl<maxreflevels && rl<maxreflevels)); assert (mglevel == -1); assert (component == -1); // Change reflevel = rl; - reflevelfact = ipow(reffact, reflevel); + if (reflevel == -1) { + // global mode + reflevelfact = 0xdeadbeef; + } else { + // level mode or local mode + reflevelfact = ipow(reffact, reflevel); + } vect<int,dim>::ref(cgh->cctk_levfac) = reflevelfact; } @@ -206,6 +212,7 @@ namespace Carpet { { // Check assert (ml==-1 || (ml>=0 && ml<mglevels)); + assert (reflevel>=0 && reflevel<hh->reflevels()); assert (component == -1); // Change @@ -216,25 +223,45 @@ namespace Carpet { // Set gsh if (mglevel == -1) { + mglevelfact = 0xdeadbeef; + cgh->cctk_convlevel = 0xdeadbeef; + cgh->cctk_delta_time = 0xdeadbeef; + for (int d=0; d<dim; ++d) { + cgh->cctk_origin_space[d] = 0xdeadbeef; + } + vect<int,dim>::ref(cgh->cctk_gsh) = 0xdeadbeef; for (int group=0; group<CCTK_NumGroups(); ++group) { - vect<int,dim>::ref((int*)arrdata[group].info.gsh) = 0xdeadbeef; + if (CCTK_GroupTypeI(group) == CCTK_GF) { + vect<int,dim>::ref((int*)arrdata[group].info.gsh) = 0xdeadbeef; + } } } else { - const bbox<int,dim>& base = hh->baseextent; + mglevelfact = ipow(mgfact, mglevel); + cgh->cctk_convlevel = mglevel; + + // TODO: set cctk_time here as well 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<int,dim>::ref(cgh->cctk_gsh) - = (base.shape() / base.stride() - 1) / mglevelfact * reflevelfact + 1; + + { + const bbox<int,dim>& baseext = dd->bases[reflevel][mglevel].exterior; + for (int d=0; d<dim; ++d) { + cgh->cctk_origin_space[d] = base_origin_space[d] + cgh->cctk_delta_space[d] / cgh->cctk_levfac[d] * baseext.lower()[d] / baseext.stride()[d]; + } + } + + const bbox<int,dim>& baseext = dd->bases[reflevel][mglevel].exterior; + vect<int,dim>::ref(cgh->cctk_gsh) = baseext.shape() / baseext.stride(); for (int group=0; group<CCTK_NumGroups(); ++group) { - const bbox<int,dim>& base = arrdata[group].hh->baseextent; - vect<int,dim>::ref((int*)arrdata[group].info.gsh) - = ((base.shape() / base.stride() - 1) - / mglevelfact * reflevelfact + 1); + if (CCTK_GroupTypeI(group) == CCTK_GF) { + const bbox<int,dim>& baseext = arrdata[group].dd->bases[reflevel][mglevel].exterior; + for (int d=0; d<dim; ++d) { + ((int*)arrdata[group].info.gsh)[d] = (baseext.shape() / baseext.stride())[d]; + } + } } } // if mglevel != -1 @@ -250,11 +277,9 @@ namespace Carpet { assert (component==-1 || (mglevel>=0 && mglevel<hh->mglevels(reflevel,component))); - - // Set Cactus parameters if (component == -1) { - // Global mode -- no component is active + // Level mode -- no component is active for (int d=0; d<dim; ++d) { cgh->cctk_lsh[d] = 0xdeadbeef; @@ -267,168 +292,105 @@ namespace Carpet { } } + for (int group=0; group<CCTK_NumGroups(); ++group) { + if (CCTK_GroupTypeI(group) == CCTK_GF) { + + for (int d=0; d<dim; ++d) { + ((int*)arrdata[group].info.lsh)[d] = 0xdeadbeef; + ((int*)arrdata[group].info.bbox)[2*d ] = 0xdeadbeef; + ((int*)arrdata[group].info.bbox)[2*d+1] = 0xdeadbeef; + ((int*)arrdata[group].info.lbnd)[d] = 0xdeadbeef; + ((int*)arrdata[group].info.ubnd)[d] = 0xdeadbeef; + } + + const int firstvar = CCTK_FirstVarIndexI (group); + const int numvars = CCTK_NumVarsInGroupI (group); + const int num_tl = CCTK_NumTimeLevelsFromVarI (firstvar); + + assert (group<(int)arrdata.size()); + for (int var=0; var<numvars; ++var) { + assert (var<(int)arrdata[group].data.size()); + for (int tl=0; tl<num_tl; ++tl) { + cgh->data[firstvar+var][tl] = 0; + } + } + + } // if grouptype + } // for var + } else { // Local mode assert (reflevel>=0 && reflevel < (int)dd->boxes.size()); assert (component>=0 && component < (int)dd->boxes[reflevel].size()); - assert (mglevel>=0 - && mglevel < (int)dd->boxes[reflevel][component].size()); - const bbox<int,dim>& ext - = dd->boxes[reflevel][component][mglevel].exterior; + assert (mglevel>=0 && mglevel < (int)dd->boxes[reflevel][component].size()); + + const bbox<int,dim>& baseext = dd->bases[reflevel][mglevel].exterior; + const vect<vect<bool,2>,dim>& obnds = hh->outer_boundaries[reflevel][component]; + const bbox<int,dim>& ext = dd->boxes[reflevel][component][mglevel].exterior; + for (int d=0; d<dim; ++d) { + cgh->cctk_lsh[d] = (ext.shape() / ext.stride())[d]; - cgh->cctk_lbnd[d] = (ext.lower() / ext.stride())[d]; - cgh->cctk_ubnd[d] = (ext.upper() / ext.stride())[d]; - assert (cgh->cctk_lsh[d]>=0 && cgh->cctk_lsh[d]<=cgh->cctk_gsh[d]); -// assert (cgh->cctk_lbnd[d]>=0 && cgh->cctk_ubnd[d]<cgh->cctk_gsh[d]); - assert (cgh->cctk_ubnd[d]-cgh->cctk_lbnd[d]+1 == cgh->cctk_lsh[d]); - assert (cgh->cctk_lbnd[d]<=cgh->cctk_ubnd[d]+1); - cgh->cctk_bbox[2*d ] = hh->outer_boundaries[reflevel][component][d][0]; - cgh->cctk_bbox[2*d+1] = hh->outer_boundaries[reflevel][component][d][1]; + cgh->cctk_lbnd[d] = ((ext.lower() - baseext.lower()) / ext.stride())[d]; + cgh->cctk_ubnd[d] = ((ext.upper() - baseext.lower()) / ext.stride())[d]; + cgh->cctk_bbox[2*d ] = obnds[d][0]; + cgh->cctk_bbox[2*d+1] = obnds[d][1]; for (int stg=0; stg<CCTK_NSTAGGER; ++stg) { // TODO: support staggering cgh->cctk_lssh[CCTK_LSSH_IDX(stg,d)] = cgh->cctk_lsh[d]; } + + assert (cgh->cctk_lsh[d]>=0 && cgh->cctk_lsh[d]<=cgh->cctk_gsh[d]); + assert (cgh->cctk_lbnd[d]>=0 && cgh->cctk_ubnd[d]<cgh->cctk_gsh[d]); + assert (cgh->cctk_ubnd[d]-cgh->cctk_lbnd[d]+1 == cgh->cctk_lsh[d]); + assert (cgh->cctk_lbnd[d]<=cgh->cctk_ubnd[d]+1); + } - } // if local mode - - - - // Set Cactus parameters for all groups - for (int group=0; group<CCTK_NumGroups(); ++group) { - - if (mglevel == -1 - || (CCTK_GroupTypeI(group) == CCTK_GF - && component == -1)) { - // Global mode for a grid function: not active - - for (int d=0; d<dim; ++d) { - ((int*)arrdata[group].info.lsh)[d] = 0xdeadbeef; - ((int*)arrdata[group].info.bbox)[2*d ] = 0xdeadbeef; - ((int*)arrdata[group].info.bbox)[2*d+1] = 0xdeadbeef; - ((int*)arrdata[group].info.lbnd)[d] = 0xdeadbeef; - ((int*)arrdata[group].info.ubnd)[d] = 0xdeadbeef; - } - - } else { - // Local mode, or array or scalar: active - - int rl, c; - if (CCTK_GroupTypeI(group) == CCTK_GF) { - rl = reflevel; - c = component; - } else { - rl = 0; - c = CCTK_MyProc(cgh); - } - assert (rl>=0 && rl < (int)arrdata[group].dd->boxes.size()); - assert (c>=0 && c < (int)arrdata[group].dd->boxes[rl].size()); - assert (mglevel>=0 && mglevel < (int)dd->boxes[rl][c].size()); - const bbox<int,dim>& bext = arrdata[group].hh->baseextent; - const bbox<int,dim>& iext = arrdata[group].hh->extents[rl][c][mglevel]; - const bbox<int,dim>& ext - = arrdata[group].dd->boxes[rl][c][mglevel].exterior; - for (int d=0; d<dim; ++d) { - ((int*)arrdata[group].info.lsh)[d] - = (ext.shape() / ext.stride())[d]; - ((int*)arrdata[group].info.lbnd)[d] - = (ext.lower() / ext.stride())[d]; - ((int*)arrdata[group].info.ubnd)[d] - = (ext.upper() / ext.stride())[d]; - assert (arrdata[group].info.lsh[d]>=0 - && arrdata[group].info.lsh[d]<=arrdata[group].info.gsh[d]); -// assert (arrdata[group].info.lbnd[d]>=0 -// && arrdata[group].info.ubnd[d]<arrdata[group].info.gsh[d]); - assert (arrdata[group].info.ubnd[d]-arrdata[group].info.lbnd[d]+1 - == arrdata[group].info.lsh[d]); - assert (arrdata[group].info.lbnd[d]<=arrdata[group].info.ubnd[d]+1); - ((int*)arrdata[group].info.bbox)[2*d ] = hh->outer_boundaries[rl][c][d][0]; - ((int*)arrdata[group].info.bbox)[2*d+1] = hh->outer_boundaries[rl][c][d][1]; - } // for d - - } // if local mode - - } // for group - - - - // Set Cactus pointers to data - for (int n=0; n<CCTK_NumVars(); ++n) { - - const int group = CCTK_GroupIndexFromVarI(n); - assert (group>=0); - const int var = n - CCTK_FirstVarIndexI(group); - assert (var>=0); - const int num_tl = CCTK_NumTimeLevelsFromVarI(n); - assert (num_tl>0); + for (int group=0; group<CCTK_NumGroups(); ++group) { + if (CCTK_GroupTypeI(group) == CCTK_GF) { + + assert (reflevel>=0 && reflevel < (int)arrdata[group].dd->boxes.size()); + assert (component>=0 && component < (int)arrdata[group].dd->boxes[reflevel].size()); + assert (mglevel>=0 && mglevel < (int)arrdata[group].dd->boxes[reflevel][component].size()); + + const bbox<int,dim>& baseext = arrdata[group].dd->bases[reflevel][mglevel].exterior; + const vect<vect<bool,2>,dim>& obnds = arrdata[group].hh->outer_boundaries[reflevel][component]; + const bbox<int,dim>& ext = arrdata[group].dd->boxes[reflevel][component][mglevel].exterior; + + for (int d=0; d<dim; ++d) { + + ((int*)arrdata[group].info.lsh)[d] = (ext.shape() / ext.stride())[d]; + ((int*)arrdata[group].info.lbnd)[d] = ((ext.lower() - baseext.lower()) / ext.stride())[d]; + ((int*)arrdata[group].info.ubnd)[d] = ((ext.upper() - baseext.lower()) / ext.stride())[d]; + ((int*)arrdata[group].info.bbox)[2*d ] = obnds[d][0]; + ((int*)arrdata[group].info.bbox)[2*d+1] = obnds[d][1]; + + assert (arrdata[group].info.lsh[d]>=0 && arrdata[group].info.lsh[d]<=arrdata[group].info.gsh[d]); + assert (arrdata[group].info.lbnd[d]>=0 && arrdata[group].info.ubnd[d]<arrdata[group].info.gsh[d]); + assert (arrdata[group].info.ubnd[d]-arrdata[group].info.lbnd[d]+1 == arrdata[group].info.lsh[d]); + assert (arrdata[group].info.lbnd[d]<=arrdata[group].info.ubnd[d]+1); + } + + const int firstvar = CCTK_FirstVarIndexI (group); + const int numvars = CCTK_NumVarsInGroupI (group); + const int num_tl = CCTK_NumTimeLevelsFromVarI (firstvar); + + assert (hh->is_local(reflevel,component)); + + assert (group<(int)arrdata.size()); + for (int var=0; var<numvars; ++var) { + assert (var<(int)arrdata[group].data.size()); + for (int tl=0; tl<num_tl; ++tl) { + cgh->data[firstvar+var][tl] = ((*arrdata[group].data[var]) (-tl, reflevel, component, mglevel)->storage()); + } + } + + } // if grouptype + } // for group - for (int tl=0; tl<num_tl; ++tl) { - - if (mglevel != -1 - && CCTK_QueryGroupStorageI(cgh, group)) { - // Group has storage - - if (CCTK_GroupTypeI(group) == CCTK_GF) { - // It is a grid function - - if (component == -1) { - // Global mode - - // Grid functions cannot be accessed in global mode - cgh->data[n][tl] = 0; - - } else { - // local mode - - assert (reflevel>=0 && reflevel < (int)dd->boxes.size()); - assert (component>=0 - && component < (int)dd->boxes[reflevel].size()); - assert (mglevel>=0 - && mglevel < (int)dd->boxes[reflevel][component].size()); - - assert (group<(int)arrdata.size()); - assert (var<(int)arrdata[group].data.size()); - assert (arrdata[group].data[var]); - cgh->data[n][tl] - = ((*arrdata[group].data[var]) - (-tl, reflevel, component, mglevel)->storage()); - if (hh->is_local(reflevel,component)) { - assert (cgh->data[n][tl]); - } else { - assert (! cgh->data[n][tl]); - } - - } // if global mode - - } else { - // Scalars and arrays can always be accessed - - assert (group<(int)arrdata.size()); - assert (var<(int)arrdata[group].data.size()); - assert (arrdata[group].data[var]); - const int rl = 0; - const int c = CCTK_MyProc(cgh); - assert (rl>=0 && rl<(int)arrdata[group].dd->boxes.size()); - assert (c>=0 && c<(int)arrdata[group].dd->boxes[rl].size()); - assert (mglevel>=0 && mglevel < (int)dd->boxes[rl][c].size()); - assert (hh->is_local(reflevel,c)); - cgh->data[n][tl] - = ((*arrdata[group].data[var]) (-tl, rl, c, mglevel)->storage()); - assert (cgh->data[n][tl]); - - } // if scalar or array - - } else { - // Group has no storage - - cgh->data[n][tl] = 0; - - } // if has no storage - - } // for tl - } // for n + } // if local mode } @@ -452,7 +414,6 @@ namespace Carpet { int CallLocalFunction (cGH * const cgh, void (* const function) (cGH * const cgh)) { - assert (component == -1); BEGIN_LOCAL_COMPONENT_LOOP(cgh) { function (cgh); } END_LOCAL_COMPONENT_LOOP(cgh); diff --git a/Carpet/Carpet/src/variables.cc b/Carpet/Carpet/src/variables.cc index 4152cd0f4..6d7b2dc2e 100644 --- a/Carpet/Carpet/src/variables.cc +++ b/Carpet/Carpet/src/variables.cc @@ -6,7 +6,7 @@ #include "carpet.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/variables.cc,v 1.12 2003/01/03 15:49:36 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/variables.cc,v 1.13 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_Carpet_variables_cc); } @@ -53,9 +53,15 @@ namespace Carpet { // multigrid factor of current level: ipow(multigrid_factor, mglevel) int mglevelfact; + // Is this the time for a global mode call? + bool do_global_mode; + // Time step on base grid CCTK_REAL base_delta_time; + // Spatial origin on base grid + vect<CCTK_REAL,dim> base_origin_space; + // Data for grid functions diff --git a/Carpet/CarpetIOASCII/src/ioascii.cc b/Carpet/CarpetIOASCII/src/ioascii.cc index a978330c6..b81a45ed8 100644 --- a/Carpet/CarpetIOASCII/src/ioascii.cc +++ b/Carpet/CarpetIOASCII/src/ioascii.cc @@ -30,7 +30,7 @@ #include "ioascii.hh" extern "C" { - static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.46 2003/03/27 17:11:37 schnetter Exp $"; + static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.47 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_CarpetIOASCII_ioascii_cc); } @@ -393,20 +393,21 @@ namespace CarpetIOASCII { // coordinates const CCTK_REAL coord_time = cgh->cctk_time; vect<CCTK_REAL,dim> global_lower, global_upper; - for (int d=0; d<dim; ++d) { - const int ierr = CCTK_CoordRange - (cgh, &global_lower[d], &global_upper[d], d+1, 0, "cart3d"); - if (ierr<0) { + vect<CCTK_REAL,dim> coord_delta; + if (CCTK_GroupTypeI(group) == CCTK_GF) { + for (int d=0; d<dim; ++d) { + const int ierr = CCTK_CoordRange + (cgh, &global_lower[d], &global_upper[d], d+1, 0, "cart3d"); + assert (!ierr); + coord_delta[d] = cgh->cctk_delta_space[d] / maxreflevelfact; + } + } else { + for (int d=0; d<dim; ++d) { global_lower[d] = 0; global_upper[d] = 1; - } - } - const vect<int,dim> global_extent (hh->baseextent.upper() - hh->baseextent.lower()); - vect<CCTK_REAL,dim> coord_delta; - for (int d=0; d<dim; ++d) { - assert (global_extent[d] != 0); - coord_delta[d] = (global_upper[d] - global_lower[d]) / global_extent[d]; - } + coord_delta[d] = 1.0 / (cgh->cctk_gsh[d] - 1); + } + } // Note: don't permute the "coord_delta" and "data->extent().lower()" // (it seems that for gcc 2.95 you'll then pick up the // integer operator*) @@ -600,11 +601,11 @@ namespace CarpetIOASCII { CCTK_REAL lower, upper; CCTK_CoordRange (cgh, &lower, &upper, dir, 0, "cart3d"); - const int npoints = cgh->cctk_gsh[dir-1]; + assert (reflevel!=-1 && mglevel!=-1); + const int npoints = (hh->baseextent.shape()[dir-1] - hh->baseextent.stride()[dir-1]) / hh->bases[reflevel][mglevel].stride()[dir-1] + 1; const CCTK_REAL rindex = (coord - lower) / (upper - lower) * (npoints-1); - const int levfac = cgh->cctk_levfac[dir-1]; - int cindex = (int)floor(rindex / levfac + 0.5 + 1e-6) * levfac; + int cindex = (int)floor(rindex + 0.5 + 1e-6); if (cindex<0 || cindex>=npoints) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, @@ -712,7 +713,7 @@ namespace CarpetIOASCII { if (rank == 0) { assert (os.good()); - + os << "# iteration " << time << endl << "# time level " << tl << " refinement level " << rl << " component " << c << " multigrid level " << ml << endl diff --git a/Carpet/CarpetInterp/src/interp.cc b/Carpet/CarpetInterp/src/interp.cc index 9fe601901..0d34c7d53 100644 --- a/Carpet/CarpetInterp/src/interp.cc +++ b/Carpet/CarpetInterp/src/interp.cc @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.2 2003/05/02 15:59:37 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.3 2003/05/08 15:35:49 schnetter Exp $ #include <assert.h> #include <math.h> @@ -18,7 +18,7 @@ #include "interp.hh" extern "C" { - static char const * const rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.2 2003/05/02 15:59:37 schnetter Exp $"; + static char const * const rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.3 2003/05/08 15:35:49 schnetter Exp $"; CCTK_FILEVERSION(Carpet_CarpetInterp_interp_cc); } @@ -77,7 +77,8 @@ namespace CarpetInterp { - // We want to be in global mode + // We want to be in level mode + assert (reflevel != -1); if (hh->local_components(reflevel) != 1 && component != -1) { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot interpolate in local mode"); @@ -92,9 +93,11 @@ namespace CarpetInterp { assert (coord_system_name); rvect lower, upper; for (int d=0; d<dim; ++d) { - ierr = CCTK_CoordRange - (cgh, &lower[d], &upper[d], d+1, 0, coord_system_name); - assert (!ierr); +// ierr = CCTK_CoordRange +// (cgh, &lower[d], &upper[d], d+1, 0, coord_system_name); +// assert (!ierr); + lower[d] = cgh->cctk_origin_space[d]; + upper[d] = cgh->cctk_origin_space[d] + (cgh->cctk_gsh[d] - 1) * cgh->cctk_delta_space[d] / cgh->cctk_levfac[d]; } const ivect gsh (cgh->cctk_gsh ); diff --git a/Carpet/CarpetLib/src/dh.cc b/Carpet/CarpetLib/src/dh.cc index 9791b59a2..eb5bdd62f 100644 --- a/Carpet/CarpetLib/src/dh.cc +++ b/Carpet/CarpetLib/src/dh.cc @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/dh.cc,v 1.32 2003/05/07 10:04:16 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/dh.cc,v 1.33 2003/05/08 15:35:49 schnetter Exp $ #include <assert.h> @@ -416,7 +416,9 @@ void dh<D>::recompose (const int initialise_upto) { // Check that no boundaries are left over if (rl==0) assert (sync_not.empty()); +#if 0 assert (recv_not.empty()); +#endif } // Assert that the interior is received exactly once during @@ -442,7 +444,9 @@ void dh<D>::recompose (const int initialise_upto) { assert (new_sz + this_sz == old_sz); } } +#if 0 assert (intr.empty()); +#endif } } diff --git a/Carpet/README b/Carpet/README index a6cd536f6..5c6d174b6 100644 --- a/Carpet/README +++ b/Carpet/README @@ -1,11 +1,11 @@ -CVS info : $Header: /home/eschnett/C/carpet/Carpet/Carpet/README,v 1.9 2003/12/19 11:43:52 schnetter Exp $ +CVS info : $Header: /home/eschnett/C/carpet/Carpet/Carpet/README,v 1.1 2003/05/08 15:35:49 schnetter Exp $ Cactus Code Arrangement Carpet -Arrangement Author(s) : Erik Schnetter <schnetter@aei.mpg.de> -Arrangement Maintainer(s) : Erik Schnetter <schnetter@aei.mpg.de> +Arrangement Author(s) : Erik Schnetter <schnetter@uni-tuebingen.de> +Arrangement Maintainer(s) : Erik Schnetter <schnetter@uni-tuebingen.de> -------------------------------------------------------------------------- Purpose of the arrangement: This arrangement provides a parallel AMR (adaptive mesh refinement) -driver with MPI. See http://www.carpetcode.org/ for more information. +driver with MPI. |