11#include "include/Sfx_Utility.h"
12#include "include/BaseMacros.h"
13#include "include/Sfx_UniversalConstants.h"
29 assert( Sfx::EMCNEILNbSections::value == std::ranges::size(aRng));
31 std::valarray<double> w_valArray(Sfx::DIM::value);
33 for(
auto i = 0; i < Sfx::DIM::value; ++i)
37 w_valArray[i] = (0.5 *(aRng[i + 1] + aRng[i]));
41 w_valArray[i] = (0.5 * (aRng[i + 1] + aRng[i - 1]));
71 template<
typename Range1,
typename Range2>
76 static_assert( std::is_same_v<
decltype(aRng1),
const std::valarray<double>&>,
"Not using numeric valarray");
77 static_assert( std::is_same_v<
decltype(aRng2),
const std::valarray<double>&>,
"Not using numeric valarray");
79 if constexpr (std::ranges::size(aRng1) != std::ranges::size(aRng2))
81 return { Range1 {}, Range2 {} };
83 else if constexpr (std::ranges::empty(aRng1) && std::ranges::empty(aRng2))
85 return { Range1 {}, Range2 {} };
90 Range1 w_df1p{ aRng1.size() };
91 Range2 w_df2p{ aRng2.size() };
94 w_df1p[0] = Sfx::minmod(aRng1[1] - aRng1[0], 0.);
95 w_df2p[0] = Sfx::minmod(aRng2[1] - aRng2[0], 0.);
98 for (uint32 i2 = 1; i2 < aRng1.size() - 1; ++i2)
100 w_df1p[i2] = Sfx::minmod(aRng1[i2 + 1] - aRng1[i2], aRng1[i2] - aRng1[i2 - 1]);
101 w_df2p[i2] = Sfx::minmod(aRng2[i2 + 1] - aRng2[i2], aRng2[i2] - aRng2[i2 - 1]);
105 w_df1p[aRng1.size() - 1] = Sfx::minmod(0., aRng1[aRng1.size() - 1] - aRng1[aRng1.size() - 2]);
106 w_df2p[aRng2.size() - 1] = Sfx::minmod(0., aRng2[aRng2.size() - 1] - aRng2[aRng2.size() - 2]);
108 return { w_df1p, w_df2p };
117 template<
typename Range,
typename FuncLimiter>
118 requires std::same_as<Range, std::vector<float64>>
122 if constexpr (std::ranges::range<
decltype(aRng)>)
123 assert(std::ranges::distance(aRng) == Sfx::EMCNEILNbSections::value);
126 std::vector<double> w_deltaU(std::ranges::size(aRng));
129 std::adjacent_difference(std::ranges::begin(aRng), std::ranges::end(aRng), w_deltaU.begin());
133 if (w_deltaU[0] != 0.)
139 w_deltaU.push_back(0.);
142 std::adjacent_difference(w_deltaU.begin(), w_deltaU.end(),
146 return std::move(w_deltaU) | std::views::drop(1);
154 template<
typename Range,
typename FuncLimiter>
155 decltype(
auto)
computeDU( Range& aRng, FuncLimiter&& aFuncLimiter)
159 assert(Sfx::EMCNEILNbSections::value == std::distance(std::begin(aRng), std::end(aRng)));
161 std::vector<float64> w_deltaU(std::ranges::cbegin(aRng), std::ranges::cend(aRng));
164 std::adjacent_difference(std::ranges::cbegin(aRng), std::ranges::cend(aRng), w_deltaU.begin());
166 if (w_deltaU[0] != 0.)
172 w_deltaU.push_back(0.);
174 std::adjacent_difference(w_deltaU.begin(), w_deltaU.end(), w_deltaU.begin(),
175 std::forward<FuncLimiter>(aFuncLimiter));
182 return std::vector<double>(std::next(w_deltaU.begin()), w_deltaU.end());
196 if constexpr (std::ranges::view<
decltype(aView)>)
197 static_assert( std::ranges::distance(aView) == Sfx::EMCNEILNbSections::value);
199 auto view_type = std::ranges::range_value_t<
decltype(aView)>;
200 std::vector<view_type> w_dU;
201 w_dU.reserve(std::ranges::size(aView));
204 std::adjacent_difference(std::ranges::begin(aView), std::ranges::end(aView),
210 std::adjacent_difference(w_dU.begin(), w_dU.end(),
214 return std::valarray<view_type>( std::next(w_dU.begin()), w_dU.size()-1);
218 template<
typename Range>
228 assert( std::ranges::size(aRng) == EMCNEILNbSections::value);
235 if constexpr( std::ranges::range<
decltype(aRng)>)
239 std::valarray<float64> w_valArray(std::ranges::size(aRng) - 1);
241 for (
auto i = 0; i < std::ranges::size(aRng) - 1; ++i)
245 w_valArray[i] = (0.5 * Sfx::cGravity<float64> *(aRng[i + 1] + aRng[i]));
249 w_valArray[i] = (0.5 * Sfx::cGravity<float64> *(aRng[i + 1] + aRng[i - 1]));
257 return std::valarray<double>{};
274 aTheta += cPi<float64>;
275 aTheta -=
static_cast<float>(floor(aTheta * c1Over2Pi<float64>) * c2Pi<float64>);
276 aTheta -= cPi<float64>;
301 return static_cast<float>(acos(x));
309 constexpr float64
degToRad( float64 aDeg) {
return aDeg * cPiOver180<float64>; }
310 constexpr float64
radToDeg( float64 aRad) {
return aRad * c180OverPi<float64>; }
320 inline void sinCos(
float* aReturnSin,
float* aReturnCos,
float aTheta)
324 *aReturnSin =
static_cast<float>(sin(aTheta));
325 *aReturnCos =
static_cast<float>(cos(aTheta));
329 template<
typename Range>
332 static_assert(0 != std::size(aU1));
333 static_assert(std::is_same_v<std::size(aU1), std::size(aU2)>);
335 if constexpr (!std::is_same_v<std::size(aU1), std::size(aU2)>)
341 return (aU2 * aU2) / aU1;
Minmod limiter function for slope limiting gradient evaluation.
Definition dbpp_SimulationUtilities.hpp:89
float64 wrapPi(float64 aTheta)
"Wrap" an angle in range -pi...pi by adding the correct multiple of 2 pi
Definition Sfx_MathFunctions.hpp:272
constexpr float64 radToDeg(float64 aRad)
Definition Sfx_MathFunctions.hpp:310
auto computeDU(Range aRng, FuncLimiter &&aFuncLimiter)
Compute gradient over cell by applying a slope limiter function. Range aRng Range of values (computat...
Definition Sfx_MathFunctions.hpp:119
float64 safeAcos(float64 x)
"Safe" inverse trig functions
Definition Sfx_MathFunctions.hpp:290
void sinCos(float *aReturnSin, float *aReturnCos, float aTheta)
Compute the sin and cosine of an angle. On some platforms, if we know that we need both values,...
Definition Sfx_MathFunctions.hpp:320
std::common_type_t< Range1, Range2 > computeLimitedGradient(const Range1 &aRng1, const Range2 &aRng2)
Compute gradient by using a limiter function.
Definition Sfx_MathFunctions.hpp:72
auto computeDU_v(std::ranges::view auto aView)
state variables gradient over each cell (1st order)
Definition Sfx_MathFunctions.hpp:193
std::valarray< float64 > cell_face_average(std::ranges::view auto aRng)
Compute average of a variable at cell face.
Definition Sfx_MathFunctions.hpp:24
constexpr float64 degToRad(float64 aDeg)
Convert between degrees and radians.
Definition Sfx_MathFunctions.hpp:309
auto StVenant1D_Incomplete_Flux(Range &aU1, Range &aU2)
Definition Sfx_MathFunctions.hpp:330
Check if types are identical using fold expression.
Definition dbpp_SimulationUtilities.hpp:41