ElInfo.h 16 KB
Newer Older
1
2
3
4
5
6
// ============================================================================
// ==                                                                        ==
// == AMDiS - Adaptive multidimensional simulations                          ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
7
// ==  TU Dresden                                                            ==
8
// ==                                                                        ==
9
10
11
// ==  Institut fr Wissenschaftliches Rechnen                               ==
// ==  Zellescher Weg 12-14                                                  ==
// ==  01069 Dresden                                                         ==
12
13
14
15
// ==  germany                                                               ==
// ==                                                                        ==
// ============================================================================
// ==                                                                        ==
16
// ==  https://gforge.zih.tu-dresden.de/projects/amdis/                      ==
17
18
19
20
21
22
23
24
// ==                                                                        ==
// ============================================================================

/** \file ElInfo.h */

#ifndef AMDIS_ELINFO_H
#define AMDIS_ELINFO_H

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

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

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: 
50
    /// Protected constructor. Avoids instatiation of the basis class
51
52
53
54
55
56
57
58
59
    ElInfo();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

249
250
251
252
    virtual mtl::dense2D<double>& getSubElemCoordsMat(int degree) const 
    {
      return subElemMatrices[degree][refinementPath];
    }
253

254
    virtual mtl::dense2D<double>& getSubElemGradCoordsMat(int degree) const 
255
    {
256
      return subElemGradMatrices[degree][refinementPath];
257
    }
258
259
260
261
262
263
264

    /** \} */ 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    /** \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
368
    double calcDet(const FixVec<WorldVector<double>, VERTEX> &coords) const;
369

370
    /// Checks whether flag is set in ElInfo's \ref fillFlag. If not, the program exits.
371
372
373
    void testFlag(const Flag& flag) const;

    /** \brief
374
375
     * Transforms local barycentric coordinates of a point defined on this element
     * to global world coordinates.
376
     */
377
378
    void coordToWorld(const DimVec<double>& lambda,
		      WorldVector<double>& world) const;
379
  
Thomas Witkowski's avatar
Thomas Witkowski committed
380
    /// Fills ElInfo's \ref det and \ref grdLambda entries.
381
382
383
384
385
386
387
388
389
    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, 
390
				   DimVec<double>* lambda) const = 0;
391
392
393
394
395
396
397
398
399
400
401
402

    /** \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.
     */
403
    virtual void fillElInfo(int ichild, const ElInfo *parentInfo) = 0;
404
405
406
407
408
409
410

    /** \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
411
    virtual double calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) = 0;
412
413
414
415
416
417
418

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


    /** \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 
    {
430
431
      FUNCNAME("ElInfo::getElementNormal()");

432
433
      ERROR("virtual function not implemented in this sub-class ");
    
434
      return 0.0;
435
    }
436

437
438
439
440
441
442
    /// Get ElInfo's \ref elType.
    inline int getType() const 
    { 
      return elType; 
    }

443
  protected:
444
    /// Pointer to the current mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
445
    Mesh *mesh;
446

447
    /// Pointer to the current element
Thomas Witkowski's avatar
Thomas Witkowski committed
448
    Element *element;
449

Thomas Witkowski's avatar
Thomas Witkowski committed
450
451
    /// \ref element is child of element parent
    Element *parent;
452
453
454

    /** \brief 
     * \ref element is an element of the binary tree located at MacroElement 
Thomas Witkowski's avatar
Thomas Witkowski committed
455
     * macroElement
456
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
457
    MacroElement *macroElement;
458
459
460
461
462

    /** \brief
     * Indicates wich elements will be called and wich information should be
     * present while mesh traversal.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
463
    Flag fillFlag;
464
465
466
467
468
469

    /** \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.
     */
470
471
    unsigned char level;

472
473
474
475
476
477
478
    /** \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;

479
480
481
482
483
    /** \brief
     * This ElInfo is the iChild-th child of the parent element.
     */
    int iChild;

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

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
491
     * boundary[i] is the BoundaryType of the i-th edge/face
492
     * for i=0,...,N_NEIGH - 1. In 3d 
Thomas Witkowski's avatar
Thomas Witkowski committed
493
     * (*boundary)[N_FACES + i] is a pointer to the Boundary
494
495
496
     * 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
497
    FixVec<BoundaryType, BOUNDARY> boundary;
498
499
500
501

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

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

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

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

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
523
     * oppVertex[i] is undefined if neighbour[i] is a pointer to NULL. 
524
525
526
     * Otherwise it is the local index of the neighbour's vertex opposite the
     * common edge/face.
     */
527
    FixVec<unsigned char, NEIGH> oppVertex;
528

Thomas Witkowski's avatar
Thomas Witkowski committed
529
    /// Elements determinant.
Thomas Witkowski's avatar
Thomas Witkowski committed
530
    double det;
531

Thomas Witkowski's avatar
Thomas Witkowski committed
532
    /// Gradient of lambda.
Thomas Witkowski's avatar
Thomas Witkowski committed
533
    DimVec<WorldVector<double> > grdLambda;
534

Thomas Witkowski's avatar
Thomas Witkowski committed
535
    /// True, if this elInfo stores parametrized information. False, otherwise.
536
    bool parametric;
537

Thomas Witkowski's avatar
Thomas Witkowski committed
538
    /// Stores the world dimension.
Thomas Witkowski's avatar
Thomas Witkowski committed
539
540
    int dimOfWorld;

541
542
543
544
    unsigned long refinementPath;

    int refinementPathLength;

545
546
547
548
549
550
551
    /** \brief
     * This is a transformation matrix used during dual traverse. It is set, if
     * the current element is the smaller element of an element pair in the traverse.
     * Then this matrix defines a mapping for points defined in barycentric 
     * coordinates on the larger element, to the barycentric coordinates of the smaller
     * element.
     */
552
    mtl::dense2D<double> subElemCoordsMat;
553

554
    mtl::dense2D<double> subElemGradCoordsMat;
555

556
  public:
557
    static std::vector<std::map<unsigned long, mtl::dense2D<double> > > subElemMatrices;
558
559
    
    static std::vector<std::map<unsigned long, mtl::dense2D<double> > > subElemGradMatrices;
560

561
562
563
564
565
566
567
    /** \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 
568
     * child_edge[el_type][child][i] = father's local edge index of new edge i.
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
     * 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