@@ -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