ElInfo.h 16.4 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
      iChild = rhs.iChild;
Thomas Witkowski's avatar
Thomas Witkowski committed
76
77
78
79
      coord = rhs.coord;
      boundary = rhs.boundary;
      oppCoord = rhs.oppCoord;
      neighbour = rhs.neighbour;
80
      neighbourCoord = rhs.neighbourCoord;
81
      oppVertex = rhs.oppVertex;
82
      return *this;
83
    }
84
85
86
87
88
89

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

Thomas Witkowski's avatar
Thomas Witkowski committed
90
    /// Get ElInfo's \ref mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
91
92
    inline Mesh* getMesh() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
93
      return mesh; 
94
    }
95

Thomas Witkowski's avatar
Thomas Witkowski committed
96
    /// Get ElInfo's \ref macroElement
Thomas Witkowski's avatar
Thomas Witkowski committed
97
98
    inline MacroElement* getMacroElement() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
99
      return macroElement; 
100
    }
101

102
    /// Get ElInfo's \ref element
Thomas Witkowski's avatar
Thomas Witkowski committed
103
104
    inline Element* getElement() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
105
      return element; 
106
    }
107

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

Thomas Witkowski's avatar
Thomas Witkowski committed
114
    /// Get ElInfo's \ref fillFlag
Thomas Witkowski's avatar
Thomas Witkowski committed
115
116
    inline Flag getFillFlag() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
117
      return fillFlag; 
118
    }
119

120
    /// Get ElInfo's \ref level
Thomas Witkowski's avatar
Thomas Witkowski committed
121
122
    inline int getLevel() const 
    { 
123
124
125
      return level; 
    }

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

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
133
     * Get ElInfo's \ref coord[i]. This is a WorldVector<double> filled with the
134
135
     * coordinates of the i-th vertex of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
136
137
    inline WorldVector<double>& getCoord(int i) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
138
      return coord[i]; 
139
    }
140
141

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

    /** \brief
Thomas Witkowski's avatar
Thomas Witkowski committed
151
     * Get ElInfo's \ref coord. This is a FixVec<WorldVector<double> > filled with the
152
153
     * coordinates of the all vertice of element \ref el.
     */
Thomas Witkowski's avatar
Thomas Witkowski committed
154
155
    inline FixVec<WorldVector<double>, VERTEX>& getCoords() 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
156
      return coord; 
157
    }
158
159

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

Thomas Witkowski's avatar
Thomas Witkowski committed
168
    /// Get ElInfo's \ref oppCoord[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
169
170
    inline WorldVector<double>& getOppCoord(int i) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
171
      return oppCoord[i]; 
172
    }
173

Thomas Witkowski's avatar
Thomas Witkowski committed
174
    /// Get ElInfo's \ref boundary[i] 
Thomas Witkowski's avatar
Thomas Witkowski committed
175
176
    inline BoundaryType getBoundary(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
177
      return boundary[i]; 
178
    }
179

180
    /// Get boundary type of i-th vertex/edge/face (pos).
181
182
    BoundaryType getBoundary(GeoIndex pos, int i);

Thomas Witkowski's avatar
Thomas Witkowski committed
183
    /// Get ElInfo's \ref neighbour[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
184
185
    inline Element* getNeighbour(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
186
      return neighbour[i]; 
187
    }
188

189
    /// Get ElInfo's \ref neighbourCoord[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
190
191
    inline FixVec<WorldVector<double>, VERTEX> getNeighbourCoord(int i) const 
    {
192
      return neighbourCoord[i];
193
194
    }

195
    /// Get ElInfo's \ref oppVertex[i] 
Thomas Witkowski's avatar
Thomas Witkowski committed
196
197
    inline unsigned char getOppVertex(int i) const 
    { 
198
      return oppVertex[i]; 
199
    }
200

Thomas Witkowski's avatar
Thomas Witkowski committed
201
202
    virtual int getSideOfNeighbour(int i) 
    { 
203
      return oppVertex[i]; 
204
    }
205

Thomas Witkowski's avatar
Thomas Witkowski committed
206
    /// Get ElInfo's \ref det
Thomas Witkowski's avatar
Thomas Witkowski committed
207
208
    inline double getDet() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
209
      return det; 
210
    }
211

212
    /// Returns \ref grdLambda
Thomas Witkowski's avatar
Thomas Witkowski committed
213
214
    inline const DimVec<WorldVector<double> >& getGrdLambda() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
215
      return grdLambda; 
216
    }
217

Thomas Witkowski's avatar
Thomas Witkowski committed
218
    /// Returns \ref projection[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
219
220
    inline Projection *getProjection(int i) const 
    {
Thomas Witkowski's avatar
Thomas Witkowski committed
221
      return projection[i];
222
    }
223

224
    /// Returns \ref parametric
Thomas Witkowski's avatar
Thomas Witkowski committed
225
226
    inline bool getParametric() 
    { 
227
      return parametric; 
228
229
    }

230
231
232
233
234
235
236
237
238
239
240
    /// Returns the local indices, \ref localIndices, for given FE space.
    inline std::vector<DegreeOfFreedom>& getLocalIndices(const FiniteElemSpace* feSpace)
    {
      FUNCNAME("ElInfo::getLocalIndices()");
      
      TEST_EXIT_DBG(element->isLeaf() == true)
	("Local indices are computed only for leaf elements!\n");

      return localIndices[feSpace];
    }

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

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

253
254
255
256
    virtual mtl::dense2D<double>& getSubElemCoordsMat(int degree) const 
    {
      return subElemMatrices[degree][refinementPath];
    }
257

258
259
260
261
    virtual mtl::dense2D<double>& getSubElemCoordsMat_so(int degree) const 
    {
      return subElemMatrices[degree][refinementPath];
    }
262
263
264
265
266
267
268

    /** \} */ 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

353
354
355
356
357
358
    /// Set ElInfo's \ref elType.
    inline void setType(int t) 
    { 
      elType = t; 
    }

359
360
361
362
363
364
365
366
367
368
369
370
371
    /** \} */


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

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
418
419
420
421
422

    /** \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
423
    virtual double getNormal(int side, WorldVector<double> &normal) = 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<unsigned char, 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

539
540
541
542
543
544
545
    /** \brief
     * If the local indices of elements should be set during mesh traverse, they are
     * stored in this variable for all differnt FE spaces that are defined on the
     * mesh. Node that local indices are computed only for leaf elements of the mesh.
     */
    std::map<const FiniteElemSpace*, std::vector<DegreeOfFreedom> > localIndices;

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

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

552
553
554
555
    unsigned long refinementPath;

    int refinementPathLength;

556
557
558
559
560
561
562
    /** \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.
     */
563
    mtl::dense2D<double> subElemCoordsMat;
564

565
566
    mtl::dense2D<double> subElemCoordsMat_so;

567
  public:
568
    static std::vector<std::map<unsigned long, mtl::dense2D<double> > > subElemMatrices;
569

570
571
572
573
574
575
576
    /** \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 
577
     * child_edge[el_type][child][i] = father's local edge index of new edge i.
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
     * 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