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