23static void PAHcurlApplyGradient2D(
const int c_dofs1D,
26 const Array<real_t> &B_,
27 const Array<real_t> &G_,
31 auto B =
Reshape(B_.Read(), c_dofs1D, c_dofs1D);
32 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
34 auto x =
Reshape(x_.Read(), c_dofs1D, c_dofs1D, NE);
35 auto y =
Reshape(y_.ReadWrite(), 2 * c_dofs1D * o_dofs1D, NE);
38 o_dofs1D <= c_dofs1D,
"");
42 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
43 real_t w[MAX_D1D][MAX_D1D];
46 for (
int dx = 0; dx < c_dofs1D; ++dx)
48 for (
int ey = 0; ey < c_dofs1D; ++ey)
51 for (
int dy = 0; dy < c_dofs1D; ++dy)
53 w[dx][ey] += B(ey, dy) * x(dx, dy, e);
58 for (
int ey = 0; ey < c_dofs1D; ++ey)
60 for (
int ex = 0; ex < o_dofs1D; ++ex)
63 for (
int dx = 0; dx < c_dofs1D; ++dx)
65 s += G(ex, dx) * w[dx][ey];
67 const int local_index = ey*o_dofs1D + ex;
68 y(local_index, e) += s;
73 for (
int dx = 0; dx < c_dofs1D; ++dx)
75 for (
int ey = 0; ey < o_dofs1D; ++ey)
78 for (
int dy = 0; dy < c_dofs1D; ++dy)
80 w[dx][ey] += G(ey, dy) * x(dx, dy, e);
85 for (
int ey = 0; ey < o_dofs1D; ++ey)
87 for (
int ex = 0; ex < c_dofs1D; ++ex)
90 for (
int dx = 0; dx < c_dofs1D; ++dx)
92 s += B(ex, dx) * w[dx][ey];
94 const int local_index = c_dofs1D * o_dofs1D + ey*c_dofs1D + ex;
95 y(local_index, e) += s;
102static void PAHcurlApplyGradient2DBId(
const int c_dofs1D,
105 const Array<real_t> &G_,
109 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
111 auto x =
Reshape(x_.Read(), c_dofs1D, c_dofs1D, NE);
112 auto y =
Reshape(y_.ReadWrite(), 2 * c_dofs1D * o_dofs1D, NE);
115 o_dofs1D <= c_dofs1D,
"");
119 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
120 real_t w[MAX_D1D][MAX_D1D];
123 for (
int dx = 0; dx < c_dofs1D; ++dx)
125 for (
int ey = 0; ey < c_dofs1D; ++ey)
128 w[dx][ey] = x(dx, dy, e);
132 for (
int ey = 0; ey < c_dofs1D; ++ey)
134 for (
int ex = 0; ex < o_dofs1D; ++ex)
137 for (
int dx = 0; dx < c_dofs1D; ++dx)
139 s += G(ex, dx) * w[dx][ey];
141 const int local_index = ey*o_dofs1D + ex;
142 y(local_index, e) += s;
147 for (
int dx = 0; dx < c_dofs1D; ++dx)
149 for (
int ey = 0; ey < o_dofs1D; ++ey)
152 for (
int dy = 0; dy < c_dofs1D; ++dy)
154 w[dx][ey] += G(ey, dy) * x(dx, dy, e);
159 for (
int ey = 0; ey < o_dofs1D; ++ey)
161 for (
int ex = 0; ex < c_dofs1D; ++ex)
164 const real_t s = w[dx][ey];
165 const int local_index = c_dofs1D * o_dofs1D + ey*c_dofs1D + ex;
166 y(local_index, e) += s;
172static void PAHcurlApplyGradientTranspose2D(
173 const int c_dofs1D,
const int o_dofs1D,
const int NE,
174 const Array<real_t> &B_,
const Array<real_t> &G_,
175 const Vector &x_, Vector &y_)
177 auto B =
Reshape(B_.Read(), c_dofs1D, c_dofs1D);
178 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
180 auto x =
Reshape(x_.Read(), 2 * c_dofs1D * o_dofs1D, NE);
181 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, NE);
184 o_dofs1D <= c_dofs1D,
"");
188 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
189 real_t w[MAX_D1D][MAX_D1D];
192 for (
int dy = 0; dy < c_dofs1D; ++dy)
194 for (
int ex = 0; ex < o_dofs1D; ++ex)
197 for (
int ey = 0; ey < c_dofs1D; ++ey)
199 const int local_index = ey*o_dofs1D + ex;
200 w[dy][ex] += B(ey, dy) * x(local_index, e);
205 for (
int dy = 0; dy < c_dofs1D; ++dy)
207 for (
int dx = 0; dx < c_dofs1D; ++dx)
210 for (
int ex = 0; ex < o_dofs1D; ++ex)
212 s += G(ex, dx) * w[dy][ex];
219 for (
int dy = 0; dy < c_dofs1D; ++dy)
221 for (
int ex = 0; ex < c_dofs1D; ++ex)
224 for (
int ey = 0; ey < o_dofs1D; ++ey)
226 const int local_index = c_dofs1D * o_dofs1D + ey*c_dofs1D + ex;
227 w[dy][ex] += G(ey, dy) * x(local_index, e);
232 for (
int dy = 0; dy < c_dofs1D; ++dy)
234 for (
int dx = 0; dx < c_dofs1D; ++dx)
237 for (
int ex = 0; ex < c_dofs1D; ++ex)
239 s += B(ex, dx) * w[dy][ex];
249static void PAHcurlApplyGradientTranspose2DBId(
250 const int c_dofs1D,
const int o_dofs1D,
const int NE,
251 const Array<real_t> &G_,
252 const Vector &x_, Vector &y_)
254 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
256 auto x =
Reshape(x_.Read(), 2 * c_dofs1D * o_dofs1D, NE);
257 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, NE);
260 o_dofs1D <= c_dofs1D,
"");
264 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
265 real_t w[MAX_D1D][MAX_D1D];
268 for (
int dy = 0; dy < c_dofs1D; ++dy)
270 for (
int ex = 0; ex < o_dofs1D; ++ex)
273 const int local_index = ey*o_dofs1D + ex;
274 w[dy][ex] = x(local_index, e);
278 for (
int dy = 0; dy < c_dofs1D; ++dy)
280 for (
int dx = 0; dx < c_dofs1D; ++dx)
283 for (
int ex = 0; ex < o_dofs1D; ++ex)
285 s += G(ex, dx) * w[dy][ex];
292 for (
int dy = 0; dy < c_dofs1D; ++dy)
294 for (
int ex = 0; ex < c_dofs1D; ++ex)
297 for (
int ey = 0; ey < o_dofs1D; ++ey)
299 const int local_index = c_dofs1D * o_dofs1D + ey*c_dofs1D + ex;
300 w[dy][ex] += G(ey, dy) * x(local_index, e);
305 for (
int dy = 0; dy < c_dofs1D; ++dy)
307 for (
int dx = 0; dx < c_dofs1D; ++dx)
310 const real_t s = w[dy][ex];
317static void PAHcurlApplyGradient3D(
const int c_dofs1D,
320 const Array<real_t> &B_,
321 const Array<real_t> &G_,
325 auto B =
Reshape(B_.Read(), c_dofs1D, c_dofs1D);
326 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
328 auto x =
Reshape(x_.Read(), c_dofs1D, c_dofs1D, c_dofs1D, NE);
329 auto y =
Reshape(y_.ReadWrite(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
332 o_dofs1D <= c_dofs1D,
"");
336 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
337 real_t w1[MAX_D1D][MAX_D1D][MAX_D1D];
338 real_t w2[MAX_D1D][MAX_D1D][MAX_D1D];
345 for (
int ez = 0; ez < c_dofs1D; ++ez)
347 for (
int dx = 0; dx < c_dofs1D; ++dx)
349 for (
int dy = 0; dy < c_dofs1D; ++dy)
351 w1[dx][dy][ez] = 0.0;
352 for (
int dz = 0; dz < c_dofs1D; ++dz)
354 w1[dx][dy][ez] += B(ez, dz) * x(dx, dy, dz, e);
361 for (
int ez = 0; ez < c_dofs1D; ++ez)
363 for (
int ey = 0; ey < c_dofs1D; ++ey)
365 for (
int dx = 0; dx < c_dofs1D; ++dx)
367 w2[dx][ey][ez] = 0.0;
368 for (
int dy = 0; dy < c_dofs1D; ++dy)
370 w2[dx][ey][ez] += B(ey, dy) * w1[dx][dy][ez];
377 for (
int ez = 0; ez < c_dofs1D; ++ez)
379 for (
int ey = 0; ey < c_dofs1D; ++ey)
381 for (
int ex = 0; ex < o_dofs1D; ++ex)
384 for (
int dx = 0; dx < c_dofs1D; ++dx)
386 s += G(ex, dx) * w2[dx][ey][ez];
388 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
389 y(local_index, e) += s;
399 for (
int ez = 0; ez < c_dofs1D; ++ez)
401 for (
int dx = 0; dx < c_dofs1D; ++dx)
403 for (
int dy = 0; dy < c_dofs1D; ++dy)
405 w1[dx][dy][ez] = 0.0;
406 for (
int dz = 0; dz < c_dofs1D; ++dz)
408 w1[dx][dy][ez] += B(ez, dz) * x(dx, dy, dz, e);
415 for (
int ez = 0; ez < c_dofs1D; ++ez)
417 for (
int ey = 0; ey < o_dofs1D; ++ey)
419 for (
int dx = 0; dx < c_dofs1D; ++dx)
421 w2[dx][ey][ez] = 0.0;
422 for (
int dy = 0; dy < c_dofs1D; ++dy)
424 w2[dx][ey][ez] += G(ey, dy) * w1[dx][dy][ez];
431 for (
int ez = 0; ez < c_dofs1D; ++ez)
433 for (
int ey = 0; ey < o_dofs1D; ++ey)
435 for (
int ex = 0; ex < c_dofs1D; ++ex)
438 for (
int dx = 0; dx < c_dofs1D; ++dx)
440 s += B(ex, dx) * w2[dx][ey][ez];
442 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
443 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
444 y(local_index, e) += s;
454 for (
int ez = 0; ez < o_dofs1D; ++ez)
456 for (
int dx = 0; dx < c_dofs1D; ++dx)
458 for (
int dy = 0; dy < c_dofs1D; ++dy)
460 w1[dx][dy][ez] = 0.0;
461 for (
int dz = 0; dz < c_dofs1D; ++dz)
463 w1[dx][dy][ez] += G(ez, dz) * x(dx, dy, dz, e);
470 for (
int ez = 0; ez < o_dofs1D; ++ez)
472 for (
int ey = 0; ey < c_dofs1D; ++ey)
474 for (
int dx = 0; dx < c_dofs1D; ++dx)
476 w2[dx][ey][ez] = 0.0;
477 for (
int dy = 0; dy < c_dofs1D; ++dy)
479 w2[dx][ey][ez] += B(ey, dy) * w1[dx][dy][ez];
486 for (
int ez = 0; ez < o_dofs1D; ++ez)
488 for (
int ey = 0; ey < c_dofs1D; ++ey)
490 for (
int ex = 0; ex < c_dofs1D; ++ex)
493 for (
int dx = 0; dx < c_dofs1D; ++dx)
495 s += B(ex, dx) * w2[dx][ey][ez];
497 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
498 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
499 y(local_index, e) += s;
507static void PAHcurlApplyGradient3DBId(
const int c_dofs1D,
510 const Array<real_t> &G_,
514 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
516 auto x =
Reshape(x_.Read(), c_dofs1D, c_dofs1D, c_dofs1D, NE);
517 auto y =
Reshape(y_.ReadWrite(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
520 o_dofs1D <= c_dofs1D,
"");
524 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
526 real_t w1[MAX_D1D][MAX_D1D][MAX_D1D];
527 real_t w2[MAX_D1D][MAX_D1D][MAX_D1D];
534 for (
int ez = 0; ez < c_dofs1D; ++ez)
536 for (
int dx = 0; dx < c_dofs1D; ++dx)
538 for (
int dy = 0; dy < c_dofs1D; ++dy)
541 w1[dx][dy][ez] = x(dx, dy, dz, e);
547 for (
int ez = 0; ez < c_dofs1D; ++ez)
549 for (
int ey = 0; ey < c_dofs1D; ++ey)
551 for (
int dx = 0; dx < c_dofs1D; ++dx)
554 w2[dx][ey][ez] = w1[dx][dy][ez];
560 for (
int ez = 0; ez < c_dofs1D; ++ez)
562 for (
int ey = 0; ey < c_dofs1D; ++ey)
564 for (
int ex = 0; ex < o_dofs1D; ++ex)
567 for (
int dx = 0; dx < c_dofs1D; ++dx)
569 s += G(ex, dx) * w2[dx][ey][ez];
571 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
572 y(local_index, e) += s;
582 for (
int ez = 0; ez < c_dofs1D; ++ez)
584 for (
int dx = 0; dx < c_dofs1D; ++dx)
586 for (
int dy = 0; dy < c_dofs1D; ++dy)
589 w1[dx][dy][ez] = x(dx, dy, dz, e);
595 for (
int ez = 0; ez < c_dofs1D; ++ez)
597 for (
int ey = 0; ey < o_dofs1D; ++ey)
599 for (
int dx = 0; dx < c_dofs1D; ++dx)
601 w2[dx][ey][ez] = 0.0;
602 for (
int dy = 0; dy < c_dofs1D; ++dy)
604 w2[dx][ey][ez] += G(ey, dy) * w1[dx][dy][ez];
611 for (
int ez = 0; ez < c_dofs1D; ++ez)
613 for (
int ey = 0; ey < o_dofs1D; ++ey)
615 for (
int ex = 0; ex < c_dofs1D; ++ex)
618 const real_t s = w2[dx][ey][ez];
619 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
620 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
621 y(local_index, e) += s;
631 for (
int ez = 0; ez < o_dofs1D; ++ez)
633 for (
int dx = 0; dx < c_dofs1D; ++dx)
635 for (
int dy = 0; dy < c_dofs1D; ++dy)
637 w1[dx][dy][ez] = 0.0;
638 for (
int dz = 0; dz < c_dofs1D; ++dz)
640 w1[dx][dy][ez] += G(ez, dz) * x(dx, dy, dz, e);
647 for (
int ez = 0; ez < o_dofs1D; ++ez)
649 for (
int ey = 0; ey < c_dofs1D; ++ey)
651 for (
int dx = 0; dx < c_dofs1D; ++dx)
654 w2[dx][ey][ez] = w1[dx][dy][ez];
660 for (
int ez = 0; ez < o_dofs1D; ++ez)
662 for (
int ey = 0; ey < c_dofs1D; ++ey)
664 for (
int ex = 0; ex < c_dofs1D; ++ex)
667 const real_t s = w2[dx][ey][ez];
668 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
669 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
670 y(local_index, e) += s;
677static void PAHcurlApplyGradientTranspose3D(
678 const int c_dofs1D,
const int o_dofs1D,
const int NE,
679 const Array<real_t> &B_,
const Array<real_t> &G_,
680 const Vector &x_, Vector &y_)
682 auto B =
Reshape(B_.Read(), c_dofs1D, c_dofs1D);
683 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
685 auto x =
Reshape(x_.Read(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
686 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, c_dofs1D, NE);
689 o_dofs1D <= c_dofs1D,
"");
693 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
694 real_t w1[MAX_D1D][MAX_D1D][MAX_D1D];
695 real_t w2[MAX_D1D][MAX_D1D][MAX_D1D];
701 for (
int dz = 0; dz < c_dofs1D; ++dz)
703 for (
int ex = 0; ex < o_dofs1D; ++ex)
705 for (
int ey = 0; ey < c_dofs1D; ++ey)
707 w1[ex][ey][dz] = 0.0;
708 for (
int ez = 0; ez < c_dofs1D; ++ez)
710 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
711 w1[ex][ey][dz] += B(ez, dz) * x(local_index, e);
718 for (
int dz = 0; dz < c_dofs1D; ++dz)
720 for (
int dy = 0; dy < c_dofs1D; ++dy)
722 for (
int ex = 0; ex < o_dofs1D; ++ex)
724 w2[ex][dy][dz] = 0.0;
725 for (
int ey = 0; ey < c_dofs1D; ++ey)
727 w2[ex][dy][dz] += B(ey, dy) * w1[ex][ey][dz];
734 for (
int dz = 0; dz < c_dofs1D; ++dz)
736 for (
int dy = 0; dy < c_dofs1D; ++dy)
738 for (
int dx = 0; dx < c_dofs1D; ++dx)
741 for (
int ex = 0; ex < o_dofs1D; ++ex)
743 s += G(ex, dx) * w2[ex][dy][dz];
745 y(dx, dy, dz, e) += s;
755 for (
int dz = 0; dz < c_dofs1D; ++dz)
757 for (
int ex = 0; ex < c_dofs1D; ++ex)
759 for (
int ey = 0; ey < o_dofs1D; ++ey)
761 w1[ex][ey][dz] = 0.0;
762 for (
int ez = 0; ez < c_dofs1D; ++ez)
764 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
765 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
766 w1[ex][ey][dz] += B(ez, dz) * x(local_index, e);
773 for (
int dz = 0; dz < c_dofs1D; ++dz)
775 for (
int dy = 0; dy < c_dofs1D; ++dy)
777 for (
int ex = 0; ex < c_dofs1D; ++ex)
779 w2[ex][dy][dz] = 0.0;
780 for (
int ey = 0; ey < o_dofs1D; ++ey)
782 w2[ex][dy][dz] += G(ey, dy) * w1[ex][ey][dz];
789 for (
int dz = 0; dz < c_dofs1D; ++dz)
791 for (
int dy = 0; dy < c_dofs1D; ++dy)
793 for (
int dx = 0; dx < c_dofs1D; ++dx)
796 for (
int ex = 0; ex < c_dofs1D; ++ex)
798 s += B(ex, dx) * w2[ex][dy][dz];
800 y(dx, dy, dz, e) += s;
810 for (
int dz = 0; dz < c_dofs1D; ++dz)
812 for (
int ex = 0; ex < c_dofs1D; ++ex)
814 for (
int ey = 0; ey < c_dofs1D; ++ey)
816 w1[ex][ey][dz] = 0.0;
817 for (
int ez = 0; ez < o_dofs1D; ++ez)
819 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
820 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
821 w1[ex][ey][dz] += G(ez, dz) * x(local_index, e);
828 for (
int dz = 0; dz < c_dofs1D; ++dz)
830 for (
int dy = 0; dy < c_dofs1D; ++dy)
832 for (
int ex = 0; ex < c_dofs1D; ++ex)
834 w2[ex][dy][dz] = 0.0;
835 for (
int ey = 0; ey < c_dofs1D; ++ey)
837 w2[ex][dy][dz] += B(ey, dy) * w1[ex][ey][dz];
844 for (
int dz = 0; dz < c_dofs1D; ++dz)
846 for (
int dy = 0; dy < c_dofs1D; ++dy)
848 for (
int dx = 0; dx < c_dofs1D; ++dx)
851 for (
int ex = 0; ex < c_dofs1D; ++ex)
853 s += B(ex, dx) * w2[ex][dy][dz];
855 y(dx, dy, dz, e) += s;
864static void PAHcurlApplyGradientTranspose3DBId(
865 const int c_dofs1D,
const int o_dofs1D,
const int NE,
866 const Array<real_t> &G_,
867 const Vector &x_, Vector &y_)
869 auto G =
Reshape(G_.Read(), o_dofs1D, c_dofs1D);
871 auto x =
Reshape(x_.Read(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
872 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, c_dofs1D, NE);
875 o_dofs1D <= c_dofs1D,
"");
879 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
881 real_t w1[MAX_D1D][MAX_D1D][MAX_D1D];
882 real_t w2[MAX_D1D][MAX_D1D][MAX_D1D];
888 for (
int dz = 0; dz < c_dofs1D; ++dz)
890 for (
int ex = 0; ex < o_dofs1D; ++ex)
892 for (
int ey = 0; ey < c_dofs1D; ++ey)
895 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
896 w1[ex][ey][dz] = x(local_index, e);
902 for (
int dz = 0; dz < c_dofs1D; ++dz)
904 for (
int dy = 0; dy < c_dofs1D; ++dy)
906 for (
int ex = 0; ex < o_dofs1D; ++ex)
909 w2[ex][dy][dz] = w1[ex][ey][dz];
915 for (
int dz = 0; dz < c_dofs1D; ++dz)
917 for (
int dy = 0; dy < c_dofs1D; ++dy)
919 for (
int dx = 0; dx < c_dofs1D; ++dx)
922 for (
int ex = 0; ex < o_dofs1D; ++ex)
924 s += G(ex, dx) * w2[ex][dy][dz];
926 y(dx, dy, dz, e) += s;
936 for (
int dz = 0; dz < c_dofs1D; ++dz)
938 for (
int ex = 0; ex < c_dofs1D; ++ex)
940 for (
int ey = 0; ey < o_dofs1D; ++ey)
943 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
944 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
945 w1[ex][ey][dz] = x(local_index, e);
951 for (
int dz = 0; dz < c_dofs1D; ++dz)
953 for (
int dy = 0; dy < c_dofs1D; ++dy)
955 for (
int ex = 0; ex < c_dofs1D; ++ex)
957 w2[ex][dy][dz] = 0.0;
958 for (
int ey = 0; ey < o_dofs1D; ++ey)
960 w2[ex][dy][dz] += G(ey, dy) * w1[ex][ey][dz];
967 for (
int dz = 0; dz < c_dofs1D; ++dz)
969 for (
int dy = 0; dy < c_dofs1D; ++dy)
971 for (
int dx = 0; dx < c_dofs1D; ++dx)
974 real_t s = w2[ex][dy][dz];
975 y(dx, dy, dz, e) += s;
985 for (
int dz = 0; dz < c_dofs1D; ++dz)
987 for (
int ex = 0; ex < c_dofs1D; ++ex)
989 for (
int ey = 0; ey < c_dofs1D; ++ey)
991 w1[ex][ey][dz] = 0.0;
992 for (
int ez = 0; ez < o_dofs1D; ++ez)
994 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
995 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
996 w1[ex][ey][dz] += G(ez, dz) * x(local_index, e);
1003 for (
int dz = 0; dz < c_dofs1D; ++dz)
1005 for (
int dy = 0; dy < c_dofs1D; ++dy)
1007 for (
int ex = 0; ex < c_dofs1D; ++ex)
1010 w2[ex][dy][dz] = w1[ex][ey][dz];
1016 for (
int dz = 0; dz < c_dofs1D; ++dz)
1018 for (
int dy = 0; dy < c_dofs1D; ++dy)
1020 for (
int dx = 0; dx < c_dofs1D; ++dx)
1023 real_t s = w2[ex][dy][dz];
1024 y(dx, dy, dz, e) += s;
1041 MFEM_VERIFY(trial_el != NULL,
"Only NodalTensorFiniteElement is supported!");
1045 MFEM_VERIFY(test_el != NULL,
"Only VectorTensorFiniteElement is supported!");
1047 const int dims = trial_el->
GetDim();
1048 MFEM_VERIFY(dims == 2 || dims == 3,
"Bad dimension!");
1050 MFEM_VERIFY(dim == 2 || dim == 3,
"Bad dimension!");
1052 "Orders do not match!");
1053 ne = trial_fes.
GetNE();
1055 const int order = trial_el->
GetOrder();
1066 o_dofs1D = maps_O_C->
nqpt;
1070 c_dofs1D = maps_O_C->
ndof;
1076 c_dofs1D = maps_C_C->
nqpt;
1086 PAHcurlApplyGradient3DBId(c_dofs1D, o_dofs1D, ne,
1091 PAHcurlApplyGradient3D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B,
1099 PAHcurlApplyGradient2DBId(c_dofs1D, o_dofs1D, ne,
1104 PAHcurlApplyGradient2D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B, maps_O_C->
G,
1120 PAHcurlApplyGradientTranspose3DBId(c_dofs1D, o_dofs1D, ne,
1125 PAHcurlApplyGradientTranspose3D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B,
1133 PAHcurlApplyGradientTranspose2DBId(c_dofs1D, o_dofs1D, ne,
1138 PAHcurlApplyGradientTranspose2D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B,
1148static void PAHcurlVecH1IdentityApply2D(
const int c_dofs1D,
1157 auto Bc =
Reshape(Bclosed.
Read(), c_dofs1D, c_dofs1D);
1158 auto Bo =
Reshape(Bopen.
Read(), o_dofs1D, c_dofs1D);
1160 auto x =
Reshape(x_.
Read(), c_dofs1D, c_dofs1D, 2, NE);
1163 auto vk =
Reshape(pa_data.
Read(), 2, (2 * c_dofs1D * o_dofs1D), NE);
1166 o_dofs1D <= c_dofs1D,
"");
1170 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
1172 real_t w[2][MAX_D1D][MAX_D1D];
1177 for (
int ey = 0; ey < c_dofs1D; ++ey)
1179 for (
int dx = 0; dx < c_dofs1D; ++dx)
1181 for (
int j=0; j<2; ++j)
1184 for (
int dy = 0; dy < c_dofs1D; ++dy)
1186 w[j][dx][ey] += Bc(ey, dy) * x(dx, dy, j, e);
1193 for (
int ey = 0; ey < c_dofs1D; ++ey)
1195 for (
int ex = 0; ex < o_dofs1D; ++ex)
1197 for (
int j=0; j<2; ++j)
1200 for (
int dx = 0; dx < c_dofs1D; ++dx)
1202 s += Bo(ex, dx) * w[j][dx][ey];
1204 const int local_index = ey*o_dofs1D + ex;
1205 y(local_index, e) += s * vk(j, local_index, e);
1213 for (
int ey = 0; ey < o_dofs1D; ++ey)
1215 for (
int dx = 0; dx < c_dofs1D; ++dx)
1217 for (
int j=0; j<2; ++j)
1220 for (
int dy = 0; dy < c_dofs1D; ++dy)
1222 w[j][dx][ey] += Bo(ey, dy) * x(dx, dy, j, e);
1229 for (
int ey = 0; ey < o_dofs1D; ++ey)
1231 for (
int ex = 0; ex < c_dofs1D; ++ex)
1233 for (
int j=0; j<2; ++j)
1236 for (
int dx = 0; dx < c_dofs1D; ++dx)
1238 s += Bc(ex, dx) * w[j][dx][ey];
1240 const int local_index = c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
1241 y(local_index, e) += s * vk(j, local_index, e);
1248static void PAHcurlVecH1IdentityApplyTranspose2D(
const int c_dofs1D,
1251 const Array<real_t> &Bclosed,
1252 const Array<real_t> &Bopen,
1253 const Vector &pa_data,
1257 auto Bc =
Reshape(Bclosed.Read(), c_dofs1D, c_dofs1D);
1258 auto Bo =
Reshape(Bopen.Read(), o_dofs1D, c_dofs1D);
1260 auto x =
Reshape(x_.Read(), (2 * c_dofs1D * o_dofs1D), NE);
1261 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, 2, NE);
1263 auto vk =
Reshape(pa_data.Read(), 2, (2 * c_dofs1D * o_dofs1D), NE);
1266 o_dofs1D <= c_dofs1D,
"");
1270 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
1272 real_t w[2][MAX_D1D][MAX_D1D];
1277 for (
int ey = 0; ey < c_dofs1D; ++ey)
1279 for (
int dx = 0; dx < c_dofs1D; ++dx)
1281 for (
int j=0; j<2; ++j) { w[j][dx][ey] = 0.0; }
1283 for (
int ex = 0; ex < o_dofs1D; ++ex)
1285 const int local_index = ey*o_dofs1D + ex;
1286 const real_t xd = x(local_index, e);
1288 for (
int dx = 0; dx < c_dofs1D; ++dx)
1290 for (
int j=0; j<2; ++j)
1292 w[j][dx][ey] += Bo(ex, dx) * xd * vk(j, local_index, e);
1299 for (
int dx = 0; dx < c_dofs1D; ++dx)
1301 for (
int dy = 0; dy < c_dofs1D; ++dy)
1303 for (
int j=0; j<2; ++j)
1306 for (
int ey = 0; ey < c_dofs1D; ++ey)
1308 s += w[j][dx][ey] * Bc(ey, dy);
1310 y(dx, dy, j, e) += s;
1318 for (
int ey = 0; ey < o_dofs1D; ++ey)
1320 for (
int dx = 0; dx < c_dofs1D; ++dx)
1322 for (
int j=0; j<2; ++j) { w[j][dx][ey] = 0.0; }
1324 for (
int ex = 0; ex < c_dofs1D; ++ex)
1326 const int local_index = c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
1327 const real_t xd = x(local_index, e);
1328 for (
int dx = 0; dx < c_dofs1D; ++dx)
1330 for (
int j=0; j<2; ++j)
1332 w[j][dx][ey] += Bc(ex, dx) * xd * vk(j, local_index, e);
1339 for (
int dx = 0; dx < c_dofs1D; ++dx)
1341 for (
int dy = 0; dy < c_dofs1D; ++dy)
1343 for (
int j=0; j<2; ++j)
1346 for (
int ey = 0; ey < o_dofs1D; ++ey)
1348 s += w[j][dx][ey] * Bo(ey, dy);
1350 y(dx, dy, j, e) += s;
1357static void PAHcurlVecH1IdentityApply3D(
const int c_dofs1D,
1360 const Array<real_t> &Bclosed,
1361 const Array<real_t> &Bopen,
1362 const Vector &pa_data,
1366 auto Bc =
Reshape(Bclosed.Read(), c_dofs1D, c_dofs1D);
1367 auto Bo =
Reshape(Bopen.Read(), o_dofs1D, c_dofs1D);
1369 auto x =
Reshape(x_.Read(), c_dofs1D, c_dofs1D, c_dofs1D, 3, NE);
1370 auto y =
Reshape(y_.ReadWrite(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
1372 auto vk =
Reshape(pa_data.Read(), 3, (3 * c_dofs1D * c_dofs1D * o_dofs1D),
1375 o_dofs1D <= c_dofs1D,
"");
1379 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
1381 real_t w1[3][MAX_D1D][MAX_D1D][MAX_D1D];
1382 real_t w2[3][MAX_D1D][MAX_D1D][MAX_D1D];
1387 for (
int ez = 0; ez < c_dofs1D; ++ez)
1389 for (
int dx = 0; dx < c_dofs1D; ++dx)
1391 for (
int dy = 0; dy < c_dofs1D; ++dy)
1393 for (
int j=0; j<3; ++j)
1395 w1[j][dx][dy][ez] = 0.0;
1396 for (
int dz = 0; dz < c_dofs1D; ++dz)
1398 w1[j][dx][dy][ez] += Bc(ez, dz) * x(dx, dy, dz, j, e);
1406 for (
int ez = 0; ez < c_dofs1D; ++ez)
1408 for (
int ey = 0; ey < c_dofs1D; ++ey)
1410 for (
int dx = 0; dx < c_dofs1D; ++dx)
1412 for (
int j=0; j<3; ++j)
1414 w2[j][dx][ey][ez] = 0.0;
1415 for (
int dy = 0; dy < c_dofs1D; ++dy)
1417 w2[j][dx][ey][ez] += Bc(ey, dy) * w1[j][dx][dy][ez];
1425 for (
int ez = 0; ez < c_dofs1D; ++ez)
1427 for (
int ey = 0; ey < c_dofs1D; ++ey)
1429 for (
int ex = 0; ex < o_dofs1D; ++ex)
1431 for (
int j=0; j<3; ++j)
1434 for (
int dx = 0; dx < c_dofs1D; ++dx)
1436 s += Bo(ex, dx) * w2[j][dx][ey][ez];
1438 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
1439 y(local_index, e) += s * vk(j, local_index, e);
1448 for (
int ez = 0; ez < c_dofs1D; ++ez)
1450 for (
int dx = 0; dx < c_dofs1D; ++dx)
1452 for (
int dy = 0; dy < c_dofs1D; ++dy)
1454 for (
int j=0; j<3; ++j)
1456 w1[j][dx][dy][ez] = 0.0;
1457 for (
int dz = 0; dz < c_dofs1D; ++dz)
1459 w1[j][dx][dy][ez] += Bc(ez, dz) * x(dx, dy, dz, j, e);
1467 for (
int ez = 0; ez < c_dofs1D; ++ez)
1469 for (
int ey = 0; ey < o_dofs1D; ++ey)
1471 for (
int dx = 0; dx < c_dofs1D; ++dx)
1473 for (
int j=0; j<3; ++j)
1475 w2[j][dx][ey][ez] = 0.0;
1476 for (
int dy = 0; dy < c_dofs1D; ++dy)
1478 w2[j][dx][ey][ez] += Bo(ey, dy) * w1[j][dx][dy][ez];
1486 for (
int ez = 0; ez < c_dofs1D; ++ez)
1488 for (
int ey = 0; ey < o_dofs1D; ++ey)
1490 for (
int ex = 0; ex < c_dofs1D; ++ex)
1492 for (
int j=0; j<3; ++j)
1495 for (
int dx = 0; dx < c_dofs1D; ++dx)
1497 s += Bc(ex, dx) * w2[j][dx][ey][ez];
1499 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
1500 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
1501 y(local_index, e) += s * vk(j, local_index, e);
1510 for (
int ez = 0; ez < o_dofs1D; ++ez)
1512 for (
int dx = 0; dx < c_dofs1D; ++dx)
1514 for (
int dy = 0; dy < c_dofs1D; ++dy)
1516 for (
int j=0; j<3; ++j)
1518 w1[j][dx][dy][ez] = 0.0;
1519 for (
int dz = 0; dz < c_dofs1D; ++dz)
1521 w1[j][dx][dy][ez] += Bo(ez, dz) * x(dx, dy, dz, j, e);
1529 for (
int ez = 0; ez < o_dofs1D; ++ez)
1531 for (
int ey = 0; ey < c_dofs1D; ++ey)
1533 for (
int dx = 0; dx < c_dofs1D; ++dx)
1535 for (
int j=0; j<3; ++j)
1537 w2[j][dx][ey][ez] = 0.0;
1538 for (
int dy = 0; dy < c_dofs1D; ++dy)
1540 w2[j][dx][ey][ez] += Bc(ey, dy) * w1[j][dx][dy][ez];
1548 for (
int ez = 0; ez < o_dofs1D; ++ez)
1550 for (
int ey = 0; ey < c_dofs1D; ++ey)
1552 for (
int ex = 0; ex < c_dofs1D; ++ex)
1554 for (
int j=0; j<3; ++j)
1557 for (
int dx = 0; dx < c_dofs1D; ++dx)
1559 s += Bc(ex, dx) * w2[j][dx][ey][ez];
1561 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
1562 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
1563 y(local_index, e) += s * vk(j, local_index, e);
1571static void PAHcurlVecH1IdentityApplyTranspose3D(
const int c_dofs1D,
1574 const Array<real_t> &Bclosed,
1575 const Array<real_t> &Bopen,
1576 const Vector &pa_data,
1580 auto Bc =
Reshape(Bclosed.Read(), c_dofs1D, c_dofs1D);
1581 auto Bo =
Reshape(Bopen.Read(), o_dofs1D, c_dofs1D);
1583 auto x =
Reshape(x_.Read(), (3 * c_dofs1D * c_dofs1D * o_dofs1D), NE);
1584 auto y =
Reshape(y_.ReadWrite(), c_dofs1D, c_dofs1D, c_dofs1D, 3, NE);
1586 auto vk =
Reshape(pa_data.Read(), 3, (3 * c_dofs1D * c_dofs1D * o_dofs1D),
1590 o_dofs1D <= c_dofs1D,
"");
1594 constexpr static int MAX_D1D = DofQuadLimits::HCURL_MAX_D1D;
1596 real_t w1[3][MAX_D1D][MAX_D1D][MAX_D1D];
1597 real_t w2[3][MAX_D1D][MAX_D1D][MAX_D1D];
1602 for (
int ez = 0; ez < c_dofs1D; ++ez)
1604 for (
int ey = 0; ey < c_dofs1D; ++ey)
1606 for (
int j=0; j<3; ++j)
1608 for (
int dx = 0; dx < c_dofs1D; ++dx)
1610 w2[j][dx][ey][ez] = 0.0;
1612 for (
int ex = 0; ex < o_dofs1D; ++ex)
1614 const int local_index = ez*c_dofs1D*o_dofs1D + ey*o_dofs1D + ex;
1615 const real_t xv = x(local_index, e) * vk(j, local_index, e);
1616 for (
int dx = 0; dx < c_dofs1D; ++dx)
1618 w2[j][dx][ey][ez] += xv * Bo(ex, dx);
1626 for (
int ez = 0; ez < c_dofs1D; ++ez)
1628 for (
int dx = 0; dx < c_dofs1D; ++dx)
1630 for (
int dy = 0; dy < c_dofs1D; ++dy)
1632 for (
int j=0; j<3; ++j)
1634 w1[j][dx][dy][ez] = 0.0;
1635 for (
int ey = 0; ey < c_dofs1D; ++ey)
1637 w1[j][dx][dy][ez] += w2[j][dx][ey][ez] * Bc(ey, dy);
1645 for (
int dx = 0; dx < c_dofs1D; ++dx)
1647 for (
int dy = 0; dy < c_dofs1D; ++dy)
1649 for (
int dz = 0; dz < c_dofs1D; ++dz)
1651 for (
int j=0; j<3; ++j)
1654 for (
int ez = 0; ez < c_dofs1D; ++ez)
1656 s += w1[j][dx][dy][ez] * Bc(ez, dz);
1658 y(dx, dy, dz, j, e) += s;
1667 for (
int ez = 0; ez < c_dofs1D; ++ez)
1669 for (
int ey = 0; ey < o_dofs1D; ++ey)
1671 for (
int j=0; j<3; ++j)
1673 for (
int dx = 0; dx < c_dofs1D; ++dx)
1675 w2[j][dx][ey][ez] = 0.0;
1677 for (
int ex = 0; ex < c_dofs1D; ++ex)
1679 const int local_index = c_dofs1D*c_dofs1D*o_dofs1D +
1680 ez*c_dofs1D*o_dofs1D + ey*c_dofs1D + ex;
1681 const real_t xv = x(local_index, e) * vk(j, local_index, e);
1682 for (
int dx = 0; dx < c_dofs1D; ++dx)
1684 w2[j][dx][ey][ez] += xv * Bc(ex, dx);
1692 for (
int ez = 0; ez < c_dofs1D; ++ez)
1694 for (
int dx = 0; dx < c_dofs1D; ++dx)
1696 for (
int dy = 0; dy < c_dofs1D; ++dy)
1698 for (
int j=0; j<3; ++j)
1700 w1[j][dx][dy][ez] = 0.0;
1701 for (
int ey = 0; ey < o_dofs1D; ++ey)
1703 w1[j][dx][dy][ez] += w2[j][dx][ey][ez] * Bo(ey, dy);
1711 for (
int dx = 0; dx < c_dofs1D; ++dx)
1713 for (
int dy = 0; dy < c_dofs1D; ++dy)
1715 for (
int dz = 0; dz < c_dofs1D; ++dz)
1717 for (
int j=0; j<3; ++j)
1720 for (
int ez = 0; ez < c_dofs1D; ++ez)
1722 s += w1[j][dx][dy][ez] * Bc(ez, dz);
1724 y(dx, dy, dz, j, e) += s;
1733 for (
int ez = 0; ez < o_dofs1D; ++ez)
1735 for (
int ey = 0; ey < c_dofs1D; ++ey)
1737 for (
int j=0; j<3; ++j)
1739 for (
int dx = 0; dx < c_dofs1D; ++dx)
1741 w2[j][dx][ey][ez] = 0.0;
1743 for (
int ex = 0; ex < c_dofs1D; ++ex)
1745 const int local_index = 2*c_dofs1D*c_dofs1D*o_dofs1D +
1746 ez*c_dofs1D*c_dofs1D + ey*c_dofs1D + ex;
1747 const real_t xv = x(local_index, e) * vk(j, local_index, e);
1748 for (
int dx = 0; dx < c_dofs1D; ++dx)
1750 w2[j][dx][ey][ez] += xv * Bc(ex, dx);
1758 for (
int ez = 0; ez < o_dofs1D; ++ez)
1760 for (
int dx = 0; dx < c_dofs1D; ++dx)
1762 for (
int dy = 0; dy < c_dofs1D; ++dy)
1764 for (
int j=0; j<3; ++j)
1766 w1[j][dx][dy][ez] = 0.0;
1767 for (
int ey = 0; ey < c_dofs1D; ++ey)
1769 w1[j][dx][dy][ez] += w2[j][dx][ey][ez] * Bc(ey, dy);
1777 for (
int dx = 0; dx < c_dofs1D; ++dx)
1779 for (
int dy = 0; dy < c_dofs1D; ++dy)
1781 for (
int dz = 0; dz < c_dofs1D; ++dz)
1783 for (
int j=0; j<3; ++j)
1786 for (
int ez = 0; ez < o_dofs1D; ++ez)
1788 s += w1[j][dx][dy][ez] * Bo(ez, dz);
1790 y(dx, dy, dz, j, e) += s;
1808 MFEM_VERIFY(trial_el != NULL,
"Only NodalTensorFiniteElement is supported!");
1812 MFEM_VERIFY(test_el != NULL,
"Only VectorTensorFiniteElement is supported!");
1814 const int dims = trial_el->
GetDim();
1815 MFEM_VERIFY(dims == 2 || dims == 3,
"");
1818 MFEM_VERIFY(dim == 2 || dim == 3,
"");
1822 MFEM_VERIFY(
vdim == 1,
"vdim != 1 with PA is not supported yet!");
1824 ne = trial_fes.
GetNE();
1826 const int order = trial_el->
GetOrder();
1839 o_dofs1D = maps_O_C->
nqpt;
1840 c_dofs1D = maps_C_C->
nqpt;
1841 MFEM_VERIFY(maps_O_C->
ndof == c_dofs1D &&
1842 maps_C_C->
ndof == c_dofs1D,
"Discrepancy in the number of DOFs");
1844 const int ndof_test = (dim == 3) ? 3 * c_dofs1D * c_dofs1D * o_dofs1D
1845 : 2 * c_dofs1D * o_dofs1D;
1850 auto op =
Reshape(pa_data.HostWrite(), dim, ndof_test, ne);
1860 const real_t tk[9] = { 1.,0.,0., 0.,1.,0., 0.,0.,1. };
1862 for (
int c=0; c<3; ++c)
1864 for (
int i=0; i<ndof_test/3; ++i)
1866 const int d = (c*ndof_test/3) + i;
1869 const int dof2tk = c;
1870 const int id = (dofmap[d] >= 0) ? dofmap[d] : -1 - dofmap[d];
1872 for (
int e=0; e<ne; ++e)
1876 tr->SetIntPoint(&Nodes.
IntPoint(
id));
1877 tr->Jacobian().Mult(tk + dof2tk*dim, v);
1879 for (
int j=0; j<3; ++j)
1889 const real_t tk[4] = { 1.,0., 0.,1. };
1890 for (
int c=0; c<2; ++c)
1892 for (
int i=0; i<ndof_test/2; ++i)
1894 const int d = (c*ndof_test/2) + i;
1897 const int dof2tk = c;
1898 const int id = (dofmap[d] >= 0) ? dofmap[d] : -1 - dofmap[d];
1900 for (
int e=0; e<ne; ++e)
1904 tr->SetIntPoint(&Nodes.
IntPoint(
id));
1905 tr->Jacobian().Mult(tk + dof2tk*dim, v);
1907 for (
int j=0; j<2; ++j)
1921 PAHcurlVecH1IdentityApply3D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B, maps_O_C->
B,
1926 PAHcurlVecH1IdentityApply2D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B, maps_O_C->
B,
1939 PAHcurlVecH1IdentityApplyTranspose3D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B,
1940 maps_O_C->
B, pa_data, x, y);
1944 PAHcurlVecH1IdentityApplyTranspose2D(c_dofs1D, o_dofs1D, ne, maps_C_C->
B,
1945 maps_O_C->
B, pa_data, x, y);
void SetSize(int nsize)
Change the logical size of the array, keep existing entries.
const T * Read(bool on_dev=true) const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), on_dev).
@ GaussLobatto
Closed type.
static MemoryType GetMemoryType()
(DEPRECATED) Equivalent to GetDeviceMemoryType().
Array< real_t > G
Gradients/divergences/curls of basis functions evaluated at quadrature points.
@ TENSOR
Tensor product representation using 1D matrices/tensors with dimensions using 1D number of quadrature...
Array< real_t > B
Basis functions evaluated at quadrature points.
int ndof
Number of degrees of freedom = number of basis functions. When mode is TENSOR, this is the 1D number.
int nqpt
Number of quadrature points. When mode is TENSOR, this is the 1D number.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
int GetNE() const
Returns number of elements in the mesh.
Mesh * GetMesh() const
Returns the mesh.
const FiniteElement * GetTypicalFE() const
Return GetFE(0) if the local mesh is not empty; otherwise return a typical FE based on the Geometry t...
Abstract class for all finite elements.
virtual const DofToQuad & GetDofToQuad(const IntegrationRule &ir, DofToQuad::Mode mode) const
Return a DofToQuad structure corresponding to the given IntegrationRule using the given DofToQuad::Mo...
int GetOrder() const
Returns the order of the finite element. In the case of anisotropic orders, returns the maximum order...
int GetDim() const
Returns the reference space dimension for the finite element.
const IntegrationRule & GetNodes() const
Get a const reference to the nodes of the element.
void AddMultPA(const Vector &x, Vector &y) const override
Method for partially assembled action.
void AddMultTransposePA(const Vector &x, Vector &y) const override
Method for partially assembled transposed action.
void AssemblePA(const FiniteElementSpace &trial_fes, const FiniteElementSpace &test_fes) override
Setup method for PA data.
Arbitrary order H1 elements in 1D.
void AddMultTransposePA(const Vector &x, Vector &y) const override
Method for partially assembled transposed action.
void AddMultPA(const Vector &x, Vector &y) const override
Method for partially assembled action.
void AssemblePA(const FiniteElementSpace &trial_fes, const FiniteElementSpace &test_fes) override
Class for an integration rule - an Array of IntegrationPoint.
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
int Dimension() const
Dimension of the reference space used within the elements.
void GetElementTransformation(int i, IsoparametricTransformation *ElTr) const
Builds the transformation defining the i-th element in ElTr. ElTr must be allocated in advance and wi...
A Class that defines 1-D numerical quadrature rules on [0,1].
static void GaussLegendre(const int np, IntegrationRule *ir)
static void GaussLobatto(const int np, IntegrationRule *ir)
const Array< int > & GetDofMap() const
Get an Array<int> that maps lexicographically ordered indices to the indices of the respective nodes/...
virtual const real_t * Read(bool on_dev=true) const
Shortcut for mfem::Read(vec.GetMemory(), vec.Size(), on_dev).
virtual real_t * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), on_dev).
void mfem_error(const char *msg)
MFEM_HOST_DEVICE DeviceTensor< sizeof...(Dims), T > Reshape(T *ptr, Dims... dims)
Wrap a pointer as a DeviceTensor with automatically deduced template parameters.
void forall(int N, lambda &&body)
static const DeviceDofQuadLimits & Get()
Return a const reference to the DeviceDofQuadLimits singleton.