dune-localfunctions
2.7.0
|
Go to the documentation of this file.
3 #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS_RAVIARTTHOMASSIMPLEX_RAVIARTTHOMASSIMPLEXINTERPOLATION_HH
4 #define DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS_RAVIARTTHOMASSIMPLEX_RAVIARTTHOMASSIMPLEXINTERPOLATION_HH
9 #include <dune/common/exceptions.hh>
11 #include <dune/geometry/quadraturerules.hh>
12 #include <dune/geometry/referenceelements.hh>
13 #include <dune/geometry/type.hh>
26 template <
unsigned int dim,
class Field >
39 template <
class Setter>
42 setter.setLocalKeys(localKey_);
48 return localKey_[ i ];
53 return localKey_.size();
57 std::vector< LocalKey > localKey_;
65 template <
unsigned int dim >
68 typedef std::size_t
Key;
71 template<
class Topology >
75 if( !supports< Topology >( key ) )
77 typename InterpolationFactory::Object *interpolation = InterpolationFactory::template create< Topology >( key );
79 InterpolationFactory::release( interpolation );
83 template<
class Topology >
102 template<
unsigned int dim,
class Field >
110 typedef FieldVector< Field, dimension >
Normal;
120 for( FaceStructure &f : faceStructure_ )
128 std::size_t
order ()
const {
return order_; }
130 unsigned int faceSize ()
const {
return faceSize_; }
135 const Normal &
normal (
unsigned int f )
const { assert( f <
faceSize() );
return *(faceStructure_[ f ].normal_); }
137 template<
class Topology >
141 topologyId_ = Topology::id;
143 testBasis_ = (
order > 0 ? TestBasisFactory::template create< Topology >(
order-1 ) :
nullptr);
145 const auto &refElement = ReferenceElements< Field, dimension >::general(
type() );
146 faceSize_ = refElement.size( 1 );
147 faceStructure_.reserve( faceSize_ );
148 for(
unsigned int face = 0; face < faceSize_; ++face )
150 TestFaceBasis *faceBasis = Impl::IfTopology< CreateFaceBasis, dimension-1 >::apply( refElement.type( face, 1 ).id(),
order );
151 faceStructure_.emplace_back( faceBasis, refElement.integrationOuterNormal( face ) );
153 assert( faceStructure_.size() == faceSize_ );
160 : basis_( tfb ), normal_( &n )
164 const Dune::FieldVector< Field, dimension > *normal_;
167 template<
class FaceTopology >
168 struct CreateFaceBasis
170 static TestFaceBasis *apply ( std::size_t
order ) {
return TestFaceBasisFactory::template create< FaceTopology >(
order ); }
173 std::vector< FaceStructure > faceStructure_;
175 unsigned int topologyId_, faceSize_;
189 template<
unsigned int dimension,
class F>
204 template<
class Function,
class Vector >
205 auto interpolate (
const Function &
function, Vector &coefficients )
const
206 -> std::enable_if_t< std::is_same< decltype(std::declval<Vector>().resize(1) ),
void >::
value,
void>
208 coefficients.resize(
size());
213 template<
class Basis,
class Matrix >
215 -> std::enable_if_t< std::is_same<
216 decltype(std::declval<Matrix>().rowPtr(0)),
typename Matrix::Field* >
::value,
void>
218 matrix.resize(
size(), basis.size() );
231 template <
class Topology>
236 builder_.template build<Topology>(order_);
238 size_ += dimension*builder_.
testBasis()->size();
239 for (
unsigned int f=0; f<builder_.
faceSize(); ++f )
247 unsigned int row = 0;
248 for (
unsigned int f=0; f<builder_.
faceSize(); ++f)
255 for (
unsigned int i=0; i<builder_.
testBasis()->
size()*dimension; ++i,++row)
257 assert( row ==
size() );
261 template<
class Func,
class Container,
bool type >
264 const Dune::GeometryType geoType( builder_.
topologyId(), dimension );
266 std::vector< Field > testBasisVal;
268 for (
unsigned int i=0; i<
size(); ++i)
269 for (
unsigned int j=0; j<func.size(); ++j)
272 unsigned int row = 0;
275 typedef Dune::QuadratureRule<
Field, dimension-1> FaceQuadrature;
276 typedef Dune::QuadratureRules<
Field, dimension-1> FaceQuadratureRules;
278 const auto &refElement = Dune::ReferenceElements< Field, dimension >::general( geoType );
280 for (
unsigned int f=0; f<builder_.
faceSize(); ++f)
286 const auto &geometry = refElement.template geometry< 1 >( f );
287 const Dune::GeometryType subGeoType( geometry.type().id(), dimension-1 );
288 const FaceQuadrature &faceQuad = FaceQuadratureRules::rule( subGeoType, 2*order_+2 );
290 const unsigned int quadratureSize = faceQuad.size();
291 for(
unsigned int qi = 0; qi < quadratureSize; ++qi )
294 builder_.
testFaceBasis(f)->template evaluate<0>(faceQuad[qi].position(),testBasisVal);
296 testBasisVal[0] = 1.;
297 fillBnd( row, testBasisVal,
298 func.evaluate( geometry.global( faceQuad[qi].position() ) ),
299 builder_.
normal(f), faceQuad[qi].weight(),
308 testBasisVal.resize(builder_.
testBasis()->size());
310 typedef Dune::QuadratureRule<Field, dimension> Quadrature;
311 typedef Dune::QuadratureRules<Field, dimension> QuadratureRules;
312 const Quadrature &elemQuad = QuadratureRules::rule( geoType, 2*order_+1 );
314 const unsigned int quadratureSize = elemQuad.size();
315 for(
unsigned int qi = 0; qi < quadratureSize; ++qi )
317 builder_.
testBasis()->template evaluate<0>(elemQuad[qi].position(),testBasisVal);
318 fillInterior( row, testBasisVal,
319 func.evaluate(elemQuad[qi].position()),
320 elemQuad[qi].weight(),
324 row += builder_.
testBasis()->size()*dimension;
331 template <
class MVal,
class RTVal,
class Matrix>
332 void fillBnd (
unsigned int startRow,
335 const FieldVector<Field,dimension> &normal,
337 Matrix &matrix)
const
339 const unsigned int endRow = startRow+mVal.size();
340 typename RTVal::const_iterator rtiter = rtVal.begin();
341 for (
unsigned int col = 0; col < rtVal.size() ; ++rtiter,++col)
343 Field cFactor = (*rtiter)*normal;
344 typename MVal::const_iterator miter = mVal.begin();
345 for (
unsigned int row = startRow;
346 row!=endRow; ++miter, ++row )
348 matrix.add(row,col, (weight*cFactor)*(*miter) );
350 assert( miter == mVal.end() );
353 template <
class MVal,
class RTVal,
class Matrix>
354 void fillInterior (
unsigned int startRow,
358 Matrix &matrix)
const
360 const unsigned int endRow = startRow+mVal.size()*dimension;
361 typename RTVal::const_iterator rtiter = rtVal.begin();
362 for (
unsigned int col = 0; col < rtVal.size() ; ++rtiter,++col)
364 typename MVal::const_iterator miter = mVal.begin();
365 for (
unsigned int row = startRow;
366 row!=endRow; ++miter,row+=dimension )
368 for (
unsigned int i=0; i<dimension; ++i)
370 matrix.add(row+i,col, (weight*(*miter))*(*rtiter)[i] );
373 assert( miter == mVal.end() );
382 template <
unsigned int dim,
class Field >
383 struct RaviartThomasL2InterpolationFactory
389 template <
class Topology>
392 if ( !supports<Topology>(key) )
395 interpol->template build<Topology>(key);
398 template<
class Topology >
408 #endif // #ifndef DUNE_LOCALFUNCTIONS_RAVIARTTHOMAS_RAVIARTTHOMASSIMPLEX_RAVIARTTHOMASSIMPLEXINTERPOLATION_HH
Definition: interpolationhelper.hh:19
void interpolate(typename Base::template Helper< Func, Container, type > &func) const
Definition: raviartthomassimplexinterpolation.hh:262
static void release(Object *object)
Definition: raviartthomassimplexinterpolation.hh:88
std::remove_const< Object >::type NonConstObject
Definition: raviartthomassimplexinterpolation.hh:388
std::size_t Key
Definition: raviartthomassimplexinterpolation.hh:68
Definition: interpolationhelper.hh:83
static const unsigned int dimension
Definition: raviartthomassimplexinterpolation.hh:105
static void release(Object *object)
Definition: raviartthomassimplexinterpolation.hh:403
Definition: bdfmcube.hh:15
const LocalKey & localKey(const unsigned int i) const
Definition: raviartthomassimplexinterpolation.hh:45
Definition: orthonormalbasis.hh:17
unsigned int faceSize() const
Definition: raviartthomassimplexinterpolation.hh:130
auto interpolate(const Function &function, Vector &coefficients) const -> std::enable_if_t< std::is_same< decltype(std::declval< Vector >().resize(1)), void >::value, void >
Definition: raviartthomassimplexinterpolation.hh:205
@ value
Definition: tensor.hh:166
An L2-based interpolation for Raviart Thomas.
Definition: raviartthomassimplexinterpolation.hh:190
static Object * create(const Key &key)
Definition: raviartthomassimplexinterpolation.hh:72
Definition: raviartthomassimplexinterpolation.hh:103
static void release(Object *object)
Definition: orthonormalbasis.hh:55
Definition: interpolationhelper.hh:22
RTL2InterpolationBuilder< dimension, Field > Builder
Definition: raviartthomassimplexinterpolation.hh:198
Definition: raviartthomassimplexinterpolation.hh:34
std::size_t size() const
Definition: raviartthomassimplexinterpolation.hh:227
OrthonormalBasisFactory< dimension, Field > TestBasisFactory
Definition: raviartthomassimplexinterpolation.hh:106
Definition: raviartthomassimplexinterpolation.hh:66
static Object * create(const Key &key)
Definition: raviartthomassimplexinterpolation.hh:390
TestBasisFactory::Object TestBasis
Definition: raviartthomassimplexinterpolation.hh:107
GeometryType type() const
Definition: raviartthomassimplexinterpolation.hh:126
const typedef RaviartThomasL2Interpolation< dim, Field > Object
Definition: raviartthomassimplexinterpolation.hh:386
void build(std::size_t order)
Definition: raviartthomassimplexinterpolation.hh:138
TestFaceBasis * testFaceBasis(unsigned int f) const
Definition: raviartthomassimplexinterpolation.hh:133
Definition: raviartthomassimplexinterpolation.hh:27
TestBasis * testBasis() const
Definition: raviartthomassimplexinterpolation.hh:132
std::size_t order() const
Definition: raviartthomassimplexinterpolation.hh:223
std::size_t order() const
Definition: raviartthomassimplexinterpolation.hh:128
FieldVector< Field, dimension > Normal
Definition: raviartthomassimplexinterpolation.hh:110
const typedef LocalCoefficientsContainer Object
Definition: raviartthomassimplexinterpolation.hh:69
OrthonormalBasisFactory< dimension-1, Field > TestFaceBasisFactory
Definition: raviartthomassimplexinterpolation.hh:108
std::size_t Key
Definition: raviartthomassimplexinterpolation.hh:387
static bool supports(const Key &key)
Definition: raviartthomassimplexinterpolation.hh:84
const Normal & normal(unsigned int f) const
Definition: raviartthomassimplexinterpolation.hh:135
RTL2InterpolationBuilder()=default
LocalCoefficientsContainer(const Setter &setter)
Definition: raviartthomassimplexinterpolation.hh:40
void setLocalKeys(std::vector< LocalKey > &keys) const
Definition: raviartthomassimplexinterpolation.hh:244
RTL2InterpolationBuilder< dim, Field > Builder
Definition: raviartthomassimplexinterpolation.hh:385
std::size_t size() const
Definition: raviartthomassimplexinterpolation.hh:51
~RTL2InterpolationBuilder()
Definition: raviartthomassimplexinterpolation.hh:117
TestFaceBasisFactory::Object TestFaceBasis
Definition: raviartthomassimplexinterpolation.hh:109
const typedef Basis Object
Definition: orthonormalbasis.hh:37
static bool supports(const Key &key)
Definition: raviartthomassimplexinterpolation.hh:399
void build(std::size_t order)
Definition: raviartthomassimplexinterpolation.hh:232
F Field
Definition: raviartthomassimplexinterpolation.hh:197
unsigned int topologyId() const
Definition: raviartthomassimplexinterpolation.hh:124
RaviartThomasL2Interpolation()
Definition: raviartthomassimplexinterpolation.hh:199
auto interpolate(const Basis &basis, Matrix &matrix) const -> std::enable_if_t< std::is_same< decltype(std::declval< Matrix >().rowPtr(0)), typename Matrix::Field * >::value, void >
Definition: raviartthomassimplexinterpolation.hh:214
Describe position of one degree of freedom.
Definition: localkey.hh:20