diff options
Diffstat (limited to 'Carpet/CarpetLib/src/ggf.cc')
-rw-r--r-- | Carpet/CarpetLib/src/ggf.cc | 174 |
1 files changed, 110 insertions, 64 deletions
diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc index 41e6787dc..d975a55a1 100644 --- a/Carpet/CarpetLib/src/ggf.cc +++ b/Carpet/CarpetLib/src/ggf.cc @@ -7,6 +7,8 @@ #include "cctk.h" +#include "CarpetTimers.hh" + #include "defs.hh" #include "dh.hh" #include "th.hh" @@ -19,6 +21,10 @@ using namespace CarpetLib; +list<ggf*> ggf::allggf; + + + // Constructors ggf::ggf (const int varindex_, const operator_type transport_operator_, th& t_, dh& d_, @@ -44,12 +50,15 @@ ggf::ggf (const int varindex_, const operator_type transport_operator_, timelevels_.AT(ml).resize(d.h.reflevels(), 0); } - d.add(this); + allggfi = allggf.insert(allggf.end(), this); + + dh_handle = d.add(this); } // Destructors ggf::~ggf () { - d.remove(this); + d.erase(dh_handle); + allggf.erase(allggfi); } // Comparison @@ -69,23 +78,24 @@ void ggf::set_timelevels (const int ml, const int rl, const int new_timelevels) if (new_timelevels < timelevels(ml,rl)) { - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { + for (int lc=0; lc<h.local_components(rl); ++ lc) { for (int tl=new_timelevels; tl<timelevels(ml,rl); ++tl) { - delete storage.AT(ml).AT(rl).AT(c).AT(tl); + delete storage.AT(ml).AT(rl).AT(lc).AT(tl); } - storage.AT(ml).AT(rl).AT(c).resize (new_timelevels); - } // for c + storage.AT(ml).AT(rl).AT(lc).resize (new_timelevels); + } // for lc } else if (new_timelevels > timelevels(ml,rl)) { - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { - storage.AT(ml).AT(rl).AT(c).resize (new_timelevels); + for (int lc=0; lc<h.local_components(rl); ++ lc) { + int const c = h.get_component(rl,lc); + storage.AT(ml).AT(rl).AT(lc).resize (new_timelevels); for (int tl=timelevels(ml,rl); tl<new_timelevels; ++tl) { - storage.AT(ml).AT(rl).AT(c).AT(tl) = typed_data(tl,rl,c,ml); - storage.AT(ml).AT(rl).AT(c).AT(tl)->allocate - (d.boxes.AT(ml).AT(rl).AT(c).exterior, h.processor(rl,c)); + storage.AT(ml).AT(rl).AT(lc).AT(tl) = typed_data(tl,rl,lc,ml); + storage.AT(ml).AT(rl).AT(lc).AT(tl)->allocate + (d.boxes.AT(ml).AT(rl).AT(c).exterior, dist::rank()); } // for tl - } // for c + } // for lc } @@ -97,34 +107,39 @@ void ggf::set_timelevels (const int ml, const int rl, const int new_timelevels) void ggf::recompose_crop () { // Free storage that will not be needed - static Timer timer ("ggf::recompose_crop"); + static Carpet::Timer timer ("CarpetLib::ggf::recompose_crop"); timer.start (); for (int ml=0; ml<h.mglevels(); ++ml) { for (int rl=h.reflevels(); rl<(int)storage.AT(ml).size(); ++rl) { - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { - for (int tl=0; tl<(int)storage.AT(ml).AT(rl).AT(c).size(); ++tl) { - delete storage.AT(ml).AT(rl).AT(c).AT(tl); + for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) { + for (int tl=0; tl<(int)storage.AT(ml).AT(rl).AT(lc).size(); ++tl) { + delete storage.AT(ml).AT(rl).AT(lc).AT(tl); } // for tl - } // for c + } // for lc } // for rl storage.AT(ml).resize(h.reflevels()); } // for ml - timer.stop (0); + timer.stop (); } void ggf::recompose_allocate (const int rl) { // Retain storage that might be needed - static Timer timer ("ggf::recompose_allocate"); + static Carpet::Timer timer ("CarpetLib::ggf::recompose_allocate"); timer.start (); oldstorage.resize(storage.size()); for (int ml=0; ml<(int)storage.size(); ++ml) { oldstorage.AT(ml).resize(storage.AT(ml).size()); +#if 0 oldstorage.AT(ml).AT(rl) = storage.AT(ml).AT(rl); storage.AT(ml).AT(rl).clear(); +#else + oldstorage.AT(ml).AT(rl).clear(); + swap (storage.AT(ml).AT(rl), oldstorage.AT(ml).AT(rl)); +#endif } for (int ml=0; ml<d.h.mglevels(); ++ml) { @@ -135,32 +150,36 @@ void ggf::recompose_allocate (const int rl) storage.resize(h.mglevels()); for (int ml=0; ml<h.mglevels(); ++ml) { storage.AT(ml).resize(h.reflevels()); - storage.AT(ml).AT(rl).resize(h.components(rl)); - for (int c=0; c<h.components(rl); ++c) { - storage.AT(ml).AT(rl).AT(c).resize(timelevels(ml,rl)); + storage.AT(ml).AT(rl).resize(h.local_components(rl)); + for (int lc=0; lc<h.local_components(rl); ++ lc) { + int const c = h.get_component(rl,lc); + storage.AT(ml).AT(rl).AT(lc).resize(timelevels(ml,rl)); for (int tl=0; tl<timelevels(ml,rl); ++tl) { - storage.AT(ml).AT(rl).AT(c).AT(tl) = typed_data(tl,rl,c,ml); - storage.AT(ml).AT(rl).AT(c).AT(tl)->allocate - (d.boxes.AT(ml).AT(rl).AT(c).exterior, h.processor(rl,c)); + storage.AT(ml).AT(rl).AT(lc).AT(tl) = typed_data(tl,rl,lc,ml); + storage.AT(ml).AT(rl).AT(lc).AT(tl)->allocate + (d.boxes.AT(ml).AT(rl).AT(c).exterior, dist::rank()); } // for tl - } // for c + } // for lc } // for ml - timer.stop (0); + timer.stop (); } void ggf::recompose_fill (comm_state & state, int const rl, bool const do_prolongate) { // Initialise the new storage - static Timer timer ("ggf::recompose_fill"); + static Carpet::Timer timer ("CarpetLib::ggf::recompose_fill"); timer.start (); - + for (int ml = 0; ml < h.mglevels(); ++ ml) { + assert (d.fast_boxes.AT(ml).AT(rl).do_init); + vector <int> tls; if (do_prolongate and rl > 0 and - transport_operator != op_none and transport_operator != op_sync) + transport_operator != op_none and transport_operator != op_sync and + transport_operator != op_restrict) { int const numtl = timelevels (ml, rl); tls.resize (numtl); @@ -185,7 +204,9 @@ void ggf::recompose_fill (comm_state & state, int const rl, // Initialise from a coarser level of the new hierarchy, where // possible if (rl > 0) { - if (transport_operator != op_none and transport_operator != op_sync) { + if (transport_operator != op_none and transport_operator != op_sync and + transport_operator != op_restrict) + { for (int tl = 0; tl < timelevels (ml, rl); ++tl) { transfer_from_all (state, tl, rl, ml, @@ -199,43 +220,43 @@ void ggf::recompose_fill (comm_state & state, int const rl, } // for ml - timer.stop (0); + timer.stop (); } void ggf::recompose_free_old (const int rl) { // Delete old storage - static Timer timer ("dh::recompose_free_old"); + static Carpet::Timer timer ("dh::recompose_free_old"); timer.start (); for (int ml=0; ml<(int)oldstorage.size(); ++ml) { - for (int c=0; c<(int)oldstorage.AT(ml).AT(rl).size(); ++c) { - for (int tl=0; tl<timelevels(ml,rl); ++tl) { - delete oldstorage.AT(ml).AT(rl).AT(c).AT(tl); + for (int lc=0; lc<(int)oldstorage.AT(ml).AT(rl).size(); ++lc) { + for (int tl=0; tl<(int)oldstorage.AT(ml).AT(rl).AT(lc).size(); ++tl) { + delete oldstorage.AT(ml).AT(rl).AT(lc).AT(tl); } // for tl - } // for c + } // for lc oldstorage.AT(ml).AT(rl).clear(); } // for ml - timer.stop (0); + timer.stop (); } void ggf::recompose_free (const int rl) { // Delete old storage - static Timer timer ("dh::recompose_free"); + static Carpet::Timer timer ("dh::recompose_free"); timer.start (); for (int ml=0; ml<(int)storage.size(); ++ml) { - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { + for (int lc=0; lc<h.local_components(rl); ++ lc) { for (int tl=0; tl<timelevels(ml,rl); ++tl) { - delete storage.AT(ml).AT(rl).AT(c).AT(tl); + delete storage.AT(ml).AT(rl).AT(lc).AT(tl); } // for tl - } // for c + } // for lc storage.AT(ml).AT(rl).clear(); } // for ml - timer.stop (0); + timer.stop (); } @@ -246,8 +267,8 @@ void ggf::cycle_all (int const rl, int const ml) { assert (ml>=0 and ml<h.mglevels()); int const ntl = timelevels(ml,rl); assert (ntl > 0); - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { - fdata & fdatas = storage.AT(ml).AT(rl).AT(c); + for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) { + fdata & fdatas = storage.AT(ml).AT(rl).AT(lc); gdata * const tmpdata = fdatas.AT(ntl-1); for (int tl=ntl-1; tl>0; --tl) { fdatas.AT(tl) = fdatas.AT(tl-1); @@ -260,8 +281,8 @@ void ggf::cycle_all (int const rl, int const ml) { void ggf::flip_all (int const rl, int const ml) { assert (rl>=0 and rl<h.reflevels()); assert (ml>=0 and ml<h.mglevels()); - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { - fdata & fdatas = storage.AT(ml).AT(rl).AT(c); + for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) { + fdata & fdatas = storage.AT(ml).AT(rl).AT(lc); for (int tl=0; tl<(timelevels(ml,rl)-1)/2; ++tl) { const int tl1 = tl; const int tl2 = timelevels(ml,rl)-1 - tl; @@ -279,15 +300,13 @@ void ggf::flip_all (int const rl, int const ml) { void ggf::fill_all (int const rl, int const ml) { assert (rl>=0 and rl<h.reflevels()); assert (ml>=0 and ml<h.mglevels()); - for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) { - if (h.is_local(rl,c)) { - fdata const & fdatas = storage.AT(ml).AT(rl).AT(c); - void const * const srcptr = fdatas.AT(0)->storage(); - size_t const size = fdatas.AT(0)->size() * fdatas.AT(0)->elementsize(); - for (int tl=1; tl<timelevels(ml,rl); ++tl) { - void * const dstptr = fdatas.AT(tl)->storage(); - memcpy (dstptr, srcptr, size); - } + for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) { + fdata const & fdatas = storage.AT(ml).AT(rl).AT(lc); + void const * const srcptr = fdatas.AT(0)->storage(); + size_t const size = fdatas.AT(0)->size() * fdatas.AT(0)->elementsize(); + for (int tl=1; tl<timelevels(ml,rl); ++tl) { + void * const dstptr = fdatas.AT(tl)->storage(); + memcpy (dstptr, srcptr, size); } } } @@ -322,7 +341,9 @@ ref_bnd_prolongate_all (comm_state & state, { // Interpolate assert (rl>=1); - if (transport_operator == op_none or transport_operator == op_sync) return; + if (transport_operator == op_none or transport_operator == op_sync or + transport_operator == op_restrict) + return; vector<int> tl2s; static Timer timer ("ref_bnd_prolongate_all"); timer.start (); @@ -435,7 +456,9 @@ ref_prolongate_all (comm_state & state, CCTK_REAL const time) { assert (rl>=1); - if (transport_operator == op_none or transport_operator == op_sync) return; + if (transport_operator == op_none or transport_operator == op_sync or + transport_operator == op_restrict) + return; static Timer timer ("ref_prolongate_all"); timer.start (); vector<int> tl2s; @@ -467,8 +490,7 @@ transfer_from_all (comm_state & state, assert (ml1>=0 and ml1<h.mglevels()); assert (tl1>=0 and tl1<timelevels(ml1,rl1)); - int const p = dist::rank(); - srpvect const & psendrecvs = d.fast_boxes.AT(ml1).AT(rl1).AT(p).*sendrecvs; + srpvect const & psendrecvs = d.fast_boxes.AT(ml1).AT(rl1).*sendrecvs; // Return early if this communication does not concern us if (psendrecvs.empty()) return; @@ -482,7 +504,11 @@ transfer_from_all (comm_state & state, assert (rl2>=0 and rl2<(int)srcstorage.AT(ml2).size()); for (size_t i = 0; i < tl2s.size(); ++ i) { int const tl2 = tl2s.AT(i); - assert (tl2>=0 and tl2<(int)srcstorage.AT(ml2).AT(rl2).AT(0).size()); + assert (tl2>=0); + int const lc = 0; + if (lc < int(srcstorage.AT(ml2).AT(rl2).size())) { + assert (tl2<(int)srcstorage.AT(ml2).AT(rl2).AT(lc).size()); + } } // Set up source times @@ -514,14 +540,21 @@ transfer_from_all (comm_state & state, ibbox const & recv = precv.extent; int const c2 = psend.component; int const c1 = precv.component; + int const lc2 = h.get_local_component(rl2,c2); + int const lc1 = h.get_local_component(rl1,c1); + int const p2 = h.processor(rl2,c2); + int const p1 = h.processor(rl1,c1); // Source and destination data - gdata * const dst = storage.AT(ml1).AT(rl1).AT(c1).AT(tl1); + gdata * const dst = + lc1>=0 ? storage.AT(ml1).AT(rl1).AT(lc1).AT(tl1) : NULL; cdata const & srcs = srcstorage.AT(ml2).AT(rl2); for (int i=0; i<(int)gsrcs.size(); ++i) { - gsrcs.AT(i) = srcs.AT(c2).AT(tl2s.AT(i)); + gsrcs.AT(i) = lc2>=0 ? srcs.AT(lc2).AT(tl2s.AT(i)) : NULL; } - dst->transfer_from (state, gsrcs, times, recv, send, time, pos, pot); + + dst->transfer_from + (state, gsrcs, times, recv, send, p1, p2 , time, pos, pot); } total.stop (0); @@ -546,3 +579,16 @@ memory () memoryof (vectorleader) + memoryof (oldstorage); } + +size_t +ggf:: +allmemory () +{ + size_t mem = memoryof(allggf); + for (list<ggf*>::const_iterator + ggfi = allggf.begin(); ggfi != allggf.end(); ++ ggfi) + { + mem += memoryof(**ggfi); + } + return mem; +} |