dune-localfunctions  2.11
basismatrix.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_BASISMATRIX_HH
6 #define DUNE_BASISMATRIX_HH
7 
8 #include <fstream>
9 #include <dune/common/dynmatrix.hh>
10 #include <dune/common/exceptions.hh>
11 
14 
15 namespace Dune
16 {
17  /****************************************
18  * A dense matrix representation of a ''polynomial''
19  * basis. Its represent a basis as a linear
20  * combination of a second basis, i.e., a
21  * monomial basis. It is simular to the PolynomialBasis
22  * but it not derived from the LocalBasis class.
23  * It is used to define a ''pre basis''.
24  ****************************************/
25  template< class PreBasis, class Interpolation,
26  class Field >
27  struct BasisMatrix;
28 
29  template< class PreBasis, class Interpolation,
30  class Field >
31  struct BasisMatrixBase : public DynamicMatrix<Field>
32  {
33  typedef DynamicMatrix<Field> Matrix;
34 
35  BasisMatrixBase( const PreBasis& preBasis,
36  const Interpolation& localInterpolation )
37  : cols_(preBasis.size())
38  {
39  localInterpolation.interpolate( preBasis, *this );
40  this->invert();
41  }
42  unsigned int cols () const
43  {
44  return cols_;
45  }
46  unsigned int rows () const
47  {
48  return Matrix::rows();
49  }
50  private:
51  unsigned int cols_;
52  };
53 
54  template< GeometryType::Id geometryId, class F,
55  class Interpolation,
56  class Field >
57  struct BasisMatrix< const MonomialBasis< geometryId, F >, Interpolation, Field >
58  : public BasisMatrixBase< const MonomialBasis< geometryId, F >, Interpolation, Field >
59  {
62  typedef typename Base::Matrix Matrix;
63 
64  BasisMatrix( const PreBasis& preBasis,
65  const Interpolation& localInterpolation )
66  : Base(preBasis, localInterpolation)
67  {}
68  template <class Vector>
69  void row( const unsigned int row, Vector &vec ) const
70  {
71  const unsigned int N = Matrix::rows();
72  assert( Matrix::cols() == N && vec.size() == N );
73  // note: that the transposed matrix is computed,
74  // and is square
75  for (unsigned int i=0; i<N; ++i)
76  field_cast((*this)[i][row],vec[i]);
77  }
78  };
79  template< int dim, class F,
80  class Interpolation,
81  class Field >
82  struct BasisMatrix< const Dune::VirtualMonomialBasis< dim, F >, Interpolation, Field >
83  : public BasisMatrixBase< const VirtualMonomialBasis< dim, F >, Interpolation, Field >
84  {
87  typedef typename Base::Matrix Matrix;
88 
89  BasisMatrix( const PreBasis& preBasis,
90  const Interpolation& localInterpolation )
91  : Base(preBasis, localInterpolation)
92  {}
93  template <class Vector>
94  void row( const unsigned int row, Vector &vec ) const
95  {
96  const unsigned int N = Matrix::rows();
97  assert( Matrix::cols() == N && vec.size() == N );
98  // note: that the transposed matrix is computed,
99  // and is square
100  for (unsigned int i=0; i<N; ++i)
101  field_cast((*this)[i][row],vec[i]);
102  }
103  };
104  template< class Eval, class CM, class D, class R,
105  class Interpolation,
106  class Field >
107  struct BasisMatrix< const PolynomialBasis<Eval,CM,D,R>, Interpolation, Field >
108  : public BasisMatrixBase< const PolynomialBasis<Eval,CM,D,R>, Interpolation, Field >
109  {
112  typedef typename Base::Matrix Matrix;
113 
114  BasisMatrix( const PreBasis& preBasis,
115  const Interpolation& localInterpolation )
116  : Base(preBasis, localInterpolation),
117  preBasis_(preBasis)
118  {}
119  unsigned int cols() const
120  {
121  return preBasis_.matrix().baseSize() ;
122  }
123  template <class Vector>
124  void row( const unsigned int row, Vector &vec ) const
125  {
126  assert( Matrix::rows() == Matrix::cols() );
127  assert( vec.size() == preBasis_.matrix().baseSize() );
128  assert( Matrix::cols() == preBasis_.size() );
129  for (unsigned int j=0; j<Matrix::cols(); ++j)
130  vec[j] = 0;
131  for (unsigned int i=0; i<Matrix::rows(); ++i)
132  preBasis_.matrix().
133  addRow(i,(*this)[i][row],vec);
134  }
135  private:
136  const PreBasis& preBasis_;
137  };
138  template< class Eval, class CM, class D, class R,
139  class Interpolation,
140  class Field >
141  struct BasisMatrix< const PolynomialBasisWithMatrix<Eval,CM,D,R>, Interpolation, Field >
142  : public BasisMatrixBase< const PolynomialBasisWithMatrix<Eval,CM,D,R>, Interpolation, Field >
143  {
146  typedef typename Base::Matrix Matrix;
147 
148  BasisMatrix( const PreBasis& preBasis,
149  const Interpolation& localInterpolation )
150  : Base(preBasis, localInterpolation),
151  preBasis_(preBasis)
152  {}
153  unsigned int cols() const
154  {
155  return preBasis_.matrix().baseSize() ;
156  }
157  unsigned int rows () const
158  {
159  assert( Matrix::rows() == preBasis_.matrix().size() );
160  return preBasis_.matrix().size()*CM::blockSize ;
161  }
162  template <class Vector>
163  void row( const unsigned int row, Vector &vec ) const
164  {
165  unsigned int r = row / CM::blockSize;
166  assert( r < Matrix::rows() );
167  assert( Matrix::rows() == Matrix::cols() );
168  assert( vec.size() == preBasis_.matrix().baseSize() );
169  assert( Matrix::cols() == preBasis_.size() );
170  for (unsigned int j=0; j<vec.size(); ++j)
171  vec[j] = 0;
172  for (unsigned int i=0; i<Matrix::rows(); ++i)
173  preBasis_.matrix().
174  addRow(i*CM::blockSize+row%CM::blockSize,(*this)[i][r],vec);
175  }
176  private:
177  const PreBasis& preBasis_;
178  };
179 }
180 
181 #endif // DUNE_BASISMATRIX_HH
Definition: polynomialbasis.hh:62
Definition: monomialbasis.hh:75
Definition: basismatrix.hh:31
const MonomialBasis< geometryId, F > PreBasis
Definition: basismatrix.hh:60
Definition: polynomialbasis.hh:344
BasisMatrix(const PreBasis &preBasis, const Interpolation &localInterpolation)
Definition: basismatrix.hh:148
unsigned int cols() const
Definition: basismatrix.hh:42
Definition: bdfmcube.hh:17
Definition: basismatrix.hh:27
const VirtualMonomialBasis< dim, F > PreBasis
Definition: basismatrix.hh:85
unsigned int rows() const
Definition: basismatrix.hh:46
BasisMatrix(const PreBasis &preBasis, const Interpolation &localInterpolation)
Definition: basismatrix.hh:114
void row(const unsigned int row, Vector &vec) const
Definition: basismatrix.hh:69
BasisMatrixBase< PreBasis, Interpolation, Field > Base
Definition: basismatrix.hh:86
void row(const unsigned int row, Vector &vec) const
Definition: basismatrix.hh:124
void row(const unsigned int row, Vector &vec) const
Definition: basismatrix.hh:163
BasisMatrix(const PreBasis &preBasis, const Interpolation &localInterpolation)
Definition: basismatrix.hh:89
BasisMatrixBase< PreBasis, Interpolation, Field > Base
Definition: basismatrix.hh:145
DynamicMatrix< Field > Matrix
Definition: basismatrix.hh:33
BasisMatrixBase< PreBasis, Interpolation, Field > Base
Definition: basismatrix.hh:61
BasisMatrixBase(const PreBasis &preBasis, const Interpolation &localInterpolation)
Definition: basismatrix.hh:35
Definition: monomialbasis.hh:674
const PolynomialBasis< Eval, CM, D, R > PreBasis
Definition: basismatrix.hh:110
BasisMatrix(const PreBasis &preBasis, const Interpolation &localInterpolation)
Definition: basismatrix.hh:64
void row(const unsigned int row, Vector &vec) const
Definition: basismatrix.hh:94
BasisMatrixBase< PreBasis, Interpolation, Field > Base
Definition: basismatrix.hh:111
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:160
const PolynomialBasisWithMatrix< Eval, CM, D, R > PreBasis
Definition: basismatrix.hh:144