187 std::vector<std::array<t_index, 3>> ret;
188 using tArr = std::array<t_index, 3>;
194 ret.emplace_back(tArr{1, -1, 0});
196 ret.emplace_back(tArr{-i, -1 - i, 0});
205 auto ijG = [=](
int i,
int j)
206 {
return nGL * j + i; };
211 ret.emplace_back(tArr{1, 2, -1 - ijG(0, 0)});
212 for (
int i = 0; i < iMax; i++)
213 ret.emplace_back(tArr{-1 - ijG(i + 1, 0), -1 - ijG(i, 0), 2});
214 ret.emplace_back(tArr{3, 4, -1 - ijG(iMax, iMax)});
215 for (
int i = 0; i < iMax; i++)
216 ret.emplace_back(tArr{-1 - ijG(i, iMax), -1 - ijG(i + 1, iMax), 4});
217 ret.emplace_back(tArr{2, 3, -1 - ijG(iMax, 0)});
218 for (
int i = 0; i < iMax; i++)
219 ret.emplace_back(tArr{-1 - ijG(iMax, i + 1), -1 - ijG(iMax, i), 3});
220 ret.emplace_back(tArr{4, 1, -1 - ijG(0, iMax)});
221 for (
int i = 0; i < iMax; i++)
222 ret.emplace_back(tArr{-1 - ijG(0, i), -1 - ijG(0, i + 1), 1});
224 else if (q.elem.GetOrder() == 2)
226 ret.emplace_back(tArr{1, 5, -1 - ijG(0, 0)});
227 ret.emplace_back(tArr{5, 2, -1 - ijG(iMax, 0)});
228 for (
int i = 0; i < iMax; i++)
229 ret.emplace_back(tArr{-1 - ijG(i + 1, 0), -1 - ijG(i, 0), 5});
230 ret.emplace_back(tArr{3, 7, -1 - ijG(iMax, iMax)});
231 ret.emplace_back(tArr{7, 4, -1 - ijG(0, iMax)});
232 for (
int i = 0; i < iMax; i++)
233 ret.emplace_back(tArr{-1 - ijG(i, iMax), -1 - ijG(i + 1, iMax), 7});
234 ret.emplace_back(tArr{2, 6, -1 - ijG(iMax, 0)});
235 ret.emplace_back(tArr{6, 3, -1 - ijG(iMax, iMax)});
236 for (
int i = 0; i < iMax; i++)
237 ret.emplace_back(tArr{-1 - ijG(iMax, i + 1), -1 - ijG(iMax, i), 6});
238 ret.emplace_back(tArr{4, 8, -1 - ijG(0, iMax)});
239 ret.emplace_back(tArr{8, 1, -1 - ijG(0, 0)});
240 for (
int i = 0; i < iMax; i++)
241 ret.emplace_back(tArr{-1 - ijG(0, i), -1 - ijG(0, i + 1), 8});
244 for (
int i = 0; i < iMax; i++)
245 for (
int j = 0; j < iMax; j++)
247 ret.emplace_back(tArr{-1 - ijG(i, j), -1 - ijG(i + 1, j), -1 - ijG(i, j + 1)});
248 ret.emplace_back(tArr{-1 - ijG(i + 1, j + 1), -1 - ijG(i, j + 1), -1 - ijG(i + 1, j)});
252 else if (q.elem.GetParamSpace() == ParamSpace::TriSpace)
254 if (q.GetNumPoints() == 1)
256 if (q.elem.GetOrder() == 1)
258 ret.emplace_back(tArr{1, 2, -1});
259 ret.emplace_back(tArr{2, 3, -1});
260 ret.emplace_back(tArr{3, 1, -1});
262 else if (q.elem.GetOrder() == 2)
264 ret.emplace_back(tArr{1, 4, -1});
265 ret.emplace_back(tArr{4, 2, -1});
266 ret.emplace_back(tArr{2, 5, -1});
267 ret.emplace_back(tArr{5, 3, -1});
268 ret.emplace_back(tArr{3, 6, -1});
269 ret.emplace_back(tArr{6, 1, -1});
272 else if (q.GetNumPoints() == 3)
274 if (q.elem.GetOrder() == 1)
276 ret.emplace_back(tArr{1, 2, -3});
277 ret.emplace_back(tArr{2, -1, -3});
278 ret.emplace_back(tArr{2, 3, -1});
279 ret.emplace_back(tArr{3, -2, -1});
280 ret.emplace_back(tArr{3, 1, -2});
281 ret.emplace_back(tArr{1, -3, -2});
283 ret.emplace_back(tArr{-1, -2, -3});
285 else if (q.elem.GetOrder() == 2)
287 ret.emplace_back(tArr{1, 4, -3});
288 ret.emplace_back(tArr{4, 2, -1});
289 ret.emplace_back(tArr{2, 5, -1});
290 ret.emplace_back(tArr{5, 3, -2});
291 ret.emplace_back(tArr{3, 6, -2});
292 ret.emplace_back(tArr{6, 1, -3});
294 ret.emplace_back(tArr{-1, -3, 4});
295 ret.emplace_back(tArr{-2, -1, 5});
296 ret.emplace_back(tArr{-3, -2, 6});
298 ret.emplace_back(tArr{-1, -2, -3});
301 else if (q.GetNumPoints() == 6)
303 if (q.elem.GetOrder() == 1)
305 ret.emplace_back(tArr{1, 2, -6});
306 ret.emplace_back(tArr{2, 3, -4});
307 ret.emplace_back(tArr{3, 1, -5});
309 ret.emplace_back(tArr{-6, -1, 1});
310 ret.emplace_back(tArr{-2, -6, 2});
311 ret.emplace_back(tArr{-4, -2, 2});
312 ret.emplace_back(tArr{-3, -4, 3});
313 ret.emplace_back(tArr{-5, -3, 3});
314 ret.emplace_back(tArr{-1, -5, 1});
316 ret.emplace_back(tArr{-4, -5, -6});
317 ret.emplace_back(tArr{-1, -6, -5});
318 ret.emplace_back(tArr{-6, -2, -4});
319 ret.emplace_back(tArr{-5, -4, -3});
321 else if (q.elem.GetOrder() == 2)
323 ret.emplace_back(tArr{1, 4, -6});
324 ret.emplace_back(tArr{4, 2, -6});
325 ret.emplace_back(tArr{2, 5, -4});
326 ret.emplace_back(tArr{5, 3, -4});
327 ret.emplace_back(tArr{3, 6, -5});
328 ret.emplace_back(tArr{6, 1, -5});
330 ret.emplace_back(tArr{-6, -1, 1});
331 ret.emplace_back(tArr{-2, -6, 2});
332 ret.emplace_back(tArr{-4, -2, 2});
333 ret.emplace_back(tArr{-3, -4, 3});
334 ret.emplace_back(tArr{-5, -3, 3});
335 ret.emplace_back(tArr{-1, -5, 1});
337 ret.emplace_back(tArr{-4, -5, -6});
338 ret.emplace_back(tArr{-1, -6, -5});
339 ret.emplace_back(tArr{-6, -2, -4});
340 ret.emplace_back(tArr{-5, -4, -3});
343 else if (q.GetNumPoints() == 7)
345 static const std::array<int, 7> idxTri6ToTri7{
346 -1, 5, 6, 7, 2, 3, 4};
347 if (q.elem.GetOrder() == 1)
349 ret.emplace_back(tArr{1, 2, -idxTri6ToTri7[6]});
350 ret.emplace_back(tArr{2, 3, -idxTri6ToTri7[4]});
351 ret.emplace_back(tArr{3, 1, -idxTri6ToTri7[5]});
353 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[1], 1});
354 ret.emplace_back(tArr{-idxTri6ToTri7[2], -idxTri6ToTri7[6], 2});
355 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[2], 2});
356 ret.emplace_back(tArr{-idxTri6ToTri7[3], -idxTri6ToTri7[4], 3});
357 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[3], 3});
358 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[5], 1});
360 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[5], -1});
361 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[6], -1});
362 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[4], -1});
364 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[6], -idxTri6ToTri7[5]});
365 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[2], -idxTri6ToTri7[4]});
366 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[4], -idxTri6ToTri7[3]});
368 else if (q.elem.GetOrder() == 2)
370 ret.emplace_back(tArr{1, 4, -idxTri6ToTri7[6]});
371 ret.emplace_back(tArr{4, 2, -idxTri6ToTri7[6]});
372 ret.emplace_back(tArr{2, 5, -idxTri6ToTri7[4]});
373 ret.emplace_back(tArr{5, 3, -idxTri6ToTri7[4]});
374 ret.emplace_back(tArr{3, 6, -idxTri6ToTri7[5]});
375 ret.emplace_back(tArr{6, 1, -idxTri6ToTri7[5]});
377 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[1], 1});
378 ret.emplace_back(tArr{-idxTri6ToTri7[2], -idxTri6ToTri7[6], 2});
379 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[2], 2});
380 ret.emplace_back(tArr{-idxTri6ToTri7[3], -idxTri6ToTri7[4], 3});
381 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[3], 3});
382 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[5], 1});
384 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[5], -1});
385 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[6], -1});
386 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[4], -1});
388 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[6], -idxTri6ToTri7[5]});
389 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[2], -idxTri6ToTri7[4]});
390 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[4], -idxTri6ToTri7[3]});
393 else if (q.GetNumPoints() == 12)
395 if (q.elem.GetOrder() == 1)
397 ret.emplace_back(tArr{1, 2, -4});
398 ret.emplace_back(tArr{2, 3, -5});
399 ret.emplace_back(tArr{3, 1, -6});
401 ret.emplace_back(tArr{-7, -4, 2});
402 ret.emplace_back(tArr{-9, -7, 2});
403 ret.emplace_back(tArr{-5, -9, 2});
405 ret.emplace_back(tArr{-11, -5, 3});
406 ret.emplace_back(tArr{-12, -11, 3});
407 ret.emplace_back(tArr{-6, -12, 3});
409 ret.emplace_back(tArr{-10, -6, 1});
410 ret.emplace_back(tArr{-8, -10, 1});
411 ret.emplace_back(tArr{-4, -8, 1});
413 ret.emplace_back(tArr{-4, -7, -8});
414 ret.emplace_back(tArr{-9, -5, -11});
415 ret.emplace_back(tArr{-10, -12, -6});
416 ret.emplace_back(tArr{-8, -7, -1});
417 ret.emplace_back(tArr{-2, -9, -11});
418 ret.emplace_back(tArr{-3, -12, -10});
420 ret.emplace_back(tArr{-7, -9, -2});
421 ret.emplace_back(tArr{-7, -2, -1});
422 ret.emplace_back(tArr{-11, -12, -3});
423 ret.emplace_back(tArr{-11, -3, -2});
424 ret.emplace_back(tArr{-10, -8, -1});
425 ret.emplace_back(tArr{-10, -1, -3});
427 ret.emplace_back(tArr{-1, -2, -3});
429 else if (q.elem.GetOrder() == 2)
431 ret.emplace_back(tArr{1, 4, -4});
432 ret.emplace_back(tArr{4, 2, -5});
433 ret.emplace_back(tArr{2, 5, -5});
434 ret.emplace_back(tArr{5, 3, -6});
435 ret.emplace_back(tArr{3, 6, -6});
436 ret.emplace_back(tArr{6, 1, -4});
438 ret.emplace_back(tArr{-7, -4, 4});
439 ret.emplace_back(tArr{-9, -7, 4});
440 ret.emplace_back(tArr{-5, -9, 4});
442 ret.emplace_back(tArr{-11, -5, 5});
443 ret.emplace_back(tArr{-12, -11, 5});
444 ret.emplace_back(tArr{-6, -12, 5});
446 ret.emplace_back(tArr{-10, -6, 6});
447 ret.emplace_back(tArr{-8, -10, 6});
448 ret.emplace_back(tArr{-4, -8, 6});
450 ret.emplace_back(tArr{-4, -7, -8});
451 ret.emplace_back(tArr{-9, -5, -11});
452 ret.emplace_back(tArr{-10, -12, -6});
453 ret.emplace_back(tArr{-8, -7, -1});
454 ret.emplace_back(tArr{-2, -9, -11});
455 ret.emplace_back(tArr{-3, -12, -10});
457 ret.emplace_back(tArr{-7, -9, -2});
458 ret.emplace_back(tArr{-7, -2, -1});
459 ret.emplace_back(tArr{-11, -12, -3});
460 ret.emplace_back(tArr{-11, -3, -2});
461 ret.emplace_back(tArr{-10, -8, -1});
462 ret.emplace_back(tArr{-10, -1, -3});
464 ret.emplace_back(tArr{-1, -2, -3});