Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/curvedelems.hpp
3206 views
1
#ifndef CURVEDELEMS
2
#define CURVEDELEMS
3
4
/**************************************************************************/
5
/* File: curvedelems.hpp */
6
/* Author: Robert Gaisbauer */
7
/* Date: 27. Sep. 02 (second version: 30. Jan. 03) */
8
/**************************************************************************/
9
10
#include "bisect.hpp"
11
#include <iostream>
12
13
#define EPSILON 1e-20
14
15
16
17
void ComputeGaussRule (int n, ARRAY<double> & xi, ARRAY<double> & wi);
18
19
20
21
22
23
// ----------------------------------------------------------------------------
24
// CurvedElements
25
// ----------------------------------------------------------------------------
26
27
class CurvedElements
28
{
29
const Mesh & mesh;
30
const MeshTopology & top;
31
32
bool isHighOrder;
33
int nvisualsubsecs;
34
int nIntegrationPoints;
35
36
ARRAY<int> edgeorder;
37
ARRAY<int> faceorder;
38
39
/*
40
41
ARRAY< Vec<3> > edgecoeffs;
42
ARRAY< Vec<3> > facecoeffs;
43
44
ARRAY<int> edgecoeffsindex;
45
ARRAY<int> facecoeffsindex;
46
47
*/
48
49
inline Vec<3> GetEdgeCoeff (int edgenr, int k);
50
inline Vec<3> GetFaceCoeff (int facenr, int k);
51
52
53
void CalcSegmentTransformation (double xi, int segnr,
54
Point<3> * x = NULL, Vec<3> * dxdxi = NULL);
55
56
void CalcSurfaceTransformation (Point<2> xi, int elnr,
57
Point<3> * x = NULL, Mat<3,2> * dxdxi = NULL);
58
59
void CalcElementTransformation (Point<3> xi, int elnr,
60
Point<3> * x = NULL, Mat<3,3> * dxdxi = NULL);
61
62
63
64
public:
65
66
Refinement * refinement;
67
68
ARRAY< Vec<3> > edgecoeffs;
69
ARRAY< Vec<3> > facecoeffs;
70
71
ARRAY<int> edgecoeffsindex;
72
ARRAY<int> facecoeffsindex;
73
74
75
76
77
78
CurvedElements (const Mesh & amesh);
79
~CurvedElements();
80
81
bool IsHighOrder() const
82
{ return isHighOrder; };
83
void SetHighOrder () { isHighOrder = 1; }
84
85
86
int GetNVisualSubsecs() const
87
{ return nvisualsubsecs; };
88
89
const class Mesh & GetMesh() const
90
{ return mesh; };
91
92
void BuildCurvedElements(Refinement * ref, int polydeg, bool rational=false);
93
94
int GetEdgeOrder (int edgenr) const
95
{ return edgeorder[edgenr]; };
96
97
int GetFaceOrder (int facenr) const
98
{ return faceorder[facenr]; };
99
100
int IsEdgeCurved (int edgenr) const;
101
102
int IsFaceCurved (int facenr) const;
103
104
int IsSurfaceElementCurved (int elnr) const;
105
106
int IsElementCurved (int elnr) const;
107
108
109
void CalcSegmentTransformation (double xi, int segnr,
110
Point<3> & x)
111
{ CalcSegmentTransformation (xi, segnr, &x, NULL); };
112
113
void CalcSegmentTransformation (double xi, int segnr,
114
Vec<3> & dxdxi)
115
{ CalcSegmentTransformation (xi, segnr, NULL, &dxdxi); };
116
117
void CalcSegmentTransformation (double xi, int segnr,
118
Point<3> & x, Vec<3> & dxdxi)
119
{ CalcSegmentTransformation (xi, segnr, &x, &dxdxi); };
120
121
122
void CalcSurfaceTransformation (const Point<2> & xi, int elnr,
123
Point<3> & x)
124
{ CalcSurfaceTransformation (xi, elnr, &x, NULL); };
125
126
void CalcSurfaceTransformation (const Point<2> & xi, int elnr,
127
Mat<3,2> & dxdxi)
128
{ CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };
129
130
void CalcSurfaceTransformation (const Point<2> & xi, int elnr,
131
Point<3> & x, Mat<3,2> & dxdxi)
132
{ CalcSurfaceTransformation (xi, elnr, &x, &dxdxi); };
133
134
135
void CalcElementTransformation (const Point<3> & xi, int elnr,
136
Point<3> & x)
137
{ CalcElementTransformation (xi, elnr, &x, NULL); };
138
139
void CalcElementTransformation (const Point<3> & xi, int elnr,
140
Mat<3,3> & dxdxi)
141
{ CalcElementTransformation (xi, elnr, NULL, &dxdxi); };
142
143
void CalcElementTransformation (const Point<3> & xi, int elnr,
144
Point<3> & x, Mat<3,3> & dxdxi)
145
{ CalcElementTransformation (xi, elnr, &x, &dxdxi); };
146
147
148
149
150
void CalcMultiPointSegmentTransformation (ARRAY<double> * xi, int segnr,
151
ARRAY<Point<3> > * x,
152
ARRAY<Vec<3> > * dxdxi);
153
154
void CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, int elnr,
155
ARRAY< Point<3> > * x,
156
ARRAY< Mat<3,2> > * dxdxi);
157
158
void CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, int elnr,
159
ARRAY< Point<3> > * x,
160
ARRAY< Mat<3,3> > * dxdxi);
161
162
};
163
164
165
166
// ----------------------------------------------------------------------------
167
// PolynomialBasis
168
// ----------------------------------------------------------------------------
169
170
class PolynomialBasis
171
{
172
int order;
173
int maxorder;
174
ArrayMem<double,20> f;
175
ArrayMem<double,20> df;
176
ArrayMem<double,20> ddf;
177
178
ArrayMem<double,20> lp;
179
ArrayMem<double,20> dlp;
180
181
inline void CalcLegendrePolynomials (double x);
182
// P_i(x/t) t^i
183
inline void CalcScaledLegendrePolynomials (double x, double t);
184
inline void CalcDLegendrePolynomials (double x);
185
186
public:
187
188
PolynomialBasis ()
189
{ maxorder = -1; };
190
191
~PolynomialBasis ()
192
{};
193
194
void SetOrder (int aorder)
195
{
196
order = aorder;
197
if (order > maxorder)
198
{
199
maxorder = order;
200
f.SetSize(order-1);
201
df.SetSize(order-1);
202
ddf.SetSize(order-1);
203
lp.SetSize(order+1);
204
dlp.SetSize(order);
205
};
206
};
207
208
inline void CalcF (double x);
209
inline void CalcDf (double x);
210
inline void CalcDDf (double x);
211
212
inline void CalcFDf (double x);
213
214
// compute F_i(x/t) t^i
215
inline void CalcFScaled (double x, double t);
216
static inline void CalcFScaled (int p, double x, double t, double * values);
217
218
double GetF (int p) { return f[p-2]; };
219
double GetDf (int p) { return df[p-2]; };
220
double GetDDf (int p) { return ddf[p-2]; };
221
};
222
223
224
225
// ----------------------------------------------------------------------------
226
// BaseFiniteElement
227
// ----------------------------------------------------------------------------
228
229
template <int DIM>
230
class BaseFiniteElement
231
{
232
protected:
233
234
Point<DIM> xi;
235
int elnr;
236
const CurvedElements & curv;
237
const Mesh & mesh;
238
const MeshTopology & top;
239
240
public:
241
242
BaseFiniteElement(const CurvedElements & acurv)
243
: curv(acurv), mesh(curv.GetMesh()), top(mesh.GetTopology())
244
{};
245
246
virtual ~BaseFiniteElement()
247
{};
248
249
void SetElementNumber (int aelnr)
250
{ elnr = aelnr; }; // 1-based arrays in netgen
251
252
virtual void SetReferencePoint (Point<DIM> axi)
253
{ xi = axi; };
254
};
255
256
257
258
// ----------------------------------------------------------------------------
259
// BaseFiniteElement1D
260
// ----------------------------------------------------------------------------
261
262
class BaseFiniteElement1D : public BaseFiniteElement<1>
263
{
264
protected:
265
PolynomialBasis b;
266
267
int vertexnr[2];
268
int edgenr;
269
int edgeorient;
270
int edgeorder;
271
272
int maxedgeorder;
273
274
double vshape[2];
275
double vdshape[2];
276
ArrayMem<double,20> eshape;
277
ArrayMem<double,20> edshape;
278
ArrayMem<double,20> eddshape;
279
280
public:
281
282
BaseFiniteElement1D (const CurvedElements & acurv) : BaseFiniteElement<1>(acurv)
283
{ maxedgeorder = 1; };
284
285
virtual ~BaseFiniteElement1D()
286
{};
287
288
int GetVertexNr (int v)
289
{ return vertexnr[v]; };
290
291
int GetEdgeNr ()
292
{ return edgenr; };
293
294
int GetEdgeOrder ()
295
{ return edgeorder; };
296
297
int GetEdgeOrientation ()
298
{ return edgeorient; };
299
300
void CalcVertexShapes();
301
void CalcEdgeShapes();
302
void CalcEdgeLaplaceShapes();
303
304
double GetVertexShape (int v)
305
{ return vshape[v]; };
306
307
double GetEdgeShape (int index)
308
{ return eshape[index]; };
309
310
double GetVertexDShape (int v)
311
{ return vdshape[v]; };
312
313
double GetEdgeDShape (int index)
314
{ return edshape[index]; };
315
316
double GetEdgeLaplaceShape (int index)
317
{ return eddshape[index]; };
318
319
};
320
321
322
323
324
// ----------------------------------------------------------------------------
325
// FESegm
326
// ----------------------------------------------------------------------------
327
328
class FESegm : public BaseFiniteElement1D
329
{
330
331
public:
332
333
FESegm(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)
334
{};
335
336
virtual ~FESegm()
337
{};
338
339
void SetElementNumber (int aelnr)
340
{
341
BaseFiniteElement<1> :: SetElementNumber (aelnr);
342
Segment s = mesh.LineSegment(elnr);
343
vertexnr[0] = s.p1;
344
vertexnr[1] = s.p2;
345
edgenr = top.GetSegmentEdge(elnr);
346
edgeorient = top.GetSegmentEdgeOrientation(elnr);
347
edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen
348
349
if (edgeorder > maxedgeorder)
350
{
351
maxedgeorder = edgeorder;
352
eshape.SetSize(maxedgeorder-1);
353
edshape.SetSize(maxedgeorder-1);
354
eddshape.SetSize(maxedgeorder-1);
355
}
356
};
357
358
};
359
360
361
362
// ----------------------------------------------------------------------------
363
// FEEdge
364
// ----------------------------------------------------------------------------
365
366
class FEEdge : public BaseFiniteElement1D
367
{
368
369
public:
370
371
FEEdge(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)
372
{};
373
374
virtual ~FEEdge()
375
{};
376
377
void SetElementNumber (int aelnr)
378
{
379
BaseFiniteElement<1> :: SetElementNumber (aelnr);
380
top.GetEdgeVertices (elnr, vertexnr[0], vertexnr[1]);
381
edgenr = elnr;
382
edgeorient = 1;
383
edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen
384
385
if (edgeorder > maxedgeorder)
386
{
387
maxedgeorder = edgeorder;
388
eshape.SetSize(maxedgeorder-1);
389
edshape.SetSize(maxedgeorder-1);
390
eddshape.SetSize(maxedgeorder-1);
391
}
392
};
393
394
};
395
396
397
398
// ----------------------------------------------------------------------------
399
// BaseFiniteElement2D
400
// ----------------------------------------------------------------------------
401
402
class BaseFiniteElement2D : public BaseFiniteElement<2>
403
{
404
protected:
405
406
int nvertices;
407
int nedges;
408
409
int vertexnr[4];
410
int edgenr[4];
411
int edgeorient[4];
412
int edgeorder[4];
413
int facenr;
414
int faceorient;
415
int faceorder;
416
417
int nfaceshapes;
418
419
int maxedgeorder;
420
int maxfaceorder;
421
422
PolynomialBasis b1, b2;
423
424
double vshape[4];
425
Vec<2> vdshape[4];
426
ArrayMem<double,80> eshape;
427
ArrayMem< Vec<2>,80> edshape;
428
ArrayMem<double,400> fshape;
429
ArrayMem<Vec<2>,400> fdshape;
430
ArrayMem<double,400> fddshape;
431
432
virtual void CalcNFaceShapes () = 0;
433
434
public:
435
436
BaseFiniteElement2D (const CurvedElements & acurv) : BaseFiniteElement<2>(acurv)
437
{ maxedgeorder = maxfaceorder = -1; };
438
439
virtual ~BaseFiniteElement2D()
440
{};
441
442
void SetElementNumber (int aelnr);
443
444
virtual void SetVertexSingularity (int v, int exponent) = 0;
445
446
int GetVertexNr (int v)
447
{ return vertexnr[v]; };
448
449
int GetEdgeNr (int e)
450
{ return edgenr[e]; };
451
452
int GetFaceNr ()
453
{ return facenr; };
454
455
int GetEdgeOrder (int e)
456
{ return edgeorder[e]; };
457
458
int GetFaceOrder ()
459
{ return faceorder; }
460
461
int GetNVertices ()
462
{ return nvertices; };
463
464
int GetNEdges ()
465
{ return nedges; };
466
467
int GetNFaceShapes ()
468
{ return nfaceshapes; };
469
470
int IsCurved ()
471
{
472
bool iscurved = 0;
473
int e;
474
475
for (e = 0; e < GetNEdges(); e++)
476
iscurved = iscurved || (GetEdgeOrder(e) > 1);
477
478
return iscurved || (GetFaceOrder() > 1);
479
}
480
481
virtual void CalcVertexShapes() = 0;
482
virtual void CalcEdgeShapes() = 0;
483
virtual void CalcFaceShapes() = 0;
484
485
virtual void CalcFaceLaplaceShapes() = 0;
486
487
double GetVertexShape (int v)
488
{ return vshape[v]; };
489
490
double GetEdgeShape (int index)
491
{ return eshape[index]; };
492
493
double GetFaceShape (int index)
494
{ return fshape[index]; };
495
496
Vec<2> GetVertexDShape (int v)
497
{ return vdshape[v]; };
498
499
Vec<2> GetEdgeDShape (int index)
500
{ return edshape[index]; };
501
502
Vec<2> GetFaceDShape (int index)
503
{ return fdshape[index]; };
504
505
double GetFaceLaplaceShape (int index)
506
{ return fddshape[index]; };
507
};
508
509
510
511
// ----------------------------------------------------------------------------
512
// FETrig
513
// ----------------------------------------------------------------------------
514
515
class FETrig : public BaseFiniteElement2D
516
{
517
Point<3> lambda;
518
Mat<3,2> dlambda;
519
520
const ELEMENT_EDGE * eledge;
521
const ELEMENT_FACE * elface;
522
523
virtual void CalcNFaceShapes ()
524
{ nfaceshapes = ((faceorder-1)*(faceorder-2))/2; };
525
526
public:
527
528
FETrig (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)
529
{
530
nvertices = 3;
531
nedges = 3;
532
eledge = MeshTopology :: GetEdges (TRIG);
533
elface = MeshTopology :: GetFaces (TRIG);
534
};
535
536
virtual ~FETrig()
537
{};
538
539
virtual void SetReferencePoint (Point<2> axi);
540
541
virtual void SetVertexSingularity (int v, int exponent);
542
543
virtual void CalcVertexShapes();
544
virtual void CalcEdgeShapes();
545
virtual void CalcFaceShapes();
546
547
virtual void CalcFaceLaplaceShapes();
548
};
549
550
551
552
// ----------------------------------------------------------------------------
553
// FEQuad
554
// ----------------------------------------------------------------------------
555
556
class FEQuad : public BaseFiniteElement2D
557
{
558
const ELEMENT_FACE * elface;
559
560
virtual void CalcNFaceShapes ()
561
{ nfaceshapes = (faceorder-1)*(faceorder-1); };
562
563
public:
564
565
FEQuad (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)
566
{
567
nvertices = 4;
568
nedges = 4;
569
elface = MeshTopology :: GetFaces (QUAD);
570
};
571
572
virtual ~FEQuad()
573
{};
574
575
virtual void SetVertexSingularity (int /* v */, int /* exponent */)
576
{};
577
578
virtual void CalcVertexShapes();
579
virtual void CalcEdgeShapes();
580
virtual void CalcFaceShapes();
581
582
virtual void CalcFaceLaplaceShapes();
583
};
584
585
586
587
588
// ----------------------------------------------------------------------------
589
// BaseFiniteElement3D
590
// ----------------------------------------------------------------------------
591
592
class BaseFiniteElement3D : public BaseFiniteElement<3>
593
{
594
protected:
595
596
int nvertices;
597
int nedges;
598
int nfaces;
599
600
int vertexnr[8];
601
int edgenr[12];
602
int edgeorient[12];
603
int edgeorder[12];
604
int facenr[6];
605
int faceorient[6];
606
int faceorder[6];
607
int surfacenr[6];
608
// int surfaceorient[6];
609
610
int nfaceshapes[6];
611
612
int maxedgeorder;
613
int maxfaceorder;
614
615
PolynomialBasis b1, b2;
616
617
double vshape[8];
618
Vec<3> vdshape[8];
619
ArrayMem<double,120> eshape;
620
ArrayMem<Vec<3>,120> edshape;
621
ArrayMem<double,300> fshape;
622
ArrayMem<Vec<3>,300> fdshape;
623
624
virtual void CalcNFaceShapes () = 0;
625
626
public:
627
628
int locmaxedgeorder;
629
int locmaxfaceorder;
630
631
BaseFiniteElement3D (const CurvedElements & acurv) : BaseFiniteElement<3>(acurv)
632
{ maxedgeorder = maxfaceorder = -1; };
633
634
void SetElementNumber (int aelnr);
635
636
int GetVertexNr (int v)
637
{ return vertexnr[v]; };
638
639
int GetEdgeNr (int e)
640
{ return edgenr[e]; };
641
642
int GetFaceNr (int f)
643
{ return facenr[f]; };
644
645
int GetNFaceShapes (int f)
646
{ return nfaceshapes[f]; };
647
648
int GetEdgeOrder (int e)
649
{ return edgeorder[e]; };
650
651
int GetFaceOrder (int f)
652
{ return faceorder[f]; };
653
654
int GetNVertices ()
655
{ return nvertices; };
656
657
int GetNEdges ()
658
{ return nedges; };
659
660
int GetNFaces ()
661
{ return nfaces; };
662
663
int IsCurved ()
664
{
665
bool iscurved = 0;
666
int e, f;
667
668
for (e = 0; e < GetNEdges(); e++)
669
iscurved = iscurved || (GetEdgeOrder(e) > 1);
670
671
for (f = 0; f < GetNFaces(); f++)
672
iscurved = iscurved || (GetFaceOrder(f) > 1);
673
674
return iscurved;
675
}
676
677
virtual void CalcVertexShapes() = 0;
678
virtual void CalcVertexShapesOnly()
679
{ CalcVertexShapes(); }
680
681
virtual void CalcEdgeShapes() = 0;
682
virtual void CalcEdgeShapesOnly()
683
{ CalcEdgeShapes(); }
684
685
virtual void CalcFaceShapes() = 0;
686
687
double GetVertexShape (int v)
688
{ return vshape[v]; };
689
690
double GetEdgeShape (int index)
691
{ return eshape[index]; };
692
693
double GetFaceShape (int index)
694
{ return fshape[index]; };
695
696
Vec<3> GetVertexDShape (int v)
697
{ return vdshape[v]; };
698
699
Vec<3> GetEdgeDShape (int index)
700
{ return edshape[index]; };
701
702
Vec<3> GetFaceDShape (int index)
703
{ return fdshape[index]; };
704
};
705
706
707
708
// ----------------------------------------------------------------------------
709
// FETet
710
// ----------------------------------------------------------------------------
711
712
class FETet : public BaseFiniteElement3D
713
{
714
Point<4> lambda;
715
Mat<4,3> dlambda;
716
717
const ELEMENT_EDGE * eledge;
718
const ELEMENT_FACE * elface;
719
720
virtual void CalcNFaceShapes ()
721
{
722
for (int f = 0; f < nfaces; f++)
723
nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
724
};
725
726
public:
727
728
FETet (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
729
{
730
nvertices = 4;
731
nedges = 6;
732
nfaces = 4;
733
eledge = MeshTopology :: GetEdges (TET);
734
elface = MeshTopology :: GetFaces (TET);
735
};
736
737
void SetReferencePoint (Point<3> axi);
738
739
virtual void CalcVertexShapes();
740
virtual void CalcVertexShapesOnly();
741
virtual void CalcEdgeShapes();
742
virtual void CalcEdgeShapesOnly();
743
virtual void CalcFaceShapes();
744
};
745
746
747
748
// ----------------------------------------------------------------------------
749
// FEPrism
750
// ----------------------------------------------------------------------------
751
752
class FEPrism : public BaseFiniteElement3D
753
{
754
Point<4> lambda; // mixed barycentric coordinates
755
Mat<4,3> dlambda;
756
757
const ELEMENT_EDGE * eledge;
758
const ELEMENT_FACE * elface;
759
760
virtual void CalcNFaceShapes ()
761
{
762
int f;
763
for (f = 0; f < 2; f++)
764
nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
765
for (f = 2; f < nfaces; f++)
766
nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
767
};
768
769
public:
770
771
FEPrism (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
772
{
773
nvertices = 6;
774
nedges = 9;
775
nfaces = 5;
776
eledge = MeshTopology :: GetEdges (PRISM);
777
elface = MeshTopology :: GetFaces (PRISM);
778
};
779
780
void SetReferencePoint (Point<3> axi);
781
782
virtual void CalcVertexShapes();
783
virtual void CalcEdgeShapes();
784
virtual void CalcFaceShapes();
785
};
786
787
788
789
790
// ----------------------------------------------------------------------------
791
// FEPyramid
792
// ----------------------------------------------------------------------------
793
794
class FEPyramid : public BaseFiniteElement3D
795
{
796
797
const ELEMENT_EDGE * eledge;
798
const ELEMENT_FACE * elface;
799
800
virtual void CalcNFaceShapes ()
801
{
802
int f;
803
for (f = 0; f < 4; f++)
804
nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;
805
for (f = 4; f < nfaces; f++)
806
nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
807
};
808
809
public:
810
811
FEPyramid (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
812
{
813
nvertices = 5;
814
nedges = 8;
815
nfaces = 5;
816
eledge = MeshTopology :: GetEdges (PYRAMID);
817
elface = MeshTopology :: GetFaces (PYRAMID);
818
};
819
820
void SetReferencePoint (Point<3> axi);
821
822
virtual void CalcVertexShapes();
823
virtual void CalcEdgeShapes();
824
virtual void CalcFaceShapes();
825
};
826
827
828
829
830
// ----------------------------------------------------------------------------
831
// FEHex
832
// ----------------------------------------------------------------------------
833
834
class FEHex : public BaseFiniteElement3D
835
{
836
837
const ELEMENT_EDGE * eledge;
838
const ELEMENT_FACE * elface;
839
840
virtual void CalcNFaceShapes ()
841
{
842
int f;
843
for (f = 0; f < 6; f++)
844
nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);
845
};
846
847
public:
848
849
FEHex (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)
850
{
851
nvertices = 8;
852
nedges = 12;
853
nfaces = 6;
854
eledge = MeshTopology :: GetEdges (HEX);
855
elface = MeshTopology :: GetFaces (HEX);
856
};
857
858
void SetReferencePoint (Point<3> axi);
859
860
virtual void CalcVertexShapes();
861
virtual void CalcEdgeShapes();
862
virtual void CalcFaceShapes();
863
};
864
865
866
867
868
#endif
869
870