21 #ifndef FUB_FLUX_METHOD_GRADIENT 
   22 #define FUB_FLUX_METHOD_GRADIENT 
   40     const double two_over_one_plus_R = 2.0 / (1.0 + R);
 
   41     return std::min(two_over_one_plus_R, R * two_over_one_plus_R);
 
   44     const Array1d two_over_one_plus_R = 2.0 / (1.0 + R);
 
   45     return two_over_one_plus_R.min(R * two_over_one_plus_R);
 
   51     return 4.0 * R / ((1.0 + R) * (1.0 + R));
 
   54     return 4.0 * R / ((1.0 + R) * (1.0 + R));
 
   63   template <
typename State>
 
  107 template <
typename EulerEquation,
 
  108           typename GradientMethod = CentralDifferenceGradient<MinModLimiter>>
 
  151 template <
typename EulerEquation,
 
  152           typename GradientMethod = CentralDifferenceGradient<MinModLimiter>>
 
  174                           const GradientMethod& method)
 
  202 template <
typename Limiter>
 
  207   return mask.select(0.5 * limiter_(R) * (sL + sR), 0.0);
 
  210 template <
typename Limiter>
 
  213   if (sL * sR <= 0.0) {
 
  216   const double R = sR / sL;
 
  217   return 0.5 * limiter_(R) * (sL + sR);
 
  220 template <
typename Limiter>
 
  221 template <
typename State>
 
  226                           auto&& sR) { grad_u = ComputeGradient(sL, sR); },
 
  230 template <
typename Equation, 
typename GradientMethod>
 
  234       [dx](
double& slope, 
double uL, 
double uM) { slope = (uM - uL) / dx; },
 
  235       dudx_L_, q[0], q[1]);
 
  237       [dx](
double& slope, 
double uM, 
double uR) { slope = (uR - uM) / dx; },
 
  238       dudx_R_, q[1], q[2]);
 
  239   gradient_.ComputeGradient(dudx, dudx_L_, dudx_R_);
 
  242 template <
typename Equation, 
typename GradientMethod>
 
  246       [dx](
auto&& slope, 
Array1d uL, 
Array1d uM) { slope = (uM - uL) / dx; },
 
  247       dudx_L_array_, q[0], q[1]);
 
  249       [dx](
auto&& slope, 
Array1d uM, 
Array1d uR) { slope = (uR - uM) / dx; },
 
  250       dudx_R_array_, q[1], q[2]);
 
  251   gradient_.ComputeGradient(dudx, dudx_L_array_, dudx_R_array_);
 
  254 template <
typename Equation, 
typename GradientMethod>
 
  261       [dx](
double& slope, 
double wL, 
double wR) { slope = (wR - wL) / dx; },
 
  264       [dx](
double& slope, 
double wL, 
double wR) { slope = (wR - wL) / dx; },
 
  266   gradient_.ComputeGradient(dwdx, dwdx_L_, dwdx_R_);
 
  269 template <
typename Equation, 
typename GradientMethod>
 
  276       [dx](
auto&& slope, 
Array1d wL, 
Array1d wR) { slope = (wR - wL) / dx; },
 
  277       dwdx_L_array_, wL_array_, wM_array_);
 
  279       [dx](
auto&& slope, 
Array1d wL, 
Array1d wR) { slope = (wR - wL) / dx; },
 
  280       dwdx_R_array_, wM_array_, wR_array_);
 
  281   gradient_.ComputeGradient(dwdx, dwdx_L_array_, dwdx_R_array_);
 
  284 template <
typename Equation>
 
  288                        double ooc2, 
