5#include <dune/common/diagonalmatrix.hh>
6#include <dune/common/fmatrix.hh>
7#include <dune/common/fvector.hh>
8#include <dune/common/typetraits.hh>
10#include <amdis/common/TypeTraits.hpp>
14 template <
class T,
int N>
15 struct common_type<Dune::FieldVector<T,N>, T>
20 template <
class T,
int N,
int M>
21 struct common_type<Dune::FieldMatrix<T,N,M>, T>
34 struct IsMatrix : std::false_type {};
36 template <
class T,
int M,
int N>
37 struct IsMatrix<FieldMatrix<T,M,N>> : std::true_type {};
39 template <
class T,
int N>
40 struct IsMatrix<DiagonalMatrix<T,N>> : std::true_type {};
43 struct IsScalarMatrix : std::false_type {};
46 struct IsScalarMatrix<FieldMatrix<T,1,1>> : std::true_type {};
49 struct IsScalarMatrix<DiagonalMatrix<T,1>> : std::true_type {};
53 struct IsVector : std::false_type {};
55 template <
class T,
int N>
56 struct IsVector<FieldVector<T,N>> : std::true_type {};
59 struct IsScalarVector : std::false_type {};
62 struct IsScalarVector<FieldVector<T,1>> : std::true_type {};
68 : std::integral_constant<bool, IsMatrix<T>::value || IsVector<T>::value> {};
73 template <
class A,
class S>
79 template <
class T,
int M,
int N,
class S>
80 struct MakeMatVec<FieldMatrix<T,M,N>,S>
82 using type = FieldMatrix<S,M,N>;
85 template <
class T,
int N,
class S>
86 struct MakeMatVec<DiagonalMatrix<T,N>,S>
88 using type = DiagonalMatrix<S,N>;
91 template <
class T,
int N,
class S>
92 struct MakeMatVec<FieldVector<T,N>,S>
94 using type = FieldVector<S,N>;
101 decltype(
auto) as_scalar(T&& t)
107 T as_scalar(FieldVector<T,1>
const& t)
113 T as_scalar(FieldMatrix<T,1,1>
const& t)
119 T as_scalar(DiagonalMatrix<T,1>
const& t)
121 return t.diagonal(0);
128 decltype(
auto) as_vector(T&& t)
133 template <
class T,
int N>
134 FieldVector<T,N>
const& as_vector(FieldMatrix<T,1,N>
const& t)
139 template <
class T,
int N>
140 FieldVector<T,N>& as_vector(FieldMatrix<T,1,N>& t)
150 decltype(
auto) as_matrix(T&& t)
158 template <
class T,
int N>
159 MatrixView<DiagonalMatrix<T,N>> as_matrix(DiagonalMatrix<T,N>
const& mat)
167 auto negate(A
const& a);
170 template <
class A,
class B>
171 auto plus(A
const& a, B
const& b);
174 template <
class A,
class B>
175 auto minus(A
const& a, B
const& b);
178 template <
class A,
class B,
179 std::enable_if_t<IsNumber<A>::value && IsNumber<B>::value,
int> = 0>
180 auto multiplies(A
const& a, B
const& b);
182 template <
class A,
class B,
183 std::enable_if_t<IsNumber<A>::value != IsNumber<B>::value,
int> = 0>
184 auto multiplies(A
const& a, B
const& b);
186 template <
class T,
int N,
class S>
187 auto multiplies(FieldVector<T,N>
const& a, FieldVector<S,N>
const& b);
189 template <
class Mat,
class Vec,
190 std::enable_if_t<IsMatrix<Mat>::value && IsVector<Vec>::value,
int> = 0>
191 auto multiplies(Mat
const& mat, Vec
const& vec);
193 template <
class Vec,
class Mat,
194 std::enable_if_t<IsVector<Vec>::value && IsMatrix<Mat>::value,
int> = 0>
195 auto multiplies(Vec
const& vec, Mat
const& mat);
197 template <
class T,
int L,
int M,
int N,
class S>
198 auto multiplies(FieldMatrix<T,L,M>
const& a, FieldMatrix<S,M,N>
const& b);
201 template <
class A,
class B>
202 auto divides(A a, B
const& b)
210 template <
class K1,
int N,
int M,
class K2>
211 auto operator*(Dune::FieldMatrix<K1, N, M>
const& a, Dune::FieldVector<K2,M>
const& b)
213 return MatVec::multiplies(a, b);
217 template <
class K1,
int N,
int M,
class K2>
218 auto operator*(Dune::FieldVector<K1, N>
const& a, Dune::FieldMatrix<K2,N,M>
const& b)
220 return MatVec::multiplies(a, b);
225 FieldVector<T, 2> cross(FieldVector<T, 2>
const& a);
229 FieldVector<T, 3> cross(FieldVector<T, 3>
const& a, FieldVector<T, 3>
const& b);
232 template <
class T,
class S,
int N>
233 auto dot(FieldVector<T,N>
const& vec1, FieldVector<S,N>
const& vec2);
235 template <
class T,
class S,
int N>
236 auto dot(FieldMatrix<T,1,N>
const& vec1, FieldMatrix<S,1,N>
const& vec2);
241 template <
class T,
int N>
242 T sum(FieldVector<T, N>
const& x);
244 template <
class T,
int N>
245 T sum(FieldMatrix<T, 1, N>
const& x);
250 std::enable_if_t<Dune::IsNumber<T>::value,
int> = 0>
251 auto unary_dot(T
const& x);
253 template <
class T,
int N>
254 auto unary_dot(FieldVector<T, N>
const& x);
256 template <
class T,
int N>
257 auto unary_dot(FieldMatrix<T, 1, N>
const& x);
260 template <
class T,
int N>
261 auto max(FieldVector<T, N>
const& x);
263 template <
class T,
int N>
264 auto max(FieldMatrix<T, 1, N>
const& x);
267 template <
class T,
int N>
268 auto min(FieldVector<T, N>
const& x);
270 template <
class T,
int N>
271 auto min(FieldMatrix<T, 1, N>
const& x);
274 template <
class T,
int N>
275 auto abs_max(FieldVector<T, N>
const& x);
277 template <
class T,
int N>
278 auto abs_max(FieldMatrix<T, 1, N>
const& x);
281 template <
class T,
int N>
282 auto abs_min(FieldVector<T, N>
const& x);
284 template <
class T,
int N>
285 auto abs_min(FieldMatrix<T, 1, N>
const& x);
292 template <
class T,
int N>
293 auto one_norm(FieldVector<T, N>
const& x);
295 template <
class T,
int N>
296 auto one_norm(FieldMatrix<T, 1, N>
const& x);
302 std::enable_if_t<Dune::IsNumber<T>::value,
int> = 0>
303 auto two_norm(T
const& x);
305 template <
class T,
int N>
306 auto two_norm(FieldVector<T, N>
const& x);
308 template <
class T,
int N>
309 auto two_norm(FieldMatrix<T, 1, N>
const& x);
314 template <
int p,
class T,
int N>
315 auto p_norm(FieldVector<T, N>
const& x);
317 template <
int p,
class T,
int N>
318 auto p_norm(FieldMatrix<T, 1, N>
const& x);
323 template <
class T,
int N>
324 auto infty_norm(FieldVector<T, N>
const& x);
326 template <
class T,
int N>
327 auto infty_norm(FieldMatrix<T, 1, N>
const& x);
333 std::enable_if_t<Dune::IsNumber<T>::value,
int> = 0>
334 T distance(T
const& lhs, T
const& rhs);
336 template <
class T,
int N>
337 T distance(FieldVector<T, N>
const& lhs, FieldVector<T, N>
const& rhs);
342 template <
class T,
class S,
int N,
int M,
int K>
343 auto outer(FieldMatrix<T,N,K>
const& vec1, FieldMatrix<S,M,K>
const& vec2);
345 template <
class T,
class S,
int N,
int M>
346 auto outer(FieldVector<T,N>
const& vec1, FieldVector<S,M>
const& vec2);
351 T det(FieldMatrix<T, 0, 0>
const& );
355 T det(FieldMatrix<T, 1, 1>
const& mat);
359 T det(FieldMatrix<T, 2, 2>
const& mat);
363 T det(FieldMatrix<T, 3, 3>
const& mat);
366 template <
class T,
int N>
367 T det(FieldMatrix<T, N, N>
const& mat);
371 template <
class T,
int N>
372 auto inv(FieldMatrix<T, N, N> mat);
375 template <
class T,
int N>
376 void solve(FieldMatrix<T, N, N>
const& A, FieldVector<T, N>& x, FieldVector<T, N>
const& b);
380 template <
class T,
int N,
int M>
381 T gramian(FieldMatrix<T,N,M>
const& DF);
384 template <
class T,
int M>
385 T gramian(FieldMatrix<T, 1, M>
const& DF);
390 template <
class T,
int M,
int N>
391 FieldMatrix<T,N,M> trans(FieldMatrix<T, M, N>
const& A);
393 template <
class T,
int N>
394 DiagonalMatrix<T,N>
const& trans(DiagonalMatrix<T,N>
const& A)
401 template <
class T1,
class T2,
int M,
int N,
int L>
402 FieldMatrix<std::common_type_t<T1,T2>,M,N> multiplies_AtB(FieldMatrix<T1, L, M>
const& A, FieldMatrix<T2, N, L>
const& B);
404 template <
class T1,
class T2,
int M,
int N,
int L>
405 FieldMatrix<std::common_type_t<T1,T2>,M,N> multiplies_ABt(FieldMatrix<T1, M, L>
const& A, FieldMatrix<T2, N, L>
const& B);
408 template <
class T1,
class T2,
class T3,
int M,
int N,
int L>
409 FieldMatrix<T3,M,N>& multiplies_ABt(FieldMatrix<T1, M, L>
const& A, FieldMatrix<T2, N, L>
const& B, FieldMatrix<T3,M,N>& C);
411 template <
class T1,
class T2,
class T3,
int N,
int L>
412 FieldVector<T3,N>& multiplies_ABt(FieldMatrix<T1, 1, L>
const& A, FieldMatrix<T2, N, L>
const& B, FieldVector<T3,N>& C);
414 template <
class T1,
class T2,
class T3,
int N,
int L>
415 FieldVector<T3,N>& multiplies_ABt(FieldVector<T1, L>
const& A, FieldMatrix<T2, N, L>
const& B, FieldVector<T3,N>& C);
417 template <
class T1,
class T2,
class T3,
int N,
int L>
418 FieldMatrix<T3,1,N>& multiplies_ABt(FieldVector<T1, L>
const& A, FieldMatrix<T2, N, L>
const& B, FieldMatrix<T3,1,N>& C);
421 template <
class T1,
class T2,
class T3,
int M,
int N>
422 FieldMatrix<T3,M,N>& multiplies_ABt(FieldMatrix<T1, M, N>
const& A, DiagonalMatrix<T2, N>
const& B, FieldMatrix<T3,M,N>& C);
424 template <
class T1,
class T2,
class T3,
int N>
425 FieldVector<T3,N>& multiplies_ABt(FieldMatrix<T1, 1, N>
const& A, DiagonalMatrix<T2, N>
const& B, FieldVector<T3,N>& C);
427 template <
class T1,
class T2,
class T3,
int N>
428 FieldVector<T3,N>& multiplies_ABt(FieldVector<T1, N>
const& A, DiagonalMatrix<T2, N>
const& B, FieldVector<T3,N>& C);
430 template <
class T1,
class T2,
class T3,
int N>
431 FieldMatrix<T3,1,N>& multiplies_ABt(FieldVector<T1, N>
const& A, DiagonalMatrix<T2, N>
const& B, FieldMatrix<T3,1,N>& C);
435 template <
class T,
int N>
436 T
const& at(FieldMatrix<T,N,1>
const& vec, std::size_t i);
438 template <
class T,
int M>
439 T
const& at(FieldMatrix<T,1,M>
const& vec, std::size_t i);
443 T
const& at(FieldMatrix<T,1,1>
const& vec, std::size_t i);
445 template <
class T,
int N>
446 T
const& at(FieldVector<T,N>
const& vec, std::size_t i);
452 using Dune::FieldMatrix;
453 using Dune::FieldVector;
456#include "FieldMatVec.inc.hpp"