aboutsummaryrefslogtreecommitdiff
path: root/Carpet/Carpet/src/Restrict.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/Carpet/src/Restrict.cc')
-rw-r--r--Carpet/Carpet/src/Restrict.cc105
1 files changed, 67 insertions, 38 deletions
diff --git a/Carpet/Carpet/src/Restrict.cc b/Carpet/Carpet/src/Restrict.cc
index e81a01771..06d87ef1a 100644
--- a/Carpet/Carpet/src/Restrict.cc
+++ b/Carpet/Carpet/src/Restrict.cc
@@ -10,7 +10,7 @@
#include "carpet.hh"
extern "C" {
- static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Restrict.cc,v 1.21 2003/08/10 21:59:51 schnetter Exp $";
+ static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Restrict.cc,v 1.22 2003/11/05 16:18:37 schnetter Exp $";
CCTK_FILEVERSION(Carpet_Carpet_Restrict_cc);
}
@@ -24,47 +24,76 @@ namespace Carpet {
void Restrict (const cGH* cgh)
{
+ assert (reflevel != -1);
+ assert (mglevel != -1);
assert (component == -1);
Checkpoint ("%*sRestrict", 2*reflevel, "");
- // Loop over grid functions with storage
- for (int group=0; group<CCTK_NumGroups(); ++group) {
- if (CCTK_GroupTypeI(group) == CCTK_GF
- && CCTK_QueryGroupStorageI(cgh, group)) {
- if (arrdata[group].do_transfer) {
- for (int var=0; var<(int)arrdata[group].data.size(); ++var) {
-
- const int tl = 0;
-
- // use background time here (which may not be modified by
- // the user)
- const CCTK_REAL time = tt->time (tl, reflevel, mglevel);
- const CCTK_REAL time1 = tt->time (0, reflevel, mglevel);
- const CCTK_REAL time2 = cgh->cctk_time / cgh->cctk_delta_time;
- assert (fabs((time1 - time2) / (fabs(time1) + fabs(time2) + fabs(cgh->cctk_delta_time))) < 1e-12);
-
- if (reflevel < hh->reflevels()-1) {
-
- for (int c=0; c<hh->components(reflevel); ++c) {
- arrdata[group].data[var]->ref_restrict
- (tl, reflevel, c, mglevel, time);
- }
- for (int c=0; c<arrdata[group].hh->components(reflevel); ++c) {
- arrdata[group].data[var]->sync (tl, reflevel, c, mglevel);
- }
-
- } // if not finest refinement level
-
- } // loop over variables
- } else {
- char * groupname = CCTK_GroupName(group);
- Checkpoint ("%*s(no restricting for group %s)",
- 2*reflevel, "", groupname);
- free (groupname);
- }
- } // if group has storage
- } // loop over groups
+ // Restrict
+ if (reflevel < hh->reflevels()-1) {
+ for (comm_state<dim> state; !state.done(); state.step()) {
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_GroupTypeI(group) == CCTK_GF) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ if (arrdata[group].do_transfer) {
+ for (int var=0; var<(int)arrdata[group].data.size(); ++var) {
+
+ const int tl = 0;
+
+ // use background time here (which may not be
+ // modified by the user)
+ const CCTK_REAL time = tt->time (tl, reflevel, mglevel);
+ const CCTK_REAL time1 = tt->time (0, reflevel, mglevel);
+ const CCTK_REAL time2 = cgh->cctk_time / cgh->cctk_delta_time;
+ assert (fabs((time1 - time2) / (fabs(time1) + fabs(time2) + fabs(cgh->cctk_delta_time))) < 1e-12);
+
+
+ for (int c=0; c<hh->components(reflevel); ++c) {
+ arrdata[group].data[var]->ref_restrict
+ (state, tl, reflevel, c, mglevel, time);
+ }
+
+ } // loop over variables
+ } else {
+ if (state.thestate==state_recv) {
+ char * groupname = CCTK_GroupName(group);
+ Checkpoint ("%*s(no restricting for group %s)",
+ 2*reflevel, "", groupname);
+ free (groupname);
+ }
+ } // if ! do_transfer
+ } // if group has storage
+ } // if grouptype == CCTK_GF
+ } // loop over groups
+ } // for state
+ } // if not finest refinement level
+
+
+
+ // Sync
+ if (reflevel < hh->reflevels()-1) {
+ for (comm_state<dim> state; !state.done(); state.step()) {
+ for (int group=0; group<CCTK_NumGroups(); ++group) {
+ if (CCTK_GroupTypeI(group) == CCTK_GF) {
+ if (CCTK_QueryGroupStorageI(cgh, group)) {
+ if (arrdata[group].do_transfer) {
+ for (int var=0; var<(int)arrdata[group].data.size(); ++var) {
+
+ const int tl = 0;
+
+ for (int c=0; c<arrdata[group].hh->components(reflevel); ++c) {
+ arrdata[group].data[var]->sync
+ (state, tl, reflevel, c, mglevel);
+ }
+
+ } // loop over variables
+ } // if do_transfer
+ } // if group has storage
+ } // if grouptype == CCTK_GF
+ } // loop over groups
+ } // for state
+ } // if not finest refinement level
}