Dune Core Modules (unstable)

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 
16 #include <dune/common/fvector.hh>
18 #include <dune/common/precision.hh>
21 #include <dune/common/matrixconcepts.hh>
22 
23 namespace 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 
156  FieldMatrix& operator=(const FieldMatrix&) = default;
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,
183  const FieldMatrix<OtherScalar,ROWS,COLS>& matrixB)
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,
197  const FieldMatrix<OtherScalar,ROWS,COLS>& matrixB)
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  {
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  {
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 
329  using Base::rightmultiply;
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");
337  FieldMatrix<K,rows,cols> C(*this);
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>
814  static inline void multAssignTransposed( const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x, FieldVector<K,cols> & ret)
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
FieldMatrix< K, ROWS, COLS > & rightmultiply(const DenseMatrix< M2 > &M)
Multiplies M from the right to this matrix.
Definition: densematrix.hh:645
constexpr size_type M() const
number of columns
Definition: densematrix.hh:703
derived_type & operator/=(const field_type &k)
vector space division by scalar
Definition: densematrix.hh:329
derived_type & operator-=(const DenseMatrix< Other > &x)
vector space subtraction
Definition: densematrix.hh:312
derived_type & operator+=(const DenseMatrix< Other > &x)
vector space addition
Definition: densematrix.hh:289
constexpr static int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition: densematrix.hh:178
derived_type & operator*=(const field_type &k)
vector space multiplication with scalar
Definition: densematrix.hh:321
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
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 & operator=(FieldMatrix< T, rows, cols > const &)=delete
no copy assignment from FieldMatrix of different size
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
friend auto operator*(const FieldMatrix &matrix, Scalar scalar)
vector space multiplication with scalar
Definition: fmatrix.hh:211
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
constexpr FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > const &l)
Constructor initializing the matrix from a list of vector.
Definition: fmatrix.hh:140
FieldMatrix & operator=(const FieldMatrix &)=default
copy assignment operator
FieldMatrix< K, COLS, ROWS > transposed() const
Return transposed of the matrix as FieldMatrix.
Definition: fmatrix.hh:171
constexpr static int rows
The number of rows.
Definition: fmatrix.hh:123
constexpr static 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
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 &matrixA, const FieldMatrix< OtherScalar, ROWS, COLS > &matrixB)
vector space addition – two-argument version
Definition: fmatrix.hh:182
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
A few common exception classes.
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 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 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, cols > multTransposed(const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
calculates ret = matrix^T * x
Definition: fmatrix.hh:837
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.
Compute type of the result of an arithmetic operation involving two different number types.
Definition: promotiontraits.hh:27
Traits for type conversions and type information.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 2, 22:35, 2024)