1a4963045SJacob Faibussowitsch #pragma once 23dd0d304SLisandro Dalcin /* 33dd0d304SLisandro Dalcin S: simplex B: box 43dd0d304SLisandro Dalcin N: size I: index L: loop 53dd0d304SLisandro Dalcin p: degree (aka order in Gmsh) 63dd0d304SLisandro Dalcin 1,2,3: topological dimension 73dd0d304SLisandro Dalcin i,j,k: coordinate indices 83dd0d304SLisandro Dalcin */ 93dd0d304SLisandro Dalcin 103dd0d304SLisandro Dalcin #define SN1(p) ((p) + 1) 113dd0d304SLisandro Dalcin #define SN2(p) (SN1(p) * SN1((p) + 1) / 2) 123dd0d304SLisandro Dalcin #define SN3(p) (SN2(p) * SN1((p) + 2) / 3) 13*f4f49eeaSPierre Jolivet #define SI1(p, i) (i) 143dd0d304SLisandro Dalcin #define SI2(p, i, j) ((i) + (SN2(p) - SN2((p) - (j)))) 153dd0d304SLisandro Dalcin #define SI3(p, i, j, k) (SI2((p) - (k), i, j) + (SN3(p) - SN3((p) - (k)))) 163dd0d304SLisandro Dalcin #define SL1(p, i) for ((i) = 1; (i) < (p); ++(i)) 173dd0d304SLisandro Dalcin #define SL2(p, i, j) SL1((p)-1, i) SL1((p) - (i), j) 183dd0d304SLisandro Dalcin #define SL3(p, i, j, k) SL1((p)-2, i) SL1((p) - (i), j) SL1((p) - (i) - (j), k) 193dd0d304SLisandro Dalcin 203dd0d304SLisandro Dalcin #define BN1(p) ((p) + 1) 213dd0d304SLisandro Dalcin #define BN2(p) (BN1(p) * BN1(p)) 223dd0d304SLisandro Dalcin #define BN3(p) (BN2(p) * BN1(p)) 23*f4f49eeaSPierre Jolivet #define BI1(p, i) (i) 243dd0d304SLisandro Dalcin #define BI2(p, i, j) ((i) + (j)*BN1(p)) 253dd0d304SLisandro Dalcin #define BI3(p, i, j, k) ((i) + BI2(p, j, k) * BN1(p)) 263dd0d304SLisandro Dalcin #define BL1(p, i) for ((i) = 1; (i) < (p); ++(i)) 273dd0d304SLisandro Dalcin #define BL2(p, i, j) BL1(p, i) BL1(p, j) 283dd0d304SLisandro Dalcin #define BL3(p, i, j, k) BL1(p, i) BL1(p, j) BL1(p, k) 293dd0d304SLisandro Dalcin 303dd0d304SLisandro Dalcin #define GmshNumNodes_VTX(p) (1) 313dd0d304SLisandro Dalcin #define GmshNumNodes_SEG(p) SN1(p) 323dd0d304SLisandro Dalcin #define GmshNumNodes_TRI(p) SN2(p) 333dd0d304SLisandro Dalcin #define GmshNumNodes_QUA(p) BN2(p) 343dd0d304SLisandro Dalcin #define GmshNumNodes_TET(p) SN3(p) 353dd0d304SLisandro Dalcin #define GmshNumNodes_HEX(p) BN3(p) 363dd0d304SLisandro Dalcin #define GmshNumNodes_PRI(p) (SN2(p) * BN1(p)) 373dd0d304SLisandro Dalcin #define GmshNumNodes_PYR(p) (((p) + 1) * ((p) + 2) * (2 * (p) + 3) / 6) 383dd0d304SLisandro Dalcin 393dd0d304SLisandro Dalcin #define GMSH_MAX_ORDER 10 403dd0d304SLisandro Dalcin 41d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_VTX(int p, int lex[], int node) 42d71ae5a4SJacob Faibussowitsch { 439371c9d4SSatish Balay lex[0] = node++; 449371c9d4SSatish Balay (void)p; 453dd0d304SLisandro Dalcin return node; 463dd0d304SLisandro Dalcin } 473dd0d304SLisandro Dalcin 48d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_SEG(int p, int lex[], int node) 49d71ae5a4SJacob Faibussowitsch { 503dd0d304SLisandro Dalcin #define loop1(i) SL1(p, i) 513dd0d304SLisandro Dalcin #define index(i) SI1(p, i) 523dd0d304SLisandro Dalcin int i; 533dd0d304SLisandro Dalcin /* trivial case */ 543dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 553dd0d304SLisandro Dalcin if (p == 0) return node; 563dd0d304SLisandro Dalcin /* vertex nodes */ 573dd0d304SLisandro Dalcin lex[index(0)] = node++; 583dd0d304SLisandro Dalcin lex[index(p)] = node++; 593dd0d304SLisandro Dalcin if (p == 1) return node; 603dd0d304SLisandro Dalcin /* internal cell nodes */ 613dd0d304SLisandro Dalcin loop1(i) lex[index(i)] = node++; 623dd0d304SLisandro Dalcin return node; 633dd0d304SLisandro Dalcin #undef loop1 643dd0d304SLisandro Dalcin #undef index 653dd0d304SLisandro Dalcin } 663dd0d304SLisandro Dalcin 67d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_TRI(int p, int lex[], int node) 68d71ae5a4SJacob Faibussowitsch { 693dd0d304SLisandro Dalcin #define loop1(i) SL1(p, i) 703dd0d304SLisandro Dalcin #define loop2(i, j) SL2(p, i, j) 713dd0d304SLisandro Dalcin #define index(i, j) SI2(p, i, j) 723dd0d304SLisandro Dalcin int i, j, *sub, buf[SN2(GMSH_MAX_ORDER)]; 733dd0d304SLisandro Dalcin /* trivial case */ 743dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 753dd0d304SLisandro Dalcin if (p == 0) return node; 763dd0d304SLisandro Dalcin /* vertex nodes */ 773dd0d304SLisandro Dalcin lex[index(0, 0)] = node++; 783dd0d304SLisandro Dalcin lex[index(p, 0)] = node++; 793dd0d304SLisandro Dalcin lex[index(0, p)] = node++; 803dd0d304SLisandro Dalcin if (p == 1) return node; 813dd0d304SLisandro Dalcin /* internal edge nodes */ 823dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0)] = node++; 833dd0d304SLisandro Dalcin loop1(j) lex[index(p - j, j)] = node++; 843dd0d304SLisandro Dalcin loop1(j) lex[index(0, p - j)] = node++; 853dd0d304SLisandro Dalcin if (p == 2) return node; 863dd0d304SLisandro Dalcin /* internal cell nodes */ 873dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 883dd0d304SLisandro Dalcin loop2(j, i) lex[index(i, j)] = *sub++; 893dd0d304SLisandro Dalcin return node; 903dd0d304SLisandro Dalcin #undef loop1 913dd0d304SLisandro Dalcin #undef loop2 923dd0d304SLisandro Dalcin #undef index 933dd0d304SLisandro Dalcin } 943dd0d304SLisandro Dalcin 95d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_QUA(int p, int lex[], int node) 96d71ae5a4SJacob Faibussowitsch { 973dd0d304SLisandro Dalcin #define loop1(i) BL1(p, i) 983dd0d304SLisandro Dalcin #define loop2(i, j) BL2(p, i, j) 993dd0d304SLisandro Dalcin #define index(i, j) BI2(p, i, j) 1003dd0d304SLisandro Dalcin int i, j, *sub, buf[BN2(GMSH_MAX_ORDER)]; 1013dd0d304SLisandro Dalcin /* trivial case */ 1023dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 1033dd0d304SLisandro Dalcin if (p == 0) return node; 1043dd0d304SLisandro Dalcin /* vertex nodes */ 1053dd0d304SLisandro Dalcin lex[index(0, 0)] = node++; 1063dd0d304SLisandro Dalcin lex[index(p, 0)] = node++; 1073dd0d304SLisandro Dalcin lex[index(p, p)] = node++; 1083dd0d304SLisandro Dalcin lex[index(0, p)] = node++; 1093dd0d304SLisandro Dalcin if (p == 1) return node; 1103dd0d304SLisandro Dalcin /* internal edge nodes */ 1113dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0)] = node++; 1123dd0d304SLisandro Dalcin loop1(j) lex[index(p, j)] = node++; 1133dd0d304SLisandro Dalcin loop1(i) lex[index(p - i, p)] = node++; 1143dd0d304SLisandro Dalcin loop1(j) lex[index(0, p - j)] = node++; 1153dd0d304SLisandro Dalcin /* internal cell nodes */ 1163dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 1173dd0d304SLisandro Dalcin loop2(j, i) lex[index(i, j)] = *sub++; 1183dd0d304SLisandro Dalcin return node; 1193dd0d304SLisandro Dalcin #undef loop1 1203dd0d304SLisandro Dalcin #undef loop2 1213dd0d304SLisandro Dalcin #undef index 1223dd0d304SLisandro Dalcin } 1233dd0d304SLisandro Dalcin 124d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_TET(int p, int lex[], int node) 125d71ae5a4SJacob Faibussowitsch { 1263dd0d304SLisandro Dalcin #define loop1(i) SL1(p, i) 1273dd0d304SLisandro Dalcin #define loop2(i, j) SL2(p, i, j) 1283dd0d304SLisandro Dalcin #define loop3(i, j, k) SL3(p, i, j, k) 1293dd0d304SLisandro Dalcin #define index(i, j, k) SI3(p, i, j, k) 1303dd0d304SLisandro Dalcin int i, j, k, *sub, buf[SN3(GMSH_MAX_ORDER)]; 1313dd0d304SLisandro Dalcin /* trivial case */ 1323dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 1333dd0d304SLisandro Dalcin if (p == 0) return node; 1343dd0d304SLisandro Dalcin /* vertex nodes */ 1353dd0d304SLisandro Dalcin lex[index(0, 0, 0)] = node++; 1363dd0d304SLisandro Dalcin lex[index(p, 0, 0)] = node++; 1373dd0d304SLisandro Dalcin lex[index(0, p, 0)] = node++; 1383dd0d304SLisandro Dalcin lex[index(0, 0, p)] = node++; 1393dd0d304SLisandro Dalcin if (p == 1) return node; 1403dd0d304SLisandro Dalcin /* internal edge nodes */ 1413dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, 0)] = node++; 1423dd0d304SLisandro Dalcin loop1(j) lex[index(p - j, j, 0)] = node++; 1433dd0d304SLisandro Dalcin loop1(j) lex[index(0, p - j, 0)] = node++; 1443dd0d304SLisandro Dalcin loop1(k) lex[index(0, 0, p - k)] = node++; 1453dd0d304SLisandro Dalcin loop1(j) lex[index(0, j, p - j)] = node++; 1463dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, p - i)] = node++; 1473dd0d304SLisandro Dalcin if (p == 2) return node; 1483dd0d304SLisandro Dalcin /* internal face nodes */ 1493dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 1503dd0d304SLisandro Dalcin loop2(i, j) lex[index(i, j, 0)] = *sub++; 1513dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 1523dd0d304SLisandro Dalcin loop2(k, i) lex[index(i, 0, k)] = *sub++; 1533dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 1543dd0d304SLisandro Dalcin loop2(j, k) lex[index(0, j, k)] = *sub++; 1553dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 1563dd0d304SLisandro Dalcin loop2(j, i) lex[index(i, j, p - i - j)] = *sub++; 1573dd0d304SLisandro Dalcin if (p == 3) return node; 1583dd0d304SLisandro Dalcin /* internal cell nodes */ 1593dd0d304SLisandro Dalcin node = GmshLexOrder_TET(p - 4, sub = buf, node); 1603dd0d304SLisandro Dalcin loop3(k, j, i) lex[index(i, j, k)] = *sub++; 1613dd0d304SLisandro Dalcin return node; 1623dd0d304SLisandro Dalcin #undef loop1 1633dd0d304SLisandro Dalcin #undef loop2 1643dd0d304SLisandro Dalcin #undef loop3 1653dd0d304SLisandro Dalcin #undef index 1663dd0d304SLisandro Dalcin } 1673dd0d304SLisandro Dalcin 168d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_HEX(int p, int lex[], int node) 169d71ae5a4SJacob Faibussowitsch { 1703dd0d304SLisandro Dalcin #define loop1(i) BL1(p, i) 1713dd0d304SLisandro Dalcin #define loop2(i, j) BL2(p, i, j) 1723dd0d304SLisandro Dalcin #define loop3(i, j, k) BL3(p, i, j, k) 1733dd0d304SLisandro Dalcin #define index(i, j, k) BI3(p, i, j, k) 1743dd0d304SLisandro Dalcin int i, j, k, *sub, buf[BN3(GMSH_MAX_ORDER)]; 1753dd0d304SLisandro Dalcin /* trivial case */ 1763dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 1773dd0d304SLisandro Dalcin if (p == 0) return node; 1783dd0d304SLisandro Dalcin /* vertex nodes */ 1793dd0d304SLisandro Dalcin lex[index(0, 0, 0)] = node++; 1803dd0d304SLisandro Dalcin lex[index(p, 0, 0)] = node++; 1813dd0d304SLisandro Dalcin lex[index(p, p, 0)] = node++; 1823dd0d304SLisandro Dalcin lex[index(0, p, 0)] = node++; 1833dd0d304SLisandro Dalcin lex[index(0, 0, p)] = node++; 1843dd0d304SLisandro Dalcin lex[index(p, 0, p)] = node++; 1853dd0d304SLisandro Dalcin lex[index(p, p, p)] = node++; 1863dd0d304SLisandro Dalcin lex[index(0, p, p)] = node++; 1873dd0d304SLisandro Dalcin if (p == 1) return node; 1883dd0d304SLisandro Dalcin /* internal edge nodes */ 1893dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, 0)] = node++; 1903dd0d304SLisandro Dalcin loop1(j) lex[index(0, j, 0)] = node++; 1913dd0d304SLisandro Dalcin loop1(k) lex[index(0, 0, k)] = node++; 1923dd0d304SLisandro Dalcin loop1(j) lex[index(p, j, 0)] = node++; 1933dd0d304SLisandro Dalcin loop1(k) lex[index(p, 0, k)] = node++; 1943dd0d304SLisandro Dalcin loop1(i) lex[index(p - i, p, 0)] = node++; 1953dd0d304SLisandro Dalcin loop1(k) lex[index(p, p, k)] = node++; 1963dd0d304SLisandro Dalcin loop1(k) lex[index(0, p, k)] = node++; 1973dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, p)] = node++; 1983dd0d304SLisandro Dalcin loop1(j) lex[index(0, j, p)] = node++; 1993dd0d304SLisandro Dalcin loop1(j) lex[index(p, j, p)] = node++; 2003dd0d304SLisandro Dalcin loop1(i) lex[index(p - i, p, p)] = node++; 2013dd0d304SLisandro Dalcin /* internal face nodes */ 2023dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2033dd0d304SLisandro Dalcin loop2(i, j) lex[index(i, j, 0)] = *sub++; 2043dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2053dd0d304SLisandro Dalcin loop2(k, i) lex[index(i, 0, k)] = *sub++; 2063dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2073dd0d304SLisandro Dalcin loop2(j, k) lex[index(0, j, k)] = *sub++; 2083dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2093dd0d304SLisandro Dalcin loop2(k, j) lex[index(p, j, k)] = *sub++; 2103dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2113dd0d304SLisandro Dalcin loop2(k, i) lex[index(p - i, p, k)] = *sub++; 2123dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2133dd0d304SLisandro Dalcin loop2(j, i) lex[index(i, j, p)] = *sub++; 2143dd0d304SLisandro Dalcin /* internal cell nodes */ 2153dd0d304SLisandro Dalcin node = GmshLexOrder_HEX(p - 2, sub = buf, node); 2163dd0d304SLisandro Dalcin loop3(k, j, i) lex[index(i, j, k)] = *sub++; 2173dd0d304SLisandro Dalcin return node; 2183dd0d304SLisandro Dalcin #undef loop1 2193dd0d304SLisandro Dalcin #undef loop2 2203dd0d304SLisandro Dalcin #undef loop3 2213dd0d304SLisandro Dalcin #undef index 2223dd0d304SLisandro Dalcin } 2233dd0d304SLisandro Dalcin 224d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_PRI(int p, int lex[], int node) 225d71ae5a4SJacob Faibussowitsch { 2263dd0d304SLisandro Dalcin #define loop1(i) BL1(p, i) 2273dd0d304SLisandro Dalcin #define loops(i, j) SL2(p, i, j) 2283dd0d304SLisandro Dalcin #define loopb(i, j) BL2(p, i, j) 2293dd0d304SLisandro Dalcin #define index(i, j, k) (SI2(p, i, j) + BI1(p, k) * SN2(p)) 2303dd0d304SLisandro Dalcin int i, j, k, *sub, buf[BN2(GMSH_MAX_ORDER)]; 2313dd0d304SLisandro Dalcin /* trivial case */ 2323dd0d304SLisandro Dalcin if (p == 0) lex[0] = node++; 2333dd0d304SLisandro Dalcin if (p == 0) return node; 2343dd0d304SLisandro Dalcin /* vertex nodes */ 2353dd0d304SLisandro Dalcin lex[index(0, 0, 0)] = node++; 2363dd0d304SLisandro Dalcin lex[index(p, 0, 0)] = node++; 2373dd0d304SLisandro Dalcin lex[index(0, p, 0)] = node++; 2383dd0d304SLisandro Dalcin lex[index(0, 0, p)] = node++; 2393dd0d304SLisandro Dalcin lex[index(p, 0, p)] = node++; 2403dd0d304SLisandro Dalcin lex[index(0, p, p)] = node++; 2413dd0d304SLisandro Dalcin if (p == 1) return node; 2423dd0d304SLisandro Dalcin /* internal edge nodes */ 2433dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, 0)] = node++; 2443dd0d304SLisandro Dalcin loop1(j) lex[index(0, j, 0)] = node++; 2453dd0d304SLisandro Dalcin loop1(k) lex[index(0, 0, k)] = node++; 2463dd0d304SLisandro Dalcin loop1(j) lex[index(p - j, j, 0)] = node++; 2473dd0d304SLisandro Dalcin loop1(k) lex[index(p, 0, k)] = node++; 2483dd0d304SLisandro Dalcin loop1(k) lex[index(0, p, k)] = node++; 2493dd0d304SLisandro Dalcin loop1(i) lex[index(i, 0, p)] = node++; 2503dd0d304SLisandro Dalcin loop1(j) lex[index(0, j, p)] = node++; 2513dd0d304SLisandro Dalcin loop1(j) lex[index(p - j, j, p)] = node++; 2523dd0d304SLisandro Dalcin if (p >= 3) { 2533dd0d304SLisandro Dalcin /* internal bottom face nodes */ 2543dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 2553dd0d304SLisandro Dalcin loops(i, j) lex[index(i, j, 0)] = *sub++; 2563dd0d304SLisandro Dalcin /* internal top face nodes */ 2573dd0d304SLisandro Dalcin node = GmshLexOrder_TRI(p - 3, sub = buf, node); 2583dd0d304SLisandro Dalcin loops(j, i) lex[index(i, j, p)] = *sub++; 2593dd0d304SLisandro Dalcin } 2603dd0d304SLisandro Dalcin if (p >= 2) { 2613dd0d304SLisandro Dalcin /* internal front face nodes */ 2623dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2633dd0d304SLisandro Dalcin loopb(k, i) lex[index(i, 0, k)] = *sub++; 2643dd0d304SLisandro Dalcin /* internal left face nodes */ 2653dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2663dd0d304SLisandro Dalcin loopb(j, k) lex[index(0, j, k)] = *sub++; 2673dd0d304SLisandro Dalcin /* internal back face nodes */ 2683dd0d304SLisandro Dalcin node = GmshLexOrder_QUA(p - 2, sub = buf, node); 2693dd0d304SLisandro Dalcin loopb(k, j) lex[index(p - j, j, k)] = *sub++; 2703dd0d304SLisandro Dalcin } 2713dd0d304SLisandro Dalcin if (p >= 3) { 2723dd0d304SLisandro Dalcin /* internal cell nodes */ 2739371c9d4SSatish Balay typedef struct { 2749371c9d4SSatish Balay int i, j; 2759371c9d4SSatish Balay } pair; 2763dd0d304SLisandro Dalcin pair ij[SN2(GMSH_MAX_ORDER)], tmp[SN2(GMSH_MAX_ORDER)]; 2773dd0d304SLisandro Dalcin int m = GmshLexOrder_TRI(p - 3, sub = buf, 0), l = 0; 278d71ae5a4SJacob Faibussowitsch loops(j, i) 279d71ae5a4SJacob Faibussowitsch { 2809371c9d4SSatish Balay tmp[l].i = i; 2819371c9d4SSatish Balay tmp[l].j = j; 2829371c9d4SSatish Balay l++; 2839371c9d4SSatish Balay } 2843dd0d304SLisandro Dalcin for (l = 0; l < m; ++l) ij[sub[l]] = tmp[l]; 2853dd0d304SLisandro Dalcin for (l = 0; l < m; ++l) { 2869371c9d4SSatish Balay i = ij[l].i; 2879371c9d4SSatish Balay j = ij[l].j; 2883dd0d304SLisandro Dalcin node = GmshLexOrder_SEG(p - 2, sub = buf, node); 2893dd0d304SLisandro Dalcin loop1(k) lex[index(i, j, k)] = *sub++; 2903dd0d304SLisandro Dalcin } 2913dd0d304SLisandro Dalcin } 2923dd0d304SLisandro Dalcin return node; 2933dd0d304SLisandro Dalcin #undef loop1 2943dd0d304SLisandro Dalcin #undef loops 2953dd0d304SLisandro Dalcin #undef loopb 2963dd0d304SLisandro Dalcin #undef index 2973dd0d304SLisandro Dalcin } 2983dd0d304SLisandro Dalcin 299d71ae5a4SJacob Faibussowitsch static inline int GmshLexOrder_PYR(int p, int lex[], int node) 300d71ae5a4SJacob Faibussowitsch { 3013dd0d304SLisandro Dalcin int i, m = GmshNumNodes_PYR(p); 302ad540459SPierre Jolivet for (i = 0; i < m; ++i) lex[i] = node++; /* TODO */ 3033dd0d304SLisandro Dalcin return node; 3043dd0d304SLisandro Dalcin } 305