dune-grid
2.2.0
|
00001 #ifndef DUNE_ALU3DINCLUDE_HH 00002 #define DUNE_ALU3DINCLUDE_HH 00003 00005 // compile imp.cc into lib (1 yes, 0 no) 00006 // if you change this, you'll get what you deserve 00008 #define COMPILE_ALUGRID_LIB 0 00009 00010 #if COMPILE_ALUGRID_LIB 00011 #define COMPILE_ALUGRID_INLINE 0 00012 #else 00013 #define COMPILE_ALUGRID_INLINE 1 00014 #endif 00015 00016 #if COMPILE_ALUGRID_INLINE 00017 #define alu_inline inline 00018 #else 00019 #define alu_inline 00020 #endif 00021 00022 00023 // all methods and classes of the ALUGrid are defined in the namespace 00024 #define ALU3DSPACE ALUGridSpace :: 00025 00026 #include <dune/common/mpicollectivecommunication.hh> 00027 00028 #include <dune/grid/alugrid/common/checkparallel.hh> 00029 00030 // if MPI was found include all headers 00031 #if ALU3DGRID_PARALLEL 00032 #include <alugrid_parallel.h> 00033 #else 00034 // if not, include only headers for serial version 00035 #include <alugrid_serial.h> 00036 #endif 00037 00038 //- local includes 00039 #include <dune/grid/alugrid/3d/topology.hh> 00040 00041 namespace ALUGridSpace 00042 { 00043 00044 static const int ProcessorBoundary_t = Gitter::hbndseg_STI::closure; 00045 00046 // general GatherScatter type 00047 typedef GatherScatter GatherScatterType; 00048 00049 } 00050 00051 namespace Dune 00052 { 00053 00054 // typedef of ALU3dGridElementType see topology.hh 00055 00056 // i.e. double or float 00057 typedef double alu3d_ctype; 00058 00059 00060 00061 // ALU3dBasicImplTraits 00062 // -------------------- 00063 00064 template< class Comm > 00065 struct ALU3dBasicImplTraits; 00066 00067 template<> 00068 struct ALU3dBasicImplTraits< No_Comm > 00069 { 00070 typedef ALU3DSPACE Gitter GitterType; 00071 typedef ALU3DSPACE GitterDuneImpl GitterImplType; 00072 00073 typedef GitterType::helement_STI HElementType; // Interface Element 00074 typedef GitterType::hface_STI HFaceType; // Interface Face 00075 typedef GitterType::hedge_STI HEdgeType; // Interface Edge 00076 typedef GitterType::vertex_STI VertexType; // Interface Vertex 00077 typedef GitterType::hbndseg_STI HBndSegType; 00078 typedef GitterType::ghostpair_STI GhostPairType; 00079 00080 typedef HElementType PllElementType; 00081 00082 typedef GitterType::Geometric::hedge1_GEO GEOEdgeType; 00083 00085 template <class BndFaceType> 00086 static bool isGhost( const BndFaceType* ghost ) 00087 { 00088 return false ; 00089 } 00090 }; 00091 00092 #if ALU3DGRID_PARALLEL 00093 template<> 00094 struct ALU3dBasicImplTraits< MPI_Comm > 00095 { 00096 typedef ALU3DSPACE GitterDunePll GitterType; 00097 typedef ALU3DSPACE GitterDunePll GitterImplType; 00098 00099 typedef GitterType::helement_STI HElementType; // Interface Element 00100 typedef GitterType::hface_STI HFaceType; // Interface Face 00101 typedef GitterType::hedge_STI HEdgeType; // Interface Edge 00102 typedef GitterType::vertex_STI VertexType; // Interface Vertex 00103 typedef GitterType::hbndseg_STI HBndSegType; 00104 typedef GitterType::ghostpair_STI GhostPairType; 00105 00106 typedef ALU3DSPACE ElementPllXIF_t PllElementType; 00107 00108 typedef GitterType::Geometric::hedge1_GEO GEOEdgeType; 00109 00110 // method for ghost check 00111 template <class BndFaceType> 00112 static bool isGhost( const BndFaceType* ghost ) 00113 { 00114 return ( ghost != 0 ); 00115 } 00116 }; 00117 #endif // #if ALU3DGRID_PARALLEL 00118 00119 00120 00121 // ALU3dCodimImplTraits 00122 // -------------------- 00123 00124 template< ALU3dGridElementType elType, class Comm, int codim > 00125 struct ALU3dCodimImplTraits; 00126 00127 template< class Comm > 00128 struct ALU3dCodimImplTraits< tetra, Comm, 0 > 00129 { 00130 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00131 typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType; 00132 00133 typedef typename GitterType::helement_STI InterfaceType; 00134 typedef typename GitterType::Geometric::hasFace3 EntitySeedType; 00135 typedef typename GitterImplType::Objects::tetra_IMPL ImplementationType; 00136 typedef typename GitterType::hbndseg_STI GhostInterfaceType; 00137 typedef typename GitterImplType::Objects::Hbnd3Default GhostImplementationType; 00138 }; 00139 00140 template< class Comm > 00141 struct ALU3dCodimImplTraits< hexa, Comm, 0 > 00142 { 00143 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00144 typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType; 00145 00146 typedef typename GitterType::helement_STI InterfaceType; 00147 typedef typename GitterType::Geometric::hasFace4 EntitySeedType; 00148 typedef typename GitterImplType::Objects::hexa_IMPL ImplementationType; 00149 typedef typename GitterType::hbndseg_STI GhostInterfaceType; 00150 typedef typename GitterImplType::Objects::Hbnd4Default GhostImplementationType; 00151 }; 00152 00153 template< class Comm > 00154 struct ALU3dCodimImplTraits< tetra, Comm, 1 > 00155 { 00156 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00157 00158 typedef typename GitterType::hface_STI InterfaceType; 00159 typedef InterfaceType EntitySeedType; 00160 typedef typename GitterType::Geometric::hface3_GEO ImplementationType; 00161 }; 00162 00163 template< class Comm > 00164 struct ALU3dCodimImplTraits< hexa, Comm, 1 > 00165 { 00166 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00167 00168 typedef typename GitterType::hface_STI InterfaceType; 00169 typedef InterfaceType EntitySeedType; 00170 typedef typename GitterType::Geometric::hface4_GEO ImplementationType; 00171 }; 00172 00173 template< ALU3dGridElementType elType, class Comm > 00174 struct ALU3dCodimImplTraits< elType, Comm, 2 > 00175 { 00176 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00177 00178 typedef typename GitterType::hedge_STI InterfaceType; 00179 typedef InterfaceType EntitySeedType; 00180 typedef typename GitterType::Geometric::hedge1_GEO ImplementationType; 00181 }; 00182 00183 template< ALU3dGridElementType elType, class Comm > 00184 struct ALU3dCodimImplTraits< elType, Comm, 3 > 00185 { 00186 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00187 00188 typedef typename GitterType::vertex_STI InterfaceType; 00189 typedef InterfaceType EntitySeedType; 00190 typedef typename GitterType::Geometric::VertexGeo ImplementationType; 00191 }; 00192 00193 00194 00195 // ALU3dImplTraits 00196 // --------------- 00197 00198 template< ALU3dGridElementType elType, class Comm > 00199 struct ALU3dImplTraits; 00200 00201 template< class Comm > 00202 struct ALU3dImplTraits< tetra, Comm > 00203 : public ALU3dBasicImplTraits< Comm > 00204 { 00205 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00206 typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType; 00207 00208 typedef typename GitterType::Geometric::hface3_GEO GEOFaceType; 00209 typedef typename GitterType::Geometric::VertexGeo GEOVertexType; 00210 typedef typename GitterImplType::Objects::tetra_IMPL IMPLElementType; 00211 typedef typename GitterType::Geometric::tetra_GEO GEOElementType; 00212 typedef typename GitterType::Geometric::periodic3_GEO GEOPeriodicType; 00213 typedef typename GitterType::Geometric::hasFace3 HasFaceType; 00214 typedef typename GitterType::Geometric::Hface3Rule HfaceRuleType; 00215 typedef typename GitterImplType::Objects::Hbnd3Default BNDFaceType; 00216 typedef typename GitterImplType::Objects::hbndseg3_IMPL ImplBndFaceType; 00217 00218 typedef typename GitterType::Geometric::TetraRule MarkRuleType; 00219 00220 // refinement and coarsening enum 00221 enum { bisect_element_t = 00222 #ifdef ALUGRID_PERIODIC_BOUNDARY_PARALLEL 00223 MarkRuleType::bisect 00224 #else 00225 MarkRuleType::iso8 00226 #endif 00227 }; 00228 enum { refine_element_t = MarkRuleType::iso8 }; 00229 enum { coarse_element_t = MarkRuleType::crs }; 00230 enum { nosplit_element_t = MarkRuleType::nosplit }; 00231 00232 typedef std::pair< GEOFaceType *, int > NeighbourFaceType; 00233 typedef std::pair< HasFaceType *, int > NeighbourPairType; 00234 00235 template< int codim > 00236 struct Codim 00237 : public ALU3dCodimImplTraits< tetra, Comm, codim > 00238 {}; 00239 00240 // access of faces 00241 template <class Elem> 00242 static const GEOFaceType* getFace( const Elem& elem, const int aluFace ) 00243 { 00244 return elem.myhface3( aluFace ); 00245 } 00246 }; 00247 00248 template< class Comm > 00249 struct ALU3dImplTraits< hexa, Comm > 00250 : public ALU3dBasicImplTraits< Comm > 00251 { 00252 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00253 typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType; 00254 00255 typedef typename GitterType::Geometric::hface4_GEO GEOFaceType; 00256 typedef typename GitterType::Geometric::VertexGeo GEOVertexType; 00257 typedef typename GitterImplType::Objects::hexa_IMPL IMPLElementType; 00258 typedef typename GitterType::Geometric::hexa_GEO GEOElementType; 00259 typedef typename GitterType::Geometric::periodic4_GEO GEOPeriodicType; 00260 typedef typename GitterType::Geometric::hasFace4 HasFaceType; 00261 typedef typename GitterType::Geometric::Hface4Rule HfaceRuleType; 00262 typedef typename GitterImplType::Objects::Hbnd4Default BNDFaceType; 00263 typedef typename GitterImplType::Objects::hbndseg4_IMPL ImplBndFaceType; 00264 00265 typedef typename GitterType::Geometric::HexaRule MarkRuleType; 00266 00267 // refinement and coarsening enum 00268 enum { refine_element_t = MarkRuleType::iso8 }; 00269 enum { bisect_element_t = MarkRuleType::iso8 }; 00270 enum { coarse_element_t = MarkRuleType::crs }; 00271 enum { nosplit_element_t = MarkRuleType::nosplit }; 00272 00273 typedef std::pair< GEOFaceType *, int > NeighbourFaceType; 00274 typedef std::pair< HasFaceType *, int > NeighbourPairType; 00275 00276 template< int codim > 00277 struct Codim 00278 : public ALU3dCodimImplTraits< hexa, Comm, codim > 00279 {}; 00280 00281 // access of faces 00282 template <class Elem> 00283 static const GEOFaceType* getFace( const Elem& elem, const int aluFace ) 00284 { 00285 return elem.myhface4( aluFace ); 00286 } 00287 }; 00288 00289 00290 00293 template< class Comm > 00294 struct ALU3dGridVertexList 00295 { 00296 // level vertex iterator list 00297 typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType; 00298 typedef std::vector< VertexType * > VertexListType; 00299 typedef typename VertexListType::iterator IteratorType; 00300 00301 ALU3dGridVertexList () 00302 : up2Date_( false ) 00303 {} 00304 00305 size_t size () const { return vertexList_.size(); } 00306 00307 bool up2Date () const { return up2Date_; } 00308 void unsetUp2Date () { up2Date_ = false; } 00309 00310 // make grid walkthrough and calc global size 00311 template <class GridType> 00312 void setupVxList (const GridType & grid, int level); 00313 00314 IteratorType begin () { return vertexList_.begin(); } 00315 IteratorType end () { return vertexList_.end(); } 00316 00317 VertexListType & getItemList() { return vertexList_; } 00318 private: 00319 bool up2Date_; 00320 VertexListType vertexList_; 00321 }; 00322 00323 00326 template< class Comm > 00327 struct ALU3dGridLeafVertexList 00328 { 00329 // level vertex iterator list 00330 typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType; 00331 typedef std::pair< VertexType *, int > ItemType; 00332 typedef std::vector< ItemType > VertexListType; 00333 typedef typename VertexListType::iterator IteratorType; 00334 00335 ALU3dGridLeafVertexList () 00336 : up2Date_( false ) 00337 {} 00338 00339 size_t size () const { return vertexList_.size(); } 00340 00341 bool up2Date () const { return up2Date_; } 00342 void unsetUp2Date () { up2Date_ = false; } 00343 00344 // make grid walkthrough and calc global size 00345 template <class GridType> 00346 void setupVxList (const GridType & grid); 00347 00348 IteratorType begin () { return vertexList_.begin(); } 00349 IteratorType end () { return vertexList_.end(); } 00350 00351 VertexListType & getItemList() { return vertexList_; } 00352 00353 int getLevel ( const VertexType &vertex ) const 00354 { 00355 const int idx = vertex.getIndex(); 00356 assert( idx >= 0 ); 00357 assert( idx < (int)size()); 00358 const ItemType & p = vertexList_[idx]; 00359 if( p.first == 0 ) 00360 return vertex.level(); 00361 else 00362 return p.second; 00363 } 00364 private: 00365 bool up2Date_; 00366 VertexListType vertexList_; 00367 }; 00368 00369 00370 00371 class ALU3dGridItemList 00372 { 00373 public: 00374 // level vertex iterator list 00375 typedef std::vector < void * > ItemListType; 00376 typedef ItemListType :: iterator IteratorType; 00377 00378 ALU3dGridItemList () : up2Date_(false) {} 00379 00380 size_t size () const { return itemList_.size(); } 00381 00382 bool up2Date () const { return up2Date_; } 00383 void unsetUp2Date () { up2Date_ = false; } 00384 00385 void markAsUp2Date() { up2Date_ = true; } 00386 00387 IteratorType begin () { return itemList_.begin(); } 00388 IteratorType end () { return itemList_.end(); } 00389 00390 ItemListType & getItemList() { return itemList_; } 00391 00392 private: 00393 bool up2Date_; 00394 ItemListType itemList_; 00395 }; 00396 00397 typedef ALU3dGridItemList ALU3dGridItemListType; 00398 00400 // some helper functions 00402 00403 template< class Comm > 00404 struct ALU3dGridFaceGetter 00405 { 00406 static const typename ALU3dImplTraits< tetra, Comm >::GEOFaceType * 00407 getFace( const typename ALU3dImplTraits< tetra, Comm >::GEOElementType& elem, int index) 00408 { 00409 assert(index >= 0 && index < 4); 00410 return elem.myhface3( ElementTopologyMapping< tetra >::dune2aluFace(index) ); 00411 } 00412 00413 static const typename ALU3dImplTraits< hexa, Comm >::GEOFaceType* 00414 getFace( const typename ALU3dImplTraits< hexa, Comm >::GEOElementType &elem, int index ) 00415 { 00416 assert(index >= 0 && index < 6); 00417 return elem.myhface4( ElementTopologyMapping< hexa >::dune2aluFace(index) ); 00418 } 00419 }; 00420 00421 } // end namespace Dune 00422 00423 #endif // #ifndef DUNE_ALU3DINCLUDE_HH