Finite Volume Solver  prototype
A framework to build finite volume solvers for the AG Klein at the Freie Universität Berlin.
flux_method/MusclHancockMethod.hpp
Go to the documentation of this file.
1 // Copyright (c) 2019 Maikel Nadolski
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 // SOFTWARE.
20 
21 #ifndef FUB_IDEAL_GAS_FLUX_METHOD_MUSCL_HANCOCK_METHOD
22 #define FUB_IDEAL_GAS_FLUX_METHOD_MUSCL_HANCOCK_METHOD
23 
24 #include "fub/CompleteFromCons.hpp"
25 #include "fub/Equation.hpp"
26 #include "fub/core/span.hpp"
29 
30 namespace fub {
31 struct NoLimiter {
32  template <typename Equation>
34  span<const Complete<Equation>, 3> stencil) {
36  [](double& cons, double qL, double qM, double qR) {
37  const double sL = qM - qL;
38  const double sR = qR - qM;
39  cons = 0.5 * (sL + sR);
40  },
41  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
42  }
43 
44  template <typename Equation, int N>
46  span<const CompleteArray<Equation, N>, 3> stencil) {
48  [](auto&& cons, auto qL, auto qM, auto qR) {
49  const Array<double, 1, N> sL = qM - qL;
50  const Array<double, 1, N> sR = qR - qM;
51  cons = 0.5 * (sL + sR);
52  },
53  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
54  }
55 
56  template <typename Equation, int N>
58  span<const CompleteArray<Equation, N>, 3> stencil,
59  MaskArray mask) {
61  [=](auto&& cons, auto qL, auto qM, auto qR) {
63  const Array<double, 1, N> sL = mask.select(qM - qL, zero);
64  const Array<double, 1, N> sR = mask.select(qR - qM, zero);
65  cons = 0.5 * (sL + sR);
66  },
67  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
68  }
69 };
70 
71 struct NoGradient {
72  template <typename Equation>
74  span<const Complete<Equation>, 3>) {
75  ForEachComponent([](double& cons) { cons = 0.0; }, cons);
76  }
77 
78  template <typename Equation, int N>
80  span<const CompleteArray<Equation, N>, 3>) {
81  ForEachComponent([](auto&& cons) { cons = Array1d::Zero(); }, cons);
82  }
83 
84  template <typename Equation, int N>
87  MaskArray) {
88  ForEachComponent([](auto&& cons) { cons = Array1d::Zero(); }, cons);
89  }
90 };
91 
92 struct MinMod {
93  template <typename Equation>
95  span<const Complete<Equation>, 3> stencil) {
97  [](double& cons, double qL, double qM, double qR) {
98  const double sL = qM - qL;
99  const double sR = qR - qM;
100  if (sR > 0) {
101  cons = std::max(0.0, std::min(sL, sR));
102  } else {
103  cons = std::min(0.0, std::max(sL, sR));
104  }
105  },
106  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
107  }
108 
109  template <typename Equation, int N>
111  span<const CompleteArray<Equation, N>, 3> stencil) {
113  [](auto&& cons, auto qL, auto qM, auto qR) {
114  const Array<double, 1, N> sL = qM - qL;
115  const Array<double, 1, N> sR = qR - qM;
117  cons = (sR > 0).select(zero.max(sL.min(sR)), zero.min(sL.max(sR)));
118  },
119  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
120  }
121 
122  template <typename Equation, int N>
124  span<const CompleteArray<Equation, N>, 3> stencil,
125  MaskArray mask) {
127  [=](auto&& cons, auto qL, auto qM, auto qR) {
129  const Array<double, 1, N> sL = mask.select(qM - qL, zero);
130  const Array<double, 1, N> sR = mask.select(qR - qM, zero);
131  cons = (sR > 0).select(zero.max(sL.min(sR)), zero.min(sL.max(sR)));
132  },
133  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
134  }
135 };
136 
137 struct VanLeer {
138  double operator()(double sL, double sR) const noexcept {
139  double c = 2.0 * sL * sR;
140  return (c > 0.0) ? c / (sL + sR) : 0.0;
141  // return 0.0;
142  }
143 
144  Array1d operator()(Array1d sL, Array1d sR) const noexcept {
145  Array1d r = 2.0 * sL * sR;
146  Array1d result = (r > 0.0).select(r / (sL + sR), 0.0);
147  return result;
148  // return Array1d::Zero();
149  }
150 
151  template <typename Equation>
153  span<const Complete<Equation>, 3> stencil) {
155  [this](double& cons, double qL, double qM, double qR) {
156  const double sL = qM - qL;
157  const double sR = qR - qM;
158  cons = this->operator()(sL, sR);
159  },
160  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
161  }
162 
163  template <typename Equation>
165  span<const CompleteArray<Equation>, 3> stencil,
166  MaskArray mask) {
168  [this, mask](auto&& cons, auto qL, auto qM, auto qR) {
169  const Array1d sL = mask.select(qM - qL, 0.0);
170  const Array1d sR = mask.select(qR - qM, 0.0);
171  cons = this->operator()(sL, sR);
172  },
173  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
174  }
175 
176  template <typename Equation>
178  span<const CompleteArray<Equation>, 3> stencil) {
180  [this](auto&& cons, auto qL, auto qM, auto qR) {
181  const Array1d sL = qM - qL;
182  const Array1d sR = qR - qM;
183  cons = this->operator()(sL, sR);
184  },
185  cons, AsCons(stencil[0]), AsCons(stencil[1]), AsCons(stencil[2]));
186  }
187 };
188 
189 template <typename EquationT,
190  typename BaseMethod =
191  GodunovMethod<EquationT, ExactRiemannSolver<EquationT>>,
192  typename SlopeLimiter = MinMod>
193 struct MusclHancock {
194  using Equation = EquationT;
195  using Complete = typename Equation::Complete;
196  using Conservative = typename Equation::Conservative;
197 
200 
201  explicit MusclHancock(const Equation& eq) : equation_{eq}, flux_method_{eq} {}
202 
203  MusclHancock(const Equation& eq, const BaseMethod& method)
204  : equation_{eq}, flux_method_{method} {}
205 
206  static constexpr int GetStencilWidth() noexcept { return 2; }
207 
208  double ComputeStableDt(span<const Complete, 4> states, double dx,
209  Direction dir) noexcept {
210  return flux_method_.ComputeStableDt(states.template subspan<1, 2>(), dx,
211  dir);
212  }
213 
215  Direction dir) noexcept {
216  return flux_method_.ComputeStableDt(states.template subspan<1, 2>(), dx,
217  dir);
218  }
219 
221  Array1d face_fraction,
222  span<const Array1d, 4> volume_fraction, double dx,
223  Direction dir) {
224  return flux_method_.ComputeStableDt(
225  states.template subspan<1, 2>(), face_fraction,
226  volume_fraction.template subspan<1, 2>(), dx, dir);
227  }
228 
230  Duration dt, double dx, Direction dir);
231 
234  double dx, Direction dir);
235 
238  double dx, Direction dir);
239 
240  void ComputeNumericFlux(ConservativeArray& flux, Array1d face_fractions,
242  span<Array1d, 4> volume_fractions, Duration dt,
243  double dx, Direction dir);
244 
245  const Equation& GetEquation() const noexcept { return equation_; }
246  Equation& GetEquation() noexcept { return equation_; }
247 
248 private:
249  // These member variables control the behaviour of this method
251  BaseMethod flux_method_;
252  SlopeLimiter slope_limiter_;
253 
254  // These member variables are used as an intermediate computation storage
255  // and need to be allocated at construction time.
256  std::array<Complete, 2> rec_{Complete{equation_}, Complete{equation_}};
257  Conservative slope_{equation_}; //< Storage for the limited slopes
258  Conservative flux_left_{equation_}; //< Storage for an intermediate left flux
260  equation_}; //< Storage for an intermediate right flux
261  Complete q_left_{equation_}; //< Storage for an intermediate left state
262  Complete q_right_{equation_}; //< Storage for an intermediate right state
263 
264  std::array<CompleteArray, 2> rec_arr_{CompleteArray{equation_},
266  ConservativeArray slope_arr_{equation_}; //< Storage for the limited slopes
268  equation_}; //< Storage for an intermediate left flux
270  equation_}; //< Storage for an intermediate right flux
272  equation_}; //< Storage for an intermediate left state
274  equation_}; //< Storage for an intermediate right state
275 };
276 
277 /// \ingroup FluxMethod
278 template <typename Equation,
279  typename BaseMethod =
281  typename Slope = MinMod>
283  : FluxMethod<MusclHancock<Equation, BaseMethod, Slope>> {
285 };
286 
287 template <typename Equation>
289 
290 template <typename Equation, typename Method>
291 MusclHancockMethod(const Equation&, const Method&)
293 
294 template <typename Equation, typename Method, typename SlopeLimiter>
296  Conservative& flux, span<const Complete, 4> stencil, Duration dt, double dx,
297  Direction dir) {
298  const double lambda_half = 0.5 * dt.count() / dx;
299 
300  ////////////////////////////////////////////////////////////////////////////
301  // Compute Left Reconstructed Complete State
302 
303  slope_limiter_.ComputeLimitedSlope(slope_, stencil.template first<3>());
304 
306  [](double& qL, double& qR, double state, double slope) {
307  qL = state - 0.5 * slope;
308  qR = state + 0.5 * slope;
309  },
310  AsCons(q_left_), AsCons(q_right_), AsCons(stencil[1]), slope_);
311 
312  CompleteFromCons(equation_, q_left_, q_left_);
313  CompleteFromCons(equation_, q_right_, q_right_);
314 
315  Flux(equation_, flux_left_, q_left_, dir);
316  Flux(equation_, flux_right_, q_right_, dir);
317 
319  [&lambda_half](double& rec, double qR, double fL, double fR) {
320  rec = qR + lambda_half * (fL - fR);
321  },
322  AsCons(rec_[0]), AsCons(q_right_), flux_left_, flux_right_);
323 
324  CompleteFromCons(equation_, rec_[0], rec_[0]);
325 
326  ///////////////////////////////////////////////////////////////////////////
327  // Compute Right Reconstructed Complete State
328 
329  slope_limiter_.ComputeLimitedSlope(slope_, stencil.template last<3>());
330 
332  [](double& qL, double& qR, double state, double slope) {
333  qL = state - 0.5 * slope;
334  qR = state + 0.5 * slope;
335  },
336  AsCons(q_left_), AsCons(q_right_), AsCons(stencil[2]), slope_);
337 
338  CompleteFromCons(equation_, q_left_, q_left_);
339  CompleteFromCons(equation_, q_right_, q_right_);
340 
341  Flux(equation_, flux_left_, q_left_, dir);
342  Flux(equation_, flux_right_, q_right_, dir);
343 
345  [&lambda_half](double& rec, double qL, double fL, double fR) {
346  rec = qL + lambda_half * (fL - fR);
347  },
348  AsCons(rec_[1]), AsCons(q_left_), flux_left_, flux_right_);
349 
350  CompleteFromCons(equation_, rec_[1], rec_[1]);
351 
352  ///////////////////////////////////////////////////////////////////////////
353  // Invoke Lower Order Flux Method
354 
355  flux_method_.ComputeNumericFlux(flux, span{rec_}, dt, dx, dir);
356 }
357 
358 template <typename Equation, typename Method, typename SlopeLimiter>
360  Conservative& flux, span<const Complete, 2> stencil,
361  span<const Conservative, 2> gradients, Duration dt, double dx,
362  Direction dir) {
363  const double lambda_half = 0.5 * dt.count() / dx;
364 
365  ////////////////////////////////////////////////////////////////////////////
366  // Compute Left Reconstructed Complete State
367 
369  [dx](double& qL, double& qR, double state, double slope) {
370  qL = state - 0.5 * slope * dx;
371  qR = state + 0.5 * slope * dx;
372  },
373  AsCons(q_left_), AsCons(q_right_), AsCons(stencil[0]), gradients[0]);
374 
375  CompleteFromCons(equation_, q_left_, q_left_);
376  CompleteFromCons(equation_, q_right_, q_right_);
377 
378  Flux(equation_, flux_left_, q_left_, dir);
379  Flux(equation_, flux_right_, q_right_, dir);
380 
382  [&lambda_half](double& rec, double qR, double fL, double fR) {
383  rec = qR + lambda_half * (fL - fR);
384  },
385  AsCons(rec_[0]), AsCons(q_right_), flux_left_, flux_right_);
386 
387  CompleteFromCons(equation_, rec_[0], rec_[0]);
388 
389  ///////////////////////////////////////////////////////////////////////////
390  // Compute Right Reconstructed Complete State
391 
393  [dx](double& qL, double& qR, double state, double slope) {
394  qL = state - 0.5 * slope * dx;
395  qR = state + 0.5 * slope * dx;
396  },
397  AsCons(q_left_), AsCons(q_right_), AsCons(stencil[1]), gradients[1]);
398 
399  CompleteFromCons(equation_, q_left_, q_left_);
400  CompleteFromCons(equation_, q_right_, q_right_);
401 
402  Flux(equation_, flux_left_, q_left_, dir);
403  Flux(equation_, flux_right_, q_right_, dir);
404 
406  [&lambda_half](double& rec, double qL, double fL, double fR) {
407  rec = qL + lambda_half * (fL - fR);
408  },
409  AsCons(rec_[1]), AsCons(q_left_), flux_left_, flux_right_);
410 
411  CompleteFromCons(equation_, rec_[1], rec_[1]);
412 
413  ///////////////////////////////////////////////////////////////////////////
414  // Invoke Lower Order Flux Method
415 
416  flux_method_.ComputeNumericFlux(flux, span{rec_}, dt, dx, dir);
417 }
418 
419 template <typename Equation, typename Method, typename SlopeLimiter>
422  double dx, Direction dir) {
423  const Array1d lambda_half = Array1d::Constant(0.5 * dt.count() / dx);
424 
425  ////////////////////////////////////////////////////////////////////////////
426  // Compute Left Reconstructed Complete State
427 
428  slope_limiter_.ComputeLimitedSlope(slope_arr_, stencil.template first<3>());
429 
431  [](auto&& qL, auto&& qR, const auto& state, const auto& slope) {
432  qL = state - 0.5 * slope;
433  qR = state + 0.5 * slope;
434  },
435  AsCons(q_left_arr_), AsCons(q_right_arr_), AsCons(stencil[1]),
436  slope_arr_);
437 
438  CompleteFromCons(equation_, q_left_arr_, q_left_arr_);
439  CompleteFromCons(equation_, q_right_arr_, q_right_arr_);
440 
441  Flux(equation_, flux_left_arr_, q_left_arr_, dir);
442  Flux(equation_, flux_right_arr_, q_right_arr_, dir);
443 
445  [&lambda_half](auto&& rec, auto qR, auto fL, auto fR) {
446  rec = qR + lambda_half * (fL - fR);
447  },
448  AsCons(rec_arr_[0]), AsCons(q_right_arr_), flux_left_arr_,
449  flux_right_arr_);
450 
451  CompleteFromCons(equation_, rec_arr_[0], rec_arr_[0]);
452 
453  ///////////////////////////////////////////////////////////////////////////
454  // Compute Right Reconstructed Complete State
455 
456  slope_limiter_.ComputeLimitedSlope(slope_arr_, stencil.template last<3>());
457 
459  [](auto&& qL, auto&& qR, const auto& state, const auto& slope) {
460  qL = state - 0.5 * slope;
461  qR = state + 0.5 * slope;
462  },
463  AsCons(q_left_arr_), AsCons(q_right_arr_), AsCons(stencil[2]),
464  slope_arr_);
465 
466  CompleteFromCons(equation_, q_left_arr_, q_left_arr_);
467  CompleteFromCons(equation_, q_right_arr_, q_right_arr_);
468 
469  Flux(equation_, flux_left_arr_, q_left_arr_, dir);
470  Flux(equation_, flux_right_arr_, q_right_arr_, dir);
471 
473  [&lambda_half](auto&& rec, auto qL, auto fL, auto fR) {
474  rec = qL + lambda_half * (fL - fR);
475  },
476  AsCons(rec_arr_[1]), AsCons(q_left_arr_), flux_left_arr_,
477  flux_right_arr_);
478 
479  CompleteFromCons(equation_, rec_arr_[1], rec_arr_[1]);
480 
481  ///////////////////////////////////////////////////////////////////////////
482  // Invoke Lower Order Flux Method
483 
484  flux_method_.ComputeNumericFlux(flux, span{rec_arr_}, dt, dx, dir);
485 }
486 
487 template <typename Equation, typename Method, typename SlopeLimiter>
489  ConservativeArray& flux, Array1d face_fractions,
490  span<const CompleteArray, 4> stencil, span<Array1d, 4> volume_fractions,
491  Duration dt, double dx, Direction dir) {
492  MaskArray valid_face = face_fractions > 0.0;
493  if (valid_face.any()) {
494  const Array1d lambda_half = Array1d::Constant(0.5 * dt.count() / dx);
495 
496  ////////////////////////////////////////////////////////////////////////////
497  // Compute Left Reconstructed Complete State
498 
499  MaskArray left_slope_mask = volume_fractions[0] > 0.0 &&
500  volume_fractions[1] > 0.0 &&
501  volume_fractions[2] > 0.0;
502  slope_limiter_.ComputeLimitedSlope(slope_arr_, stencil.template first<3>(),
503  left_slope_mask);
504 
506  [=](auto&& qL, auto&& qR, const auto& state, const auto& slope) {
507  Array1d q0 = valid_face.select(state, 0.0);
508  qL = q0 - 0.5 * slope;
509  qR = q0 + 0.5 * slope;
510  },
511  AsCons(q_left_arr_), AsCons(q_right_arr_), AsCons(stencil[1]),
512  slope_arr_);
513 
514  CompleteFromCons(equation_, q_left_arr_, q_left_arr_, valid_face);
515  CompleteFromCons(equation_, q_right_arr_, q_right_arr_, valid_face);
516 
517  Flux(equation_, flux_left_arr_, q_left_arr_, valid_face, dir);
518  Flux(equation_, flux_right_arr_, q_right_arr_, valid_face, dir);
519 
521  [&lambda_half](auto&& rec, auto qR, auto fL, auto fR) {
522  rec = qR + lambda_half * (fL - fR);
523  },
524  AsCons(rec_arr_[0]), AsCons(q_right_arr_), flux_left_arr_,
525  flux_right_arr_);
526 
527  CompleteFromCons(equation_, rec_arr_[0], rec_arr_[0], valid_face);
528 
529  ///////////////////////////////////////////////////////////////////////////
530  // Compute Right Reconstructed Complete State
531 
532  MaskArray right_slope_mask = volume_fractions[1] > 0.0 &&
533  volume_fractions[2] > 0.0 &&
534  volume_fractions[3] > 0.0;
535  slope_limiter_.ComputeLimitedSlope(slope_arr_, stencil.template last<3>(),
536  right_slope_mask);
537 
539  [=](auto&& qL, auto&& qR, const auto& state, const auto& slope) {
540  Array1d q0 = valid_face.select(state, 0.0);
541  qL = q0 - 0.5 * slope;
542  qR = q0 + 0.5 * slope;
543  },
544  AsCons(q_left_arr_), AsCons(q_right_arr_), AsCons(stencil[2]),
545  slope_arr_);
546 
547  CompleteFromCons(equation_, q_left_arr_, q_left_arr_, valid_face);
548  CompleteFromCons(equation_, q_right_arr_, q_right_arr_, valid_face);
549 
550  Flux(equation_, flux_left_arr_, q_left_arr_, valid_face, dir);
551  Flux(equation_, flux_right_arr_, q_right_arr_, valid_face, dir);
552 
554  [&lambda_half](auto&& rec, auto qL, auto fL, auto fR) {
555  rec = qL + lambda_half * (fL - fR);
556  },
557  AsCons(rec_arr_[1]), AsCons(q_left_arr_), flux_left_arr_,
558  flux_right_arr_);
559 
560  CompleteFromCons(equation_, rec_arr_[1], rec_arr_[1], valid_face);
561 
562  ///////////////////////////////////////////////////////////////////////////
563  // Invoke Lower Order Flux Method
564 
565  flux_method_.ComputeNumericFlux(flux, face_fractions, span{rec_arr_},
566  volume_fractions.template subspan<1, 2>(),
567  dt, dx, dir);
568  } else {
569  ForEachComponent([](auto&& cons) { cons = Array1d::Zero(); }, flux);
570  }
571 }
572 
573 } // namespace fub
574 
575 #endif
This class applies a base flux nethod on a view of states.
Definition: flux_method/FluxMethod.hpp:57
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
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
FluxMethod(F &&) -> FluxMethod< execution::OpenMpSimdTag, std::decay_t< F >>
std::decay_t< decltype(std::declval< T >().GetEquation())> Equation
A template typedef to detect the member function.
Definition: Meta.hpp:59
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::conditional_t< N==1||M==1, Eigen::Array< T, N, M >, Eigen::Array< T, N, M, Eigen::RowMajor > > Array
Definition: Eigen.hpp:50
MusclHancockMethod(const Equation &) -> MusclHancockMethod< Equation >
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
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
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
Definition: StateArray.hpp:178
Definition: StateArray.hpp:135
Definition: flux_method/GodunovMethod.hpp:93
Definition: flux_method/MusclHancockMethod.hpp:92
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:110
void ComputeLimitedSlope(Conservative< Equation > &cons, span< const Complete< Equation >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:94
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 > stencil, MaskArray mask)
Definition: flux_method/MusclHancockMethod.hpp:123
Definition: flux_method/MusclHancockMethod.hpp:283
Definition: flux_method/MusclHancockMethod.hpp:193
Array1d ComputeStableDt(span< const CompleteArray, 4 > states, Array1d face_fraction, span< const Array1d, 4 > volume_fraction, double dx, Direction dir)
Definition: flux_method/MusclHancockMethod.hpp:220
CompleteArray q_right_arr_
Definition: flux_method/MusclHancockMethod.hpp:273
EquationT Equation
Definition: flux_method/MusclHancockMethod.hpp:194
typename Equation::Complete Complete
Definition: flux_method/MusclHancockMethod.hpp:195
Equation equation_
Definition: flux_method/MusclHancockMethod.hpp:250
Array1d ComputeStableDt(span< const CompleteArray, 4 > states, double dx, Direction dir) noexcept
Definition: flux_method/MusclHancockMethod.hpp:214
Conservative flux_left_
Definition: flux_method/MusclHancockMethod.hpp:258
Equation & GetEquation() noexcept
Definition: flux_method/MusclHancockMethod.hpp:246
std::array< Complete, 2 > rec_
Definition: flux_method/MusclHancockMethod.hpp:256
std::array< CompleteArray, 2 > rec_arr_
Definition: flux_method/MusclHancockMethod.hpp:264
SlopeLimiter slope_limiter_
Definition: flux_method/MusclHancockMethod.hpp:252
CompleteArray q_left_arr_
Definition: flux_method/MusclHancockMethod.hpp:271
Conservative slope_
Definition: flux_method/MusclHancockMethod.hpp:257
ConservativeArray slope_arr_
Definition: flux_method/MusclHancockMethod.hpp:266
ConservativeArray flux_right_arr_
Definition: flux_method/MusclHancockMethod.hpp:269
Complete q_right_
Definition: flux_method/MusclHancockMethod.hpp:262
MusclHancock(const Equation &eq, const BaseMethod &method)
Definition: flux_method/MusclHancockMethod.hpp:203
typename Equation::Conservative Conservative
Definition: flux_method/MusclHancockMethod.hpp:196
Conservative flux_right_
Definition: flux_method/MusclHancockMethod.hpp:259
ConservativeArray flux_left_arr_
Definition: flux_method/MusclHancockMethod.hpp:267
BaseMethod flux_method_
Definition: flux_method/MusclHancockMethod.hpp:251
const Equation & GetEquation() const noexcept
Definition: flux_method/MusclHancockMethod.hpp:245
double ComputeStableDt(span< const Complete, 4 > states, double dx, Direction dir) noexcept
Definition: flux_method/MusclHancockMethod.hpp:208
void ComputeNumericFlux(Conservative &flux, span< const Complete, 4 > stencil, Duration dt, double dx, Direction dir)
Definition: flux_method/MusclHancockMethod.hpp:295
MusclHancock(const Equation &eq)
Definition: flux_method/MusclHancockMethod.hpp:201
Complete q_left_
Definition: flux_method/MusclHancockMethod.hpp:261
static constexpr int GetStencilWidth() noexcept
Definition: flux_method/MusclHancockMethod.hpp:206
Definition: flux_method/MusclHancockMethod.hpp:71
void ComputeLimitedSlope(Conservative< Equation > &cons, span< const Complete< Equation >, 3 >)
Definition: flux_method/MusclHancockMethod.hpp:73
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 >, MaskArray)
Definition: flux_method/MusclHancockMethod.hpp:85
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 >)
Definition: flux_method/MusclHancockMethod.hpp:79
Definition: flux_method/MusclHancockMethod.hpp:31
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 > stencil, MaskArray mask)
Definition: flux_method/MusclHancockMethod.hpp:57
void ComputeLimitedSlope(ConservativeArray< Equation, N > &cons, span< const CompleteArray< Equation, N >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:45
void ComputeLimitedSlope(Conservative< Equation > &cons, span< const Complete< Equation >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:33
Definition: flux_method/MusclHancockMethod.hpp:137
void ComputeLimitedSlope(ConservativeArray< Equation > &cons, span< const CompleteArray< Equation >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:177
double operator()(double sL, double sR) const noexcept
Definition: flux_method/MusclHancockMethod.hpp:138
Array1d operator()(Array1d sL, Array1d sR) const noexcept
Definition: flux_method/MusclHancockMethod.hpp:144
void ComputeLimitedSlope(ConservativeArray< Equation > &cons, span< const CompleteArray< Equation >, 3 > stencil, MaskArray mask)
Definition: flux_method/MusclHancockMethod.hpp:164
void ComputeLimitedSlope(Conservative< Equation > &cons, span< const Complete< Equation >, 3 > stencil)
Definition: flux_method/MusclHancockMethod.hpp:152