dune-fem  2.6-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  LocalFunctionConverter ( const HostLocalFunction &hostLocalFunction, const Converter &converter = Converter() )
103  : BaseType( hostLocalFunction ), converter_( converter )
104  {}
105 
106  LocalFunctionConverter ( HostLocalFunction &&hostLocalFunction, const Converter &converter = Converter() )
107  : BaseType( std::move( hostLocalFunction ) ), converter_( converter )
108  {}
109 
110  template< class Point >
111  void evaluate ( const Point &p, RangeType &ret ) const
112  {
113  HostRangeType hRet;
114  this->get().evaluate( p, hRet );
115  ret = converter_( hRet );
116  }
117 
118  template< class Point >
119  void jacobian ( const Point &p, JacobianRangeType &jac ) const
120  {
121  HostJacobianRangeType hJac;
122  this->get().jacobian( p, hJac );
123  jac = converter_( hJac );
124  }
125 
126  template< class Point >
127  void hessian ( const Point &p, HessianRangeType &hes ) const
128  {
129  HostHessianRangeType hHes;
130  this->get().hessian( p, hHes );
131  hes = converter_( hHes );
132  }
133 
134  template< class Quadrature, class ... Vectors >
135  void evaluateQuadrature ( const Quadrature &quad, Vectors& ... vector ) const
136  {
137  std::ignore = std::make_tuple(
138  ( evaluateQuadratureImp( quad, vector, vector[ 0 ] ), 1 )... );
139  }
140 
141  int order () const { return this->get().order(); }
142 
143  const EntityType &entity () const { return this->get().entity(); }
144 
145  void init ( const EntityType &entity ) { this->get().init( entity ); }
146 
147  protected:
148  template< class QuadratureType, class VectorType >
149  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const RangeType & ) const
150  {
151  const unsigned int nop = quadrature.nop();
152  for( unsigned int qp = 0; qp < nop; ++qp )
153  evaluate( quadrature[ qp ], values[ qp ] );
154  }
155 
156  template< class QuadratureType, class VectorType >
157  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const JacobianRangeType & ) const
158  {
159  const unsigned int nop = quadrature.nop();
160  for( unsigned int qp = 0; qp < nop; ++qp )
161  jacobian( quadrature[ qp ], values[ qp ] );
162  }
163 
164  template< class QuadratureType, class VectorType >
165  void evaluateQuadratureImp ( const QuadratureType &quadrature, VectorType &values, const HessianRangeType & ) const
166  {
167  const unsigned int nop = quadrature.nop();
168  for( unsigned int qp = 0; qp < nop; ++qp )
169  hessian( quadrature[ qp ], values[ qp ] );
170  }
171 
172  Converter converter_;
173  };
174 
175 
176 
177  // localFunctionConverter
178  // ----------------------
179 
180  template< class HostLocalFunction, class Converter >
182  localFunctionConverter ( HostLocalFunction hostLocalFunction, const Converter &converter = Converter() )
183  {
185  return LocalFunctionConverterType( std::move( hostLocalFunction ), converter );
186  }
187 
188  template< class HostLocalFunction, class Converter >
189  LocalFunctionConverter< typename std::remove_const< HostLocalFunction >::type, Converter, __InstationaryFunction::HoldReference >
190  localFunctionConverter ( std::reference_wrapper< HostLocalFunction > hostLocalFunction, const Converter &converter = Converter() )
191  {
192  typedef LocalFunctionConverter< typename std::remove_const< HostLocalFunction >::type, Converter, __InstationaryFunction::HoldReference > LocalFunctionConverterType;
193  return LocalFunctionConverterType( hostLocalFunction.get(), converter );
194  }
195 
196  } // namespace Fem
197 
198 } // namespace Dune
199 
200 #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:182
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:135
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: converter.hh:97
void init(const EntityType &entity)
Definition: converter.hh:145
HostLocalFunction::EntityType EntityType
Definition: converter.hh:90
int order() const
Definition: converter.hh:141
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const RangeType &) const
Definition: converter.hh:149
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const HessianRangeType &) const
Definition: converter.hh:165
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const JacobianRangeType &) const
Definition: converter.hh:157
void hessian(const Point &p, HessianRangeType &hes) const
Definition: converter.hh:127
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: converter.hh:95
const EntityType & entity() const
Definition: converter.hh:143
Converter converter_
Definition: converter.hh:172
FunctionSpaceType::HessianRangeType HessianRangeType
Definition: converter.hh:96
LocalFunctionConverter(HostLocalFunction &&hostLocalFunction, const Converter &converter=Converter())
Definition: converter.hh:106
void jacobian(const Point &p, JacobianRangeType &jac) const
Definition: converter.hh:119
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:102
void evaluate(const Point &p, RangeType &ret) const
Definition: converter.hh:111
actual interface class for quadratures
Definition: quadrature/quadrature.hh:366
convert functions space to space with new dim range
Definition: functionspace.hh:250