dune-fem  2.8-git
converter.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_CONVERTER_HH
2 #define DUNE_FEM_FUNCTION_LOCALFUNCTION_CONVERTER_HH
3 
4 #include <functional>
5 #include <type_traits>
6 #include <utility>
7 
11 
12 
13 namespace Dune
14 {
15 
16  namespace Fem
17  {
18 
19  // LocalFunctionConverter
20  // --------------------
21 
71  template< class HostLocalFunction, class Converter, template< class > class Storage = __InstationaryFunction::HoldCopy >
73  : private Storage< HostLocalFunction >
74  {
76  typedef Storage< HostLocalFunction > BaseType;
77 
78  typedef typename HostLocalFunction::RangeType HostRangeType;
79  typedef typename HostLocalFunction::JacobianRangeType HostJacobianRangeType;
80  typedef typename HostLocalFunction::HessianRangeType HostHessianRangeType;
81 
82  public:
83  // obtain new dimRange from Converter
84  static const int dimRange = decltype( std::declval< Converter >() ( std::declval< HostRangeType >() ) ) ::dimension;
85 
86  // define new FunctionSpace
88 
89  // types from HostLocalFunction
90  typedef typename HostLocalFunction::EntityType EntityType;
91 
92  // types from FunctionSpace
93  typedef typename FunctionSpaceType::DomainType DomainType;
94  typedef typename FunctionSpaceType::RangeType RangeType;
95  typedef typename FunctionSpaceType::JacobianRangeType JacobianRangeType;
96  typedef typename FunctionSpaceType::HessianRangeType HessianRangeType;
97  typedef typename FunctionSpaceType::DomainFieldType DomainFieldType;
98  typedef typename FunctionSpaceType::RangeFieldType RangeFieldType;
99 
100  static const int dimDomain = FunctionSpaceType::dimDomain;
101 
102  struct Traits
103  {
104  typedef typename FunctionSpaceType::DomainType DomainType;
105  typedef typename FunctionSpaceType::RangeType RangeType;
106  typedef typename FunctionSpaceType::JacobianRangeType JacobianRangeType;
107  typedef typename FunctionSpaceType::HessianRangeType HessianRangeType;
108  typedef typename FunctionSpaceType::DomainFieldType DomainFieldType;
109  typedef typename FunctionSpaceType::RangeFieldType RangeFieldType;
110  };
111 
112  LocalFunctionConverter ( const HostLocalFunction &hostLocalFunction, const Converter &converter = Converter() )
113  : BaseType( hostLocalFunction ), converter_( converter )
114  {}
115 
116  LocalFunctionConverter ( HostLocalFunction &&hostLocalFunction, const Converter &converter = Converter() )
117  : BaseType( std::move( hostLocalFunction ) ), converter_( converter )
118  {}
119 
120  template< class Point >
121  void evaluate ( const Point &p, RangeType &ret ) const
122  {
123  HostRangeType hRet;
124  this->get().evaluate( p, hRet );
125  ret = converter_( hRet );
126  }
127  template< class Point >
128  RangeType operator()( const Point &p ) const
129  {
130  RangeType ret;
131  evaluate(p,ret);
132  return ret;
133  }
134 
135  template< class Point >
136  void jacobian ( const Point &p, JacobianRangeType &jac ) const
137  {
138  HostJacobianRangeType hJac;
139  this->get().jacobian( p, hJac );
140  jac = converter_( hJac );
141  }
142 
143  template< class Point >
144  void hessian ( const Point &p, HessianRangeType &hes ) const
145  {
146  HostHessianRangeType hHes;
147  this->get().hessian( p, hHes );
148  hes = converter_( hHes );
149  }
150 
151  template< class Quadrature, class ... Vectors >
152  void evaluateQuadrature ( const Quadrature &quad, Vectors& ... vector ) const
153  {
154  std::ignore = std::make_tuple(
155  ( evaluateQuadratureImp( quad, vector, vector[ 0 ] ), 1 )... );
156  }
157 
158  int order () const { return this->get().order(); }
159 
160  EntityType entity () const { return this->get().entity(); }
161 
162  void init ( const EntityType &entity ) { this->get().init( entity ); }
163 
164  protected:
165  template< class QuadratureType, class VectorType >
166  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const RangeType & ) const
167  {
168  const unsigned int nop = quadrature.nop();
169  for( unsigned int qp = 0; qp < nop; ++qp )
170  evaluate( quadrature[ qp ], values[ qp ] );
171  }
172 
173  template< class QuadratureType, class VectorType >
174  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const JacobianRangeType & ) const
175  {
176  const unsigned int nop = quadrature.nop();
177  for( unsigned int qp = 0; qp < nop; ++qp )
178  jacobian( quadrature[ qp ], values[ qp ] );
179  }
180 
181  template< class QuadratureType, class VectorType >
182  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const HessianRangeType & ) const
183  {
184  const unsigned int nop = quadrature.nop();
185  for( unsigned int qp = 0; qp < nop; ++qp )
186  hessian( quadrature[ qp ], values[ qp ] );
187  }
188 
189  Converter converter_;
190  };
191 
192 
193 
194  // localFunctionConverter
195  // ----------------------
196 
197  template< class HostLocalFunction, class Converter >
199  localFunctionConverter ( HostLocalFunction hostLocalFunction, const Converter &converter = Converter() )
200  {
202  return LocalFunctionConverterType( std::move( hostLocalFunction ), converter );
203  }
204 
205  template< class HostLocalFunction, class Converter >
206  LocalFunctionConverter< typename std::remove_const< HostLocalFunction >::type, Converter, __InstationaryFunction::HoldReference >
207  localFunctionConverter ( std::reference_wrapper< HostLocalFunction > hostLocalFunction, const Converter &converter = Converter() )
208  {
209  typedef LocalFunctionConverter< typename std::remove_const< HostLocalFunction >::type, Converter, __InstationaryFunction::HoldReference > LocalFunctionConverterType;
210  return LocalFunctionConverterType( hostLocalFunction.get(), converter );
211  }
212 
213  } // namespace Fem
214 
215 } // namespace Dune
216 
217 #endif // #ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_CONVERTER_HH
Definition: bindguard.hh:11
std::tuple_element< i, Tuple >::type & get(Dune::TypeIndexedTuple< Tuple, Types > &tuple)
Definition: typeindexedtuple.hh:122
LocalFunctionConverter< HostLocalFunction, Converter, __InstationaryFunction::HoldCopy > localFunctionConverter(HostLocalFunction hostLocalFunction, const Converter &converter=Converter())
Definition: converter.hh:199
implementation of a Dune::Fem::LocalFunction on a FunctionSpace V restircted/prolongated from an othe...
Definition: converter.hh:74
static const int dimRange
Definition: converter.hh:84
FunctionSpaceType::RangeType RangeType
Definition: converter.hh:94
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: converter.hh:98
FunctionSpaceType::DomainType DomainType
Definition: converter.hh:93
void evaluateQuadrature(const Quadrature &quad, Vectors &... vector) const
Definition: converter.hh:152
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: converter.hh:97
void init(const EntityType &entity)
Definition: converter.hh:162
HostLocalFunction::EntityType EntityType
Definition: converter.hh:90
int order() const
Definition: converter.hh:158
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const RangeType &) const
Definition: converter.hh:166
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const HessianRangeType &) const
Definition: converter.hh:182
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const JacobianRangeType &) const
Definition: converter.hh:174
void hessian(const Point &p, HessianRangeType &hes) const
Definition: converter.hh:144
EntityType entity() const
Definition: converter.hh:160
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: converter.hh:95
RangeType operator()(const Point &p) const
Definition: converter.hh:128
Converter converter_
Definition: converter.hh:189
FunctionSpaceType::HessianRangeType HessianRangeType
Definition: converter.hh:96
LocalFunctionConverter(HostLocalFunction &&hostLocalFunction, const Converter &converter=Converter())
Definition: converter.hh:116
void jacobian(const Point &p, JacobianRangeType &jac) const
Definition: converter.hh:136
static const int dimDomain
Definition: converter.hh:100
ToNewDimRangeFunctionSpace< typename HostLocalFunction::FunctionSpaceType, dimRange >::Type FunctionSpaceType
Definition: converter.hh:87
LocalFunctionConverter(const HostLocalFunction &hostLocalFunction, const Converter &converter=Converter())
Definition: converter.hh:112
void evaluate(const Point &p, RangeType &ret) const
Definition: converter.hh:121
Definition: converter.hh:103
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: converter.hh:108
FunctionSpaceType::DomainType DomainType
Definition: converter.hh:104
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: converter.hh:109
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: converter.hh:106
FunctionSpaceType::HessianRangeType HessianRangeType
Definition: converter.hh:107
FunctionSpaceType::RangeType RangeType
Definition: converter.hh:105
actual interface class for quadratures
Definition: quadrature.hh:405
convert functions space to space with new dim range
Definition: functionspace.hh:250