21 #ifndef FUB_FLUX_METHOD_HPP
22 #define FUB_FLUX_METHOD_HPP
57 template <
typename BaseMethod>
class FluxMethod :
public BaseMethod {
65 static constexpr
int Rank = Equation::Rank();
92 const BaseMethod&
Base() const noexcept;
93 BaseMethod&
Base() noexcept;
96 using BaseMethod::GetEquation;
140 using BaseMethod::ComputeNumericFlux;
182 template <
typename BaseMethod>
184 return BaseMethod::GetStencilWidth();
187 template <
typename BaseMethod>
189 return 2 * GetStencilWidth();
192 template <
typename BaseMethod>
193 template <
typename... Args>
195 : BaseMethod(std::forward<Args>(args)...) {
200 template <
typename BaseMethod>
205 using Index = std::array<std::ptrdiff_t,
sizeof...(is)>;
206 const Index face{is...};
207 const Index cell0 =
Shift(face, dir, -GetStencilWidth());
208 for (std::size_t i = 0; i < stencil_.size(); ++i) {
209 const Index cell =
Shift(cell0, dir,
static_cast<int>(i));
210 Load(stencil_[i], states, cell);
212 BaseMethod::ComputeNumericFlux(numeric_flux_, stencil_, dt, dx, dir);
213 Store(fluxes, numeric_flux_, face);
217 template <
typename BaseMethod>
221 ComputeNumericFluxes(
execution::seq, fluxes, states, dt, dx, dir);
224 template <
typename BaseMethod>
228 ComputeNumericFluxes(
execution::seq, fluxes, states, dt, dx, dir);
231 template <
typename BaseMethod>
238 template <
typename FM,
typename... Args>
240 decltype(std::declval<FM>().ComputeNumericFlux(std::declval<Args>()...));
242 template <
typename FM,
typename... Args>
246 template <
typename BaseMethod>
251 std::array<CompleteArray, StencilSize>,
254 static constexpr
int kWidth = GetStencilWidth();
257 std::array<View<const Complete>, StencilSize> stencil_views;
258 for (std::size_t i = 0; i < StencilSize; ++i) {
261 {
static_cast<std::ptrdiff_t
>(i),
262 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1});
264 std::tuple views = std::apply(
265 [&fluxes](
const auto&... vs) {
266 return std::tuple{fluxes, vs...};
273 std::array<ViewPointer<const Complete>, StencilSize> states{
Begin(rows)...};
274 int n =
static_cast<int>(get<0>(fend) - get<0>(fit));
276 for (std::size_t i = 0; i < StencilSize; ++i) {
277 Load(stencil_array_[i], states[i]);
279 ComputeNumericFlux(numeric_flux_array_, stencil_array_, dt, dx, dir);
280 Store(fit, numeric_flux_array_);
282 for (std::size_t i = 0; i < StencilSize; ++i) {
285 n =
static_cast<int>(get<0>(fend) - get<0>(fit));
287 for (std::size_t i = 0; i < StencilSize; ++i) {
288 LoadN(stencil_array_[i], states[i], n);
290 ComputeNumericFlux(numeric_flux_array_, stencil_array_, dt, dx, dir);
291 StoreN(fit, numeric_flux_array_, n);
295 template <
typename BaseMethod>
300 double min_dt = std::numeric_limits<double>::infinity();
302 [&](
const auto... is) {
303 using Index = std::array<std::ptrdiff_t,
sizeof...(is)>;
304 const Index face{is...};
305 for (std::size_t i = 0; i < stencil_.size(); ++i) {
306 const Index cell =
Shift(face, dir,
static_cast<int>(i));
307 Load(stencil_[i], states, cell);
310 BaseMethod::ComputeStableDt(stencil_, dx, dir);
311 min_dt = std::min(dt, min_dt);
316 template <
typename BaseMethod>
323 template <
typename BaseMethod>
331 template <
typename BaseMethod>
339 template <
typename T,
typename... Ts> T
Head(T&& head, Ts&&...) {
return head; }
341 template <
typename BaseMethod>
346 Array1d min_dt(std::numeric_limits<double>::infinity());
347 std::array<View<const Complete>, StencilSize> stencil_views;
348 for (std::size_t i = 0; i < StencilSize; ++i) {
351 {
static_cast<std::ptrdiff_t
>(i),
352 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1});
354 std::tuple views = std::apply(
355 [](
const auto&... vs) {
return std::tuple{vs...}; }, stencil_views);
356 ForEachRow(views, [
this, dx, dir, &min_dt](
auto... rows) {
357 std::array<ViewPointer<const Complete>, StencilSize> states{
Begin(rows)...};
359 int n =
static_cast<int>(get<0>(send) - get<0>(states[0]));
361 for (std::size_t i = 0; i < StencilSize; ++i) {
362 Load(stencil_array_[i], states[i]);
364 min_dt = min_dt.min(ComputeStableDt(stencil_array_, dx, dir));
365 for (std::size_t i = 0; i < StencilSize; ++i) {
368 n =
static_cast<int>(get<0>(send) - get<0>(states[0]));
370 for (std::size_t i = 0; i < StencilSize; ++i) {
371 LoadN(stencil_array_[i], states[i], n);
374 for (
int i = 0; i < mask_.rows(); ++i) {
375 mask_[i] =
static_cast<double>(i);
377 auto mask = (mask_ < n).eval();
378 min_dt = mask.select(min_dt.min(ComputeStableDt(stencil_array_, dx, dir)),
381 return min_dt.minCoeff();
This class applies a base flux nethod on a view of states.
Definition: flux_method/FluxMethod.hpp:57
Conservative numeric_flux_
Definition: flux_method/FluxMethod.hpp:176
static constexpr int GetStencilWidth() noexcept
Returns the stencil width of this flux method.
Definition: flux_method/FluxMethod.hpp:183
ConservativeArray numeric_flux_array_
Definition: flux_method/FluxMethod.hpp:179
std::array< Complete, StencilSize > stencil_
Definition: flux_method/FluxMethod.hpp:175
static constexpr int Rank
Definition: flux_method/FluxMethod.hpp:65
static constexpr int GetStencilSize() noexcept
Returns the number of elements in a stencil of this flux method.
Definition: flux_method/FluxMethod.hpp:188
meta::Equation< const BaseMethod & > Equation
Definition: flux_method/FluxMethod.hpp:59
std::array< CompleteArray, StencilSize > stencil_array_
Definition: flux_method/FluxMethod.hpp:178
const BaseMethod & Base() const noexcept
Returns the Implementation class which will be used to compute single fluxes.
double ComputeStableDt(const View< const Complete > &states, double dx, Direction dir)
This function computes a time step size such that no signal will leave any cell covered by this view.
Definition: flux_method/FluxMethod.hpp:318
void ComputeNumericFluxes(const View< Conservative > &fluxes, const View< const Complete > &states, Duration dt, double dx, Direction dir)
This function computes numerical fluxes.
Definition: flux_method/FluxMethod.hpp:218
static constexpr std::size_t StencilSize
Returns the number of elements in a stencil of this flux method (std::size_t version).
Definition: flux_method/FluxMethod.hpp:75
Function ForEachIndex(const layout_left::mapping< Extents > &mapping, Function function)
Iterate through the multi-dimensional index space descibed by mapping and invoke function for each su...
Definition: ForEach.hpp:74
constexpr SequentialTag seq
Definition: Execution.hpp:31
constexpr SimdTag simd
Definition: Execution.hpp:34
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
auto Shrink(const layout_left::mapping< Extent > &layout, Direction dir, std::ptrdiff_t n=1)
Definition: Equation.hpp:78
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
View< State > Subview(const BasicView< State, Layout, Rank > &state, const IndexBox< Rank > &box)
Definition: Equation.hpp:86
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
constexpr const int kDefaultChunkSize
Definition: Eigen.hpp:39
void StoreN(nodeduce_t< ViewPointer< Conservative< Eq >>> pointer, const ConservativeArray< Eq > &state, int n)
Definition: StateArray.hpp:416
IndexBox< Rank > Grow(const IndexBox< Rank > &box, Direction dir, const std::array< std::ptrdiff_t, 2 > &shifts)
Definition: PatchDataView.hpp:106
void ForEachRow(const Tuple &views, Function f)
Definition: StateRow.hpp:172
decltype(std::declval< FM >().ComputeNumericFlux(std::declval< Args >()...)) HasComputeNumericFluxType
Definition: flux_method/FluxMethod.hpp:240
void Load(State &state, const BasicView< const State, Layout, Rank > &view, const std::array< std::ptrdiff_t, State::Equation::Rank()> &index)
Definition: State.hpp:640
ViewPointer< State > Begin(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:769
void LoadN(CompleteArray< Eq, N > &state, const BasicView< const Complete< Eq >, Layout, Rank > &view, int size, nodeduce_t< const std::array< std::ptrdiff_t, std::size_t(Rank)> & > pos)
Definition: StateArray.hpp:310
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
void Advance(ViewPointer< State > &pointer, std::ptrdiff_t n) noexcept
Definition: State.hpp:825
std::array< std::ptrdiff_t, static_cast< std::size_t >(Rank)> Index
Definition: PatchDataView.hpp:34
void Store(const BasicView< Conservative< Eq >, Layout, Eq::Rank()> &view, const Conservative< Eq > &state, const std::array< std::ptrdiff_t, Eq::Rank()> &index)
Definition: State.hpp:663
T Head(T &&head, Ts &&...)
Definition: flux_method/FluxMethod.hpp:339
ViewPointer< State > End(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:782
std::array< std::ptrdiff_t, N > Shift(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift)
Definition: PatchDataView.hpp:37
Definition: State.hpp:403
Definition: PatchDataView.hpp:56
Definition: StateRow.hpp:51
Definition: State.hpp:750
Definition: Execution.hpp:39
Definition: Execution.hpp:36
Definition: Execution.hpp:30
Definition: Execution.hpp:33
This is std::true_type if Op<Args...> is a valid SFINAE expression.
Definition: type_traits.hpp:92