21 #ifndef FUB_FLUX_METHOD_RECONSTRUCT 
   22 #define FUB_FLUX_METHOD_RECONSTRUCT 
  131 template <
typename Equation>
 
  136       [dx](
double& uL, 
double& uR, 
double u, 
double du_dx) {
 
  137         const double du = 0.5 * dx * du_dx;
 
  144   Flux(equation_, flux_left_, q_left_, dir);
 
  145   Flux(equation_, flux_right_, q_right_, dir);
 
  146   const double lambda_half = 0.5 * dt.count() / dx;
 
  149       [&lambda_half](
double& rec, 
double u, 
double fL, 
double fR) {
 
  150         const double dF = fL - fR;
 
  151         const double dU = lambda_half * dF;
 
  154       AsCons(reconstruction), 
AsCons(q), flux_left_, flux_right_);
 
  158 template <
typename Equation>
 
  162     Side side) noexcept {
 
  164       [dx](
auto&& uL, 
auto&& uR, 
auto&& u, 
auto&& du_dx) {
 
  165         const Array1d du = 0.5 * dx * du_dx;
 
  169       AsCons(q_left_array_), 
AsCons(q_right_array_), q0, dq_dx);
 
  172   Flux(equation_, flux_left_array_, q_left_array_, dir);
 
  173   Flux(equation_, flux_right_array_, q_right_array_, dir);
 
  174   const double lambda_half = 0.5 * dt.count() / dx;
 
  177       [&lambda_half](
auto&& rec, 
auto&& u, 
auto&& fL, 
auto&& fR) {
 
  179         const Array1d dU = lambda_half * dF;
 
  182       AsCons(reconstruction), 
AsCons(q), flux_left_array_, flux_right_array_);
 
  186 template <
typename EulerEquation>
 
  191   const int ix = 
static_cast<int>(dir);
 
  193   const double lambda = sign * dt.count() / dx;
 
  194   const double dx_half = sign * 0.5 * dx;
 
  195   const double u = w_.velocity[ix];
 
  196   const double rho = q0.density;
 
  197   const double a = q0.speed_of_sound;
 
  198   const double a2 = a * a;
 
  199   const double rho_a2 = rho * a2;
 
  202       dx_half * (dw_dx.density -
 
  203                  lambda * (u * dw_dx.density + rho * dw_dx.velocity[ix]));
 
  206       dx_half * (dw_dx.pressure -
 
  207                  lambda * (rho_a2 * dw_dx.velocity[ix] + u * dw_dx.pressure));
 
  208   w_rec_.velocity[ix] =
 
  210       dx_half * (dw_dx.velocity[ix] +
 
  211                  lambda * (u * dw_dx.velocity[ix] + dw_dx.pressure / rho));
 
  212   constexpr 
int Rank = EulerEquation::Rank();
 
  213   for (
int i = 1; i < Rank; ++i) {
 
  214     const int iy = (ix + i) % Rank;
 
  215     w_rec_.velocity[iy] =
 
  217         dx_half * (dw_dx.velocity[iy] - lambda * u * dw_dx.velocity[iy]);
 
  220     for (
int i = 0; i < w_rec_.species.size(); ++i) {
 
  223           dx_half * (dw_dx.species[i] - lambda * u * dw_dx.species[i]);
 
  229 template <
typename EulerEquation>
 
  233     Side side) noexcept {
 
  235   const int ix = 
static_cast<int>(dir);
 
  237   const Array1d lambda = Array1d::Constant(sign * dt.count() / dx);
 
  238   const Array1d dx_half = Array1d::Constant(sign * 0.5 * dx);
 
  239   const Array1d u = w_array_.velocity.row(ix);
 
  240   const Array1d rho = q0.density;
 
  241   const Array1d a = q0.speed_of_sound;
 
  243   const Array1d rho_a2 = rho * a2;
 
  244   w_rec_array_.density =
 
  246       dx_half * (dw_dx.density -
 
  247                  lambda * (u * dw_dx.density + rho * dw_dx.velocity.row(ix)));
 
  248   w_rec_array_.pressure =
 
  250       dx_half * (dw_dx.pressure - lambda * (rho_a2 * dw_dx.velocity.row(ix) +
 
  251                                             u * dw_dx.pressure));
 
  252   w_rec_array_.velocity.row(ix) =
 
  253       w_array_.velocity.row(ix) +
 
  254       dx_half * (dw_dx.velocity.row(ix) +
 
  255                  lambda * (u * dw_dx.velocity.row(ix) + dw_dx.pressure / rho));
 
  256   constexpr 
int Rank = EulerEquation::Rank();
 
  257   for (
int i = 1; i < Rank; ++i) {
 
  258     const int iy = (ix + i) % Rank;
 
  259     w_rec_array_.velocity.row(iy) =
 
  260         w_array_.velocity.row(iy) + dx_half * (dw_dx.velocity.row(iy) -
 
  261                                          lambda * u * dw_dx.velocity.row(iy));
 
  264     for (
int i = 0; i < w_rec_array_.species.rows(); ++i) {
 
  265       w_rec_array_.species.row(i) =
 
  266           w_array_.species.row(i) +
 
  267           dx_half * (dw_dx.species.row(i) - lambda * u * dw_dx.species.row(i));
 
  273 template <
typename EulerEquation>
 
  278   const int ix = 
static_cast<int>(dir);
 
  279   const double u = w_rec_.velocity[ix];
 
  280   const double c = q0.speed_of_sound;
 
  282   const double lambda = sign * dt.count() / dx;
 
  283   const double dx_half = sign * 0.5 * dx;
 
  284   dKdt_.minus = dx_half * dKdx.minus * (1.0 - lambda * (u - c));
 
  285   dKdt_.plus = dx_half * dKdx.plus * (1.0 - lambda * (u + c));
 
  286   for (
int i = 0; i < dKdt_.zero.size(); ++i) {
 
  287     dKdt_.zero[i] = dx_half * dKdx.zero[i] * (1.0 - lambda * u);
 
  290     for (
int i = 0; i < dKdt_.species.size(); ++i) {
 
  291       dKdt_.species[i] = dx_half * dKdx.species[i] * (1.0 - lambda * u);
 
  294   const double rho = w_rec_.density;
 
  295   const double rhoc = rho * c;
 
  296   const double c2 = c * c;
 
  297   dwdt_.pressure = 0.5 * (dKdt_.minus + dKdt_.plus);
 
  298   dwdt_.density = dwdt_.pressure / c2 + dKdt_.zero[0];
 
  299   dwdt_.velocity.row(ix) = 0.5 * (dKdt_.plus - dKdt_.minus) / rhoc;
 
  300   constexpr 
int Rank = EulerEquation::Rank();
 
  301   for (
int i = 1; i < Rank; ++i) {
 
  302     const int iy = (ix + i) % Rank;
 
  303     dwdt_.velocity.row(iy) = dKdt_.zero[i];
 
  306     for (
int i = 0; i < dKdt_.species.size(); ++i) {
 
  307       dwdt_.species[i] = dKdt_.species[i];
 
  314 template <
typename EulerEquation>
 
  318     Side side) noexcept {
 
  320   const int ix = 
static_cast<int>(dir);
 
  321   const Array1d u = w_rec_array_.velocity.row(ix);
 
  322   const Array1d c = q0.speed_of_sound;
 
  324   const Array1d lambda = Array1d::Constant(sign * dt.count() / dx);
 
  325   const Array1d dx_half = Array1d::Constant(sign * 0.5 * dx);
 
  327       dx_half * dKdx.minus * (Array1d::Constant(1.0) - lambda * (u - c));
 
  329       dx_half * dKdx.plus * (Array1d::Constant(1.0) - lambda * (u + c));
 
  330   for (
int i = 0; i < dKdt_array_.zero.rows(); ++i) {
 
  331     dKdt_array_.zero.row(i) =
 
  332         dx_half * dKdx.zero.row(i) * (Array1d::Constant(1.0) - lambda * u);
 
  335     for (
int i = 0; i < dKdt_array_.species.rows(); ++i) {
 
  336       dKdt_array_.species.row(i) =
 
  337           dx_half * dKdx.species.row(i) * (Array1d::Constant(1.0) - lambda * u);
 
  340   const Array1d rho = w_rec_array_.density;
 
  343   dwdt_array_.pressure = 0.5 * (dKdt_array_.minus + dKdt_array_.plus);
 
  344   dwdt_array_.density = dwdt_array_.pressure / c2 + dKdt_array_.zero.row(0);
 
  345   dwdt_array_.velocity.row(ix) = 0.5 * (dKdt_array_.plus - dKdt_array_.minus) / rhoc;
 
  346   constexpr 
int Rank = EulerEquation::Rank();
 
  347   for (
int i = 1; i < Rank; ++i) {
 
  348     const int iy = (ix + i) % Rank;
 
  349     dwdt_array_.velocity.row(iy) = dKdt_array_.zero.row(i);
 
  352     for (
int i = 0; i < dKdt_array_.species.rows(); ++i) {
 
  353       dwdt_array_.species.row(i) = dKdt_array_.species.row(i);
 
  356   w_rec_array_ += dwdt_array_;
 
Definition: Reconstruct.hpp:96
 
Primitive w_rec_
Definition: Reconstruct.hpp:122
 
CharacteristicsReconstruction(const EulerEquation &equation)
Definition: Reconstruct.hpp:108
 
PrimitiveArray w_rec_array_
Definition: Reconstruct.hpp:126
 
EulerEquation equation_
Definition: Reconstruct.hpp:120
 
CharacteristicsArray GradientArray
Definition: Reconstruct.hpp:106
 
Primitive dwdt_
Definition: Reconstruct.hpp:123
 
Characteristics dKdt_
Definition: Reconstruct.hpp:124
 
::fub::CharacteristicsArray< EulerEquation > CharacteristicsArray
Definition: Reconstruct.hpp:103
 
void Reconstruct(Complete &reconstruction, const Complete &q0, const Gradient &dw_dx, Duration dt, double dx, Direction dir, Side side) noexcept
Definition: Reconstruct.hpp:274
 
::fub::Characteristics< EulerEquation > Characteristics
Definition: Reconstruct.hpp:98
 
Characteristics Gradient
Definition: Reconstruct.hpp:101
 
CharacteristicsArray dKdt_array_
Definition: Reconstruct.hpp:128
 
PrimitiveArray dwdt_array_
Definition: Reconstruct.hpp:127
 
Definition: Reconstruct.hpp:30
 
CompleteArray q_right_array_
Definition: Reconstruct.hpp:60
 
ConservativeReconstruction(const Equation &equation)
Definition: Reconstruct.hpp:40
 
Complete q_right_
Definition: Reconstruct.hpp:55
 
Conservative flux_left_
Definition: Reconstruct.hpp:56
 
void Reconstruct(Complete &reconstruction, const Complete &q0, const Gradient &du_dx, Duration dt, double dx, Direction dir, Side side) noexcept
Definition: Reconstruct.hpp:132
 
ConservativeArray GradientArray
Definition: Reconstruct.hpp:38
 
ConservativeArray flux_right_array_
Definition: Reconstruct.hpp:62
 
ConservativeArray flux_left_array_
Definition: Reconstruct.hpp:61
 
Conservative Gradient
Definition: Reconstruct.hpp:34
 
CompleteArray q_left_array_
Definition: Reconstruct.hpp:59
 
::fub::ConservativeArray< Equation > ConservativeArray
Definition: Reconstruct.hpp:36
 
Conservative flux_right_
Definition: Reconstruct.hpp:57
 
Equation equation_
Definition: Reconstruct.hpp:52
 
::fub::Conservative< Equation > Conservative
Definition: Reconstruct.hpp:32
 
Complete q_left_
Definition: Reconstruct.hpp:54
 
Definition: Reconstruct.hpp:65
 
EulerEquation equation_
Definition: Reconstruct.hpp:87
 
Primitive w_rec_
Definition: Reconstruct.hpp:89
 
void Reconstruct(Complete &reconstruction, const Complete &q0, const Gradient &dw_dx, Duration dt, double dx, Direction dir, Side side) noexcept
Definition: Reconstruct.hpp:187
 
Primitive w_
Definition: Reconstruct.hpp:90
 
::fub::PrimitiveArray< EulerEquation > PrimitiveArray
Definition: Reconstruct.hpp:71
 
PrimitiveArray w_rec_array_
Definition: Reconstruct.hpp:92
 
Primitive Gradient
Definition: Reconstruct.hpp:69
 
PrimitiveArray w_array_
Definition: Reconstruct.hpp:93
 
::fub::Primitive< EulerEquation > Primitive
Definition: Reconstruct.hpp:67
 
PrimitiveReconstruction(const EulerEquation &equation)
Definition: Reconstruct.hpp:75
 
PrimitiveArray GradientArray
Definition: Reconstruct.hpp:73
 
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
 
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
 
void Flux(Eq &&equation, Conservative< Equation > &flux, const Complete< Equation > &state, Direction dir, [[maybe_unused]] double x=0.0)
Definition: Equation.hpp:108
 
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
 
Side
This is a type safe type to denote a side.
Definition: Direction.hpp:34
 
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
 
void PrimFromComplete(const PerfectGas< Rank > &, Primitive< PerfectGas< Rank >> &prim, const Complete< PerfectGas< Rank >> &complete)
Definition: PerfectGas.hpp:322
 
void CompleteFromPrim(const PerfectGas< Rank > &equation, Complete< PerfectGas< Rank >> &complete, const Primitive< PerfectGas< Rank >> &prim)
Definition: PerfectGas.hpp:314
 
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
 
const Conservative< Eq > & AsCons(const Conservative< Eq > &x)
Definition: State.hpp:438
 
void ForEachComponent(F function, Ts &&... states)
Definition: State.hpp:624
 
Definition: EulerEquation.hpp:343