167 MFEM_VERIFY(
SDIM == 2,
"Surface meshes not currently supported for LOR-DG.")
169 static constexpr int pp1 = ORDER + 1;
170 static constexpr int ndof_per_el = pp1*pp1;
171 static constexpr int nnz_per_row = 5;
192 Vector glx_pp1(pp1), glw_pp1(pp1);
193 for (
int i = 0; i < pp1; ++i)
195 glx_pp1[i] = ir_pp1[i].x;
196 glw_pp1[i] = ir_pp1[i].weight;
198 const auto *x_pp1 = glx_pp1.
Read();
199 const auto *w_1d = glw_pp1.
Read();
202 const bool const_mq =
c1.
Size() == 1;
203 const auto MQ = const_mq
206 const bool const_dq =
c2.
Size() == 1;
207 const auto DQ = const_dq
211 const auto detJ =
Reshape(geom->detJ.Read(), pp1, pp1, nel_ho);
212 const auto J =
Reshape(geom->J.Read(), pp1, pp1, 2, 2, nel_ho);
217 for (
int iy = 0; iy < pp1; ++iy)
219 for (
int ix = 0; ix < pp1; ++ix)
221 const real_t mq = const_mq ? MQ(0,0,0) : MQ(ix, iy, iel_ho);
222 const real_t dq = const_dq ? DQ(0,0,0) : DQ(ix, iy, iel_ho);
224 for (
int n_idx = 0; n_idx < 2; ++n_idx)
226 for (
int e_i = 0; e_i < 2; ++e_i)
228 const int i_0 = (n_idx == 0) ? ix + e_i : ix;
229 const int j_0 = (n_idx == 1) ? iy + e_i : iy;
231 const bool bdr = (n_idx == 0 && (i_0 == 0 || i_0 == pp1)) ||
232 (n_idx == 1 && (j_0 == 0 || j_0 == pp1));
234 if (bdr) {
continue; }
236 static constexpr int lex_map[] = {4, 2, 1, 3};
237 const int v_idx_lex = e_i + n_idx*2;
238 const int v_idx = lex_map[v_idx_lex];
240 const int w_idx = (n_idx == 0) ? iy : ix;
241 const int x_idx = (n_idx == 0) ? i_0 : j_0;
243 const real_t J1 = J(ix, iy, n_idx, !n_idx, iel_ho);
244 const real_t J2 = J(ix, iy, !n_idx, !n_idx, iel_ho);
245 const real_t Jh = (J1*J1 + J2*J2) / detJ(ix, iy, iel_ho);
247 V(v_idx, ix, iy, iel_ho) =
248 -dq * Jh * w_1d[w_idx] / (x_pp1[x_idx] - x_pp1[x_idx -1]);
251 V(0, ix, iy, iel_ho) = mq * detJ(ix, iy, iel_ho) * W(ix, iy);
252 for (
int i = 1; i < nnz_per_row; ++i)
254 V(0, ix, iy, iel_ho) -= V(i, ix, iy, iel_ho);
264 static constexpr int pp1 = ORDER + 1;
265 static constexpr int ndof_per_el = pp1*pp1*pp1;
266 static constexpr int nnz_per_row = 7;
286 Vector glx_pp1(pp1), glw_pp1(pp1);
287 for (
int i = 0; i < pp1; ++i)
289 glx_pp1[i] = ir_pp1[i].x;
290 glw_pp1[i] = ir_pp1[i].weight;
292 const auto *x_pp1 = glx_pp1.
Read();
293 const auto *w_1d = glw_pp1.
Read();
295 const bool const_mq =
c1.
Size() == 1;
296 const auto MQ = const_mq
299 const bool const_dq =
c2.
Size() == 1;
300 const auto DQ = const_dq
305 const auto detJ =
Reshape(geom->detJ.Read(), pp1, pp1, pp1, nel_ho);
306 const auto J =
Reshape(geom->J.Read(), pp1, pp1, pp1, 3, 3, nel_ho);
310 for (
int iz = 0; iz < pp1; ++iz)
312 for (
int iy = 0; iy < pp1; ++iy)
314 for (
int ix = 0; ix < pp1; ++ix)
316 const real_t mq = const_mq ? MQ(0,0,0,0) : MQ(ix, iy, iz, iel_ho);
317 const real_t dq = const_dq ? DQ(0,0,0,0) : DQ(ix, iy, iz, iel_ho);
319 const real_t DETJ = detJ(ix, iy, iz, iel_ho);
321 for (
int n_idx = 0; n_idx < 3; ++n_idx)
323 for (
int e_i = 0; e_i < 2; ++e_i)
325 static constexpr int lex_map[] = {5,3,2,4,1,6};
326 const int v_idx_lex = e_i + n_idx*2;
327 const int v_idx = lex_map[v_idx_lex];
329 const int i_0 = (n_idx == 0) ? ix + e_i : ix;
330 const int j_0 = (n_idx == 1) ? iy + e_i : iy;
331 const int k_0 = (n_idx == 2) ? iz + e_i : iz;
334 (n_idx == 0 && (i_0 == 0 || i_0 == pp1)) ||
335 (n_idx == 1 && (j_0 == 0 || j_0 == pp1)) ||
336 (n_idx == 2 && (k_0 == 0 || k_0 == pp1));
338 if (bdr) {
continue; }
340 int x_idx = (n_idx == 0) ? i_0 : (n_idx == 1) ? j_0 : k_0;
341 int w_idx_1 = (n_idx == 0) ? iy : (n_idx == 1) ? iz : ix;
342 int w_idx_2 = (n_idx == 0) ? iz : (n_idx == 1) ? ix : iy;
344 const real_t J00 = J(ix, iy, iz, 0, 0, iel_ho);
345 const real_t J01 = J(ix, iy, iz, 0, 1, iel_ho);
346 const real_t J02 = J(ix, iy, iz, 0, 2, iel_ho);
347 const real_t J10 = J(ix, iy, iz, 1, 0, iel_ho);
348 const real_t J11 = J(ix, iy, iz, 1, 1, iel_ho);
349 const real_t J12 = J(ix, iy, iz, 1, 2, iel_ho);
350 const real_t J20 = J(ix, iy, iz, 2, 0, iel_ho);
351 const real_t J21 = J(ix, iy, iz, 2, 1, iel_ho);
352 const real_t J22 = J(ix, iy, iz, 2, 2, iel_ho);
354 real_t JinvJinvT_diag = 0.0;
357 JinvJinvT_diag = J02*J02*(J11*J11 + J21*J21) + (J12*J21 - J11*J22)*
358 (J12*J21 - J11*J22) - 2*J01*J02*(J11*J12 + J21*J22) + J01*J01*
363 JinvJinvT_diag = J02*J02*(J10*J10 + J20*J20) + (J12*J20 - J10*J22)*
364 (J12*J20 - J10*J22) - 2*J00*J02*(J10*J12 + J20*J22) + J00*J00*
369 JinvJinvT_diag = J01*J01*(J10*J10 + J20*J20) + (J11*J20 - J10*J21)*
370 (J11*J20 - J10*J21) - 2*J00*J01*(J10*J11 + J20*J21) + J00*J00*
374 const real_t Jh = JinvJinvT_diag / DETJ;
376 V(v_idx, ix, iy, iz, iel_ho) = -dq * Jh * w_1d[w_idx_1] * w_1d[w_idx_2] /
377 (x_pp1[x_idx] - x_pp1[x_idx -1]);
380 V(0, ix, iy, iz, iel_ho) = mq * DETJ * W(ix, iy, iz);
381 for (
int i = 1; i < 7; ++i)
383 V(0, ix, iy, iz, iel_ho) -= V(i, ix, iy, iz, iel_ho);