3 #ifndef DUNE_L2INTERPOLATION_HH
4 #define DUNE_L2INTERPOLATION_HH
6 #include <dune/geometry/topologyfactory.hh>
7 #include <dune/geometry/quadraturerules.hh>
28 template<
class B,
class Q,
bool onb >
31 template<
class B,
class Q >
40 static const unsigned int dimension = Basis::dimension;
42 template<
class Function,
class DofField >
43 void interpolate (
const Function &
function, std::vector< DofField > &coefficients )
const
45 typedef typename Quadrature::iterator Iterator;
46 typedef FieldVector< DofField, Basis::dimRange > RangeVector;
48 const unsigned int size =
basis().size();
49 static std::vector< RangeVector > basisValues( size );
51 coefficients.resize( size );
52 basisValues.resize( size );
53 for(
unsigned int i = 0; i < size; ++i )
57 for( Iterator it =
quadrature().begin(); it != end; ++it )
59 basis().evaluate( it->position(), basisValues );
60 typename Function::RangeType val;
61 function.evaluate( field_cast<typename Function::DomainType::field_type>(it->position()), val );
62 RangeVector factor =
field_cast< DofField >( val );
63 factor *=
field_cast< DofField >( it->weight() );
64 for(
unsigned int i = 0; i < size; ++i )
65 coefficients[ i ] += factor * basisValues[ i ];
89 template<
class B,
class Q >
94 template<
class BasisFactory,
bool onb >
100 :
Base(basis,quadrature)
103 template<
class B,
class Q >
108 template<
class BasisFactory,
bool onb >
112 template<
class Function,
class DofField >
113 void interpolate (
const Function &
function, std::vector< DofField > &coefficients )
const
115 const unsigned size = Base::basis().size();
116 Base::interpolate(
function,val_);
117 coefficients.resize( size );
118 for (
unsigned int i=0; i<size; ++i)
121 for (
unsigned int j=0; j<size; ++j)
123 coefficients[i] +=
field_cast<DofField>(massMatrix_(i,j)*val_[j]);
128 LocalL2Interpolation (
const typename Base::Basis &basis,
const typename Base::Quadrature &quadrature )
129 : Base(basis,quadrature),
133 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
134 typedef typename Base::Quadrature::iterator Iterator;
135 const unsigned size = basis.size();
136 std::vector< RangeVector > basisValues( size );
138 massMatrix_.resize( size,size );
139 for (
unsigned int i=0; i<size; ++i)
140 for (
unsigned int j=0; j<size; ++j)
141 massMatrix_(i,j) = 0;
142 const Iterator end = Base::quadrature().end();
143 for( Iterator it = Base::quadrature().begin(); it != end; ++it )
145 Base::basis().evaluate( it->position(), basisValues );
146 for (
unsigned int i=0; i<size; ++i)
147 for (
unsigned int j=0; j<size; ++j)
148 massMatrix_(i,j) += (basisValues[i]*basisValues[j])*it->weight();
150 if ( !massMatrix_.invert() )
152 DUNE_THROW(MathError,
"Mass matrix singular in LocalL2Interpolation");
156 typedef typename Base::Basis::StorageField Field;
157 typedef FieldVector< Field, Base::Basis::dimRange > RangeVector;
158 typedef LFEMatrix<Field> MassMatrix;
159 mutable std::vector<Field> val_;
160 MassMatrix massMatrix_;
168 template<
class BasisFactory,
bool onb >
170 template<
class BasisFactory,
bool onb >
173 static const unsigned int dimension = BasisFactory::dimension;
179 typedef typename BasisFactory::Key
Key;
180 typedef typename BasisFactory::Object
Basis;
186 template<
class BasisFactory,
bool onb >
188 public TopologyFactory< LocalL2InterpolationFactoryTraits<BasisFactory,onb> >
198 template<
class Topology >
201 Dune::GeometryType gt(Topology::id, Topology::dimension);
202 const Basis *basis = BasisFactory::template create< Topology >( key );
203 const Quadrature & quadrature = Traits::QuadratureProvider::rule(gt, 2*basis->order()+1);
204 return new Object( *basis, quadrature );
208 const Basis &basis =
object->basis();
209 BasisFactory::release( &basis );
216 #endif // #ifndef DUNE_L2INTERPOLATION_HH
Traits::Quadrature Quadrature
Definition: l2interpolation.hh:196
const Basis & basis_
Definition: l2interpolation.hh:85
static Object * createObject(const Key &key)
Definition: l2interpolation.hh:199
A local L2 interpolation taking a test basis and a quadrature rule.
Definition: l2interpolation.hh:29
const Quadrature & quadrature() const
Definition: l2interpolation.hh:74
LocalL2InterpolationFactory< BasisFactory, onb > Factory
Definition: l2interpolation.hh:183
static const unsigned int dimension
Definition: l2interpolation.hh:40
Definition: l2interpolation.hh:32
LocalL2InterpolationBase< B, Q > Base
Definition: l2interpolation.hh:107
const Quadrature & quadrature_
Definition: l2interpolation.hh:86
B Basis
Definition: l2interpolation.hh:37
const Basis & basis() const
Definition: l2interpolation.hh:69
Q Quadrature
Definition: l2interpolation.hh:38
LocalL2InterpolationFactoryTraits< BasisFactory, onb > Traits
Definition: l2interpolation.hh:190
Definition: l2interpolation.hh:171
LocalL2Interpolation< Basis, Quadrature, onb > LocalInterpolation
Definition: l2interpolation.hh:181
Traits::Field Field
Definition: l2interpolation.hh:195
Traits::Key Key
Definition: l2interpolation.hh:192
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Definition: l2interpolation.hh:43
double Field
Definition: l2interpolation.hh:175
const LocalInterpolation Object
Definition: l2interpolation.hh:182
static const unsigned int dimension
Definition: l2interpolation.hh:191
LocalL2InterpolationBase< B, Q > Base
Definition: l2interpolation.hh:93
Traits::Basis Basis
Definition: l2interpolation.hh:193
BasisFactory::Object Basis
Definition: l2interpolation.hh:180
Traits::Object Object
Definition: l2interpolation.hh:194
A class representing the zero of a given Field.
Definition: field.hh:76
static void release(Object *object)
Definition: l2interpolation.hh:206
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
QuadratureRules< Field, dimension > QuadratureProvider
Definition: l2interpolation.hh:177
void interpolate(const Function &function, std::vector< DofField > &coefficients) const
Definition: l2interpolation.hh:113
QuadratureRule< Field, dimension > Quadrature
Definition: l2interpolation.hh:176
BasisFactory::Key Key
Definition: l2interpolation.hh:179
A factory class for the local l2 interpolations taking a basis factory and using GenericGeometry::Qua...
Definition: l2interpolation.hh:169
static const unsigned int dimension
Definition: l2interpolation.hh:173
LocalL2InterpolationBase(const Basis &basis, const Quadrature &quadrature)
Definition: l2interpolation.hh:80