dune-grid  2.2.0
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 { 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