dune-grid  2.1.1
alu3dinclude.hh
Go to the documentation of this file.
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