User: rhaas Date: 2014/04/15 02:49 PM
Added: /trunk/src/ GRHydro_TVDReconstruct.cc, GRHydro_TVDReconstruct.hh
Modified: /trunk/src/ GRHydro_Reconstruct.cc, make.code.defn
Log: GRHydro: add TVD reconstruct
File Changes:
Directory: /trunk/src/ ======================
File [modified]: GRHydro_Reconstruct.cc Delta lines: +3 -3 =================================================================== --- trunk/src/GRHydro_Reconstruct.cc 2014-04-15 19:49:28 UTC (rev 625) +++ trunk/src/GRHydro_Reconstruct.cc 2014-04-15 19:49:31 UTC (rev 626) @@ -187,15 +187,15 @@
if (CCTK_EQUALS(tvd_limiter, "minmod")) {
- reconstruct<GRHydro_TVDReconstruct1d<0> >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH); + reconstruct<GRHydro_TVDReconstruct1dtvd::minmod >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH);
} else if (CCTK_EQUALS(tvd_limiter, "vanleerMC2")) {
- reconstruct<GRHydro_TVDReconstruct1d<1> >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH); + reconstruct<GRHydro_TVDReconstruct1dtvd::mc2 >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH);
} else if (CCTK_EQUALS(tvd_limiter, "superbee")) {
- reconstruct<GRHydro_TVDReconstruct1d<2> >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH); + reconstruct<GRHydro_TVDReconstruct1dtvd::superbee >::select(do_mhd, do_Ye, do_temp, reconstruct_Wv, clean_divergence, cctkGH);
} else { CCTK_ERROR("TVD limiter not recognized!");
File [added]: GRHydro_TVDReconstruct.cc Delta lines: +97 -0 =================================================================== --- trunk/src/GRHydro_TVDReconstruct.cc (rev 0) +++ trunk/src/GRHydro_TVDReconstruct.cc 2014-04-15 19:49:31 UTC (rev 626) @@ -0,0 +1,97 @@ +#include <cmath> +#include "cctk.h" +#include "cctk_Parameters.h" +#include "cctk_Arguments.h" +#include "cctk_Functions.h" + +#include "GRHydro_TVDReconstruct.hh" +#include "GRHydro_Reconstruct_drv_impl.hh" + + +using namespace std; + +/** + TVD reconstruction operator. + limiter_type: 0 = minmod + 1 = mc2 + 2 = superbee +*/ +template <tvd::limiter_type limiter> +CCTK_REAL GRHydro_TVDReconstruct1d<limiter>:: +minmod_func(const CCTK_REAL dupw, const CCTK_REAL dloc) +{ + return 0.5 * (copysign(1.0,dupw) + copysign(1.0,dloc)) * + fmin(fabs(dupw),fabs(dloc)); +} + +template <tvd::limiter_type limiter> +CCTK_REAL GRHydro_TVDReconstruct1d<limiter>:: +min3(const CCTK_REAL a, const CCTK_REAL b, const CCTK_REAL c) +{ + return fmin(a,fmin(b,c)); +} + +template <tvd::limiter_type limiter> +template <int dir> +void GRHydro_TVDReconstruct1d<limiter>:: +apply(const int nx, const CCTK_REAL* const restrict a, + CCTK_REAL* const restrict aminus, CCTK_REAL* const restrict aplus, + const cGH* const cctkGH, const int j, const int k) +{ + DECLARE_CCTK_PARAMETERS; + +#define A(i_) (a[ijk[i_]]) +#define Aplus(i_) (aplus[ijk[i_]]) +#define Aminus(i_) (aminus[ijk[i_]]) + + + for (int i=GRHydro_stencil-1; i < nx-GRHydro_stencil + 1; ++i) + { + + const int ijk[3] = { + dir ==0 ? CCTK_GFINDEX3D(cctkGH, i-1, j, k) : dir ==1 ? CCTK_GFINDEX3D(cctkGH, j, i-1, k) : CCTK_GFINDEX3D(cctkGH, j, k, i-1), + dir ==0 ? CCTK_GFINDEX3D(cctkGH, i , j, k) : dir ==1 ? CCTK_GFINDEX3D(cctkGH, j, i , k) : CCTK_GFINDEX3D(cctkGH, j, k, i ), + dir ==0 ? CCTK_GFINDEX3D(cctkGH, i+1, j, k) : dir ==1 ? CCTK_GFINDEX3D(cctkGH, j, i+1, k) : CCTK_GFINDEX3D(cctkGH, j, k, i+1), + }; + + const CCTK_REAL dupw = A(1)-A(0); + const CCTK_REAL dloc = A(2)-A(1); + CCTK_REAL delta = 0.0; + + static_assert(limiter >= tvd::minmod && limiter < tvd::numlimiters, + "Unknown limiter"); + if(limiter == tvd::minmod) { + // minmod + delta = minmod_func(dupw,dloc); + } else if (limiter == tvd::mc2) { + // Van Leer MC slope limiter (mc2) + if(dupw*dloc < 0.0) + delta = 0.0; + else + delta = copysign(min3(2.0*fabs(dupw),2.0*fabs(dloc), + 0.5*(fabs(dupw)+fabs(dloc))),dupw+dloc); + + } else if (limiter == tvd::superbee) { + // superbee + if(dupw*dloc < 0.0) + delta = 0.0; + else + delta = copysign(fmax(fmin(2.0*fabs(dupw),fabs(dloc)), + fmin(2.0*fabs(dloc),fabs(dupw))),dupw+dloc); + + } + Aminus(1) = A(1) - 0.5*delta; + Aplus(1) = A(1) + 0.5*delta; + } +} + +// instantiate all copies we need, this way different operators can be compiled +// in parallel. This must match the select routine in GRHydro_Reconstruct.cc +template class GRHydro_TVDReconstruct1dtvd::minmod; +template class GRHydro_TVDReconstruct1dtvd::mc2; +template class GRHydro_TVDReconstruct1dtvd::superbee; + +INSTANTIATE_RECONSTRUCTION_OPERATOR(GRHydro_TVDReconstruct1dtvd::minmod) +INSTANTIATE_RECONSTRUCTION_OPERATOR(GRHydro_TVDReconstruct1dtvd::mc2) +INSTANTIATE_RECONSTRUCTION_OPERATOR(GRHydro_TVDReconstruct1dtvd::superbee) +
File [added]: GRHydro_TVDReconstruct.hh Delta lines: +33 -0 =================================================================== --- trunk/src/GRHydro_TVDReconstruct.hh (rev 0) +++ trunk/src/GRHydro_TVDReconstruct.hh 2014-04-15 19:49:31 UTC (rev 626) @@ -0,0 +1,33 @@ +#ifndef _GRHYDRO_TVDRECONSTRUCT_HH +#define _GRHYDRO_TVDRECONSTRUCT_HH + +#include "cctk.h" + +/** + TVD reconstruction operator. + limiter_type: 0 = minmod + 1 = mc2 + 2 = superbee +*/ +namespace tvd { + enum limiter_type {minmod = 0, mc2 = 1, superbee = 2, numlimiters}; +} +template <tvd::limiter_type limiter> +struct GRHydro_TVDReconstruct1d { + + static inline CCTK_REAL minmod_func(const CCTK_REAL dupw, + const CCTK_REAL dloc); + static inline CCTK_REAL min3(const CCTK_REAL a, + const CCTK_REAL b, + const CCTK_REAL c); + template <int dir> + static inline void apply(const int nx, + const CCTK_REAL* const restrict a, + CCTK_REAL* const restrict aminus, + CCTK_REAL* const restrict aplus, + const cGH* const cctkGH, + const int j, const int k + ); +}; // end struct + +#endif // _GRHYDRO_TVDRECONSTRUCT_HH
File [modified]: make.code.defn Delta lines: +1 -0 =================================================================== --- trunk/src/make.code.defn 2014-04-15 19:49:28 UTC (rev 625) +++ trunk/src/make.code.defn 2014-04-15 19:49:31 UTC (rev 626) @@ -88,6 +88,7 @@ GRHydro_ePPM.cc \ GRHydro_PPMReconstruct_drv_opt.cc \ GRHydro_WENOReconstruct.cc \ + GRHydro_TVDReconstruct.cc \ GRHydro_TrivialReconstruct.cc \ GRHydro_MP5Reconstruct.cc \ GRHydro_Wrappers.F90 \
commits@lists.einsteintoolkit.org