DUNE PDELab (git)

fmatrix.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5#ifndef DUNE_FMATRIX_HH
6#define DUNE_FMATRIX_HH
7
8#include <cmath>
9#include <cstddef>
10#include <iostream>
11#include <algorithm>
12#include <initializer_list>
13
21#include <dune/common/matrixconcepts.hh>
22
23namespace Dune
24{
25
26 namespace Impl
27 {
28
29 template<class M>
30 class ColumnVectorView
31 {
32 public:
33
34 using value_type = typename M::value_type;
35 using size_type = typename M::size_type;
36
37 constexpr ColumnVectorView(M& matrix, size_type col) :
38 matrix_(matrix),
39 col_(col)
40 {}
41
42 constexpr size_type N () const {
43 return matrix_.N();
44 }
45
46 template<class M_ = M,
47 std::enable_if_t<std::is_same_v<M_,M> and not std::is_const_v<M_>, int> = 0>
48 constexpr value_type& operator[] (size_type row) {
49 return matrix_[row][col_];
50 }
51
52 constexpr const value_type& operator[] (size_type row) const {
53 return matrix_[row][col_];
54 }
55
56 protected:
57 M& matrix_;
58 const size_type col_;
59 };
60
61 }
62
63 template<typename M>
64 struct FieldTraits< Impl::ColumnVectorView<M> >
65 {
66 using field_type = typename FieldTraits<M>::field_type;
67 using real_type = typename FieldTraits<M>::real_type;
68 };
69
81 template< class K, int ROWS, int COLS = ROWS > class FieldMatrix;
82
83
84 template< class K, int ROWS, int COLS >
85 struct DenseMatVecTraits< FieldMatrix<K,ROWS,COLS> >
86 {
87 typedef FieldMatrix<K,ROWS,COLS> derived_type;
88
89 // each row is implemented by a field vector
90 typedef FieldVector<K,COLS> row_type;
91
92 typedef row_type &row_reference;
93 typedef const row_type &const_row_reference;
94
95 typedef std::array<row_type,ROWS> container_type;
96 typedef K value_type;
97 typedef typename container_type::size_type size_type;
98 };
99
100 template< class K, int ROWS, int COLS >
101 struct FieldTraits< FieldMatrix<K,ROWS,COLS> >
102 {
103 typedef typename FieldTraits<K>::field_type field_type;
104 typedef typename FieldTraits<K>::real_type real_type;
105 };
106
115 template<class K, int ROWS, int COLS>
116 class FieldMatrix : public DenseMatrix< FieldMatrix<K,ROWS,COLS> >
117 {
118 std::array< FieldVector<K,COLS>, ROWS > _data;
120 public:
121
123 constexpr static int rows = ROWS;
125 constexpr static int cols = COLS;
126
127 typedef typename Base::size_type size_type;
128 typedef typename Base::row_type row_type;
129
130 typedef typename Base::row_reference row_reference;
132
133 //===== constructors
136 constexpr FieldMatrix() = default;
137
140 constexpr FieldMatrix(std::initializer_list<Dune::FieldVector<K, cols> > const &l) {
141 assert(l.size() == rows); // Actually, this is not needed any more!
142 for(std::size_t i=0; i<std::min(static_cast<std::size_t>(ROWS), l.size()); ++i)
143 _data[i] = std::data(l)[i];
144 }
145
146 template <class T,
147 typename = std::enable_if_t<HasDenseMatrixAssigner<FieldMatrix, T>::value>>
148 FieldMatrix(T const& rhs)
149 {
150 *this = rhs;
151 }
152
153 using Base::operator=;
154
157
159 template<typename T>
161 {
162 _data = x._data;
163 return *this;
164 }
165
167 template <typename T, int rows, int cols>
169
172 {
174 for( int i = 0; i < ROWS; ++i )
175 for( int j = 0; j < COLS; ++j )
176 AT[j][i] = (*this)[i][j];
177 return AT;
178 }
179
181 template <class OtherScalar>
182 friend auto operator+ ( const FieldMatrix& matrixA,
184 {
186
187 for (size_type i = 0; i < ROWS; ++i)
188 for (size_type j = 0; j < COLS; ++j)
189 result[i][j] = matrixA[i][j] + matrixB[i][j];
190
191 return result;
192 }
193
195 template <class OtherScalar>
196 friend auto operator- ( const FieldMatrix& matrixA,
198 {
200
201 for (size_type i = 0; i < ROWS; ++i)
202 for (size_type j = 0; j < COLS; ++j)
203 result[i][j] = matrixA[i][j] - matrixB[i][j];
204
205 return result;
206 }
207
209 template <class Scalar,
210 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
211 friend auto operator* ( const FieldMatrix& matrix, Scalar scalar)
212 {
214
215 for (size_type i = 0; i < ROWS; ++i)
216 for (size_type j = 0; j < COLS; ++j)
217 result[i][j] = matrix[i][j] * scalar;
218
219 return result;
220 }
221
223 template <class Scalar,
224 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
225 friend auto operator* ( Scalar scalar, const FieldMatrix& matrix)
226 {
228
229 for (size_type i = 0; i < ROWS; ++i)
230 for (size_type j = 0; j < COLS; ++j)
231 result[i][j] = scalar * matrix[i][j];
232
233 return result;
234 }
235
237 template <class Scalar,
238 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
239 friend auto operator/ ( const FieldMatrix& matrix, Scalar scalar)
240 {
242
243 for (size_type i = 0; i < ROWS; ++i)
244 for (size_type j = 0; j < COLS; ++j)
245 result[i][j] = matrix[i][j] / scalar;
246
247 return result;
248 }
249
252 template <class OtherScalar, int otherCols>
253 friend auto operator* ( const FieldMatrix& matrixA,
255 {
257
258 for (size_type i = 0; i < matrixA.mat_rows(); ++i)
259 for (size_type j = 0; j < matrixB.mat_cols(); ++j)
260 {
261 result[i][j] = 0;
262 for (size_type k = 0; k < matrixA.mat_cols(); ++k)
263 result[i][j] += matrixA[i][k] * matrixB[k][j];
264 }
265
266 return result;
267 }
268
275 template <class OtherMatrix, std::enable_if_t<
276 Impl::IsStaticSizeMatrix_v<OtherMatrix>
277 and not Impl::IsFieldMatrix_v<OtherMatrix>
278 , int> = 0>
279 friend auto operator* ( const FieldMatrix& matrixA,
280 const OtherMatrix& matrixB)
281 {
282 using Field = typename PromotionTraits<K, typename OtherMatrix::field_type>::PromotedType;
284 for (std::size_t j=0; j<rows; ++j)
285 matrixB.mtv(matrixA[j], result[j]);
286 return result;
287 }
288
295 template <class OtherMatrix, std::enable_if_t<
296 Impl::IsStaticSizeMatrix_v<OtherMatrix>
297 and not Impl::IsFieldMatrix_v<OtherMatrix>
298 , int> = 0>
299 friend auto operator* ( const OtherMatrix& matrixA,
300 const FieldMatrix& matrixB)
301 {
302 using Field = typename PromotionTraits<K, typename OtherMatrix::field_type>::PromotedType;
304 for (std::size_t j=0; j<cols; ++j)
305 {
306 auto B_j = Impl::ColumnVectorView(matrixB, j);
307 auto result_j = Impl::ColumnVectorView(result, j);
308 matrixA.mv(B_j, result_j);
309 }
310 return result;
311 }
312
314 template<int l>
316 {
318
319 for (size_type i=0; i<l; i++) {
320 for (size_type j=0; j<cols; j++) {
321 C[i][j] = 0;
322 for (size_type k=0; k<rows; k++)
323 C[i][j] += M[i][k]*(*this)[k][j];
324 }
325 }
326 return C;
327 }
328
330
332 template <int r, int c>
334 {
335 static_assert(r == c, "Cannot rightmultiply with non-square matrix");
336 static_assert(r == cols, "Size mismatch");
338
339 for (size_type i=0; i<rows; i++)
340 for (size_type j=0; j<cols; j++) {
341 (*this)[i][j] = 0;
342 for (size_type k=0; k<cols; k++)
343 (*this)[i][j] += C[i][k]*M[k][j];
344 }
345 return *this;
346 }
347
349 template<int l>
351 {
353
354 for (size_type i=0; i<rows; i++) {
355 for (size_type j=0; j<l; j++) {
356 C[i][j] = 0;
357 for (size_type k=0; k<cols; k++)
358 C[i][j] += (*this)[i][k]*M[k][j];
359 }
360 }
361 return C;
362 }
363
364 // make this thing a matrix
365 static constexpr size_type mat_rows() { return ROWS; }
366 static constexpr size_type mat_cols() { return COLS; }
367
368 row_reference mat_access ( size_type i )
369 {
370 DUNE_ASSERT_BOUNDS(i < ROWS);
371 return _data[i];
372 }
373
374 const_row_reference mat_access ( size_type i ) const
375 {
376 DUNE_ASSERT_BOUNDS(i < ROWS);
377 return _data[i];
378 }
379 };
380
381#ifndef DOXYGEN // hide specialization
384 template<class K>
385 class FieldMatrix<K,1,1> : public DenseMatrix< FieldMatrix<K,1,1> >
386 {
387 FieldVector<K,1> _data;
388 typedef DenseMatrix< FieldMatrix<K,1,1> > Base;
389 public:
390 // standard constructor and everything is sufficient ...
391
392 //===== type definitions and constants
393
395 typedef typename Base::size_type size_type;
396
399 constexpr static int blocklevel = 1;
400
401 typedef typename Base::row_type row_type;
402
403 typedef typename Base::row_reference row_reference;
404 typedef typename Base::const_row_reference const_row_reference;
405
408 constexpr static int rows = 1;
411 constexpr static int cols = 1;
412
413 //===== constructors
416 constexpr FieldMatrix() = default;
417
420 FieldMatrix(std::initializer_list<Dune::FieldVector<K, 1>> const &l)
421 {
422 std::copy_n(l.begin(), std::min(static_cast< std::size_t >( 1 ), l.size()), &_data);
423 }
424
425 template <class T,
426 typename = std::enable_if_t<HasDenseMatrixAssigner<FieldMatrix, T>::value>>
427 FieldMatrix(T const& rhs)
428 {
429 *this = rhs;
430 }
431
432 using Base::operator=;
433
435 FieldMatrix<K, 1, 1> transposed() const
436 {
437 return *this;
438 }
439
441 template <class OtherScalar>
442 friend auto operator+ ( const FieldMatrix& matrixA,
443 const FieldMatrix<OtherScalar,1,1>& matrixB)
444 {
445 return FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,1>{matrixA[0][0] + matrixB[0][0]};
446 }
447
449 template <class Scalar,
450 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
451 friend auto operator+ ( const FieldMatrix& matrix,
452 const Scalar& scalar)
453 {
454 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1>{matrix[0][0] + scalar};
455 }
456
458 template <class Scalar,
459 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
460 friend auto operator+ ( const Scalar& scalar,
461 const FieldMatrix& matrix)
462 {
463 return FieldMatrix<typename PromotionTraits<Scalar,K>::PromotedType,1,1>{scalar + matrix[0][0]};
464 }
465
467 template <class OtherScalar>
468 friend auto operator- ( const FieldMatrix& matrixA,
469 const FieldMatrix<OtherScalar,1,1>& matrixB)
470 {
471 return FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,1>{matrixA[0][0] - matrixB[0][0]};
472 }
473
475 template <class Scalar,
476 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
477 friend auto operator- ( const FieldMatrix& matrix,
478 const Scalar& scalar)
479 {
480 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1>{matrix[0][0] - scalar};
481 }
482
484 template <class Scalar,
485 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
486 friend auto operator- ( const Scalar& scalar,
487 const FieldMatrix& matrix)
488 {
489 return FieldMatrix<typename PromotionTraits<Scalar,K>::PromotedType,1,1>{scalar - matrix[0][0]};
490 }
491
493 template <class Scalar,
494 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
495 friend auto operator* ( const FieldMatrix& matrix, Scalar scalar)
496 {
497 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {matrix[0][0] * scalar};
498 }
499
501 template <class Scalar,
502 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
503 friend auto operator* ( Scalar scalar, const FieldMatrix& matrix)
504 {
505 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {scalar * matrix[0][0]};
506 }
507
509 template <class Scalar,
510 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
511 friend auto operator/ ( const FieldMatrix& matrix, Scalar scalar)
512 {
513 return FieldMatrix<typename PromotionTraits<K,Scalar>::PromotedType,1,1> {matrix[0][0] / scalar};
514 }
515
516 //===== solve
517
520 template <class OtherScalar, int otherCols>
521 friend auto operator* ( const FieldMatrix& matrixA,
522 const FieldMatrix<OtherScalar, 1, otherCols>& matrixB)
523 {
524 FieldMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType,1,otherCols> result;
525
526 for (size_type j = 0; j < matrixB.mat_cols(); ++j)
527 result[0][j] = matrixA[0][0] * matrixB[0][j];
528
529 return result;
530 }
531
538 template <class OtherMatrix, std::enable_if_t<
539 Impl::IsStaticSizeMatrix_v<OtherMatrix>
540 and not Impl::IsFieldMatrix_v<OtherMatrix>
541 and (OtherMatrix::rows==1)
542 , int> = 0>
543 friend auto operator* ( const FieldMatrix& matrixA,
544 const OtherMatrix& matrixB)
545 {
546 using Field = typename PromotionTraits<K, typename OtherMatrix::field_type>::PromotedType;
548 for (std::size_t j=0; j<rows; ++j)
549 matrixB.mtv(matrixA[j], result[j]);
550 return result;
551 }
552
559 template <class OtherMatrix, std::enable_if_t<
560 Impl::IsStaticSizeMatrix_v<OtherMatrix>
561 and not Impl::IsFieldMatrix_v<OtherMatrix>
562 and (OtherMatrix::cols==1)
563 , int> = 0>
564 friend auto operator* ( const OtherMatrix& matrixA,
565 const FieldMatrix& matrixB)
566 {
567 using Field = typename PromotionTraits<K, typename OtherMatrix::field_type>::PromotedType;
569 for (std::size_t j=0; j<cols; ++j)
570 {
571 auto B_j = Impl::ColumnVectorView(matrixB, j);
572 auto result_j = Impl::ColumnVectorView(result, j);
573 matrixA.mv(B_j, result_j);
574 }
575 return result;
576 }
577
579 template<int l>
580 FieldMatrix<K,l,1> leftmultiplyany (const FieldMatrix<K,l,1>& M) const
581 {
582 FieldMatrix<K,l,1> C;
583 for (size_type j=0; j<l; j++)
584 C[j][0] = M[j][0]*(*this)[0][0];
585 return C;
586 }
587
590 {
591 _data[0] *= M[0][0];
592 return *this;
593 }
594
596 template<int l>
597 FieldMatrix<K,1,l> rightmultiplyany (const FieldMatrix<K,1,l>& M) const
598 {
599 FieldMatrix<K,1,l> C;
600
601 for (size_type j=0; j<l; j++)
602 C[0][j] = M[0][j]*_data[0];
603 return C;
604 }
605
606 // make this thing a matrix
607 static constexpr size_type mat_rows() { return 1; }
608 static constexpr size_type mat_cols() { return 1; }
609
610 row_reference mat_access ([[maybe_unused]] size_type i)
611 {
612 DUNE_ASSERT_BOUNDS(i == 0);
613 return _data;
614 }
615
616 const_row_reference mat_access ([[maybe_unused]] size_type i) const
617 {
618 DUNE_ASSERT_BOUNDS(i == 0);
619 return _data;
620 }
621
623 FieldMatrix& operator+= (const K& k)
624 {
625 _data[0] += k;
626 return (*this);
627 }
628
630 FieldMatrix& operator-= (const K& k)
631 {
632 _data[0] -= k;
633 return (*this);
634 }
635
637 FieldMatrix& operator*= (const K& k)
638 {
639 _data[0] *= k;
640 return (*this);
641 }
642
644 FieldMatrix& operator/= (const K& k)
645 {
646 _data[0] /= k;
647 return (*this);
648 }
649
650 //===== conversion operator
651
652 operator const K& () const { return _data[0]; }
653
654 };
655
657 template<typename K>
658 std::ostream& operator<< (std::ostream& s, const FieldMatrix<K,1,1>& a)
659 {
660 s << a[0][0];
661 return s;
662 }
663
664#endif // DOXYGEN
665
666 namespace FMatrixHelp {
667
669 template <typename K>
670 static inline K invertMatrix (const FieldMatrix<K,1,1> &matrix, FieldMatrix<K,1,1> &inverse)
671 {
672 using real_type = typename FieldTraits<K>::real_type;
673 inverse[0][0] = real_type(1.0)/matrix[0][0];
674 return matrix[0][0];
675 }
676
678 template <typename K>
679 static inline K invertMatrix_retTransposed (const FieldMatrix<K,1,1> &matrix, FieldMatrix<K,1,1> &inverse)
680 {
681 return invertMatrix(matrix,inverse);
682 }
683
684
686 template <typename K>
687 static inline K invertMatrix (const FieldMatrix<K,2,2> &matrix, FieldMatrix<K,2,2> &inverse)
688 {
689 using real_type = typename FieldTraits<K>::real_type;
690 // code generated by maple
691 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
692 K det_1 = real_type(1.0)/det;
693 inverse[0][0] = matrix[1][1] * det_1;
694 inverse[0][1] = - matrix[0][1] * det_1;
695 inverse[1][0] = - matrix[1][0] * det_1;
696 inverse[1][1] = matrix[0][0] * det_1;
697 return det;
698 }
699
702 template <typename K>
703 static inline K invertMatrix_retTransposed (const FieldMatrix<K,2,2> &matrix, FieldMatrix<K,2,2> &inverse)
704 {
705 using real_type = typename FieldTraits<K>::real_type;
706 // code generated by maple
707 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
708 K det_1 = real_type(1.0)/det;
709 inverse[0][0] = matrix[1][1] * det_1;
710 inverse[1][0] = - matrix[0][1] * det_1;
711 inverse[0][1] = - matrix[1][0] * det_1;
712 inverse[1][1] = matrix[0][0] * det_1;
713 return det;
714 }
715
717 template <typename K>
718 static inline K invertMatrix (const FieldMatrix<K,3,3> &matrix, FieldMatrix<K,3,3> &inverse)
719 {
720 using real_type = typename FieldTraits<K>::real_type;
721 // code generated by maple
722 K t4 = matrix[0][0] * matrix[1][1];
723 K t6 = matrix[0][0] * matrix[1][2];
724 K t8 = matrix[0][1] * matrix[1][0];
725 K t10 = matrix[0][2] * matrix[1][0];
726 K t12 = matrix[0][1] * matrix[2][0];
727 K t14 = matrix[0][2] * matrix[2][0];
728
729 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
730 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
731 K t17 = real_type(1.0)/det;
732
733 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
734 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
735 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
736 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
737 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
738 inverse[1][2] = -(t6-t10) * t17;
739 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
740 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
741 inverse[2][2] = (t4-t8) * t17;
742
743 return det;
744 }
745
747 template <typename K>
748 static inline K invertMatrix_retTransposed (const FieldMatrix<K,3,3> &matrix, FieldMatrix<K,3,3> &inverse)
749 {
750 using real_type = typename FieldTraits<K>::real_type;
751 // code generated by maple
752 K t4 = matrix[0][0] * matrix[1][1];
753 K t6 = matrix[0][0] * matrix[1][2];
754 K t8 = matrix[0][1] * matrix[1][0];
755 K t10 = matrix[0][2] * matrix[1][0];
756 K t12 = matrix[0][1] * matrix[2][0];
757 K t14 = matrix[0][2] * matrix[2][0];
758
759 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+
760 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);
761 K t17 = real_type(1.0)/det;
762
763 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1])*t17;
764 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2][1])*t17;
765 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1][1])*t17;
766 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2][0])*t17;
767 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;
768 inverse[2][1] = -(t6-t10) * t17;
769 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0]) * t17;
770 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17;
771 inverse[2][2] = (t4-t8) * t17;
772
773 return det;
774 }
775
777 template< class K, int m, int n, int p >
778 static inline void multMatrix ( const FieldMatrix< K, m, n > &A,
779 const FieldMatrix< K, n, p > &B,
781 {
782 typedef typename FieldMatrix< K, m, p > :: size_type size_type;
783
784 for( size_type i = 0; i < m; ++i )
785 {
786 for( size_type j = 0; j < p; ++j )
787 {
788 ret[ i ][ j ] = K( 0 );
789 for( size_type k = 0; k < n; ++k )
790 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
791 }
792 }
793 }
794
796 template <typename K, int rows, int cols>
798 {
799 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
800
801 for(size_type i=0; i<cols; i++)
802 for(size_type j=0; j<cols; j++)
803 {
804 ret[i][j]=0.0;
805 for(size_type k=0; k<rows; k++)
806 ret[i][j]+=matrix[k][i]*matrix[k][j];
807 }
808 }
809
810 using Dune::DenseMatrixHelp::multAssign;
811
813 template <typename K, int rows, int cols>
815 {
816 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
817
818 for(size_type i=0; i<cols; ++i)
819 {
820 ret[i] = 0.0;
821 for(size_type j=0; j<rows; ++j)
822 ret[i] += matrix[j][i]*x[j];
823 }
824 }
825
827 template <typename K, int rows, int cols>
829 {
831 multAssign(matrix,x,ret);
832 return ret;
833 }
834
836 template <typename K, int rows, int cols>
838 {
840 multAssignTransposed( matrix, x, ret );
841 return ret;
842 }
843
844 } // end namespace FMatrixHelp
845
848} // end namespace
849
850#include "fmatrixev.hh"
851#endif
Macro for wrapping boundary checks.
A dense n x m matrix.
Definition: densematrix.hh:140
derived_type operator-() const
Matrix negation.
Definition: densematrix.hh:298
void mtv(const X &x, Y &y) const
y = A^T x
Definition: densematrix.hh:387
constexpr size_type M() const
number of columns
Definition: densematrix.hh:703
FieldMatrix< K, ROWS, COLS > & rightmultiply(const DenseMatrix< M2 > &M)
Multiplies M from the right to this matrix.
Definition: densematrix.hh:645
derived_type & operator/=(const field_type &k)
vector space division by scalar
Definition: densematrix.hh:329
derived_type & operator*=(const field_type &k)
vector space multiplication with scalar
Definition: densematrix.hh:321
derived_type & operator-=(const DenseMatrix< Other > &x)
vector space subtraction
Definition: densematrix.hh:312
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition: densematrix.hh:178
Traits::row_type row_type
The type used to represent a row (must fulfill the Dune::DenseVector interface)
Definition: densematrix.hh:169
Traits::size_type size_type
The type used for the index access and size operation.
Definition: densematrix.hh:166
Traits::const_row_reference const_row_reference
The type used to represent a reference to a constant row (usually const row_type &)
Definition: densematrix.hh:175
Traits::row_reference row_reference
The type used to represent a reference to a row (usually row_type &)
Definition: densematrix.hh:172
derived_type & operator+=(const DenseMatrix< Other > &x)
vector space addition
Definition: densematrix.hh:289
A dense n x m matrix.
Definition: fmatrix.hh:117
constexpr FieldMatrix()=default
Default constructor.
FieldMatrix & operator=(const FieldMatrix< T, ROWS, COLS > &x)
copy assignment from FieldMatrix over a different field
Definition: fmatrix.hh:160
FieldMatrix< K, rows, l > rightmultiplyany(const FieldMatrix< K, cols, l > &M) const
Multiplies M from the right to this matrix, this matrix is not modified.
Definition: fmatrix.hh:350
FieldMatrix< K, l, cols > leftmultiplyany(const FieldMatrix< K, l, rows > &M) const
Multiplies M from the left to this matrix, this matrix is not modified.
Definition: fmatrix.hh:315
FieldMatrix & rightmultiply(const FieldMatrix< K, r, c > &M)
Multiplies M from the right to this matrix.
Definition: fmatrix.hh:333
friend auto operator*(const FieldMatrix &matrix, Scalar scalar)
vector space multiplication with scalar
Definition: fmatrix.hh:211
FieldMatrix & operator=(FieldMatrix< T, rows, cols > const &)=delete
no copy assignment from FieldMatrix of different size
constexpr FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > const &l)
Constructor initializing the matrix from a list of vector.
Definition: fmatrix.hh:140
static constexpr int rows
The number of rows.
Definition: fmatrix.hh:123
FieldMatrix< K, COLS, ROWS > transposed() const
Return transposed of the matrix as FieldMatrix.
Definition: fmatrix.hh:171
static constexpr int cols
The number of columns.
Definition: fmatrix.hh:125
friend auto operator/(const FieldMatrix &matrix, Scalar scalar)
vector space division by scalar
Definition: fmatrix.hh:239
friend auto operator+(const FieldMatrix &matrixA, const FieldMatrix< OtherScalar, ROWS, COLS > &matrixB)
vector space addition – two-argument version
Definition: fmatrix.hh:182
FieldMatrix & operator=(const FieldMatrix &)=default
copy assignment operator
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
A few common exception classes.
Traits for type conversions and type information.
static FieldVector< K, cols > multTransposed(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
calculates ret = matrix^T * x
Definition: fmatrix.hh:837
static K invertMatrix_retTransposed(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
invert scalar without changing the original matrix
Definition: fmatrix.hh:679
static void multMatrix(const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
calculates ret = A * B
Definition: fmatrix.hh:778
static K invertMatrix(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
invert scalar without changing the original matrix
Definition: fmatrix.hh:670
static FieldVector< K, rows > mult(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
calculates ret = matrix * x
Definition: fmatrix.hh:828
static void multTransposedMatrix(const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
calculates ret= A_t*A
Definition: fmatrix.hh:797
static void multAssignTransposed(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
calculates ret = matrix^T * x
Definition: fmatrix.hh:814
Eigenvalue computations for the FieldMatrix class.
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
constexpr auto min
Function object that returns the smaller of the given values.
Definition: hybridutilities.hh:506
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: interface.hh:235
Dune namespace.
Definition: alignedallocator.hh:13
Various precision settings for calculations with FieldMatrix and FieldVector.
Compute type of the result of an arithmetic operation involving two different number types.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)