diff options
Diffstat (limited to 'Carpet')
-rw-r--r-- | Carpet/CarpetLib/src/data.cc | 72 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/data.hh | 8 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/dggf.cc | 10 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/dggf.hh | 19 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/gdata.cc | 15 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/gdata.hh | 12 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/ggf.cc | 91 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/ggf.hh | 23 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77 | 15 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77 | 15 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77 | 19 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77 | 19 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/th.cc | 12 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/th.hh | 22 |
14 files changed, 202 insertions, 150 deletions
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc index ee6a08c8e..edfb202a5 100644 --- a/Carpet/CarpetLib/src/data.cc +++ b/Carpet/CarpetLib/src/data.cc @@ -5,7 +5,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.19 2002/08/30 16:03:19 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.20 2002/09/25 15:49:15 schnetter Exp $ ***************************************************************************/ @@ -197,8 +197,8 @@ void data<T,D> template<class T, int D> void data<T,D> ::interpolate_from_innerloop (const vector<const generic_data<D>*> gsrcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time) { @@ -209,7 +209,7 @@ void data<T,D> assert (all((box.lower()-extent().lower())%box.stride() == 0)); vector<const data*> srcs(gsrcs.size()); for (int t=0; t<(int)srcs.size(); ++t) srcs[t] = (const data*)gsrcs[t]; - assert (srcs.size() == tls.size() && srcs.size()>0); + assert (srcs.size() == times.size() && srcs.size()>0); for (int t=0; t<(int)srcs.size(); ++t) { assert (srcs[t]->has_storage()); assert (all(box.lower()>=srcs[t]->extent().lower())); @@ -229,7 +229,7 @@ void data<T,D> src_fac[t] = 1; for (int tt=0; tt<(int)src_fac.size(); ++tt) { if (tt!=t) { - src_fac[t] *= (T)(tl - tls[tt]) / (T)(tls[t] - tls[tt]); + src_fac[t] *= (T)(time - times[tt]) / (T)(times[t] - times[tt]); } } } @@ -366,40 +366,40 @@ extern "C" { const int regbbox[3][3]); void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8_2tl) - (const CCTK_REAL8* src1, const int& t1, - const CCTK_REAL8* src2, const int& t2, + (const CCTK_REAL8* src1, const CCTK_REAL8& t1, + const CCTK_REAL8* src2, const CCTK_REAL8& t2, const int& srciext, const int& srcjext, const int& srckext, - CCTK_REAL8* dst, const int& t, + CCTK_REAL8* dst, const CCTK_REAL8& t, const int& dstiext, const int& dstjext, const int& dstkext, const int srcbbox[3][3], const int dstbbox[3][3], const int regbbox[3][3]); void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8_2tl_o3) - (const CCTK_REAL8* src1, const int& t1, - const CCTK_REAL8* src2, const int& t2, + (const CCTK_REAL8* src1, const CCTK_REAL8& t1, + const CCTK_REAL8* src2, const CCTK_REAL8& t2, const int& srciext, const int& srcjext, const int& srckext, - CCTK_REAL8* dst, const int& t, + CCTK_REAL8* dst, const CCTK_REAL8& t, const int& dstiext, const int& dstjext, const int& dstkext, const int srcbbox[3][3], const int dstbbox[3][3], const int regbbox[3][3]); void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8_3tl) - (const CCTK_REAL8* src1, const int& t1, - const CCTK_REAL8* src2, const int& t2, - const CCTK_REAL8* src3, const int& t3, + (const CCTK_REAL8* src1, const CCTK_REAL8& t1, + const CCTK_REAL8* src2, const CCTK_REAL8& t2, + const CCTK_REAL8* src3, const CCTK_REAL8& t3, const int& srciext, const int& srcjext, const int& srckext, - CCTK_REAL8* dst, const int& t, + CCTK_REAL8* dst, const CCTK_REAL8& t, const int& dstiext, const int& dstjext, const int& dstkext, const int srcbbox[3][3], const int dstbbox[3][3], const int regbbox[3][3]); void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8_3tl_o3) - (const CCTK_REAL8* src1, const int& t1, - const CCTK_REAL8* src2, const int& t2, - const CCTK_REAL8* src3, const int& t3, + (const CCTK_REAL8* src1, const CCTK_REAL8& t1, + const CCTK_REAL8* src2, const CCTK_REAL8& t2, + const CCTK_REAL8* src3, const CCTK_REAL8& t3, const int& srciext, const int& srcjext, const int& srckext, - CCTK_REAL8* dst, const int& t, + CCTK_REAL8* dst, const CCTK_REAL8& t, const int& dstiext, const int& dstjext, const int& dstkext, const int srcbbox[3][3], const int dstbbox[3][3], @@ -410,8 +410,8 @@ extern "C" { template<> void data<CCTK_REAL8,3> ::interpolate_from_innerloop (const vector<const generic_data<3>*> gsrcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time) { @@ -422,7 +422,7 @@ void data<CCTK_REAL8,3> assert (all((box.lower()-extent().lower())%box.stride() == 0)); vector<const data*> srcs(gsrcs.size()); for (int t=0; t<(int)srcs.size(); ++t) srcs[t] = (const data*)gsrcs[t]; - assert (srcs.size() == tls.size() && srcs.size()>0); + assert (srcs.size() == times.size() && srcs.size()>0); for (int t=0; t<(int)srcs.size(); ++t) { assert (srcs[t]->has_storage()); assert (all(box.lower()>=srcs[t]->extent().lower())); @@ -505,20 +505,20 @@ void data<CCTK_REAL8,3> case 0: case 1: CCTK_FNAME(prolongate_3d_real8_2tl) - ((const CCTK_REAL8*)srcs[0]->storage(), tls[0], - (const CCTK_REAL8*)srcs[1]->storage(), tls[1], + ((const CCTK_REAL8*)srcs[0]->storage(), times[0], + (const CCTK_REAL8*)srcs[1]->storage(), times[1], srcshp[0], srcshp[1], srcshp[2], - (CCTK_REAL8*)storage(), tl, + (CCTK_REAL8*)storage(), time, dstshp[0], dstshp[1], dstshp[2], srcbbox, dstbbox, regbbox); break; case 2: case 3: CCTK_FNAME(prolongate_3d_real8_2tl_o3) - ((const CCTK_REAL8*)srcs[0]->storage(), tls[0], - (const CCTK_REAL8*)srcs[1]->storage(), tls[1], + ((const CCTK_REAL8*)srcs[0]->storage(), times[0], + (const CCTK_REAL8*)srcs[1]->storage(), times[1], srcshp[0], srcshp[1], srcshp[2], - (CCTK_REAL8*)storage(), tl, + (CCTK_REAL8*)storage(), time, dstshp[0], dstshp[1], dstshp[2], srcbbox, dstbbox, regbbox); break; @@ -533,22 +533,22 @@ void data<CCTK_REAL8,3> case 0: case 1: CCTK_FNAME(prolongate_3d_real8_3tl) - ((const CCTK_REAL8*)srcs[0]->storage(), tls[0], - (const CCTK_REAL8*)srcs[1]->storage(), tls[1], - (const CCTK_REAL8*)srcs[2]->storage(), tls[2], + ((const CCTK_REAL8*)srcs[0]->storage(), times[0], + (const CCTK_REAL8*)srcs[1]->storage(), times[1], + (const CCTK_REAL8*)srcs[2]->storage(), times[2], srcshp[0], srcshp[1], srcshp[2], - (CCTK_REAL8*)storage(), tl, + (CCTK_REAL8*)storage(), time, dstshp[0], dstshp[1], dstshp[2], srcbbox, dstbbox, regbbox); break; case 2: case 3: CCTK_FNAME(prolongate_3d_real8_3tl_o3) - ((const CCTK_REAL8*)srcs[0]->storage(), tls[0], - (const CCTK_REAL8*)srcs[1]->storage(), tls[1], - (const CCTK_REAL8*)srcs[2]->storage(), tls[2], + ((const CCTK_REAL8*)srcs[0]->storage(), times[0], + (const CCTK_REAL8*)srcs[1]->storage(), times[1], + (const CCTK_REAL8*)srcs[2]->storage(), times[2], srcshp[0], srcshp[1], srcshp[2], - (CCTK_REAL8*)storage(), tl, + (CCTK_REAL8*)storage(), time, dstshp[0], dstshp[1], dstshp[2], srcbbox, dstbbox, regbbox); break; diff --git a/Carpet/CarpetLib/src/data.hh b/Carpet/CarpetLib/src/data.hh index 983f7f141..468b7cced 100644 --- a/Carpet/CarpetLib/src/data.hh +++ b/Carpet/CarpetLib/src/data.hh @@ -5,7 +5,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.10 2002/05/05 22:16:59 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.11 2002/09/25 15:49:15 schnetter Exp $ ***************************************************************************/ @@ -26,6 +26,8 @@ #include <iostream> #include <string> +#include "cctk.h" + #include "defs.hh" #include "dist.hh" #include "bbox.hh" @@ -94,8 +96,8 @@ public: void copy_from_innerloop (const generic_data<D>* gsrc, const ibbox& box); void interpolate_from_innerloop (const vector<const generic_data<D>*> gsrcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time); diff --git a/Carpet/CarpetLib/src/dggf.cc b/Carpet/CarpetLib/src/dggf.cc index 0091fe800..c41e6a61a 100644 --- a/Carpet/CarpetLib/src/dggf.cc +++ b/Carpet/CarpetLib/src/dggf.cc @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/Attic/dggf.cc,v 1.3 2002/05/05 22:17:00 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/Attic/dggf.cc,v 1.4 2002/09/25 15:49:15 schnetter Exp $ ***************************************************************************/ @@ -22,12 +22,8 @@ #include <assert.h> #include <stdlib.h> -// #include <iostream> -// #include <string> - -// #include "defs.hh" -// #include "dh.hh" -// #include "th.hh" +#include "defs.hh" +#include "th.hh" #include "dggf.hh" diff --git a/Carpet/CarpetLib/src/dggf.hh b/Carpet/CarpetLib/src/dggf.hh index 926d76f00..193903f70 100644 --- a/Carpet/CarpetLib/src/dggf.hh +++ b/Carpet/CarpetLib/src/dggf.hh @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/Attic/dggf.hh,v 1.4 2002/05/05 22:17:01 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/Attic/dggf.hh,v 1.5 2002/09/25 15:49:15 schnetter Exp $ ***************************************************************************/ @@ -27,6 +27,8 @@ #include <iostream> #include <string> +#include "cctk.h" + #include "defs.hh" #include "dgdata.hh" #include "th.hh" @@ -101,19 +103,24 @@ public: virtual void sync (int tl, int rl, int c, int ml) = 0; // Prolongate the boundaries of a component - virtual void ref_bnd_prolongate (int tl, int rl, int c, int ml) = 0; + virtual void ref_bnd_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) = 0; // Restrict a multigrid level - virtual void mg_restrict (int tl, int rl, int c, int ml) = 0; + virtual void mg_restrict (int tl, int rl, int c, int ml, + CCTK_REAL time) = 0; // Prolongate a multigrid level - virtual void mg_prolongate (int tl, int rl, int c, int ml) = 0; + virtual void mg_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) = 0; // Restrict a refinement level - virtual void ref_restrict (int tl, int rl, int c, int ml) = 0; + virtual void ref_restrict (int tl, int rl, int c, int ml, + CCTK_REAL time) = 0; // Prolongate a refinement level - virtual void ref_prolongate (int tl, int rl, int c, int ml) = 0; + virtual void ref_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) = 0; diff --git a/Carpet/CarpetLib/src/gdata.cc b/Carpet/CarpetLib/src/gdata.cc index 6e7df5472..76184b3d1 100644 --- a/Carpet/CarpetLib/src/gdata.cc +++ b/Carpet/CarpetLib/src/gdata.cc @@ -5,7 +5,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.cc,v 1.19 2002/05/05 22:17:01 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.cc,v 1.20 2002/09/25 15:49:16 schnetter Exp $ ***************************************************************************/ @@ -22,6 +22,8 @@ #include <iostream> +#include "cctk.h" + #include "bbox.hh" #include "defs.hh" #include "dist.hh" @@ -85,8 +87,8 @@ void generic_data<D>::copy_from (const generic_data* src, const ibbox& box) template<int D> void generic_data<D> ::interpolate_from (const vector<const generic_data*> srcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time) { @@ -95,7 +97,7 @@ void generic_data<D> assert (all(box.upper()<=extent().upper())); assert (all(box.stride()==extent().stride())); assert (all((box.lower()-extent().lower())%box.stride() == 0)); - assert (srcs.size() == tls.size() && srcs.size()>0); + assert (srcs.size() == times.size() && srcs.size()>0); for (int t=0; t<(int)srcs.size(); ++t) { assert (srcs[t]->has_storage()); assert (all(box.lower()>=srcs[t]->extent().lower())); @@ -108,7 +110,8 @@ void generic_data<D> int rank; MPI_Comm_rank (dist::comm, &rank); if (rank == proc()) { - interpolate_from_innerloop (srcs, tls, box, tl, order_space, order_time); + interpolate_from_innerloop + (srcs, times, box, time, order_space, order_time); } } else { @@ -116,7 +119,7 @@ void generic_data<D> generic_data* const tmp = make_typed(); tmp->allocate (box, srcs[0]->proc()); - tmp->interpolate_from (srcs, tls, box, tl, order_space, order_time); + tmp->interpolate_from (srcs, times, box, time, order_space, order_time); tmp->change_processor (proc()); copy_from (tmp, box); delete tmp; diff --git a/Carpet/CarpetLib/src/gdata.hh b/Carpet/CarpetLib/src/gdata.hh index 78ca1c935..66eeb00dd 100644 --- a/Carpet/CarpetLib/src/gdata.hh +++ b/Carpet/CarpetLib/src/gdata.hh @@ -5,7 +5,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.hh,v 1.14 2002/05/05 22:17:02 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.hh,v 1.15 2002/09/25 15:49:16 schnetter Exp $ ***************************************************************************/ @@ -27,6 +27,8 @@ #include <iostream> #include <string> +#include "cctk.h" + #include "defs.hh" #include "dgdata.hh" #include "dist.hh" @@ -99,8 +101,8 @@ public: // Data manipulators void copy_from (const generic_data* src, const ibbox& box); void interpolate_from (const vector<const generic_data*> srcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time); protected: @@ -108,8 +110,8 @@ protected: copy_from_innerloop (const generic_data* src, const ibbox& box) = 0; virtual void interpolate_from_innerloop (const vector<const generic_data*> srcs, - const vector<int> tls, - const ibbox& box, const int tl, + const vector<CCTK_REAL> times, + const ibbox& box, const CCTK_REAL time, const int order_space, const int order_time) = 0; diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc index fa24943c5..ae733aa35 100644 --- a/Carpet/CarpetLib/src/ggf.cc +++ b/Carpet/CarpetLib/src/ggf.cc @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.18 2002/08/30 16:03:20 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.19 2002/09/25 15:49:16 schnetter Exp $ ***************************************************************************/ @@ -25,6 +25,8 @@ #include <iostream> #include <string> +#include "cctk.h" + #include "defs.hh" #include "dh.hh" #include "th.hh" @@ -102,7 +104,8 @@ void generic_gf<D>::recompose () { // Initialise from coarser level, if possible // TODO: init only un-copied regions if (rl>0) { - ref_prolongate (tl,rl,c,ml); + const CCTK_REAL time = t.time(tl,rl,ml); + ref_prolongate (tl,rl,c,ml,time); } // if rl // Copy from old storage, if possible @@ -144,7 +147,8 @@ void generic_gf<D>::recompose () { sync (tl,rl,c,ml); // TODO: assert that reflevel 0 boundaries are copied if (rl>0) { - ref_bnd_prolongate (tl,rl,c,ml); + const CCTK_REAL time = t.time(tl,rl,ml); + ref_bnd_prolongate (tl,rl,c,ml,time); } // if rl } // for ml } // for c @@ -189,9 +193,8 @@ void generic_gf<D>::copytoprevs (int rl, int c, int ml) { assert (c>=0 && c<h.components(rl)); assert (ml>=0 && ml<h.mglevels(rl,c)); for (int tl=tmin; tl<=tmax-1; ++tl) { - storage[tl-tmin][rl][c][ml]->copy_from -(storage[tmax-tmin][rl][c][ml], storage[tmax-tmin][rl][c][ml]->extent -()); + storage[tl-tmin][rl][c][ml]->copy_from + (storage[tmax-tmin][rl][c][ml], storage[tmax-tmin][rl][c][ml]->extent()); } } @@ -288,7 +291,8 @@ template<int D> void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, const ibbox dh<D>::dboxes::* recv_list, const vector<int> tl2s, int rl2, int ml2, - const ibbox dh<D>::dboxes::* send_list) + const ibbox dh<D>::dboxes::* send_list, + CCTK_REAL time) { assert (tl1>=tmin && tl1<=tmax); assert (rl1>=0 && rl1<h.reflevels()); @@ -302,15 +306,15 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, assert (ml2>=0 && ml2<h.mglevels(rl2,c2)); vector<const generic_data<D>*> gsrcs(tl2s.size()); - vector<int> tls(tl2s.size()); + vector<CCTK_REAL> times(tl2s.size()); for (int i=0; i<(int)gsrcs.size(); ++i) { assert (rl2<(int)storage[tl2s[i]-tmin].size()); assert (c2<(int)storage[tl2s[i]-tmin][rl2].size()); assert (ml2<(int)storage[tl2s[i]-tmin][rl2][ml2].size()); gsrcs[i] = storage[tl2s[i]-tmin][rl2][c2][ml2]; - tls[i] = t.time(tl2s[i],rl2,ml2); + times[i] = t.time(tl2s[i],rl2,ml2); } - const int tl = t.time(tl1,rl1,ml1); +// const CCTK_REAL time = t.time(tl1,rl1,ml1); const ibbox recv = d.boxes[rl1][c1][ml1].*recv_list; const ibbox send = d.boxes[rl2][c2][ml2].*send_list; @@ -318,7 +322,7 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, // interpolate the content assert (recv==send); storage[tl1-tmin][rl1][c1][ml1]->interpolate_from - (gsrcs, tls, recv, tl, + (gsrcs, times, recv, time, d.prolongation_order_space, prolongation_order_time); } @@ -327,7 +331,8 @@ template<int D> void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, const iblist dh<D>::dboxes::* recv_list, const vector<int> tl2s, int rl2, int ml2, - const iblist dh<D>::dboxes::* send_list) + const iblist dh<D>::dboxes::* send_list, + const CCTK_REAL time) { assert (tl1>=tmin && tl1<=tmax); assert (rl1>=0 && rl1<h.reflevels()); @@ -341,15 +346,15 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, assert (ml2>=0 && ml2<h.mglevels(rl2,c2)); vector<const generic_data<D>*> gsrcs(tl2s.size()); - vector<int> tls(tl2s.size()); + vector<CCTK_REAL> times(tl2s.size()); for (int i=0; i<(int)gsrcs.size(); ++i) { assert (rl2<(int)storage[tl2s[i]-tmin].size()); assert (c2<(int)storage[tl2s[i]-tmin][rl2].size()); assert (ml2<(int)storage[tl2s[i]-tmin][rl2][ml2].size()); gsrcs[i] = storage[tl2s[i]-tmin][rl2][c2][ml2]; - tls[i] = t.time(tl2s[i],rl2,ml2); + times[i] = t.time(tl2s[i],rl2,ml2); } - const int tl = t.time(tl1,rl1,ml1); +// const CCTK_REAL time = t.time(tl1,rl1,ml1); const iblist recv = d.boxes[rl1][c1][ml1].*recv_list; const iblist send = d.boxes[rl2][c2][ml2].*send_list; @@ -360,7 +365,7 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, // (use the send boxes for communication) // interpolate the content storage[tl1-tmin][rl1][c1][ml1]->interpolate_from - (gsrcs, tls, *r, tl, + (gsrcs, times, *r, time, d.prolongation_order_space, prolongation_order_time); } } @@ -370,7 +375,8 @@ template<int D> void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, const iblistvect dh<D>::dboxes::* recv_listvect, const vector<int> tl2s, int rl2, int ml2, - const iblistvect dh<D>::dboxes::* send_listvect) + const iblistvect dh<D>::dboxes::* send_listvect, + const CCTK_REAL time) { assert (tl1>=tmin && tl1<=tmax); assert (rl1>=0 && rl1<h.reflevels()); @@ -385,15 +391,15 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, assert (ml2>=0 && ml2<h.mglevels(rl2,c2)); vector<const generic_data<D>*> gsrcs(tl2s.size()); - vector<int> tls(tl2s.size()); + vector<CCTK_REAL> times(tl2s.size()); for (int i=0; i<(int)gsrcs.size(); ++i) { assert (rl2<(int)storage[tl2s[i]-tmin].size()); assert (c2<(int)storage[tl2s[i]-tmin][rl2].size()); assert (ml2<(int)storage[tl2s[i]-tmin][rl2][ml2].size()); gsrcs[i] = storage[tl2s[i]-tmin][rl2][c2][ml2]; - tls[i] = t.time(tl2s[i],rl2,ml2); + times[i] = t.time(tl2s[i],rl2,ml2); } - const int tl = t.time(tl1,rl1,ml1); +// const CCTK_REAL time = t.time(tl1,rl1,ml1); const iblist recv = (d.boxes[rl1][c1][ml1].*recv_listvect)[c2]; const iblist send = (d.boxes[rl2][c2][ml2].*send_listvect)[c1]; @@ -404,7 +410,7 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, // (use the send boxes for communication) // interpolate the content storage[tl1-tmin][rl1][c1][ml1]->interpolate_from - (gsrcs, tls, *r, tl, + (gsrcs, times, *r, time, d.prolongation_order_space, prolongation_order_time); } } @@ -414,7 +420,8 @@ void generic_gf<D>::intercat (int tl1, int rl1, int c1, int ml1, // Copy a component from the next time level template<int D> -void generic_gf<D>::copy (int tl, int rl, int c, int ml) { +void generic_gf<D>::copy (int tl, int rl, int c, int ml) +{ // Copy copycat (tl ,rl,c,ml, &dh<D>::dboxes::exterior, tl+1,rl, ml, &dh<D>::dboxes::exterior); @@ -422,7 +429,8 @@ void generic_gf<D>::copy (int tl, int rl, int c, int ml) { // Synchronise the boundaries a component template<int D> -void generic_gf<D>::sync (int tl, int rl, int c, int ml) { +void generic_gf<D>::sync (int tl, int rl, int c, int ml) +{ // Copy copycat (tl,rl,c,ml, &dh<D>::dboxes::recv_sync, tl,rl, ml, &dh<D>::dboxes::send_sync); @@ -430,7 +438,9 @@ void generic_gf<D>::sync (int tl, int rl, int c, int ml) { // Prolongate the boundaries of a component template<int D> -void generic_gf<D>::ref_bnd_prolongate (int tl, int rl, int c, int ml) { +void generic_gf<D>::ref_bnd_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) +{ // Interpolate assert (rl>=1); vector<int> tl2s; @@ -439,49 +449,57 @@ void generic_gf<D>::ref_bnd_prolongate (int tl, int rl, int c, int ml) { tl2s.resize(prolongation_order_time+1); for (int i=0; i<=prolongation_order_time; ++i) tl2s[i] = tmax - i; intercat (tl ,rl ,c,ml, &dh<D>::dboxes::recv_ref_bnd_coarse, - tl2s,rl-1, ml, &dh<D>::dboxes::send_ref_bnd_fine); + tl2s,rl-1, ml, &dh<D>::dboxes::send_ref_bnd_fine, + time); } // Restrict a multigrid level template<int D> -void generic_gf<D>::mg_restrict (int tl, int rl, int c, int ml) +void generic_gf<D>::mg_restrict (int tl, int rl, int c, int ml, + CCTK_REAL time) { // Require same times assert (t.get_time(rl,ml) == t.get_time(rl,ml-1)); const vector<int> tl2s(1,tl); intercat (tl ,rl,c,ml, &dh<D>::dboxes::recv_mg_coarse, - tl2s,rl, ml-1, &dh<D>::dboxes::send_mg_fine); + tl2s,rl, ml-1, &dh<D>::dboxes::send_mg_fine, + time); } // Prolongate a multigrid level template<int D> -void generic_gf<D>::mg_prolongate (int tl, int rl, int c, int ml) +void generic_gf<D>::mg_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) { // Require same times assert (t.get_time(rl,ml) == t.get_time(rl,ml+1)); const vector<int> tl2s(1,tl); intercat (tl ,rl,c,ml, &dh<D>::dboxes::recv_mg_coarse, - tl2s,rl, ml+1, &dh<D>::dboxes::send_mg_fine); + tl2s,rl, ml+1, &dh<D>::dboxes::send_mg_fine, + time); } // Restrict a refinement level template<int D> -void generic_gf<D>::ref_restrict (int tl, int rl, int c, int ml) +void generic_gf<D>::ref_restrict (int tl, int rl, int c, int ml, + CCTK_REAL time) { // Require same times // SHH: removed assert and added warning - if (t.get_time(rl,ml) != t.get_time(rl+1,ml)) { - printf("WARNING: Time on rl %d is %d, time on rl %d is %d\n",rl,t.get_time(rl,ml),rl+1,t.get_time(rl+1,ml)); - } +// if (t.get_time(rl,ml) != t.get_time(rl+1,ml)) { +// printf("WARNING: Time on rl %d is %d, time on rl %d is %d\n",rl,t.get_time(rl,ml),rl+1,t.get_time(rl+1,ml)); +// } //assert (t.get_time(rl,ml) == t.get_time(rl+1,ml)); const vector<int> tl2s(1,tl); intercat (tl ,rl ,c,ml, &dh<D>::dboxes::recv_ref_fine, - tl2s,rl+1, ml, &dh<D>::dboxes::send_ref_coarse); + tl2s,rl+1, ml, &dh<D>::dboxes::send_ref_coarse, + time); } // Prolongate a refinement level template<int D> -void generic_gf<D>::ref_prolongate (int tl, int rl, int c, int ml) +void generic_gf<D>::ref_prolongate (int tl, int rl, int c, int ml, + CCTK_REAL time) { assert (rl>=1); vector<int> tl2s; @@ -490,7 +508,8 @@ void generic_gf<D>::ref_prolongate (int tl, int rl, int c, int ml) tl2s.resize(prolongation_order_time+1); for (int i=0; i<=prolongation_order_time; ++i) tl2s[i] = tmax - i; intercat (tl ,rl ,c,ml, &dh<D>::dboxes::recv_ref_coarse, - tl2s,rl-1, ml, &dh<D>::dboxes::send_ref_fine); + tl2s,rl-1, ml, &dh<D>::dboxes::send_ref_fine, + time); } diff --git a/Carpet/CarpetLib/src/ggf.hh b/Carpet/CarpetLib/src/ggf.hh index a49bb1bad..66012e469 100644 --- a/Carpet/CarpetLib/src/ggf.hh +++ b/Carpet/CarpetLib/src/ggf.hh @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.hh,v 1.11 2002/07/18 14:33:50 shawley Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.hh,v 1.12 2002/09/25 15:49:16 schnetter Exp $ ***************************************************************************/ @@ -28,6 +28,8 @@ #include <string> #include <vector> +#include "cctk.h" + #include "defs.hh" #include "dggf.hh" #include "dh.hh" @@ -138,19 +140,22 @@ protected: void intercat (int tl1, int rl1, int c1, int ml1, const ibbox dh<D>::dboxes::* recv_list, const vector<int> tl2s, int rl2, int ml2, - const ibbox dh<D>::dboxes::* send_list); + const ibbox dh<D>::dboxes::* send_list, + CCTK_REAL time); // Interpolate regions void intercat (int tl1, int rl1, int c1, int ml1, const iblist dh<D>::dboxes::* recv_list, const vector<int> tl2s, int rl2, int ml2, - const iblist dh<D>::dboxes::* send_list); + const iblist dh<D>::dboxes::* send_list, + CCTK_REAL time); // Interpolate regions void intercat (int tl1, int rl1, int c1, int ml1, const iblistvect dh<D>::dboxes::* recv_listvect, const vector<int> tl2s, int rl2, int ml2, - const iblistvect dh<D>::dboxes::* send_listvect); + const iblistvect dh<D>::dboxes::* send_listvect, + CCTK_REAL time); @@ -169,19 +174,19 @@ public: void sync (int tl, int rl, int c, int ml); // Prolongate the boundaries of a component - void ref_bnd_prolongate (int tl, int rl, int c, int ml); + void ref_bnd_prolongate (int tl, int rl, int c, int ml, CCTK_REAL time); // Restrict a multigrid level - void mg_restrict (int tl, int rl, int c, int ml); + void mg_restrict (int tl, int rl, int c, int ml, CCTK_REAL time); // Prolongate a multigrid level - void mg_prolongate (int tl, int rl, int c, int ml); + void mg_prolongate (int tl, int rl, int c, int ml, CCTK_REAL time); // Restrict a refinement level - void ref_restrict (int tl, int rl, int c, int ml); + void ref_restrict (int tl, int rl, int c, int ml, CCTK_REAL time); // Prolongate a refinement level - void ref_prolongate (int tl, int rl, int c, int ml); + void ref_prolongate (int tl, int rl, int c, int ml, CCTK_REAL time); diff --git a/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77 b/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77 index 6cb18abbb..46979c219 100644 --- a/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77 +++ b/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77 @@ -1,5 +1,5 @@ c -*-Fortran-*- -c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77,v 1.5 2002/01/09 17:45:41 schnetter Exp $ +c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_2tl.F77,v 1.6 2002/09/25 15:49:16 schnetter Exp $ #include "cctk.h" @@ -15,12 +15,12 @@ c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d integer srciext, srcjext, srckext CCTK_REAL8 src1(srciext,srcjext,srckext) - integer t1 + CCTK_REAL8 t1 CCTK_REAL8 src2(srciext,srcjext,srckext) - integer t2 + CCTK_REAL8 t2 integer dstiext, dstjext, dstkext CCTK_REAL8 dst(dstiext,dstjext,dstkext) - integer t + CCTK_REAL8 t c bbox(:,1) is lower boundary (inclusive) c bbox(:,2) is upper boundary (inclusive) c bbox(:,3) is stride @@ -105,9 +105,12 @@ c Linear (first order) interpolation if (t1.eq.t2) then call CCTK_WARN (0, "Internal error: arrays have same time") end if + if (t.lt.min(t1,t2) .or. t.gt.max(t1,t2)) then + call CCTK_WARN (0, "Internal error: extrapolation") + end if - s1fac = (t - t2) * one / (t1 - t2) - s2fac = (t - t1) * one / (t2 - t1) + s1fac = (t - t2) / (t1 - t2) + s2fac = (t - t1) / (t2 - t1) diff --git a/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77 b/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77 index 00a286952..145b7aeb9 100644 --- a/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77 +++ b/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77 @@ -1,5 +1,5 @@ c -*-Fortran-*- -c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77,v 1.7 2002/01/09 17:45:41 schnetter Exp $ +c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_2tl_o3.F77,v 1.8 2002/09/25 15:49:16 schnetter Exp $ #include "cctk.h" @@ -15,12 +15,12 @@ c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d integer srciext, srcjext, srckext CCTK_REAL8 src1(srciext,srcjext,srckext) - integer t1 + CCTK_REAL8 t1 CCTK_REAL8 src2(srciext,srcjext,srckext) - integer t2 + CCTK_REAL8 t2 integer dstiext, dstjext, dstkext CCTK_REAL8 dst(dstiext,dstjext,dstkext) - integer t + CCTK_REAL8 t c bbox(:,1) is lower boundary (inclusive) c bbox(:,2) is upper boundary (inclusive) c bbox(:,3) is stride @@ -114,9 +114,12 @@ c Linear (first order) interpolation if (t1.eq.t2) then call CCTK_WARN (0, "Internal error: arrays have same time") end if + if (t.lt.min(t1,t2) .or. t.gt.max(t1,t2)) then + call CCTK_WARN (0, "Internal error: extrapolation") + end if - s1fac = (t - t2) * one / (t1 - t2) - s2fac = (t - t1) * one / (t2 - t1) + s1fac = (t - t2) / (t1 - t2) + s2fac = (t - t1) / (t2 - t1) diff --git a/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77 b/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77 index f9c451070..6a41b64c4 100644 --- a/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77 +++ b/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77 @@ -1,5 +1,5 @@ c -*-Fortran-*- -c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77,v 1.3 2002/01/09 17:45:41 schnetter Exp $ +c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_3tl.F77,v 1.4 2002/09/25 15:49:16 schnetter Exp $ #include "cctk.h" @@ -15,14 +15,14 @@ c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d integer srciext, srcjext, srckext CCTK_REAL8 src1(srciext,srcjext,srckext) - integer t1 + CCTK_REAL8 t1 CCTK_REAL8 src2(srciext,srcjext,srckext) - integer t2 + CCTK_REAL8 t2 CCTK_REAL8 src3(srciext,srcjext,srckext) - integer t3 + CCTK_REAL8 t3 integer dstiext, dstjext, dstkext CCTK_REAL8 dst(dstiext,dstjext,dstkext) - integer t + CCTK_REAL8 t c bbox(:,1) is lower boundary (inclusive) c bbox(:,2) is upper boundary (inclusive) c bbox(:,3) is stride @@ -107,10 +107,13 @@ c Quadratic (second order) interpolation if (t1.eq.t2 .or. t1.eq.t3 .or. t2.eq.t3) then call CCTK_WARN (0, "Internal error: arrays have same time") end if + if (t.lt.min(t1,t2,t3) .or. t.gt.max(t1,t2,t3)) then + call CCTK_WARN (0, "Internal error: extrapolation") + end if - s1fac = (t - t2) * (t - t3) * one / ((t1 - t2) * (t1 - t3)) - s2fac = (t - t1) * (t - t3) * one / ((t2 - t1) * (t2 - t3)) - s3fac = (t - t1) * (t - t2) * one / ((t3 - t1) * (t3 - t2)) + s1fac = (t - t2) * (t - t3) / ((t1 - t2) * (t1 - t3)) + s2fac = (t - t1) * (t - t3) / ((t2 - t1) * (t2 - t3)) + s3fac = (t - t1) * (t - t2) / ((t3 - t1) * (t3 - t2)) diff --git a/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77 b/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77 index 2ce036fea..b36f51439 100644 --- a/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77 +++ b/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77 @@ -1,5 +1,5 @@ c -*-Fortran-*- -c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77,v 1.7 2002/01/09 17:45:41 schnetter Exp $ +c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d_real8_3tl_o3.F77,v 1.8 2002/09/25 15:49:16 schnetter Exp $ #include "cctk.h" @@ -15,14 +15,14 @@ c $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/prolongate_3d integer srciext, srcjext, srckext CCTK_REAL8 src1(srciext,srcjext,srckext) - integer t1 + CCTK_REAL8 t1 CCTK_REAL8 src2(srciext,srcjext,srckext) - integer t2 + CCTK_REAL8 t2 CCTK_REAL8 src3(srciext,srcjext,srckext) - integer t3 + CCTK_REAL8 t3 integer dstiext, dstjext, dstkext CCTK_REAL8 dst(dstiext,dstjext,dstkext) - integer t + CCTK_REAL8 t c bbox(:,1) is lower boundary (inclusive) c bbox(:,2) is upper boundary (inclusive) c bbox(:,3) is stride @@ -116,10 +116,13 @@ c Quadratic (second order) interpolation if (t1.eq.t2 .or. t1.eq.t3 .or. t2.eq.t3) then call CCTK_WARN (0, "Internal error: arrays have same time") end if + if (t.lt.min(t1,t2,t3) .or. t.gt.max(t1,t2,t3)) then + call CCTK_WARN (0, "Internal error: extrapolation") + end if - s1fac = (t - t2) * (t - t3) * one / ((t1 - t2) * (t1 - t3)) - s2fac = (t - t1) * (t - t3) * one / ((t2 - t1) * (t2 - t3)) - s3fac = (t - t1) * (t - t2) * one / ((t3 - t1) * (t3 - t2)) + s1fac = (t - t2) * (t - t3) / ((t1 - t2) * (t1 - t3)) + s2fac = (t - t1) * (t - t3) / ((t2 - t1) * (t2 - t3)) + s3fac = (t - t1) * (t - t2) / ((t3 - t1) * (t3 - t2)) diff --git a/Carpet/CarpetLib/src/th.cc b/Carpet/CarpetLib/src/th.cc index 7d22c8829..7dc292585 100644 --- a/Carpet/CarpetLib/src/th.cc +++ b/Carpet/CarpetLib/src/th.cc @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/th.cc,v 1.7 2002/05/05 22:17:03 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/th.cc,v 1.8 2002/09/25 15:49:17 schnetter Exp $ ***************************************************************************/ @@ -20,9 +20,12 @@ ***************************************************************************/ #include <assert.h> +#include <math.h> #include <iostream> +#include "cctk.h" + #include "defs.hh" #include "dggh.hh" @@ -33,7 +36,7 @@ using namespace std; // Constructors -th::th (dimgeneric_gh* h, const int basedelta) +th::th (dimgeneric_gh* h, const CCTK_REAL basedelta) : h(h), delta(basedelta) { h->add(this); } @@ -49,7 +52,7 @@ void th::recompose () { deltas.resize(h->reflevels()); for (int rl=0; rl<h->reflevels(); ++rl) { const int old_mglevels = times[rl].size(); - int mgtime; + CCTK_REAL mgtime; // Select default time if (old_mglevels==0 && rl==0) { mgtime = 0; @@ -64,7 +67,8 @@ void th::recompose () { if (rl==0 && ml==0) { deltas[rl][ml] = delta; } else if (ml==0) { - assert (deltas[rl-1][ml] % h->reffact == 0); +// assert (deltas[rl-1][ml] % h->reffact == 0); + assert (fabs(fmod(deltas[rl-1][ml], h->reffact)) < 1e-10); deltas[rl][ml] = deltas[rl-1][ml] / h->reffact; } else { deltas[rl][ml] = deltas[rl][ml-1] * h->mgfact; diff --git a/Carpet/CarpetLib/src/th.hh b/Carpet/CarpetLib/src/th.hh index 0affc5e5f..61d489d6a 100644 --- a/Carpet/CarpetLib/src/th.hh +++ b/Carpet/CarpetLib/src/th.hh @@ -6,7 +6,7 @@ copyright : (C) 2000 by Erik Schnetter email : schnetter@astro.psu.edu - $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/th.hh,v 1.7 2002/06/07 20:20:43 schnetter Exp $ + $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/th.hh,v 1.8 2002/09/25 15:49:17 schnetter Exp $ ***************************************************************************/ @@ -27,6 +27,8 @@ #include <iostream> #include <vector> +#include "cctk.h" + #include "defs.hh" #include "dggh.hh" @@ -52,14 +54,14 @@ public: // should be readonly private: - int delta; // time step - vector<vector<int> > times; // current times - vector<vector<int> > deltas; // time steps + CCTK_REAL delta; // time step + vector<vector<CCTK_REAL> > times; // current times + vector<vector<CCTK_REAL> > deltas; // time steps public: // Constructors - th (dimgeneric_gh* h, const int basedelta); + th (dimgeneric_gh* h, const CCTK_REAL basedelta); // Destructors ~th (); @@ -68,13 +70,13 @@ public: void recompose (); // Time management - int get_time (const int rl, const int ml) const { + CCTK_REAL get_time (const int rl, const int ml) const { assert (rl>=0 && rl<h->reflevels()); assert (ml>=0 && ml<h->mglevels(rl,0)); return times[rl][ml]; } - void set_time (const int rl, const int ml, const int t) { + void set_time (const int rl, const int ml, const CCTK_REAL t) { assert (rl>=0 && rl<h->reflevels()); assert (ml>=0 && ml<h->mglevels(rl,0)); times[rl][ml] = t; @@ -84,19 +86,19 @@ public: set_time(rl,ml, get_time(rl,ml) + get_delta(rl,ml)); } - int get_delta (const int rl, const int ml) const { + CCTK_REAL get_delta (const int rl, const int ml) const { assert (rl>=0 && rl<h->reflevels()); assert (ml>=0 && ml<h->mglevels(rl,0)); return deltas[rl][ml]; } - void set_delta (const int rl, const int ml, const int dt) { + void set_delta (const int rl, const int ml, const CCTK_REAL dt) { assert (rl>=0 && rl<h->reflevels()); assert (ml>=0 && ml<h->mglevels(rl,0)); deltas[rl][ml] = dt; } - int time (const int tl, const int rl, const int ml) const { + CCTK_REAL time (const int tl, const int rl, const int ml) const { assert (rl>=0 && rl<h->reflevels()); assert (ml>=0 && ml<h->mglevels(rl,0)); return get_time(rl, ml) + tl * get_delta(rl, ml); |