12#ifndef BILININTEG_DGTRACE_KERNELS_HPP
13#define BILININTEG_DGTRACE_KERNELS_HPP
29template <
int T_D1D = 0,
int T_Q1D = 0>
30void PADGTraceApply2D(
const int NF,
const Array<real_t> &
b,
31 const Array<real_t> &bt,
const Vector &op_,
32 const Vector &x_, Vector &y_,
const int d1d = 0,
36 const int D1D = T_D1D ? T_D1D : d1d;
37 const int Q1D = T_Q1D ? T_Q1D : q1d;
40 auto B =
Reshape(
b.Read(), Q1D, D1D);
41 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
42 auto op =
Reshape(op_.Read(), Q1D, 2, 2, NF);
43 auto x =
Reshape(x_.Read(), D1D, VDIM, 2, NF);
44 auto y =
Reshape(y_.ReadWrite(), D1D, VDIM, 2, NF);
49 const int D1D = T_D1D ? T_D1D : d1d;
50 const int Q1D = T_Q1D ? T_Q1D : q1d;
52 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
53 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
56 for (
int d = 0; d < D1D; d++)
58 for (
int c = 0; c < VDIM; c++)
60 u0[d][c] = x(d, c, 0,
f);
61 u1[d][c] = x(d, c, 1,
f);
66 for (
int q = 0; q < Q1D; ++q)
68 for (
int c = 0; c < VDIM; c++)
73 for (
int d = 0; d < D1D; ++d)
76 for (
int c = 0; c < VDIM; c++)
78 Bu0[q][c] +=
b * u0[d][c];
79 Bu1[q][c] +=
b * u1[d][c];
84 for (
int q = 0; q < Q1D; ++q)
86 for (
int c = 0; c < VDIM; c++)
88 DBu[q][c] = op(q, 0, 0,
f) * Bu0[q][c] + op(q, 1, 0,
f) * Bu1[q][c];
91 real_t BDBu[max_D1D][VDIM];
92 for (
int d = 0; d < D1D; ++d)
94 for (
int c = 0; c < VDIM; c++)
98 for (
int q = 0; q < Q1D; ++q)
101 for (
int c = 0; c < VDIM; c++)
103 BDBu[d][c] +=
b * DBu[q][c];
106 for (
int c = 0; c < VDIM; c++)
108 y(d, c, 0,
f) += BDBu[d][c];
109 y(d, c, 1,
f) += -BDBu[d][c];
116template <
int T_D1D = 0,
int T_Q1D = 0>
117void PADGTraceApply3D(
const int NF,
const Array<real_t> &
b,
118 const Array<real_t> &bt,
const Vector &op_,
119 const Vector &x_, Vector &y_,
const int d1d = 0,
123 const int D1D = T_D1D ? T_D1D : d1d;
124 const int Q1D = T_Q1D ? T_Q1D : q1d;
127 auto B =
Reshape(
b.Read(), Q1D, D1D);
128 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
129 auto op =
Reshape(op_.Read(), Q1D, Q1D, 2, 2, NF);
130 auto x =
Reshape(x_.Read(), D1D, D1D, VDIM, 2, NF);
131 auto y =
Reshape(y_.ReadWrite(), D1D, D1D, VDIM, 2, NF);
136 const int D1D = T_D1D ? T_D1D : d1d;
137 const int Q1D = T_Q1D ? T_Q1D : q1d;
139 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
140 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
141 real_t u0[max_D1D][max_D1D][VDIM];
142 real_t u1[max_D1D][max_D1D][VDIM];
143 for (
int d1 = 0; d1 < D1D; d1++)
145 for (
int d2 = 0; d2 < D1D; d2++)
147 for (
int c = 0; c < VDIM; c++)
149 u0[d1][d2][c] = x(d1, d2, c, 0,
f);
150 u1[d1][d2][c] = x(d1, d2, c, 1,
f);
154 real_t Bu0[max_Q1D][max_D1D][VDIM];
155 real_t Bu1[max_Q1D][max_D1D][VDIM];
156 for (
int q = 0; q < Q1D; ++q)
158 for (
int d2 = 0; d2 < D1D; d2++)
160 for (
int c = 0; c < VDIM; c++)
165 for (
int d1 = 0; d1 < D1D; ++d1)
168 for (
int c = 0; c < VDIM; c++)
170 Bu0[q][d2][c] +=
b * u0[d1][d2][c];
171 Bu1[q][d2][c] +=
b * u1[d1][d2][c];
176 real_t BBu0[max_Q1D][max_Q1D][VDIM];
177 real_t BBu1[max_Q1D][max_Q1D][VDIM];
178 for (
int q1 = 0; q1 < Q1D; ++q1)
180 for (
int q2 = 0; q2 < Q1D; q2++)
182 for (
int c = 0; c < VDIM; c++)
184 BBu0[q1][q2][c] = 0.0;
185 BBu1[q1][q2][c] = 0.0;
187 for (
int d2 = 0; d2 < D1D; ++d2)
190 for (
int c = 0; c < VDIM; c++)
192 BBu0[q1][q2][c] +=
b * Bu0[q1][d2][c];
193 BBu1[q1][q2][c] +=
b * Bu1[q1][d2][c];
198 real_t DBBu[max_Q1D][max_Q1D][VDIM];
199 for (
int q1 = 0; q1 < Q1D; ++q1)
201 for (
int q2 = 0; q2 < Q1D; q2++)
203 for (
int c = 0; c < VDIM; c++)
205 DBBu[q1][q2][c] = op(q1, q2, 0, 0,
f) * BBu0[q1][q2][c] +
206 op(q1, q2, 1, 0,
f) * BBu1[q1][q2][c];
210 real_t BDBBu[max_Q1D][max_D1D][VDIM];
211 for (
int q1 = 0; q1 < Q1D; ++q1)
213 for (
int d2 = 0; d2 < D1D; d2++)
215 for (
int c = 0; c < VDIM; c++)
217 BDBBu[q1][d2][c] = 0.0;
219 for (
int q2 = 0; q2 < Q1D; ++q2)
222 for (
int c = 0; c < VDIM; c++)
224 BDBBu[q1][d2][c] +=
b * DBBu[q1][q2][c];
229 real_t BBDBBu[max_D1D][max_D1D][VDIM];
230 for (
int d1 = 0; d1 < D1D; ++d1)
232 for (
int d2 = 0; d2 < D1D; d2++)
234 for (
int c = 0; c < VDIM; c++)
236 BBDBBu[d1][d2][c] = 0.0;
238 for (
int q1 = 0; q1 < Q1D; ++q1)
241 for (
int c = 0; c < VDIM; c++)
243 BBDBBu[d1][d2][c] +=
b * BDBBu[q1][d2][c];
246 for (
int c = 0; c < VDIM; c++)
248 y(d1, d2, c, 0,
f) += BBDBBu[d1][d2][c];
249 y(d1, d2, c, 1,
f) += -BBDBBu[d1][d2][c];
257template <
int T_D1D = 0,
int T_Q1D = 0,
int T_NBZ = 0>
258void SmemPADGTraceApply3D(
const int NF,
const Array<real_t> &
b,
259 const Array<real_t> &bt,
const Vector &op_,
260 const Vector &x_, Vector &y_,
const int d1d = 0,
263 const int D1D = T_D1D ? T_D1D : d1d;
264 const int Q1D = T_Q1D ? T_Q1D : q1d;
265 constexpr int NBZ = T_NBZ ? T_NBZ : 1;
268 auto B =
Reshape(
b.Read(), Q1D, D1D);
269 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
270 auto op =
Reshape(op_.Read(), Q1D, Q1D, 2, 2, NF);
271 auto x =
Reshape(x_.Read(), D1D, D1D, 2, NF);
272 auto y =
Reshape(y_.ReadWrite(), D1D, D1D, 2, NF);
276 const int tidz = MFEM_THREAD_ID(z);
277 const int D1D = T_D1D ? T_D1D : d1d;
278 const int Q1D = T_Q1D ? T_Q1D : q1d;
280 constexpr int NBZ = T_NBZ ? T_NBZ : 1;
281 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
282 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
283 MFEM_SHARED
real_t u0[NBZ][max_D1D][max_D1D];
284 MFEM_SHARED
real_t u1[NBZ][max_D1D][max_D1D];
285 MFEM_FOREACH_THREAD(d1, x, D1D)
287 MFEM_FOREACH_THREAD(d2, y, D1D)
289 u0[tidz][d1][d2] = x(d1, d2, 0,
f);
290 u1[tidz][d1][d2] = x(d1, d2, 1,
f);
294 MFEM_SHARED
real_t Bu0[NBZ][max_Q1D][max_D1D];
295 MFEM_SHARED
real_t Bu1[NBZ][max_Q1D][max_D1D];
296 MFEM_FOREACH_THREAD(q1, x, Q1D)
298 MFEM_FOREACH_THREAD(d2, y, D1D)
302 for (
int d1 = 0; d1 < D1D; ++d1)
305 Bu0_ +=
b * u0[tidz][d1][d2];
306 Bu1_ +=
b * u1[tidz][d1][d2];
308 Bu0[tidz][q1][d2] = Bu0_;
309 Bu1[tidz][q1][d2] = Bu1_;
313 MFEM_SHARED
real_t BBu0[NBZ][max_Q1D][max_Q1D];
314 MFEM_SHARED
real_t BBu1[NBZ][max_Q1D][max_Q1D];
315 MFEM_FOREACH_THREAD(q1, x, Q1D)
317 MFEM_FOREACH_THREAD(q2, y, Q1D)
321 for (
int d2 = 0; d2 < D1D; ++d2)
324 BBu0_ +=
b * Bu0[tidz][q1][d2];
325 BBu1_ +=
b * Bu1[tidz][q1][d2];
327 BBu0[tidz][q1][q2] = BBu0_;
328 BBu1[tidz][q1][q2] = BBu1_;
332 MFEM_SHARED
real_t DBBu[NBZ][max_Q1D][max_Q1D];
333 MFEM_FOREACH_THREAD(q1, x, Q1D)
335 MFEM_FOREACH_THREAD(q2, y, Q1D)
337 DBBu[tidz][q1][q2] = op(q1, q2, 0, 0,
f) * BBu0[tidz][q1][q2] +
338 op(q1, q2, 1, 0,
f) * BBu1[tidz][q1][q2];
342 MFEM_SHARED
real_t BDBBu[NBZ][max_Q1D][max_D1D];
343 MFEM_FOREACH_THREAD(q1, x, Q1D)
345 MFEM_FOREACH_THREAD(d2, y, D1D)
348 for (
int q2 = 0; q2 < Q1D; ++q2)
351 BDBBu_ +=
b * DBBu[tidz][q1][q2];
353 BDBBu[tidz][q1][d2] = BDBBu_;
357 MFEM_FOREACH_THREAD(d1, x, D1D)
359 MFEM_FOREACH_THREAD(d2, y, D1D)
362 for (
int q1 = 0; q1 < Q1D; ++q1)
365 BBDBBu_ +=
b * BDBBu[tidz][q1][d2];
367 y(d1, d2, 0,
f) += BBDBBu_;
368 y(d1, d2, 1,
f) += -BBDBBu_;
375template <
int T_D1D = 0,
int T_Q1D = 0>
376void PADGTraceApplyTranspose2D(
const int NF,
const Array<real_t> &
b,
377 const Array<real_t> &bt,
const Vector &op_,
378 const Vector &x_, Vector &y_,
const int d1d = 0,
382 const int D1D = T_D1D ? T_D1D : d1d;
383 const int Q1D = T_Q1D ? T_Q1D : q1d;
386 auto B =
Reshape(
b.Read(), Q1D, D1D);
387 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
388 auto op =
Reshape(op_.Read(), Q1D, 2, 2, NF);
389 auto x =
Reshape(x_.Read(), D1D, VDIM, 2, NF);
390 auto y =
Reshape(y_.ReadWrite(), D1D, VDIM, 2, NF);
395 const int D1D = T_D1D ? T_D1D : d1d;
396 const int Q1D = T_Q1D ? T_Q1D : q1d;
398 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
399 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
402 for (
int d = 0; d < D1D; d++)
404 for (
int c = 0; c < VDIM; c++)
406 u0[d][c] = x(d, c, 0,
f);
407 u1[d][c] = x(d, c, 1,
f);
410 real_t Bu0[max_Q1D][VDIM];
411 real_t Bu1[max_Q1D][VDIM];
412 for (
int q = 0; q < Q1D; ++q)
414 for (
int c = 0; c < VDIM; c++)
419 for (
int d = 0; d < D1D; ++d)
422 for (
int c = 0; c < VDIM; c++)
424 Bu0[q][c] +=
b * u0[d][c];
425 Bu1[q][c] +=
b * u1[d][c];
429 real_t DBu0[max_Q1D][VDIM];
430 real_t DBu1[max_Q1D][VDIM];
431 for (
int q = 0; q < Q1D; ++q)
433 for (
int c = 0; c < VDIM; c++)
436 op(q, 0, 0,
f) * Bu0[q][c] + op(q, 0, 1,
f) * Bu1[q][c];
438 op(q, 1, 0,
f) * Bu0[q][c] + op(q, 1, 1,
f) * Bu1[q][c];
441 real_t BDBu0[max_D1D][VDIM];
442 real_t BDBu1[max_D1D][VDIM];
443 for (
int d = 0; d < D1D; ++d)
445 for (
int c = 0; c < VDIM; c++)
450 for (
int q = 0; q < Q1D; ++q)
453 for (
int c = 0; c < VDIM; c++)
455 BDBu0[d][c] +=
b * DBu0[q][c];
456 BDBu1[d][c] +=
b * DBu1[q][c];
459 for (
int c = 0; c < VDIM; c++)
461 y(d, c, 0,
f) += BDBu0[d][c];
462 y(d, c, 1,
f) += BDBu1[d][c];
469template <
int T_D1D = 0,
int T_Q1D = 0>
470void PADGTraceApplyTranspose3D(
const int NF,
const Array<real_t> &
b,
471 const Array<real_t> &bt,
const Vector &op_,
472 const Vector &x_, Vector &y_,
const int d1d = 0,
476 const int D1D = T_D1D ? T_D1D : d1d;
477 const int Q1D = T_Q1D ? T_Q1D : q1d;
480 auto B =
Reshape(
b.Read(), Q1D, D1D);
481 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
482 auto op =
Reshape(op_.Read(), Q1D, Q1D, 2, 2, NF);
483 auto x =
Reshape(x_.Read(), D1D, D1D, VDIM, 2, NF);
484 auto y =
Reshape(y_.ReadWrite(), D1D, D1D, VDIM, 2, NF);
489 const int D1D = T_D1D ? T_D1D : d1d;
490 const int Q1D = T_Q1D ? T_Q1D : q1d;
492 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
493 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
494 real_t u0[max_D1D][max_D1D][VDIM];
495 real_t u1[max_D1D][max_D1D][VDIM];
496 for (
int d1 = 0; d1 < D1D; d1++)
498 for (
int d2 = 0; d2 < D1D; d2++)
500 for (
int c = 0; c < VDIM; c++)
502 u0[d1][d2][c] = x(d1, d2, c, 0,
f);
503 u1[d1][d2][c] = x(d1, d2, c, 1,
f);
507 real_t Bu0[max_Q1D][max_D1D][VDIM];
508 real_t Bu1[max_Q1D][max_D1D][VDIM];
509 for (
int q1 = 0; q1 < Q1D; ++q1)
511 for (
int d2 = 0; d2 < D1D; ++d2)
513 for (
int c = 0; c < VDIM; c++)
515 Bu0[q1][d2][c] = 0.0;
516 Bu1[q1][d2][c] = 0.0;
518 for (
int d1 = 0; d1 < D1D; ++d1)
521 for (
int c = 0; c < VDIM; c++)
523 Bu0[q1][d2][c] +=
b * u0[d1][d2][c];
524 Bu1[q1][d2][c] +=
b * u1[d1][d2][c];
529 real_t BBu0[max_Q1D][max_Q1D][VDIM];
530 real_t BBu1[max_Q1D][max_Q1D][VDIM];
531 for (
int q1 = 0; q1 < Q1D; ++q1)
533 for (
int q2 = 0; q2 < Q1D; ++q2)
535 for (
int c = 0; c < VDIM; c++)
537 BBu0[q1][q2][c] = 0.0;
538 BBu1[q1][q2][c] = 0.0;
540 for (
int d2 = 0; d2 < D1D; ++d2)
543 for (
int c = 0; c < VDIM; c++)
545 BBu0[q1][q2][c] +=
b * Bu0[q1][d2][c];
546 BBu1[q1][q2][c] +=
b * Bu1[q1][d2][c];
551 real_t DBu0[max_Q1D][max_Q1D][VDIM];
552 real_t DBu1[max_Q1D][max_Q1D][VDIM];
553 for (
int q1 = 0; q1 < Q1D; ++q1)
555 for (
int q2 = 0; q2 < Q1D; ++q2)
557 const real_t D00 = op(q1, q2, 0, 0,
f);
558 const real_t D01 = op(q1, q2, 0, 1,
f);
559 const real_t D10 = op(q1, q2, 1, 0,
f);
560 const real_t D11 = op(q1, q2, 1, 1,
f);
561 for (
int c = 0; c < VDIM; c++)
563 DBu0[q1][q2][c] = D00 * BBu0[q1][q2][c] + D01 * BBu1[q1][q2][c];
564 DBu1[q1][q2][c] = D10 * BBu0[q1][q2][c] + D11 * BBu1[q1][q2][c];
568 real_t BDBu0[max_D1D][max_Q1D][VDIM];
569 real_t BDBu1[max_D1D][max_Q1D][VDIM];
570 for (
int d1 = 0; d1 < D1D; ++d1)
572 for (
int q2 = 0; q2 < Q1D; ++q2)
574 for (
int c = 0; c < VDIM; c++)
576 BDBu0[d1][q2][c] = 0.0;
577 BDBu1[d1][q2][c] = 0.0;
579 for (
int q1 = 0; q1 < Q1D; ++q1)
582 for (
int c = 0; c < VDIM; c++)
584 BDBu0[d1][q2][c] +=
b * DBu0[q1][q2][c];
585 BDBu1[d1][q2][c] +=
b * DBu1[q1][q2][c];
590 real_t BBDBu0[max_D1D][max_D1D][VDIM];
591 real_t BBDBu1[max_D1D][max_D1D][VDIM];
592 for (
int d1 = 0; d1 < D1D; ++d1)
594 for (
int d2 = 0; d2 < D1D; ++d2)
596 for (
int c = 0; c < VDIM; c++)
598 BBDBu0[d1][d2][c] = 0.0;
599 BBDBu1[d1][d2][c] = 0.0;
601 for (
int q2 = 0; q2 < Q1D; ++q2)
604 for (
int c = 0; c < VDIM; c++)
606 BBDBu0[d1][d2][c] +=
b * BDBu0[d1][q2][c];
607 BBDBu1[d1][d2][c] +=
b * BDBu1[d1][q2][c];
610 for (
int c = 0; c < VDIM; c++)
612 y(d1, d2, c, 0,
f) += BBDBu0[d1][d2][c];
613 y(d1, d2, c, 1,
f) += BBDBu1[d1][d2][c];
621template <
int T_D1D = 0,
int T_Q1D = 0,
int T_NBZ = 0>
622void SmemPADGTraceApplyTranspose3D(
const int NF,
const Array<real_t> &
b,
623 const Array<real_t> &bt,
const Vector &op_,
624 const Vector &x_, Vector &y_,
625 const int d1d = 0,
const int q1d = 0)
627 const int D1D = T_D1D ? T_D1D : d1d;
628 const int Q1D = T_Q1D ? T_Q1D : q1d;
629 constexpr int NBZ = T_NBZ ? T_NBZ : 1;
632 auto B =
Reshape(
b.Read(), Q1D, D1D);
633 auto Bt =
Reshape(bt.Read(), D1D, Q1D);
634 auto op =
Reshape(op_.Read(), Q1D, Q1D, 2, 2, NF);
635 auto x =
Reshape(x_.Read(), D1D, D1D, 2, NF);
636 auto y =
Reshape(y_.ReadWrite(), D1D, D1D, 2, NF);
640 const int tidz = MFEM_THREAD_ID(z);
641 const int D1D = T_D1D ? T_D1D : d1d;
642 const int Q1D = T_Q1D ? T_Q1D : q1d;
644 constexpr int NBZ = T_NBZ ? T_NBZ : 1;
645 constexpr int max_D1D = T_D1D ? T_D1D : DofQuadLimits::MAX_D1D;
646 constexpr int max_Q1D = T_Q1D ? T_Q1D : DofQuadLimits::MAX_Q1D;
647 MFEM_SHARED
real_t u0[NBZ][max_D1D][max_D1D];
648 MFEM_SHARED
real_t u1[NBZ][max_D1D][max_D1D];
649 MFEM_FOREACH_THREAD(d1, x, D1D)
651 MFEM_FOREACH_THREAD(d2, y, D1D)
653 u0[tidz][d1][d2] = x(d1, d2, 0,
f);
654 u1[tidz][d1][d2] = x(d1, d2, 1,
f);
658 MFEM_SHARED
real_t Bu0[NBZ][max_Q1D][max_D1D];
659 MFEM_SHARED
real_t Bu1[NBZ][max_Q1D][max_D1D];
660 MFEM_FOREACH_THREAD(q1, x, Q1D)
662 MFEM_FOREACH_THREAD(d2, y, D1D)
666 for (
int d1 = 0; d1 < D1D; ++d1)
669 Bu0_ +=
b * u0[tidz][d1][d2];
670 Bu1_ +=
b * u1[tidz][d1][d2];
672 Bu0[tidz][q1][d2] = Bu0_;
673 Bu1[tidz][q1][d2] = Bu1_;
677 MFEM_SHARED
real_t BBu0[NBZ][max_Q1D][max_Q1D];
678 MFEM_SHARED
real_t BBu1[NBZ][max_Q1D][max_Q1D];
679 MFEM_FOREACH_THREAD(q1, x, Q1D)
681 MFEM_FOREACH_THREAD(q2, y, Q1D)
685 for (
int d2 = 0; d2 < D1D; ++d2)
688 BBu0_ +=
b * Bu0[tidz][q1][d2];
689 BBu1_ +=
b * Bu1[tidz][q1][d2];
691 BBu0[tidz][q1][q2] = BBu0_;
692 BBu1[tidz][q1][q2] = BBu1_;
696 MFEM_SHARED
real_t DBBu0[NBZ][max_Q1D][max_Q1D];
697 MFEM_SHARED
real_t DBBu1[NBZ][max_Q1D][max_Q1D];
698 MFEM_FOREACH_THREAD(q1, x, Q1D)
700 MFEM_FOREACH_THREAD(q2, y, Q1D)
702 const real_t D00 = op(q1, q2, 0, 0,
f);
703 const real_t D01 = op(q1, q2, 0, 1,
f);
704 const real_t D10 = op(q1, q2, 1, 0,
f);
705 const real_t D11 = op(q1, q2, 1, 1,
f);
706 const real_t u0q = BBu0[tidz][q1][q2];
707 const real_t u1q = BBu1[tidz][q1][q2];
708 DBBu0[tidz][q1][q2] = D00 * u0q + D01 * u1q;
709 DBBu1[tidz][q1][q2] = D10 * u0q + D11 * u1q;
713 MFEM_SHARED
real_t BDBBu0[NBZ][max_Q1D][max_D1D];
714 MFEM_SHARED
real_t BDBBu1[NBZ][max_Q1D][max_D1D];
715 MFEM_FOREACH_THREAD(q1, x, Q1D)
717 MFEM_FOREACH_THREAD(d2, y, D1D)
721 for (
int q2 = 0; q2 < Q1D; ++q2)
724 BDBBu0_ +=
b * DBBu0[tidz][q1][q2];
725 BDBBu1_ +=
b * DBBu1[tidz][q1][q2];
727 BDBBu0[tidz][q1][d2] = BDBBu0_;
728 BDBBu1[tidz][q1][d2] = BDBBu1_;
732 MFEM_FOREACH_THREAD(d1, x, D1D)
734 MFEM_FOREACH_THREAD(d2, y, D1D)
738 for (
int q1 = 0; q1 < Q1D; ++q1)
741 BBDBBu0_ +=
b * BDBBu0[tidz][q1][d2];
742 BBDBBu1_ +=
b * BDBBu1[tidz][q1][d2];
744 y(d1, d2, 0,
f) += BBDBBu0_;
745 y(d1, d2, 1,
f) += BBDBBu1_;
753template <
int DIM,
int D1D,
int Q1D>
756 if constexpr (
DIM == 2)
758 return internal::PADGTraceApply2D<D1D, Q1D>;
760 else if constexpr (
DIM == 3)
762 if constexpr (D1D == 3 || D1D == 4)
764 return internal::SmemPADGTraceApply3D<D1D, Q1D, 2>;
768 return internal::SmemPADGTraceApply3D<D1D, Q1D>;
774template <
int DIM,
int D1D,
int Q1D>
777 if constexpr (
DIM == 2)
779 return internal::PADGTraceApplyTranspose2D<D1D, Q1D>;
781 else if constexpr (
DIM == 3)
783 return internal::SmemPADGTraceApplyTranspose3D<D1D, Q1D>;
void(*)(const int, const Array< real_t > &, const Array< real_t > &, const Vector &, const Vector &, Vector &, const int, const int) ApplyKernelType
arguments: nf, B, Bt, pa_data, x, y, dofs1D, quad1D
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_2D_batch(int N, int X, int Y, int BZ, lambda &&body)
std::function< real_t(const Vector &)> f(real_t mass_coeff)
void forall(int N, lambda &&body)
static const DeviceDofQuadLimits & Get()
Return a const reference to the DeviceDofQuadLimits singleton.