dune-grid
2.1.1
|
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 { refine_element_t = MarkRuleType::iso8 }; 00222 enum { coarse_element_t = MarkRuleType::crs }; 00223 enum { nosplit_element_t = MarkRuleType::nosplit }; 00224 00225 typedef std::pair< GEOFaceType *, int > NeighbourFaceType; 00226 typedef std::pair< HasFaceType *, int > NeighbourPairType; 00227 00228 template< int codim > 00229 struct Codim 00230 : public ALU3dCodimImplTraits< tetra, Comm, codim > 00231 {}; 00232 00233 // access of faces 00234 template <class Elem> 00235 static const GEOFaceType* getFace( const Elem& elem, const int aluFace ) 00236 { 00237 return elem.myhface3( aluFace ); 00238 } 00239 }; 00240 00241 template< class Comm > 00242 struct ALU3dImplTraits< hexa, Comm > 00243 : public ALU3dBasicImplTraits< Comm > 00244 { 00245 typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType; 00246 typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType; 00247 00248 typedef typename GitterType::Geometric::hface4_GEO GEOFaceType; 00249 typedef typename GitterType::Geometric::VertexGeo GEOVertexType; 00250 typedef typename GitterImplType::Objects::hexa_IMPL IMPLElementType; 00251 typedef typename GitterType::Geometric::hexa_GEO GEOElementType; 00252 typedef typename GitterType::Geometric::periodic4_GEO GEOPeriodicType; 00253 typedef typename GitterType::Geometric::hasFace4 HasFaceType; 00254 typedef typename GitterType::Geometric::Hface4Rule HfaceRuleType; 00255 typedef typename GitterImplType::Objects::Hbnd4Default BNDFaceType; 00256 typedef typename GitterImplType::Objects::hbndseg4_IMPL ImplBndFaceType; 00257 00258 typedef typename GitterType::Geometric::HexaRule MarkRuleType; 00259 00260 // refinement and coarsening enum 00261 enum { refine_element_t = MarkRuleType::iso8 }; 00262 enum { coarse_element_t = MarkRuleType::crs }; 00263 enum { nosplit_element_t = MarkRuleType::nosplit }; 00264 00265 typedef std::pair< GEOFaceType *, int > NeighbourFaceType; 00266 typedef std::pair< HasFaceType *, int > NeighbourPairType; 00267 00268 template< int codim > 00269 struct Codim 00270 : public ALU3dCodimImplTraits< hexa, Comm, codim > 00271 {}; 00272 00273 // access of faces 00274 template <class Elem> 00275 static const GEOFaceType* getFace( const Elem& elem, const int aluFace ) 00276 { 00277 return elem.myhface4( aluFace ); 00278 } 00279 }; 00280 00281 00282 00285 template< class Comm > 00286 struct ALU3dGridVertexList 00287 { 00288 // level vertex iterator list 00289 typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType; 00290 typedef std::vector< VertexType * > VertexListType; 00291 typedef typename VertexListType::iterator IteratorType; 00292 00293 ALU3dGridVertexList () 00294 : up2Date_( false ) 00295 {} 00296 00297 size_t size () const { return vertexList_.size(); } 00298 00299 bool up2Date () const { return up2Date_; } 00300 void unsetUp2Date () { up2Date_ = false; } 00301 00302 // make grid walkthrough and calc global size 00303 template <class GridType> 00304 void setupVxList (const GridType & grid, int level); 00305 00306 IteratorType begin () { return vertexList_.begin(); } 00307 IteratorType end () { return vertexList_.end(); } 00308 00309 VertexListType & getItemList() { return vertexList_; } 00310 private: 00311 bool up2Date_; 00312 VertexListType vertexList_; 00313 }; 00314 00315 00318 template< class Comm > 00319 struct ALU3dGridLeafVertexList 00320 { 00321 // level vertex iterator list 00322 typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType; 00323 typedef std::pair< VertexType *, int > ItemType; 00324 typedef std::vector< ItemType > VertexListType; 00325 typedef typename VertexListType::iterator IteratorType; 00326 00327 ALU3dGridLeafVertexList () 00328 : up2Date_( false ) 00329 {} 00330 00331 size_t size () const { return vertexList_.size(); } 00332 00333 bool up2Date () const { return up2Date_; } 00334 void unsetUp2Date () { up2Date_ = false; } 00335 00336 // make grid walkthrough and calc global size 00337 template <class GridType> 00338 void setupVxList (const GridType & grid); 00339 00340 IteratorType begin () { return vertexList_.begin(); } 00341 IteratorType end () { return vertexList_.end(); } 00342 00343 VertexListType & getItemList() { return vertexList_; } 00344 00345 int getLevel ( const VertexType &vertex ) const 00346 { 00347 const int idx = vertex.getIndex(); 00348 assert( idx >= 0 ); 00349 assert( idx < (int)size()); 00350 const ItemType & p = vertexList_[idx]; 00351 if( p.first == 0 ) 00352 return vertex.level(); 00353 else 00354 return p.second; 00355 } 00356 private: 00357 bool up2Date_; 00358 VertexListType vertexList_; 00359 }; 00360 00361 00362 00363 class ALU3dGridItemList 00364 { 00365 public: 00366 // level vertex iterator list 00367 typedef std::vector < void * > ItemListType; 00368 typedef ItemListType :: iterator IteratorType; 00369 00370 ALU3dGridItemList () : up2Date_(false) {} 00371 00372 size_t size () const { return itemList_.size(); } 00373 00374 bool up2Date () const { return up2Date_; } 00375 void unsetUp2Date () { up2Date_ = false; } 00376 00377 void markAsUp2Date() { up2Date_ = true; } 00378 00379 IteratorType begin () { return itemList_.begin(); } 00380 IteratorType end () { return itemList_.end(); } 00381 00382 ItemListType & getItemList() { return itemList_; } 00383 00384 private: 00385 bool up2Date_; 00386 ItemListType itemList_; 00387 }; 00388 00389 typedef ALU3dGridItemList ALU3dGridItemListType; 00390 00392 // some helper functions 00394 00395 template< class Comm > 00396 struct ALU3dGridFaceGetter 00397 { 00398 static const typename ALU3dImplTraits< tetra, Comm >::GEOFaceType * 00399 getFace( const typename ALU3dImplTraits< tetra, Comm >::GEOElementType& elem, int index) 00400 { 00401 assert(index >= 0 && index < 4); 00402 return elem.myhface3( ElementTopologyMapping< tetra >::dune2aluFace(index) ); 00403 } 00404 00405 static const typename ALU3dImplTraits< hexa, Comm >::GEOFaceType* 00406 getFace( const typename ALU3dImplTraits< hexa, Comm >::GEOElementType &elem, int index ) 00407 { 00408 assert(index >= 0 && index < 6); 00409 return elem.myhface4( ElementTopologyMapping< hexa >::dune2aluFace(index) ); 00410 } 00411 }; 00412 00413 } // end namespace Dune 00414 00415 #endif // #ifndef DUNE_ALU3DINCLUDE_HH