dune-geometry
2.2.0
|
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