From 36111464c327d7d80364578c6ffdc35705502afb Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Sun, 10 Apr 2005 17:51:00 +0000 Subject: CarpetLib: Resolve conflict after introducing mem class Resolve the conflict that exists between the patches that introduce the mem class conflicts and the option CarpetLib::use_collective_communication_buffers. darcs-hash:20050410175106-891bb-a66f3783fd8c897d65ed07f55b812e346b406baa.gz --- Carpet/CarpetLib/src/dh.cc | 48 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/Carpet/CarpetLib/src/dh.cc b/Carpet/CarpetLib/src/dh.cc index 9cca62ead..ece8e53a9 100644 --- a/Carpet/CarpetLib/src/dh.cc +++ b/Carpet/CarpetLib/src/dh.cc @@ -547,7 +547,34 @@ void dh::calculate_bases () void dh::save_time (bool do_prolongate) { - for (list::reverse_iterator f=gfs.rbegin(); f!=gfs.rend(); ++f) { + DECLARE_CCTK_PARAMETERS; + + // sort all grid functions into sets of the same vartype + vector ggfs; + for (list::iterator f = gfs.begin(); f != gfs.end(); ++f) { + gf_set newset; + newset.vartype = CCTK_VarTypeI ((*f)->varindex); + assert (newset.vartype >= 0); + int c; + for (c = 0; c < ggfs.size(); c++) { + if (newset.vartype == ggfs[c].vartype) { + break; + } + } + if (c == ggfs.size()) { + ggfs.push_back (newset); + } + ggfs[c].members.push_back (*f); + } + + // Use collective or single-component buffers for communication ? + if (! use_collective_communication_buffers) { + for (int c = 0; c < ggfs.size(); c++) { + ggfs[c].vartype = -1; + } + } + + for (list::iterator f=gfs.begin(); f!=gfs.end(); ++f) { (*f)->recompose_crop (); } for (int rl=0; rlrecompose_fill (state, rl, do_prolongate); } } - // free in the opposite order - for (int g = ggfs[c].members.size() - 1; g >= 0; g--) { + for (int g = 0; g < ggfs[c].members.size(); g++) { ggfs[c].members[g]->recompose_free (rl); } - } - } - for (list::reverse_iterator f=gfs.rbegin(); f!=gfs.rend(); ++f) { - (*f)->recompose_free (rl); - } - for (comm_state state; !state.done(); state.step()) { - for (list::iterator f=gfs.begin(); f!=gfs.end(); ++f) { - for (comm_state state; !state.done(); state.step()) { - (*f)->recompose_bnd_prolongate (state, rl, do_prolongate); + for (comm_state state(ggfs[c].vartype); ! state.done(); state.step()) { + for (int g = 0; g < ggfs[c].members.size(); g++) { + ggfs[c].members[g]->recompose_bnd_prolongate (state, rl, do_prolongate); + } } for (comm_state state(ggfs[c].vartype); ! state.done(); state.step()) { for (int g = 0; g < ggfs[c].members.size(); g++) { @@ -594,8 +615,7 @@ void dh::save_time (bool do_prolongate) ggfs[c].members[g]->recompose_fill (state, rl, do_prolongate); } } - // free in the opposite order - for (int g = ggfs[c].members.size() - 1; g >= 0; g--) { + for (int g = 0; g < ggfs[c].members.size(); g++) { ggfs[c].members[g]->recompose_free (rl); } for (int g = 0; g < ggfs[c].members.size(); g++) { -- cgit v1.2.3