ElInfo.h 15.3 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

Praetorius, Simon's avatar
Praetorius, Simon committed
326
327
328
329
330
331
    /// Set ElInfo's \ref boundary[i] 
    inline void setNeighbor(int i, Element* neigh) 
    { 
      neighbour[i] = neigh;
    }

Thomas Witkowski's avatar
Thomas Witkowski committed
332
    /// Set \ref det = d
Thomas Witkowski's avatar
Thomas Witkowski committed
333
334
    inline void setDet(double d) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
335
      det = d; 
336
    }
337

338
    /// Set \ref parametric = param
Thomas Witkowski's avatar
Thomas Witkowski committed
339
340
    inline void setParametric(bool param) 
    { 
341
      parametric = param; 
342
343
    }

344
345
346
347
348
349
350
351
352
353
354
355
    /// Set \ref refinementPath
    inline void setRefinementPath(unsigned long rPath)
    {
      refinementPath = rPath;
    } 

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

356
357
358
359
360
361
    /// Set ElInfo's \ref elType.
    inline void setType(int t) 
    { 
      elType = t; 
    }

362
363
364
365
366
367
368
369
370
371
372
373
374
    /** \} */


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

377
378
379
    /// from CFE_Integration
    double calcSurfaceDet(VectorOfFixVecs<DimVec<double> > &surfVert) const;

380
    /// Checks whether flag is set in ElInfo's \ref fillFlag. If not, the program exits.
381
382
383
    void testFlag(const Flag& flag) const;

    /** \brief
384
385
     * Transforms local barycentric coordinates of a point defined on this element
     * to global world coordinates.
386
     */
387
388
    void coordToWorld(const DimVec<double>& lambda,
		      WorldVector<double>& world) const;
389
  
Thomas Witkowski's avatar
Thomas Witkowski committed
390
    /// Fills ElInfo's \ref det and \ref grdLambda entries.
391
392
393
394
395
396
397
398
399
    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, 
400
				   DimVec<double>* lambda) const = 0;
401
402
403
404
405
406
407
408
409
410
411
412

    /** \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.
     */
413
    virtual void fillElInfo(int ichild, const ElInfo *parentInfo) = 0;
414
415
416
417
418
419
420

    /** \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
421
    virtual double calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) = 0;
422
423

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


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

442
443
      ERROR("virtual function not implemented in this sub-class ");
    
444
      return 0.0;
445
    }
446

447
448
449
450
451
452
    /// Get ElInfo's \ref elType.
    inline int getType() const 
    { 
      return elType; 
    }

453
  protected:
454
    /// Pointer to the current mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
455
    Mesh *mesh;
456

457
    /// Pointer to the current element
Thomas Witkowski's avatar
Thomas Witkowski committed
458
    Element *element;
459

Thomas Witkowski's avatar
Thomas Witkowski committed
460
461
    /// \ref element is child of element parent
    Element *parent;
462
463
464

    /** \brief 
     * \ref element is an element of the binary tree located at MacroElement 
Thomas Witkowski's avatar
Thomas Witkowski committed
465
     * macroElement
466
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
467
    MacroElement *macroElement;
468
469
470
471
472

    /** \brief
     * Indicates wich elements will be called and wich information should be
     * present while mesh traversal.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
473
    Flag fillFlag;
474
475
476
477
478
479

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

482
483
484
485
486
487
488
    /** \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;

489
490
491
492
493
    /** \brief
     * This ElInfo is the iChild-th child of the parent element.
     */
    int iChild;

494
    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
495
     * \ref coord[i] is a WorldVector<double> storing the world coordinates of the
496
497
     * i-th vertex of element \ref element.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
498
    FixVec<WorldVector<double>, VERTEX> coord;
499
500

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
501
     * boundary[i] is the BoundaryType of the i-th edge/face
502
     * for i=0,...,N_NEIGH - 1. In 3d 
Thomas Witkowski's avatar
Thomas Witkowski committed
503
     * (*boundary)[N_FACES + i] is a pointer to the Boundary
504
505
506
     * 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
507
    FixVec<BoundaryType, BOUNDARY> boundary;
508
509
510
511

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

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
515
     * oppCoord[i] coordinates of the i-th neighbour vertex opposite the
516
517
     * common edge/face.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
518
    FixVec<WorldVector<double>, NEIGH> oppCoord;
519
520

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
521
     * neighbour[i] pointer to the element at the edge/face with local index i.
522
523
     * It is a pointer to NULL for boundary edges/faces.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
524
    FixVec<Element*, NEIGH> neighbour;
525
526

    /** \brief
527
     * neighbourCoord[i][j] are the coordinate of the j-th vertex of the i-th
528
529
     * neighbour element with the common edge/face.
     */
530
    FixVec<FixVec<WorldVector<double>, VERTEX>, NEIGH> neighbourCoord;
531
532

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
533
     * oppVertex[i] is undefined if neighbour[i] is a pointer to NULL. 
534
535
536
     * Otherwise it is the local index of the neighbour's vertex opposite the
     * common edge/face.
     */
537
    FixVec<int, NEIGH> oppVertex;
538

Thomas Witkowski's avatar
Thomas Witkowski committed
539
    /// Elements determinant.
Thomas Witkowski's avatar
Thomas Witkowski committed
540
    double det;
541

Thomas Witkowski's avatar
Thomas Witkowski committed
542
    /// Gradient of lambda.
Thomas Witkowski's avatar
Thomas Witkowski committed
543
    DimVec<WorldVector<double> > grdLambda;
544

Thomas Witkowski's avatar
Thomas Witkowski committed
545
    /// True, if this elInfo stores parametrized information. False, otherwise.
546
    bool parametric;
547

Thomas Witkowski's avatar
Thomas Witkowski committed
548
    /// Stores the world dimension.
Thomas Witkowski's avatar
Thomas Witkowski committed
549
550
    int dimOfWorld;

551
552
553
554
    unsigned long refinementPath;

    int refinementPathLength;

555
  public:
Thomas Witkowski's avatar
Thomas Witkowski committed
556
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemMatrices;
557
    
Thomas Witkowski's avatar
Thomas Witkowski committed
558
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemGradMatrices;
559

560
561
562
563
564
565
566
    /** \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 
567
     * child_edge[el_type][child][i] = father's local edge index of new edge i.
568
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
     * 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