103 const output_t &output,
107 [[maybe_unused]]
auto B = dtq.
B;
108 [[maybe_unused]]
auto G = dtq.
G;
112 const auto [q1d, unused, d1d] = B.
GetShape();
113 const int vdim = output.vdim;
114 const int test_dim = output.size_on_qp / vdim;
116 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d);
117 auto yd =
Reshape(&y(0, 0), d1d, vdim);
119 for (
int vd = 0; vd < vdim; vd++)
121 MFEM_FOREACH_THREAD(dx, x, d1d)
124 for (
int qx = 0; qx < q1d; qx++)
126 acc += fqp(vd, 0, qx) * B(qx, 0, dx);
135 const auto [q1d, unused, d1d] = G.GetShape();
136 const int vdim = output.vdim;
137 const int test_dim = output.size_on_qp / vdim;
138 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d);
139 auto yd =
Reshape(&y(0, 0), d1d, vdim);
141 for (
int vd = 0; vd < vdim; vd++)
143 MFEM_FOREACH_THREAD(dx, x, d1d)
146 for (
int qx = 0; qx < q1d; qx++)
148 acc += fqp(vd, 0, qx) * G(qx, 0, dx);
157 const auto [q1d, unused, d1d] = B.GetShape();
158 auto fqp =
Reshape(&
f(0, 0, 0), output.size_on_qp, q1d);
159 auto yqp =
Reshape(&y(0, 0), output.size_on_qp, q1d);
161 for (
int sq = 0;
sq < output.size_on_qp;
sq++)
163 MFEM_FOREACH_THREAD(qx, x, q1d)
165 yqp(
sq, qx) = fqp(
sq, qx);
172 MFEM_ABORT_KERNEL(
"quadrature data mapping to field is not implemented"
173 "for this field descriptor with sum factorization on"
174 " tensor product elements");
183 const output_t &output,
187 [[maybe_unused]]
auto B = dtq.
B;
188 [[maybe_unused]]
auto G = dtq.
G;
192 const auto [q1d, unused, d1d] = B.
GetShape();
193 const int vdim = output.vdim;
194 const int test_dim = output.size_on_qp / vdim;
196 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d);
197 auto yd =
Reshape(&y(0, 0), d1d, d1d, vdim);
199 auto s0 =
Reshape(&scratch_mem[0](0), q1d, d1d);
201 for (
int vd = 0; vd < vdim; vd++)
203 MFEM_FOREACH_THREAD(qy, y, q1d)
205 MFEM_FOREACH_THREAD(dx, x, d1d)
208 for (
int qx = 0; qx < q1d; qx++)
210 acc += fqp(vd, 0, qx, qy) * B(qx, 0, dx);
217 MFEM_FOREACH_THREAD(dy, y, d1d)
219 MFEM_FOREACH_THREAD(dx, x, d1d)
222 for (
int qy = 0; qy < q1d; qy++)
224 acc += s0(qy, dx) * B(qy, 0, dy);
226 yd(dx, dy, vd) += acc;
234 const auto [q1d, unused, d1d] = G.GetShape();
235 const int vdim = output.vdim;
236 const int test_dim = output.size_on_qp / vdim;
237 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d);
238 auto yd =
Reshape(&y(0, 0), d1d, d1d, vdim);
240 auto s0 =
Reshape(&scratch_mem[0](0), q1d, d1d);
241 auto s1 =
Reshape(&scratch_mem[1](0), q1d, d1d);
243 for (
int vd = 0; vd < vdim; vd++)
245 MFEM_FOREACH_THREAD(qy, y, q1d)
247 MFEM_FOREACH_THREAD(dx, x, d1d)
249 real_t uv[2] = {0.0, 0.0};
250 for (
int qx = 0; qx < q1d; qx++)
252 uv[0] += fqp(vd, 0, qx, qy) * G(qx, 0, dx);
253 uv[1] += fqp(vd, 1, qx, qy) * B(qx, 0, dx);
261 MFEM_FOREACH_THREAD(dy, y, d1d)
263 MFEM_FOREACH_THREAD(dx, x, d1d)
265 real_t uv[2] = {0.0, 0.0};
266 for (
int qy = 0; qy < q1d; qy++)
268 uv[0] += s0(qy, dx) * B(qy, 0, dy);
269 uv[1] += s1(qy, dx) * G(qy, 0, dy);
271 yd(dx, dy, vd) += uv[0] + uv[1];
279 const auto [q1d, unused, d1d] = B.GetShape();
293 auto fqp =
Reshape(&
f(0, 0, 0), output.size_on_qp, q1d, q1d);
294 auto yqp =
Reshape(&y(0, 0), output.size_on_qp, q1d, q1d);
296 for (
int sq = 0;
sq < output.size_on_qp;
sq++)
298 MFEM_FOREACH_THREAD(qx, x, q1d)
300 MFEM_FOREACH_THREAD(qy, y, q1d)
302 yqp(
sq, qx, qy) = fqp(
sq, qx, qy);
310 MFEM_ABORT_KERNEL(
"quadrature data mapping to field is not implemented"
311 " for this field descriptor with sum factorization on"
312 " tensor product elements");
321 const output_t &output,
325 [[maybe_unused]]
auto B = dtq.
B;
326 [[maybe_unused]]
auto G = dtq.
G;
330 const auto [q1d, unused, d1d] = B.
GetShape();
331 const int vdim = output.vdim;
332 const int test_dim = output.size_on_qp / vdim;
334 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d, q1d);
335 auto yd =
Reshape(&y(0, 0), d1d, d1d, d1d, vdim);
337 auto s0 =
Reshape(&scratch_mem[0](0), q1d, q1d, d1d);
338 auto s1 =
Reshape(&scratch_mem[1](0), q1d, d1d, d1d);
340 for (
int vd = 0; vd < vdim; vd++)
342 MFEM_FOREACH_THREAD(qy, y, q1d)
344 MFEM_FOREACH_THREAD(dx, x, d1d)
346 MFEM_FOREACH_THREAD(qz, z, q1d)
349 for (
int qx = 0; qx < q1d; qx++)
351 acc += fqp(vd, 0, qx, qy, qz) * B(qx, 0, dx);
353 s0(qz, qy, dx) = acc;
359 MFEM_FOREACH_THREAD(dy, y, d1d)
361 MFEM_FOREACH_THREAD(dx, x, d1d)
363 MFEM_FOREACH_THREAD(qz, z, q1d)
366 for (
int qy = 0; qy < q1d; qy++)
368 acc += s0(qz, qy, dx) * B(qy, 0, dy);
370 s1(qz, dy, dx) = acc;
377 MFEM_FOREACH_THREAD(dy, y, d1d)
379 MFEM_FOREACH_THREAD(dx, x, d1d)
381 MFEM_FOREACH_THREAD(dz, z, d1d)
384 for (
int qz = 0; qz < q1d; qz++)
386 acc += s1(qz, dy, dx) * B(qz, 0, dz);
388 yd(dx, dy, dz, vd) += acc;
397 const auto [q1d, unused, d1d] = G.GetShape();
398 const int vdim = output.vdim;
399 const int test_dim = output.size_on_qp / vdim;
400 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d, q1d);
401 auto yd =
Reshape(&y(0, 0), d1d, d1d, d1d, vdim);
403 auto s0 =
Reshape(&scratch_mem[0](0), q1d, q1d, d1d);
404 auto s1 =
Reshape(&scratch_mem[1](0), q1d, q1d, d1d);
405 auto s2 =
Reshape(&scratch_mem[2](0), q1d, q1d, d1d);
406 auto s3 =
Reshape(&scratch_mem[3](0), q1d, d1d, d1d);
407 auto s4 =
Reshape(&scratch_mem[4](0), q1d, d1d, d1d);
408 auto s5 =
Reshape(&scratch_mem[5](0), q1d, d1d, d1d);
410 for (
int vd = 0; vd < vdim; vd++)
412 MFEM_FOREACH_THREAD(qz, z, q1d)
414 MFEM_FOREACH_THREAD(qy, y, q1d)
416 MFEM_FOREACH_THREAD(dx, x, d1d)
418 real_t uvw[3] = {0.0, 0.0, 0.0};
419 for (
int qx = 0; qx < q1d; qx++)
421 uvw[0] += fqp(vd, 0, qx, qy, qz) * G(qx, 0, dx);
422 uvw[1] += fqp(vd, 1, qx, qy, qz) * B(qx, 0, dx);
423 uvw[2] += fqp(vd, 2, qx, qy, qz) * B(qx, 0, dx);
425 s0(qz, qy, dx) = uvw[0];
426 s1(qz, qy, dx) = uvw[1];
427 s2(qz, qy, dx) = uvw[2];
433 MFEM_FOREACH_THREAD(qz, z, q1d)
435 MFEM_FOREACH_THREAD(dy, y, d1d)
437 MFEM_FOREACH_THREAD(dx, x, d1d)
439 real_t uvw[3] = {0.0, 0.0, 0.0};
440 for (
int qy = 0; qy < q1d; qy++)
442 uvw[0] += s0(qz, qy, dx) * B(qy, 0, dy);
443 uvw[1] += s1(qz, qy, dx) * G(qy, 0, dy);
444 uvw[2] += s2(qz, qy, dx) * B(qy, 0, dy);
446 s3(qz, dy, dx) = uvw[0];
447 s4(qz, dy, dx) = uvw[1];
448 s5(qz, dy, dx) = uvw[2];
454 MFEM_FOREACH_THREAD(dz, z, d1d)
456 MFEM_FOREACH_THREAD(dy, y, d1d)
458 MFEM_FOREACH_THREAD(dx, x, d1d)
460 real_t uvw[3] = {0.0, 0.0, 0.0};
461 for (
int qz = 0; qz < q1d; qz++)
463 uvw[0] += s3(qz, dy, dx) * B(qz, 0, dz);
464 uvw[1] += s4(qz, dy, dx) * B(qz, 0, dz);
465 uvw[2] += s5(qz, dy, dx) * G(qz, 0, dz);
467 yd(dx, dy, dz, vd) += uvw[0] + uvw[1] + uvw[2];
476 const auto [q1d, unused, d1d] = B.GetShape();
477 auto fqp =
Reshape(&
f(0, 0, 0), output.size_on_qp, q1d, q1d, q1d);
478 auto yqp =
Reshape(&y(0, 0), output.size_on_qp, q1d, q1d, q1d);
480 for (
int sq = 0;
sq < output.size_on_qp;
sq++)
482 MFEM_FOREACH_THREAD(qx, x, q1d)
484 MFEM_FOREACH_THREAD(qy, y, q1d)
486 MFEM_FOREACH_THREAD(qz, z, q1d)
488 yqp(
sq, qx, qy, qz) = fqp(
sq, qx, qy, qz);
497 MFEM_ABORT_KERNEL(
"quadrature data mapping to field is not implemented"
498 " for this field descriptor with sum factorization on"
499 " tensor product elements");