dune-geometry  2.2.0
hybridmapping.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH
4 #define DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH
5 
6 #include <cstddef>
7 
8 #include <dune/common/typetraits.hh>
9 
13 
14 namespace Dune
15 {
16 
17  namespace GenericGeometry
18  {
19 
20  // Internal Forward Declarations
21  // -----------------------------
22 
23  template< unsigned int dim, class GeometryTraits >
24  class HybridMapping;
25 
26  template< class Topology, class GeometryTraits >
27  class VirtualMapping;
28 
29 
30 
31  // HybridMappingBase
32  // -----------------
33 
35  template< unsigned int dim, class GeometryTraits, unsigned int codim = dim >
36  class HybridMappingBase;
37 
38  template< unsigned int dim, class GeometryTraits, unsigned int codim >
39  class HybridMappingBase
40  : public virtual HybridMappingBase< dim, GeometryTraits, codim-1 >
41  {
42  typedef HybridMapping< dim, GeometryTraits > Mapping;
43 
44  public:
45  virtual ~HybridMappingBase() {}
46 
47  protected:
48  using HybridMappingBase< dim, GeometryTraits, codim-1 >::trace;
49 
50  virtual HybridMapping< dim - codim, GeometryTraits > *
51  trace ( integral_constant< int, codim >, unsigned int i, char *mappingStorage ) const = 0;
52  };
53 
54  template< unsigned int dim, class GeometryTraits >
55  class HybridMappingBase< dim, GeometryTraits, 0 >
56  {
57  typedef HybridMapping< dim, GeometryTraits > Mapping;
58 
59  public:
60  virtual ~HybridMappingBase() {}
61 
62  protected:
63  virtual HybridMapping< dim, GeometryTraits > *
64  trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const = 0;
65  };
70  // HybridMapping
71  // -------------
72 
80  template< unsigned int dim, class GeometryTraits >
83  : public virtual HybridMappingBase< dim, GeometryTraits >
85  {
87 
88  protected:
90 
91  public:
92  static const unsigned int dimension = Traits::dimension;
93  static const unsigned int dimWorld = Traits::dimWorld;
94 
95  typedef typename Traits::FieldType FieldType;
98 
101 
102  template< int codim >
103  struct Codim
104  {
105  typedef HybridMapping< dimension - codim, GeometryTraits > Trace;
106  };
107 
108  typedef typename GeometryTraits::Caching Caching;
109  typedef typename GeometryTraits::UserData UserData;
110 
111  virtual ~HybridMapping ()
112  {}
113 
115  virtual bool affine () const = 0;
117  virtual Dune::GeometryType type () const = 0;
118  unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
119 
121  virtual int numCorners () const = 0;
123  virtual GlobalCoordinate corner ( int i ) const = 0;
125  virtual GlobalCoordinate center () const = 0;
126 
133  virtual GlobalCoordinate global ( const LocalCoordinate &x ) const = 0;
145  virtual LocalCoordinate local ( const GlobalCoordinate &y ) const = 0;
146 
154  virtual bool checkInside ( const LocalCoordinate &x ) const = 0;
155 
170  virtual FieldType integrationElement ( const LocalCoordinate &x ) const = 0;
179  virtual FieldType volume () const = 0;
180 
190  virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &x ) const = 0;
197  virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &x ) const = 0;
198 
199  protected:
200  using HybridMappingBase< dim, GeometryTraits >::trace;
201 
202  public:
203  virtual This *clone () const = 0;
204  virtual This *clone ( char *mappingStorage ) const = 0;
205 
206  template< int codim >
207  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
208  {
209  integral_constant< int, codim > codimVariable;
210  return trace( codimVariable, i, mappingStorage );
211  }
212 
213  const UserData &userData () const { return userData_; }
214  UserData &userData () { return userData_; }
215 
216  private:
217  UserData userData_;
218  };
219 
220 
221 
222  // VirtualMappingBase
223  // ------------------
224 
226  template< class Topology, class GeometryTraits, unsigned int codim = Topology::dimension >
227  class VirtualMappingBase;
228 
229  template< class Topology, class GeometryTraits, unsigned int codim >
230  class VirtualMappingBase
231  : public VirtualMappingBase< Topology, GeometryTraits, codim-1 >,
232  public virtual HybridMappingBase< Topology::dimension, GeometryTraits, codim >
233  {
235  VirtualMapping;
236 
237  protected:
238  using VirtualMappingBase< Topology, GeometryTraits, codim-1 >::trace;
239 
240  virtual HybridMapping< Topology::dimension - codim, GeometryTraits > *
241  trace ( integral_constant< int, codim >, unsigned int i, char *mappingStorage ) const
242  {
243  return static_cast< const VirtualMapping & >( *this ).template trace< codim >( i, mappingStorage );
244  }
245  };
246 
247  template< class Topology, class GeometryTraits >
248  class VirtualMappingBase< Topology, GeometryTraits, 0 >
249  : public virtual HybridMappingBase< Topology::dimension, GeometryTraits, 0 >
250  {
251  typedef GenericGeometry::VirtualMapping< Topology, GeometryTraits >
252  VirtualMapping;
253 
254  protected:
255  virtual HybridMapping< Topology::dimension, GeometryTraits > *
256  trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const
257  {
258  return static_cast< const VirtualMapping & >( *this ).template trace< 0 >( i, mappingStorage );
259  }
260  };
265  template< class Topology, class GeometryTraits >
267  : public HybridMapping< Topology::dimension, GeometryTraits >,
269  public VirtualMappingBase< Topology, GeometryTraits >
271  {
274 
275  typedef typename Base::Traits Traits;
276 
278 
279  public:
280  static const unsigned int dimension = Traits::dimension;
281  static const unsigned int dimWorld = Traits::dimWorld;
282 
283  typedef typename Traits::FieldType FieldType;
286 
289 
291 
292  template< unsigned int codim >
293  struct Codim
294  {
296  };
297 
298  typedef typename GeometryTraits::Caching Caching;
299 
300  template< class CoordVector >
301  explicit VirtualMapping ( const CoordVector &coordVector )
302  : mapping_( coordVector )
303  {}
304 
305  virtual bool affine () const { return mapping_.affine(); }
306  virtual Dune::GeometryType type () const { return mapping_.type(); }
307 
308  virtual int numCorners () const { return mapping_.numCorners(); }
309  virtual GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
310  virtual GlobalCoordinate center () const { return mapping_.center(); }
311 
312  virtual GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
313  virtual LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
314 
315  virtual bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
316 
317  virtual FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
318  virtual FieldType volume () const { return mapping_.volume(); }
319 
320  virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
321  virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianInverseTransposed( local ); }
322 
323  virtual Base *clone () const { return new This( *this ); }
324  virtual Base* clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
325 
326  template< int codim >
327  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
328  {
329  return TraceProvider< Topology, GeometryTraits, codim, true >::construct( mapping_.mapping(), i, mappingStorage );
330  }
331 
332  protected:
333  using VirtualMappingBase< Topology, GeometryTraits >::trace;
334 
335  private:
336  Mapping mapping_;
337  };
338 
339 
340 
341  // NonHybridMapping
342  // ----------------
343 
351  template< class Topology, class GeometryTraits >
353  {
355 
356  protected:
358 
360 
361  public:
362  static const unsigned int dimension = Traits::dimension;
363  static const unsigned int dimWorld = Traits::dimWorld;
364 
365  typedef typename Traits::FieldType FieldType;
368 
371 
373 
374  template< unsigned int codim >
375  struct Codim
376  {
378  };
379 
380  typedef typename GeometryTraits::Caching Caching;
381  typedef typename GeometryTraits::UserData UserData;
382 
383  template< class CoordVector >
384  explicit NonHybridMapping ( const CoordVector &coordVector )
385  : mapping_( coordVector )
386  {}
387 
389  bool affine () const { return mapping_.affine(); }
391  Dune::GeometryType type () const { return mapping_.type(); }
392  unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
393 
395  int numCorners () const { return mapping_.numCorners(); }
397  GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
399  GlobalCoordinate center () const { return mapping_.center(); }
400 
407  GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
419  LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
420 
428  bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
429 
444  FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
453  FieldType volume () const { return mapping_.volume(); }
454 
464  const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
472 
473  This *clone () const { return new This( *this ); }
474  This *clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
475 
476  template< int codim >
477  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
478  {
479  return TraceProvider< Topology, GeometryTraits, codim, false >::construct( mapping_.mapping(), i, mappingStorage );
480  }
481 
482  const UserData &userData () const { return userData_; }
483  UserData &userData () { return userData_; }
484 
485  private:
486  UserData userData_;
487  Mapping mapping_;
488  };
489 
490  } // namespace GenericGeometry
491 
492 } // namespace Dune
493 
494 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH