Finite Volume Solver  prototype
A framework to build finite volume solvers for the AG Klein at the Freie Universität Berlin.
CompleteFromCons.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_COMPLETE_FROM_CONS_HPP
22 #define FUB_COMPLETE_FROM_CONS_HPP
23 
24 #include "Execution.hpp"
25 #include "fub/State.hpp"
26 #include "fub/StateArray.hpp"
27 #include "fub/StateRow.hpp"
28 
29 #include <cstring>
30 #include <type_traits>
31 
32 /// \defgroup CompleteFromCons Complete From Cons Calculations
33 /// \ingroup IntegratorContext
34 
35 namespace fub {
36 template <typename Eq, typename... Args>
38  decltype(std::declval<Eq>().CompleteFromCons(std::declval<Args>()...));
39 
40 /// \ingroup CompleteFromCons
41 template <typename Equation>
42 void CompleteFromCons(Equation&& equation,
43  Complete<std::decay_t<Equation>>& complete,
44  const Conservative<std::decay_t<Equation>>& cons) {
45  using Eq = std::decay_t<Equation>;
47  Complete<Eq>&, const Conservative<Eq>&>::value) {
48  equation.CompleteFromCons(complete, cons);
49  } else {
50  static_assert(sizeof(Complete<Eq>) == sizeof(Conservative<Eq>));
51  ForEachVariable([](auto& dest, const auto& src) { dest = src; },
52  AsCons(complete), cons);
53  }
54 }
55 
56 /// \ingroup CompleteFromCons
57 template <typename Equation>
58 void CompleteFromCons(Equation&& equation,
59  Complete<std::decay_t<Equation>>& complete,
60  const Complete<std::decay_t<Equation>>& cons) {
61  using Eq = std::decay_t<Equation>;
63  Complete<Eq>&,
64  const ConservativeBase<Eq>&>::value) {
65  equation.CompleteFromCons(complete, AsCons(cons));
66  } else {
67  static_assert(sizeof(Complete<Eq>) == sizeof(Conservative<Eq>));
68  ForEachVariable([](auto& dest, const auto& src) { dest = src; },
69  AsCons(complete), AsCons(cons));
70  }
71 }
72 
73 /// \ingroup CompleteFromCons
74 template <typename Equation>
75 void CompleteFromCons(Equation&& equation,
76  CompleteArray<std::decay_t<Equation>>& complete,
77  const ConservativeArray<std::decay_t<Equation>>& cons) {
78  using Eq = std::decay_t<Equation>;
81  const ConservativeArray<Eq>&>::value) {
82  equation.CompleteFromCons(complete, cons);
83  } else {
84  static_assert(sizeof(Complete<Eq>) == sizeof(Conservative<Eq>));
85  ForEachVariable([](auto& dest, const auto& src) { dest = src; },
86  AsCons(complete), cons);
87  }
88 }
89 
90 /// \ingroup CompleteFromCons
91 template <typename Equation>
92 void CompleteFromCons(Equation&& equation,
93  CompleteArray<std::decay_t<Equation>>& complete,
94  const ConservativeArrayBase<std::decay_t<Equation>>& cons,
95  MaskArray mask) {
96  using Eq = std::decay_t<Equation>;
99  MaskArray>::value) {
100  equation.CompleteFromCons(complete, cons, mask);
101  } else {
102  static_assert(sizeof(Complete<Eq>) == sizeof(Conservative<Eq>));
104  [&](auto& dest, const auto& src) { dest = mask.select(src, dest); },
105  AsCons(complete), cons);
106  }
107 }
108 
109 /// \ingroup CompleteFromCons
110 template <typename Equation>
111 void CompleteFromCons(Equation&& equation,
112  CompleteArray<std::decay_t<Equation>>& complete,
113  const CompleteArray<std::decay_t<Equation>>& cons) {
114  using Eq = std::decay_t<Equation>;
117  const ConservativeArray<Eq>&>::value) {
118  equation.CompleteFromCons(complete, AsCons(cons));
119  } else {
120  static_assert(sizeof(Complete<Eq>) == sizeof(Conservative<Eq>));
121  ForEachVariable([](auto& dest, const auto& src) { dest = src; },
122  AsCons(complete), AsCons(cons));
123  }
124 }
125 
126 /// \ingroup CompleteFromCons
127 template <typename Equation>
129  Equation&& eq, const View<Complete<std::decay_t<Equation>>>& complete_view,
130  const View<const Conservative<std::decay_t<Equation>>>& cons_view) {
131  Complete<std::decay_t<Equation>> complete(eq);
133  ForEachIndex(Box<0>(complete_view), [&](auto... is) {
134  Load(cons, cons_view, {is...});
135  CompleteFromCons(eq, complete, cons);
136  Store(complete_view, complete, {is...});
137  });
138 }
139 
140 /// \ingroup CompleteFromCons
141 template <typename Equation> struct CompleteFromConsFn {
147 
150 
151  void operator()(const Row<Complete<Equation>>& complete_row,
152  const Row<const Conservative<Equation>>& cons_row) const {
153  ViewPointer in = Begin(cons_row);
154  ViewPointer end = End(cons_row);
155  ViewPointer out = Begin(complete_row);
156  Equation& equation = this_->equation_;
157  CompleteArray<Equation>& complete = this_->complete_array_;
158  ConservativeArray<Equation>& cons = this_->cons_array_;
159  int n = static_cast<int>(get<0>(end) - get<0>(in));
160  while (n >= kDefaultChunkSize) {
161  Load(cons, in);
162  ::fub::CompleteFromCons(equation, complete, cons);
163  Store(out, complete);
166  n = static_cast<int>(get<0>(end) - get<0>(in));
167  }
168  LoadN(cons, in, n);
169  ::fub::CompleteFromCons(equation, complete, cons);
170  StoreN(out, complete, n);
171  }
172  };
173 
175  const View<Complete<Equation>>& complete_view,
176  const View<const Conservative<Equation>>& cons_view) {
177  FUB_ASSERT(Box<0>(complete_view) == Box<0>(cons_view));
178  ForEachRow(std::tuple{complete_view, cons_view},
179  CompleteFromCons_Rows{this});
180  }
181 
183  const View<Complete<Equation>>& complete_view,
184  const View<const Conservative<Equation>>& cons_view) {
185  FUB_ASSERT(Box<0>(complete_view) == Box<0>(cons_view));
186  ForEachIndex(Box<0>(cons_view), [&](auto... is) {
187  Load(cons_, cons_view, {is...});
189  Store(complete_view, complete_, {is...});
190  });
191  }
192 
194  const View<Complete<Equation>>& complete_view,
195  const View<const Conservative<Equation>>& cons_view) {
196  return CompleteFromCons(execution::seq, complete_view, cons_view);
197  }
198 
200  const View<Complete<Equation>>& complete_view,
201  const View<const Conservative<Equation>>& cons_view) {
202  return CompleteFromCons(execution::simd, complete_view, cons_view);
203  }
204 };
205 
206 } // namespace fub
207 
208 #endif
#define FUB_ASSERT(x)
Definition: assert.hpp:39
void CompleteFromCons(Equation &&eq, const View< Complete< std::decay_t< Equation >>> &complete_view, const View< const Conservative< std::decay_t< Equation >>> &cons_view)
Definition: CompleteFromCons.hpp:128
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
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
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
constexpr const int kDefaultChunkSize
Definition: Eigen.hpp:39
void ForEachVariable(F function, Ts &&... states)
Definition: State.hpp:89
void StoreN(nodeduce_t< ViewPointer< Conservative< Eq >>> pointer, const ConservativeArray< Eq > &state, int n)
Definition: StateArray.hpp:416
void ForEachRow(const Tuple &views, Function f)
Definition: StateRow.hpp:172
decltype(std::declval< Eq >().CompleteFromCons(std::declval< Args >()...)) CompleteFromConsMemberFunction
Definition: CompleteFromCons.hpp:38
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
void Advance(ViewPointer< State > &pointer, std::ptrdiff_t n) noexcept
Definition: State.hpp:825
const Conservative< Eq > & AsCons(const Conservative< Eq > &x)
Definition: State.hpp:438
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
ViewPointer< State > End(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:782
Array< bool, 1 > MaskArray
Definition: Eigen.hpp:59
typename detail::ConservativeArrayBaseImpl< Eq, Width >::type ConservativeArrayBase
Definition: StateArray.hpp:132
boost::mp11::mp_transform< detail::DepthToStateValueType, typename Equation::ConservativeDepths > ConservativeBase
This type alias transforms state depths into a conservative state associated with a specified equatio...
Definition: State.hpp:247
Definition: State.hpp:403
Definition: StateArray.hpp:178
Definition: CompleteFromCons.hpp:148
CompleteFromConsFn< Equation > * this_
Definition: CompleteFromCons.hpp:149
void operator()(const Row< Complete< Equation >> &complete_row, const Row< const Conservative< Equation >> &cons_row) const
Definition: CompleteFromCons.hpp:151
Definition: CompleteFromCons.hpp:141
void CompleteFromCons(execution::SequentialTag, const View< Complete< Equation >> &complete_view, const View< const Conservative< Equation >> &cons_view)
Definition: CompleteFromCons.hpp:182
ConservativeArray< Equation > cons_array_
Definition: CompleteFromCons.hpp:144
Conservative< Equation > cons_
Definition: CompleteFromCons.hpp:146
Complete< Equation > complete_
Definition: CompleteFromCons.hpp:145
Equation equation_
Definition: CompleteFromCons.hpp:142
void CompleteFromCons(execution::OpenMpTag, const View< Complete< Equation >> &complete_view, const View< const Conservative< Equation >> &cons_view)
Definition: CompleteFromCons.hpp:193
void CompleteFromCons(execution::OpenMpSimdTag, const View< Complete< Equation >> &complete_view, const View< const Conservative< Equation >> &cons_view)
Definition: CompleteFromCons.hpp:199
void CompleteFromCons(execution::SimdTag, const View< Complete< Equation >> &complete_view, const View< const Conservative< Equation >> &cons_view)
Definition: CompleteFromCons.hpp:174
CompleteArray< Equation > complete_array_
Definition: CompleteFromCons.hpp:143
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:335
Definition: StateArray.hpp:135
This type has a constructor which takes an equation and might allocate any dynamically sized member v...
Definition: State.hpp:251
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