ElInfo.h 15.2 KB
Newer Older
1
2
3
4
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
5
// ==  http://www.amdis-fem.org                                              ==
6
7
// ==                                                                        ==
// ============================================================================
8
9
10
11
12
13
14
15
16
17
18
19
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology 
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.


20
21
22
23
24
25

/** \file ElInfo.h */

#ifndef AMDIS_ELINFO_H
#define AMDIS_ELINFO_H

26
27
#include <boost/numeric/mtl/mtl.hpp>

28
29
30
31
32
#include "Flag.h"
#include "Boundary.h"
#include "Global.h"
#include "FixVec.h"
#include "Element.h"
33
#include "AMDiS_fwd.h" 
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

namespace AMDiS {

  /** \ingroup Traverse
   * \brief 
   * An ElInfo object holds informations wich are not stored in the corresponding
   * element. It is filled during mesh traversal by the traversal routines.
   * A fill flag determines which informations should be filled and which elements
   * should be visited. Since it is a
   * pure virtual base class for the dimension speciefic ElInfo classes, it must
   * not be instantiated directly.
   * \see ElInfo1d \see ElInfo2d \see ElInfo3d
   */

  class ElInfo
  {
  protected: 
51
    /// Protected constructor. Avoids instatiation of the basis class
52
53
54
55
56
57
58
59
60
    ElInfo();

    /** \brief
     * Protected constructor. Avoids instatiation of the basis class.
     * \param mesh pointer to the corresponding mesh.
     */
    ElInfo(Mesh *mesh);

  public:
61
    /// Virtual destructor because ElInfo is pure virtual.
62
63
64
65
66
67
    virtual ~ElInfo();

    /** \brief
     * Assignement operator.
     * \param rhs right hand side.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
68
69
    ElInfo& operator=(const ElInfo& rhs) 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
70
71
72
73
74
      mesh = rhs.mesh;
      element = rhs.element;
      parent = rhs.parent;
      macroElement = rhs.macroElement;
      fillFlag = rhs.fillFlag;
75
      level = rhs.level;
76
      elType = rhs.elType;
77
      iChild = rhs.iChild;
Thomas Witkowski's avatar
Thomas Witkowski committed
78
79
      coord = rhs.coord;
      boundary = rhs.boundary;
80
      projection = rhs.projection;
Thomas Witkowski's avatar
Thomas Witkowski committed
81
82
      oppCoord = rhs.oppCoord;
      neighbour = rhs.neighbour;
83
      neighbourCoord = rhs.neighbourCoord;
84
      oppVertex = rhs.oppVertex;
85
86
87
88
89
      det = rhs.det;
      grdLambda = rhs.grdLambda;
      parametric = rhs.parametric;
      dimOfWorld = rhs.dimOfWorld;

90
      return *this;
91
    }
92
93
94
95
96
97

  public:
    /** \name getting methods
     * \{ 
     */

Thomas Witkowski's avatar
Thomas Witkowski committed
98
    /// Get ElInfo's \ref mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
99
100
    inline Mesh* getMesh() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
101
      return mesh; 
102
    }
103

Thomas Witkowski's avatar
Thomas Witkowski committed
104
    /// Get ElInfo's \ref macroElement
Thomas Witkowski's avatar
Thomas Witkowski committed
105
106
    inline MacroElement* getMacroElement() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
107
      return macroElement; 
108
    }
109

110
    /// Get ElInfo's \ref element
Thomas Witkowski's avatar
Thomas Witkowski committed
111
112
    inline Element* getElement() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
113
      return element; 
114
    }
115

Thomas Witkowski's avatar
Thomas Witkowski committed
116
    /// Get ElInfo's \ref parent
Thomas Witkowski's avatar
Thomas Witkowski committed
117
118
    inline Element* getParent() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
119
      return parent; 
120
    }
121

Thomas Witkowski's avatar
Thomas Witkowski committed
122
    /// Get ElInfo's \ref fillFlag
Thomas Witkowski's avatar
Thomas Witkowski committed
123
124
    inline Flag getFillFlag() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
125
      return fillFlag; 
126
    }
127

128
    /// Get ElInfo's \ref level
Thomas Witkowski's avatar
Thomas Witkowski committed
129
130
    inline int getLevel() const 
    { 
131
132
133
      return level; 
    }

