Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/curvedelems2.cpp
3206 views
1
2
#include <mystdlib.h>
3
4
#include "meshing.hpp"
5
#ifndef CURVEDELEMS_NEW
6
7
namespace netgen
8
{
9
10
11
// ----------------------------------------------------------------------------
12
// CurvedElements
13
// ----------------------------------------------------------------------------
14
15
CurvedElements :: CurvedElements (const Mesh & amesh)
16
: mesh(amesh), top(mesh.GetTopology())
17
{
18
isHighOrder = 0;
19
nvisualsubsecs = 2;
20
nIntegrationPoints = 10;
21
}
22
23
24
CurvedElements :: ~CurvedElements ()
25
{
26
;
27
}
28
29
30
void CurvedElements :: BuildCurvedElements(Refinement * ref, int polydeg, bool rational)
31
{
32
if (mesh.coarsemesh)
33
{
34
mesh.coarsemesh->GetCurvedElements().BuildCurvedElements (ref, polydeg, rational);
35
SetHighOrder();
36
return;
37
}
38
39
PrintMessage (2, "Build curved elements, order = ", polydeg);
40
41
NgLock lock(const_cast<Mesh&>(mesh).Mutex(), 1);
42
isHighOrder = 0;
43
lock.UnLock();
44
45
const_cast<Mesh &>(mesh).UpdateTopology();
46
47
// set order of edges and faces
48
49
BaseFiniteElement2D * fe2d;
50
51
FEEdge edge (*this);
52
FESegm segm (*this);
53
FETrig trig (*this);
54
FEQuad quad (*this);
55
56
int i, k, e, f;
57
58
ARRAY<bool> edgedone;
59
60
edgedone.SetSize (top.GetNEdges());
61
62
edgeorder.SetSize (top.GetNEdges());
63
faceorder.SetSize (top.GetNFaces());
64
65
int nedgestocurve = mesh.GetNSeg();
66
67
edgedone = 0;
68
edgeorder = 1;
69
faceorder = 1;
70
71
if (polydeg == 1)
72
{
73
isHighOrder = 0;
74
return;
75
}
76
77
78
/*
79
for (e = 0; e < top.GetNEdges(); e++)
80
{
81
edgedone = 0;
82
edgeorder[e] = 1;
83
}
84
85
for (f = 0; f < top.GetNFaces(); f++)
86
faceorder[f] = 1;
87
*/
88
89
for (i = 1; i <= mesh.GetNSeg(); i++)
90
edgeorder[top.GetSegmentEdge(i)-1] = polydeg;
91
92
93
if (mesh.GetDimension() == 3)
94
{
95
for (i = 1; i <= mesh.GetNSE(); i++)
96
{
97
faceorder[top.GetSurfaceElementFace(i)-1] = polydeg;
98
99
Element2d elem = mesh[(SurfaceElementIndex) (i-1)];
100
101
ARRAY<int> edgenrs;
102
top.GetSurfaceElementEdges(i, edgenrs);
103
104
nedgestocurve += top.GetNEdges(elem.GetType());
105
106
for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
107
edgeorder[edgenrs[e]-1] = polydeg;
108
}
109
}
110
111
112
PrintMessage (1, "Building curved elements, order = ", polydeg);
113
PushStatusF ("curving edges");
114
115
116
117
// set edgecoeffs and facecoeffs arrays index and size
118
119
edgecoeffsindex.SetSize (top.GetNEdges()+1);
120
facecoeffsindex.SetSize (top.GetNFaces()+1);
121
122
edgecoeffsindex[0] = 0;
123
for (e = 2; e <= top.GetNEdges()+1; e++)
124
edgecoeffsindex[e-1] = edgecoeffsindex[e-2] + edgeorder[e-2]-1;
125
126
facecoeffsindex[0] = 0;
127
for (f = 2; f <= top.GetNFaces()+1; f++)
128
{
129
switch (top.GetFaceType (f-1))
130
{
131
case TRIG:
132
facecoeffsindex[f-1] = facecoeffsindex[f-2] +
133
(faceorder[f-2]-1)*(faceorder[f-2]-2)/2;
134
break;
135
case QUAD:
136
facecoeffsindex[f-1] = facecoeffsindex[f-2] +
137
(faceorder[f-2]-1)*(faceorder[f-2]-1);
138
break;
139
}
140
}
141
142
edgecoeffs.SetSize(edgecoeffsindex[top.GetNEdges()]);
143
facecoeffs.SetSize(facecoeffsindex[top.GetNFaces()]);
144
145
146
147
// evaluate edge points
148
149
PointGeomInfo newgi; // dummy variable, only needed for function call
150
EdgePointGeomInfo newepgi; // dummy variable, only needed for function call
151
Point3d xexact; // new point to be stored in ARRAY edgepts
152
153
ARRAY<double> xi, wi;
154
ComputeGaussRule(nIntegrationPoints, xi, wi);
155
156
for (i=0; i<edgecoeffsindex[top.GetNEdges()]; i++)
157
edgecoeffs[i] = Vec<3>(0.,0.,0.);
158
159
160
161
162
// all edges belonging to segments
163
164
for (i=0; i<mesh.GetNSeg(); i++)
165
{
166
if (multithread.terminate) return;
167
168
SetThreadPercent( double(100*i/nedgestocurve) );
169
170
int edgenr = top.GetSegmentEdge(i+1);
171
172
if (edgedone[edgenr-1]) continue;
173
174
edgedone[edgenr-1] = 1;
175
176
Segment s = mesh.LineSegment(i+1);
177
178
segm.SetElementNumber (i+1);
179
180
for (k = 2; k <= segm.GetEdgeOrder(); k++)
181
edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] = Vec<3>(0.,0.,0.);
182
183
for (int l = 0; l < nIntegrationPoints; l++)
184
{
185
segm.SetReferencePoint (Point<1>(xi[l]));
186
segm.CalcVertexShapes ();
187
segm.CalcEdgeLaplaceShapes ();
188
189
Point<3> xv(0,0,0);
190
191
for (int v = 0; v < 2; v++)
192
xv = xv + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
193
194
double secpoint = xi[l];
195
196
ref->PointBetween (mesh.Point(segm.GetVertexNr(1)),
197
mesh.Point(segm.GetVertexNr(0)), secpoint,
198
s.surfnr2, s.surfnr1,
199
s.epgeominfo[1], s.epgeominfo[0],
200
xexact, newepgi);
201
202
for (int k = 2; k <= segm.GetEdgeOrder(); k++)
203
edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] -=
204
wi[l] * segm.GetEdgeLaplaceShape(k-2) * Vec<3>(xexact - xv);
205
206
}
207
208
for (k = 2; k <= segm.GetEdgeOrder(); k++)
209
edgecoeffs[edgecoeffsindex[edgenr-1]+k-2] =
210
(2.0*(k-1.0)+1.0)*edgecoeffs[edgecoeffsindex[edgenr-1]+k-2];
211
212
}
213
214
215
216
217
218
// all edges belonging to surface elements
219
220
if (mesh.GetDimension() == 3)
221
{
222
int nedgescurved = mesh.GetNSeg();
223
for (int i=0; i<mesh.GetNSE(); i++)
224
{
225
if (multithread.terminate) return;
226
227
// SetThreadPercent( double(100*(mesh.GetNSeg()+i)/nedgestocurve) );
228
Element2d elem = mesh[(SurfaceElementIndex) i];
229
const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(elem.GetType());
230
231
ARRAY<int> edgenrs;
232
ARRAY<int> orient;
233
top.GetSurfaceElementEdges(i+1, edgenrs);
234
top.GetSurfaceElementEdgeOrientations(i+1, orient);
235
236
for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
237
{
238
// cout << "e = " << e << "/" << top.GetNEdges(elem.GetType()) << endl;
239
240
nedgescurved++;
241
242
if (edgedone[edgenrs[e]-1]) continue;
243
244
edgedone[edgenrs[e]-1] = 1;
245
246
SetThreadPercent( double(100*(nedgescurved)/nedgestocurve) );
247
248
edge.SetElementNumber (edgenrs[e]);
249
250
for (k = 2; k <= edge.GetEdgeOrder(); k++)
251
edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] = Vec<3>(0.,0.,0.);
252
253
for (int l = 0; l < nIntegrationPoints; l++)
254
{
255
// cout << "." << flush;
256
edge.SetReferencePoint (Point<1>(xi[l]));
257
edge.CalcVertexShapes ();
258
edge.CalcEdgeLaplaceShapes ();
259
260
Point<3> xv(0,0,0);
261
for (int v = 0; v < 2; v++)
262
xv = xv + edge.GetVertexShape(v) * mesh.Point(edge.GetVertexNr(v));
263
264
double secpoint = xi[l];
265
266
if (orient[e] == 1)
267
ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
268
mesh.Point(edge.GetVertexNr(0)), secpoint,
269
mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
270
elem.GeomInfoPi(eledges[e][1]),
271
elem.GeomInfoPi(eledges[e][0]),
272
xexact, newgi);
273
else
274
ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
275
mesh.Point(edge.GetVertexNr(0)), secpoint,
276
mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
277
elem.GeomInfoPi(eledges[e][0]),
278
elem.GeomInfoPi(eledges[e][1]),
279
xexact, newgi);
280
281
for (k = 2; k <= edge.GetEdgeOrder(); k++)
282
edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] -=
283
wi[l] * edge.GetEdgeLaplaceShape(k-2) * Vec<3>(xexact - xv);
284
}
285
// cout << endl;
286
for (k = 2; k <= edge.GetEdgeOrder(); k++)
287
edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2] =
288
(2.0*(k-1.0)+1.0)*edgecoeffs[edgecoeffsindex[edgenrs[e]-1]+k-2];
289
290
}
291
}
292
}
293
294
295
296
297
/*
298
299
// L2-Projection for edges
300
301
302
cout << "WARNING: L2-Projection for edges" << endl;
303
304
if (mesh.GetDimension() == 3)
305
{
306
for (int i=0; i<mesh.GetNSE(); i++)
307
{
308
Element2d elem = mesh[(SurfaceElementIndex) i];
309
const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(elem.GetType());
310
311
ARRAY<int> edgenrs;
312
ARRAY<int> orient;
313
top.GetSurfaceElementEdges(i+1, edgenrs);
314
top.GetSurfaceElementEdgeOrientations(i+1, orient);
315
316
for (int e = 0; e < top.GetNEdges(elem.GetType()); e++)
317
{
318
edge.SetElementNumber (edgenrs[e]);
319
320
int npoints = edge.GetEdgeOrder()-1;
321
322
if (npoints == 0) continue;
323
324
DenseMatrix mat(npoints);
325
DenseMatrix inv(npoints);
326
Vector vec[3];
327
328
for (int k = 0; k < 3; k++)
329
{
330
vec[k].SetSize(npoints);
331
for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
332
}
333
334
for (int l = 0; l < nIntegrationPoints; l++)
335
{
336
double w = wi[l];
337
338
edge.SetReferencePoint (Point<1>(xi[l]));
339
edge.CalcVertexShapes ();
340
edge.CalcEdgeShapes ();
341
342
for (int n = 0; n < npoints; n++)
343
for (int m = 0; m < npoints; m++)
344
mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
345
edge.GetEdgeShape(n) * edge.GetEdgeShape(m) * w);
346
347
Point<3> xv(0,0,0);
348
for (int v = 0; v < 2; v++)
349
xv = xv + edge.GetVertexShape(v) * mesh.Point(edge.GetVertexNr(v));
350
351
double secpoint = xi[l];
352
353
ref->PointBetween (mesh.Point(edge.GetVertexNr(1)),
354
mesh.Point(edge.GetVertexNr(0)), secpoint,
355
mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(),
356
elem.GeomInfoPi(eledges[e][1]),
357
elem.GeomInfoPi(eledges[e][0]),
358
xexact, newgi);
359
360
for (int k = 2; k <= edge.GetEdgeOrder(); k++)
361
{
362
vec[0].Set(k-1, vec[0].Get(k-1) + Vec<3>(xexact - xv)(0)*edge.GetEdgeShape(k-2)*w );
363
vec[1].Set(k-1, vec[1].Get(k-1) + Vec<3>(xexact - xv)(1)*edge.GetEdgeShape(k-2)*w );
364
vec[2].Set(k-1, vec[2].Get(k-1) + Vec<3>(xexact - xv)(2)*edge.GetEdgeShape(k-2)*w );
365
}
366
367
}
368
369
370
CalcInverse(mat,inv);
371
372
Vector a0, a1, a2;
373
374
a0 = inv*vec[0];
375
a1 = inv*vec[1];
376
a2 = inv*vec[2];
377
378
int index = edgecoeffsindex[edge.GetEdgeNr()-1];
379
380
for (int n = 0; n < npoints; n++, index++)
381
edgecoeffs[index] = Vec<3>(a0(n+1), a1(n+1), a2(n+1));
382
}
383
}
384
}
385
386
387
for (int i=0; i<mesh.GetNSeg(); i++)
388
{
389
int edgenr = top.GetSegmentEdge(i+1);
390
391
Segment s = mesh.LineSegment(i+1);
392
393
segm.SetElementNumber (i+1);
394
395
int npoints = segm.GetEdgeOrder()-1;
396
397
if (npoints == 0) continue;
398
399
DenseMatrix mat(npoints);
400
DenseMatrix inv(npoints);
401
Vector vec[3];
402
403
for (int k = 0; k < 3; k++)
404
{
405
vec[k].SetSize(npoints);
406
for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
407
}
408
409
for (int l = 0; l < nIntegrationPoints; l++)
410
{
411
double w = wi[l];
412
413
segm.SetReferencePoint (Point<1>(xi[l]));
414
segm.CalcVertexShapes ();
415
segm.CalcEdgeShapes ();
416
417
for (int n = 0; n < npoints; n++)
418
for (int m = 0; m < npoints; m++)
419
mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
420
segm.GetEdgeShape(n) * segm.GetEdgeShape(m) * w);
421
422
Point<3> xv(0,0,0);
423
for (int v = 0; v < 2; v++)
424
xv = xv + segm.GetVertexShape(v) * mesh.Point(segm.GetVertexNr(v));
425
426
double secpoint = xi[l];
427
428
if (segm.GetEdgeOrientation() == -1) secpoint = 1. - secpoint; // reverse orientation
429
430
ref->PointBetween (mesh.Point(segm.GetVertexNr(1)),
431
mesh.Point(segm.GetVertexNr(0)), secpoint,
432
s.surfnr2, s.surfnr1,
433
s.epgeominfo[1], s.epgeominfo[0],
434
xexact, newepgi);
435
436
for (int k = 2; k <= segm.GetEdgeOrder(); k++)
437
{
438
vec[0].Set(k-1, vec[0].Get(k-1) + Vec<3>(xexact - xv)(0)*segm.GetEdgeShape(k-2)*w );
439
vec[1].Set(k-1, vec[1].Get(k-1) + Vec<3>(xexact - xv)(1)*segm.GetEdgeShape(k-2)*w );
440
vec[2].Set(k-1, vec[2].Get(k-1) + Vec<3>(xexact - xv)(2)*segm.GetEdgeShape(k-2)*w );
441
}
442
443
}
444
445
446
CalcInverse(mat,inv);
447
448
Vector a0, a1, a2;
449
450
a0 = inv*vec[0];
451
a1 = inv*vec[1];
452
a2 = inv*vec[2];
453
454
int index = edgecoeffsindex[segm.GetEdgeNr()-1];
455
456
for (int n = 0; n < npoints; n++, index++)
457
edgecoeffs[index] = Vec<3>(a0(n+1), a1(n+1), a2(n+1));
458
459
460
461
}
462
463
*/
464
465
466
467
468
469
// evaluate face points
470
471
if (mesh.GetDimension() == 3)
472
{
473
PopStatus ();
474
PushStatusF ("curving faces");
475
476
for (int j=0; j<facecoeffsindex[top.GetNFaces()]; j++)
477
facecoeffs[j] = Vec<3>(0.,0.,0.);
478
479
for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++) // for all surface elements
480
{
481
if (multithread.terminate) return;
482
483
SetThreadPercent( double(100*i/mesh.GetNSE()) );
484
485
Element2d elem = mesh[i];
486
487
if (elem.GetType() == TRIG)
488
fe2d = &trig;
489
else
490
fe2d = &quad;
491
492
fe2d->SetElementNumber (i+1);
493
494
int npoints = fe2d->GetNFaceShapes();
495
496
if (npoints == 0) continue;
497
498
DenseMatrix mat(npoints);
499
DenseMatrix inv(npoints);
500
Vector vec[3];
501
502
for (int k = 0; k < 3; k++)
503
{
504
vec[k].SetSize(npoints);
505
for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
506
}
507
508
for (int j = 0; j < nIntegrationPoints; j++)
509
{
510
for (int k = 0; k < nIntegrationPoints; k++)
511
{
512
double w;
513
Point<2> xr;
514
515
if (elem.GetType() == TRIG)
516
{
517
w = wi[j]*wi[k]*(1-xi[j]);
518
xr = Point<2> (xi[j], xi[k]*(1-xi[j]));
519
}
520
else
521
{
522
w = wi[j]*wi[k];
523
xr = Point<2> (xi[j], xi[k]);
524
}
525
526
fe2d->SetReferencePoint (xr);
527
fe2d->CalcFaceShapes ();
528
fe2d->CalcVertexShapes ();
529
fe2d->CalcEdgeShapes ();
530
fe2d->CalcFaceLaplaceShapes ();
531
532
// integration over the product of the gradients of the face shapes
533
534
for (int n = 0; n < npoints; n++)
535
for (int m = 0; m < npoints; m++)
536
mat.Set(n+1, m+1,
537
mat.Get(n+1,m+1) +
538
fe2d->GetFaceDShape(n)*fe2d->GetFaceDShape(m)*w);
539
540
// integration over the difference between the exact geometry and the one
541
// defined by vertex and edge shape functions times face shape
542
543
// double giu = 0, giv = 0;
544
PointGeomInfo gi;
545
gi.trignum = elem.GeomInfoPi(1).trignum;
546
gi.u = 0.0;
547
gi.v = 0.0;
548
Point<3> xve(0.,0.,0.);
549
550
// vertex shape functions
551
for (int v = 0; v < fe2d->GetNVertices(); v++)
552
{
553
xve = xve + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
554
gi.u += fe2d->GetVertexShape(v) * elem.GeomInfoPi(v+1).u;
555
gi.v += fe2d->GetVertexShape(v) * elem.GeomInfoPi(v+1).v;
556
}
557
558
// edge shape functions
559
int index = 0;
560
for (int e = 0; e < fe2d->GetNEdges(); e++)
561
{
562
int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
563
for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
564
xve = xve + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
565
}
566
567
// exact point
568
569
Point<3> xexact = xve;
570
ref->ProjectToSurface (xexact, mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr(), gi);
571
572
Vec<3> v2 = w*(Vec<3>(xexact)-Vec<3>(xve));
573
574
for (int k = 0; k < 3; k++)
575
for (int n = 0; n < npoints; n++)
576
vec[k].Set(n+1, vec[k].Get(n+1) - fe2d->GetFaceLaplaceShape(n)*v2(k));
577
}
578
}
579
580
CalcInverse(mat,inv);
581
582
Vector a0(npoints), a1(npoints), a2(npoints);
583
584
/*
585
a0 = inv*vec[0];
586
a1 = inv*vec[1];
587
a2 = inv*vec[2];
588
*/
589
inv.Mult (vec[0], a0);
590
inv.Mult (vec[1], a1);
591
inv.Mult (vec[2], a2);
592
593
int index = facecoeffsindex[fe2d->GetFaceNr()-1];
594
595
for (int n = 0; n < npoints; n++, index++)
596
facecoeffs[index] = Vec<3>(a0.Elem(n+1), a1.Elem(n+1), a2.Elem(n+1));
597
}
598
}
599
600
601
602
603
/*
604
cout << "WARNING: L2-Projection for faces" << endl;
605
606
// evaluate face points
607
608
if (mesh.GetDimension() == 3)
609
{
610
for (int i=0; i<facecoeffsindex[top.GetNFaces()]; i++)
611
facecoeffs[i] = Vec<3>(0.,0.,0.);
612
613
for (SurfaceElementIndex i = 0; i < mesh.GetNSE(); i++) // for all surface elements
614
{
615
Element2d elem = mesh[i];
616
617
if (elem.GetType() == TRIG)
618
fe2d = &trig;
619
else
620
fe2d = &quad;
621
622
fe2d->SetElementNumber (i+1);
623
624
int npoints = fe2d->GetNFaceShapes();
625
626
if (npoints == 0) continue;
627
628
DenseMatrix mat(npoints);
629
DenseMatrix inv(npoints);
630
Vector vec[3];
631
632
for (int k = 0; k < 3; k++)
633
{
634
vec[k].SetSize(npoints);
635
for (int n = 1; n <= npoints; n++) vec[k].Set(n, 0.);
636
}
637
638
for (int j = 0; j < nIntegrationPoints; j++)
639
{
640
for (int k = 0; k < nIntegrationPoints; k++)
641
{
642
double w;
643
Point<2> xr;
644
645
if (elem.GetType() == TRIG)
646
{
647
w = wi[j]*wi[k]*(1-xi[j]);
648
xr = Point<2> (xi[j], xi[k]*(1-xi[j]));
649
}
650
else
651
{
652
w = wi[j]*wi[k];
653
xr = Point<2> (xi[j], xi[k]);
654
}
655
656
fe2d->SetReferencePoint (xr);
657
// fe2d->CalcFaceDShape (false, true);
658
fe2d->CalcFaceShapes ();
659
660
// integration over the product of the gradients of the face shapes
661
662
for (int n = 0; n < npoints; n++)
663
for (int m = 0; m < npoints; m++)
664
mat.Set(n+1, m+1, mat.Get(n+1,m+1) +
665
fe2d->GetFaceShape(n)*fe2d->GetFaceShape(m)*w);
666
667
// integration over the difference between the exact geometry and the one
668
// defined by vertex and edge shape functions times face shape
669
670
Point<3> xve(0.,0.,0.);
671
672
// vertex shape functions
673
fe2d->CalcVertexShapes ();
674
// fe2d->CalcVertexShape (true, false);
675
for (int v = 0; v < fe2d->GetNVertices(); v++)
676
xve = xve + fe2d->GetVertexShape(v) * mesh.Point(fe2d->GetVertexNr(v));
677
678
// edge shape functions
679
// fe2d->CalcEdgeShape (true, false);
680
fe2d->CalcEdgeShapes ();
681
682
int index = 0;
683
for (int e = 0; e < fe2d->GetNEdges(); e++)
684
{
685
int gindex = edgecoeffsindex[fe2d->GetEdgeNr(e)-1];
686
687
for (int k = 2; k <= fe2d->GetEdgeOrder(e); k++, index++, gindex++)
688
xve = xve + fe2d->GetEdgeShape(index) * edgecoeffs[gindex];
689
}
690
691
// exact point
692
693
Point<3> xexact = xve;
694
ref->ProjectToSurface (xexact, mesh.GetFaceDescriptor(elem.GetIndex()).SurfNr());
695
696
Vec<3> v = w*(Vec<3>(xexact)-Vec<3>(xve));
697
698
fe2d->CalcFaceLaplaceShapes ();
699
700
for (int k = 0; k < 3; k++)
701
for (int n = 0; n < npoints; n++)
702
vec[k].Set(n+1, vec[k].Get(n+1) + fe2d->GetFaceShape(n)*v(k));
703
}
704
}
705
706
CalcInverse(mat,inv);
707
708
Vector a0, a1, a2;
709
710
a0 = inv*vec[0];
711
a1 = inv*vec[1];
712
a2 = inv*vec[2];
713
714
int index = facecoeffsindex[fe2d->GetFaceNr()-1];
715
716
for (int n = 0; n < npoints; n++, index++)
717
facecoeffs[index] = Vec<3>(a0(n+1), a1(n+1), a2(n+1));
718
}
719
}
720
*/
721
722
723
PrintMessage (5, "reducing order");
724
725
for (e = 0; e < top.GetNEdges(); e++)
726
if (edgeorder[e] > 1)
727
{
728
int i;
729
double maxcoeff = 0.;
730
731
for (i = edgecoeffsindex[e]; i < edgecoeffsindex[e+1]; i++)
732
maxcoeff = max2 (maxcoeff, edgecoeffs[i].Length());
733
734
if (maxcoeff < 1e-12) edgeorder[e] = 1;
735
}
736
737
for (f = 0; f < top.GetNFaces(); f++)
738
if (faceorder[f] > 1)
739
{
740
int i;
741
double maxcoeff = 0.;
742
743
for (i = facecoeffsindex[f]; i < facecoeffsindex[f+1]; i++)
744
maxcoeff = max (maxcoeff, facecoeffs[i].Length());
745
746
if (maxcoeff < 1e-12) faceorder[f] = 1;
747
}
748
749
isHighOrder = 1; // true
750
751
PrintMessage(1, "done");
752
PopStatus();
753
// cout << "finished" << endl;
754
}
755
756
} // namespace netgen
757
758
#endif
759
760