double dx, 
int ix) {
 
  289   const double dp = (right.pressure - left.pressure) / dx;
 
  290   const double du = (right.velocity[ix] - left.velocity[ix]) / dx;
 
  291   const double drho = (right.density - left.density) / dx;
 
  292   amplitudes.minus = dp - rhoc * du;
 
  293   amplitudes.plus = dp + rhoc * du;
 
  294   amplitudes.zero[0] = drho - ooc2 * dp;
 
  295   constexpr 
int Rank = Equation::Rank();
 
  296   for (
int i = 1; i < Rank; ++i) {
 
  297     const int iy = (ix + i) % Rank;
 
  298     amplitudes.zero[i] = (right.velocity[iy] - left.velocity[iy]) / dx;
 
  302     for (
int i = 0; i < amplitudes.species.size(); ++i) {
 
  303       amplitudes.species[i] = (right.species[i] - left.species[i]) / dx;
 
  308 template <
typename Equation>
 
  312                        Array1d ooc2, 
double dx, 
int ix) {
 
  313   const Array1d dp = (right.pressure - left.pressure) / dx;
 
  314   const Array1d du = (right.velocity.row(ix) - left.velocity.row(ix)) / dx;
 
  315   const Array1d drho = (right.density - left.density) / dx;
 
  316   amplitudes.minus = dp - rhoc * du;
 
  317   amplitudes.plus = dp + rhoc * du;
 
  318   amplitudes.zero.row(0) = drho - ooc2 * dp;
 
  319   constexpr 
int Rank = Equation::Rank();
 
  320   for (
int i = 1; i < Rank; ++i) {
 
  321     const int iy = (ix + i) % Rank;
 
  322     amplitudes.zero.row(i) =
 
  323         (right.velocity.row(iy) - left.velocity.row(iy)) / dx;
 
  327     for (
int i = 0; i < amplitudes.species.rows(); ++i) {
 
  328       amplitudes.species.row(i) =
 
  329           (right.species.row(i) - left.species.row(i)) / dx;
 
  334 template <
typename Equation, 
typename GradientMethod>
 
  340   const int ix = 
static_cast<int>(dir);
 
  341   const Array1d rho = q[1].density;
 
  342   const Array1d c = q[1].speed_of_sound;
 
  343   const Array1d ooc2 = 1.0 / (c * c);
 
  347   gradient_.ComputeGradient(dKdx, dKdx_L_array_, dKdx_R_array_);
 
  350 template <
typename Equation, 
typename GradientMethod>
 
  356   const int ix = 
static_cast<int>(dir);
 
  357   const double rho = q[1].density;
 
  358   const double c = q[1].speed_of_sound;
 
  359   const double ooc2 = 1.0 / (c * c);
 
  360   const double rhoc = rho * c;
 
  363   gradient_.ComputeGradient(dKdx, dKdx_L_, dKdx_R_);
 
Definition: Gradient.hpp:58
 
Array1d ComputeGradient(Array1d sL, Array1d sR)
Definition: Gradient.hpp:203
 
Limiter limiter_
Definition: Gradient.hpp:67
 
double ComputeGradient(double sL, double sR)
Definition: Gradient.hpp:211
 
void ComputeGradient(State &grad, const State &sL, const State &sR)
Definition: Gradient.hpp:222
 
Definition: Gradient.hpp:153
 
CharacteristicsGradient(const EulerEquation &equation)
Definition: Gradient.hpp:167
 
::fub::Characteristics< EulerEquation > Characteristics
Definition: Gradient.hpp:157
 
PrimitiveArray dwdx_L_array_
Definition: Gradient.hpp:195
 
CharacteristicsGradient(const EulerEquation &equation, const GradientMethod &method)
Definition: Gradient.hpp:173
 
EulerEquation equation_
Definition: Gradient.hpp:184
 
Primitive dwdx_R_
Definition: Gradient.hpp:189
 
void ComputeGradient(Gradient &gradient, span< const Complete, 3 > q, double dx, Direction dir)
Definition: Gradient.hpp:351
 
Characteristics dKdx_L_
Definition: Gradient.hpp:190
 
Primitive dwdx_L_
Definition: Gradient.hpp:188
 
Primitive wR_
Definition: Gradient.hpp:187
 
Primitive wL_
Definition: Gradient.hpp:185
 
CharacteristicsArray dKdx_R_array_
Definition: Gradient.hpp:198
 
Characteristics dKdx_R_
Definition: Gradient.hpp:191
 
CharacteristicsGradient(const GradientMethod &method)
Definition: Gradient.hpp:170
 
CharacteristicsArray dKdx_L_array_
Definition: Gradient.hpp:197
 
PrimitiveArray wR_array_
Definition: Gradient.hpp:194
 
CharacteristicsArray GradientArray
Definition: Gradient.hpp:163
 
PrimitiveArray dwdx_R_array_
Definition: Gradient.hpp:196
 
PrimitiveArray wM_array_
Definition: Gradient.hpp:193
 
Characteristics Gradient
Definition: Gradient.hpp:162
 
GradientMethod gradient_
Definition: Gradient.hpp:199
 
PrimitiveArray wL_array_
Definition: Gradient.hpp:192
 
CharacteristicsGradient()=default
 
::fub::CharacteristicsArray< EulerEquation > CharacteristicsArray
Definition: Gradient.hpp:158
 
Primitive wM_
Definition: Gradient.hpp:186
 
Definition: Gradient.hpp:72
 
ConservativeGradient(const GradientMethod &method)
Definition: Gradient.hpp:86
 
void ComputeGradient(Gradient &dudx, span< const Complete, 3 > q, double dx, Direction dir)
Definition: Gradient.hpp:231
 
ConservativeGradient()=default
 
Conservative dudx_R_
Definition: Gradient.hpp:101
 
Equation equation_
Definition: Gradient.hpp:99
 
GradientMethod gradient_
Definition: Gradient.hpp:104
 
ConservativeGradient(const Equation &, const GradientMethod &method)
Definition: Gradient.hpp:89
 
ConservativeArray dudx_L_array_
Definition: Gradient.hpp:102
 
ConservativeArray dudx_R_array_
Definition: Gradient.hpp:103
 
::fub::Conservative< Equation > Conservative
Definition: Gradient.hpp:76
 
Conservative Gradient
Definition: Gradient.hpp:79
 
ConservativeArray GradientArray
Definition: Gradient.hpp:80
 
::fub::ConservativeArray< Equation > ConservativeArray
Definition: Gradient.hpp:77
 
ConservativeGradient(const Equation &eq)
Definition: Gradient.hpp:84
 
Conservative dudx_L_
Definition: Gradient.hpp:100
 
Definition: Gradient.hpp:109
 
Primitive wL_
Definition: Gradient.hpp:138
 
Primitive dwdx_L_
Definition: Gradient.hpp:141
 
Primitive wR_
Definition: Gradient.hpp:140
 
PrimitiveArray wL_array_
Definition: Gradient.hpp:143
 
PrimitiveArray GradientArray
Definition: Gradient.hpp:117
 
PrimitiveGradient(const EulerEquation &equation)
Definition: Gradient.hpp:121
 
PrimitiveGradient()=default
 
::fub::PrimitiveArray< EulerEquation > PrimitiveArray
Definition: Gradient.hpp:114
 
PrimitiveGradient(const EulerEquation &equation, const GradientMethod &method)
Definition: Gradient.hpp:127
 
::fub::Primitive< EulerEquation > Primitive
Definition: Gradient.hpp:113
 
Primitive Gradient
Definition: Gradient.hpp:116
 
PrimitiveArray dwdx_R_array_
Definition: Gradient.hpp:147
 
Primitive wM_
Definition: Gradient.hpp:139
 
PrimitiveGradient(const GradientMethod &method)
Definition: Gradient.hpp:124
 
PrimitiveArray wM_array_
Definition: Gradient.hpp:144
 
Primitive dwdx_R_
Definition: Gradient.hpp:142
 
void ComputeGradient(Gradient &gradient, span< const Complete, 3 > q, double dx, Direction dir)
Definition: Gradient.hpp:255
 
PrimitiveArray dwdx_L_array_
Definition: Gradient.hpp:146
 
GradientMethod gradient_
Definition: Gradient.hpp:148
 
EulerEquation equation_
Definition: Gradient.hpp:137
 
PrimitiveArray wR_array_
Definition: Gradient.hpp:145
 
A span is a view over a contiguous sequence of objects, the storage of which is owned by some other o...
Definition: span.hpp:81
 
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
 
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
 
void ComputeAmplitudes(Characteristics< Equation > &litudes, const Primitive< Equation > &left, const Primitive< Equation > &right, double rhoc, double ooc2, double dx, int ix)
Definition: Gradient.hpp:285
 
void PrimFromComplete(const PerfectGas< Rank > &, Primitive< PerfectGas< Rank >> &prim, const Complete< PerfectGas< Rank >> &complete)
Definition: PerfectGas.hpp:322
 
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
 
void ForEachComponent(F function, Ts &&... states)
Definition: State.hpp:624
 
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
 
Definition: Gradient.hpp:38
 
double operator()(double R) const noexcept
Definition: Gradient.hpp:39
 
Array1d operator()(Array1d R) const noexcept
Definition: Gradient.hpp:43
 
Definition: Gradient.hpp:28
 
double operator()(double) const noexcept
Definition: Gradient.hpp:29
 
Array1d operator()(Array1d) const noexcept
Definition: Gradient.hpp:30
 
Definition: Gradient.hpp:33
 
Array1d operator()(Array1d) const noexcept
Definition: Gradient.hpp:35
 
double operator()(double) const noexcept
Definition: Gradient.hpp:34
 
Definition: Gradient.hpp:49
 
Array1d operator()(Array1d R) const noexcept
Definition: Gradient.hpp:53
 
double operator()(double R) const noexcept
Definition: Gradient.hpp:50
 
Definition: EulerEquation.hpp:343