dune-geometry  2.2.1
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, static_cast<unsigned int>(codim-1) >
41  {
42  typedef HybridMapping< dim, GeometryTraits > Mapping;
43 
44  public:
45  virtual ~HybridMappingBase() {}
46 
47  protected:
48  using HybridMappingBase< dim, GeometryTraits, static_cast<unsigned int>(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  };
66 
67  template< unsigned int dim, class GeometryTraits >
68  class HybridMappingBase< dim, GeometryTraits, static_cast<unsigned int>(-1) >
69  {
70  typedef HybridMapping< dim, GeometryTraits > Mapping;
71 
72  public:
73  virtual ~HybridMappingBase() {}
74 
75  protected:
76  virtual HybridMapping< dim, GeometryTraits > *
77  trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const = 0;
78  };
83  // HybridMapping
84  // -------------
85 
93  template< unsigned int dim, class GeometryTraits >
96  : public virtual HybridMappingBase< dim, GeometryTraits >
98  {
100 
101  protected:
103 
104  public:
105  static const unsigned int dimension = Traits::dimension;
106  static const unsigned int dimWorld = Traits::dimWorld;
107 
108  typedef typename Traits::FieldType FieldType;
111 
114 
115  template< int codim >
116  struct Codim
117  {
118  typedef HybridMapping< dimension - codim, GeometryTraits > Trace;
119  };
120 
121  typedef typename GeometryTraits::Caching Caching;
122  typedef typename GeometryTraits::UserData UserData;
123 
124  virtual ~HybridMapping ()
125  {}
126 
128  virtual bool affine () const = 0;
130  virtual Dune::GeometryType type () const = 0;
131  unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
132 
134  virtual int numCorners () const = 0;
136  virtual GlobalCoordinate corner ( int i ) const = 0;
138  virtual GlobalCoordinate center () const = 0;
139 
146  virtual GlobalCoordinate global ( const LocalCoordinate &x ) const = 0;
158  virtual LocalCoordinate local ( const GlobalCoordinate &y ) const = 0;
159 
167  virtual bool checkInside ( const LocalCoordinate &x ) const = 0;
168 
183  virtual FieldType integrationElement ( const LocalCoordinate &x ) const = 0;
192  virtual FieldType volume () const = 0;
193 
203  virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &x ) const = 0;
210  virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &x ) const = 0;
211 
212  protected:
213  using HybridMappingBase< dim, GeometryTraits >::trace;
214 
215  public:
216  virtual This *clone () const = 0;
217  virtual This *clone ( char *mappingStorage ) const = 0;
218 
219  template< int codim >
220  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
221  {
222  integral_constant< int, codim > codimVariable;
223  return trace( codimVariable, i, mappingStorage );
224  }
225 
226  const UserData &userData () const { return userData_; }
227  UserData &userData () { return userData_; }
228 
229  private:
230  UserData userData_;
231  };
232 
233 
234 
235  // VirtualMappingBase
236  // ------------------
237 
239  template< class Topology, class GeometryTraits, unsigned int codim = Topology::dimension >
240  class VirtualMappingBase;
241 
242  template< class Topology, class GeometryTraits, unsigned int codim >
243  class VirtualMappingBase
244  : public VirtualMappingBase< Topology, GeometryTraits, codim-1 >,
245  public virtual HybridMappingBase< Topology::dimension, GeometryTraits, codim >
246  {
248  VirtualMapping;
249 
250  protected:
251  using VirtualMappingBase< Topology, GeometryTraits, codim-1 >::trace;
252 
253  virtual HybridMapping< Topology::dimension - codim, GeometryTraits > *
254  trace ( integral_constant< int, codim >, unsigned int i, char *mappingStorage ) const
255  {
256  return static_cast< const VirtualMapping & >( *this ).template trace< codim >( i, mappingStorage );
257  }
258  };
259 
260  template< class Topology, class GeometryTraits >
261  class VirtualMappingBase< Topology, GeometryTraits, 0 >
262  : public virtual HybridMappingBase< Topology::dimension, GeometryTraits, 0 >
263  {
264  typedef GenericGeometry::VirtualMapping< Topology, GeometryTraits >
265  VirtualMapping;
266 
267  protected:
268  virtual HybridMapping< Topology::dimension, GeometryTraits > *
269  trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const
270  {
271  return static_cast< const VirtualMapping & >( *this ).template trace< 0 >( i, mappingStorage );
272  }
273  };
278  template< class Topology, class GeometryTraits >
280  : public HybridMapping< Topology::dimension, GeometryTraits >,
282  public VirtualMappingBase< Topology, GeometryTraits >
284  {
287 
288  typedef typename Base::Traits Traits;
289 
291 
292  public:
293  static const unsigned int dimension = Traits::dimension;
294  static const unsigned int dimWorld = Traits::dimWorld;
295 
296  typedef typename Traits::FieldType FieldType;
299 
302 
304 
305  template< unsigned int codim >
306  struct Codim
307  {
309  };
310 
311  typedef typename GeometryTraits::Caching Caching;
312 
313  template< class CoordVector >
314  explicit VirtualMapping ( const CoordVector &coordVector )
315  : mapping_( coordVector )
316  {}
317 
318  virtual bool affine () const { return mapping_.affine(); }
319  virtual Dune::GeometryType type () const { return mapping_.type(); }
320 
321  virtual int numCorners () const { return mapping_.numCorners(); }
322  virtual GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
323  virtual GlobalCoordinate center () const { return mapping_.center(); }
324 
325  virtual GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
326  virtual LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
327 
328  virtual bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
329 
330  virtual FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
331  virtual FieldType volume () const { return mapping_.volume(); }
332 
333  virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
334  virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianInverseTransposed( local ); }
335 
336  virtual Base *clone () const { return new This( *this ); }
337  virtual Base* clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
338 
339  template< int codim >
340  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
341  {
342  return TraceProvider< Topology, GeometryTraits, codim, true >::construct( mapping_.mapping(), i, mappingStorage );
343  }
344 
345  protected:
346  using VirtualMappingBase< Topology, GeometryTraits >::trace;
347 
348  private:
349  Mapping mapping_;
350  };
351 
352 
353 
354  // NonHybridMapping
355  // ----------------
356 
364  template< class Topology, class GeometryTraits >
366  {
368 
369  protected:
371 
373 
374  public:
375  static const unsigned int dimension = Traits::dimension;
376  static const unsigned int dimWorld = Traits::dimWorld;
377 
378  typedef typename Traits::FieldType FieldType;
381 
384 
386 
387  template< unsigned int codim >
388  struct Codim
389  {
391  };
392 
393  typedef typename GeometryTraits::Caching Caching;
394  typedef typename GeometryTraits::UserData UserData;
395 
396  template< class CoordVector >
397  explicit NonHybridMapping ( const CoordVector &coordVector )
398  : mapping_( coordVector )
399  {}
400 
402  bool affine () const { return mapping_.affine(); }
404  Dune::GeometryType type () const { return mapping_.type(); }
405  unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
406 
408  int numCorners () const { return mapping_.numCorners(); }
410  GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
412  GlobalCoordinate center () const { return mapping_.center(); }
413 
420  GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
432  LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
433 
441  bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
442 
457  FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
466  FieldType volume () const { return mapping_.volume(); }
467 
477  const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
485 
486  This *clone () const { return new This( *this ); }
487  This *clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
488 
489  template< int codim >
490  typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
491  {
492  return TraceProvider< Topology, GeometryTraits, codim, false >::construct( mapping_.mapping(), i, mappingStorage );
493  }
494 
495  const UserData &userData () const { return userData_; }
496  UserData &userData () { return userData_; }
497 
498  private:
499  UserData userData_;
500  Mapping mapping_;
501  };
502 
503  } // namespace GenericGeometry
504 
505 } // namespace Dune
506 
507 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH