xref: /petsc/src/dm/impls/plex/gmshlex.h (revision 3dd0d3044861b3a867b46844d006f046a88907f6)
1*3dd0d304SLisandro Dalcin /*
2*3dd0d304SLisandro Dalcin  S: simplex  B: box
3*3dd0d304SLisandro Dalcin  N: size     I: index  L: loop
4*3dd0d304SLisandro Dalcin  p: degree (aka order in Gmsh)
5*3dd0d304SLisandro Dalcin  1,2,3: topological dimension
6*3dd0d304SLisandro Dalcin  i,j,k: coordinate indices
7*3dd0d304SLisandro Dalcin */
8*3dd0d304SLisandro Dalcin 
9*3dd0d304SLisandro Dalcin #define SN1(p)          ((p)+1)
10*3dd0d304SLisandro Dalcin #define SN2(p)          (SN1(p)*SN1((p)+1)/2)
11*3dd0d304SLisandro Dalcin #define SN3(p)          (SN2(p)*SN1((p)+2)/3)
12*3dd0d304SLisandro Dalcin #define SI1(p, i)       ((i))
13*3dd0d304SLisandro Dalcin #define SI2(p, i, j)    ((i)+(SN2(p)-SN2((p)-(j))))
14*3dd0d304SLisandro Dalcin #define SI3(p, i, j, k) (SI2((p)-(k),i,j)+(SN3(p)-SN3((p)-(k))))
15*3dd0d304SLisandro Dalcin #define SL1(p, i)       for ((i)=1;(i)<(p);++(i))
16*3dd0d304SLisandro Dalcin #define SL2(p, i, j)    SL1((p)-1,i) SL1((p)-(i),j)
17*3dd0d304SLisandro Dalcin #define SL3(p, i, j, k) SL1((p)-2,i) SL1((p)-(i),j) SL1((p)-(i)-(j),k)
18*3dd0d304SLisandro Dalcin 
19*3dd0d304SLisandro Dalcin #define BN1(p)          ((p)+1)
20*3dd0d304SLisandro Dalcin #define BN2(p)          (BN1(p)*BN1(p))
21*3dd0d304SLisandro Dalcin #define BN3(p)          (BN2(p)*BN1(p))
22*3dd0d304SLisandro Dalcin #define BI1(p, i)       ((i))
23*3dd0d304SLisandro Dalcin #define BI2(p, i, j)    ((i)+(j)*BN1(p))
24*3dd0d304SLisandro Dalcin #define BI3(p, i, j, k) ((i)+BI2(p,j,k)*BN1(p))
25*3dd0d304SLisandro Dalcin #define BL1(p, i)       for ((i)=1;(i)<(p);++(i))
26*3dd0d304SLisandro Dalcin #define BL2(p, i, j)    BL1(p,i) BL1(p,j)
27*3dd0d304SLisandro Dalcin #define BL3(p, i, j, k) BL1(p,i) BL1(p,j) BL1(p,k)
28*3dd0d304SLisandro Dalcin 
29*3dd0d304SLisandro Dalcin #define GmshNumNodes_VTX(p) (1)
30*3dd0d304SLisandro Dalcin #define GmshNumNodes_SEG(p) SN1(p)
31*3dd0d304SLisandro Dalcin #define GmshNumNodes_TRI(p) SN2(p)
32*3dd0d304SLisandro Dalcin #define GmshNumNodes_QUA(p) BN2(p)
33*3dd0d304SLisandro Dalcin #define GmshNumNodes_TET(p) SN3(p)
34*3dd0d304SLisandro Dalcin #define GmshNumNodes_HEX(p) BN3(p)
35*3dd0d304SLisandro Dalcin #define GmshNumNodes_PRI(p) (SN2(p)*BN1(p))
36*3dd0d304SLisandro Dalcin #define GmshNumNodes_PYR(p) (((p)+1)*((p)+2)*(2*(p)+3)/6)
37*3dd0d304SLisandro Dalcin 
38*3dd0d304SLisandro Dalcin #define GMSH_MAX_ORDER 10
39*3dd0d304SLisandro Dalcin 
40*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_VTX(int p, int lex[], int node)
41*3dd0d304SLisandro Dalcin {
42*3dd0d304SLisandro Dalcin   lex[0] = node++; (void)p;
43*3dd0d304SLisandro Dalcin   return node;
44*3dd0d304SLisandro Dalcin }
45*3dd0d304SLisandro Dalcin 
46*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_SEG(int p, int lex[], int node)
47*3dd0d304SLisandro Dalcin {
48*3dd0d304SLisandro Dalcin #define loop1(i) SL1(p, i)
49*3dd0d304SLisandro Dalcin #define index(i) SI1(p, i)
50*3dd0d304SLisandro Dalcin   int i;
51*3dd0d304SLisandro Dalcin   /* trivial case */
52*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
53*3dd0d304SLisandro Dalcin   if (p == 0) return node;
54*3dd0d304SLisandro Dalcin   /* vertex nodes */
55*3dd0d304SLisandro Dalcin   lex[index(0)] = node++;
56*3dd0d304SLisandro Dalcin   lex[index(p)] = node++;
57*3dd0d304SLisandro Dalcin   if (p == 1) return node;
58*3dd0d304SLisandro Dalcin   /* internal cell nodes */
59*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i)] = node++;
60*3dd0d304SLisandro Dalcin   return node;
61*3dd0d304SLisandro Dalcin #undef loop1
62*3dd0d304SLisandro Dalcin #undef index
63*3dd0d304SLisandro Dalcin }
64*3dd0d304SLisandro Dalcin 
65*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_TRI(int p, int lex[], int node)
66*3dd0d304SLisandro Dalcin {
67*3dd0d304SLisandro Dalcin #define loop1(i)    SL1(p, i)
68*3dd0d304SLisandro Dalcin #define loop2(i, j) SL2(p, i, j)
69*3dd0d304SLisandro Dalcin #define index(i, j) SI2(p, i, j)
70*3dd0d304SLisandro Dalcin   int i, j, *sub, buf[SN2(GMSH_MAX_ORDER)];
71*3dd0d304SLisandro Dalcin   /* trivial case */
72*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
73*3dd0d304SLisandro Dalcin   if (p == 0) return node;
74*3dd0d304SLisandro Dalcin   /* vertex nodes */
75*3dd0d304SLisandro Dalcin   lex[index(0, 0)] = node++;
76*3dd0d304SLisandro Dalcin   lex[index(p, 0)] = node++;
77*3dd0d304SLisandro Dalcin   lex[index(0, p)] = node++;
78*3dd0d304SLisandro Dalcin   if (p == 1) return node;
79*3dd0d304SLisandro Dalcin   /* internal edge nodes */
80*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0)]   = node++;
81*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p-j, j)] = node++;
82*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, p-j)] = node++;
83*3dd0d304SLisandro Dalcin   if (p == 2) return node;
84*3dd0d304SLisandro Dalcin   /* internal cell nodes */
85*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TRI(p-3, sub=buf, node);
86*3dd0d304SLisandro Dalcin   loop2(j, i) lex[index(i, j)] = *sub++;
87*3dd0d304SLisandro Dalcin   return node;
88*3dd0d304SLisandro Dalcin #undef loop1
89*3dd0d304SLisandro Dalcin #undef loop2
90*3dd0d304SLisandro Dalcin #undef index
91*3dd0d304SLisandro Dalcin }
92*3dd0d304SLisandro Dalcin 
93*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_QUA(int p, int lex[], int node)
94*3dd0d304SLisandro Dalcin {
95*3dd0d304SLisandro Dalcin #define loop1(i)    BL1(p, i)
96*3dd0d304SLisandro Dalcin #define loop2(i, j) BL2(p, i, j)
97*3dd0d304SLisandro Dalcin #define index(i, j) BI2(p, i, j)
98*3dd0d304SLisandro Dalcin   int i, j, *sub, buf[BN2(GMSH_MAX_ORDER)];
99*3dd0d304SLisandro Dalcin   /* trivial case */
100*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
101*3dd0d304SLisandro Dalcin   if (p == 0) return node;
102*3dd0d304SLisandro Dalcin   /* vertex nodes */
103*3dd0d304SLisandro Dalcin   lex[index(0, 0)] = node++;
104*3dd0d304SLisandro Dalcin   lex[index(p, 0)] = node++;
105*3dd0d304SLisandro Dalcin   lex[index(p, p)] = node++;
106*3dd0d304SLisandro Dalcin   lex[index(0, p)] = node++;
107*3dd0d304SLisandro Dalcin   if (p == 1) return node;
108*3dd0d304SLisandro Dalcin   /* internal edge nodes */
109*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0)]   = node++;
110*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p, j)]   = node++;
111*3dd0d304SLisandro Dalcin   loop1(i) lex[index(p-i, p)] = node++;
112*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, p-j)] = node++;
113*3dd0d304SLisandro Dalcin   /* internal cell nodes */
114*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
115*3dd0d304SLisandro Dalcin   loop2(j, i) lex[index(i, j)] = *sub++;
116*3dd0d304SLisandro Dalcin   return node;
117*3dd0d304SLisandro Dalcin #undef loop1
118*3dd0d304SLisandro Dalcin #undef loop2
119*3dd0d304SLisandro Dalcin #undef index
120*3dd0d304SLisandro Dalcin }
121*3dd0d304SLisandro Dalcin 
122*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_TET(int p, int lex[], int node)
123*3dd0d304SLisandro Dalcin {
124*3dd0d304SLisandro Dalcin #define loop1(i)       SL1(p, i)
125*3dd0d304SLisandro Dalcin #define loop2(i, j)    SL2(p, i, j)
126*3dd0d304SLisandro Dalcin #define loop3(i, j, k) SL3(p, i, j, k)
127*3dd0d304SLisandro Dalcin #define index(i, j, k) SI3(p, i, j, k)
128*3dd0d304SLisandro Dalcin   int i, j, k, *sub, buf[SN3(GMSH_MAX_ORDER)];
129*3dd0d304SLisandro Dalcin   /* trivial case */
130*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
131*3dd0d304SLisandro Dalcin   if (p == 0) return node;
132*3dd0d304SLisandro Dalcin   /* vertex nodes */
133*3dd0d304SLisandro Dalcin   lex[index(0, 0, 0)] = node++;
134*3dd0d304SLisandro Dalcin   lex[index(p, 0, 0)] = node++;
135*3dd0d304SLisandro Dalcin   lex[index(0, p, 0)] = node++;
136*3dd0d304SLisandro Dalcin   lex[index(0, 0, p)] = node++;
137*3dd0d304SLisandro Dalcin   if (p == 1) return node;
138*3dd0d304SLisandro Dalcin   /* internal edge nodes */
139*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, 0)]   = node++;
140*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p-j, j, 0)] = node++;
141*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, p-j, 0)] = node++;
142*3dd0d304SLisandro Dalcin   loop1(k) lex[index(0, 0, p-k)] = node++;
143*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, j, p-j)] = node++;
144*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, p-i)] = node++;
145*3dd0d304SLisandro Dalcin   if (p == 2) return node;
146*3dd0d304SLisandro Dalcin   /* internal face nodes */
147*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TRI(p-3, sub=buf, node);
148*3dd0d304SLisandro Dalcin   loop2(i, j) lex[index(i, j, 0)] = *sub++;
149*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TRI(p-3, sub=buf, node);
150*3dd0d304SLisandro Dalcin   loop2(k, i) lex[index(i, 0, k)] = *sub++;
151*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TRI(p-3, sub=buf, node);
152*3dd0d304SLisandro Dalcin   loop2(j, k) lex[index(0, j, k)] = *sub++;
153*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TRI(p-3, sub=buf, node);
154*3dd0d304SLisandro Dalcin   loop2(j, i) lex[index(i, j, p-i-j)] = *sub++;
155*3dd0d304SLisandro Dalcin   if (p == 3) return node;
156*3dd0d304SLisandro Dalcin   /* internal cell nodes */
157*3dd0d304SLisandro Dalcin   node = GmshLexOrder_TET(p-4, sub=buf, node);
158*3dd0d304SLisandro Dalcin   loop3(k, j, i) lex[index(i, j, k)] = *sub++;
159*3dd0d304SLisandro Dalcin   return node;
160*3dd0d304SLisandro Dalcin #undef loop1
161*3dd0d304SLisandro Dalcin #undef loop2
162*3dd0d304SLisandro Dalcin #undef loop3
163*3dd0d304SLisandro Dalcin #undef index
164*3dd0d304SLisandro Dalcin }
165*3dd0d304SLisandro Dalcin 
166*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_HEX(int p, int lex[], int node)
167*3dd0d304SLisandro Dalcin {
168*3dd0d304SLisandro Dalcin #define loop1(i)       BL1(p, i)
169*3dd0d304SLisandro Dalcin #define loop2(i, j)    BL2(p, i, j)
170*3dd0d304SLisandro Dalcin #define loop3(i, j, k) BL3(p, i, j, k)
171*3dd0d304SLisandro Dalcin #define index(i, j, k) BI3(p, i, j, k)
172*3dd0d304SLisandro Dalcin   int i, j, k, *sub, buf[BN3(GMSH_MAX_ORDER)];
173*3dd0d304SLisandro Dalcin   /* trivial case */
174*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
175*3dd0d304SLisandro Dalcin   if (p == 0) return node;
176*3dd0d304SLisandro Dalcin   /* vertex nodes */
177*3dd0d304SLisandro Dalcin   lex[index(0, 0, 0)] = node++;
178*3dd0d304SLisandro Dalcin   lex[index(p, 0, 0)] = node++;
179*3dd0d304SLisandro Dalcin   lex[index(p, p, 0)] = node++;
180*3dd0d304SLisandro Dalcin   lex[index(0, p, 0)] = node++;
181*3dd0d304SLisandro Dalcin   lex[index(0, 0, p)] = node++;
182*3dd0d304SLisandro Dalcin   lex[index(p, 0, p)] = node++;
183*3dd0d304SLisandro Dalcin   lex[index(p, p, p)] = node++;
184*3dd0d304SLisandro Dalcin   lex[index(0, p, p)] = node++;
185*3dd0d304SLisandro Dalcin   if (p == 1) return node;
186*3dd0d304SLisandro Dalcin   /* internal edge nodes */
187*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, 0)]   = node++;
188*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, j, 0)]   = node++;
189*3dd0d304SLisandro Dalcin   loop1(k) lex[index(0, 0, k)]   = node++;
190*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p, j, 0)]   = node++;
191*3dd0d304SLisandro Dalcin   loop1(k) lex[index(p, 0, k)]   = node++;
192*3dd0d304SLisandro Dalcin   loop1(i) lex[index(p-i, p, 0)] = node++;
193*3dd0d304SLisandro Dalcin   loop1(k) lex[index(p, p, k)]   = node++;
194*3dd0d304SLisandro Dalcin   loop1(k) lex[index(0, p, k)]   = node++;
195*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, p)]   = node++;
196*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, j, p)]   = node++;
197*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p, j, p)]   = node++;
198*3dd0d304SLisandro Dalcin   loop1(i) lex[index(p-i, p, p)] = node++;
199*3dd0d304SLisandro Dalcin   /* internal face nodes */
200*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
201*3dd0d304SLisandro Dalcin   loop2(i, j) lex[index(i, j, 0)] = *sub++;
202*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
203*3dd0d304SLisandro Dalcin   loop2(k, i) lex[index(i, 0, k)] = *sub++;
204*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
205*3dd0d304SLisandro Dalcin   loop2(j, k) lex[index(0, j, k)] = *sub++;
206*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
207*3dd0d304SLisandro Dalcin   loop2(k, j) lex[index(p, j, k)] = *sub++;
208*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
209*3dd0d304SLisandro Dalcin   loop2(k, i) lex[index(p-i, p, k)] = *sub++;
210*3dd0d304SLisandro Dalcin   node = GmshLexOrder_QUA(p-2, sub=buf, node);
211*3dd0d304SLisandro Dalcin   loop2(j, i) lex[index(i, j, p)] = *sub++;
212*3dd0d304SLisandro Dalcin   /* internal cell nodes */
213*3dd0d304SLisandro Dalcin   node = GmshLexOrder_HEX(p-2, sub=buf, node);
214*3dd0d304SLisandro Dalcin   loop3(k, j, i) lex[index(i, j, k)] = *sub++;
215*3dd0d304SLisandro Dalcin   return node;
216*3dd0d304SLisandro Dalcin #undef loop1
217*3dd0d304SLisandro Dalcin #undef loop2
218*3dd0d304SLisandro Dalcin #undef loop3
219*3dd0d304SLisandro Dalcin #undef index
220*3dd0d304SLisandro Dalcin }
221*3dd0d304SLisandro Dalcin 
222*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_PRI(int p, int lex[], int node)
223*3dd0d304SLisandro Dalcin {
224*3dd0d304SLisandro Dalcin #define loop1(i)       BL1(p, i)
225*3dd0d304SLisandro Dalcin #define loops(i, j)    SL2(p, i, j)
226*3dd0d304SLisandro Dalcin #define loopb(i, j)    BL2(p, i, j)
227*3dd0d304SLisandro Dalcin #define index(i, j, k) (SI2(p,i,j)+BI1(p,k)*SN2(p))
228*3dd0d304SLisandro Dalcin   int i, j, k, *sub, buf[BN2(GMSH_MAX_ORDER)];
229*3dd0d304SLisandro Dalcin   /* trivial case */
230*3dd0d304SLisandro Dalcin   if (p == 0) lex[0] = node++;
231*3dd0d304SLisandro Dalcin   if (p == 0) return node;
232*3dd0d304SLisandro Dalcin   /* vertex nodes */
233*3dd0d304SLisandro Dalcin   lex[index(0, 0, 0)] = node++;
234*3dd0d304SLisandro Dalcin   lex[index(p, 0, 0)] = node++;
235*3dd0d304SLisandro Dalcin   lex[index(0, p, 0)] = node++;
236*3dd0d304SLisandro Dalcin   lex[index(0, 0, p)] = node++;
237*3dd0d304SLisandro Dalcin   lex[index(p, 0, p)] = node++;
238*3dd0d304SLisandro Dalcin   lex[index(0, p, p)] = node++;
239*3dd0d304SLisandro Dalcin   if (p == 1) return node;
240*3dd0d304SLisandro Dalcin   /* internal edge nodes */
241*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, 0)]   = node++;
242*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, j, 0)]   = node++;
243*3dd0d304SLisandro Dalcin   loop1(k) lex[index(0, 0, k)]   = node++;
244*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p-j, j, 0)] = node++;
245*3dd0d304SLisandro Dalcin   loop1(k) lex[index(p, 0, k)]   = node++;
246*3dd0d304SLisandro Dalcin   loop1(k) lex[index(0, p, k)]   = node++;
247*3dd0d304SLisandro Dalcin   loop1(i) lex[index(i, 0, p)]   = node++;
248*3dd0d304SLisandro Dalcin   loop1(j) lex[index(0, j, p)]   = node++;
249*3dd0d304SLisandro Dalcin   loop1(j) lex[index(p-j, j, p)] = node++;
250*3dd0d304SLisandro Dalcin   if (p >= 3) {
251*3dd0d304SLisandro Dalcin     /* internal bottom face nodes */
252*3dd0d304SLisandro Dalcin     node = GmshLexOrder_TRI(p-3, sub=buf, node);
253*3dd0d304SLisandro Dalcin     loops(i, j) lex[index(i, j, 0)] = *sub++;
254*3dd0d304SLisandro Dalcin     /* internal top face nodes */
255*3dd0d304SLisandro Dalcin     node = GmshLexOrder_TRI(p-3, sub=buf, node);
256*3dd0d304SLisandro Dalcin     loops(j, i) lex[index(i, j, p)] = *sub++;
257*3dd0d304SLisandro Dalcin   }
258*3dd0d304SLisandro Dalcin   if (p >= 2) {
259*3dd0d304SLisandro Dalcin     /* internal front face nodes */
260*3dd0d304SLisandro Dalcin     node = GmshLexOrder_QUA(p-2, sub=buf, node);
261*3dd0d304SLisandro Dalcin     loopb(k, i) lex[index(i, 0, k)] = *sub++;
262*3dd0d304SLisandro Dalcin     /* internal left face nodes */
263*3dd0d304SLisandro Dalcin     node = GmshLexOrder_QUA(p-2, sub=buf, node);
264*3dd0d304SLisandro Dalcin     loopb(j, k) lex[index(0, j, k)] = *sub++;
265*3dd0d304SLisandro Dalcin     /* internal back face nodes */
266*3dd0d304SLisandro Dalcin     node = GmshLexOrder_QUA(p-2, sub=buf, node);
267*3dd0d304SLisandro Dalcin     loopb(k, j) lex[index(p-j, j, k)] = *sub++;
268*3dd0d304SLisandro Dalcin   }
269*3dd0d304SLisandro Dalcin   if (p >= 3) {
270*3dd0d304SLisandro Dalcin     /* internal cell nodes */
271*3dd0d304SLisandro Dalcin     typedef struct {int i,j;} pair;
272*3dd0d304SLisandro Dalcin     pair ij[SN2(GMSH_MAX_ORDER)], tmp[SN2(GMSH_MAX_ORDER)];
273*3dd0d304SLisandro Dalcin     int m = GmshLexOrder_TRI(p-3, sub=buf, 0), l = 0;
274*3dd0d304SLisandro Dalcin     loops(j, i) {tmp[l].i = i; tmp[l].j = j; l++;}
275*3dd0d304SLisandro Dalcin     for (l=0; l<m; ++l) ij[sub[l]] = tmp[l];
276*3dd0d304SLisandro Dalcin     for (l=0; l<m; ++l) {
277*3dd0d304SLisandro Dalcin       i = ij[l].i; j = ij[l].j;
278*3dd0d304SLisandro Dalcin       node = GmshLexOrder_SEG(p-2, sub=buf, node);
279*3dd0d304SLisandro Dalcin       loop1(k) lex[index(i, j, k)] = *sub++;
280*3dd0d304SLisandro Dalcin     }
281*3dd0d304SLisandro Dalcin   }
282*3dd0d304SLisandro Dalcin   return node;
283*3dd0d304SLisandro Dalcin #undef loop1
284*3dd0d304SLisandro Dalcin #undef loops
285*3dd0d304SLisandro Dalcin #undef loopb
286*3dd0d304SLisandro Dalcin #undef index
287*3dd0d304SLisandro Dalcin }
288*3dd0d304SLisandro Dalcin 
289*3dd0d304SLisandro Dalcin PETSC_STATIC_INLINE int GmshLexOrder_PYR(int p, int lex[], int node)
290*3dd0d304SLisandro Dalcin {
291*3dd0d304SLisandro Dalcin   int i, m = GmshNumNodes_PYR(p);
292*3dd0d304SLisandro Dalcin   for (i=0; i<m; ++i) {lex[i] = node++; } /* TODO */
293*3dd0d304SLisandro Dalcin   return node;
294*3dd0d304SLisandro Dalcin }
295