3#ifndef DUNE_L2INTERPOLATION_HH
4#define DUNE_L2INTERPOLATION_HH
6#include <dune/common/concept.hh>
8#include <dune/geometry/quadraturerules.hh>
30 template<
class B,
class Q,
bool onb >
33 template<
class B,
class Q >
42 static const unsigned int dimension = Basis::dimension;
45 template<
class Function,
class DofField, std::enable_if_t<models<Impl::FunctionWithEvaluate<
typename Function::DomainType,
typename Function::RangeType>, Function>(),
int> = 0 >
46 void interpolate (
const Function &function, std::vector< DofField > &coefficients )
const
48 typedef typename Quadrature::iterator Iterator;
49 typedef FieldVector< DofField, Basis::dimRange > RangeVector;
51 const unsigned int size =
basis().size();
52 static std::vector< RangeVector > basisValues( size );
54 coefficients.resize( size );
55 basisValues.resize( size );
56 for(
unsigned int i = 0; i < size; ++i )
60 for( Iterator it =
quadrature().begin(); it != end; ++it )
62 basis().evaluate( it->position(), basisValues );
63 typename Function::RangeType val;
64 function.evaluate( field_cast<typename Function::DomainType::field_type>(it->position()), val );
65 RangeVector factor = field_cast< DofField >( val );
66 factor *= field_cast< DofField >( it->weight() );
67 for(
unsigned int i = 0; i < size; ++i )
68 coefficients[ i ] += factor * basisValues[ i ];
73 template<
class Function,
class DofField, std::enable_if_t<models<Impl::FunctionWithCallOperator<
typename Quadrature::value_type::Vector>, Function>(),
int> = 0 >
74 void interpolate (
const Function &function, std::vector< DofField > &coefficients )
const
76 typedef FieldVector< DofField, Basis::dimRange > RangeVector;
78 const unsigned int size =
basis().size();
79 static std::vector< RangeVector > basisValues( size );
81 coefficients.resize( size );
82 basisValues.resize( size );
83 for(
unsigned int i = 0; i < size; ++i )
88 basis().evaluate( qp.position(), basisValues );
89 auto val = function( qp.position() );
90 RangeVector factor = field_cast< DofField >( val );
91 factor *= field_cast< DofField >( qp.weight() );
92 for(
unsigned int i = 0; i < size; ++i )
93 coefficients[ i ] += factor * basisValues[ i ];
117 template<
class B,
class Q >
122 template<
class BasisFactory,
bool onb >
128 :
Base(basis,quadrature)
131 template<
class B,
class Q >
136 template<
class BasisFactory,
bool onb >
140 template<
class Function,
class DofField >
141 void interpolate (
const Function &function, std::vector< DofField > &coefficients )
const
143 const unsigned size = Base::basis().size();
144 Base::interpolate(function,val_);
145 coefficients.resize( size );
146 for (
unsigned int i=0; i<size; ++i)
149 for (
unsigned int j=0; j<size; ++j)
151 coefficients[i] += field_cast<DofField>(massMatrix_(i,j)*val_[j]);
156 LocalL2Interpolation (
const typename Base::Basis &basis,
const typename Base::Quadrature &quadrature )
157 : Base(basis,quadrature),
161 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
162 typedef typename Base::Quadrature::iterator Iterator;
163 const unsigned size = basis.size();
164 std::vector< RangeVector > basisValues( size );
166 massMatrix_.resize( size,size );
167 for (
unsigned int i=0; i<size; ++i)
168 for (
unsigned int j=0; j<size; ++j)
169 massMatrix_(i,j) = 0;
170 const Iterator end = Base::quadrature().end();
171 for( Iterator it = Base::quadrature().begin(); it != end; ++it )
173 Base::basis().evaluate( it->position(), basisValues );
174 for (
unsigned int i=0; i<size; ++i)
175 for (
unsigned int j=0; j<size; ++j)
176 massMatrix_(i,j) += (basisValues[i]*basisValues[j])*it->weight();
178 if ( !massMatrix_.invert() )
180 DUNE_THROW(MathError,
"Mass matrix singular in LocalL2Interpolation");
184 typedef typename Base::Basis::StorageField Field;
185 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
186 typedef LFEMatrix<Field> MassMatrix;
187 mutable std::vector<Field> val_;
188 MassMatrix massMatrix_;
195 template<
class BasisFactory,
bool onb >
198 static const unsigned int dimension = BasisFactory::dimension;
199 typedef typename BasisFactory::Key
Key;
200 typedef typename BasisFactory::Object
Basis;
207 template< GeometryType::Id geometryId >
210 constexpr Dune::GeometryType geometry = geometryId;
211 const Basis *basis = BasisFactory::template create< geometry >( key );
212 const Quadrature & quadrature = QuadratureProvider::rule(geometry, 2*basis->order()+1);
213 return new Object( *basis, quadrature );
217 const Basis &basis =
object->basis();
218 BasisFactory::release( &basis );
Definition: bdfmcube.hh:16
A class representing the zero of a given Field.
Definition: field.hh:77
A local L2 interpolation taking a test basis and a quadrature rule.
Definition: l2interpolation.hh:31
Definition: l2interpolation.hh:35
LocalL2InterpolationBase(const Basis &basis, const Quadrature &quadrature)
Definition: l2interpolation.hh:108
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Interpolate a function that implements void evaluate(Domain, Range&)
Definition: l2interpolation.hh:46
const Basis & basis() const
Definition: l2interpolation.hh:97
const Quadrature & quadrature_
Definition: l2interpolation.hh:114
const Basis & basis_
Definition: l2interpolation.hh:113
static const unsigned int dimension
Definition: l2interpolation.hh:42
const Quadrature & quadrature() const
Definition: l2interpolation.hh:102
Q Quadrature
Definition: l2interpolation.hh:40
B Basis
Definition: l2interpolation.hh:39
LocalL2InterpolationBase< B, Q > Base
Definition: l2interpolation.hh:121
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Definition: l2interpolation.hh:141
LocalL2InterpolationBase< B, Q > Base
Definition: l2interpolation.hh:135
A factory class for the local l2 interpolations taking a basis factory.
Definition: l2interpolation.hh:197
static const unsigned int dimension
Definition: l2interpolation.hh:198
static void release(Object *object)
Definition: l2interpolation.hh:215
BasisFactory::Object Basis
Definition: l2interpolation.hh:200
double Field
Definition: l2interpolation.hh:201
QuadratureRules< Field, dimension > QuadratureProvider
Definition: l2interpolation.hh:203
QuadratureRule< Field, dimension > Quadrature
Definition: l2interpolation.hh:202
static Object * create(const Key &key)
Definition: l2interpolation.hh:208
BasisFactory::Key Key
Definition: l2interpolation.hh:199
const LocalInterpolation Object
Definition: l2interpolation.hh:205
LocalL2Interpolation< Basis, Quadrature, onb > LocalInterpolation
Definition: l2interpolation.hh:204