AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
Operations.hpp
1 #pragma once
2 
3 #include <amdis/Operations.hpp>
4 #include <amdis/gridfunctions/ComposerGridFunction.hpp>
5 #include <amdis/operations/Arithmetic.hpp>
6 #include <amdis/operations/FieldMatVec.hpp>
7 
8 namespace AMDiS
9 {
15  // scalar operations
16  // @{
17 
19  template <class Lhs,
20  REQUIRES(Concepts::AnyGridFunction<Lhs>)>
21  auto operator-(Lhs&& lhs)
22  {
23  return invokeAtQP(Operation::Negate{}, FWD(lhs));
24  }
25 
27  template <class Lhs, class Rhs,
28  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
29  auto operator+(Lhs&& lhs, Rhs&& rhs)
30  {
31  return invokeAtQP(Operation::Plus{}, FWD(lhs), FWD(rhs));
32  }
33 
35  template <class Lhs, class Rhs,
36  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
37  auto operator-(Lhs&& lhs, Rhs&& rhs)
38  {
39  return invokeAtQP(Operation::Minus{}, FWD(lhs), FWD(rhs));
40  }
41 
43  template <class Lhs, class Rhs,
44  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
45  auto operator*(Lhs&& lhs, Rhs&& rhs)
46  {
47  if constexpr(Dune::IsNumber<TYPEOF(lhs)>::value)
48  return invokeAtQP(Operation::Scale<TYPEOF(lhs)>{lhs}, FWD(rhs));
49  else if constexpr(Dune::IsNumber<TYPEOF(rhs)>::value)
50  return invokeAtQP(Operation::Scale<TYPEOF(rhs)>{rhs}, FWD(lhs));
51  else
52  return invokeAtQP(Operation::Multiplies{}, FWD(lhs), FWD(rhs));
53  }
54 
56  template <class Lhs, class Rhs,
57  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
58  auto operator/(Lhs&& lhs, Rhs&& rhs)
59  {
60  if constexpr(Dune::IsNumber<TYPEOF(rhs)>::value)
61  return invokeAtQP(Operation::Scale<TYPEOF(1.0/rhs)>{1.0/rhs}, FWD(lhs));
62  else
63  return invokeAtQP(Operation::Divides{}, FWD(lhs), FWD(rhs));
64  }
65 
66 
68  template <class Lhs, class Rhs,
69  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
70  auto max(Lhs&& lhs, Rhs&& rhs)
71  {
72  return invokeAtQP(Operation::Max{}, FWD(lhs), FWD(rhs));
73  }
74 
76  template <class Lhs, class Rhs,
77  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
78  auto min(Lhs&& lhs, Rhs&& rhs)
79  {
80  return invokeAtQP(Operation::Min{}, FWD(lhs), FWD(rhs));
81  }
82 
84  template <class Lhs, class Rhs,
85  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
86  auto abs_max(Lhs&& lhs, Rhs&& rhs)
87  {
88  return invokeAtQP(Operation::AbsMax{}, FWD(lhs), FWD(rhs));
89  }
90 
92  template <class Lhs, class Rhs,
93  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
94  auto abs_min(Lhs&& lhs, Rhs&& rhs)
95  {
96  return invokeAtQP(Operation::AbsMin{}, FWD(lhs), FWD(rhs));
97  }
98 
100  template <class V, class T,
101  REQUIRES(Concepts::AnyGridFunction<V>)>
102  auto clamp(V&& v, T const& lo, T const& hi)
103  {
104  return invokeAtQP(Operation::Clamp<T>{lo,hi}, FWD(v));
105  }
106 
107  template <class T,
108  REQUIRES(Concepts::AnyGridFunction<T>)>
109  auto abs(T&& value)
110  {
111  return invokeAtQP([](auto const& v) { using std::abs; return abs(v); }, FWD(value));
112  }
113 
115  template <class T,
116  REQUIRES(Concepts::AnyGridFunction<T>)>
117  auto sqr(T&& value)
118  {
119  return invokeAtQP(Operation::Sqr{}, FWD(value));
120  }
121 
123  template <int p, class T,
124  REQUIRES(Concepts::AnyGridFunction<T>)>
125  auto pow(T&& value)
126  {
127  return invokeAtQP(Operation::Pow<p>{}, FWD(value));
128  }
129 
131  template <class T,
132  REQUIRES(Concepts::AnyGridFunction<T>)>
133  auto pow(T&& value, double p)
134  {
135  return invokeAtQP(Operation::Power{p}, FWD(value));
136  }
137 
139  template <std::size_t I, class T,
140  REQUIRES(Concepts::AnyGridFunction<T>)>
141  auto get(T&& value)
142  {
143  return invokeAtQP(Operation::Get<I>{}, FWD(value));
144  }
145 
147  template <class T,
148  REQUIRES(Concepts::AnyGridFunction<T>)>
149  auto get(T&& value, std::size_t i)
150  {
151  return invokeAtQP(Operation::Get_{i}, FWD(value));
152  }
153 
155  template <class T>
156  auto constant(T const& value)
157  {
158  return invokeAtQP(Operation::Constant{value});
159  }
160 
162  template <class T>
163  auto reference(T& value)
164  {
165  return invokeAtQP(Operation::Reference{value});
166  }
167 
168  // @}
169 
170  // unary vector operations
171  // @{
172 
174  template <class Vec,
175  REQUIRES(Concepts::AnyGridFunction<Vec>)>
176  auto sum(Vec&& vec)
177  {
178  return invokeAtQP([](auto const& v) { return sum(v); }, FWD(vec));
179  }
180 
182  template <class Vec,
183  REQUIRES(Concepts::AnyGridFunction<Vec>)>
184  auto unary_dot(Vec&& vec)
185  {
186  return invokeAtQP(Operation::UnaryDot{}, FWD(vec));
187  }
188 
190  template <class Vec,
191  REQUIRES(Concepts::AnyGridFunction<Vec>)>
192  auto one_norm(Vec&& vec)
193  {
194  return invokeAtQP([](auto const& v) { return one_norm(v); }, FWD(vec));
195  }
196 
198  template <class Vec,
199  REQUIRES(Concepts::AnyGridFunction<Vec>)>
200  auto two_norm(Vec&& vec)
201  {
202  return invokeAtQP(Operation::TwoNorm{}, FWD(vec));
203  }
204 
206  template <int p, class Vec,
207  REQUIRES(Concepts::AnyGridFunction<Vec>)>
208  auto p_norm(Vec&& vec)
209  {
210  return invokeAtQP([](auto const& v) { return p_norm<p>(v); }, FWD(vec));
211  }
212 
214  template <class Vec,
215  REQUIRES(Concepts::AnyGridFunction<Vec>)>
216  auto infty_norm(Vec&& vec)
217  {
218  return invokeAtQP([](auto const& v) { return infty_norm(v); }, FWD(vec));
219  }
220 
222  template <class Mat,
223  REQUIRES(Concepts::AnyGridFunction<Mat>)>
224  auto trans(Mat&& mat)
225  {
226  return invokeAtQP(Operation::Trans{}, FWD(mat));
227  }
228 
229  // @}
230 
231 
232  // binary vector operations
233  // @{
234 
236  template <class Lhs, class Rhs,
237  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
238  auto dot(Lhs&& lhs, Rhs&& rhs)
239  {
240  return invokeAtQP(Operation::Dot{},
241  FWD(lhs), FWD(rhs));
242  }
243 
245  template <class Lhs, class Rhs,
246  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
247  auto distance(Lhs&& lhs, Rhs&& rhs)
248  {
249  using namespace Operation;
250  return invokeAtQP(compose(TwoNorm{}, Minus{}),
251  FWD(lhs), FWD(rhs));
252  }
253 
255  template <class Lhs, class Rhs,
256  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
257  auto outer(Lhs&& lhs, Rhs&& rhs)
258  {
259  return invokeAtQP([](auto const& v, auto const& w) { return outer(v,w); },
260  FWD(lhs), FWD(rhs));
261  }
262 
263  // @}
264 
267 } // end namespace AMDiS
auto operator*(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Multiplies to GridFunctions.
Definition: Operations.hpp:45
auto infty_norm(Vec &&vec)
Applies a infty_norm() functor to a vector-valued GridFunction.
Definition: Operations.hpp:216
auto min(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Min to GridFunctions.
Definition: Operations.hpp:78
Operation that represents min(A,B)
Definition: MaxMin.hpp:20
Definition: Basic.hpp:202
auto dot(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Dot to two vector-valued GridFunctions.
Definition: Operations.hpp:238
auto max(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Max to GridFunctions.
Definition: Operations.hpp:70
auto operator-(Lhs &&lhs)
Applies Operation::Negate to GridFunctions.
Definition: Operations.hpp:21
Definition: Basic.hpp:188
Functor that represents A-B.
Definition: Arithmetic.hpp:208
Functor that represents f*A.
Definition: Arithmetic.hpp:147
Functor representing a constant value.
Definition: Basic.hpp:119
Operation that represents max(A,B)
Definition: MaxMin.hpp:8
auto one_norm(Vec &&vec)
Applies a one_norm() functor to a vector-valued GridFunction.
Definition: Operations.hpp:192
auto sum(Vec &&vec)
Applies a sum() functor to a vector-valued GridFunction.
Definition: Operations.hpp:176
auto operator-(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Minus to GridFunctions.
Definition: Operations.hpp:37
Definition: AdaptBase.hpp:6
Definition: FieldMatVec.hpp:85
auto pow(T &&value, double p)
Applies Operation::Power to GridFunction.
Definition: Operations.hpp:133
Operation that represents max(|A|,|B|)
Definition: MaxMin.hpp:32
Functor that represents A*B.
Definition: Arithmetic.hpp:100
Functor that represents A+B.
Definition: Arithmetic.hpp:19
auto distance(Lhs &&lhs, Rhs &&rhs)
Applies a distance-functor to two vector-valued GridFunctions.
Definition: Operations.hpp:247
auto trans(Mat &&mat)
Applies Operation::Trans to a matrix-valued GridFunction.
Definition: Operations.hpp:224
auto operator+(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Plus to GridFunctions.
Definition: Operations.hpp:29
auto abs_max(Lhs &&lhs, Rhs &&rhs)
Applies Operation::AbsMax to GridFunctions.
Definition: Operations.hpp:86
auto sqr(T &&value)
Applies Operation::Sqr to GridFunction.
Definition: Operations.hpp:117
auto two_norm(Vec &&vec)
Applies Operation::TwoNorm to a vector-valued GridFunction.
Definition: Operations.hpp:200
Functor that represents A/B.
Definition: Arithmetic.hpp:187
auto pow(T &&value)
Applies Operation::Pow.
Definition: Operations.hpp:125
(Binary-)Functor representing the euclidean dot-product
Definition: FieldMatVec.hpp:18
auto p_norm(Vec &&vec)
Applies a p_norm() functor to a vector-valued GridFunction.
Definition: Operations.hpp:208
auto abs_min(Lhs &&lhs, Rhs &&rhs)
Applies Operation::AbsMin to GridFunctions.
Definition: Operations.hpp:94
(Unary-)Functor representing the euclidean 2-norm
Definition: FieldMatVec.hpp:68
Functor that represents A-B.
Definition: Arithmetic.hpp:61
Operation that represents min(|A|,|B|)
Definition: MaxMin.hpp:45
auto unary_dot(Vec &&vec)
Applies Operation::UnaryDot to a vector-valued GridFunction.
Definition: Operations.hpp:184
Functor representing a constant value.
Definition: Basic.hpp:87
auto clamp(V &&v, T const &lo, T const &hi)
Applies Operation::Clamp to GridFunction.
Definition: Operations.hpp:102
Functor that represents x^p,.
Definition: Arithmetic.hpp:321
(Unary-)Functor representing the euclidean dot-product
Definition: FieldMatVec.hpp:45
auto operator/(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Divides to GridFunctions.
Definition: Operations.hpp:58
auto constant(T const &value)
Return a reference-wrapper as GridFunction.
Definition: Operations.hpp:156
auto outer(Lhs &&lhs, Rhs &&rhs)
Applies an outer() functor to two vector-valued GridFunctions.
Definition: Operations.hpp:257
Definition: CMath.hpp:110
auto reference(T &value)
Return a reference-wrapper as GridFunction.
Definition: Operations.hpp:163