diff options
Diffstat (limited to 'Carpet/CarpetLib/src/ggf.cc')
-rw-r--r-- | Carpet/CarpetLib/src/ggf.cc | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc index 7d947fae5..8a7c643da 100644 --- a/Carpet/CarpetLib/src/ggf.cc +++ b/Carpet/CarpetLib/src/ggf.cc @@ -38,7 +38,7 @@ ggf::ggf (const int varindex_, const operator_type transport_operator_, vectorlength(vectorlength_), vectorindex(vectorindex_), vectorleader(vectorleader_) { - assert (&t.h == &d.h); + // assert (&t.h == &d.h); assert (vectorlength >= 1); assert (vectorindex >= 0 and vectorindex < vectorlength); @@ -176,18 +176,6 @@ void ggf::recompose_fill (comm_state & state, int const rl, 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 and - transport_operator != op_restrict) - { - int const numtl = timelevels (ml, rl); - tls.resize (numtl); - for (int tl = 0; tl < numtl; ++ tl) { - tls.AT(tl) = tl; - } - } - // Initialise from the same level of the old hierarchy, where // possible if (rl < (int)oldstorage.AT(ml).size()) { @@ -207,12 +195,18 @@ void ggf::recompose_fill (comm_state & state, int const rl, if (transport_operator != op_none and transport_operator != op_sync and transport_operator != op_restrict) { + int const numtl = timelevels (ml, rl); + vector <int> tls (numtl); + for (int tl = 0; tl < numtl; ++ tl) { + tls.AT(tl) = tl; + } + for (int tl = 0; tl < timelevels (ml, rl); ++tl) { transfer_from_all (state, tl, rl, ml, & dh::fast_dboxes::fast_old2new_ref_prol_sendrecv, tls, rl - 1, ml, - t.time (tl, rl, ml)); + t.get_time (ml, rl, tl)); } // for tl } // if transport_operator } // if rl @@ -277,6 +271,22 @@ void ggf::cycle_all (int const rl, int const ml) { } } +// Uncycle the time levels by rotating the data sets +void ggf::uncycle_all (int const rl, int const ml) { + assert (rl>=0 and rl<h.reflevels()); + assert (ml>=0 and ml<h.mglevels()); + int const ntl = timelevels(ml,rl); + assert (ntl > 0); + 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(0); + for (int tl=0; tl<ntl-1; ++tl) { + fdatas.AT(tl) = fdatas.AT(tl+1); + } + fdatas.AT(ntl-1) = tmpdata; + } +} + // Flip the time levels by exchanging the data sets void ggf::flip_all (int const rl, int const ml) { assert (rl>=0 and rl<h.reflevels()); @@ -285,9 +295,9 @@ void ggf::flip_all (int const rl, int const ml) { assert (ntl > 0); 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<ntl/2; ++tl) { - const int tl1 = tl; - const int tl2 = ntl-1 - tl; + for (int tl=1; tl<(ntl+1)/2; ++tl) { + const int tl1 = tl; + const int tl2 = ntl - tl; assert (tl1 < tl2); gdata * const tmpdata = fdatas.AT(tl1); fdatas.AT(tl1) = fdatas.AT(tl2); @@ -383,15 +393,15 @@ ref_bnd_prolongate_all (comm_state & state, void ggf:: mg_restrict_all (comm_state & state, - int const tl, int const rl, int const ml, + int const tl, int const rl, int const ml, CCTK_REAL const time) { static Timer timer ("mg_restrict_all"); timer.start (); // Require same times static_assert (abs(0.1) > 0, "Function CarpetLib::abs has wrong signature"); - assert (abs(t.get_time(rl,ml) - t.get_time(rl,ml-1)) - <= 1.0e-8 * (1.0 + abs(t.get_time(rl,ml)))); + assert (abs(t.get_time(ml,rl,0) - t.get_time(ml-1,rl,0)) + <= 1.0e-8 * (1.0 + abs(t.get_time(ml,rl,0)))); vector<int> const tl2s(1,tl); transfer_from_all (state, tl ,rl,ml, @@ -414,8 +424,8 @@ mg_prolongate_all (comm_state & state, timer.start (); // Require same times static_assert (abs(0.1) > 0, "Function CarpetLib::abs has wrong signature"); - assert (abs(t.get_time(rl,ml) - t.get_time(rl,ml+1)) - <= 1.0e-8 * (1.0 + abs(t.get_time(rl,ml)))); + assert (abs(t.get_time(ml,rl,0) - t.get_time(ml+1,rl,0)) + <= 1.0e-8 * (1.0 + abs(t.get_time(ml,rl,0)))); vector<int> const tl2s(1,tl); transfer_from_all (state, tl ,rl,ml, @@ -431,22 +441,19 @@ mg_prolongate_all (comm_state & state, void ggf:: ref_restrict_all (comm_state & state, - int const tl, int const rl, int const ml, - CCTK_REAL const time) + int const tl, int const rl, int const ml) { // Require same times static_assert (abs(0.1) > 0, "Function CarpetLib::abs has wrong signature"); - assert (abs(t.get_time(rl,ml) - t.get_time(rl+1,ml)) - <= 1.0e-8 * (1.0 + abs(t.get_time(rl,ml)))); + assert (abs(t.get_time(ml,rl,tl) - t.get_time(ml,rl+1,tl)) <= + 1.0e-8 * (1.0 + abs(t.get_time(ml,rl,tl)))); if (transport_operator == op_none or transport_operator == op_sync) return; static Timer timer ("ref_restrict_all"); timer.start (); - vector<int> const tl2s(1,tl); transfer_from_all (state, - tl ,rl ,ml, + tl,rl ,ml, & dh::fast_dboxes::fast_ref_rest_sendrecv, - tl2s,rl+1,ml, - time); + tl,rl+1,ml); timer.stop (0); } @@ -522,7 +529,7 @@ transfer_from_all (comm_state & state, for (size_t j=0; j<i; ++j) { assert (tl2s.AT(i) != tl2s.AT(j)); } - times.AT(i) = t.time(tl2s.AT(i),rl2,ml2); + times.AT(i) = t.get_time(ml2,rl2,tl2s.AT(i)); } // Interpolation orders |