188 std::vector<std::array<t_index, 3>> ret;
189 using tArr = std::array<t_index, 3>;
195 ret.emplace_back(tArr{1, -1, 0});
197 ret.emplace_back(tArr{-i, -1 - i, 0});
206 auto ijG = [=](
int i,
int j)
207 {
return nGL *
j +
i; };
212 ret.emplace_back(tArr{1, 2, -1 - ijG(0, 0)});
213 for (
int i = 0;
i < iMax;
i++)
214 ret.emplace_back(tArr{-1 - ijG(
i + 1, 0), -1 - ijG(
i, 0), 2});
215 ret.emplace_back(tArr{3, 4, -1 - ijG(iMax, iMax)});
216 for (
int i = 0;
i < iMax;
i++)
217 ret.emplace_back(tArr{-1 - ijG(
i, iMax), -1 - ijG(
i + 1, iMax), 4});
218 ret.emplace_back(tArr{2, 3, -1 - ijG(iMax, 0)});
219 for (
int i = 0;
i < iMax;
i++)
220 ret.emplace_back(tArr{-1 - ijG(iMax,
i + 1), -1 - ijG(iMax,
i), 3});
221 ret.emplace_back(tArr{4, 1, -1 - ijG(0, iMax)});
222 for (
int i = 0;
i < iMax;
i++)
223 ret.emplace_back(tArr{-1 - ijG(0,
i), -1 - ijG(0,
i + 1), 1});
225 else if (q.elem.GetOrder() == 2)
227 ret.emplace_back(tArr{1, 5, -1 - ijG(0, 0)});
228 ret.emplace_back(tArr{5, 2, -1 - ijG(iMax, 0)});
229 for (
int i = 0;
i < iMax;
i++)
230 ret.emplace_back(tArr{-1 - ijG(
i + 1, 0), -1 - ijG(
i, 0), 5});
231 ret.emplace_back(tArr{3, 7, -1 - ijG(iMax, iMax)});
232 ret.emplace_back(tArr{7, 4, -1 - ijG(0, iMax)});
233 for (
int i = 0;
i < iMax;
i++)
234 ret.emplace_back(tArr{-1 - ijG(
i, iMax), -1 - ijG(
i + 1, iMax), 7});
235 ret.emplace_back(tArr{2, 6, -1 - ijG(iMax, 0)});
236 ret.emplace_back(tArr{6, 3, -1 - ijG(iMax, iMax)});
237 for (
int i = 0;
i < iMax;
i++)
238 ret.emplace_back(tArr{-1 - ijG(iMax,
i + 1), -1 - ijG(iMax,
i), 6});
239 ret.emplace_back(tArr{4, 8, -1 - ijG(0, iMax)});
240 ret.emplace_back(tArr{8, 1, -1 - ijG(0, 0)});
241 for (
int i = 0;
i < iMax;
i++)
242 ret.emplace_back(tArr{-1 - ijG(0,
i), -1 - ijG(0,
i + 1), 8});
245 for (
int i = 0;
i < iMax;
i++)
246 for (
int j = 0;
j < iMax;
j++)
248 ret.emplace_back(tArr{-1 - ijG(
i,
j), -1 - ijG(
i + 1,
j), -1 - ijG(
i,
j + 1)});
249 ret.emplace_back(tArr{-1 - ijG(
i + 1,
j + 1), -1 - ijG(
i,
j + 1), -1 - ijG(
i + 1,
j)});
253 else if (q.elem.GetParamSpace() == ParamSpace::TriSpace)
255 if (q.GetNumPoints() == 1)
257 if (q.elem.GetOrder() == 1)
259 ret.emplace_back(tArr{1, 2, -1});
260 ret.emplace_back(tArr{2, 3, -1});
261 ret.emplace_back(tArr{3, 1, -1});
263 else if (q.elem.GetOrder() == 2)
265 ret.emplace_back(tArr{1, 4, -1});
266 ret.emplace_back(tArr{4, 2, -1});
267 ret.emplace_back(tArr{2, 5, -1});
268 ret.emplace_back(tArr{5, 3, -1});
269 ret.emplace_back(tArr{3, 6, -1});
270 ret.emplace_back(tArr{6, 1, -1});
273 else if (q.GetNumPoints() == 3)
275 if (q.elem.GetOrder() == 1)
277 ret.emplace_back(tArr{1, 2, -3});
278 ret.emplace_back(tArr{2, -1, -3});
279 ret.emplace_back(tArr{2, 3, -1});
280 ret.emplace_back(tArr{3, -2, -1});
281 ret.emplace_back(tArr{3, 1, -2});
282 ret.emplace_back(tArr{1, -3, -2});
284 ret.emplace_back(tArr{-1, -2, -3});
286 else if (q.elem.GetOrder() == 2)
288 ret.emplace_back(tArr{1, 4, -3});
289 ret.emplace_back(tArr{4, 2, -1});
290 ret.emplace_back(tArr{2, 5, -1});
291 ret.emplace_back(tArr{5, 3, -2});
292 ret.emplace_back(tArr{3, 6, -2});
293 ret.emplace_back(tArr{6, 1, -3});
295 ret.emplace_back(tArr{-1, -3, 4});
296 ret.emplace_back(tArr{-2, -1, 5});
297 ret.emplace_back(tArr{-3, -2, 6});
299 ret.emplace_back(tArr{-1, -2, -3});
302 else if (q.GetNumPoints() == 6)
304 if (q.elem.GetOrder() == 1)
306 ret.emplace_back(tArr{1, 2, -6});
307 ret.emplace_back(tArr{2, 3, -4});
308 ret.emplace_back(tArr{3, 1, -5});
310 ret.emplace_back(tArr{-6, -1, 1});
311 ret.emplace_back(tArr{-2, -6, 2});
312 ret.emplace_back(tArr{-4, -2, 2});
313 ret.emplace_back(tArr{-3, -4, 3});
314 ret.emplace_back(tArr{-5, -3, 3});
315 ret.emplace_back(tArr{-1, -5, 1});
317 ret.emplace_back(tArr{-4, -5, -6});
318 ret.emplace_back(tArr{-1, -6, -5});
319 ret.emplace_back(tArr{-6, -2, -4});
320 ret.emplace_back(tArr{-5, -4, -3});
322 else if (q.elem.GetOrder() == 2)
324 ret.emplace_back(tArr{1, 4, -6});
325 ret.emplace_back(tArr{4, 2, -6});
326 ret.emplace_back(tArr{2, 5, -4});
327 ret.emplace_back(tArr{5, 3, -4});
328 ret.emplace_back(tArr{3, 6, -5});
329 ret.emplace_back(tArr{6, 1, -5});
331 ret.emplace_back(tArr{-6, -1, 1});
332 ret.emplace_back(tArr{-2, -6, 2});
333 ret.emplace_back(tArr{-4, -2, 2});
334 ret.emplace_back(tArr{-3, -4, 3});
335 ret.emplace_back(tArr{-5, -3, 3});
336 ret.emplace_back(tArr{-1, -5, 1});
338 ret.emplace_back(tArr{-4, -5, -6});
339 ret.emplace_back(tArr{-1, -6, -5});
340 ret.emplace_back(tArr{-6, -2, -4});
341 ret.emplace_back(tArr{-5, -4, -3});
344 else if (q.GetNumPoints() == 7)
346 static const std::array<int, 7> idxTri6ToTri7{
347 -1, 5, 6, 7, 2, 3, 4};
348 if (q.elem.GetOrder() == 1)
350 ret.emplace_back(tArr{1, 2, -idxTri6ToTri7[6]});
351 ret.emplace_back(tArr{2, 3, -idxTri6ToTri7[4]});
352 ret.emplace_back(tArr{3, 1, -idxTri6ToTri7[5]});
354 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[1], 1});
355 ret.emplace_back(tArr{-idxTri6ToTri7[2], -idxTri6ToTri7[6], 2});
356 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[2], 2});
357 ret.emplace_back(tArr{-idxTri6ToTri7[3], -idxTri6ToTri7[4], 3});
358 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[3], 3});
359 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[5], 1});
361 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[5], -1});
362 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[6], -1});
363 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[4], -1});
365 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[6], -idxTri6ToTri7[5]});
366 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[2], -idxTri6ToTri7[4]});
367 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[4], -idxTri6ToTri7[3]});
369 else if (q.elem.GetOrder() == 2)
371 ret.emplace_back(tArr{1, 4, -idxTri6ToTri7[6]});
372 ret.emplace_back(tArr{4, 2, -idxTri6ToTri7[6]});
373 ret.emplace_back(tArr{2, 5, -idxTri6ToTri7[4]});
374 ret.emplace_back(tArr{5, 3, -idxTri6ToTri7[4]});
375 ret.emplace_back(tArr{3, 6, -idxTri6ToTri7[5]});
376 ret.emplace_back(tArr{6, 1, -idxTri6ToTri7[5]});
378 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[1], 1});
379 ret.emplace_back(tArr{-idxTri6ToTri7[2], -idxTri6ToTri7[6], 2});
380 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[2], 2});
381 ret.emplace_back(tArr{-idxTri6ToTri7[3], -idxTri6ToTri7[4], 3});
382 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[3], 3});
383 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[5], 1});
385 ret.emplace_back(tArr{-idxTri6ToTri7[4], -idxTri6ToTri7[5], -1});
386 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[6], -1});
387 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[4], -1});
389 ret.emplace_back(tArr{-idxTri6ToTri7[1], -idxTri6ToTri7[6], -idxTri6ToTri7[5]});
390 ret.emplace_back(tArr{-idxTri6ToTri7[6], -idxTri6ToTri7[2], -idxTri6ToTri7[4]});
391 ret.emplace_back(tArr{-idxTri6ToTri7[5], -idxTri6ToTri7[4], -idxTri6ToTri7[3]});
394 else if (q.GetNumPoints() == 12)
396 if (q.elem.GetOrder() == 1)
398 ret.emplace_back(tArr{1, 2, -4});
399 ret.emplace_back(tArr{2, 3, -5});
400 ret.emplace_back(tArr{3, 1, -6});
402 ret.emplace_back(tArr{-7, -4, 2});
403 ret.emplace_back(tArr{-9, -7, 2});
404 ret.emplace_back(tArr{-5, -9, 2});
406 ret.emplace_back(tArr{-11, -5, 3});
407 ret.emplace_back(tArr{-12, -11, 3});
408 ret.emplace_back(tArr{-6, -12, 3});
410 ret.emplace_back(tArr{-10, -6, 1});
411 ret.emplace_back(tArr{-8, -10, 1});
412 ret.emplace_back(tArr{-4, -8, 1});
414 ret.emplace_back(tArr{-4, -7, -8});
415 ret.emplace_back(tArr{-9, -5, -11});
416 ret.emplace_back(tArr{-10, -12, -6});
417 ret.emplace_back(tArr{-8, -7, -1});
418 ret.emplace_back(tArr{-2, -9, -11});
419 ret.emplace_back(tArr{-3, -12, -10});
421 ret.emplace_back(tArr{-7, -9, -2});
422 ret.emplace_back(tArr{-7, -2, -1});
423 ret.emplace_back(tArr{-11, -12, -3});
424 ret.emplace_back(tArr{-11, -3, -2});
425 ret.emplace_back(tArr{-10, -8, -1});
426 ret.emplace_back(tArr{-10, -1, -3});
428 ret.emplace_back(tArr{-1, -2, -3});
430 else if (q.elem.GetOrder() == 2)
432 ret.emplace_back(tArr{1, 4, -4});
433 ret.emplace_back(tArr{4, 2, -5});
434 ret.emplace_back(tArr{2, 5, -5});
435 ret.emplace_back(tArr{5, 3, -6});
436 ret.emplace_back(tArr{3, 6, -6});
437 ret.emplace_back(tArr{6, 1, -4});
439 ret.emplace_back(tArr{-7, -4, 4});
440 ret.emplace_back(tArr{-9, -7, 4});
441 ret.emplace_back(tArr{-5, -9, 4});
443 ret.emplace_back(tArr{-11, -5, 5});
444 ret.emplace_back(tArr{-12, -11, 5});
445 ret.emplace_back(tArr{-6, -12, 5});
447 ret.emplace_back(tArr{-10, -6, 6});
448 ret.emplace_back(tArr{-8, -10, 6});
449 ret.emplace_back(tArr{-4, -8, 6});
451 ret.emplace_back(tArr{-4, -7, -8});
452 ret.emplace_back(tArr{-9, -5, -11});
453 ret.emplace_back(tArr{-10, -12, -6});
454 ret.emplace_back(tArr{-8, -7, -1});
455 ret.emplace_back(tArr{-2, -9, -11});
456 ret.emplace_back(tArr{-3, -12, -10});
458 ret.emplace_back(tArr{-7, -9, -2});
459 ret.emplace_back(tArr{-7, -2, -1});
460 ret.emplace_back(tArr{-11, -12, -3});
461 ret.emplace_back(tArr{-11, -3, -2});
462 ret.emplace_back(tArr{-10, -8, -1});
463 ret.emplace_back(tArr{-10, -1, -3});
465 ret.emplace_back(tArr{-1, -2, -3});