134
    /// Get ElInfo's \ref iChild
Thomas Witkowski's avatar
Thomas Witkowski committed
135
136
    inline int getIChild() const 
    {
137
      return iChild;
138
    }
139
140

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
141
     * Get ElInfo's \ref coord[i]. This is a WorldVector<double> filled with the
142
143
     * coordinates of the i-th vertex of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
144
145
    inline WorldVector<double>& getCoord(int i) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
146
      return coord[i]; 
147
    }
148
149

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
150
     * Get ElInfo's \ref coord[i]. This is a WorldVector<double> filled with the
151
152
     * coordinates of the i-th vertex of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
153
154
    inline const WorldVector<double>& getCoord(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
155
      return coord[i]; 
156
    }
157
158

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
159
     * Get ElInfo's \ref coord. This is a FixVec<WorldVector<double> > filled with the
160
161
     * coordinates of the all vertice of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
162
163
    inline FixVec<WorldVector<double>, VERTEX>& getCoords() 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
164
      return coord; 
165
    }
166
167

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
168
     * Get ElInfo's \ref coord. This is a FixVec<WorldVector<double> > filled with the
169
170
     * coordinates of the all vertice of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
171
172
    inline const FixVec<WorldVector<double>, VERTEX>& getCoords() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
173
      return coord; 
174
    }
175

Thomas Witkowski's avatar
Thomas Witkowski committed
176
    /// Get ElInfo's \ref oppCoord[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
177
178
    inline WorldVector<double>& getOppCoord(int i) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
179
      return oppCoord[i]; 
180
    }
181

Thomas Witkowski's avatar
Thomas Witkowski committed
182
    /// Get ElInfo's \ref boundary[i] 
Thomas Witkowski's avatar
Thomas Witkowski committed
183
184
    inline BoundaryType getBoundary(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
185
      return boundary[i]; 
186
    }
187

188
    /// Get boundary type of i-th vertex/edge/face (pos).
189
190
    BoundaryType getBoundary(GeoIndex pos, int i);

Thomas Witkowski's avatar
Thomas Witkowski committed
191
    /// Get ElInfo's \ref neighbour[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
192
193
    inline Element* getNeighbour(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
194
      return neighbour[i]; 
195
    }
196

197
    /// Get ElInfo's \ref neighbourCoord[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
198
199
    inline FixVec<WorldVector<double>, VERTEX> getNeighbourCoord(int i) const 
    {
200
      return neighbourCoord[i];
201
202
    }

203
    /// Get ElInfo's \ref oppVertex[i] 
204
    inline int getOppVertex(int i) const 
Thomas Witkowski's avatar
Thomas Witkowski committed
205
    { 
206
      return oppVertex[i]; 
207
    }
208

Thomas Witkowski's avatar
Thomas Witkowski committed
209
210
    virtual int getSideOfNeighbour(int i) 
    { 
211
      return oppVertex[i]; 
212
    }
213

Thomas Witkowski's avatar
Thomas Witkowski committed
214
    /// Get ElInfo's \ref det
Thomas Witkowski's avatar
Thomas Witkowski committed
215
216
    inline double getDet() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
217
      return det; 
218
    }
219

220
    /// Returns \ref grdLambda
Thomas Witkowski's avatar
Thomas Witkowski committed
221
222
    inline const DimVec<WorldVector<double> >& getGrdLambda() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
223
      return grdLambda; 
224
    }
225

Thomas Witkowski's avatar
Thomas Witkowski committed
226
    /// Returns \ref projection[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
227
228
    inline Projection *getProjection(int i) const 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
229
      return projection[i];
230
    }
231

232
    /// Returns \ref parametric
233
    inline bool getParametric() const
Thomas Witkowski's avatar
Thomas Witkowski committed
234
    { 
235
      return parametric; 
236
237
    }

238
239
240
241
242
243
244
245
246
247
248
249
    /// Returns \ref refinementPath
    inline unsigned long getRefinementPath() const
    {
      return refinementPath;
    } 

    /// Get \ref refinementPathLength
    inline int getRefinementPathLength() const
    {
      return refinementPathLength;
    }

