20void PAHdivMassSetup2D(
const int Q1D,
23 const Array<real_t> &w,
28 const bool symmetric = (coeffDim != 4);
29 const int NQ = Q1D*Q1D;
32 auto J =
Reshape(j.Read(), NQ, 2, 2, NE);
33 auto C =
Reshape(coeff_.Read(), coeffDim, NQ, NE);
34 auto y =
Reshape(op.Write(), NQ, symmetric ? 3 : 4, NE);
38 for (
int q = 0; q < NQ; ++q)
40 const real_t J11 = J(q,0,0,e);
41 const real_t J21 = J(q,1,0,e);
42 const real_t J12 = J(q,0,1,e);
43 const real_t J22 = J(q,1,1,e);
44 const real_t c_detJ = W[q] / ((J11*J22)-(J21*J12));
47 if (coeffDim == 3 || coeffDim == 4)
49 const real_t C11 = C(0,q,e);
50 const real_t C12 = C(1,q,e);
51 const real_t C21 = symmetric ? C12 : C(2,q,e);
52 const real_t C22 = symmetric ? C(2,q,e) : C(3,q,e);
53 const real_t R11 = C11*J11 + C12*J21;
54 const real_t R21 = C21*J11 + C22*J21;
55 const real_t R12 = C11*J12 + C12*J22;
56 const real_t R22 = C21*J12 + C22*J22;
58 y(q,0,e) = c_detJ * (J11*R11 + J21*R21);
59 y(q,1,e) = c_detJ * (J11*R12 + J21*R22);
63 y(q,2,e) = c_detJ * (J12*R12 + J22*R22);
67 y(q,2,e) = c_detJ * (J12*R11 + J22*R21);
68 y(q,3,e) = c_detJ * (J12*R12 + J22*R22);
73 const real_t C1 = C(0,q,e);
74 const real_t C2 = (coeffDim == 2 ? C(1,q,e) : C1);
75 y(q,0,e) = c_detJ * (J11*C1*J11 + J21*C2*J21);
76 y(q,1,e) = c_detJ * (J11*C1*J12 + J21*C2*J22);
77 y(q,2,e) = c_detJ * (J12*C1*J12 + J22*C2*J22);
83void PAHdivMassSetup3D(
const int Q1D,
86 const Array<real_t> &w,
91 const bool symmetric = (coeffDim != 9);
92 const int NQ = Q1D*Q1D*Q1D;
94 auto J =
Reshape(j.Read(), NQ, 3, 3, NE);
95 auto C =
Reshape(coeff_.Read(), coeffDim, NQ, NE);
96 auto y =
Reshape(op.Write(), NQ, symmetric ? 6 : 9, NE);
100 for (
int q = 0; q < NQ; ++q)
102 const real_t J11 = J(q,0,0,e);
103 const real_t J21 = J(q,1,0,e);
104 const real_t J31 = J(q,2,0,e);
105 const real_t J12 = J(q,0,1,e);
106 const real_t J22 = J(q,1,1,e);
107 const real_t J32 = J(q,2,1,e);
108 const real_t J13 = J(q,0,2,e);
109 const real_t J23 = J(q,1,2,e);
110 const real_t J33 = J(q,2,2,e);
111 const real_t detJ = J11 * (J22 * J33 - J32 * J23) -
112 J21 * (J12 * J33 - J32 * J13) +
113 J31 * (J12 * J23 - J22 * J13);
114 const real_t c_detJ = W[q] / detJ;
117 if (coeffDim == 6 || coeffDim == 9)
120 M[0][0] = C(0, q, e);
121 M[0][1] = C(1, q, e);
122 M[0][2] = C(2, q, e);
123 M[1][0] = (!symmetric) ? C(3, q, e) : M[0][1];
124 M[1][1] = (!symmetric) ? C(4, q, e) : C(3, q, e);
125 M[1][2] = (!symmetric) ? C(5, q, e) : C(4, q, e);
126 M[2][0] = (!symmetric) ? C(6, q, e) : M[0][2];
127 M[2][1] = (!symmetric) ? C(7, q, e) : M[1][2];
128 M[2][2] = (!symmetric) ? C(8, q, e) : C(5, q, e);
131 for (
int i=0; i<3; ++i)
132 for (
int j = (symmetric ? i : 0); j<3; ++j)
135 for (
int k=0; k<3; ++k)
138 for (
int l=0; l<3; ++l)
140 MJ_kj += M[k][l] * J(q,l,j,e);
143 y(q,idx,e) += J(q,k,i,e) * MJ_kj;
146 y(q,idx,e) *= c_detJ;
153 for (
int i=0; i<3; ++i)
154 for (
int j=i; j<3; ++j)
157 for (
int k=0; k<3; ++k)
159 y(q,idx,e) += J(q,k,i,e) * C(coeffDim == 3 ? k : 0, q, e) * J(q,k,j,e);
162 y(q,idx,e) *= c_detJ;
170void PAHdivMassAssembleDiagonal2D(
const int D1D,
173 const bool symmetric,
174 const Array<real_t> &Bo_,
175 const Array<real_t> &Bc_,
179 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
180 auto Bc =
Reshape(Bc_.Read(), Q1D, D1D);
181 auto op =
Reshape(op_.Read(), Q1D, Q1D, symmetric ? 3 : 4, NE);
182 auto diag =
Reshape(diag_.ReadWrite(), 2*(D1D-1)*D1D, NE);
186 constexpr static int VDIM = 2;
187 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
191 for (
int c = 0; c < VDIM; ++c)
193 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
194 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
196 for (
int dy = 0; dy < D1Dy; ++dy)
199 for (
int qx = 0; qx < Q1D; ++qx)
202 for (
int qy = 0; qy < Q1D; ++qy)
204 const real_t wy = (c == 1) ? Bc(qy,dy) : Bo(qy,dy);
205 mass[qx] += wy*wy*((c == 0) ? op(qx,qy,0,e) : op(qx,qy,symmetric ? 2 : 3,e));
209 for (
int dx = 0; dx < D1Dx; ++dx)
212 for (
int qx = 0; qx < Q1D; ++qx)
214 const real_t wx = (c == 0) ? Bc(qx,dx) : Bo(qx,dx);
215 val +=
mass[qx] * wx * wx;
217 diag(dx + (dy * D1Dx) + osc, e) += val;
226void PAHdivMassAssembleDiagonal3D(
const int D1D,
229 const bool symmetric,
230 const Array<real_t> &Bo_,
231 const Array<real_t> &Bc_,
236 "Error: D1D > HDIV_MAX_D1D");
238 "Error: Q1D > HDIV_MAX_Q1D");
239 constexpr static int VDIM = 3;
241 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
242 auto Bc =
Reshape(Bc_.Read(), Q1D, D1D);
243 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, symmetric ? 6 : 9, NE);
244 auto diag =
Reshape(diag_.ReadWrite(), 3*(D1D-1)*(D1D-1)*D1D, NE);
250 for (
int c = 0; c < VDIM; ++c)
252 const int D1Dz = (c == 2) ? D1D : D1D - 1;
253 const int D1Dy = (c == 1) ? D1D : D1D - 1;
254 const int D1Dx = (c == 0) ? D1D : D1D - 1;
256 const int opc = (c == 0) ? 0 : ((c == 1) ? (symmetric ? 3 : 4) :
257 (symmetric ? 5 : 8));
261 for (
int dz = 0; dz < D1Dz; ++dz)
263 for (
int dy = 0; dy < D1Dy; ++dy)
265 for (
int qx = 0; qx < Q1D; ++qx)
268 for (
int qy = 0; qy < Q1D; ++qy)
270 const real_t wy = (c == 1) ? Bc(qy,dy) : Bo(qy,dy);
271 for (
int qz = 0; qz < Q1D; ++qz)
273 const real_t wz = (c == 2) ? Bc(qz,dz) : Bo(qz,dz);
274 mass[qx] += wy * wy * wz * wz * op(qx,qy,qz,opc,e);
279 for (
int dx = 0; dx < D1Dx; ++dx)
282 for (
int qx = 0; qx < Q1D; ++qx)
284 const real_t wx = (c == 0) ? Bc(qx,dx) : Bo(qx,dx);
285 val +=
mass[qx] * wx * wx;
287 diag(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e) += val;
292 osc += D1Dx * D1Dy * D1Dz;
297void PAHdivMassApply2D(
const int NE,
const bool symmetric,
const bool,
298 const Array<real_t> &Bo_,
const Array<real_t> &Bc_,
299 const Array<real_t> &Bot_,
const Array<real_t> &Bct_,
300 const Vector &op_,
const Vector &x_, Vector &y_,
301 const int D1D,
const int TestD1D,
const int Q1D)
303 MFEM_VERIFY(D1D == TestD1D,
304 "Trial and test spaces must have same number of dofs");
305 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
306 auto Bc =
Reshape(Bc_.Read(), Q1D, D1D);
307 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
308 auto Bct =
Reshape(Bct_.Read(), D1D, Q1D);
309 auto op =
Reshape(op_.Read(), Q1D, Q1D, symmetric ? 3 : 4, NE);
310 auto x =
Reshape(x_.Read(), 2*(D1D-1)*D1D, NE);
311 auto y =
Reshape(y_.ReadWrite(), 2*(D1D-1)*D1D, NE);
315 constexpr static int VDIM = 2;
316 constexpr static int MAX_D1D = DofQuadLimits::HDIV_MAX_D1D;
317 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
321 for (
int qy = 0; qy < Q1D; ++qy)
323 for (
int qx = 0; qx < Q1D; ++qx)
325 for (
int c = 0; c < VDIM; ++c)
327 mass[qy][qx][c] = 0.0;
334 for (
int c = 0; c < VDIM; ++c)
336 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
337 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
339 for (
int dy = 0; dy < D1Dy; ++dy)
342 for (
int qx = 0; qx < Q1D; ++qx)
347 for (
int dx = 0; dx < D1Dx; ++dx)
349 const real_t t = x(dx + (dy * D1Dx) + osc, e);
350 for (
int qx = 0; qx < Q1D; ++qx)
352 massX[qx] += t * ((c == 0) ? Bc(qx,dx) : Bo(qx,dx));
356 for (
int qy = 0; qy < Q1D; ++qy)
358 const real_t wy = (c == 1) ? Bc(qy,dy) : Bo(qy,dy);
359 for (
int qx = 0; qx < Q1D; ++qx)
361 mass[qy][qx][c] += massX[qx] * wy;
370 for (
int qy = 0; qy < Q1D; ++qy)
372 for (
int qx = 0; qx < Q1D; ++qx)
374 const real_t O11 = op(qx,qy,0,e);
375 const real_t O12 = op(qx,qy,1,e);
376 const real_t O21 = symmetric ? O12 : op(qx,qy,2,e);
377 const real_t O22 = symmetric ? op(qx,qy,2,e) : op(qx,qy,3,e);
380 mass[qy][qx][0] = (O11*massX)+(O12*massY);
381 mass[qy][qx][1] = (O21*massX)+(O22*massY);
385 for (
int qy = 0; qy < Q1D; ++qy)
389 for (
int c = 0; c < VDIM; ++c)
391 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
392 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
395 for (
int dx = 0; dx < D1Dx; ++dx)
399 for (
int qx = 0; qx < Q1D; ++qx)
401 for (
int dx = 0; dx < D1Dx; ++dx)
403 massX[dx] +=
mass[qy][qx][c] * ((c == 0) ? Bct(dx,qx) :
408 for (
int dy = 0; dy < D1Dy; ++dy)
410 const real_t wy = (c == 1) ? Bct(dy,qy) : Bot(dy,qy);
412 for (
int dx = 0; dx < D1Dx; ++dx)
414 y(dx + (dy * D1Dx) + osc, e) += massX[dx] * wy;
424void PAHdivMassApply3D(
const int NE,
const bool symmetric,
const bool,
425 const Array<real_t> &Bo_,
const Array<real_t> &Bc_,
426 const Array<real_t> &Bot_,
const Array<real_t> &Bct_,
427 const Vector &op_,
const Vector &x_, Vector &y_,
428 const int D1D,
const int TestD1D,
const int Q1D)
430 MFEM_VERIFY(D1D == TestD1D,
431 "Trial and test spaces must have same number of dofs");
433 "Error: D1D > HDIV_MAX_D1D");
435 "Error: Q1D > HDIV_MAX_Q1D");
436 constexpr static int VDIM = 3;
438 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
439 auto Bc =
Reshape(Bc_.Read(), Q1D, D1D);
440 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
441 auto Bct =
Reshape(Bct_.Read(), D1D, Q1D);
442 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, symmetric ? 6 : 9, NE);
443 auto x =
Reshape(x_.Read(), 3*(D1D-1)*(D1D-1)*D1D, NE);
444 auto y =
Reshape(y_.ReadWrite(), 3*(D1D-1)*(D1D-1)*D1D, NE);
448 real_t mass[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][VDIM];
450 for (
int qz = 0; qz < Q1D; ++qz)
452 for (
int qy = 0; qy < Q1D; ++qy)
454 for (
int qx = 0; qx < Q1D; ++qx)
456 for (
int c = 0; c < VDIM; ++c)
458 mass[qz][qy][qx][c] = 0.0;
466 for (
int c = 0; c < VDIM; ++c)
468 const int D1Dz = (c == 2) ? D1D : D1D - 1;
469 const int D1Dy = (c == 1) ? D1D : D1D - 1;
470 const int D1Dx = (c == 0) ? D1D : D1D - 1;
472 for (
int dz = 0; dz < D1Dz; ++dz)
474 real_t massXY[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
475 for (
int qy = 0; qy < Q1D; ++qy)
477 for (
int qx = 0; qx < Q1D; ++qx)
479 massXY[qy][qx] = 0.0;
483 for (
int dy = 0; dy < D1Dy; ++dy)
485 real_t massX[DofQuadLimits::HDIV_MAX_Q1D];
486 for (
int qx = 0; qx < Q1D; ++qx)
491 for (
int dx = 0; dx < D1Dx; ++dx)
493 const real_t t = x(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e);
494 for (
int qx = 0; qx < Q1D; ++qx)
496 massX[qx] += t * ((c == 0) ? Bc(qx,dx) : Bo(qx,dx));
500 for (
int qy = 0; qy < Q1D; ++qy)
502 const real_t wy = (c == 1) ? Bc(qy,dy) : Bo(qy,dy);
503 for (
int qx = 0; qx < Q1D; ++qx)
505 const real_t wx = massX[qx];
506 massXY[qy][qx] += wx * wy;
511 for (
int qz = 0; qz < Q1D; ++qz)
513 const real_t wz = (c == 2) ? Bc(qz,dz) : Bo(qz,dz);
514 for (
int qy = 0; qy < Q1D; ++qy)
516 for (
int qx = 0; qx < Q1D; ++qx)
518 mass[qz][qy][qx][c] += massXY[qy][qx] * wz;
524 osc += D1Dx * D1Dy * D1Dz;
528 for (
int qz = 0; qz < Q1D; ++qz)
530 for (
int qy = 0; qy < Q1D; ++qy)
532 for (
int qx = 0; qx < Q1D; ++qx)
534 const real_t O11 = op(qx,qy,qz,0,e);
535 const real_t O12 = op(qx,qy,qz,1,e);
536 const real_t O13 = op(qx,qy,qz,2,e);
537 const real_t O21 = symmetric ? O12 : op(qx,qy,qz,3,e);
538 const real_t O22 = symmetric ? op(qx,qy,qz,3,e) : op(qx,qy,qz,4,e);
539 const real_t O23 = symmetric ? op(qx,qy,qz,4,e) : op(qx,qy,qz,5,e);
540 const real_t O31 = symmetric ? O13 : op(qx,qy,qz,6,e);
541 const real_t O32 = symmetric ? O23 : op(qx,qy,qz,7,e);
542 const real_t O33 = symmetric ? op(qx,qy,qz,5,e) : op(qx,qy,qz,8,e);
547 mass[qz][qy][qx][0] = (O11*massX)+(O12*massY)+(O13*massZ);
548 mass[qz][qy][qx][1] = (O21*massX)+(O22*massY)+(O23*massZ);
549 mass[qz][qy][qx][2] = (O31*massX)+(O32*massY)+(O33*massZ);
554 for (
int qz = 0; qz < Q1D; ++qz)
556 real_t massXY[DofQuadLimits::HDIV_MAX_D1D][DofQuadLimits::HDIV_MAX_D1D];
560 for (
int c = 0; c < VDIM; ++c)
562 const int D1Dz = (c == 2) ? D1D : D1D - 1;
563 const int D1Dy = (c == 1) ? D1D : D1D - 1;
564 const int D1Dx = (c == 0) ? D1D : D1D - 1;
566 for (
int dy = 0; dy < D1Dy; ++dy)
568 for (
int dx = 0; dx < D1Dx; ++dx)
573 for (
int qy = 0; qy < Q1D; ++qy)
575 real_t massX[DofQuadLimits::HDIV_MAX_D1D];
576 for (
int dx = 0; dx < D1Dx; ++dx)
580 for (
int qx = 0; qx < Q1D; ++qx)
582 for (
int dx = 0; dx < D1Dx; ++dx)
584 massX[dx] +=
mass[qz][qy][qx][c] *
585 ((c == 0) ? Bct(dx,qx) : Bot(dx,qx));
588 for (
int dy = 0; dy < D1Dy; ++dy)
590 const real_t wy = (c == 1) ? Bct(dy,qy) : Bot(dy,qy);
591 for (
int dx = 0; dx < D1Dx; ++dx)
593 massXY[dy][dx] += massX[dx] * wy;
598 for (
int dz = 0; dz < D1Dz; ++dz)
600 const real_t wz = (c == 2) ? Bct(dz,qz) : Bot(dz,qz);
601 for (
int dy = 0; dy < D1Dy; ++dy)
603 for (
int dx = 0; dx < D1Dx; ++dx)
605 y(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e) +=
611 osc += D1Dx * D1Dy * D1Dz;
618void PADivDivSetup2D(
const int Q1D,
620 const Array<real_t> &w,
625 const int NQ = Q1D*Q1D;
627 auto J =
Reshape(j.Read(), NQ, 2, 2, NE);
628 auto coeff =
Reshape(coeff_.Read(), NQ, NE);
629 auto y =
Reshape(op.Write(), NQ, NE);
632 for (
int q = 0; q < NQ; ++q)
634 const real_t J11 = J(q,0,0,e);
635 const real_t J21 = J(q,1,0,e);
636 const real_t J12 = J(q,0,1,e);
637 const real_t J22 = J(q,1,1,e);
638 const real_t detJ = (J11*J22)-(J21*J12);
639 y(q,e) = W[q] * coeff(q,e) / detJ;
644void PADivDivSetup3D(
const int Q1D,
646 const Array<real_t> &w,
651 const int NQ = Q1D*Q1D*Q1D;
653 auto J =
Reshape(j.Read(), NQ, 3, 3, NE);
654 auto coeff =
Reshape(coeff_.Read(), NQ, NE);
655 auto y =
Reshape(op.Write(), NQ, NE);
659 for (
int q = 0; q < NQ; ++q)
661 const real_t J11 = J(q,0,0,e);
662 const real_t J21 = J(q,1,0,e);
663 const real_t J31 = J(q,2,0,e);
664 const real_t J12 = J(q,0,1,e);
665 const real_t J22 = J(q,1,1,e);
666 const real_t J32 = J(q,2,1,e);
667 const real_t J13 = J(q,0,2,e);
668 const real_t J23 = J(q,1,2,e);
669 const real_t J33 = J(q,2,2,e);
670 const real_t detJ = J11 * (J22 * J33 - J32 * J23) -
671 J21 * (J12 * J33 - J32 * J13) +
672 J31 * (J12 * J23 - J22 * J13);
673 y(q,e) = W[q] * coeff(q, e) / detJ;
678void PADivDivAssembleDiagonal2D(
const int D1D,
681 const Array<real_t> &Bo_,
682 const Array<real_t> &Gc_,
686 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
687 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
688 auto op =
Reshape(op_.Read(), Q1D, Q1D, NE);
689 auto diag =
Reshape(diag_.ReadWrite(), 2*(D1D-1)*D1D, NE);
693 constexpr static int VDIM = 2;
694 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
698 for (
int c = 0; c < VDIM; ++c)
700 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
701 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
705 for (
int dy = 0; dy < D1Dy; ++dy)
707 for (
int qx = 0; qx < Q1D; ++qx)
710 for (
int qy = 0; qy < Q1D; ++qy)
712 const real_t wy = (c == 0) ? Bo(qy,dy) : Gc(qy,dy);
713 div[qx] += wy * wy * op(qx,qy,e);
717 for (
int dx = 0; dx < D1Dx; ++dx)
720 for (
int qx = 0; qx < Q1D; ++qx)
722 const real_t wx = (c == 0) ? Gc(qx,dx) : Bo(qx,dx);
723 val += div[qx] * wx * wx;
725 diag(dx + (dy * D1Dx) + osc, e) += val;
734void PADivDivAssembleDiagonal3D(
const int D1D,
737 const Array<real_t> &Bo_,
738 const Array<real_t> &Gc_,
743 "Error: D1D > HDIV_MAX_D1D");
745 "Error: Q1D > HDIV_MAX_Q1D");
746 constexpr static int VDIM = 3;
748 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
749 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
750 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, NE);
751 auto diag =
Reshape(diag_.ReadWrite(), 3*(D1D-1)*(D1D-1)*D1D, NE);
757 for (
int c = 0; c < VDIM; ++c)
759 const int D1Dz = (c == 2) ? D1D : D1D - 1;
760 const int D1Dy = (c == 1) ? D1D : D1D - 1;
761 const int D1Dx = (c == 0) ? D1D : D1D - 1;
763 for (
int dz = 0; dz < D1Dz; ++dz)
765 for (
int dy = 0; dy < D1Dy; ++dy)
767 real_t a[DofQuadLimits::HDIV_MAX_Q1D];
769 for (
int qx = 0; qx < Q1D; ++qx)
772 for (
int qy = 0; qy < Q1D; ++qy)
774 const real_t wy = (c == 1) ? Gc(qy,dy) : Bo(qy,dy);
776 for (
int qz = 0; qz < Q1D; ++qz)
778 const real_t wz = (c == 2) ? Gc(qz,dz) : Bo(qz,dz);
779 a[qx] += wy * wy * wz * wz * op(qx,qy,qz,e);
784 for (
int dx = 0; dx < D1Dx; ++dx)
787 for (
int qx = 0; qx < Q1D; ++qx)
789 const real_t wx = (c == 0) ? Gc(qx,dx) : Bo(qx,dx);
790 val +=
a[qx] * wx * wx;
792 diag(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e) += val;
797 osc += D1Dx * D1Dy * D1Dz;
802void PADivDivApply2D(
const int D1D,
805 const Array<real_t> &Bo_,
806 const Array<real_t> &Gc_,
807 const Array<real_t> &Bot_,
808 const Array<real_t> &Gct_,
813 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
814 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
815 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
816 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
817 auto op =
Reshape(op_.Read(), Q1D, Q1D, NE);
818 auto x =
Reshape(x_.Read(), 2*(D1D-1)*D1D, NE);
819 auto y =
Reshape(y_.ReadWrite(), 2*(D1D-1)*D1D, NE);
823 constexpr static int VDIM = 2;
824 constexpr static int MAX_D1D = DofQuadLimits::HDIV_MAX_D1D;
825 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
827 real_t div[MAX_Q1D][MAX_Q1D];
831 for (
int qy = 0; qy < Q1D; ++qy)
833 for (
int qx = 0; qx < Q1D; ++qx)
841 for (
int c = 0; c < VDIM; ++c)
843 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
844 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
846 for (
int dy = 0; dy < D1Dy; ++dy)
849 for (
int qx = 0; qx < Q1D; ++qx)
854 for (
int dx = 0; dx < D1Dx; ++dx)
856 const real_t t = x(dx + (dy * D1Dx) + osc, e);
857 for (
int qx = 0; qx < Q1D; ++qx)
859 gradX[qx] += t * ((c == 0) ? Gc(qx,dx) : Bo(qx,dx));
863 for (
int qy = 0; qy < Q1D; ++qy)
865 const real_t wy = (c == 0) ? Bo(qy,dy) : Gc(qy,dy);
866 for (
int qx = 0; qx < Q1D; ++qx)
868 div[qy][qx] += gradX[qx] * wy;
877 for (
int qy = 0; qy < Q1D; ++qy)
879 for (
int qx = 0; qx < Q1D; ++qx)
881 div[qy][qx] *= op(qx,qy,e);
885 for (
int qy = 0; qy < Q1D; ++qy)
889 for (
int c = 0; c < VDIM; ++c)
891 const int D1Dx = (c == 1) ? D1D - 1 : D1D;
892 const int D1Dy = (c == 0) ? D1D - 1 : D1D;
895 for (
int dx = 0; dx < D1Dx; ++dx)
899 for (
int qx = 0; qx < Q1D; ++qx)
901 for (
int dx = 0; dx < D1Dx; ++dx)
903 gradX[dx] += div[qy][qx] * (c == 0 ? Gct(dx,qx) : Bot(dx,qx));
906 for (
int dy = 0; dy < D1Dy; ++dy)
908 const real_t wy = (c == 0) ? Bot(dy,qy) : Gct(dy,qy);
909 for (
int dx = 0; dx < D1Dx; ++dx)
911 y(dx + (dy * D1Dx) + osc, e) += gradX[dx] * wy;
921void PADivDivApply3D(
const int D1D,
924 const Array<real_t> &Bo_,
925 const Array<real_t> &Gc_,
926 const Array<real_t> &Bot_,
927 const Array<real_t> &Gct_,
933 "Error: D1D > HDIV_MAX_D1D");
935 "Error: Q1D > HDIV_MAX_Q1D");
936 constexpr static int VDIM = 3;
938 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
939 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
940 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
941 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
942 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, NE);
943 auto x =
Reshape(x_.Read(), 3*(D1D-1)*(D1D-1)*D1D, NE);
944 auto y =
Reshape(y_.ReadWrite(), 3*(D1D-1)*(D1D-1)*D1D, NE);
948 real_t div[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
950 for (
int qz = 0; qz < Q1D; ++qz)
952 for (
int qy = 0; qy < Q1D; ++qy)
954 for (
int qx = 0; qx < Q1D; ++qx)
956 div[qz][qy][qx] = 0.0;
963 for (
int c = 0; c < VDIM; ++c)
965 const int D1Dz = (c == 2) ? D1D : D1D - 1;
966 const int D1Dy = (c == 1) ? D1D : D1D - 1;
967 const int D1Dx = (c == 0) ? D1D : D1D - 1;
969 for (
int dz = 0; dz < D1Dz; ++dz)
971 real_t aXY[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
972 for (
int qy = 0; qy < Q1D; ++qy)
974 for (
int qx = 0; qx < Q1D; ++qx)
980 for (
int dy = 0; dy < D1Dy; ++dy)
982 real_t aX[DofQuadLimits::HDIV_MAX_Q1D];
983 for (
int qx = 0; qx < Q1D; ++qx)
988 for (
int dx = 0; dx < D1Dx; ++dx)
990 const real_t t = x(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e);
991 for (
int qx = 0; qx < Q1D; ++qx)
993 aX[qx] += t * ((c == 0) ? Gc(qx,dx) : Bo(qx,dx));
997 for (
int qy = 0; qy < Q1D; ++qy)
999 const real_t wy = (c == 1) ? Gc(qy,dy) : Bo(qy,dy);
1000 for (
int qx = 0; qx < Q1D; ++qx)
1002 const real_t wx = aX[qx];
1003 aXY[qy][qx] += wx * wy;
1008 for (
int qz = 0; qz < Q1D; ++qz)
1010 const real_t wz = (c == 2) ? Gc(qz,dz) : Bo(qz,dz);
1011 for (
int qy = 0; qy < Q1D; ++qy)
1013 for (
int qx = 0; qx < Q1D; ++qx)
1015 div[qz][qy][qx] += aXY[qy][qx] * wz;
1021 osc += D1Dx * D1Dy * D1Dz;
1025 for (
int qz = 0; qz < Q1D; ++qz)
1027 for (
int qy = 0; qy < Q1D; ++qy)
1029 for (
int qx = 0; qx < Q1D; ++qx)
1031 div[qz][qy][qx] *= op(qx,qy,qz,e);
1036 for (
int qz = 0; qz < Q1D; ++qz)
1038 real_t aXY[DofQuadLimits::HDIV_MAX_D1D][DofQuadLimits::HDIV_MAX_D1D];
1042 for (
int c = 0; c < VDIM; ++c)
1044 const int D1Dz = (c == 2) ? D1D : D1D - 1;
1045 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1046 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1048 for (
int dy = 0; dy < D1Dy; ++dy)
1050 for (
int dx = 0; dx < D1Dx; ++dx)
1055 for (
int qy = 0; qy < Q1D; ++qy)
1057 real_t aX[DofQuadLimits::HDIV_MAX_D1D];
1058 for (
int dx = 0; dx < D1Dx; ++dx)
1062 for (
int qx = 0; qx < Q1D; ++qx)
1064 for (
int dx = 0; dx < D1Dx; ++dx)
1066 aX[dx] += div[qz][qy][qx] *
1067 (c == 0 ? Gct(dx,qx) : Bot(dx,qx));
1070 for (
int dy = 0; dy < D1Dy; ++dy)
1072 const real_t wy = (c == 1) ? Gct(dy,qy) : Bot(dy,qy);
1073 for (
int dx = 0; dx < D1Dx; ++dx)
1075 aXY[dy][dx] += aX[dx] * wy;
1080 for (
int dz = 0; dz < D1Dz; ++dz)
1082 const real_t wz = (c == 2) ? Gct(dz,qz) : Bot(dz,qz);
1083 for (
int dy = 0; dy < D1Dy; ++dy)
1085 for (
int dx = 0; dx < D1Dx; ++dx)
1087 y(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e) +=
1093 osc += D1Dx * D1Dy * D1Dz;
1099void PAHdivL2Setup2D(
const int Q1D,
const int NE,
const Array<real_t> &w,
1100 Vector &coeff_, Vector &op,
const GeometricFactors *geom)
1102 const int NQ = Q1D*Q1D;
1104 auto coeff =
Reshape(coeff_.Read(), NQ, NE);
1105 auto y =
Reshape(op.Write(), NQ, NE);
1106 bool have_detJ = (geom !=
nullptr);
1107 auto detJ =
Reshape(have_detJ ? geom->detJ.Read() : nullptr, NQ, NE);
1110 for (
int q = 0; q < NQ; ++q)
1114 y(q, e) = W[q] * coeff(q, e) / detJ(q, e);
1118 y(q, e) = W[q] * coeff(q, e);
1124void PAHdivL2Setup3D(
const int Q1D,
const int NE,
const Array<real_t> &w,
1125 Vector &coeff_, Vector &op,
const GeometricFactors *geom)
1127 const int NQ = Q1D*Q1D*Q1D;
1129 auto coeff =
Reshape(coeff_.Read(), NQ, NE);
1130 auto y =
Reshape(op.Write(), NQ, NE);
1132 bool have_detJ = (geom !=
nullptr);
1133 auto detJ =
Reshape(have_detJ ? geom->detJ.Read() : nullptr, NQ, NE);
1137 for (
int q = 0; q < NQ; ++q)
1141 y(q, e) = W[q] * coeff(q, e) / detJ(q, e);
1145 y(q, e) = W[q] * coeff(q, e);
1151void PAHdivL2AssembleDiagonal_ADAt_2D(
const int D1D,
1155 const Array<real_t> &L2Bo_,
1156 const Array<real_t> &Gct_,
1157 const Array<real_t> &Bot_,
1162 constexpr static int VDIM = 2;
1164 auto L2Bo =
Reshape(L2Bo_.Read(), Q1D, L2D1D);
1165 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
1166 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
1167 auto op =
Reshape(op_.Read(), Q1D, Q1D, NE);
1168 auto D =
Reshape(D_.Read(), 2*(D1D-1)*D1D, NE);
1169 auto diag =
Reshape(diag_.ReadWrite(), L2D1D, L2D1D, NE);
1173 for (
int ry = 0; ry < L2D1D; ++ry)
1175 for (
int rx = 0; rx < L2D1D; ++rx)
1180 real_t row[2*DofQuadLimits::HDIV_MAX_D1D*(DofQuadLimits::HDIV_MAX_D1D-1)];
1181 real_t div[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1183 for (
int i=0; i<2*D1D*(D1D - 1); ++i)
1188 for (
int qy = 0; qy < Q1D; ++qy)
1190 for (
int qx = 0; qx < Q1D; ++qx)
1192 div[qy][qx] = op(qx,qy,e) * L2Bo(qx,rx) * L2Bo(qy,ry);
1196 for (
int qy = 0; qy < Q1D; ++qy)
1199 for (
int c = 0; c < VDIM; ++c)
1201 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1202 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1204 real_t aX[DofQuadLimits::HDIV_MAX_D1D];
1205 for (
int dx = 0; dx < D1Dx; ++dx)
1209 for (
int qx = 0; qx < Q1D; ++qx)
1211 for (
int dx = 0; dx < D1Dx; ++dx)
1213 aX[dx] += div[qy][qx] * ((c == 0) ? Gct(dx,qx) :
1218 for (
int dy = 0; dy < D1Dy; ++dy)
1220 const real_t wy = (c == 1) ? Gct(dy,qy) : Bot(dy,qy);
1222 for (
int dx = 0; dx < D1Dx; ++dx)
1224 row[dx + (dy * D1Dx) + osc] += aX[dx] * wy;
1233 for (
int i=0; i<2*D1D*(D1D - 1); ++i)
1235 val += row[i] * row[i] * D(i,e);
1237 diag(rx,ry,e) += val;
1243void PAHdivL2AssembleDiagonal_ADAt_3D(
const int D1D,
1247 const Array<real_t> &L2Bo_,
1248 const Array<real_t> &Gct_,
1249 const Array<real_t> &Bot_,
1255 "Error: D1D > HDIV_MAX_D1D");
1257 "Error: Q1D > HDIV_MAX_Q1D");
1258 constexpr static int VDIM = 3;
1260 auto L2Bo =
Reshape(L2Bo_.Read(), Q1D, L2D1D);
1261 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
1262 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
1263 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, NE);
1264 auto D =
Reshape(D_.Read(), 3*(D1D-1)*(D1D-1)*D1D, NE);
1265 auto diag =
Reshape(diag_.ReadWrite(), L2D1D, L2D1D, L2D1D, NE);
1269 for (
int rz = 0; rz < L2D1D; ++rz)
1271 for (
int ry = 0; ry < L2D1D; ++ry)
1273 for (
int rx = 0; rx < L2D1D; ++rx)
1278 real_t row[3*DofQuadLimits::HDIV_MAX_D1D*(DofQuadLimits::HDIV_MAX_D1D-1)*
1279 (DofQuadLimits::HDIV_MAX_D1D-1)];
1280 real_t div[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1282 for (
int i=0; i<3*D1D*(D1D - 1)*(D1D - 1); ++i)
1287 for (
int qz = 0; qz < Q1D; ++qz)
1289 for (
int qy = 0; qy < Q1D; ++qy)
1291 for (
int qx = 0; qx < Q1D; ++qx)
1293 div[qz][qy][qx] = op(qx,qy,qz,e) * L2Bo(qx,rx) *
1294 L2Bo(qy,ry) * L2Bo(qz,rz);
1299 for (
int qz = 0; qz < Q1D; ++qz)
1301 real_t aXY[DofQuadLimits::HDIV_MAX_D1D][DofQuadLimits::HDIV_MAX_D1D];
1304 for (
int c = 0; c < VDIM; ++c)
1306 const int D1Dz = (c == 2) ? D1D : D1D - 1;
1307 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1308 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1310 for (
int dy = 0; dy < D1Dy; ++dy)
1312 for (
int dx = 0; dx < D1Dx; ++dx)
1317 for (
int qy = 0; qy < Q1D; ++qy)
1319 real_t aX[DofQuadLimits::HDIV_MAX_D1D];
1320 for (
int dx = 0; dx < D1Dx; ++dx)
1324 for (
int qx = 0; qx < Q1D; ++qx)
1326 for (
int dx = 0; dx < D1Dx; ++dx)
1328 aX[dx] += div[qz][qy][qx] * ((c == 0) ? Gct(dx,qx)
1332 for (
int dy = 0; dy < D1Dy; ++dy)
1334 const real_t wy = (c == 1) ? Gct(dy,qy) : Bot(dy,qy);
1335 for (
int dx = 0; dx < D1Dx; ++dx)
1337 aXY[dy][dx] += aX[dx] * wy;
1342 for (
int dz = 0; dz < D1Dz; ++dz)
1344 const real_t wz = (c == 2) ? Gct(dz,qz) : Bot(dz,qz);
1345 for (
int dy = 0; dy < D1Dy; ++dy)
1347 for (
int dx = 0; dx < D1Dx; ++dx)
1349 row[dx + ((dy + (dz * D1Dy)) * D1Dx) + osc] +=
1355 osc += D1Dx * D1Dy * D1Dz;
1360 for (
int i=0; i<3*D1D*(D1D - 1)*(D1D - 1); ++i)
1362 val += row[i] * row[i] * D(i,e);
1364 diag(rx,ry,rz,e) += val;
1373void PAHdivL2Apply2D(
const int D1D,
1377 const Array<real_t> &Bo_,
1378 const Array<real_t> &Gc_,
1379 const Array<real_t> &L2Bot_,
1384 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
1385 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
1386 auto L2Bot =
Reshape(L2Bot_.Read(), L2D1D, Q1D);
1387 auto op =
Reshape(op_.Read(), Q1D, Q1D, NE);
1388 auto x =
Reshape(x_.Read(), 2*(D1D-1)*D1D, NE);
1389 auto y =
Reshape(y_.ReadWrite(), L2D1D, L2D1D, NE);
1393 constexpr static int VDIM = 2;
1394 constexpr static int MAX_D1D = DofQuadLimits::HDIV_MAX_D1D;
1395 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
1397 real_t div[MAX_Q1D][MAX_Q1D];
1399 for (
int qy = 0; qy < Q1D; ++qy)
1401 for (
int qx = 0; qx < Q1D; ++qx)
1409 for (
int c = 0; c < VDIM; ++c)
1411 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1412 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1414 for (
int dy = 0; dy < D1Dy; ++dy)
1417 for (
int qx = 0; qx < Q1D; ++qx)
1422 for (
int dx = 0; dx < D1Dx; ++dx)
1424 const real_t t = x(dx + (dy * D1Dx) + osc, e);
1425 for (
int qx = 0; qx < Q1D; ++qx)
1427 aX[qx] += t * ((c == 0) ? Gc(qx,dx) : Bo(qx,dx));
1431 for (
int qy = 0; qy < Q1D; ++qy)
1433 const real_t wy = (c == 1) ? Gc(qy,dy) : Bo(qy,dy);
1434 for (
int qx = 0; qx < Q1D; ++qx)
1436 div[qy][qx] += aX[qx] * wy;
1445 for (
int qy = 0; qy < Q1D; ++qy)
1447 for (
int qx = 0; qx < Q1D; ++qx)
1449 div[qy][qx] *= op(qx,qy,e);
1453 for (
int qy = 0; qy < Q1D; ++qy)
1456 for (
int dx = 0; dx < L2D1D; ++dx)
1460 for (
int qx = 0; qx < Q1D; ++qx)
1462 for (
int dx = 0; dx < L2D1D; ++dx)
1464 aX[dx] += div[qy][qx] * L2Bot(dx,qx);
1467 for (
int dy = 0; dy < L2D1D; ++dy)
1469 const real_t wy = L2Bot(dy,qy);
1470 for (
int dx = 0; dx < L2D1D; ++dx)
1472 y(dx,dy,e) += aX[dx] * wy;
1479void PAHdivL2ApplyTranspose2D(
const int D1D,
1483 const Array<real_t> &L2Bo_,
1484 const Array<real_t> &Gct_,
1485 const Array<real_t> &Bot_,
1490 auto L2Bo =
Reshape(L2Bo_.Read(), Q1D, L2D1D);
1491 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
1492 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
1493 auto op =
Reshape(op_.Read(), Q1D, Q1D, NE);
1494 auto x =
Reshape(x_.Read(), L2D1D, L2D1D, NE);
1495 auto y =
Reshape(y_.ReadWrite(), 2*(D1D-1)*D1D, NE);
1499 constexpr static int VDIM = 2;
1500 constexpr static int MAX_D1D = DofQuadLimits::HDIV_MAX_D1D;
1501 constexpr static int MAX_Q1D = DofQuadLimits::HDIV_MAX_Q1D;
1503 real_t div[MAX_Q1D][MAX_Q1D];
1505 for (
int qy = 0; qy < Q1D; ++qy)
1507 for (
int qx = 0; qx < Q1D; ++qx)
1513 for (
int dy = 0; dy < L2D1D; ++dy)
1516 for (
int qx = 0; qx < Q1D; ++qx)
1521 for (
int dx = 0; dx < L2D1D; ++dx)
1523 const real_t t = x(dx,dy,e);
1524 for (
int qx = 0; qx < Q1D; ++qx)
1526 aX[qx] += t * L2Bo(qx,dx);
1530 for (
int qy = 0; qy < Q1D; ++qy)
1532 const real_t wy = L2Bo(qy,dy);
1533 for (
int qx = 0; qx < Q1D; ++qx)
1535 div[qy][qx] += aX[qx] * wy;
1541 for (
int qy = 0; qy < Q1D; ++qy)
1543 for (
int qx = 0; qx < Q1D; ++qx)
1545 div[qy][qx] *= op(qx,qy,e);
1549 for (
int qy = 0; qy < Q1D; ++qy)
1554 for (
int c = 0; c < VDIM; ++c)
1556 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1557 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1559 for (
int dx = 0; dx < D1Dx; ++dx)
1563 for (
int qx = 0; qx < Q1D; ++qx)
1565 for (
int dx = 0; dx < D1Dx; ++dx)
1567 aX[dx] += div[qy][qx] * ((c == 0) ? Gct(dx,qx) : Bot(dx,qx));
1570 for (
int dy = 0; dy < D1Dy; ++dy)
1572 const real_t wy = (c == 0) ? Bot(dy,qy) : Gct(dy,qy);
1573 for (
int dx = 0; dx < D1Dx; ++dx)
1575 y(dx + (dy * D1Dx) + osc, e) += aX[dx] * wy;
1587void PAHdivL2Apply3D(
const int D1D,
1591 const Array<real_t> &Bo_,
1592 const Array<real_t> &Gc_,
1593 const Array<real_t> &L2Bot_,
1599 "Error: D1D > HDIV_MAX_D1D");
1601 "Error: Q1D > HDIV_MAX_Q1D");
1602 constexpr static int VDIM = 3;
1604 auto Bo =
Reshape(Bo_.Read(), Q1D, D1D-1);
1605 auto Gc =
Reshape(Gc_.Read(), Q1D, D1D);
1606 auto L2Bot =
Reshape(L2Bot_.Read(), L2D1D, Q1D);
1607 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, NE);
1608 auto x =
Reshape(x_.Read(), 3*(D1D-1)*(D1D-1)*D1D, NE);
1609 auto y =
Reshape(y_.ReadWrite(), L2D1D, L2D1D, L2D1D, NE);
1613 real_t div[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1615 for (
int qz = 0; qz < Q1D; ++qz)
1617 for (
int qy = 0; qy < Q1D; ++qy)
1619 for (
int qx = 0; qx < Q1D; ++qx)
1621 div[qz][qy][qx] = 0.0;
1628 for (
int c = 0; c < VDIM; ++c)
1630 const int D1Dz = (c == 2) ? D1D : D1D - 1;
1631 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1632 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1634 for (
int dz = 0; dz < D1Dz; ++dz)
1636 real_t aXY[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1637 for (
int qy = 0; qy < Q1D; ++qy)
1639 for (
int qx = 0; qx < Q1D; ++qx)
1645 for (
int dy = 0; dy < D1Dy; ++dy)
1647 real_t aX[DofQuadLimits::HDIV_MAX_Q1D];
1648 for (
int qx = 0; qx < Q1D; ++qx)
1653 for (
int dx = 0; dx < D1Dx; ++dx)
1655 const real_t t = x(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e);
1656 for (
int qx = 0; qx < Q1D; ++qx)
1658 aX[qx] += t * ((c == 0) ? Gc(qx,dx) : Bo(qx,dx));
1662 for (
int qy = 0; qy < Q1D; ++qy)
1664 const real_t wy = (c == 1) ? Gc(qy,dy) : Bo(qy,dy);
1665 for (
int qx = 0; qx < Q1D; ++qx)
1667 aXY[qy][qx] += aX[qx] * wy;
1672 for (
int qz = 0; qz < Q1D; ++qz)
1674 const real_t wz = (c == 2) ? Gc(qz,dz) : Bo(qz,dz);
1675 for (
int qy = 0; qy < Q1D; ++qy)
1677 for (
int qx = 0; qx < Q1D; ++qx)
1679 div[qz][qy][qx] += aXY[qy][qx] * wz;
1685 osc += D1Dx * D1Dy * D1Dz;
1689 for (
int qz = 0; qz < Q1D; ++qz)
1691 for (
int qy = 0; qy < Q1D; ++qy)
1693 for (
int qx = 0; qx < Q1D; ++qx)
1695 div[qz][qy][qx] *= op(qx,qy,qz,e);
1700 for (
int qz = 0; qz < Q1D; ++qz)
1702 real_t aXY[DofQuadLimits::HDIV_MAX_D1D][DofQuadLimits::HDIV_MAX_D1D];
1704 for (
int dy = 0; dy < L2D1D; ++dy)
1706 for (
int dx = 0; dx < L2D1D; ++dx)
1711 for (
int qy = 0; qy < Q1D; ++qy)
1713 real_t aX[DofQuadLimits::HDIV_MAX_D1D];
1714 for (
int dx = 0; dx < L2D1D; ++dx)
1718 for (
int qx = 0; qx < Q1D; ++qx)
1720 for (
int dx = 0; dx < L2D1D; ++dx)
1722 aX[dx] += div[qz][qy][qx] * L2Bot(dx,qx);
1725 for (
int dy = 0; dy < L2D1D; ++dy)
1727 const real_t wy = L2Bot(dy,qy);
1728 for (
int dx = 0; dx < L2D1D; ++dx)
1730 aXY[dy][dx] += aX[dx] * wy;
1735 for (
int dz = 0; dz < L2D1D; ++dz)
1737 const real_t wz = L2Bot(dz,qz);
1738 for (
int dy = 0; dy < L2D1D; ++dy)
1740 for (
int dx = 0; dx < L2D1D; ++dx)
1742 y(dx,dy,dz,e) += aXY[dy][dx] * wz;
1750void PAHdivL2ApplyTranspose3D(
const int D1D,
1754 const Array<real_t> &L2Bo_,
1755 const Array<real_t> &Gct_,
1756 const Array<real_t> &Bot_,
1762 "Error: D1D > HDIV_MAX_D1D");
1764 "Error: Q1D > HDIV_MAX_Q1D");
1765 constexpr static int VDIM = 3;
1767 auto L2Bo =
Reshape(L2Bo_.Read(), Q1D, L2D1D);
1768 auto Gct =
Reshape(Gct_.Read(), D1D, Q1D);
1769 auto Bot =
Reshape(Bot_.Read(), D1D-1, Q1D);
1770 auto op =
Reshape(op_.Read(), Q1D, Q1D, Q1D, NE);
1771 auto x =
Reshape(x_.Read(), L2D1D, L2D1D, L2D1D, NE);
1772 auto y =
Reshape(y_.ReadWrite(), 3*(D1D-1)*(D1D-1)*D1D, NE);
1776 real_t div[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1778 for (
int qz = 0; qz < Q1D; ++qz)
1780 for (
int qy = 0; qy < Q1D; ++qy)
1782 for (
int qx = 0; qx < Q1D; ++qx)
1784 div[qz][qy][qx] = 0.0;
1789 for (
int dz = 0; dz < L2D1D; ++dz)
1791 real_t aXY[DofQuadLimits::HDIV_MAX_Q1D][DofQuadLimits::HDIV_MAX_Q1D];
1792 for (
int qy = 0; qy < Q1D; ++qy)
1794 for (
int qx = 0; qx < Q1D; ++qx)
1800 for (
int dy = 0; dy < L2D1D; ++dy)
1802 real_t aX[DofQuadLimits::HDIV_MAX_Q1D];
1803 for (
int qx = 0; qx < Q1D; ++qx)
1808 for (
int dx = 0; dx < L2D1D; ++dx)
1810 const real_t t = x(dx,dy,dz,e);
1811 for (
int qx = 0; qx < Q1D; ++qx)
1813 aX[qx] += t * L2Bo(qx,dx);
1817 for (
int qy = 0; qy < Q1D; ++qy)
1819 const real_t wy = L2Bo(qy,dy);
1820 for (
int qx = 0; qx < Q1D; ++qx)
1822 aXY[qy][qx] += aX[qx] * wy;
1827 for (
int qz = 0; qz < Q1D; ++qz)
1829 const real_t wz = L2Bo(qz,dz);
1830 for (
int qy = 0; qy < Q1D; ++qy)
1832 for (
int qx = 0; qx < Q1D; ++qx)
1834 div[qz][qy][qx] += aXY[qy][qx] * wz;
1841 for (
int qz = 0; qz < Q1D; ++qz)
1843 for (
int qy = 0; qy < Q1D; ++qy)
1845 for (
int qx = 0; qx < Q1D; ++qx)
1847 div[qz][qy][qx] *= op(qx,qy,qz,e);
1852 for (
int qz = 0; qz < Q1D; ++qz)
1854 real_t aXY[DofQuadLimits::HDIV_MAX_D1D][DofQuadLimits::HDIV_MAX_D1D];
1857 for (
int c = 0; c < VDIM; ++c)
1859 const int D1Dz = (c == 2) ? D1D : D1D - 1;
1860 const int D1Dy = (c == 1) ? D1D : D1D - 1;
1861 const int D1Dx = (c == 0) ? D1D : D1D - 1;
1863 for (
int dy = 0; dy < D1Dy; ++dy)
1865 for (
int dx = 0; dx < D1Dx; ++dx)
1870 for (
int qy = 0; qy < Q1D; ++qy)
1872 real_t aX[DofQuadLimits::HDIV_MAX_D1D];
1873 for (
int dx = 0; dx < D1Dx; ++dx)
1877 for (
int qx = 0; qx < Q1D; ++qx)
1879 for (
int dx = 0; dx < D1Dx; ++dx)
1881 aX[dx] += div[qz][qy][qx] * ((c == 0) ? Gct(dx,qx) :
1885 for (
int dy = 0; dy < D1Dy; ++dy)
1887 const real_t wy = (c == 1) ? Gct(dy,qy) : Bot(dy,qy);
1888 for (
int dx = 0; dx < D1Dx; ++dx)
1890 aXY[dy][dx] += aX[dx] * wy;
1895 for (
int dz = 0; dz < D1Dz; ++dz)
1897 const real_t wz = (c == 2) ? Gct(dz,qz) : Bot(dz,qz);
1898 for (
int dy = 0; dy < D1Dy; ++dy)
1900 for (
int dx = 0; dx < D1Dx; ++dx)
1902 y(dx + ((dy + (dz * D1Dy)) * D1Dx) + osc, e) +=
1908 osc += D1Dx * D1Dy * D1Dz;
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.