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
    ElInfo();

Thomas Witkowski's avatar
Thomas Witkowski committed
54
55
    /// Protected constructor. Avoids instatiation of the basis class.
    /// \param mesh pointer to the corresponding mesh.
56
57
58
    ElInfo(Mesh *mesh);

  public:
59
    /// Virtual destructor because ElInfo is pure virtual.
60
61
    virtual ~ElInfo();

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

86
      return *this;
87
    }
88
89
90
91
92
93

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

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

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

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

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

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

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

130
    /// Get ElInfo's \ref iChild
Thomas Witkowski's avatar
Thomas Witkowski committed
131
132
    inline int getIChild() const 
    {
133
      return iChild;
134
    }
135

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

Thomas Witkowski's avatar
Thomas Witkowski committed
143
144
    /// Get ElInfo's \ref coord[i]. This is a WorldVector<double> filled with the
    /// 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

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

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

Thomas Witkowski's avatar
Thomas Witkowski committed
164
    /// Get ElInfo's \ref oppCoord[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
165
166
    inline WorldVector<double>& getOppCoord(int i) 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
167
      return oppCoord[i]; 
168
    }
169

Thomas Witkowski's avatar
Thomas Witkowski committed
170
    /// Get ElInfo's \ref boundary[i] 
Thomas Witkowski's avatar
Thomas Witkowski committed
171
172
    inline BoundaryType getBoundary(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
173
      return boundary[i]; 
174
    }
175

176
    /// Get boundary type of i-th vertex/edge/face (pos).
177
178
    BoundaryType getBoundary(GeoIndex pos, int i);

Thomas Witkowski's avatar
Thomas Witkowski committed
179
    /// Get ElInfo's \ref neighbour[i]
Thomas Witkowski's avatar
Thomas Witkowski committed
180
181
    inline Element* getNeighbour(int i) const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
182
      return neighbour[i]; 
183
    }
184

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

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

Thomas Witkowski's avatar
Thomas Witkowski committed
197
198
    virtual int getSideOfNeighbour(int i) 
    { 
199
      return oppVertex[i]; 
200
    }
201

Thomas Witkowski's avatar
Thomas Witkowski committed
202
    /// Get ElInfo's \ref det
Thomas Witkowski's avatar
Thomas Witkowski committed
203
204
    inline double getDet() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
205
      return det; 
206
    }
207

208
    /// Returns \ref grdLambda
Thomas Witkowski's avatar
Thomas Witkowski committed
209
210
    inline const DimVec<WorldVector<double> >& getGrdLambda() const 
    { 
Thomas Witkowski's avatar
Thomas Witkowski committed
211
      return grdLambda; 
212
    }
213
214
215
216
217
218
219
220
    
    inline void getGrdLambda(mtl::dense2D<double>& grd_lam)
    {
      grd_lam.change_dim(grdLambda.size(), Global::getGeo(WORLD));
      for (size_t i = 0; i < static_cast<size_t>(grdLambda.size()); i++)
	for (size_t j = 0; j < static_cast<size_t>(Global::getGeo(WORLD)); j++)
	  grd_lam(i,j) = grd_lam[i][j];
    }
221

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

228
    /// Returns \ref parametric
229
    inline bool getParametric() const
Thomas Witkowski's avatar
Thomas Witkowski committed
230
    { 
231
      return parametric; 
232
233
    }

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

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

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

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

    /** \} */ 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

358
359
360
    /** \} */


Thomas Witkowski's avatar
Thomas Witkowski committed
361
362
    /// Returns the absolute value of the determinant of the affine linear 
    /// parametrization's Jacobian
363
364
    virtual double calcDet() const;

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

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

Thomas Witkowski's avatar
Thomas Witkowski committed
372
373
    /// Checks whether flag is set in ElInfo's \ref fillFlag. If not, the 
    /// program exits.
374
375
    void testFlag(const Flag& flag) const;

Thomas Witkowski's avatar
Thomas Witkowski committed
376
377
    /// Transforms local barycentric coordinates of a point defined on this 
    /// element to global world coordinates.
378
379
    void coordToWorld(const DimVec<double>& lambda,
		      WorldVector<double>& world) const;
380
  
Thomas Witkowski's avatar
Thomas Witkowski committed
381
    /// Fills ElInfo's \ref det and \ref grdLambda entries.
382
383
    virtual void fillDetGrdLambda();

Thomas Witkowski's avatar
Thomas Witkowski committed
384
385
386
387
    /// 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.
388
    virtual const int worldToCoord(const WorldVector<double>& world, 
389
				   DimVec<double>* lambda) const = 0;
390

Thomas Witkowski's avatar
Thomas Witkowski committed
391
392
    /// Fills this ElInfo with macro element information of mel.
    /// pure virtual => must be overriden in sub-class.
393
394
    virtual void fillMacroInfo(const MacroElement *mel) = 0;

Thomas Witkowski's avatar
Thomas Witkowski committed
395
396
397
    /// Fills this ElInfo for the child ichild using hierarchy information and
    /// parent data parentInfo.
    /// pure virtual => must be overriden in sub-class.
398
    virtual void fillElInfo(int ichild, const ElInfo *parentInfo) = 0;
399

400

Thomas Witkowski's avatar
Thomas Witkowski committed
401
402
403
    void fillElInfo(const MacroElement *mel, 
		    int refinementPathLength, 
		    unsigned long refinementPath);
