AMDiS  0.1
The Adaptive Multi-Dimensional Simulation Toolbox
OperationsGridFunction.hpp
1 #pragma once
2 
3 #include <amdis/Operations.hpp>
4 #include <amdis/gridfunctions/FunctorGridFunction.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  return invokeAtQP(Operation::Multiplies{}, FWD(lhs), FWD(rhs));
48  }
49 
50  namespace Impl
51  {
52  template <class Lhs, class Value,
53  REQUIRES(Concepts::ConstantToGridFunction<Value>)>
54  auto divideAtQP(Lhs&& lhs, Value value)
55  {
56  return invokeAtQP(Operation::Multiplies{}, FWD(lhs), 1.0/value);
57  }
58 
59  template <class Lhs, class Rhs,
61  auto divideAtQP(Lhs&& lhs, Rhs&& rhs)
62  {
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 operator/(Lhs&& lhs, Rhs&& rhs)
71  {
72  return Impl::divideAtQP(FWD(lhs), FWD(rhs));
73  }
74 
75 
77  template <class Lhs, class Rhs,
78  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
79  auto max(Lhs&& lhs, Rhs&& rhs)
80  {
81  return invokeAtQP(Operation::Max{}, FWD(lhs), FWD(rhs));
82  }
83 
85  template <class Lhs, class Rhs,
86  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
87  auto min(Lhs&& lhs, Rhs&& rhs)
88  {
89  return invokeAtQP(Operation::Min{}, FWD(lhs), FWD(rhs));
90  }
91 
93  template <class Lhs, class Rhs,
94  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
95  auto abs_max(Lhs&& lhs, Rhs&& rhs)
96  {
97  return invokeAtQP(Operation::AbsMax{}, FWD(lhs), FWD(rhs));
98  }
99 
101  template <class Lhs, class Rhs,
102  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
103  auto abs_min(Lhs&& lhs, Rhs&& rhs)
104  {
105  return invokeAtQP(Operation::AbsMin{}, FWD(lhs), FWD(rhs));
106  }
107 
109  template <class V, class T,
110  REQUIRES(Concepts::AnyGridFunction<V>)>
111  auto clamp(V&& v, T const& lo, T const& hi)
112  {
113  return invokeAtQP(Operation::Clamp<T>{lo,hi}, FWD(v));
114  }
115 
116  template <class T,
117  REQUIRES(Concepts::AnyGridFunction<T>)>
118  auto abs(T&& value)
119  {
120  return invokeAtQP([](auto const& v) { using std::abs; return abs(v); }, FWD(value));
121  }
122 
124  template <class T,
125  REQUIRES(Concepts::AnyGridFunction<T>)>
126  auto sqr(T&& value)
127  {
128  return invokeAtQP(Operation::Sqr{}, FWD(value));
129  }
130 
132  template <int p, class T,
133  REQUIRES(Concepts::AnyGridFunction<T>)>
134  auto pow(T&& value)
135  {
136  return invokeAtQP(Operation::Pow<p>{}, FWD(value));
137  }
138 
140  template <class T,
141  REQUIRES(Concepts::AnyGridFunction<T>)>
142  auto pow(T&& value, int p)
143  {
144  return invokeAtQP(Operation::Pow_{p}, FWD(value));
145  }
146 
148  template <std::size_t I, class T,
149  REQUIRES(Concepts::AnyGridFunction<T>)>
150  auto get(T&& value)
151  {
152  return invokeAtQP(Operation::Get<I>{}, FWD(value));
153  }
154 
156  template <class T,
157  REQUIRES(Concepts::AnyGridFunction<T>)>
158  auto get(T&& value, std::size_t i)
159  {
160  return invokeAtQP(Operation::Get_{i}, FWD(value));
161  }
162 
163  // @}
164 
165  // unary vector operations
166  // @{
167 
169  template <class Vec,
170  REQUIRES(Concepts::AnyGridFunction<Vec>)>
171  auto sum(Vec&& vec)
172  {
173  return invokeAtQP([](auto const& v) { return sum(v); }, FWD(vec));
174  }
175 
177  template <class Vec,
178  REQUIRES(Concepts::AnyGridFunction<Vec>)>
179  auto unary_dot(Vec&& vec)
180  {
181  return invokeAtQP(Operation::UnaryDot{}, FWD(vec));
182  }
183 
185  template <class Vec,
186  REQUIRES(Concepts::AnyGridFunction<Vec>)>
187  auto one_norm(Vec&& vec)
188  {
189  return invokeAtQP([](auto const& v) { return one_norm(v); }, FWD(vec));
190  }
191 
193  template <class Vec,
194  REQUIRES(Concepts::AnyGridFunction<Vec>)>
195  auto two_norm(Vec&& vec)
196  {
197  return invokeAtQP(Operation::TwoNorm{}, FWD(vec));
198  }
199 
201  template <int p, class Vec,
202  REQUIRES(Concepts::AnyGridFunction<Vec>)>
203  auto p_norm(Vec&& vec)
204  {
205  return invokeAtQP([](auto const& v) { return p_norm<p>(v); }, FWD(vec));
206  }
207 
209  template <class Vec,
210  REQUIRES(Concepts::AnyGridFunction<Vec>)>
211  auto infty_norm(Vec&& vec)
212  {
213  return invokeAtQP([](auto const& v) { return infty_norm(v); }, FWD(vec));
214  }
215 
217  template <class Mat,
218  REQUIRES(Concepts::AnyGridFunction<Mat>)>
219  auto trans(Mat&& mat)
220  {
221  return invokeAtQP(Operation::Trans{}, FWD(mat));
222  }
223 
224  // @}
225 
226 
227  // binary vector operations
228  // @{
229 
231  template <class Lhs, class Rhs,
232  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
233  auto dot(Lhs&& lhs, Rhs&& rhs)
234  {
235  return invokeAtQP(Operation::Dot{},
236  FWD(lhs), FWD(rhs));
237  }
238 
240  template <class Lhs, class Rhs,
241  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
242  auto distance(Lhs&& lhs, Rhs&& rhs)
243  {
244  using namespace Operation;
245  return invokeAtQP(compose(TwoNorm{}, Minus{}),
246  FWD(lhs), FWD(rhs));
247  }
248 
250  template <class Lhs, class Rhs,
251  REQUIRES(Concepts::AnyGridFunction<Lhs,Rhs>)>
252  auto outer(Lhs&& lhs, Rhs&& rhs)
253  {
254  return invokeAtQP([](auto const& v, auto const& w) { return outer(v,w); },
255  FWD(lhs), FWD(rhs));
256  }
257 
258  // @}
259 
262 } // end namespace AMDiS
auto operator*(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Multiplies to GridFunctions.
Definition: OperationsGridFunction.hpp:45
auto infty_norm(Vec &&vec)
Applies a infty_norm() functor to a vector-valued GridFunction.
Definition: OperationsGridFunction.hpp:211
auto min(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Min to GridFunctions.
Definition: OperationsGridFunction.hpp:87
Operation that represents min(A,B)
Definition: MaxMin.hpp:20
Definition: Basic.hpp:170
auto dot(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Dot to two vector-valued GridFunctions.
Definition: OperationsGridFunction.hpp:233
auto max(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Max to GridFunctions.
Definition: OperationsGridFunction.hpp:79
auto operator-(Lhs &&lhs)
Applies Operation::Negate to GridFunctions.
Definition: OperationsGridFunction.hpp:21
Definition: Basic.hpp:156
Functor that represents A-B.
Definition: Arithmetic.hpp:167
typename remove_cvref< T >::type remove_cvref_t
Helper alias template for remove_cvref.
Definition: TypeTraits.hpp:24
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: OperationsGridFunction.hpp:187
auto sum(Vec &&vec)
Applies a sum() functor to a vector-valued GridFunction.
Definition: OperationsGridFunction.hpp:171
auto operator-(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Minus to GridFunctions.
Definition: OperationsGridFunction.hpp:37
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6
Definition: FieldMatVec.hpp:85
auto pow(T &&value, int p)
Applies Operation::Pow_ to GridFunction.
Definition: OperationsGridFunction.hpp:142
Functor that represents x^p,.
Definition: Arithmetic.hpp:280
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: OperationsGridFunction.hpp:242
auto trans(Mat &&mat)
Applies Operation::Trans to a matrix-valued GridFunction.
Definition: OperationsGridFunction.hpp:219
auto operator+(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Plus to GridFunctions.
Definition: OperationsGridFunction.hpp:29
auto abs_max(Lhs &&lhs, Rhs &&rhs)
Applies Operation::AbsMax to GridFunctions.
Definition: OperationsGridFunction.hpp:95
auto sqr(T &&value)
Applies Operation::Sqr to GridFunction.
Definition: OperationsGridFunction.hpp:126
auto two_norm(Vec &&vec)
Applies Operation::TwoNorm to a vector-valued GridFunction.
Definition: OperationsGridFunction.hpp:195
Functor that represents A/B.
Definition: Arithmetic.hpp:146
auto pow(T &&value)
Applies Operation::Pow.
Definition: OperationsGridFunction.hpp:134
(Binary-)Functor representing the euclidean dot-product
Definition: FieldMatVec.hpp:18
constexpr bool ConstantToGridFunction
Concepts that is true for all &#39;&#39;simple&#39;&#39; types that can be converted automatically to a GridFunction...
Definition: ConstantGridFunction.hpp:165
auto p_norm(Vec &&vec)
Applies a p_norm() functor to a vector-valued GridFunction.
Definition: OperationsGridFunction.hpp:203
auto abs_min(Lhs &&lhs, Rhs &&rhs)
Applies Operation::AbsMin to GridFunctions.
Definition: OperationsGridFunction.hpp:103
(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: OperationsGridFunction.hpp:179
auto clamp(V &&v, T const &lo, T const &hi)
Applies Operation::Clamp to GridFunction.
Definition: OperationsGridFunction.hpp:111
(Unary-)Functor representing the euclidean dot-product
Definition: FieldMatVec.hpp:45
auto operator/(Lhs &&lhs, Rhs &&rhs)
Applies Operation::Divides to GridFunctions.
Definition: OperationsGridFunction.hpp:70
auto outer(Lhs &&lhs, Rhs &&rhs)
Applies an outer() functor to two vector-valued GridFunctions.
Definition: OperationsGridFunction.hpp:252
Definition: CMath.hpp:110