44 auto create_reference_element = [&moab_ref]() {
46 constexpr double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
48 for (
int nn = 0; nn < 4; nn++) {
50 moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
53 CHKERR moab_ref.create_element(MBTET, nodes, 4, tet);
60 auto refine_ref_tetrahedron = [
this, &m_field_ref, max_level]() {
67 for (
int ll = 0; ll != max_level; ++ll) {
72 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
76 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
81 CHKERR m_ref->addVerticesInTheMiddleOfEdges(edges,
88 auto get_ref_gauss_pts_and_shape_functions = [
this, max_level, &moab_ref,
91 for (
int ll = 0; ll != max_level + 1; ++ll) {
94 m_field_ref.
getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
98 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
99 CHKERR moab_ref.add_entities(meshset, tets);
100 CHKERR moab_ref.convert_entities(meshset,
true,
false,
false);
101 CHKERR moab_ref.delete_entities(&meshset, 1);
104 CHKERR moab_ref.get_connectivity(tets, elem_nodes,
false);
106 auto &gauss_pts = levelGaussPtsOnRefMesh[ll];
107 gauss_pts.resize(elem_nodes.size(), 4,
false);
108 std::map<EntityHandle, int> little_map;
109 Range::iterator nit = elem_nodes.begin();
110 for (
int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
111 CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
112 little_map[*nit] = gg;
114 gauss_pts = trans(gauss_pts);
116 auto &ref_tets = levelRef[ll];
117 Range::iterator tit = tets.begin();
118 for (
int tt = 0; tit != tets.end(); ++tit, ++tt) {
121 CHKERR moab_ref.get_connectivity(*tit, conn, num_nodes,
false);
123 ref_tets.resize(tets.size(), num_nodes);
125 for (
int nn = 0; nn != num_nodes; ++nn) {
126 ref_tets(tt, nn) = little_map[conn[nn]];
130 auto &shape_functions = levelShapeFunctions[ll];
131 shape_functions.resize(elem_nodes.size(), 4);
133 &gauss_pts(1, 0), &gauss_pts(2, 0), elem_nodes.size());
138 levelRef.resize(max_level + 1);
139 levelGaussPtsOnRefMesh.resize(max_level + 1);
140 levelShapeFunctions.resize(max_level + 1);
142 CHKERR create_reference_element();
143 CHKERR refine_ref_tetrahedron();
144 CHKERR get_ref_gauss_pts_and_shape_functions();
155 <<
"Refinement for hexes is not implemented";
159 moab::Interface &moab_ref = core_ref;
161 auto create_reference_element = [&moab_ref]() {
163 constexpr double base_coords[] = {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0,
164 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1};
166 for (
int nn = 0; nn < 8; nn++)
167 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
169 CHKERR moab_ref.create_element(MBHEX, nodes, 8, hex);
173 auto add_ho_nodes = [&]() {
176 CHKERR moab_ref.get_entities_by_type(0, MBHEX, hexes,
true);
178 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
179 CHKERR moab_ref.add_entities(meshset, hexes);
180 CHKERR moab_ref.convert_entities(meshset,
true,
true,
true);
181 CHKERR moab_ref.delete_entities(&meshset, 1);
185 auto set_gauss_pts = [&](std::map<EntityHandle, int> &little_map) {
188 CHKERR moab_ref.get_entities_by_type(0, MBHEX, hexes,
true);
190 CHKERR moab_ref.get_connectivity(hexes, hexes_nodes,
false);
191 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
192 gauss_pts.resize(hexes_nodes.size(), 4,
false);
194 for (
auto node : hexes_nodes) {
195 CHKERR moab_ref.get_coords(&node, 1, &gauss_pts(gg, 0));
196 little_map[node] = gg;
199 gauss_pts = trans(gauss_pts);
203 auto set_ref_hexes = [&](std::map<EntityHandle, int> &little_map) {
206 CHKERR moab_ref.get_entities_by_type(0, MBHEX, hexes,
true);
208 auto &ref_hexes = levelRef[0];
209 for (
auto hex : hexes) {
212 CHKERR moab_ref.get_connectivity(hex, conn, num_nodes,
false);
213 if (ref_hexes.size2() != num_nodes) {
214 ref_hexes.resize(hexes.size(), num_nodes);
216 for (
int nn = 0; nn != num_nodes; ++nn) {
217 ref_hexes(hh, nn) = little_map[conn[nn]];
224 auto set_shape_functions = [&]() {
226 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
227 auto &shape_functions = levelShapeFunctions[0];
228 const auto nb_gauss_pts = gauss_pts.size2();
229 shape_functions.resize(nb_gauss_pts, 8);
230 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
231 const double ksi = gauss_pts(0, gg);
232 const double zeta = gauss_pts(1, gg);
233 const double eta = gauss_pts(2, gg);
247 levelGaussPtsOnRefMesh.resize(1);
248 levelShapeFunctions.resize(1);
250 CHKERR create_reference_element();
253 std::map<EntityHandle, int> little_map;
254 CHKERR set_gauss_pts(little_map);
255 CHKERR set_ref_hexes(little_map);
256 CHKERR set_shape_functions();
268 <<
"Refinement for prisms is not implemented";
272 moab::Interface &moab_ref = core_ref;
274 auto create_reference_element = [&moab_ref]() {
276 constexpr double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0,
277 0, 0, 1, 1, 0, 1, 0, 1, 1};
279 for (
int nn = 0; nn != 6; ++nn)
280 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
282 CHKERR moab_ref.create_element(MBPRISM, nodes, 6, prism);
286 auto add_ho_nodes = [&]() {
289 CHKERR moab_ref.get_entities_by_type(0, MBPRISM, prisms,
true);
291 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
292 CHKERR moab_ref.add_entities(meshset, prisms);
293 CHKERR moab_ref.convert_entities(meshset,
true,
true,
true);
294 CHKERR moab_ref.delete_entities(&meshset, 1);
298 auto set_gauss_pts = [&](std::map<EntityHandle, int> &little_map) {
301 CHKERR moab_ref.get_entities_by_type(0, MBPRISM, prisms,
true);
303 CHKERR moab_ref.get_connectivity(prisms, prism_nodes,
false);
304 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
305 gauss_pts.resize(prism_nodes.size(), 4,
false);
307 for (
auto node : prism_nodes) {
308 CHKERR moab_ref.get_coords(&node, 1, &gauss_pts(gg, 0));
309 little_map[node] = gg;
312 gauss_pts = trans(gauss_pts);
316 auto set_ref_prisms = [&](std::map<EntityHandle, int> &little_map) {
319 CHKERR moab_ref.get_entities_by_type(0, MBPRISM, prisms,
true);
321 auto &ref_prisms = levelRef[0];
322 for (
auto prism : prisms) {
325 CHKERR moab_ref.get_connectivity(prism, conn, num_nodes,
false);
326 if (ref_prisms.size2() != num_nodes)
327 ref_prisms.resize(prisms.size(), num_nodes);
328 for (
int nn = 0; nn != num_nodes; ++nn)
329 ref_prisms(pp, nn) = little_map[conn[nn]];
335 auto set_shape_functions = [&]() {
337 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
338 auto &shape_functions = levelShapeFunctions[0];
339 const auto nb_gauss_pts = gauss_pts.size2();
340 shape_functions.resize(nb_gauss_pts, 6);
341 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
342 const double ksi = gauss_pts(0, gg);
343 const double eta = gauss_pts(1, gg);
344 const double zeta = gauss_pts(2, gg);
345 const double n0 = 1 - ksi -
eta;
346 shape_functions(gg, 0) = n0 * (1 -
zeta);
347 shape_functions(gg, 1) = ksi * (1 -
zeta);
348 shape_functions(gg, 2) =
eta * (1 -
zeta);
349 shape_functions(gg, 3) = n0 *
zeta;
350 shape_functions(gg, 4) = ksi *
zeta;
351 shape_functions(gg, 5) =
eta *
zeta;
357 levelGaussPtsOnRefMesh.resize(1);
358 levelShapeFunctions.resize(1);
360 CHKERR create_reference_element();
363 std::map<EntityHandle, int> little_map;
364 CHKERR set_gauss_pts(little_map);
365 CHKERR set_ref_prisms(little_map);
366 CHKERR set_shape_functions();
374 const int max_level = defMaxLevel;
377 moab::Interface &moab_ref = core_ref;
379 auto create_reference_element = [&moab_ref]() {
381 constexpr double base_coords[] = {
394 for (
int nn = 0; nn != 3; ++nn)
395 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
397 CHKERR moab_ref.create_element(MBTRI, nodes, 3, tri);
400 CHKERR moab_ref.get_adjacencies(&tri, 1, 1,
true, edges,
401 moab::Interface::UNION);
406 CHKERR create_reference_element();
411 auto refine_ref_triangles = [
this, &m_field_ref, max_level]() {
419 for (
int ll = 0; ll != max_level; ++ll) {
424 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
428 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
432 CHKERR m_ref->addVerticesInTheMiddleOfEdges(edges,
457 auto get_ref_gauss_pts_and_shape_functions = [
this, max_level, &moab_ref,
460 for (
int ll = 0; ll != max_level + 1; ++ll) {
469 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
470 CHKERR moab_ref.add_entities(meshset, tris);
471 CHKERR moab_ref.convert_entities(meshset,
true,
false,
false);
472 CHKERR moab_ref.delete_entities(&meshset, 1);
476 CHKERR moab_ref.get_connectivity(tris, elem_nodes,
false);
478 auto &gauss_pts = levelGaussPtsOnRefMesh[ll];
479 gauss_pts.resize(elem_nodes.size(), 3,
false);
480 std::map<EntityHandle, int> little_map;
481 Range::iterator nit = elem_nodes.begin();
482 for (
int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
483 CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
484 little_map[*nit] = gg;
486 gauss_pts = trans(gauss_pts);
488 auto &ref_tris = levelRef[ll];
489 Range::iterator tit = tris.begin();
490 for (
int tt = 0; tit != tris.end(); ++tit, ++tt) {
493 CHKERR moab_ref.get_connectivity(*tit, conn, num_nodes,
false);
495 ref_tris.resize(tris.size(), num_nodes);
497 for (
int nn = 0; nn != num_nodes; ++nn) {
498 ref_tris(tt, nn) = little_map[conn[nn]];
502 auto &shape_functions = levelShapeFunctions[ll];
503 shape_functions.resize(elem_nodes.size(), 3);
505 &gauss_pts(1, 0), elem_nodes.size());
510 levelRef.resize(max_level + 1);
511 levelGaussPtsOnRefMesh.resize(max_level + 1);
512 levelShapeFunctions.resize(max_level + 1);
514 CHKERR refine_ref_triangles();
515 CHKERR get_ref_gauss_pts_and_shape_functions();
526 <<
"Refinement for quad is not implemented";
530 moab::Interface &moab_ref = core_ref;
532 auto create_reference_element = [&moab_ref]() {
534 constexpr double base_coords[] = {
550 for (
int nn = 0; nn < 4; nn++)
551 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
553 CHKERR moab_ref.create_element(MBQUAD, nodes, 4, quad);
557 auto add_ho_nodes = [&]() {
560 CHKERR moab_ref.get_entities_by_type(0, MBQUAD, quads,
true);
562 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
563 CHKERR moab_ref.add_entities(meshset, quads);
564 CHKERR moab_ref.convert_entities(meshset,
true,
true,
true);
565 CHKERR moab_ref.delete_entities(&meshset, 1);
569 auto set_gauss_pts = [&](std::map<EntityHandle, int> &little_map) {
572 CHKERR moab_ref.get_entities_by_type(0, MBQUAD, quads,
true);
574 CHKERR moab_ref.get_connectivity(quads, quads_nodes,
false);
575 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
576 gauss_pts.resize(quads_nodes.size(), 4,
false);
578 for (
auto node : quads_nodes) {
579 CHKERR moab_ref.get_coords(&node, 1, &gauss_pts(gg, 0));
580 little_map[node] = gg;
583 gauss_pts = trans(gauss_pts);
587 auto set_ref_quads = [&](std::map<EntityHandle, int> &little_map) {
590 CHKERR moab_ref.get_entities_by_type(0, MBQUAD, quads,
true);
592 auto &ref_quads = levelRef[0];
593 for (
auto quad : quads) {
596 CHKERR moab_ref.get_connectivity(quad, conn, num_nodes,
false);
597 if (ref_quads.size2() != num_nodes) {
598 ref_quads.resize(quads.size(), num_nodes);
600 for (
int nn = 0; nn != num_nodes; ++nn) {
601 ref_quads(hh, nn) = little_map[conn[nn]];
608 auto set_shape_functions = [&]() {
610 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
611 auto &shape_functions = levelShapeFunctions[0];
612 const auto nb_gauss_pts = gauss_pts.size2();
613 shape_functions.resize(nb_gauss_pts, 4);
614 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
615 const double ksi = gauss_pts(0, gg);
616 const double zeta = gauss_pts(1, gg);
626 levelGaussPtsOnRefMesh.resize(1);
627 levelShapeFunctions.resize(1);
629 CHKERR create_reference_element();
632 std::map<EntityHandle, int> little_map;
633 CHKERR set_gauss_pts(little_map);
634 CHKERR set_ref_quads(little_map);
635 CHKERR set_shape_functions();
646 <<
"Refinement for edges is not implemented";
649 auto set_gauss_pts = [&](std::map<EntityHandle, int> &little_map) {
656 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
657 gauss_pts.resize(2, nb_nodes,
false);
661 for (; nn != 2; ++nn) {
662 gauss_pts(0, nn) =
static_cast<double>(nn);
667 gauss_pts(0, nn) = 0.5;
674 auto set_ref_edges = [&](std::map<EntityHandle, int> &little_map) {
678 int nb_edges = level + 1;
684 auto &ref_edges = levelRef[level];
685 ref_edges.resize(nb_edges, nb_nodes,
false);
687 for (
int ee = 0; ee != nb_edges; ++ee) {
689 for (; nn != 2; ++nn) {
690 ref_edges(ee, nn) = nb_nodes * ee + nn;
693 ref_edges(ee, nn) = nb_nodes * ee + 2;
700 auto set_shape_functions = [&]() {
702 auto &gauss_pts = levelGaussPtsOnRefMesh[0];
703 auto &shape_functions = levelShapeFunctions[0];
704 const auto nb_gauss_pts = gauss_pts.size2();
705 shape_functions.resize(nb_gauss_pts, 2);
706 for (
int gg = 0; gg != nb_gauss_pts; ++gg) {
707 const double ksi = gauss_pts(0, gg);
715 levelGaussPtsOnRefMesh.resize(1);
716 levelShapeFunctions.resize(1);
718 std::map<EntityHandle, int> little_map;
719 CHKERR set_gauss_pts(little_map);
720 CHKERR set_ref_edges(little_map);
721 CHKERR set_shape_functions();