33 {
35
37
39
40 moab::Core core_ref;
41 moab::Interface &moab_ref = core_ref;
42
43 auto create_reference_element = [&moab_ref]() {
45 constexpr double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
47 for (int nn = 0; nn < 4; nn++) {
49 moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
50 }
52 CHKERR moab_ref.create_element(MBTET, nodes, 4, tet);
54 };
55
58
59 auto refine_ref_tetrahedron = [this, &m_field_ref, max_level]() {
61
62
64 m_field_ref.
getInterface<BitRefManager>()->setBitRefLevelByDim(
66 for (int ll = 0; ll != max_level; ++ll) {
68 ll);
71 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
75 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
77
78 MeshRefinement *m_ref;
80 CHKERR m_ref->addVerticesInTheMiddleOfEdges(edges,
83 }
85 };
86
87 auto get_ref_gauss_pts_and_shape_functions = [this, max_level, &moab_ref,
88 &m_field_ref]() {
90 for (int ll = 0; ll != max_level + 1; ++ll) {
93 m_field_ref.
getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
97 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
98 CHKERR moab_ref.add_entities(meshset, tets);
99 CHKERR moab_ref.convert_entities(meshset,
true,
false,
false);
100 CHKERR moab_ref.delete_entities(&meshset, 1);
101 }
103 CHKERR moab_ref.get_connectivity(tets, elem_nodes,
false);
104
106 gauss_pts.resize(elem_nodes.size(), 4, false);
107 std::map<EntityHandle, int> little_map;
108 Range::iterator nit = elem_nodes.begin();
109 for (int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
110 CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
111 little_map[*nit] = gg;
112 }
113 gauss_pts = trans(gauss_pts);
114
116 Range::iterator tit = tets.begin();
117 for (int tt = 0; tit != tets.end(); ++tit, ++tt) {
119 int num_nodes;
120 CHKERR moab_ref.get_connectivity(*tit, conn, num_nodes,
false);
121 if (tt == 0) {
122 ref_tets.resize(tets.size(), num_nodes);
123 }
124 for (int nn = 0; nn != num_nodes; ++nn) {
125 ref_tets(tt, nn) = little_map[conn[nn]];
126 }
127 }
128
130 shape_functions.resize(elem_nodes.size(), 4);
132 &gauss_pts(1, 0), &gauss_pts(2, 0), elem_nodes.size());
133 }
135 };
136
140
141 CHKERR create_reference_element();
142 CHKERR refine_ref_tetrahedron();
143 CHKERR get_ref_gauss_pts_and_shape_functions();
144
146}
#define MOFEM_TAG_AND_LOG_C(channel, severity, tag, format,...)
Tag and log in channel.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Deprecated interface functions.
std::vector< ublas::matrix< int > > levelRef
std::vector< MatrixDouble > levelShapeFunctions
std::vector< MatrixDouble > levelGaussPtsOnRefMesh
MoFEMErrorCode getOptions()
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.