dune-fem 2.8.0
Loading...
Searching...
No Matches
average.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_AVERAGE_HH
2#define DUNE_FEM_FUNCTION_LOCALFUNCTION_AVERAGE_HH
3
9
10namespace Dune
11{
12
13 namespace Fem
14 {
15
16 // Internal forward declaration
17 // ----------------------------
18
19 template< class LocalFunction, class GridPart >
20 class LocalAverage;
21
22
23
24 // LocalAverageHelper
25 // ------------------
26
28 {
29 template< class LocalFunction, class Quadrature >
31 const typename LocalFunction::EntityType::Geometry &geometry,
32 const Quadrature &quadrature,
33 typename LocalFunction::RangeType &value )
34 {
35 typedef typename LocalFunction::RangeType RangeType;
36 typedef typename RangeType::value_type RangeFieldType;
37
38 value = RangeType( 0 );
39 RangeFieldType volume( 0 );
40 const int nop = quadrature.nop();
41 for( int qp = 0; qp < nop; ++qp )
42 {
43 RangeType tmp;
44 localFunction.evaluate( quadrature[ qp ], tmp );
45 RangeFieldType weight = quadrature.weight( qp )*geometry.integrationElement( quadrature.point( qp ) );
46 volume += weight;
47 value.axpy( weight, tmp );
48 }
49 value /= volume;
50 }
51 };
52
53
54
55 // LocalAverageImpl
56 // ----------------
57
58 template< class LocalFunction, class GridPart, class DiscreteFunctionSpace >
60 {
61 static void apply ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average )
62 {
63 // get entity
64 typedef typename LocalFunction::EntityType EntityType;
65 const EntityType &entity = localFunction.entity();
66
67 // create quadrature
69 QuadratureType quadrature( entity, localFunction.order() );
70 LocalAverageHelper::applyQuadrature( localFunction, entity.geometry(), quadrature, average );
71 }
72 };
73
74
75
76 // LocalAverageImpl for DiscontinuousGalerkinSpace
77 // -----------------------------------------------
78
79 template< class LocalFunction, class GridPart, class FunctionSpace, int order, class Storage >
80 class LocalAverageImpl< LocalFunction, GridPart, DiscontinuousGalerkinSpace< FunctionSpace, GridPart, order, Storage > >
81 {
82 static const bool cartesian = GridPartCapabilities::isCartesian< GridPart >::v;
83
84 static void applyAffine ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average )
85 {
86 // otherwise use direct computation
87 const int dimRange = LocalFunction::dimRange;
88 for( int i = 0; i < dimRange; ++i )
89 average[ i ] = localFunction[ i ];
90
91 const typename LocalFunction::BasisFunctionSetType &basisFunctionSet = localFunction.basisFunctionSet();
92 average /= std::sqrt( basisFunctionSet.referenceElement().volume() );
93 }
94
95 public:
96 static void apply ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average )
97 {
98 if( cartesian )
99 return applyAffine( localFunction, average );
100
101 // get entity and geometry
102 typedef typename LocalFunction::EntityType EntityType;
103 const EntityType &entity = localFunction.entity();
104 const typename EntityType::Geometry geometry = entity.geometry();
105
106 if( geometry.affine() )
107 return applyAffine( localFunction, average );
108
109 // for not affine elements, use quadrature
111 QuadratureType quadrature( entity, localFunction.order() );
112 LocalAverageHelper::applyQuadrature( localFunction, geometry, quadrature, average );
113 }
114 };
115
116
117
118 // LocalAverageImpl for FiniteVolumeSpace
119 // --------------------------------------
120
121 template< class LocalFunction, class GridPart, class FunctionSpace, int codim, class Storage >
122 class LocalAverageImpl< LocalFunction, GridPart, FiniteVolumeSpace< FunctionSpace, GridPart, codim, Storage > >
123 {
124 public:
125 static void apply ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average )
126 {
127 localFunction.evaluate( typename LocalFunction::DomainType( 0 ), average );
128 }
129 };
130
131
132
133 // LocalAverage
134 // ------------
135
136 template< class LocalFunction, class GridPart >
138 {
139 typedef typename ExportsDiscreteFunctionSpaceType< LocalFunction >::Type DiscreteFunctionSpaceType;
141
142 public:
143 static void apply ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average )
144 {
145 Impl::apply( localFunction, average );
146 }
147
148 void operator() ( const LocalFunction &localFunction, typename LocalFunction::RangeType &average ) const
149 {
150 Impl::apply( localFunction, average );
151 }
152 };
153
154 } // namespace Fem
155
156} // namespace Dune
157
158#endif // #ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_AVERAGE_HH
double sqrt(const Dune::Fem::Double &v)
Definition: double.hh:977
Definition: bindguard.hh:11
static GridFunctionView< GF > localFunction(const GF &gf)
Definition: gridfunctionview.hh:118
Definition: average.hh:138
static void apply(const LocalFunction &localFunction, typename LocalFunction::RangeType &average)
Definition: average.hh:143
void operator()(const LocalFunction &localFunction, typename LocalFunction::RangeType &average) const
Definition: average.hh:148
Definition: average.hh:28
static void applyQuadrature(const LocalFunction &localFunction, const typename LocalFunction::EntityType::Geometry &geometry, const Quadrature &quadrature, typename LocalFunction::RangeType &value)
Definition: average.hh:30
Definition: average.hh:60
static void apply(const LocalFunction &localFunction, typename LocalFunction::RangeType &average)
Definition: average.hh:61
static void apply(const LocalFunction &localFunction, typename LocalFunction::RangeType &average)
Definition: average.hh:96
static void apply(const LocalFunction &localFunction, typename LocalFunction::RangeType &average)
Definition: average.hh:125
interface for local functions
Definition: localfunction.hh:77
FunctionSpaceType::DomainType DomainType
type of domain vectors, i.e., type of coordinates
Definition: localfunction.hh:105
FunctionSpaceType::RangeType RangeType
type of range vectors, i.e., type of function values
Definition: localfunction.hh:107
static const int dimRange
dimension of the range
Definition: localfunction.hh:119
BasisFunctionSetType::EntityType EntityType
type of the entity, the local function lives on is given by the space
Definition: localfunction.hh:95
specialize with 'true' if the grid part is cartesian (default=false)
Definition: gridpart/common/capabilities.hh:40
quadrature class supporting base function caching
Definition: cachingquadrature.hh:41
int nop() const
obtain the number of integration points
Definition: quadrature.hh:295
const CoordinateType & point(size_t i) const
obtain coordinates of i-th integration point
Definition: quadrature.hh:311
actual interface class for quadratures
Definition: quadrature.hh:405
const FieldType & weight(size_t i) const
obtain weight of i-th integration point
Definition: quadrature.hh:527
Interface class for basis function sets.
Definition: basisfunctionset/basisfunctionset.hh:31
const ReferenceElementType & referenceElement() const
return reference element
GetDiscreteFunctionSpaceType< T, v >::Type Type
Definition: discretefunctionspace.hh:85
A vector valued function space.
Definition: functionspace.hh:60
Definition: discontinuousgalerkin/space.hh:96
Definition: finitevolume/space.hh:63