dune-fem  2.8-git
discontinuousgalerkin/interpolation.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_INTERPOLATION_HH
2 #define DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_INTERPOLATION_HH
3 
4 #include <type_traits>
5 #include <utility>
6 
7 #include <dune/grid/common/capabilities.hh>
8 
11 
14 
15 namespace Dune
16 {
17 
18  namespace Fem
19  {
20 
21  // Internal forward declaration
22  // ----------------------------
23 
24  template< class GridPart, class BasisFunctionSet,
25  class Quadrature = CachingQuadrature< GridPart, BasisFunctionSet::EntityType::codimension > >
26  class DiscontinuousGalerkinLocalL2Projection;
27 
28  template< class GridPart, class BasisFunctionSet,
29  class Quadrature = CachingQuadrature< GridPart, BasisFunctionSet::EntityType::codimension > >
30  class LocalOrthonormalL2Projection;
31 
32 
33  // LocalOrthonormalL2Projection
34  // ----------------------------
35 
37  template< class GridPart, class BasisFunctionSet, class Quadrature >
39  : public LocalL2Projection< BasisFunctionSet, LocalOrthonormalL2Projection< GridPart, BasisFunctionSet, Quadrature > >
40  {
43 
44  public:
49 
50  private:
51  typedef GridPart GridPartType;
52  typedef typename GridPartType::GridType GridType;
53  typedef typename BasisFunctionSetType :: RangeType RangeType;
54 
55  public:
62  {}
63 
66  {}
67 
74  LocalOrthonormalL2Projection ( const ThisType & ) = default;
75 
76  LocalOrthonormalL2Projection ( ThisType &&other ) = default;
77 
78  ThisType &operator= ( const ThisType & ) = default;
79 
80  ThisType &operator= ( ThisType &&other ) = default;
81 
90  {
91  return basisFunctionSet_;
92  }
93 
95  template< class LocalFunction, class LocalDofVector >
96  void apply ( const LocalFunction &localFunction, LocalDofVector &localDofVector ) const
97  {
98  // get entity and geometry
99  const EntityType &entity = localFunction.entity();
100 
101  if( entity.type().isNone() )
102  {
104  ElementQuadratureType quadrature( entity, localFunction.order() + basisFunctionSet().order() );
105  computeL2Projection( entity, quadrature, localFunction, localDofVector );
106  }
107  else
108  {
109  // create quadrature with appropriate order
110  Quadrature quadrature( entity, localFunction.order() + basisFunctionSet().order() );
111  computeL2Projection( entity, quadrature, localFunction, localDofVector );
112  }
113  }
114 
117  protected:
118  template <class QuadImpl, class LocalFunction, class LocalDofVector >
119  void computeL2Projection( const EntityType& entity,
120  const QuadImpl& quadrature,
121  const LocalFunction &localFunction, LocalDofVector &localDofVector ) const
122  {
123  // set all dofs to zero
124  localDofVector.clear();
125 
126  const int nop = quadrature.nop();
127  // adjust size of values
128  values_.resize( nop );
129 
130  // evaluate local function for all quadrature points
131  localFunction.evaluateQuadrature( quadrature, values_ );
132 
133  // apply weight only (for orthonormal basis set integration element and
134  // mass matrix can be ignored even if geometry is non-affine)
135  for(auto qp : quadrature )
136  values_[ qp.index() ] *= qp.weight();
137 
138  // add values to local dof vector
139  basisFunctionSet().axpy( quadrature, values_, localDofVector );
140  }
141 
143  mutable std::vector< RangeType > values_;
144  };
145 
146 
147  // DiscontinuousGalerkinLocalL2Projection
148  // --------------------------------------
149 
150  template< class GridPart, class BasisFunctionSet, class Quadrature >
152  : public LocalL2Projection< BasisFunctionSet, DiscontinuousGalerkinLocalL2Projection< GridPart, BasisFunctionSet, Quadrature > >
153  {
156 
157  public:
160 
161  private:
162  typedef GridPart GridPartType;
163  typedef typename GridPartType::GridType GridType;
164  static const bool cartesian = Dune::Capabilities::isCartesian< GridType >::v;
165 
166  typedef typename std::conditional< cartesian,
169  >::type LocalRieszProjectionType;
170 
172 
173  public:
179  : impl_( LocalRieszProjectionType( basisFunctionSet ) )
180  {}
181 
183  : impl_( LocalRieszProjectionType( std::forward< BasisFunctionSetType >( basisFunctionSet ) ) )
184  {}
185 
193 
195  : impl_( std::move( other.impl_ ) )
196  {}
197 
198  ThisType &operator= ( const ThisType & ) = default;
199 
201  {
202  impl_ = std::move( other.impl_ );
203  return *this;
204  }
205 
214  {
215  return impl_.basisFunctionSet();
216  }
217 
219  template< class LocalFunction, class LocalDofVector >
220  void apply ( const LocalFunction &localFunction, LocalDofVector &localDofVector ) const
221  {
222  impl_( localFunction, localDofVector );
223  }
224 
225  void unbind() {}
226 
229  private:
230  Implementation impl_;
231  };
232 
233  } // namespace Fem
234 
235 } // namespace Dune
236 
237 #endif // #ifndef DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_INTERPOLATION_HH
Definition: bindguard.hh:11
static GridFunctionView< GF > localFunction(const GF &gf)
Definition: gridfunctionview.hh:118
interface for local functions
Definition: localfunction.hh:77
please doc me
Definition: l2projection.hh:29
BasisFunctionSetType basisFunctionSet() const
return basis function set
Definition: l2projection.hh:179
Definition: operator/projection/local/riesz/orthonormal.hh:25
quadrature on the codim-0 reference element
Definition: elementquadrature.hh:18
actual interface class for quadratures
Definition: quadrature.hh:405
Interface class for basis function sets.
Definition: basisfunctionset/basisfunctionset.hh:31
void axpy(const Quadrature &quad, const Vector &values, DofVector &dofs) const
evaluate all basis function and multiply with given values and add to dofs
Entity EntityType
entity type
Definition: basisfunctionset/basisfunctionset.hh:34
FunctionSpaceType::RangeType RangeType
range type
Definition: basisfunctionset/basisfunctionset.hh:44
Definition: discontinuousgalerkin/interpolation.hh:153
BasisFunctionSet basisFunctionSet() const
return basis function set
Definition: discontinuousgalerkin/interpolation.hh:213
void unbind()
Definition: discontinuousgalerkin/interpolation.hh:225
BaseType::BasisFunctionSetType BasisFunctionSetType
basis function set type
Definition: discontinuousgalerkin/interpolation.hh:159
DiscontinuousGalerkinLocalL2Projection(const BasisFunctionSetType &basisFunctionSet)
Definition: discontinuousgalerkin/interpolation.hh:178
ThisType & operator=(const ThisType &)=default
DiscontinuousGalerkinLocalL2Projection(const ThisType &)=default
DiscontinuousGalerkinLocalL2Projection(BasisFunctionSetType &&basisFunctionSet)
Definition: discontinuousgalerkin/interpolation.hh:182
DiscontinuousGalerkinLocalL2Projection(ThisType &&other)
Definition: discontinuousgalerkin/interpolation.hh:194
void apply(const LocalFunction &localFunction, LocalDofVector &localDofVector) const
please doc me
Definition: discontinuousgalerkin/interpolation.hh:220
specialization of local L2 projection for orthonormal DG spaces
Definition: discontinuousgalerkin/interpolation.hh:40
BasisFunctionSetType basisFunctionSet_
Definition: discontinuousgalerkin/interpolation.hh:142
ThisType & operator=(const ThisType &)=default
LocalOrthonormalL2Projection(ThisType &&other)=default
void apply(const LocalFunction &localFunction, LocalDofVector &localDofVector) const
please doc me
Definition: discontinuousgalerkin/interpolation.hh:96
std::vector< RangeType > values_
Definition: discontinuousgalerkin/interpolation.hh:143
LocalOrthonormalL2Projection(BasisFunctionSetType &&basisFunctionSet)
Definition: discontinuousgalerkin/interpolation.hh:64
BasisFunctionSetType ::EntityType EntityType
Definition: discontinuousgalerkin/interpolation.hh:48
void computeL2Projection(const EntityType &entity, const QuadImpl &quadrature, const LocalFunction &localFunction, LocalDofVector &localDofVector) const
Definition: discontinuousgalerkin/interpolation.hh:119
LocalOrthonormalL2Projection(const ThisType &)=default
BaseType::BasisFunctionSetType BasisFunctionSetType
basis function set type
Definition: discontinuousgalerkin/interpolation.hh:46
LocalOrthonormalL2Projection(const BasisFunctionSetType &basisFunctionSet)
Definition: discontinuousgalerkin/interpolation.hh:60
const BasisFunctionSet & basisFunctionSet() const
return basis function set
Definition: discontinuousgalerkin/interpolation.hh:89