Skip to content

Commit 751ffe4

Browse files
committed
Generalise EDGE3 for arbitrary order Lagrange
1 parent 0a01621 commit 751ffe4

File tree

2 files changed

+39
-74
lines changed

2 files changed

+39
-74
lines changed

src/fe/fe_interface.C

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2149,9 +2149,10 @@ unsigned int FEInterface::max_order(const FEType & fe_t,
21492149
switch (el_t)
21502150
{
21512151
case EDGE2:
2152-
case EDGE3:
21532152
case EDGE4:
21542153
return 3;
2154+
case EDGE3:
2155+
return unlimited;
21552156
case TRI3:
21562157
case TRISHELL3:
21572158
case C0POLYGON:

src/fe/fe_lagrange.C

Lines changed: 37 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,22 @@ void lagrange_nodal_soln(const Elem * elem,
5353

5454
nodal_soln.resize(n_nodes);
5555

56+
switch (type)
57+
{
58+
case EDGE3:
59+
{
60+
nodal_soln[0] = elem_soln[0];
61+
nodal_soln[1] = elem_soln[1];
62+
nodal_soln[2] = (totalorder % 2) ? 0 : elem_soln[totalorder / 2 + 1];
63+
if (totalorder % 2)
64+
for (unsigned i = 0; i < totalorder + 1; i++)
65+
nodal_soln[2] += elem_soln[i] * FE<1,LAGRANGE>::shape(type, totalorder, i, 0);
5666

67+
return;
68+
}
69+
default:
70+
;
71+
}
5772

5873
switch (totalorder)
5974
{
@@ -62,18 +77,6 @@ void lagrange_nodal_soln(const Elem * elem,
6277
{
6378
switch (type)
6479
{
65-
case EDGE3:
66-
{
67-
libmesh_assert_equal_to (elem_soln.size(), 2);
68-
libmesh_assert_equal_to (nodal_soln.size(), 3);
69-
70-
nodal_soln[0] = elem_soln[0];
71-
nodal_soln[1] = elem_soln[1];
72-
nodal_soln[2] = .5*(elem_soln[0] + elem_soln[1]);
73-
74-
return;
75-
}
76-
7780
case EDGE4:
7881
{
7982
libmesh_assert_equal_to (elem_soln.size(), 2);
@@ -312,21 +315,6 @@ void lagrange_nodal_soln(const Elem * elem,
312315
{
313316
switch (type)
314317
{
315-
case EDGE4:
316-
{
317-
libmesh_assert_equal_to (elem_soln.size(), 3);
318-
libmesh_assert_equal_to (nodal_soln.size(), 4);
319-
320-
// Project quadratic solution onto cubic element nodes
321-
nodal_soln[0] = elem_soln[0];
322-
nodal_soln[1] = elem_soln[1];
323-
nodal_soln[2] = (2.*elem_soln[0] - elem_soln[1] +
324-
8.*elem_soln[2])/9.;
325-
nodal_soln[3] = (-elem_soln[0] + 2.*elem_soln[1] +
326-
8.*elem_soln[2])/9.;
327-
return;
328-
}
329-
330318
case TRI7:
331319
{
332320
libmesh_assert_equal_to (elem_soln.size(), 6);
@@ -434,31 +422,25 @@ unsigned int lagrange_n_dofs(const ElemType t, const Elem * e, const Order o)
434422
{
435423
libmesh_assert(!e || e->type() == t);
436424

437-
switch (o)
425+
switch (t)
438426
{
439-
// lagrange can only be constant on a single node
440-
case CONSTANT:
441-
{
442-
switch (t)
443-
{
444-
case NODEELEM:
445-
return 1;
446-
447-
default:
448-
libmesh_error_msg("ERROR: Bad ElemType = " << Utility::enum_to_string(t) << " for " << Utility::enum_to_string(o) << " order approximation!");
449-
}
450-
}
427+
case NODEELEM:
428+
return 1;
429+
case EDGE3:
430+
libmesh_error_msg_if(o == CONSTANT, "ERROR: Bad ElemType = " << Utility::enum_to_string(t) << " for " << Utility::enum_to_string(o) << " order approximation!");
431+
return o + 1;
432+
default:
433+
;
434+
}
451435

436+
switch (o)
437+
{
452438
// linear Lagrange shape functions
453439
case FIRST:
454440
{
455441
switch (t)
456442
{
457-
case NODEELEM:
458-
return 1;
459-
460443
case EDGE2:
461-
case EDGE3:
462444
case EDGE4:
463445
return 2;
464446

@@ -522,12 +504,6 @@ unsigned int lagrange_n_dofs(const ElemType t, const Elem * e, const Order o)
522504
{
523505
switch (t)
524506
{
525-
case NODEELEM:
526-
return 1;
527-
528-
case EDGE3:
529-
return 3;
530-
531507
case TRI6:
532508
case TRI7:
533509
return 6;
@@ -577,9 +553,6 @@ unsigned int lagrange_n_dofs(const ElemType t, const Elem * e, const Order o)
577553
{
578554
switch (t)
579555
{
580-
case NODEELEM:
581-
return 1;
582-
583556
case EDGE4:
584557
return 4;
585558

@@ -617,31 +590,25 @@ unsigned int lagrange_n_dofs_at_node(const ElemType t,
617590
const Order o,
618591
const unsigned int n)
619592
{
620-
switch (o)
593+
switch (t)
621594
{
622-
// lagrange can only be constant on a single node
623-
case CONSTANT:
624-
{
625-
switch (t)
626-
{
627-
case NODEELEM:
628-
return 1;
629-
630-
default:
631-
libmesh_error_msg("ERROR: Bad ElemType = " << Utility::enum_to_string(t) << " for " << Utility::enum_to_string(o) << " order approximation!");
632-
}
633-
}
595+
case NODEELEM:
596+
return 1;
597+
case EDGE3:
598+
libmesh_error_msg_if(o == CONSTANT, "ERROR: Bad ElemType = " << Utility::enum_to_string(t) << " for " << Utility::enum_to_string(o) << " order approximation!");
599+
return n < 2 ? 1 : o - 1;
600+
default:
601+
;
602+
}
634603

604+
switch (o)
605+
{
635606
// linear Lagrange shape functions
636607
case FIRST:
637608
{
638609
switch (t)
639610
{
640-
case NODEELEM:
641-
return 1;
642-
643611
case EDGE2:
644-
case EDGE3:
645612
case EDGE4:
646613
{
647614
switch (n)
@@ -790,8 +757,6 @@ unsigned int lagrange_n_dofs_at_node(const ElemType t,
790757
switch (t)
791758
{
792759
// quadratic lagrange has one dof at each node
793-
case NODEELEM:
794-
case EDGE3:
795760
case TRI6:
796761
case QUAD8:
797762
case QUADSHELL8:
@@ -831,7 +796,6 @@ unsigned int lagrange_n_dofs_at_node(const ElemType t,
831796
{
832797
switch (t)
833798
{
834-
case NODEELEM:
835799
case EDGE4:
836800
case PRISM20:
837801
case PRISM21:

0 commit comments

Comments
 (0)