diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index a25ff7b81ff13a3dcf7d0da2d69b4dfdbc23a5a1..4db3fe1b5cd8c0b2b1d03b4589b0d55822c16107 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.306 2004-05-25 04:10:03 geuzaine Exp $ +// $Id: GUI.cpp,v 1.307 2004-05-27 06:23:48 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -3059,11 +3059,11 @@ void GUI::create_geometry_context_window(int num) { g[2] = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Translation"); context_geometry_input[6] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "X component"); - context_geometry_input[6]->value("1.0"); + context_geometry_input[6]->value("0.0"); context_geometry_input[7] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Y component"); context_geometry_input[7]->value("0.0"); context_geometry_input[8] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z component"); - context_geometry_input[8]->value("0.0"); + context_geometry_input[8]->value("1.0"); for(i = 6; i < 9; i++) { context_geometry_input[i]->align(FL_ALIGN_RIGHT); } diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp index 1b41fee5460ba4a65a94276e0637ad143cc96119..0c91c78655331cba6760cd454287323edfbe4f43 100644 --- a/Graphics/Mesh.cpp +++ b/Graphics/Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Mesh.cpp,v 1.85 2004-05-26 23:53:37 geuzaine Exp $ +// $Id: Mesh.cpp,v 1.86 2004-05-27 06:23:48 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -1010,35 +1010,23 @@ void Draw_Mesh_Hexahedron(void *a, void *b) gl2psEnable(GL2PS_LINE_STIPPLE); glBegin(GL_LINES); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[0]->Pos.X + h->V[1]->Pos.X + h->V[5]->Pos.X + h->V[4]->Pos.X) / 4., - (h->V[0]->Pos.Y + h->V[1]->Pos.Y + h->V[5]->Pos.Y + h->V[4]->Pos.Y) / 4., - (h->V[0]->Pos.Z + h->V[1]->Pos.Z + h->V[5]->Pos.Z + h->V[4]->Pos.Z) / 4.); + glVertex3d((X[0] + X[1] + X[5] + X[4]) / 4., (Y[0] + Y[1] + Y[5] + Y[4]) / 4., + (Z[0] + Z[1] + Z[5] + Z[4]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[0]->Pos.X + h->V[3]->Pos.X + h->V[2]->Pos.X + h->V[1]->Pos.X) / 4., - (h->V[0]->Pos.Y + h->V[3]->Pos.Y + h->V[2]->Pos.Y + h->V[1]->Pos.Y) / 4., - (h->V[0]->Pos.Z + h->V[3]->Pos.Z + h->V[2]->Pos.Z + h->V[1]->Pos.Z) / 4.); + glVertex3d((X[0] + X[3] + X[2] + X[1]) / 4., (Y[0] + Y[3] + Y[2] + Y[1]) / 4., + (Z[0] + Z[3] + Z[2] + Z[1]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[0]->Pos.X + h->V[4]->Pos.X + h->V[7]->Pos.X + h->V[3]->Pos.X) / 4., - (h->V[0]->Pos.Y + h->V[4]->Pos.Y + h->V[7]->Pos.Y + h->V[3]->Pos.Y) / 4., - (h->V[0]->Pos.Z + h->V[4]->Pos.Z + h->V[7]->Pos.Z + h->V[3]->Pos.Z) / 4.); + glVertex3d((X[0] + X[4] + X[7] + X[3]) / 4., (Y[0] + Y[4] + Y[7] + Y[3]) / 4., + (Z[0] + Z[4] + Z[7] + Z[3]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[1]->Pos.X + h->V[2]->Pos.X + h->V[6]->Pos.X + h->V[5]->Pos.X) / 4., - (h->V[1]->Pos.Y + h->V[2]->Pos.Y + h->V[6]->Pos.Y + h->V[5]->Pos.Y) / 4., - (h->V[1]->Pos.Z + h->V[2]->Pos.Z + h->V[6]->Pos.Z + h->V[5]->Pos.Z) / 4.); + glVertex3d((X[1] + X[2] + X[6] + X[5]) / 4., (Y[1] + Y[2] + Y[6] + Y[5]) / 4., + (Z[1] + Z[2] + Z[6] + Z[5]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[2]->Pos.X + h->V[3]->Pos.X + h->V[7]->Pos.X + h->V[6]->Pos.X) / 4., - (h->V[2]->Pos.Y + h->V[3]->Pos.Y + h->V[7]->Pos.Y + h->V[6]->Pos.Y) / 4., - (h->V[2]->Pos.Z + h->V[3]->Pos.Z + h->V[7]->Pos.Z + h->V[6]->Pos.Z) / 4.); + glVertex3d((X[2] + X[3] + X[7] + X[6]) / 4., (Y[2] + Y[3] + Y[7] + Y[6]) / 4., + (Z[2] + Z[3] + Z[7] + Z[6]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((h->V[4]->Pos.X + h->V[5]->Pos.X + h->V[6]->Pos.X + h->V[7]->Pos.X) / 4., - (h->V[4]->Pos.Y + h->V[5]->Pos.Y + h->V[6]->Pos.Y + h->V[7]->Pos.Y) / 4., - (h->V[4]->Pos.Z + h->V[5]->Pos.Z + h->V[6]->Pos.Z + h->V[7]->Pos.Z) / 4.); + glVertex3d((X[4] + X[5] + X[6] + X[7]) / 4., (Y[4] + Y[5] + Y[6] + Y[7]) / 4., + (Z[4] + Z[5] + Z[6] + Z[7]) / 4.); glEnd(); glDisable(GL_LINE_STIPPLE); gl2psDisable(GL2PS_LINE_STIPPLE); @@ -1182,30 +1170,20 @@ void Draw_Mesh_Prism(void *a, void *b) gl2psEnable(GL2PS_LINE_STIPPLE); glBegin(GL_LINES); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((p->V[0]->Pos.X + p->V[2]->Pos.X + p->V[1]->Pos.X) / 3., - (p->V[0]->Pos.Y + p->V[2]->Pos.Y + p->V[1]->Pos.Y) / 3., - (p->V[0]->Pos.Z + p->V[2]->Pos.Z + p->V[1]->Pos.Z) / 3.); + glVertex3d((X[0] + X[2] + X[1]) / 3., (Y[0] + Y[2] + Y[1]) / 3., + (Z[0] + Z[2] + Z[1]) / 3.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((p->V[3]->Pos.X + p->V[4]->Pos.X + p->V[5]->Pos.X) / 3., - (p->V[3]->Pos.Y + p->V[4]->Pos.Y + p->V[5]->Pos.Y) / 3., - (p->V[3]->Pos.Z + p->V[4]->Pos.Z + p->V[5]->Pos.Z) / 3.); + glVertex3d((X[3] + X[4] + X[5]) / 3., (Y[3] + Y[4] + Y[5]) / 3., + (Z[3] + Z[4] + Z[5]) / 3.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((p->V[0]->Pos.X + p->V[1]->Pos.X + p->V[4]->Pos.X + p->V[3]->Pos.X) / 4., - (p->V[0]->Pos.Y + p->V[1]->Pos.Y + p->V[4]->Pos.Y + p->V[3]->Pos.Y) / 4., - (p->V[0]->Pos.Z + p->V[1]->Pos.Z + p->V[4]->Pos.Z + p->V[3]->Pos.Z) / 4.); + glVertex3d((X[0] + X[1] + X[4] + X[3]) / 4., (Y[0] + Y[1] + Y[4] + Y[3]) / 4., + (Z[0] + Z[1] + Z[4] + Z[3]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((p->V[0]->Pos.X + p->V[3]->Pos.X + p->V[5]->Pos.X + p->V[2]->Pos.X) / 4., - (p->V[0]->Pos.Y + p->V[3]->Pos.Y + p->V[5]->Pos.Y + p->V[2]->Pos.Y) / 4., - (p->V[0]->Pos.Z + p->V[3]->Pos.Z + p->V[5]->Pos.Z + p->V[2]->Pos.Z) / 4.); + glVertex3d((X[0] + X[3] + X[5] + X[2]) / 4., (Y[0] + Y[3] + Y[5] + Y[2]) / 4., + (Z[0] + Z[3] + Z[5] + Z[2]) / 4.); glVertex3d(Xc, Yc, Zc); - glVertex3d - ((p->V[1]->Pos.X + p->V[2]->Pos.X + p->V[5]->Pos.X + p->V[4]->Pos.X) / 4., - (p->V[1]->Pos.Y + p->V[2]->Pos.Y + p->V[5]->Pos.Y + p->V[4]->Pos.Y) / 4., - (p->V[1]->Pos.Z + p->V[2]->Pos.Z + p->V[5]->Pos.Z + p->V[4]->Pos.Z) / 4.); + glVertex3d((X[1] + X[2] + X[5] + X[4]) / 4., (Y[1] + Y[2] + Y[5] + Y[4]) / 4., + (Z[1] + Z[2] + Z[5] + Z[4]) / 4.); glEnd(); glDisable(GL_LINE_STIPPLE); gl2psDisable(GL2PS_LINE_STIPPLE); diff --git a/Mesh/Print_Mesh.cpp b/Mesh/Print_Mesh.cpp index 31fd109a647883541539f64890bb682b6323c45e..b4ce1aec569ccd4536107667aa225e29f1f27d0f 100644 --- a/Mesh/Print_Mesh.cpp +++ b/Mesh/Print_Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Print_Mesh.cpp,v 1.52 2004-05-25 23:16:26 geuzaine Exp $ +// $Id: Print_Mesh.cpp,v 1.53 2004-05-27 06:23:48 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -253,7 +253,7 @@ static void _msh_print_hexahedron(void *a, void *b) nbn = 8; if(h->VSUP) { type = HEXAHEDRON_2; - nbs = 12 + 6; + nbs = 12 + 6 + 1; } else type = HEXAHEDRON; @@ -811,7 +811,7 @@ static void _unv_process_3D_elements(Mesh *m) for(int j = 0; j < List_Nbr(Elements); j++) { List_Read(Elements, j, &hx); if(hx->VSUP) - _unv_print_record(ELEMENT_ID++, BRICK, v->Num, 8, 12+6, &hx->V[0], hx->VSUP); + _unv_print_record(ELEMENT_ID++, BRICK, v->Num, 8, 12+6+1, &hx->V[0], hx->VSUP); else _unv_print_record(ELEMENT_ID++, BRICK, v->Num, 8, 0, &hx->V[0], NULL); } diff --git a/Mesh/Read_Mesh.cpp b/Mesh/Read_Mesh.cpp index 74cba8faf2f710fc4d39b8fb99c4eaa9d944aed4..c75ce750e59f483c845322e16fa2561b49a71cf9 100644 --- a/Mesh/Read_Mesh.cpp +++ b/Mesh/Read_Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Read_Mesh.cpp,v 1.74 2004-05-26 23:53:37 geuzaine Exp $ +// $Id: Read_Mesh.cpp,v 1.75 2004-05-27 06:23:48 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -246,7 +246,7 @@ void Read_Mesh_MSH(Mesh * M, FILE * fp) case TET1: Nbr_Nodes = 4; break; case TET2: Nbr_Nodes = 4 + 6; break; case HEX1: Nbr_Nodes = 8; break; - case HEX2: Nbr_Nodes = 8 + 12 + 6; break; + case HEX2: Nbr_Nodes = 8 + 12 + 6 + 1; break; case PRI1: Nbr_Nodes = 6; break; case PRI2: Nbr_Nodes = 6 + 9 + 3; break; case PYR1: Nbr_Nodes = 5; break; @@ -371,8 +371,8 @@ void Read_Mesh_MSH(Mesh * M, FILE * fp) hex->iEnt = Elementary; hex->iPart = Add_MeshPartition(Partition, M); if(Type == HEX2){ - hex->VSUP = (Vertex **) Malloc((12 + 6) * sizeof(Vertex *)); - for(i = 0; i < 12 + 6; i++){ + hex->VSUP = (Vertex **) Malloc((12 + 6 + 1) * sizeof(Vertex *)); + for(i = 0; i < 12 + 6 + 1; i++){ hex->VSUP[i] = vertsp[i+8]; hex->VSUP[i]->Degree = 2; } diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp index bf5cc43ebf30242e5d3c31b1f5b8f7eacad90cd0..1c88b4238fc166e821c1f542d4e3fbde06713cb8 100644 --- a/Mesh/SecondOrder.cpp +++ b/Mesh/SecondOrder.cpp @@ -1,4 +1,4 @@ -// $Id: SecondOrder.cpp,v 1.25 2004-05-26 00:33:37 geuzaine Exp $ +// $Id: SecondOrder.cpp,v 1.26 2004-05-27 06:23:48 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -43,6 +43,12 @@ static EdgesContainer *edges = NULL; static QuadFacesContainer *faces = NULL; static List_T *VerticesToDelete = NULL; +// using the following onCurve and onSurface functions instead of +// adding the second order nodes directly in the mesh algorithms is +// far less efficient... But it's much more general, as we want to be +// able to couple many algorithms, some of which we don't want +// to/cannot modify. + Vertex *onCurve(Vertex * v1, Vertex * v2) { Vertex v, *pv; @@ -197,7 +203,7 @@ void putMiddleEdgePoint(void *a, void *b) Quadrangle *q; List_Read(ed->Quadrangles, i, &q); if(!q->VSUP) - q->VSUP = (Vertex **) Malloc(5 * sizeof(Vertex *)); + q->VSUP = (Vertex **) Malloc((4 + 1) * sizeof(Vertex *)); for(int j = 0; j < 4; j++) { if((!compareVertex(&q->V[edges_quad[j][0]], &ed->V[0]) && !compareVertex(&q->V[edges_quad[j][1]], &ed->V[1])) || @@ -212,7 +218,7 @@ void putMiddleEdgePoint(void *a, void *b) Hexahedron *h; List_Read(ed->Hexahedra, i, &h); if(!h->VSUP) - h->VSUP = (Vertex **) Malloc(18 * sizeof(Vertex *)); + h->VSUP = (Vertex **) Malloc((12 + 6 + 1) * sizeof(Vertex *)); for(int j = 0; j < 12; j++) { if((!compareVertex(&h->V[edges_hexa[j][0]], &ed->V[0]) && !compareVertex(&h->V[edges_hexa[j][1]], &ed->V[1])) || @@ -227,7 +233,7 @@ void putMiddleEdgePoint(void *a, void *b) Prism *p; List_Read(ed->Prisms, i, &p); if(!p->VSUP) - p->VSUP = (Vertex **) Malloc(12 * sizeof(Vertex *)); + p->VSUP = (Vertex **) Malloc((9 + 3) * sizeof(Vertex *)); for(int j = 0; j < 9; j++) { if((!compareVertex(&p->V[edges_prism[j][0]], &ed->V[0]) && !compareVertex(&p->V[edges_prism[j][1]], &ed->V[1])) || @@ -242,7 +248,7 @@ void putMiddleEdgePoint(void *a, void *b) Pyramid *p; List_Read(ed->Pyramids, i, &p); if(!p->VSUP) - p->VSUP = (Vertex **) Malloc(9 * sizeof(Vertex *)); + p->VSUP = (Vertex **) Malloc((8 + 1) * sizeof(Vertex *)); for(int j = 0; j < 8; j++) { if((!compareVertex(&p->V[edges_pyramid[j][0]], &ed->V[0]) && !compareVertex(&p->V[edges_pyramid[j][1]], &ed->V[1])) || @@ -298,7 +304,7 @@ void putMiddleFacePoint(void *a, void *b) F.V[3] = fac->hexa[i]->V[quadfaces_hexa[j][3]]; qsort(F.V, 4, sizeof(Vertex *), compareVertex); if(!compareQuadFace(fac, &F)) - fac->hexa[i]->VSUP[12+j] = v; + fac->hexa[i]->VSUP[12 + j] = v; } } } @@ -312,7 +318,7 @@ void putMiddleFacePoint(void *a, void *b) F.V[3] = fac->prism[i]->V[quadfaces_prism[j][3]]; qsort(F.V, 4, sizeof(Vertex *), compareVertex); if(!compareQuadFace(fac, &F)) - fac->prism[i]->VSUP[9+j] = v; + fac->prism[i]->VSUP[9 + j] = v; } } } @@ -330,6 +336,35 @@ void putMiddleFacePoint(void *a, void *b) } } +void putMiddleVolumePoint(void *a, void *b) +{ + Hexahedron *h = *(Hexahedron**)a; + double x = 0., y = 0., z = 0., lc = 0., u = 0.; + for(int i = 0; i < 8; i++){ + x += h->V[i]->Pos.X; + y += h->V[i]->Pos.Y; + z += h->V[i]->Pos.Z; + lc += h->V[i]->lc; + u += h->V[i]->u; + } + for(int i = 0; i < 18; i++){ + x += h->VSUP[i]->Pos.X; + y += h->VSUP[i]->Pos.Y; + z += h->VSUP[i]->Pos.Z; + lc += h->VSUP[i]->lc; + u += h->VSUP[i]->u; + } + x /= 26.; + y /= 26.; + z /= 26.; + lc /= 26.; + u /= 26.; + Vertex *v = Create_Vertex(++THEM->MaxPointNum, x, y, z, lc, u); + v->Degree = 2; + Tree_Insert(THEM->Vertices, &v); + h->VSUP[18] = v; +} + void ResetDegre2_Vertex(void *a, void *b) { Vertex *v = *(Vertex**)a; @@ -474,6 +509,8 @@ void Degre2_Volume(void *a, void *b) faces->AddPrismTree(v->Prisms); faces->AddPyramidTree(v->Pyramids); Tree_Action(faces->AllFaces, putMiddleFacePoint); + + Tree_Action(v->Hexahedra, putMiddleVolumePoint); } void Degre2(int dim) diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi index 4d5c28372e50f2897b7f135b3d25a3ec52c02ec2..90378c2d4736e0bfe1a9507058d1e7981e425f41 100644 --- a/doc/texinfo/gmsh.texi +++ b/doc/texinfo/gmsh.texi @@ -1,5 +1,5 @@ \input texinfo.tex @c -*-texinfo-*- -@c $Id: gmsh.texi,v 1.113 2004-05-26 23:53:37 geuzaine Exp $ +@c $Id: gmsh.texi,v 1.114 2004-05-27 06:23:48 geuzaine Exp $ @c @c Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle @c @@ -2713,23 +2713,26 @@ Prism (6 nodes). @item 7 Pyramid (5 nodes). @item 8 -Second order line (3 nodes: associated with 2 vertices and 1 edge). +Second order line (3 nodes: 2 associated with the vertices and 1 with the +edge). @item 9 -Second order triangle (6 nodes: associated with 3 vertices and 3 edges). +Second order triangle (6 nodes: 3 associated with the vertices and 3 with +the edges). @item 10 -Second order quadrangle (9 nodes: associated with 4 vertices, 4 edges and 1 -quadrangular face). +Second order quadrangle (9 nodes: 4 associated with the vertices, 4 with the +edges and 1 with the face). @item 11 -Second order tetrahedron (10 nodes: associated with 4 vertices and 6 edges). +Second order tetrahedron (10 nodes: 4 associated with the vertices and 6 +with the edges). @item 12 -Second order hexahedron (26 nodes: associated with 8 vertices, 12 edges and -6 quadrangular faces). +Second order hexahedron (27 nodes: 8 associated with the vertices, 12 with +the edges, 6 with the faces and 1 with the volume). @item 13 -Second order prism (18 nodes: associated with 6 vertices, 9 edges and 3 -quadrangular faces). +Second order prism (18 nodes: 6 associated with the vertices, 9 with the +edges and 3 with the quadrangular faces). @item 14 -Second order pyramid (14 nodes: associated with 5 vertices, 8 edges and 1 -quadrangular face). +Second order pyramid (14 nodes: 5 associated with the vertices, 8 with the +edges and 1 with the quadrangular face). @item 15 Point (1 node). @end table @@ -2750,9 +2753,9 @@ is the list of the @var{number-of-nodes} node numbers of the @var{n}-th element. The ordering of the nodes is given in @ref{Gmsh node ordering}; for second order elements, the first order nodes are given first, followed by the nodes associated with the edges, followed by the nodes associated with -the quadrangular faces (if any). The ordering of these additional nodes -follows the ordering of the edges and faces given in @ref{Gmsh node -ordering}. +the quadrangular faces (if any), followed by the nodes associated with the +volume (if any). The ordering of these additional nodes follows the ordering +of the edges and faces given in @ref{Gmsh node ordering}. @end table @c ......................................................................... @@ -2836,23 +2839,26 @@ Prism (6 nodes). @item 7 Pyramid (5 nodes). @item 8 -Second order line (3 nodes: associated with 2 vertices and 1 edge). +Second order line (3 nodes: 2 associated with the vertices and 1 with the +edge). @item 9 -Second order triangle (6 nodes: associated with 3 vertices and 3 edges). +Second order triangle (6 nodes: 3 associated with the vertices and 3 with +the edges). @item 10 -Second order quadrangle (9 nodes: associated with 4 vertices, 4 edges and 1 -quadrangular face). +Second order quadrangle (9 nodes: 4 associated with the vertices, 4 with the +edges and 1 with the face). @item 11 -Second order tetrahedron (10 nodes: associated with 4 vertices and 6 edges). +Second order tetrahedron (10 nodes: 4 associated with the vertices and 6 +with the edges). @item 12 -Second order hexahedron (26 nodes: associated with 8 vertices, 12 edges and -6 quadrangular faces). +Second order hexahedron (27 nodes: 8 associated with the vertices, 12 with +the edges, 6 with the faces and 1 with the volume). @item 13 -Second order prism (18 nodes: associated with 6 vertices, 9 edges and 3 -quadrangular faces). +Second order prism (18 nodes: 6 associated with the vertices, 9 with the +edges and 3 with the quadrangular faces). @item 14 -Second order pyramid (14 nodes: associated with 5 vertices, 8 edges and 1 -quadrangular face). +Second order pyramid (14 nodes: 5 associated with the vertices, 8 with the +edges and 1 with the quadrangular face). @item 15 Point (1 node). @end table @@ -2875,8 +2881,9 @@ is the list of the node numbers of the @var{n}-th element. The ordering of the nodes is given in @ref{Gmsh node ordering}; for second order elements, the first order nodes are given first, followed by the nodes associated with the edges, followed by the nodes associated with the quadrangular faces (if -any). The ordering of these additional nodes follows the ordering of the -edges and faces given in @ref{Gmsh node ordering}. +any), followed by the nodes associated with the volume (if any). The +ordering of these additional nodes follows the ordering of the edges and +faces given in @ref{Gmsh node ordering}. @end table @c -------------------------------------------------------------------------