dune-geometry  2.2.0
hybridmapping.hh
Go to the documentation of this file.
00001 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
00002 // vi: set et ts=8 sw=2 sts=2:
00003 #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH
00004 #define DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH
00005 
00006 #include <cstddef>
00007 
00008 #include <dune/common/typetraits.hh>
00009 
00010 #include <dune/geometry/genericgeometry/cachedmapping.hh>
00011 #include <dune/geometry/genericgeometry/geometrytraits.hh>
00012 #include <dune/geometry/genericgeometry/traceprovider.hh>
00013 
00014 namespace Dune
00015 {
00016 
00017   namespace GenericGeometry
00018   {
00019 
00020     // Internal Forward Declarations
00021     // -----------------------------
00022 
00023     template< unsigned int dim, class GeometryTraits >
00024     class HybridMapping;
00025 
00026     template< class Topology, class GeometryTraits >
00027     class VirtualMapping;
00028 
00029 
00030 
00031     // HybridMappingBase
00032     // -----------------
00033 
00035     template< unsigned int dim, class GeometryTraits, unsigned int codim = dim >
00036     class HybridMappingBase;
00037 
00038     template< unsigned int dim, class GeometryTraits, unsigned int codim >
00039     class HybridMappingBase
00040     : public virtual HybridMappingBase< dim, GeometryTraits, codim-1 >
00041     {
00042       typedef HybridMapping< dim, GeometryTraits > Mapping;
00043 
00044     public:
00045       virtual ~HybridMappingBase() {}
00046 
00047     protected:
00048       using HybridMappingBase< dim, GeometryTraits, codim-1 >::trace;
00049 
00050       virtual HybridMapping< dim - codim, GeometryTraits > *
00051       trace ( integral_constant< int, codim >, unsigned int i, char *mappingStorage ) const = 0;
00052     };
00053 
00054     template< unsigned int dim, class GeometryTraits >
00055     class HybridMappingBase< dim, GeometryTraits, 0 >
00056     {
00057       typedef HybridMapping< dim, GeometryTraits > Mapping;
00058 
00059     public:
00060       virtual ~HybridMappingBase() {}
00061 
00062     protected:
00063       virtual HybridMapping< dim, GeometryTraits > *
00064       trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const = 0;
00065     };
00070     // HybridMapping
00071     // -------------
00072 
00080     template< unsigned int dim, class GeometryTraits >
00081     class HybridMapping
00083     : public virtual HybridMappingBase< dim, GeometryTraits >
00085     {
00086       typedef HybridMapping< dim, GeometryTraits > This;
00087 
00088     protected:
00089       typedef MappingTraits< typename GeometryTraits::CoordTraits, dim, GeometryTraits::dimWorld > Traits;
00090 
00091     public:
00092       static const unsigned int dimension = Traits::dimension;
00093       static const unsigned int dimWorld = Traits::dimWorld;
00094       
00095       typedef typename Traits::FieldType FieldType;
00096       typedef typename Traits::LocalCoordinate LocalCoordinate;
00097       typedef typename Traits::GlobalCoordinate GlobalCoordinate;
00098 
00099       typedef CachedJacobianTransposed< dimension, GeometryTraits > JacobianTransposed;
00100       typedef CachedJacobianInverseTransposed< dimension, GeometryTraits > JacobianInverseTransposed;
00101 
00102       template< int codim >
00103       struct Codim
00104       {
00105         typedef HybridMapping< dimension - codim, GeometryTraits > Trace;
00106       };
00107 
00108       typedef typename GeometryTraits::Caching Caching;
00109       typedef typename GeometryTraits::UserData UserData;
00110 
00111       virtual ~HybridMapping ()
00112       {}
00113 
00115       virtual bool affine () const = 0;
00117       virtual Dune::GeometryType type () const = 0;
00118       unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
00119 
00121       virtual int numCorners () const = 0;
00123       virtual GlobalCoordinate corner ( int i ) const = 0;
00125       virtual GlobalCoordinate center () const = 0;
00126 
00133       virtual GlobalCoordinate global ( const LocalCoordinate &x ) const = 0;
00145       virtual LocalCoordinate local ( const GlobalCoordinate &y ) const = 0;
00146 
00154       virtual bool checkInside ( const LocalCoordinate &x ) const = 0;
00155 
00170       virtual FieldType integrationElement ( const LocalCoordinate &x ) const = 0;
00179       virtual FieldType volume () const = 0;
00180 
00190       virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &x ) const = 0;
00197       virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &x ) const = 0;
00198 
00199     protected:
00200       using HybridMappingBase< dim, GeometryTraits >::trace;
00201 
00202     public:
00203       virtual This *clone () const = 0;
00204       virtual This *clone ( char *mappingStorage ) const = 0;
00205 
00206       template< int codim >
00207       typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
00208       {
00209         integral_constant< int, codim > codimVariable;
00210         return trace( codimVariable, i, mappingStorage );
00211       }
00212 
00213       const UserData &userData () const { return userData_; }
00214       UserData &userData () { return userData_; }
00215 
00216     private:
00217       UserData userData_;
00218     };
00219 
00220 
00221 
00222     // VirtualMappingBase
00223     // ------------------
00224 
00226     template< class Topology, class GeometryTraits, unsigned int codim = Topology::dimension >
00227     class VirtualMappingBase;
00228 
00229     template< class Topology, class GeometryTraits, unsigned int codim >
00230     class VirtualMappingBase
00231     : public VirtualMappingBase< Topology, GeometryTraits, codim-1 >,
00232       public virtual HybridMappingBase< Topology::dimension, GeometryTraits, codim >
00233     {
00234       typedef GenericGeometry::VirtualMapping< Topology, GeometryTraits >
00235         VirtualMapping;
00236 
00237     protected:
00238       using VirtualMappingBase< Topology, GeometryTraits, codim-1 >::trace;
00239 
00240       virtual HybridMapping< Topology::dimension - codim, GeometryTraits > *
00241       trace ( integral_constant< int, codim >, unsigned int i, char *mappingStorage ) const
00242       {
00243         return static_cast< const VirtualMapping & >( *this ).template trace< codim >( i, mappingStorage );
00244       }
00245     };
00246 
00247     template< class Topology, class GeometryTraits >
00248     class VirtualMappingBase< Topology, GeometryTraits, 0 >
00249     : public virtual HybridMappingBase< Topology::dimension, GeometryTraits, 0 >
00250     {
00251       typedef GenericGeometry::VirtualMapping< Topology, GeometryTraits >
00252         VirtualMapping;
00253 
00254     protected:
00255       virtual HybridMapping< Topology::dimension, GeometryTraits > *
00256       trace ( integral_constant< int, 0 >, unsigned int i, char *mappingStorage ) const
00257       {
00258         return static_cast< const VirtualMapping & >( *this ).template trace< 0 >( i, mappingStorage );
00259       }
00260     };
00265     template< class Topology, class GeometryTraits >
00266     class VirtualMapping
00267     : public HybridMapping< Topology::dimension, GeometryTraits >,
00269       public VirtualMappingBase< Topology, GeometryTraits >
00271     {
00272       typedef HybridMapping< Topology::dimension, GeometryTraits > Base;
00273       typedef VirtualMapping< Topology, GeometryTraits > This;
00274 
00275       typedef typename Base::Traits Traits;
00276       
00277       typedef CachedMapping< Topology, GeometryTraits > Mapping;
00278 
00279     public:
00280       static const unsigned int dimension = Traits::dimension;
00281       static const unsigned int dimWorld = Traits::dimWorld;
00282       
00283       typedef typename Traits::FieldType FieldType;
00284       typedef typename Traits::LocalCoordinate LocalCoordinate;
00285       typedef typename Traits::GlobalCoordinate GlobalCoordinate;
00286 
00287       typedef typename Base::JacobianTransposed JacobianTransposed;
00288       typedef typename Base::JacobianInverseTransposed JacobianInverseTransposed;
00289 
00290       typedef typename Mapping::ReferenceElement ReferenceElement;
00291       
00292       template< unsigned int codim >
00293       struct Codim
00294       {
00295         typedef typename TraceProvider< Topology, GeometryTraits, codim, true >::Trace Trace;
00296       };
00297 
00298       typedef typename GeometryTraits::Caching Caching;
00299 
00300       template< class CoordVector >
00301       explicit VirtualMapping ( const CoordVector &coordVector )
00302       : mapping_( coordVector )
00303       {}
00304 
00305       virtual bool affine () const { return mapping_.affine(); }
00306       virtual Dune::GeometryType type () const { return mapping_.type(); }
00307 
00308       virtual int numCorners () const { return mapping_.numCorners(); }
00309       virtual GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
00310       virtual GlobalCoordinate center () const { return mapping_.center(); }
00311 
00312       virtual GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
00313       virtual LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
00314 
00315       virtual bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
00316 
00317       virtual FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
00318       virtual FieldType volume () const { return mapping_.volume(); }
00319 
00320       virtual const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
00321       virtual const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianInverseTransposed( local ); }
00322 
00323       virtual Base *clone () const { return new This( *this ); }
00324       virtual Base* clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
00325 
00326       template< int codim >
00327       typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
00328       {
00329         return TraceProvider< Topology, GeometryTraits, codim, true >::construct( mapping_.mapping(), i, mappingStorage );
00330       }
00331 
00332     protected:
00333       using VirtualMappingBase< Topology, GeometryTraits >::trace;
00334 
00335     private:
00336       Mapping mapping_;
00337     };
00338 
00339 
00340 
00341     // NonHybridMapping
00342     // ----------------
00343 
00351     template< class Topology, class GeometryTraits >
00352     class NonHybridMapping
00353     {
00354       typedef NonHybridMapping< Topology, GeometryTraits > This;
00355 
00356     protected:
00357       typedef MappingTraits< typename GeometryTraits::CoordTraits, Topology::dimension, GeometryTraits::dimWorld > Traits;
00358       
00359       typedef CachedMapping< Topology, GeometryTraits > Mapping;
00360 
00361     public:
00362       static const unsigned int dimension = Traits::dimension;
00363       static const unsigned int dimWorld = Traits::dimWorld;
00364       
00365       typedef typename Traits::FieldType FieldType;
00366       typedef typename Traits::LocalCoordinate LocalCoordinate;
00367       typedef typename Traits::GlobalCoordinate GlobalCoordinate;
00368 
00369       typedef CachedJacobianTransposed< dimension, GeometryTraits > JacobianTransposed;
00370       typedef CachedJacobianInverseTransposed< dimension, GeometryTraits > JacobianInverseTransposed;
00371 
00372       typedef typename Mapping::ReferenceElement ReferenceElement;
00373       
00374       template< unsigned int codim >
00375       struct Codim
00376       {
00377         typedef typename TraceProvider< Topology, GeometryTraits, codim, false >::Trace Trace;
00378       };
00379 
00380       typedef typename GeometryTraits::Caching Caching;
00381       typedef typename GeometryTraits::UserData UserData;
00382 
00383       template< class CoordVector >
00384       explicit NonHybridMapping ( const CoordVector &coordVector )
00385       : mapping_( coordVector )
00386       {}
00387 
00389       bool affine () const { return mapping_.affine(); }
00391       Dune::GeometryType type () const { return mapping_.type(); }
00392       unsigned int topologyId () const DUNE_DEPRECATED { return type().id(); }
00393 
00395       int numCorners () const { return mapping_.numCorners(); }
00397       GlobalCoordinate corner ( int i ) const { return mapping_.corner( i ); }
00399       GlobalCoordinate center () const { return mapping_.center(); }
00400 
00407       GlobalCoordinate global ( const LocalCoordinate &local ) const { return mapping_.global( local ); }
00419       LocalCoordinate local ( const GlobalCoordinate &global ) const { return mapping_.local( global ); }
00420 
00428       bool checkInside ( const LocalCoordinate &local ) const { return mapping_.checkInside( local ); }
00429 
00444       FieldType integrationElement ( const LocalCoordinate &local ) const { return mapping_.integrationElement( local ); }
00453       FieldType volume () const { return mapping_.volume(); }
00454 
00464       const JacobianTransposed &jacobianTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianTransposed( local ); }
00471       const JacobianInverseTransposed &jacobianInverseTransposed ( const LocalCoordinate &local ) const { return mapping_.jacobianInverseTransposed( local ); }
00472 
00473       This *clone () const { return new This( *this ); }
00474       This *clone ( char *mappingStorage ) const { return new( mappingStorage ) This( *this ); }
00475 
00476       template< int codim >
00477       typename Codim< codim >::Trace *trace ( unsigned int i, char *mappingStorage ) const
00478       {
00479         return TraceProvider< Topology, GeometryTraits, codim, false >::construct( mapping_.mapping(), i, mappingStorage );
00480       }
00481 
00482       const UserData &userData () const { return userData_; }
00483       UserData &userData () { return userData_; }
00484 
00485     private:
00486       UserData userData_;
00487       Mapping mapping_;
00488     };
00489 
00490   } // namespace GenericGeometry
00491   
00492 } // namespace Dune
00493 
00494 #endif // #ifndef DUNE_GEOMETRY_GENERICGEOMETRY_HYBRIDMAPPING_HH