dune-localfunctions  2.6-git
virtualwrappers.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_LOCALFUNCTIONS_COMMON_VIRTUALWRAPPERS_HH
4 #define DUNE_LOCALFUNCTIONS_COMMON_VIRTUALWRAPPERS_HH
5 
6 #include <array>
7 
8 #include <dune/common/function.hh>
9 
13 
14 namespace Dune
15 {
16 
17  // forward declaration needed by friend declarations
18  template<class Imp>
20 
21  // default clone method is the copy constructor
22  template<class Imp, bool IsInterface>
24  {
25  static Imp* clone(const Imp& imp)
26  {
27  return new Imp(imp);
28  }
29  };
30 
31  // if FE derives from virtual interface the clone method is used
32  template<class Imp>
33  struct LocalFiniteElementCloneFactoryHelper<Imp, true>
34  {
35  static Imp* clone(const Imp& imp)
36  {
37  return imp.clone();
38  }
39  };
40 
41  // factory template to clone and create an objects
42  template<class Imp>
44  {
46 
47  static Imp* clone(const Imp& imp)
48  {
50  }
51 
52  static Imp* create()
53  {
54  return new Imp;
55  }
56  };
57 
58 
59 
60  // -----------------------------------------------------------------
61  // Basis
62  // -----------------------------------------------------------------
63 
64 
65 
72  template<class T , class Imp>
74  : public LocalBasisVirtualInterface<T>
75  {
76  template<class FEImp>
78 
79  protected:
80 
82  LocalBasisVirtualImp( const Imp &imp )
83  : impl_(imp)
84  {}
85 
86  public:
87  using Traits = T;
88 
90  unsigned int size () const
91  {
92  return impl_.size();
93  }
94 
96  unsigned int order () const
97  {
98  return impl_.order();
99  }
100 
102  inline void evaluateFunction (const typename Traits::DomainType& in,
103  std::vector<typename Traits::RangeType>& out) const
104  {
105  impl_.evaluateFunction(in,out);
106  }
107 
109  inline void evaluateJacobian(
110  const typename Traits::DomainType& in,
111  std::vector<typename Traits::JacobianType>& out) const
112  {
113  impl_.evaluateJacobian(in,out);
114  }
115 
121  void partial(const std::array<unsigned int,Traits::dimDomain>& order,
122  const typename Traits::DomainType& in,
123  std::vector<typename Traits::RangeType>& out) const
124  {
125  impl_.partial(order,in,out);
126  }
127 
128  protected:
129  const Imp& impl_;
130  };
131 
132 
133 
134  // -----------------------------------------------------------------
135  // Interpolation
136  // -----------------------------------------------------------------
137 
146  template<class DomainType, class RangeType, class Imp>
148  : public LocalInterpolationVirtualInterface< DomainType, RangeType >
149  {
150  template<class FEImp>
152 
154 
155  protected:
156 
159  : impl_(imp) {}
160 
161  public:
162 
164 
166 
168  virtual void interpolate (const FunctionType& f, std::vector<CoefficientType>& out) const
169  {
170  impl_.interpolate(f,out);
171  }
172 
173  protected:
174  const Imp& impl_;
175 
176  };
177 
178 
179 
180  // -----------------------------------------------------------------
181  // Coefficients
182  // -----------------------------------------------------------------
183 
190  template<class Imp>
193  {
194  template<class FEImp>
196 
197  protected:
198 
200  LocalCoefficientsVirtualImp( const Imp &imp )
201  : impl_(imp)
202  {}
203 
204  public:
205 
207  std::size_t size () const
208  {
209  return impl_.size();
210  }
211 
213  const LocalKey& localKey (std::size_t i) const
214  {
215  return impl_.localKey(i);
216  }
217 
218  protected:
219  const Imp& impl_;
220 
221  };
222 
223 
224 
225  // -----------------------------------------------------------------
226  // Finite Element
227  // -----------------------------------------------------------------
228 
237  template<class Imp>
239  : public LocalFiniteElementVirtualInterface<typename Imp::Traits::LocalBasisType::Traits>
240  {
241  using LocalBasisTraits = typename Imp::Traits::LocalBasisType::Traits;
243 
244  public:
245  typedef typename Interface::Traits Traits;
246 
253  {}
254 
257  : impl_(LocalFiniteElementCloneFactory<Imp>::create()),
261  {}
262 
269  {}
270 
272  {
273  delete impl_;
274  }
275 
277  const typename Traits::LocalBasisType& localBasis () const
278  {
279  return localBasisImp_;
280  }
281 
284  {
285  return localCoefficientsImp_;
286  }
287 
290  {
291  return localInterpolationImp_;
292  }
293 
295  unsigned int size () const
296  {
297  return impl_->size();
298  }
299 
301  const GeometryType type () const
302  {
303  return impl_->type();
304  }
305 
312  {
313  return new LocalFiniteElementVirtualImp<Imp>(*this);
314  }
315 
316  protected:
317  const Imp* impl_;
318 
323  typename Imp::Traits::LocalInterpolationType> localInterpolationImp_;
324  };
325 }
326 #endif
Dune::LocalFiniteElementVirtualImp::LocalFiniteElementVirtualImp
LocalFiniteElementVirtualImp(const LocalFiniteElementVirtualImp &other)
Copy contructor needed for deep copy.
Definition: virtualwrappers.hh:264
Dune::LocalFiniteElementVirtualImp::clone
virtual LocalFiniteElementVirtualImp< Imp > * clone() const
clone this wrapper
Definition: virtualwrappers.hh:311
virtualinterface.hh
Dune::LocalInterpolationVirtualInterface
virtual base class for a local interpolation
Definition: virtualinterface.hh:22
localbasis.hh
Dune::LocalFiniteElementVirtualImp::~LocalFiniteElementVirtualImp
~LocalFiniteElementVirtualImp()
Definition: virtualwrappers.hh:271
Dune::LocalInterpolationVirtualInterface< typename LocalBasisTraits::DomainType, typename LocalBasisTraits::RangeType >::FunctionType
Dune::VirtualFunction< typename LocalBasisTraits::DomainType, typename LocalBasisTraits::RangeType > FunctionType
type of virtual function to interpolate
Definition: virtualinterface.hh:166
Dune::LocalBasisVirtualImp::LocalBasisVirtualImp
LocalBasisVirtualImp(const Imp &imp)
constructor taking an implementation of the interface
Definition: virtualwrappers.hh:82
Dune::LocalFiniteElementVirtualImp::localCoefficientsImp_
const LocalCoefficientsVirtualImp< typename Imp::Traits::LocalCoefficientsType > localCoefficientsImp_
Definition: virtualwrappers.hh:320
Dune::LocalBasisVirtualImp
class for wrapping a basis using the virtual interface
Definition: virtualwrappers.hh:73
Dune::LocalFiniteElementTraits
traits helper struct
Definition: localfiniteelementtraits.hh:10
Dune::LocalInterpolationVirtualImp::interpolate
virtual void interpolate(const FunctionType &f, std::vector< CoefficientType > &out) const
determine coefficients interpolating a given function
Definition: virtualwrappers.hh:168
Dune::LocalFiniteElementTraits::LocalInterpolationType
LI LocalInterpolationType
Definition: localfiniteelementtraits.hh:22
localkey.hh
Dune::LocalFiniteElementVirtualImp::LocalFiniteElementVirtualImp
LocalFiniteElementVirtualImp()
Default constructor. Assumes that the implementation class is default constructible as well.
Definition: virtualwrappers.hh:256
Dune::LocalFiniteElementVirtualInterface
virtual base class for local finite elements with functions
Definition: virtualinterface.hh:265
Dune::LocalBasisVirtualImp::partial
void partial(const std::array< unsigned int, Traits::dimDomain > &order, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate partial derivatives of any order of all shape functions.
Definition: virtualwrappers.hh:121
Dune::LocalFiniteElementCloneFactory::clone
static Imp * clone(const Imp &imp)
Definition: virtualwrappers.hh:47
Dune::LocalFiniteElementVirtualImp::size
unsigned int size() const
Number of shape functions in this finite element.
Definition: virtualwrappers.hh:295
Dune::LocalFiniteElementVirtualImp::type
const GeometryType type() const
Definition: virtualwrappers.hh:301
Dune::LocalFiniteElementCloneFactory::Interface
LocalFiniteElementVirtualInterface< typename Imp::Traits::LocalBasisType::Traits > Interface
Definition: virtualwrappers.hh:45
Dune::LocalFiniteElementCloneFactoryHelper
Definition: virtualwrappers.hh:23
Dune::LocalInterpolationVirtualImp::FunctionType
Base::FunctionType FunctionType
Definition: virtualwrappers.hh:163
Dune::LocalFiniteElementVirtualImp::localBasis
const Traits::LocalBasisType & localBasis() const
Definition: virtualwrappers.hh:277
Dune::LocalCoefficientsVirtualImp::size
std::size_t size() const
number of coefficients
Definition: virtualwrappers.hh:207
Dune::LocalFiniteElementVirtualImp::localBasisImp_
const LocalBasisVirtualImp< LocalBasisTraits, typename Imp::Traits::LocalBasisType > localBasisImp_
Definition: virtualwrappers.hh:319
Dune::LocalBasisVirtualImp::evaluateJacobian
void evaluateJacobian(const typename Traits::DomainType &in, std::vector< typename Traits::JacobianType > &out) const
Evaluate jacobian of all shape functions at given position.
Definition: virtualwrappers.hh:109
Dune::LocalBasisTraits::DomainType
D DomainType
domain type
Definition: localbasis.hh:43
Dune::LocalFiniteElementTraits::LocalCoefficientsType
LC LocalCoefficientsType
Definition: localfiniteelementtraits.hh:18
Dune::LocalInterpolationVirtualImp
class for wrapping a local interpolation using the virtual interface
Definition: virtualwrappers.hh:147
Dune::LocalInterpolationVirtualImp::LocalInterpolationVirtualImp
LocalInterpolationVirtualImp(const Imp &imp)
constructor taking an implementation of the Dune::LocalInterpolationVirtualInterface
Definition: virtualwrappers.hh:158
Dune::LocalInterpolationVirtualImp::impl_
const Imp & impl_
Definition: virtualwrappers.hh:174
Dune::LocalFiniteElementCloneFactoryHelper::clone
static Imp * clone(const Imp &imp)
Definition: virtualwrappers.hh:25
Dune::LocalFiniteElementCloneFactory
Definition: virtualwrappers.hh:43
Dune::LocalBasisVirtualImp::order
unsigned int order() const
Polynomial order of the shape functions.
Definition: virtualwrappers.hh:96
Dune::LocalFiniteElementVirtualImp
class for wrapping a finite element using the virtual interface
Definition: virtualwrappers.hh:19
Dune::LocalFiniteElementVirtualImp::LocalFiniteElementVirtualImp
LocalFiniteElementVirtualImp(const Imp &imp)
taking a LocalFiniteElementVirtualInterface implementation
Definition: virtualwrappers.hh:248
Dune::LocalInterpolationVirtualInterface< typename LocalBasisTraits::DomainType, typename LocalBasisTraits::RangeType >::CoefficientType
typename LocalBasisTraits::RangeType ::field_type CoefficientType
type of the coefficient vector in the interpolate method
Definition: virtualinterface.hh:169
Dune::LocalFiniteElementVirtualImp::localInterpolationImp_
const LocalInterpolationVirtualImp< typename LocalBasisTraits::DomainType, typename LocalBasisTraits::RangeType, typename Imp::Traits::LocalInterpolationType > localInterpolationImp_
Definition: virtualwrappers.hh:323
Dune::LocalCoefficientsVirtualInterface
virtual base class for local coefficients
Definition: virtualinterface.hh:238
Dune::LocalBasisVirtualInterface
virtual base class for a local basis
Definition: virtualinterface.hh:68
Dune::LocalBasisTraits
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:31
Dune::LocalCoefficientsVirtualImp::localKey
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition: virtualwrappers.hh:213
Dune::LocalFiniteElementVirtualImp::localInterpolation
const Traits::LocalInterpolationType & localInterpolation() const
Definition: virtualwrappers.hh:289
Dune::LocalBasisVirtualImp::evaluateFunction
void evaluateFunction(const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all basis function at given position.
Definition: virtualwrappers.hh:102
Dune::LocalFiniteElementVirtualImp::localCoefficients
const Traits::LocalCoefficientsType & localCoefficients() const
Definition: virtualwrappers.hh:283
Dune::LocalBasisVirtualImp::impl_
const Imp & impl_
Definition: virtualwrappers.hh:129
Dune::LocalBasisVirtualImp::size
unsigned int size() const
Number of shape functions.
Definition: virtualwrappers.hh:90
Dune::LocalBasisTraits::RangeType
R RangeType
range type
Definition: localbasis.hh:55
Dune::LocalKey
Describe position of one degree of freedom.
Definition: localkey.hh:20
Dune::LocalCoefficientsVirtualImp::impl_
const Imp & impl_
Definition: virtualwrappers.hh:219
Dune::LocalFiniteElementCloneFactory::create
static Imp * create()
Definition: virtualwrappers.hh:52
Dune::LocalFiniteElementVirtualImp::impl_
const Imp * impl_
Definition: virtualwrappers.hh:317
Dune::LocalFiniteElementTraits::LocalBasisType
LB LocalBasisType
Definition: localfiniteelementtraits.hh:14
Dune
Definition: brezzidouglasmarini1cube2dlocalbasis.hh:15
Dune::LocalCoefficientsVirtualImp
class for wrapping local coefficients using the virtual interface
Definition: virtualwrappers.hh:191
Dune::LocalFiniteElementVirtualImp::Traits
Interface::Traits Traits
Definition: virtualwrappers.hh:245
Dune::LocalCoefficientsVirtualImp::LocalCoefficientsVirtualImp
LocalCoefficientsVirtualImp(const Imp &imp)
constructor taking an implementation of the Dune::LocalCoefficientsVirtualInterface
Definition: virtualwrappers.hh:200
Dune::LocalInterpolationVirtualImp::CoefficientType
Base::CoefficientType CoefficientType
Definition: virtualwrappers.hh:165