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(
"quadrature data mapping to field is not implemented for"
173 " this field descriptor with sum factorization on tensor product elements");
182 const output_t &output,
186 [[maybe_unused]]
auto B = dtq.
B;
187 [[maybe_unused]]
auto G = dtq.
G;
191 const auto [q1d, unused, d1d] = B.
GetShape();
192 const int vdim = output.vdim;
193 const int test_dim = output.size_on_qp / vdim;
195 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d);
196 auto yd =
Reshape(&y(0, 0), d1d, d1d, vdim);
198 auto s0 =
Reshape(&scratch_mem[0](0), q1d, d1d);
200 for (
int vd = 0; vd < vdim; vd++)
202 MFEM_FOREACH_THREAD(qy, y, q1d)
204 MFEM_FOREACH_THREAD(dx, x, d1d)
207 for (
int qx = 0; qx < q1d; qx++)
209 acc += fqp(vd, 0, qx, qy) * B(qx, 0, dx);
216 MFEM_FOREACH_THREAD(dy, y, d1d)
218 MFEM_FOREACH_THREAD(dx, x, d1d)
221 for (
int qy = 0; qy < q1d; qy++)
223 acc += s0(qy, dx) * B(qy, 0, dy);
225 yd(dx, dy, vd) += acc;
233 const auto [q1d, unused, d1d] = G.GetShape();
234 const int vdim = output.vdim;
235 const int test_dim = output.size_on_qp / vdim;
236 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d);
237 auto yd =
Reshape(&y(0, 0), d1d, d1d, vdim);
239 auto s0 =
Reshape(&scratch_mem[0](0), q1d, d1d);
240 auto s1 =
Reshape(&scratch_mem[1](0), q1d, d1d);
242 for (
int vd = 0; vd < vdim; vd++)
244 MFEM_FOREACH_THREAD(qy, y, q1d)
246 MFEM_FOREACH_THREAD(dx, x, d1d)
248 real_t uv[2] = {0.0, 0.0};
249 for (
int qx = 0; qx < q1d; qx++)
251 uv[0] += fqp(vd, 0, qx, qy) * G(qx, 0, dx);
252 uv[1] += fqp(vd, 1, qx, qy) * B(qx, 0, dx);
260 MFEM_FOREACH_THREAD(dy, y, d1d)
262 MFEM_FOREACH_THREAD(dx, x, d1d)
264 real_t uv[2] = {0.0, 0.0};
265 for (
int qy = 0; qy < q1d; qy++)
267 uv[0] += s0(qy, dx) * B(qy, 0, dy);
268 uv[1] += s1(qy, dx) * G(qy, 0, dy);
270 yd(dx, dy, vd) += uv[0] + uv[1];
278 const auto [q1d, unused, d1d] = B.GetShape();
292 auto fqp =
Reshape(&
f(0, 0, 0), output.size_on_qp, q1d, q1d);
293 auto yqp =
Reshape(&y(0, 0), output.size_on_qp, q1d, q1d);
295 for (
int sq = 0;
sq < output.size_on_qp;
sq++)
297 MFEM_FOREACH_THREAD(qx, x, q1d)
299 MFEM_FOREACH_THREAD(qy, y, q1d)
301 yqp(
sq, qx, qy) = fqp(
sq, qx, qy);
309 MFEM_ABORT(
"quadrature data mapping to field is not implemented for"
310 " this field descriptor with sum factorization on tensor product elements");
319 const output_t &output,
323 [[maybe_unused]]
auto B = dtq.
B;
324 [[maybe_unused]]
auto G = dtq.
G;
328 const auto [q1d, unused, d1d] = B.
GetShape();
329 const int vdim = output.vdim;
330 const int test_dim = output.size_on_qp / vdim;
332 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d, q1d);
333 auto yd =
Reshape(&y(0, 0), d1d, d1d, d1d, vdim);
335 auto s0 =
Reshape(&scratch_mem[0](0), q1d, q1d, d1d);
336 auto s1 =
Reshape(&scratch_mem[1](0), q1d, d1d, d1d);
338 for (
int vd = 0; vd < vdim; vd++)
340 MFEM_FOREACH_THREAD(qy, y, q1d)
342 MFEM_FOREACH_THREAD(dx, x, d1d)
344 MFEM_FOREACH_THREAD(qz, z, q1d)
347 for (
int qx = 0; qx < q1d; qx++)
349 acc += fqp(vd, 0, qx, qy, qz) * B(qx, 0, dx);
351 s0(qz, qy, dx) = acc;
357 MFEM_FOREACH_THREAD(dy, y, d1d)
359 MFEM_FOREACH_THREAD(dx, x, d1d)
361 MFEM_FOREACH_THREAD(qz, z, q1d)
364 for (
int qy = 0; qy < q1d; qy++)
366 acc += s0(qz, qy, dx) * B(qy, 0, dy);
368 s1(qz, dy, dx) = acc;
375 MFEM_FOREACH_THREAD(dy, y, d1d)
377 MFEM_FOREACH_THREAD(dx, x, d1d)
379 MFEM_FOREACH_THREAD(dz, z, d1d)
382 for (
int qz = 0; qz < q1d; qz++)
384 acc += s1(qz, dy, dx) * B(qz, 0, dz);
386 yd(dx, dy, dz, vd) += acc;
395 const auto [q1d, unused, d1d] = G.GetShape();
396 const int vdim = output.vdim;
397 const int test_dim = output.size_on_qp / vdim;
398 auto fqp =
Reshape(&
f(0, 0, 0), vdim, test_dim, q1d, q1d, q1d);
399 auto yd =
Reshape(&y(0, 0), d1d, d1d, d1d, vdim);
401 auto s0 =
Reshape(&scratch_mem[0](0), q1d, q1d, d1d);
402 auto s1 =
Reshape(&scratch_mem[1](0), q1d, q1d, d1d);
403 auto s2 =
Reshape(&scratch_mem[2](0), q1d, q1d, d1d);
404 auto s3 =
Reshape(&scratch_mem[3](0), q1d, d1d, d1d);
405 auto s4 =
Reshape(&scratch_mem[4](0), q1d, d1d, d1d);
406 auto s5 =
Reshape(&scratch_mem[5](0), q1d, d1d, d1d);
408 for (
int vd = 0; vd < vdim; vd++)
410 MFEM_FOREACH_THREAD(qz, z, q1d)
412 MFEM_FOREACH_THREAD(qy, y, q1d)
414 MFEM_FOREACH_THREAD(dx, x, d1d)
416 real_t uvw[3] = {0.0, 0.0, 0.0};
417 for (
int qx = 0; qx < q1d; qx++)
419 uvw[0] += fqp(vd, 0, qx, qy, qz) * G(qx, 0, dx);
420 uvw[1] += fqp(vd, 1, qx, qy, qz) * B(qx, 0, dx);
421 uvw[2] += fqp(vd, 2, qx, qy, qz) * B(qx, 0, dx);
423 s0(qz, qy, dx) = uvw[0];
424 s1(qz, qy, dx) = uvw[1];
425 s2(qz, qy, dx) = uvw[2];
431 MFEM_FOREACH_THREAD(qz, z, q1d)
433 MFEM_FOREACH_THREAD(dy, y, d1d)
435 MFEM_FOREACH_THREAD(dx, x, d1d)
437 real_t uvw[3] = {0.0, 0.0, 0.0};
438 for (
int qy = 0; qy < q1d; qy++)
440 uvw[0] += s0(qz, qy, dx) * B(qy, 0, dy);
441 uvw[1] += s1(qz, qy, dx) * G(qy, 0, dy);
442 uvw[2] += s2(qz, qy, dx) * B(qy, 0, dy);
444 s3(qz, dy, dx) = uvw[0];
445 s4(qz, dy, dx) = uvw[1];
446 s5(qz, dy, dx) = uvw[2];
452 MFEM_FOREACH_THREAD(dz, z, d1d)
454 MFEM_FOREACH_THREAD(dy, y, d1d)
456 MFEM_FOREACH_THREAD(dx, x, d1d)
458 real_t uvw[3] = {0.0, 0.0, 0.0};
459 for (
int qz = 0; qz < q1d; qz++)
461 uvw[0] += s3(qz, dy, dx) * B(qz, 0, dz);
462 uvw[1] += s4(qz, dy, dx) * B(qz, 0, dz);
463 uvw[2] += s5(qz, dy, dx) * G(qz, 0, dz);
465 yd(dx, dy, dz, vd) += uvw[0] + uvw[1] + uvw[2];
474 const auto [q1d, unused, d1d] = B.GetShape();
475 auto fqp =
Reshape(&
f(0, 0, 0), output.size_on_qp, q1d, q1d, q1d);
476 auto yqp =
Reshape(&y(0, 0), output.size_on_qp, q1d, q1d, q1d);
478 for (
int sq = 0;
sq < output.size_on_qp;
sq++)
480 MFEM_FOREACH_THREAD(qx, x, q1d)
482 MFEM_FOREACH_THREAD(qy, y, q1d)
484 MFEM_FOREACH_THREAD(qz, z, q1d)
486 yqp(
sq, qx, qy, qz) = fqp(
sq, qx, qy, qz);
495 MFEM_ABORT(
"quadrature data mapping to field is not implemented for"
496 " this field descriptor with sum factorization on tensor product elements");