5#ifndef DUNE_L2INTERPOLATION_HH
6#define DUNE_L2INTERPOLATION_HH
8#include <dune/common/concept.hh>
9#include <dune/common/dynmatrix.hh>
11#include <dune/geometry/quadraturerules.hh>
32 template<
class B,
class Q,
bool onb >
35 template<
class B,
class Q >
44 static const unsigned int dimension = Basis::dimension;
47 template<
class Function,
class DofField>
48 void interpolate (
const Function &function, std::vector< DofField > &coefficients )
const
50 typedef FieldVector< DofField, Basis::dimRange > RangeVector;
52 const unsigned int size =
basis().size();
53 static std::vector< RangeVector > basisValues( size );
55 coefficients.resize( size );
56 basisValues.resize( size );
57 for(
unsigned int i = 0; i < size; ++i )
62 basis().evaluate( qp.position(), basisValues );
63 auto val = function( qp.position() );
64 RangeVector factor = field_cast< DofField >( val );
65 factor *= field_cast< DofField >( qp.weight() );
66 for(
unsigned int i = 0; i < size; ++i )
67 coefficients[ i ] += factor * basisValues[ i ];
91 template<
class B,
class Q >
96 template<
class BasisFactory,
bool onb >
102 :
Base(basis,quadrature)
105 template<
class B,
class Q >
110 template<
class BasisFactory,
bool onb >
114 template<
class Function,
class DofField >
115 void interpolate (
const Function &function, std::vector< DofField > &coefficients )
const
117 const unsigned size = Base::basis().size();
118 Base::interpolate(function,val_);
119 coefficients.resize( size );
120 for (
unsigned int i=0; i<size; ++i)
123 for (
unsigned int j=0; j<size; ++j)
125 coefficients[i] += field_cast<DofField>(massMatrix_[i][j]*val_[j]);
130 LocalL2Interpolation (
const typename Base::Basis &basis,
const typename Base::Quadrature &quadrature )
131 : Base(basis,quadrature),
133 massMatrix_(basis.size(),basis.size(),Field(0))
135 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
136 typedef typename Base::Quadrature::iterator Iterator;
137 const unsigned size = basis.size();
138 std::vector< RangeVector > basisValues( size );
140 const Iterator end = Base::quadrature().end();
141 for( Iterator it = Base::quadrature().begin(); it != end; ++it )
143 Base::basis().evaluate( it->position(), basisValues );
144 for (
unsigned int i=0; i<size; ++i)
145 for (
unsigned int j=0; j<size; ++j)
146 massMatrix_[i][j] += (basisValues[i]*basisValues[j])*it->weight();
148 massMatrix_.invert();
150 typedef typename Base::Basis::StorageField Field;
151 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
152 typedef DynamicMatrix<Field> MassMatrix;
153 mutable std::vector<Field> val_;
154 MassMatrix massMatrix_;
161 template<
class BasisFactory,
bool onb >
164 static const unsigned int dimension = BasisFactory::dimension;
165 typedef typename BasisFactory::Key
Key;
166 typedef typename BasisFactory::Object
Basis;
173 template< GeometryType::Id geometryId >
176 constexpr Dune::GeometryType geometry = geometryId;
177 const Basis *basis = BasisFactory::template create< geometry >( key );
178 const Quadrature & quadrature = QuadratureProvider::rule(geometry, 2*basis->order()+1);
179 return new Object( *basis, quadrature );
183 const Basis &basis =
object->basis();
184 BasisFactory::release( &basis );
Definition bdfmcube.hh:18
A class representing the zero of a given Field.
Definition field.hh:79
A local L2 interpolation taking a test basis and a quadrature rule.
Definition l2interpolation.hh:33
Definition l2interpolation.hh:37
LocalL2InterpolationBase(const Basis &basis, const Quadrature &quadrature)
Definition l2interpolation.hh:82
const Basis & basis() const
Definition l2interpolation.hh:71
const Quadrature & quadrature_
Definition l2interpolation.hh:88
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Interpolate a function that implements Range operator()(Domain)
Definition l2interpolation.hh:48
const Basis & basis_
Definition l2interpolation.hh:87
static const unsigned int dimension
Definition l2interpolation.hh:44
const Quadrature & quadrature() const
Definition l2interpolation.hh:76
Q Quadrature
Definition l2interpolation.hh:42
B Basis
Definition l2interpolation.hh:41
LocalL2InterpolationBase< B, Q > Base
Definition l2interpolation.hh:95
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Definition l2interpolation.hh:115
LocalL2InterpolationBase< B, Q > Base
Definition l2interpolation.hh:109
A factory class for the local l2 interpolations taking a basis factory.
Definition l2interpolation.hh:163
static const unsigned int dimension
Definition l2interpolation.hh:164
static void release(Object *object)
Definition l2interpolation.hh:181
BasisFactory::Object Basis
Definition l2interpolation.hh:166
double Field
Definition l2interpolation.hh:167
QuadratureRules< Field, dimension > QuadratureProvider
Definition l2interpolation.hh:169
QuadratureRule< Field, dimension > Quadrature
Definition l2interpolation.hh:168
static Object * create(const Key &key)
Definition l2interpolation.hh:174
BasisFactory::Key Key
Definition l2interpolation.hh:165
const LocalInterpolation Object
Definition l2interpolation.hh:171
LocalL2Interpolation< Basis, Quadrature, onb > LocalInterpolation
Definition l2interpolation.hh:170