185 MFEM_VERIFY(
SDIM == 2,
"Surface meshes not currently supported for LOR-DG.")
187 static constexpr int pp1 = ORDER + 1;
188 static constexpr int ndof_per_el = pp1*pp1;
189 static constexpr int nnz_per_row = 5;
210 Vector glx_pp1(pp1), glw_pp1(pp1);
211 for (
int i = 0; i < pp1; ++i)
213 glx_pp1[i] = ir_pp1[i].x;
214 glw_pp1[i] = ir_pp1[i].weight;
216 const auto *x_pp1 = glx_pp1.
Read();
217 const auto *w_1d = glw_pp1.
Read();
220 const bool const_mq =
c1.
Size() == 1;
221 const auto MQ = const_mq
224 const bool const_dq =
c2.
Size() == 1;
225 const auto DQ = const_dq
229 const auto detJ =
Reshape(geom->detJ.Read(), pp1, pp1, nel_ho);
230 const auto J =
Reshape(geom->J.Read(), pp1, pp1, 2, 2, nel_ho);
235 for (
int iy = 0; iy < pp1; ++iy)
237 for (
int ix = 0; ix < pp1; ++ix)
239 const real_t mq = const_mq ? MQ(0,0,0) : MQ(ix, iy, iel_ho);
240 const real_t dq = const_dq ? DQ(0,0,0) : DQ(ix, iy, iel_ho);
242 for (
int n_idx = 0; n_idx < 2; ++n_idx)
244 for (
int e_i = 0; e_i < 2; ++e_i)
246 const int i_0 = (n_idx == 0) ? ix + e_i : ix;
247 const int j_0 = (n_idx == 1) ? iy + e_i : iy;
249 const bool bdr = (n_idx == 0 && (i_0 == 0 || i_0 == pp1)) ||
250 (n_idx == 1 && (j_0 == 0 || j_0 == pp1));
252 if (bdr) {
continue; }
254 static constexpr int lex_map[] = {4, 2, 1, 3};
255 const int v_idx_lex = e_i + n_idx*2;
256 const int v_idx = lex_map[v_idx_lex];
258 const int w_idx = (n_idx == 0) ? iy : ix;
259 const int x_idx = (n_idx == 0) ? i_0 : j_0;
261 const real_t J1 = J(ix, iy, n_idx, !n_idx, iel_ho);
262 const real_t J2 = J(ix, iy, !n_idx, !n_idx, iel_ho);
263 const real_t Jh = (J1*J1 + J2*J2) / detJ(ix, iy, iel_ho);
265 V(v_idx, ix, iy, iel_ho) =
266 -dq * Jh * w_1d[w_idx] / (x_pp1[x_idx] - x_pp1[x_idx -1]);
269 V(0, ix, iy, iel_ho) = mq * detJ(ix, iy, iel_ho) * W(ix, iy);
270 for (
int i = 1; i < nnz_per_row; ++i)
272 V(0, ix, iy, iel_ho) -= V(i, ix, iy, iel_ho);
282 static constexpr int pp1 = ORDER + 1;
283 static constexpr int ndof_per_el = pp1*pp1*pp1;
284 static constexpr int nnz_per_row = 7;
304 Vector glx_pp1(pp1), glw_pp1(pp1);
305 for (
int i = 0; i < pp1; ++i)
307 glx_pp1[i] = ir_pp1[i].x;
308 glw_pp1[i] = ir_pp1[i].weight;
310 const auto *x_pp1 = glx_pp1.
Read();
311 const auto *w_1d = glw_pp1.
Read();
313 const bool const_mq =
c1.
Size() == 1;
314 const auto MQ = const_mq
317 const bool const_dq =
c2.
Size() == 1;
318 const auto DQ = const_dq
323 const auto detJ =
Reshape(geom->detJ.Read(), pp1, pp1, pp1, nel_ho);
324 const auto J =
Reshape(geom->J.Read(), pp1, pp1, pp1, 3, 3, nel_ho);
328 for (
int iz = 0; iz < pp1; ++iz)
330 for (
int iy = 0; iy < pp1; ++iy)
332 for (
int ix = 0; ix < pp1; ++ix)
334 const real_t mq = const_mq ? MQ(0,0,0,0) : MQ(ix, iy, iz, iel_ho);
335 const real_t dq = const_dq ? DQ(0,0,0,0) : DQ(ix, iy, iz, iel_ho);
337 const real_t DETJ = detJ(ix, iy, iz, iel_ho);
339 for (
int n_idx = 0; n_idx < 3; ++n_idx)
341 for (
int e_i = 0; e_i < 2; ++e_i)
343 static constexpr int lex_map[] = {5,3,2,4,1,6};
344 const int v_idx_lex = e_i + n_idx*2;
345 const int v_idx = lex_map[v_idx_lex];
347 const int i_0 = (n_idx == 0) ? ix + e_i : ix;
348 const int j_0 = (n_idx == 1) ? iy + e_i : iy;
349 const int k_0 = (n_idx == 2) ? iz + e_i : iz;
352 (n_idx == 0 && (i_0 == 0 || i_0 == pp1)) ||
353 (n_idx == 1 && (j_0 == 0 || j_0 == pp1)) ||
354 (n_idx == 2 && (k_0 == 0 || k_0 == pp1));
356 if (bdr) {
continue; }
358 int x_idx = (n_idx == 0) ? i_0 : (n_idx == 1) ? j_0 : k_0;
359 int w_idx_1 = (n_idx == 0) ? iy : (n_idx == 1) ? iz : ix;
360 int w_idx_2 = (n_idx == 0) ? iz : (n_idx == 1) ? ix : iy;
362 const real_t J00 = J(ix, iy, iz, 0, 0, iel_ho);
363 const real_t J01 = J(ix, iy, iz, 0, 1, iel_ho);
364 const real_t J02 = J(ix, iy, iz, 0, 2, iel_ho);
365 const real_t J10 = J(ix, iy, iz, 1, 0, iel_ho);
366 const real_t J11 = J(ix, iy, iz, 1, 1, iel_ho);
367 const real_t J12 = J(ix, iy, iz, 1, 2, iel_ho);
368 const real_t J20 = J(ix, iy, iz, 2, 0, iel_ho);
369 const real_t J21 = J(ix, iy, iz, 2, 1, iel_ho);
370 const real_t J22 = J(ix, iy, iz, 2, 2, iel_ho);
372 real_t JinvJinvT_diag = 0.0;
375 JinvJinvT_diag = J02*J02*(J11*J11 + J21*J21) + (J12*J21 - J11*J22)*
376 (J12*J21 - J11*J22) - 2*J01*J02*(J11*J12 + J21*J22) + J01*J01*
381 JinvJinvT_diag = J02*J02*(J10*J10 + J20*J20) + (J12*J20 - J10*J22)*
382 (J12*J20 - J10*J22) - 2*J00*J02*(J10*J12 + J20*J22) + J00*J00*
387 JinvJinvT_diag = J01*J01*(J10*J10 + J20*J20) + (J11*J20 - J10*J21)*
388 (J11*J20 - J10*J21) - 2*J00*J01*(J10*J11 + J20*J21) + J00*J00*
392 const real_t Jh = JinvJinvT_diag / DETJ;
394 V(v_idx, ix, iy, iz, iel_ho) = -dq * Jh * w_1d[w_idx_1] * w_1d[w_idx_2] /
395 (x_pp1[x_idx] - x_pp1[x_idx -1]);
398 V(0, ix, iy, iz, iel_ho) = mq * DETJ * W(ix, iy, iz);
399 for (
int i = 1; i < 7; ++i)
401 V(0, ix, iy, iz, iel_ho) -= V(i, ix, iy, iz, iel_ho);