24 const field_operator_t &input,
28 [[maybe_unused]]
auto B = dtq.
B;
29 [[maybe_unused]]
auto G = dtq.
G;
33 auto [q1d, unused, d1d] = B.
GetShape();
34 const int vdim = input.vdim;
35 const auto field =
Reshape(&field_e[0], d1d, d1d, d1d, vdim);
36 auto fqp =
Reshape(&field_qp[0], vdim, q1d, q1d, q1d);
37 auto s0 =
Reshape(&scratch_mem[0](0), d1d, d1d, q1d);
38 auto s1 =
Reshape(&scratch_mem[1](0), d1d, q1d, q1d);
40 for (
int vd = 0; vd < vdim; vd++)
42 MFEM_FOREACH_THREAD(dz, z, d1d)
44 MFEM_FOREACH_THREAD(dy, y, d1d)
46 MFEM_FOREACH_THREAD(qx, x, q1d)
49 for (
int dx = 0; dx < d1d; dx++)
51 acc += B(qx, 0, dx) * field(dx, dy, dz, vd);
59 MFEM_FOREACH_THREAD(dz, z, d1d)
61 MFEM_FOREACH_THREAD(qx, x, q1d)
63 MFEM_FOREACH_THREAD(qy, y, q1d)
66 for (
int dy = 0; dy < d1d; dy++)
68 acc += s0(dz, dy, qx) * B(qy, 0, dy);
76 MFEM_FOREACH_THREAD(qz, z, q1d)
78 MFEM_FOREACH_THREAD(qy, y, q1d)
80 MFEM_FOREACH_THREAD(qx, x, q1d)
83 for (
int dz = 0; dz < d1d; dz++)
85 acc += s1(dz, qy, qx) * B(qz, 0, dz);
87 fqp(vd, qx, qy, qz) = acc;
97 const auto [q1d, unused, d1d] = B.GetShape();
98 const int vdim = input.vdim;
99 const int dim = input.dim;
100 const auto field =
Reshape(&field_e[0], d1d, d1d, d1d, vdim);
101 auto fqp =
Reshape(&field_qp[0], vdim,
dim, q1d, q1d, q1d);
103 auto s0 =
Reshape(&scratch_mem[0](0), d1d, d1d, q1d);
104 auto s1 =
Reshape(&scratch_mem[1](0), d1d, d1d, q1d);
105 auto s2 =
Reshape(&scratch_mem[2](0), d1d, q1d, q1d);
106 auto s3 =
Reshape(&scratch_mem[3](0), d1d, q1d, q1d);
107 auto s4 =
Reshape(&scratch_mem[4](0), d1d, q1d, q1d);
109 for (
int vd = 0; vd < vdim; vd++)
111 MFEM_FOREACH_THREAD(dz, z, d1d)
113 MFEM_FOREACH_THREAD(dy, y, d1d)
115 MFEM_FOREACH_THREAD(qx, x, q1d)
117 real_t uv[2] = {0.0, 0.0};
118 for (
int dx = 0; dx < d1d; dx++)
120 const real_t f = field(dx, dy, dz, vd);
121 uv[0] +=
f * B(qx, 0, dx);
122 uv[1] +=
f * G(qx, 0, dx);
124 s0(dz, dy, qx) = uv[0];
125 s1(dz, dy, qx) = uv[1];
131 MFEM_FOREACH_THREAD(dz, z, d1d)
133 MFEM_FOREACH_THREAD(qy, y, q1d)
135 MFEM_FOREACH_THREAD(qx, x, q1d)
137 real_t uvw[3] = {0.0, 0.0, 0.0};
138 for (
int dy = 0; dy < d1d; dy++)
140 const real_t s0i = s0(dz, dy, qx);
141 uvw[0] += s1(dz, dy, qx) * B(qy, 0, dy);
142 uvw[1] += s0i * G(qy, 0, dy);
143 uvw[2] += s0i * B(qy, 0, dy);
145 s2(dz, qy, qx) = uvw[0];
146 s3(dz, qy, qx) = uvw[1];
147 s4(dz, qy, qx) = uvw[2];
153 MFEM_FOREACH_THREAD(qz, z, q1d)
155 MFEM_FOREACH_THREAD(qy, y, q1d)
157 MFEM_FOREACH_THREAD(qx, x, q1d)
159 real_t uvw[3] = {0.0, 0.0, 0.0};
160 for (
int dz = 0; dz < d1d; dz++)
162 uvw[0] += s2(dz, qy, qx) * B(qz, 0, dz);
163 uvw[1] += s3(dz, qy, qx) * B(qz, 0, dz);
164 uvw[2] += s4(dz, qy, qx) * G(qz, 0, dz);
166 fqp(vd, 0, qx, qy, qz) = uvw[0];
167 fqp(vd, 1, qx, qy, qz) = uvw[1];
168 fqp(vd, 2, qx, qy, qz) = uvw[2];
177 std::is_same_v<std::decay_t<field_operator_t>,
Weight>)
179 const int num_qp = integration_weights.
GetShape()[0];
181 const int q1d = (int)floor(std::pow(num_qp, 1.0/input.dim) + 0.5);
182 auto w =
Reshape(&integration_weights[0], q1d, q1d, q1d);
183 auto f =
Reshape(&field_qp[0], q1d, q1d, q1d);
184 MFEM_FOREACH_THREAD(qx, x, q1d)
186 MFEM_FOREACH_THREAD(qy, y, q1d)
188 MFEM_FOREACH_THREAD(qz, z, q1d)
190 f(qx, qy, qz) = w(qx, qy, qz);
198 const int q1d = B.GetShape()[0];
199 auto field =
Reshape(&field_e[0], input.size_on_qp, q1d * q1d * q1d);
205 "can't map field to quadrature data");
215 const field_operator_t &input,
219 [[maybe_unused]]
auto B = dtq.
B;
220 [[maybe_unused]]
auto G = dtq.
G;
224 auto [q1d, unused, d1d] = B.
GetShape();
225 const int vdim = input.vdim;
226 const auto field =
Reshape(&field_e[0], d1d, d1d, vdim);
227 auto fqp =
Reshape(&field_qp[0], vdim, q1d, q1d);
228 auto s0 =
Reshape(&scratch_mem[0](0), d1d, q1d);
230 for (
int vd = 0; vd < vdim; vd++)
232 MFEM_FOREACH_THREAD(dy, y, d1d)
234 MFEM_FOREACH_THREAD(qx, x, q1d)
237 for (
int dx = 0; dx < d1d; dx++)
239 acc += B(qx, 0, dx) * field(dx, dy, vd);
246 MFEM_FOREACH_THREAD(qx, x, q1d)
248 MFEM_FOREACH_THREAD(qy, y, q1d)
251 for (
int dy = 0; dy < d1d; dy++)
253 acc += s0(dy, qx) * B(qy, 0, dy);
255 fqp(vd, qx, qy) = acc;
264 const auto [q1d, unused, d1d] = B.GetShape();
265 const int vdim = input.vdim;
266 const int dim = input.dim;
267 const auto field =
Reshape(&field_e[0], d1d, d1d, vdim);
268 auto fqp =
Reshape(&field_qp[0], vdim,
dim, q1d, q1d);
270 auto s0 =
Reshape(&scratch_mem[0](0), d1d, q1d);
271 auto s1 =
Reshape(&scratch_mem[1](0), d1d, q1d);
273 for (
int vd = 0; vd < vdim; vd++)
275 MFEM_FOREACH_THREAD(dy, y, d1d)
277 MFEM_FOREACH_THREAD(qx, x, q1d)
279 real_t uv[2] = {0.0, 0.0};
280 for (
int dx = 0; dx < d1d; dx++)
282 const real_t f = field(dx, dy, vd);
283 uv[0] +=
f * B(qx, 0, dx);
284 uv[1] +=
f * G(qx, 0, dx);
292 MFEM_FOREACH_THREAD(qy, y, q1d)
294 MFEM_FOREACH_THREAD(qx, x, q1d)
296 real_t uv[2] = {0.0, 0.0};
297 for (
int dy = 0; dy < d1d; dy++)
299 const real_t s0i = s0(dy, qx);
300 uv[0] += s1(dy, qx) * B(qy, 0, dy);
301 uv[1] += s0i * G(qy, 0, dy);
303 fqp(vd, 0, qx, qy) = uv[0];
304 fqp(vd, 1, qx, qy) = uv[1];
312 std::is_same_v<std::decay_t<field_operator_t>,
Weight>)
314 const int num_qp = integration_weights.
GetShape()[0];
316 const int q1d = (int)floor(std::pow(num_qp, 1.0/input.dim) + 0.5);
317 auto w =
Reshape(&integration_weights[0], q1d, q1d);
318 auto f =
Reshape(&field_qp[0], q1d, q1d);
319 MFEM_FOREACH_THREAD(qx, x, q1d)
321 MFEM_FOREACH_THREAD(qy, y, q1d)
323 f(qx, qy) = w(qx, qy);
330 const int q1d = B.GetShape()[0];
331 auto field =
Reshape(&field_e[0], input.size_on_qp, q1d * q1d);
337 "can't map field to quadrature data");
348 const field_operator_t &input,
352 [[maybe_unused]]
auto B = dtq.
B;
353 [[maybe_unused]]
auto G = dtq.
G;
357 auto [q1d, unused, d1d] = B.
GetShape();
358 const int vdim = input.vdim;
359 const auto field =
Reshape(&field_e[0], d1d, vdim);
360 auto fqp =
Reshape(&field_qp[0], vdim, q1d);
362 for (
int vd = 0; vd < vdim; vd++)
364 MFEM_FOREACH_THREAD(qx, x, q1d)
367 for (
int dx = 0; dx < d1d; dx++)
369 acc += B(qx, 0, dx) * field(dx, vd);
379 const auto [q1d, unused, d1d] = B.GetShape();
380 const int vdim = input.vdim;
381 const int dim = input.dim;
382 const auto field =
Reshape(&field_e[0], d1d, vdim);
383 auto fqp =
Reshape(&field_qp[0], vdim,
dim, q1d);
385 for (
int vd = 0; vd < vdim; vd++)
387 MFEM_FOREACH_THREAD(qx, x, q1d)
390 for (
int dx = 0; dx < d1d; dx++)
392 acc += G(qx, 0, dx) * field(dx, vd);
394 fqp(vd, 0, qx) = acc;
401 std::is_same_v<std::decay_t<field_operator_t>,
Weight>)
403 const int num_qp = integration_weights.
GetShape()[0];
405 const int q1d = (int)floor(std::pow(num_qp, 1.0/input.dim) + 0.5);
406 auto w =
Reshape(&integration_weights[0], q1d);
407 auto f =
Reshape(&field_qp[0], q1d);
408 MFEM_FOREACH_THREAD(qx, x, q1d)
416 const int q1d = B.GetShape()[0];
417 auto field =
Reshape(&field_e[0], input.size_on_qp, q1d);
423 "can't map field to quadrature data");
433 const field_operator_t &input,
436 [[maybe_unused]]
auto B = dtq.
B;
437 [[maybe_unused]]
auto G = dtq.
G;
441 const int vdim = input.vdim;
442 const auto field =
Reshape(&field_e(0), num_dof, vdim);
444 for (
int vd = 0; vd < vdim; vd++)
446 for (
int qp = 0; qp < num_qp; qp++)
449 for (
int dof = 0; dof < num_dof; dof++)
451 acc += B(qp, 0, dof) * field(dof, vd);
453 field_qp(vd, qp) = acc;
460 const int vdim = input.vdim;
461 const auto field =
Reshape(&field_e(0), num_dof, vdim);
464 for (
int vd = 0; vd < vdim; vd++)
466 for (
int qp = 0; qp < num_qp; qp++)
468 for (
int d = 0; d <
dim; d++)
471 for (
int dof = 0; dof < num_dof; dof++)
473 acc += G(qp, d, dof) * field(dof, vd);
480 else if constexpr (std::is_same_v<field_operator_t, Weight>)
482 const int num_qp = integration_weights.
GetShape()[0];
483 auto f =
Reshape(&field_qp[0], num_qp);
484 for (
int qp = 0; qp < num_qp; qp++)
486 f(qp) = integration_weights(qp);
491 auto [num_qp, unused, num_dof] = B.GetShape();
492 const int size_on_qp = input.size_on_qp;
493 const auto field =
Reshape(&field_e[0], size_on_qp * num_qp);
494 auto f =
Reshape(&field_qp[0], size_on_qp * num_qp);
495 for (
int i = 0; i < size_on_qp * num_qp; i++)
503 "can't map field to quadrature data");