dune-localfunctions  2.2.1
localfiniteelement.hh
Go to the documentation of this file.
1 #ifndef DUNE_GENERIC_LOCALFINITEELEMENT_HH
2 #define DUNE_GENERIC_LOCALFINITEELEMENT_HH
3 
4 #include <dune/geometry/type.hh>
5 #include <dune/geometry/genericgeometry/conversion.hh>
6 
10 
11 namespace Dune
12 {
19  template< class BasisF, class CoeffF, class InterpolF>
21  {
23  typedef LocalFiniteElementTraits< typename BasisF::Object,
24  typename CoeffF::Object,
25  typename InterpolF::Object > Traits;
26 
27  typedef typename BasisF::Key Key;
28  static const unsigned int dimDomain = BasisF::dimension;
29 
30  typedef BasisF BasisFactory;
31  typedef CoeffF CoefficientFactory;
32  typedef InterpolF InterpolationFactory;
33 
34  dune_static_assert( (Conversion<Key,typename CoeffF::Key>::sameType),
35  "incompatible keys between BasisCreator and CoefficientsCreator" );
36  dune_static_assert( (Conversion<Key,typename InterpolF::Key>::sameType),
37  "incompatible keys between BasisCreator and InterpolationCreator" );
38 
40  GenericLocalFiniteElement ( unsigned int topologyId, const Key &key ) DUNE_DEPRECATED
41  : topologyId_( topologyId ),
42  key_( key ),
43  finiteElement_()
44  {
45  GenericGeometry::IfTopology< FiniteElement::template Maker, dimDomain >::apply( topologyId_, key_, finiteElement_ );
46  }
47 
49  GenericLocalFiniteElement ( const GeometryType &gt, const Key &key )
50  : topologyId_( gt.id() ),
51  key_( key ),
52  finiteElement_()
53  {
54  GenericGeometry::IfTopology< FiniteElement::template Maker, dimDomain >::apply( topologyId_, key_, finiteElement_ );
55  }
56 
59  : topologyId_( other.topologyId_ ),
60  key_( other.key_ ),
61  finiteElement_()
62  {
63  GenericGeometry::IfTopology< FiniteElement::template Maker, dimDomain >::apply( topologyId_, key_, finiteElement_ );
64  }
65 
67  {
68  finiteElement_.release();
69  }
70 
73  const typename Traits::LocalBasisType& localBasis () const
74  {
75  return *(finiteElement_.basis_);
76  }
77 
81  {
82  return *(finiteElement_.coeff_);
83  }
84 
88  {
89  return *(finiteElement_.interpol_);
90  }
91 
94  GeometryType type () const
95  {
96  return GeometryType(topologyId_,dimDomain);
97  /*
98  if ( GenericGeometry::hasGeometryType( topologyId_, dimDomain ) )
99  return GenericGeometry::geometryType( topologyId_, dimDomain );
100  return GeometryType();
101  */
102  }
103 
106  unsigned int topologyId () const
107  {
108  return topologyId_;
109  }
110  private:
111  struct FiniteElement
112  {
113  FiniteElement() : basis_(0), coeff_(0), interpol_(0) {}
114  template <class Topology>
115  void create( const Key &key )
116  {
117  release();
118  basis_ = BasisF::template create<Topology>(key);
119  coeff_ = CoeffF::template create<Topology>(key);
120  interpol_ = InterpolF::template create<Topology>(key);
121  }
122  void release()
123  {
124  if (basis_)
125  BasisF::release(basis_);
126  if (coeff_)
127  CoeffF::release(coeff_);
128  if (interpol_)
129  InterpolF::release(interpol_);
130  basis_=0;
131  coeff_=0;
132  interpol_=0;
133  }
134  template< class Topology >
135  struct Maker
136  {
137  static void apply ( const Key &key, FiniteElement &finiteElement )
138  {
139  finiteElement.template create<Topology>(key);
140  };
141  };
142  typename Traits::LocalBasisType *basis_;
143  typename Traits::LocalCoefficientsType *coeff_;
144  typename Traits::LocalInterpolationType *interpol_;
145  };
146  unsigned int topologyId_;
147  Key key_;
148  FiniteElement finiteElement_;
149  };
150 
157  template <class FE>
159  : public GenericLocalFiniteElement< typename FE::BasisFactory,
160  DGLocalCoefficientsFactory< typename FE::BasisFactory >,
161  typename FE::InterpolationFactory>
162  {
163  typedef GenericLocalFiniteElement< typename FE::BasisFactory,
165  typename FE::InterpolationFactory> Base;
166  public:
167  typedef typename Base::Traits Traits;
168 
171  DGLocalFiniteElement ( unsigned int topologyId, const typename Base::Key &key ) DUNE_DEPRECATED
172  : Base( topologyId, key )
173  {}
174 
177  DGLocalFiniteElement ( const GeometryType &gt, const typename Base::Key &key )
178  : Base( gt, key )
179  {}
180  };
188  template <class FE>
190  : public GenericLocalFiniteElement< typename FE::BasisFactory,
191  DGLocalCoefficientsFactory< typename FE::BasisFactory >,
192  LocalL2InterpolationFactory< typename FE::BasisFactory, false > >
193  {
194  typedef GenericLocalFiniteElement< typename FE::BasisFactory,
197  public:
198  typedef typename Base::Traits Traits;
199 
202  L2LocalFiniteElement ( unsigned int topologyId, const typename Base::Key &key ) DUNE_DEPRECATED
203  : Base( topologyId, key )
204  {}
205 
208  L2LocalFiniteElement ( const GeometryType &gt, const typename Base::Key &key )
209  : Base( gt, key )
210  {}
211  };
212 }
213 
214 #endif