250
251
    virtual mtl::dense2D<double>& getSubElemCoordsMat(int degree) const 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
252
      return subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
253
    }
254

255
    virtual mtl::dense2D<double>& getSubElemGradCoordsMat(int degree) const 
256
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
257
      return subElemGradMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
258
    }
259
260
261
262
263
264
265

    /** \} */ 

    /** \name setting methods
     * \{ 
     */

Thomas Witkowski's avatar
Thomas Witkowski committed
266
    /// Set ElInfo's \ref mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
267
268
    inline void setMesh(Mesh* aMesh) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
269
      mesh = aMesh; 
270
    }
271

Thomas Witkowski's avatar
Thomas Witkowski committed
272
    /// Set ElInfo's \ref macroElement
Thomas Witkowski's avatar
Thomas Witkowski committed
273
274
    inline void setMacroElement(MacroElement* mel) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
275
      macroElement = mel; 
276
    }
277

278
    /// Set ElInfo's \ref element
Thomas Witkowski's avatar
Thomas Witkowski committed
279
280
    inline void setElement(Element* elem) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
281
      element = elem; 
282
    }
283

Thomas Witkowski's avatar
Thomas Witkowski committed
284
    /// Set ElInfo's \ref parent
Thomas Witkowski's avatar
Thomas Witkowski committed
285
286
    inline void setParent(Element* elem) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
287
      parent = elem; 
288
    }
289

Thomas Witkowski's avatar
Thomas Witkowski committed
290
    /// Set ElInfo's \ref fillFlag
Thomas Witkowski's avatar
Thomas Witkowski committed
291
292
    inline void setFillFlag(Flag flag) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
293
      fillFlag = flag; 
294
    }
295

Thomas Witkowski's avatar
Thomas Witkowski committed
296
    /// Sets ElInfo's \ref coord[i]. 
297
    inline void setCoord(int i, WorldVector<double>& c) 
Thomas Witkowski's avatar
Thomas Witkowski committed
298
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
299
      coord[i] = c; 
300
    }
301

302
    /// Sets ElInfo's \ref coord. 
303
    inline void setCoords(FixVec<WorldVector<double>, VERTEX >& c) 
Thomas Witkowski's avatar
Thomas Witkowski committed
304
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
305
      coord = c; 
306
    }
307

308
    /// Set ElInfo's \ref level
Thomas Witkowski's avatar
Thomas Witkowski committed
309
310
    inline void setLevel(int l) 
    { 
311
312
313
      level = l; 
    }

Thomas Witkowski's avatar
Thomas Witkowski committed
314
    /// Set ElInfo's \ref boundary[i] 
Thomas Witkowski's avatar
Thomas Witkowski committed
315
316
    inline void setBoundary(int i, BoundaryType t) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
317
      boundary[i] = newBound(boundary[i], t);
318
    }
319

Thomas Witkowski's avatar
Thomas Witkowski committed
320
    /// Set \ref projection[i] = p
Thomas Witkowski's avatar
Thomas Witkowski committed
321
322
    inline void setProjection(int i, Projection *p) 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
323
      projection[i] = p;
324
    }
325

Thomas Witkowski's avatar
Thomas Witkowski committed
326
    /// Set \ref det = d
Thomas Witkowski's avatar
Thomas Witkowski committed
327
328
    inline void setDet(double d) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
329
      det = d; 
330
    }
331

332
    /// Set \ref parametric = param
Thomas Witkowski's avatar
Thomas Witkowski committed
333
334
    inline void setParametric(bool param) 
    { 
335
      parametric = param; 
336
337
    }

338
339
340
341
342
343
344
345
346
347
348
349
    /// Set \ref refinementPath
    inline void setRefinementPath(unsigned long rPath)
    {
      refinementPath = rPath;
    } 

    /// Set \ref refinementPathLength
    inline void setRefinementPathLength(int length)
    {
      refinementPathLength = length;
    }

350
351
352
353
354
355
    /// Set ElInfo's \ref elType.
    inline void setType(int t) 
    { 
      elType = t; 
    }

