Something like this?
/*=========================================================================== BrusierRestrict
The way this routine should work:
Pass in the values of the fine level and the course level, Pass in the grid hierarchy and a grid function or set of grid functions Call the half-weighted restriction operator(s) for said grid functions(s) For any coarse grid points adjacent to inner boundary points, replace these points with injected/"straight copy" data from the fine grid
Note: currently calling ref_restric_all, but I don't really want to restrict "all" grid functions. Just some of them...
Much of this routine was "lifted" from LSUDevelopment/Refluxing/src/correct.cc ===========================================================================*/ namespace variables {
char const * restrict const soln[] = { "BruiserConstraints::phi", "BruiserConstraints::wx", "BruiserConstraints::wy", "BruiserConstraints::wz", NULL };
char const * restrict const rhs[] = { "BruiserConstraints::rhsphi", "BruiserConstraints::rhswx", "BruiserConstraints::rhswy", "BruiserConstraints::rhswz", NULL };
char const * restrict const none[] = { NULL };
} // namespace variables
static void get_varinds (cGH const * restrict const cctkGH, char const * restrict const * restrict const names, vector<int>& gis, vector<int>& vis) { int nvars = 0; while (names[nvars]) ++nvars; assert (gis.empty()); assert (vis.empty()); gis.reserve(nvars); vis.reserve(nvars); }
void BruiserRestrict(CCTK_ARGUMENTS) {
DECLARE_CCTK_PARAMETERS;
CCTK_VInfo(CCTK_THORNSTRING,"reflevel = %d, mglevel = %d", reflevel,mglevel);
CCTK_WARN(0,"BruiserRestrict: No clue what to do here. Aborting."); /* Something like... */ vector<int> gis, vis; get_varinds (cctkGH, variables::soln, gis, vis); CCTK_INT const nvars = gis.size(); int const tl = 0; CCTK_REAL time = 0.0;
int const coarse_vi = CCTK_VarIndex ("Brusier::phi"); // What about other variables: wx, wy, and wz? int const coarse_gi = CCTK_GroupIndexFromVarI (coarse_vi); assert (coarse_gi >= 0); int const coarse_v0 = CCTK_FirstVarIndexI (coarse_gi); assert (coarse_v0 >= 0);
int const fine_vi = CCTK_VarIndex ("Brusier::phi");
for (comm_state state; not state.done(); state.step()) { for (int m=0; m<maps; ++m) { ggf *const gv = arrdata.AT(coarse_gi).AT(m).data. AT(coarse_vi - coarse_v0); // This subtraction does what? gv->ref_restrict_all (state, tl, reflevel, mglevel, time); } } // for state }