22static void PAVectorDiffusionSetup2D(
const int Q1D,
 
   24                                     const Array<real_t> &w,
 
   29   const int NQ = Q1D*Q1D;
 
   32   auto J = 
Reshape(j.Read(), NQ, 2, 2, NE);
 
   33   auto y = 
Reshape(op.Write(), NQ, 3, NE);
 
   35   const bool const_c = c.Size() == 1;
 
   36   const auto C = const_c ? 
Reshape(c.Read(), 1,1) :
 
   42      for (
int q = 0; q < NQ; ++q)
 
   44         const real_t J11 = J(q,0,0,e);
 
   45         const real_t J21 = J(q,1,0,e);
 
   46         const real_t J12 = J(q,0,1,e);
 
   47         const real_t J22 = J(q,1,1,e);
 
   49         const real_t C1 = const_c ? C(0,0) : C(q,e);
 
   50         const real_t c_detJ = W[q] * C1 / ((J11*J22)-(J21*J12));
 
   51         y(q,0,e) =  c_detJ * (J12*J12 + J22*J22); 
 
   52         y(q,1,e) = -c_detJ * (J12*J11 + J22*J21); 
 
   53         y(q,2,e) =  c_detJ * (J11*J11 + J21*J21); 
 
   59static void PAVectorDiffusionSetup3D(
const int Q1D,
 
   61                                     const Array<real_t> &w,
 
   66   const int NQ = Q1D*Q1D*Q1D;
 
   68   auto J = 
Reshape(j.Read(), NQ, 3, 3, NE);
 
   69   auto y = 
Reshape(op.Write(), NQ, 6, NE);
 
   71   const bool const_c = c.Size() == 1;
 
   72   const auto C = const_c ? 
Reshape(c.Read(), 1,1) :
 
   78      for (
int q = 0; q < NQ; ++q)
 
   80         const real_t J11 = J(q,0,0,e);
 
   81         const real_t J21 = J(q,1,0,e);
 
   82         const real_t J31 = J(q,2,0,e);
 
   83         const real_t J12 = J(q,0,1,e);
 
   84         const real_t J22 = J(q,1,1,e);
 
   85         const real_t J32 = J(q,2,1,e);
 
   86         const real_t J13 = J(q,0,2,e);
 
   87         const real_t J23 = J(q,1,2,e);
 
   88         const real_t J33 = J(q,2,2,e);
 
   89         const real_t detJ = J11 * (J22 * J33 - J32 * J23) -
 
   90                             J21 * (J12 * J33 - J32 * J13) +
 
   91                             J31 * (J12 * J23 - J22 * J13);
 
   93         const real_t C1 = const_c ? C(0,0) : C(q,e);
 
   95         const real_t c_detJ = W[q] * C1 / detJ;
 
   97         const real_t A11 = (J22 * J33) - (J23 * J32);
 
   98         const real_t A12 = (J32 * J13) - (J12 * J33);
 
   99         const real_t A13 = (J12 * J23) - (J22 * J13);
 
  100         const real_t A21 = (J31 * J23) - (J21 * J33);
 
  101         const real_t A22 = (J11 * J33) - (J13 * J31);
 
  102         const real_t A23 = (J21 * J13) - (J11 * J23);
 
  103         const real_t A31 = (J21 * J32) - (J31 * J22);
 
  104         const real_t A32 = (J31 * J12) - (J11 * J32);
 
  105         const real_t A33 = (J11 * J22) - (J12 * J21);
 
  107         y(q,0,e) = c_detJ * (A11*A11 + A12*A12 + A13*A13); 
 
  108         y(q,1,e) = c_detJ * (A11*A21 + A12*A22 + A13*A23); 
 
  109         y(q,2,e) = c_detJ * (A11*A31 + A12*A32 + A13*A33); 
 
  110         y(q,3,e) = c_detJ * (A21*A21 + A22*A22 + A23*A23); 
 
  111         y(q,4,e) = c_detJ * (A21*A31 + A22*A32 + A23*A33); 
 
  112         y(q,5,e) = c_detJ * (A31*A31 + A32*A32 + A33*A33); 
 
  117static void PAVectorDiffusionSetup(
const int dim,
 
  120                                   const Array<real_t> &W,
 
  125   if (!(
dim == 2 || 
dim == 3))
 
  127      MFEM_ABORT(
"Dimension not supported.");
 
  131      PAVectorDiffusionSetup2D(Q1D, NE, W, J, C, op);
 
  135      PAVectorDiffusionSetup3D(Q1D, NE, W, J, C, op);
 
  161   const int dims = el.
GetDim();
 
  162   const int symmDims = (dims * (dims + 1)) / 2; 
 
  173   MFEM_VERIFY(!
VQ && !
MQ,
 
  174               "Only scalar coefficient supported for partial assembly for VectorDiffusionIntegrator");
 
  182   if (
dim == 1) { MFEM_ABORT(
"dim==1 not supported in PAVectorDiffusionSetup"); }
 
  185      constexpr int DIM = 2;
 
  186      constexpr int SDIM = 3;
 
  192      const bool const_c = coeff.
Size() == 1;
 
  193      const auto C = const_c ? 
Reshape(coeff.
Read(), 1,1) :
 
  198         for (
int q = 0; q < NQ; ++q)
 
  201            const real_t J11 = J(q,0,0,e);
 
  202            const real_t J21 = J(q,1,0,e);
 
  203            const real_t J31 = J(q,2,0,e);
 
  204            const real_t J12 = J(q,0,1,e);
 
  205            const real_t J22 = J(q,1,1,e);
 
  206            const real_t J32 = J(q,2,1,e);
 
  207            const real_t E = J11*J11 + J21*J21 + J31*J31;
 
  208            const real_t G = J12*J12 + J22*J22 + J32*J32;
 
  209            const real_t F = J11*J12 + J21*J22 + J31*J32;
 
  210            const real_t iw = 1.0 / sqrt(E*G - F*F);
 
  211            const real_t C1 = const_c ? C(0,0) : C(q,e);
 
  213            D(q,0,e) =  
alpha * G; 
 
  214            D(q,1,e) = -
alpha * F; 
 
  215            D(q,2,e) =  
alpha * E; 
 
  221      PAVectorDiffusionSetup(
dim, 
quad1D, 
ne, w, j, coeff, d);
 
 
  225template<
int T_D1D = 0, 
int T_Q1D = 0>
 
  226static void PAVectorDiffusionDiagonal2D(
const int NE,
 
  234   const int D1D = T_D1D ? T_D1D : d1d;
 
  235   const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  238   auto B = 
Reshape(
b.Read(), Q1D, D1D);
 
  246      const int D1D = T_D1D ? T_D1D : d1d;
 
  247      const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  248      constexpr int MD1 = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
 
  249      constexpr int MQ1 = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
 
  254      for (
int qx = 0; qx < Q1D; ++qx)
 
  256         for (
int dy = 0; dy < D1D; ++dy)
 
  261            for (
int qy = 0; qy < Q1D; ++qy)
 
  263               const int q = qx + qy * Q1D;
 
  264               const real_t D0 = D(q,0,e);
 
  265               const real_t D1 = D(q,1,e);
 
  266               const real_t D2 = D(q,2,e);
 
  267               QD0[qx][dy] += B(qy, dy) * B(qy, dy) * D0;
 
  268               QD1[qx][dy] += B(qy, dy) * G(qy, dy) * D1;
 
  269               QD2[qx][dy] += G(qy, dy) * G(qy, dy) * D2;
 
  273      for (
int dy = 0; dy < D1D; ++dy)
 
  275         for (
int dx = 0; dx < D1D; ++dx)
 
  278            for (
int qx = 0; qx < Q1D; ++qx)
 
  280               temp += G(qx, dx) * G(qx, dx) * QD0[qx][dy];
 
  281               temp += G(qx, dx) * B(qx, dx) * QD1[qx][dy];
 
  282               temp += B(qx, dx) * G(qx, dx) * QD1[qx][dy];
 
  283               temp += B(qx, dx) * B(qx, dx) * QD2[qx][dy];
 
  285            Y(dx,dy,0,e) += temp;
 
  286            Y(dx,dy,1,e) += temp;
 
  292template<
int T_D1D = 0, 
int T_Q1D = 0>
 
  293static void PAVectorDiffusionDiagonal3D(
const int NE,
 
  294                                        const Array<real_t> &
b,
 
  295                                        const Array<real_t> &g,
 
  301   constexpr int DIM = 3;
 
  302   const int D1D = T_D1D ? T_D1D : d1d;
 
  303   const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  306   MFEM_VERIFY(D1D <= max_d1d, 
"");
 
  307   MFEM_VERIFY(Q1D <= max_q1d, 
"");
 
  308   auto B = 
Reshape(
b.Read(), Q1D, D1D);
 
  309   auto G = 
Reshape(g.Read(), Q1D, D1D);
 
  310   auto Q = 
Reshape(d.Read(), Q1D*Q1D*Q1D, 6, NE);
 
  311   auto Y = 
Reshape(y.ReadWrite(), D1D, D1D, D1D, 3, NE);
 
  314      const int D1D = T_D1D ? T_D1D : d1d;
 
  315      const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  316      constexpr int MD1 = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
 
  317      constexpr int MQ1 = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
 
  318      real_t QQD[MQ1][MQ1][MD1];
 
  319      real_t QDD[MQ1][MD1][MD1];
 
  320      for (
int i = 0; i < 
DIM; ++i)
 
  322         for (
int j = 0; j < 
DIM; ++j)
 
  325            for (
int qx = 0; qx < Q1D; ++qx)
 
  327               for (
int qy = 0; qy < Q1D; ++qy)
 
  329                  for (
int dz = 0; dz < D1D; ++dz)
 
  331                     QQD[qx][qy][dz] = 0.0;
 
  332                     for (
int qz = 0; qz < Q1D; ++qz)
 
  334                        const int q = qx + (qy + qz * Q1D) * Q1D;
 
  335                        const int k = j >= i ?
 
  336                                      3 - (3-i)*(2-i)/2 + j:
 
  337                                      3 - (3-j)*(2-j)/2 + i;
 
  338                        const real_t O = Q(q,k,e);
 
  339                        const real_t Bz = B(qz,dz);
 
  340                        const real_t Gz = G(qz,dz);
 
  341                        const real_t L = i==2 ? Gz : Bz;
 
  342                        const real_t R = j==2 ? Gz : Bz;
 
  343                        QQD[qx][qy][dz] += L * O * R;
 
  349            for (
int qx = 0; qx < Q1D; ++qx)
 
  351               for (
int dz = 0; dz < D1D; ++dz)
 
  353                  for (
int dy = 0; dy < D1D; ++dy)
 
  355                     QDD[qx][dy][dz] = 0.0;
 
  356                     for (
int qy = 0; qy < Q1D; ++qy)
 
  358                        const real_t By = B(qy,dy);
 
  359                        const real_t Gy = G(qy,dy);
 
  360                        const real_t L = i==1 ? Gy : By;
 
  361                        const real_t R = j==1 ? Gy : By;
 
  362                        QDD[qx][dy][dz] += L * QQD[qx][qy][dz] * R;
 
  368            for (
int dz = 0; dz < D1D; ++dz)
 
  370               for (
int dy = 0; dy < D1D; ++dy)
 
  372                  for (
int dx = 0; dx < D1D; ++dx)
 
  375                     for (
int qx = 0; qx < Q1D; ++qx)
 
  377                        const real_t Bx = B(qx,dx);
 
  378                        const real_t Gx = G(qx,dx);
 
  379                        const real_t L = i==0 ? Gx : Bx;
 
  380                        const real_t R = j==0 ? Gx : Bx;
 
  381                        temp += L * QDD[qx][dy][dz] * R;
 
  383                     Y(dx, dy, dz, 0, e) += temp;
 
  384                     Y(dx, dy, dz, 1, e) += temp;
 
  385                     Y(dx, dy, dz, 2, e) += temp;
 
  394static void PAVectorDiffusionAssembleDiagonal(
const int dim,
 
  398                                              const Array<real_t> &B,
 
  399                                              const Array<real_t> &G,
 
  405      return PAVectorDiffusionDiagonal2D(NE, B, G, op, y, D1D, Q1D);
 
  409      return PAVectorDiffusionDiagonal3D(NE, B, G, op, y, D1D, Q1D);
 
  411   MFEM_ABORT(
"Dimension not implemented.");
 
  429template<
int T_D1D = 0, 
int T_Q1D = 0, 
int T_VDIM = 0> 
static 
  430void PAVectorDiffusionApply2D(
const int NE,
 
  442   const int D1D = T_D1D ? T_D1D : d1d;
 
  443   const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  444   const int VDIM = T_VDIM ? T_VDIM : vdim;
 
  447   auto B = 
Reshape(
b.Read(), Q1D, D1D);
 
  456      const int D1D = T_D1D ? T_D1D : d1d;
 
  457      const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  458      const int VDIM = T_VDIM ? T_VDIM : vdim;
 
  459      constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
 
  460      constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
 
  462      real_t grad[max_Q1D][max_Q1D][2];
 
  463      for (
int c = 0; c < VDIM; c++)
 
  465         for (
int qy = 0; qy < Q1D; ++qy)
 
  467            for (
int qx = 0; qx < Q1D; ++qx)
 
  469               grad[qy][qx][0] = 0.0;
 
  470               grad[qy][qx][1] = 0.0;
 
  473         for (
int dy = 0; dy < D1D; ++dy)
 
  476            for (
int qx = 0; qx < Q1D; ++qx)
 
  481            for (
int dx = 0; dx < D1D; ++dx)
 
  483               const real_t s = x(dx,dy,c,e);
 
  484               for (
int qx = 0; qx < Q1D; ++qx)
 
  486                  gradX[qx][0] += s * B(qx,dx);
 
  487                  gradX[qx][1] += s * G(qx,dx);
 
  490            for (
int qy = 0; qy < Q1D; ++qy)
 
  492               const real_t wy  = B(qy,dy);
 
  493               const real_t wDy = G(qy,dy);
 
  494               for (
int qx = 0; qx < Q1D; ++qx)
 
  496                  grad[qy][qx][0] += gradX[qx][1] * wy;
 
  497                  grad[qy][qx][1] += gradX[qx][0] * wDy;
 
  502         for (
int qy = 0; qy < Q1D; ++qy)
 
  504            for (
int qx = 0; qx < Q1D; ++qx)
 
  506               const int q = qx + qy * Q1D;
 
  507               const real_t O11 = D(q,0,e);
 
  508               const real_t O12 = D(q,1,e);
 
  509               const real_t O22 = D(q,2,e);
 
  510               const real_t gradX = grad[qy][qx][0];
 
  511               const real_t gradY = grad[qy][qx][1];
 
  512               grad[qy][qx][0] = (O11 * gradX) + (O12 * gradY);
 
  513               grad[qy][qx][1] = (O12 * gradX) + (O22 * gradY);
 
  516         for (
int qy = 0; qy < Q1D; ++qy)
 
  519            for (
int dx = 0; dx < D1D; ++dx)
 
  524            for (
int qx = 0; qx < Q1D; ++qx)
 
  526               const real_t gX = grad[qy][qx][0];
 
  527               const real_t gY = grad[qy][qx][1];
 
  528               for (
int dx = 0; dx < D1D; ++dx)
 
  530                  const real_t wx  = Bt(dx,qx);
 
  531                  const real_t wDx = Gt(dx,qx);
 
  532                  gradX[dx][0] += gX * wDx;
 
  533                  gradX[dx][1] += gY * wx;
 
  536            for (
int dy = 0; dy < D1D; ++dy)
 
  538               const real_t wy  = Bt(dy,qy);
 
  539               const real_t wDy = Gt(dy,qy);
 
  540               for (
int dx = 0; dx < D1D; ++dx)
 
  542                  y(dx,dy,c,e) += ((gradX[dx][0] * wy) + (gradX[dx][1] * wDy));
 
  551template<
const int T_D1D = 0,
 
  552         const int T_Q1D = 0> 
static 
  553void PAVectorDiffusionApply3D(
const int NE,
 
  554                              const Array<real_t> &
b,
 
  555                              const Array<real_t> &g,
 
  556                              const Array<real_t> &bt,
 
  557                              const Array<real_t> >,
 
  561                              int d1d = 0, 
int q1d = 0)
 
  563   const int D1D = T_D1D ? T_D1D : d1d;
 
  564   const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  565   constexpr int VDIM = 3;
 
  568   auto B = 
Reshape(
b.Read(), Q1D, D1D);
 
  569   auto G = 
Reshape(g.Read(), Q1D, D1D);
 
  570   auto Bt = 
Reshape(bt.Read(), D1D, Q1D);
 
  571   auto Gt = 
Reshape(gt.Read(), D1D, Q1D);
 
  572   auto op = 
Reshape(op_.Read(), Q1D*Q1D*Q1D, 6, NE);
 
  573   auto x = 
Reshape(x_.Read(), D1D, D1D, D1D, VDIM, NE);
 
  574   auto y = 
Reshape(y_.ReadWrite(), D1D, D1D, D1D, VDIM, NE);
 
  577      const int D1D = T_D1D ? T_D1D : d1d;
 
  578      const int Q1D = T_Q1D ? T_Q1D : q1d;
 
  579      constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
 
  580      constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
 
  581      for (
int c = 0; c < VDIM; ++ c)
 
  583         real_t grad[max_Q1D][max_Q1D][max_Q1D][3];
 
  584         for (
int qz = 0; qz < Q1D; ++qz)
 
  586            for (
int qy = 0; qy < Q1D; ++qy)
 
  588               for (
int qx = 0; qx < Q1D; ++qx)
 
  590                  grad[qz][qy][qx][0] = 0.0;
 
  591                  grad[qz][qy][qx][1] = 0.0;
 
  592                  grad[qz][qy][qx][2] = 0.0;
 
  596         for (
int dz = 0; dz < D1D; ++dz)
 
  598            real_t gradXY[max_Q1D][max_Q1D][3];
 
  599            for (
int qy = 0; qy < Q1D; ++qy)
 
  601               for (
int qx = 0; qx < Q1D; ++qx)
 
  603                  gradXY[qy][qx][0] = 0.0;
 
  604                  gradXY[qy][qx][1] = 0.0;
 
  605                  gradXY[qy][qx][2] = 0.0;
 
  608            for (
int dy = 0; dy < D1D; ++dy)
 
  611               for (
int qx = 0; qx < Q1D; ++qx)
 
  616               for (
int dx = 0; dx < D1D; ++dx)
 
  618                  const real_t s = x(dx,dy,dz,c,e);
 
  619                  for (
int qx = 0; qx < Q1D; ++qx)
 
  621                     gradX[qx][0] += s * B(qx,dx);
 
  622                     gradX[qx][1] += s * G(qx,dx);
 
  625               for (
int qy = 0; qy < Q1D; ++qy)
 
  627                  const real_t wy  = B(qy,dy);
 
  628                  const real_t wDy = G(qy,dy);
 
  629                  for (
int qx = 0; qx < Q1D; ++qx)
 
  631                     const real_t wx  = gradX[qx][0];
 
  632                     const real_t wDx = gradX[qx][1];
 
  633                     gradXY[qy][qx][0] += wDx * wy;
 
  634                     gradXY[qy][qx][1] += wx  * wDy;
 
  635                     gradXY[qy][qx][2] += wx  * wy;
 
  639            for (
int qz = 0; qz < Q1D; ++qz)
 
  641               const real_t wz  = B(qz,dz);
 
  642               const real_t wDz = G(qz,dz);
 
  643               for (
int qy = 0; qy < Q1D; ++qy)
 
  645                  for (
int qx = 0; qx < Q1D; ++qx)
 
  647                     grad[qz][qy][qx][0] += gradXY[qy][qx][0] * wz;
 
  648                     grad[qz][qy][qx][1] += gradXY[qy][qx][1] * wz;
 
  649                     grad[qz][qy][qx][2] += gradXY[qy][qx][2] * wDz;
 
  655         for (
int qz = 0; qz < Q1D; ++qz)
 
  657            for (
int qy = 0; qy < Q1D; ++qy)
 
  659               for (
int qx = 0; qx < Q1D; ++qx)
 
  661                  const int q = qx + (qy + qz * Q1D) * Q1D;
 
  662                  const real_t O11 = op(q,0,e);
 
  663                  const real_t O12 = op(q,1,e);
 
  664                  const real_t O13 = op(q,2,e);
 
  665                  const real_t O22 = op(q,3,e);
 
  666                  const real_t O23 = op(q,4,e);
 
  667                  const real_t O33 = op(q,5,e);
 
  668                  const real_t gradX = grad[qz][qy][qx][0];
 
  669                  const real_t gradY = grad[qz][qy][qx][1];
 
  670                  const real_t gradZ = grad[qz][qy][qx][2];
 
  671                  grad[qz][qy][qx][0] = (O11*gradX)+(O12*gradY)+(O13*gradZ);
 
  672                  grad[qz][qy][qx][1] = (O12*gradX)+(O22*gradY)+(O23*gradZ);
 
  673                  grad[qz][qy][qx][2] = (O13*gradX)+(O23*gradY)+(O33*gradZ);
 
  677         for (
int qz = 0; qz < Q1D; ++qz)
 
  679            real_t gradXY[max_D1D][max_D1D][3];
 
  680            for (
int dy = 0; dy < D1D; ++dy)
 
  682               for (
int dx = 0; dx < D1D; ++dx)
 
  684                  gradXY[dy][dx][0] = 0;
 
  685                  gradXY[dy][dx][1] = 0;
 
  686                  gradXY[dy][dx][2] = 0;
 
  689            for (
int qy = 0; qy < Q1D; ++qy)
 
  692               for (
int dx = 0; dx < D1D; ++dx)
 
  698               for (
int qx = 0; qx < Q1D; ++qx)
 
  700                  const real_t gX = grad[qz][qy][qx][0];
 
  701                  const real_t gY = grad[qz][qy][qx][1];
 
  702                  const real_t gZ = grad[qz][qy][qx][2];
 
  703                  for (
int dx = 0; dx < D1D; ++dx)
 
  705                     const real_t wx  = Bt(dx,qx);
 
  706                     const real_t wDx = Gt(dx,qx);
 
  707                     gradX[dx][0] += gX * wDx;
 
  708                     gradX[dx][1] += gY * wx;
 
  709                     gradX[dx][2] += gZ * wx;
 
  712               for (
int dy = 0; dy < D1D; ++dy)
 
  714                  const real_t wy  = Bt(dy,qy);
 
  715                  const real_t wDy = Gt(dy,qy);
 
  716                  for (
int dx = 0; dx < D1D; ++dx)
 
  718                     gradXY[dy][dx][0] += gradX[dx][0] * wy;
 
  719                     gradXY[dy][dx][1] += gradX[dx][1] * wDy;
 
  720                     gradXY[dy][dx][2] += gradX[dx][2] * wy;
 
  724            for (
int dz = 0; dz < D1D; ++dz)
 
  726               const real_t wz  = Bt(dz,qz);
 
  727               const real_t wDz = Gt(dz,qz);
 
  728               for (
int dy = 0; dy < D1D; ++dy)
 
  730                  for (
int dx = 0; dx < D1D; ++dx)
 
  733                        ((gradXY[dy][dx][0] * wz) +
 
  734                         (gradXY[dy][dx][1] * wz) +
 
  735                         (gradXY[dy][dx][2] * wDz));
 
  765            case 0x22: 
return PAVectorDiffusionApply2D<2,2,3>(
ne,B,G,Bt,Gt,D,x,y);
 
  766            case 0x33: 
return PAVectorDiffusionApply2D<3,3,3>(
ne,B,G,Bt,Gt,D,x,y);
 
  767            case 0x44: 
return PAVectorDiffusionApply2D<4,4,3>(
ne,B,G,Bt,Gt,D,x,y);
 
  768            case 0x55: 
return PAVectorDiffusionApply2D<5,5,3>(
ne,B,G,Bt,Gt,D,x,y);
 
  770               return PAVectorDiffusionApply2D(
ne,B,G,Bt,Gt,D,x,y,D1D,Q1D,
sdim);
 
  774      { 
return PAVectorDiffusionApply2D(
ne,B,G,Bt,Gt,D,x,y,D1D,Q1D,
sdim); }
 
  777      { 
return PAVectorDiffusionApply3D(
ne,B,G,Bt,Gt,D,x,y,D1D,Q1D); }
 
  779      MFEM_ABORT(
"Unknown kernel.");
 
 
const T * Read(bool on_dev=true) const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), on_dev).
Class to represent a coefficient evaluated at quadrature points.
static MemoryType GetDeviceMemoryType()
Get the current Device MemoryType. This is the MemoryType used by most MFEM classes when allocating m...
static const IntegrationRule & GetRule(const FiniteElement &trial_fe, const FiniteElement &test_fe)
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.
Array< real_t > Gt
Transpose of G.
int nqpt
Number of quadrature points. When mode is TENSOR, this is the 1D number.
Array< real_t > Bt
Transpose of B.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
bool IsVariableOrder() const
Returns true if the space contains elements of varying polynomial orders.
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 GetDim() const
Returns the reference space dimension for the finite element.
Vector J
Jacobians of the element transformations at all quadrature points.
Class for an integration rule - an Array of IntegrationPoint.
int GetNPoints() const
Returns the number of the points in the integration rule.
const Array< real_t > & GetWeights() const
Return the quadrature weights in a contiguous array.
const IntegrationRule * IntRule
int Dimension() const
Dimension of the reference space used within the elements.
int SpaceDimension() const
Dimension of the physical space containing the mesh.
const GeometricFactors * GetGeometricFactors(const IntegrationRule &ir, const int flags, MemoryType d_mt=MemoryType::DEFAULT)
Return the mesh geometric factors corresponding to the given integration rule.
int GetNumGeometries(int dim) const
Return the number of geometries of the given dimension present in the mesh.
Class representing the storage layout of a QuadratureFunction.
void AssemblePA(const FiniteElementSpace &fes) override
Method defining partial assembly.
const DofToQuad * maps
Not owned.
void AddMultPA(const Vector &x, Vector &y) const override
Method for partially assembled action.
const GeometricFactors * geom
Not owned.
void AssembleDiagonalPA(Vector &diag) override
Assemble diagonal and add it to Vector diag.
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).
int Size() const
Returns the size of the vector.
void SetSize(int s)
Resize the vector to size s.
virtual real_t * Write(bool on_dev=true)
Shortcut for mfem::Write(vec.GetMemory(), vec.Size(), on_dev).
void GetDiagonal(mfem::Vector &diag) const
void AddMult(const mfem::Vector &x, mfem::Vector &y, const real_t a=1.0) const override
Operator application: y+=A(x) (default) or y+=a*A(x).
Represent a DiffusionIntegrator with AssemblyLevel::Partial using libCEED.
const T * Read(const Memory< T > &mem, int size, bool on_dev=true)
Get a pointer for read access to mem with the mfem::Device's DeviceMemoryClass, if on_dev = true,...
MFEM_HOST_DEVICE DeviceTensor< sizeof...(Dims), T > Reshape(T *ptr, Dims... dims)
Wrap a pointer as a DeviceTensor with automatically deduced template parameters.
bool DeviceCanUseCeed()
Function that determines if a CEED kernel should be used, based on the current mfem::Device configura...
@ COMPRESSED
Enable all above compressions.
void forall(int N, lambda &&body)
static const DeviceDofQuadLimits & Get()
Return a const reference to the DeviceDofQuadLimits singleton.
int MAX_D1D
Maximum number of 1D nodal points.
int MAX_Q1D
Maximum number of 1D quadrature points.