356
357
358
359
360
361
362
363
364
365
366
367
368
    /** \} */


    /** \brief
     * Returns the absolute value of the determinant of the affine linear 
     * parametrization's Jacobian
     */
    virtual double calcDet() const;

    /** \brief
     * Used by non static method \ref calcDet(). Calculates the determinant
     * for a given vector of vertex coordinates.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
369
    double calcDet(const FixVec<WorldVector<double>, VERTEX> &coords) const;
370

371
372
373
    /// from CFE_Integration
    double calcSurfaceDet(VectorOfFixVecs<DimVec<double> > &surfVert) const;

374
    /// Checks whether flag is set in ElInfo's \ref fillFlag. If not, the program exits.
375
376
377
    void testFlag(const Flag& flag) const;

    /** \brief
378
379
     * Transforms local barycentric coordinates of a point defined on this element
     * to global world coordinates.
380
     */
381
382
    void coordToWorld(const DimVec<double>& lambda,
		      WorldVector<double>& world) const;
383
  
Thomas Witkowski's avatar
Thomas Witkowski committed
384
    /// Fills ElInfo's \ref det and \ref grdLambda entries.
385
386
387
388
389
390
391
392
393
    virtual void fillDetGrdLambda();

    /** \brief
     * Returns a pointer to a vector, which contains the barycentric coordinates
     * with respect to \ref element of a point with world coordinates world.
     * The barycentric coordinates are stored in lambda. 
     * pure virtual => must be overriden in sub-class.
     */
    virtual const int worldToCoord(const WorldVector<double>& world, 
394
				   DimVec<double>* lambda) const = 0;
395
396
397
398
399
400
401
402
403
404
405
406

    /** \brief
     * Fills this ElInfo with macro element information of mel.
     * pure virtual => must be overriden in sub-class.
     */
    virtual void fillMacroInfo(const MacroElement *mel) = 0;

    /** \brief
     * Fills this ElInfo for the child ichild using hierarchy information and
     * parent data parentInfo.
     * pure virtual => must be overriden in sub-class.
     */
407
    virtual void fillElInfo(int ichild, const ElInfo *parentInfo) = 0;
408
409
410
411
412
413
414

    /** \brief
     * calculates the Jacobian of the barycentric coordinates on \element and stores
     * the matrix in grd_lam. The return value of the function is the absolute
     * value of the determinant of the affine linear paraetrization's Jacobian.
     * pure virtual => must be overriden in sub-class.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
415
    virtual double calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) = 0;
416
417

    /** \brief
418
     * calculates a normal of the given side (1d, 2d: edge, 3d: face) of \ref element.
419
420
421
422
     * Returns the absolute value of the determinant of the
     * transformation to the reference element.
     * pure virtual => must be overriden in sub-class.
     */
423
    virtual double getNormal(int side, WorldVector<double> &normal) const = 0;
424
425
426
427
428
429
430
431
432
433


    /** \brief
     * calculates a normal of the element in dim of world = dim + 1.
     * Returns the absolute value of the determinant of the
     * transformation to the reference element.
     * pure virtual => must be overriden in sub-class.
     */
    virtual double getElementNormal(WorldVector<double> &elementNormal) const 
    {
434
435
      FUNCNAME("ElInfo::getElementNormal()");

436
437
      ERROR("virtual function not implemented in this sub-class ");
    
438
      return 0.0;
439
    }
440

441
442
443
444
445
446
    /// Get ElInfo's \ref elType.
    inline int getType() const 
    { 
      return elType; 
    }

447
  protected:
448
    /// Pointer to the current mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
449
    Mesh *mesh;
450

451
    /// Pointer to the current element
Thomas Witkowski's avatar
Thomas Witkowski committed
452
    Element *element;
453

Thomas Witkowski's avatar
Thomas Witkowski committed
454
455
    /// \ref element is child of element parent
    Element *parent;
456
457
458

    /** \brief 
     * \ref element is an element of the binary tree located at MacroElement 
Thomas Witkowski's avatar
Thomas Witkowski committed
459
     * macroElement
460
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
461
    MacroElement *macroElement;
462
463
464
465
466

    /** \brief
     * Indicates wich elements will be called and wich information should be
     * present while mesh traversal.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
467
    Flag fillFlag;
468
469
470
471
472
473

    /** \brief 
     * Level of the element. The level is zero for macro elements and the level
     * of the children is (level of the parent + 1). level_ is filled always by
     * the traversal routines.
     */