404

Thomas Witkowski's avatar
Thomas Witkowski committed
405
406
407
408
409
    /// 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
410
    virtual double calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) = 0;
411

Thomas Witkowski's avatar
Thomas Witkowski committed
412
413
414
415
    /// 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.
416
    virtual double getNormal(int side, WorldVector<double> &normal) const = 0;
417

Thomas Witkowski's avatar
Thomas Witkowski committed
418
419
420
421
    /// 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.
422
423
    virtual double getElementNormal(WorldVector<double> &elementNormal) const 
    {
424
425
      FUNCNAME("ElInfo::getElementNormal()");

426
427
      ERROR("virtual function not implemented in this sub-class ");
    
428
      return 0.0;
429
    }
430

431
432
433
434
435
436
    /// Get ElInfo's \ref elType.
    inline int getType() const 
    { 
      return elType; 
    }

437
  protected:
438
    /// Pointer to the current mesh
Thomas Witkowski's avatar
Thomas Witkowski committed
439
    Mesh *mesh;
440

441
    /// Pointer to the current element
Thomas Witkowski's avatar
Thomas Witkowski committed
442
    Element *element;
443

Thomas Witkowski's avatar
Thomas Witkowski committed
444
445
    /// \ref element is child of element parent
    Element *parent;
446

447
448
    /// \ref element is an element of the binary tree located at MacroElement 
    /// macroElement
Thomas Witkowski's avatar
Thomas Witkowski committed
449
    MacroElement *macroElement;
450

451
452
    /// Indicates wich elements will be called and wich information should be
    /// present while mesh traversal.
Thomas Witkowski's avatar
Thomas Witkowski committed
453
    Flag fillFlag;
454

455
456
457
    /// 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.
458
459
    unsigned char level;

460
461
462
    /// 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.
463
464
    int elType;

465
    /// This ElInfo is the iChild-th child of the parent element.
466
467
    int iChild;

468
469
    /// \ref coord[i] is a WorldVector<double> storing the world coordinates of the
    /// i-th vertex of element \ref element.
Thomas Witkowski's avatar
Thomas Witkowski committed
470
    FixVec<WorldVector<double>, VERTEX> coord;
471
472

    /** \brief 
Thomas Witkowski's avatar
Thomas Witkowski committed
473
     * boundary[i] is the BoundaryType of the i-th edge/face
474
     * for i=0,...,N_NEIGH - 1. In 3d 
Thomas Witkowski's avatar
Thomas Witkowski committed
475
     * (*boundary)[N_FACES + i] is a pointer to the Boundary
476
477
478
     * 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
479
    FixVec<BoundaryType, BOUNDARY> boundary;
480

481
    /// Vector storing pointers to projections for each face, edge, vertex.
Thomas Witkowski's avatar
Thomas Witkowski committed
482
    FixVec<Projection*, PROJECTION> projection;
483

484
485
    /// oppCoord[i] coordinates of the i-th neighbour vertex opposite the
    /// common edge/face.
Thomas Witkowski's avatar
Thomas Witkowski committed
486
    FixVec<WorldVector<double>, NEIGH> oppCoord;
487

488
489
    /// neighbour[i] pointer to the element at the edge/face with local index i.
    /// It is a pointer to NULL for boundary edges/faces.
Thomas Witkowski's avatar
Thomas Witkowski committed
490
    FixVec<Element*, NEIGH> neighbour;
491

492
493
    /// neighbourCoord[i][j] are the coordinate of the j-th vertex of the i-th
    /// neighbour element with the common edge/face.
494
    FixVec<FixVec<WorldVector<double>, VERTEX>, NEIGH> neighbourCoord;
495

496
497
498
    /// oppVertex[i] is undefined if neighbour[i] is a pointer to NULL. 
    /// Otherwise it is the local index of the neighbour's vertex opposite the
    /// common edge/face.
499
    FixVec<int, NEIGH> oppVertex;
500

Thomas Witkowski's avatar
Thomas Witkowski committed
501
    /// Elements determinant.
Thomas Witkowski's avatar
Thomas Witkowski committed
502
    double det;
503

Thomas Witkowski's avatar
Thomas Witkowski committed
504
    /// Gradient of lambda.
Thomas Witkowski's avatar
Thomas Witkowski committed
505
    DimVec<WorldVector<double> > grdLambda;
506

Thomas Witkowski's avatar
Thomas Witkowski committed
507
    /// True, if this elInfo stores parametrized information. False, otherwise.
508
    bool parametric;
509

Thomas Witkowski's avatar
Thomas Witkowski committed
510
    /// Stores the world dimension.
Thomas Witkowski's avatar
Thomas Witkowski committed
511
512
    int dimOfWorld;

513
514
515
516
    unsigned long refinementPath;

    int refinementPathLength;

517
  public:
Thomas Witkowski's avatar
Thomas Witkowski committed
518
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemMatrices;
519
    
Thomas Witkowski's avatar
Thomas Witkowski committed
520
    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemGradMatrices;
521

522
523
    /// child_vertex[el_type][child][i] = father's local vertex index of new 
    /// vertex i. 4 stands for the newly generated vertex .     
524
525
    static const int childVertex[3][2][4];

526
527
528
529
    /// child_edge[el_type][child][i] = father's local edge index of new edge i.
    /// 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.
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
    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