dune-grid  2.2.1
alu3dinclude.hh
Go to the documentation of this file.
1 #ifndef DUNE_ALU3DINCLUDE_HH
2 #define DUNE_ALU3DINCLUDE_HH
3 
5 // compile imp.cc into lib (1 yes, 0 no)
6 // if you change this, you'll get what you deserve
8 #define COMPILE_ALUGRID_LIB 0
9 
10 #if COMPILE_ALUGRID_LIB
11  #define COMPILE_ALUGRID_INLINE 0
12 #else
13  #define COMPILE_ALUGRID_INLINE 1
14 #endif
15 
16 #if COMPILE_ALUGRID_INLINE
17 #define alu_inline inline
18 #else
19 #define alu_inline
20 #endif
21 
22 
23 // all methods and classes of the ALUGrid are defined in the namespace
24 #define ALU3DSPACE ALUGridSpace ::
25 
26 #include <dune/common/mpicollectivecommunication.hh>
27 
29 
30 // if MPI was found include all headers
31 #if ALU3DGRID_PARALLEL
32 #include <alugrid_parallel.h>
33 #else
34 // if not, include only headers for serial version
35 #include <alugrid_serial.h>
36 #endif
37 
38 //- local includes
40 
41 namespace ALUGridSpace
42 {
43 
44  static const int ProcessorBoundary_t = Gitter::hbndseg_STI::closure;
45 
46  // general GatherScatter type
47  typedef GatherScatter GatherScatterType;
48 
49 }
50 
51 namespace Dune
52 {
53 
54  // typedef of ALU3dGridElementType see topology.hh
55 
56  // i.e. double or float
57  typedef double alu3d_ctype;
58 
59 
60 
61  // ALU3dBasicImplTraits
62  // --------------------
63 
64  template< class Comm >
65  struct ALU3dBasicImplTraits;
66 
67  template<>
68  struct ALU3dBasicImplTraits< No_Comm >
69  {
70  typedef ALU3DSPACE Gitter GitterType;
71  typedef ALU3DSPACE GitterDuneImpl GitterImplType;
72 
73  typedef GitterType::helement_STI HElementType; // Interface Element
74  typedef GitterType::hface_STI HFaceType; // Interface Face
75  typedef GitterType::hedge_STI HEdgeType; // Interface Edge
76  typedef GitterType::vertex_STI VertexType; // Interface Vertex
77  typedef GitterType::hbndseg_STI HBndSegType;
78  typedef GitterType::ghostpair_STI GhostPairType;
79 
81 
82  typedef GitterType::Geometric::hedge1_GEO GEOEdgeType;
83 
85  template <class BndFaceType>
86  static bool isGhost( const BndFaceType* ghost )
87  {
88  return false ;
89  }
90  };
91 
92 #if ALU3DGRID_PARALLEL
93  template<>
94  struct ALU3dBasicImplTraits< MPI_Comm >
95  {
96  typedef ALU3DSPACE GitterDunePll GitterType;
97  typedef ALU3DSPACE GitterDunePll GitterImplType;
98 
99  typedef GitterType::helement_STI HElementType; // Interface Element
100  typedef GitterType::hface_STI HFaceType; // Interface Face
101  typedef GitterType::hedge_STI HEdgeType; // Interface Edge
102  typedef GitterType::vertex_STI VertexType; // Interface Vertex
103  typedef GitterType::hbndseg_STI HBndSegType;
104  typedef GitterType::ghostpair_STI GhostPairType;
105 
106  typedef ALU3DSPACE ElementPllXIF_t PllElementType;
107 
108  typedef GitterType::Geometric::hedge1_GEO GEOEdgeType;
109 
110  // method for ghost check
111  template <class BndFaceType>
112  static bool isGhost( const BndFaceType* ghost )
113  {
114  return ( ghost != 0 );
115  }
116  };
117 #endif // #if ALU3DGRID_PARALLEL
118 
119 
120 
121  // ALU3dCodimImplTraits
122  // --------------------
123 
124  template< ALU3dGridElementType elType, class Comm, int codim >
125  struct ALU3dCodimImplTraits;
126 
127  template< class Comm >
128  struct ALU3dCodimImplTraits< tetra, Comm, 0 >
129  {
130  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
131  typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType;
132 
133  typedef typename GitterType::helement_STI InterfaceType;
134  typedef typename GitterType::Geometric::hasFace3 EntitySeedType;
135  typedef typename GitterImplType::Objects::tetra_IMPL ImplementationType;
136  typedef typename GitterType::hbndseg_STI GhostInterfaceType;
137  typedef typename GitterImplType::Objects::Hbnd3Default GhostImplementationType;
138  };
139 
140  template< class Comm >
141  struct ALU3dCodimImplTraits< hexa, Comm, 0 >
142  {
143  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
144  typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType;
145 
146  typedef typename GitterType::helement_STI InterfaceType;
147  typedef typename GitterType::Geometric::hasFace4 EntitySeedType;
148  typedef typename GitterImplType::Objects::hexa_IMPL ImplementationType;
149  typedef typename GitterType::hbndseg_STI GhostInterfaceType;
150  typedef typename GitterImplType::Objects::Hbnd4Default GhostImplementationType;
151  };
152 
153  template< class Comm >
154  struct ALU3dCodimImplTraits< tetra, Comm, 1 >
155  {
156  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
157 
158  typedef typename GitterType::hface_STI InterfaceType;
160  typedef typename GitterType::Geometric::hface3_GEO ImplementationType;
161  };
162 
163  template< class Comm >
164  struct ALU3dCodimImplTraits< hexa, Comm, 1 >
165  {
166  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
167 
168  typedef typename GitterType::hface_STI InterfaceType;
170  typedef typename GitterType::Geometric::hface4_GEO ImplementationType;
171  };
172 
173  template< ALU3dGridElementType elType, class Comm >
174  struct ALU3dCodimImplTraits< elType, Comm, 2 >
175  {
176  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
177 
178  typedef typename GitterType::hedge_STI InterfaceType;
180  typedef typename GitterType::Geometric::hedge1_GEO ImplementationType;
181  };
182 
183  template< ALU3dGridElementType elType, class Comm >
184  struct ALU3dCodimImplTraits< elType, Comm, 3 >
185  {
186  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
187 
188  typedef typename GitterType::vertex_STI InterfaceType;
190  typedef typename GitterType::Geometric::VertexGeo ImplementationType;
191  };
192 
193 
194 
195  // ALU3dImplTraits
196  // ---------------
197 
198  template< ALU3dGridElementType elType, class Comm >
199  struct ALU3dImplTraits;
200 
201  template< class Comm >
202  struct ALU3dImplTraits< tetra, Comm >
203  : public ALU3dBasicImplTraits< Comm >
204  {
205  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
206  typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType;
207 
208  typedef typename GitterType::Geometric::hface3_GEO GEOFaceType;
209  typedef typename GitterType::Geometric::VertexGeo GEOVertexType;
210  typedef typename GitterImplType::Objects::tetra_IMPL IMPLElementType;
211  typedef typename GitterType::Geometric::tetra_GEO GEOElementType;
212  typedef typename GitterType::Geometric::periodic3_GEO GEOPeriodicType;
213  typedef typename GitterType::Geometric::hasFace3 HasFaceType;
214  typedef typename GitterType::Geometric::Hface3Rule HfaceRuleType;
215  typedef typename GitterImplType::Objects::Hbnd3Default BNDFaceType;
216  typedef typename GitterImplType::Objects::hbndseg3_IMPL ImplBndFaceType;
217 
218  typedef typename GitterType::Geometric::TetraRule MarkRuleType;
219 
220  // refinement and coarsening enum
221  enum { bisect_element_t =
222 #ifdef ALUGRID_PERIODIC_BOUNDARY_PARALLEL
223  MarkRuleType::bisect
224 #else
225  MarkRuleType::iso8
226 #endif
227  };
228  enum { refine_element_t = MarkRuleType::iso8 };
229  enum { coarse_element_t = MarkRuleType::crs };
230  enum { nosplit_element_t = MarkRuleType::nosplit };
231 
232  typedef std::pair< GEOFaceType *, int > NeighbourFaceType;
233  typedef std::pair< HasFaceType *, int > NeighbourPairType;
234 
235  template< int codim >
236  struct Codim
237  : public ALU3dCodimImplTraits< tetra, Comm, codim >
238  {};
239 
240  // access of faces
241  template <class Elem>
242  static const GEOFaceType* getFace( const Elem& elem, const int aluFace )
243  {
244  return elem.myhface3( aluFace );
245  }
246  };
247 
248  template< class Comm >
249  struct ALU3dImplTraits< hexa, Comm >
250  : public ALU3dBasicImplTraits< Comm >
251  {
252  typedef typename ALU3dBasicImplTraits< Comm >::GitterType GitterType;
253  typedef typename ALU3dBasicImplTraits< Comm >::GitterImplType GitterImplType;
254 
255  typedef typename GitterType::Geometric::hface4_GEO GEOFaceType;
256  typedef typename GitterType::Geometric::VertexGeo GEOVertexType;
257  typedef typename GitterImplType::Objects::hexa_IMPL IMPLElementType;
258  typedef typename GitterType::Geometric::hexa_GEO GEOElementType;
259  typedef typename GitterType::Geometric::periodic4_GEO GEOPeriodicType;
260  typedef typename GitterType::Geometric::hasFace4 HasFaceType;
261  typedef typename GitterType::Geometric::Hface4Rule HfaceRuleType;
262  typedef typename GitterImplType::Objects::Hbnd4Default BNDFaceType;
263  typedef typename GitterImplType::Objects::hbndseg4_IMPL ImplBndFaceType;
264 
265  typedef typename GitterType::Geometric::HexaRule MarkRuleType;
266 
267  // refinement and coarsening enum
268  enum { refine_element_t = MarkRuleType::iso8 };
269  enum { bisect_element_t = MarkRuleType::iso8 };
270  enum { coarse_element_t = MarkRuleType::crs };
271  enum { nosplit_element_t = MarkRuleType::nosplit };
272 
273  typedef std::pair< GEOFaceType *, int > NeighbourFaceType;
274  typedef std::pair< HasFaceType *, int > NeighbourPairType;
275 
276  template< int codim >
277  struct Codim
278  : public ALU3dCodimImplTraits< hexa, Comm, codim >
279  {};
280 
281  // access of faces
282  template <class Elem>
283  static const GEOFaceType* getFace( const Elem& elem, const int aluFace )
284  {
285  return elem.myhface4( aluFace );
286  }
287  };
288 
289 
290 
293  template< class Comm >
295  {
296  // level vertex iterator list
297  typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType;
298  typedef std::vector< VertexType * > VertexListType;
299  typedef typename VertexListType::iterator IteratorType;
300 
302  : up2Date_( false )
303  {}
304 
305  size_t size () const { return vertexList_.size(); }
306 
307  bool up2Date () const { return up2Date_; }
308  void unsetUp2Date () { up2Date_ = false; }
309 
310  // make grid walkthrough and calc global size
311  template <class GridType>
312  void setupVxList (const GridType & grid, int level);
313 
314  IteratorType begin () { return vertexList_.begin(); }
315  IteratorType end () { return vertexList_.end(); }
316 
317  VertexListType & getItemList() { return vertexList_; }
318  private:
319  bool up2Date_;
320  VertexListType vertexList_;
321  };
322 
323 
326  template< class Comm >
328  {
329  // level vertex iterator list
330  typedef typename ALU3dBasicImplTraits< Comm >::VertexType VertexType;
331  typedef std::pair< VertexType *, int > ItemType;
332  typedef std::vector< ItemType > VertexListType;
333  typedef typename VertexListType::iterator IteratorType;
334 
336  : up2Date_( false )
337  {}
338 
339  size_t size () const { return vertexList_.size(); }
340 
341  bool up2Date () const { return up2Date_; }
342  void unsetUp2Date () { up2Date_ = false; }
343 
344  // make grid walkthrough and calc global size
345  template <class GridType>
346  void setupVxList (const GridType & grid);
347 
348  IteratorType begin () { return vertexList_.begin(); }
349  IteratorType end () { return vertexList_.end(); }
350 
351  VertexListType & getItemList() { return vertexList_; }
352 
353  int getLevel ( const VertexType &vertex ) const
354  {
355  const int idx = vertex.getIndex();
356  assert( idx >= 0 );
357  assert( idx < (int)size());
358  const ItemType & p = vertexList_[idx];
359  if( p.first == 0 )
360  return vertex.level();
361  else
362  return p.second;
363  }
364  private:
365  bool up2Date_;
366  VertexListType vertexList_;
367  };
368 
369 
370 
372  {
373  public:
374  // level vertex iterator list
375  typedef std::vector < void * > ItemListType;
376  typedef ItemListType :: iterator IteratorType;
377 
378  ALU3dGridItemList () : up2Date_(false) {}
379 
380  size_t size () const { return itemList_.size(); }
381 
382  bool up2Date () const { return up2Date_; }
383  void unsetUp2Date () { up2Date_ = false; }
384 
385  void markAsUp2Date() { up2Date_ = true; }
386 
387  IteratorType begin () { return itemList_.begin(); }
388  IteratorType end () { return itemList_.end(); }
389 
390  ItemListType & getItemList() { return itemList_; }
391 
392  private:
393  bool up2Date_;
394  ItemListType itemList_;
395  };
396 
398 
400  // some helper functions
402 
403  template< class Comm >
405  {
406  static const typename ALU3dImplTraits< tetra, Comm >::GEOFaceType *
407  getFace( const typename ALU3dImplTraits< tetra, Comm >::GEOElementType& elem, int index)
408  {
409  assert(index >= 0 && index < 4);
410  return elem.myhface3( ElementTopologyMapping< tetra >::dune2aluFace(index) );
411  }
412 
413  static const typename ALU3dImplTraits< hexa, Comm >::GEOFaceType*
414  getFace( const typename ALU3dImplTraits< hexa, Comm >::GEOElementType &elem, int index )
415  {
416  assert(index >= 0 && index < 6);
417  return elem.myhface4( ElementTopologyMapping< hexa >::dune2aluFace(index) );
418  }
419  };
420 
421 } // end namespace Dune
422 
423 #endif // #ifndef DUNE_ALU3DINCLUDE_HH