474
475
    unsigned char level;

476
477
478
479
480
481
482
    /** \brief
     * Elements type index. This is used only for 3d, where type can be either 0, 1 or
     * 2. In all other cases type is not used and the variable is set to 0.
     * In 3d, it is filled automatically by the traversal routines.
     */
    int elType;

483
484
485
486
487
    /** \brief
     * This ElInfo is the iChild-th child of the parent element.
     */
    int iChild;

488
    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
489
     * \ref coord[i] is a WorldVector<double> storing the world coordinates of the
490
491
     * i-th vertex of element \ref element.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
492
    FixVec<WorldVector<double>, VERTEX> coord;
493
494

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
495
     * boundary[i] is the BoundaryType of the i-th edge/face
496
     * for i=0,...,N_NEIGH - 1. In 3d 
Thomas Witkowski's avatar
Thomas Witkowski committed
497
     * (*boundary)[N_FACES + i] is a pointer to the Boundary
498
499
500
     * object of the i-th edge, for i=0,..,N_EDGES - 1. It is
     * a pointer to NULL for an interior edge/face.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
501
    FixVec<BoundaryType, BOUNDARY> boundary;
502
503
504
505

    /** \brief
     * Vector storing pointers to projections for each face, edge, vertex.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
506
    FixVec<Projection*, PROJECTION> projection;
507
508

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
509
     * oppCoord[i] coordinates of the i-th neighbour vertex opposite the
510
511
     * common edge/face.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
512
    FixVec<WorldVector<double>, NEIGH> oppCoord;
513
514

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
515
     * neighbour[i] pointer to the element at the edge/face with local index i.
516
517
     * It is a pointer to NULL for boundary edges/faces.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
518
    FixVec<Element*, NEIGH> neighbour;
519
520

    /** \brief
521
     * neighbourCoord[i][j] are the coordinate of the j-th vertex of the i-th
522
523
     * neighbour element with the common edge/face.
     */
524
    FixVec<FixVec<WorldVector<double>, VERTEX>, NEIGH> neighbourCoord;
525
526

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
527
     * oppVertex[i] is undefined if neighbour[i] is a pointer to NULL. 
528
529
530
     * Otherwise it is the local index of the neighbour's vertex opposite the
     * common edge/face.
     */
531
    FixVec<int, NEIGH> oppVertex;
532

Thomas Witkowski's avatar
Thomas Witkowski committed
533
    /// Elements determinant.
Thomas Witkowski's avatar
Thomas Witkowski committed
534
    double det;
535

Thomas Witkowski's avatar
Thomas Witkowski committed
536
    /// Gradient of lambda.
Thomas Witkowski's avatar
Thomas Witkowski committed
537
    DimVec<WorldVector<double> > grdLambda;
538

Thomas Witkowski's avatar
Thomas Witkowski committed
539
    /// True, if this elInfo stores parametrized information. False, otherwise.
540
    bool parametric;
541

Thomas Witkowski's avatar
Thomas Witkowski committed
542
    /// Stores the world dimension.
Thomas Witkowski's avatar
Thomas Witkowski committed
543
544
    int dimOfWorld;

545
546
547
548
    unsigned long refinementPath;

    int refinementPathLength;

549
  public:
Thomas Witkowski's avatar
Thomas Witkowski committed
550
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemMatrices;
551
    
Thomas Witkowski's avatar
Thomas Witkowski committed
552
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemGradMatrices;
553

554
555
556
557
558
559
560
    /** \brief 
     * child_vertex[el_type][child][i] = father's local vertex index of new 
     * vertex i. 4 stands for the newly generated vertex .
     */
    static const int childVertex[3][2][4];

    /** \brief 
561
     * child_edge[el_type][child][i] = father's local edge index of new edge i.
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
     * new edge 2 is half of old edge 0, new edges 4,5 are really new edges, and
     * value is different: child_edge[][][4,5] = index of same edge in other
     * child.
     */
    static const int childEdge[3][2][6];

    friend class ElInfo1d;
    friend class ElInfo2d;
    friend class ElInfo3d;
  };

}

#include "ElInfo1d.h"
#include "ElInfo2d.h"
#include "ElInfo3d.h"

#endif  // AMDIS_ELINFO_H