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.