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.