32 int order_col,
int order_data) {
35 constexpr bool debug =
false;
37 constexpr int numNodes = 3;
38 constexpr int numEdges = 3;
39 constexpr int refinementLevels = 1;
41 auto &m_field = fe_raw_ptr->
mField;
42 auto fe_ptr =
static_cast<Fe *
>(fe_raw_ptr);
47 "only MBTRI is implemented");
52 auto set_base_quadrature = [&]() {
54 int rule =
funRule(order_row, order_col, order_data);
64 fe_ptr->gaussPts.resize(3, nb_gauss_pts,
false);
66 &fe_ptr->gaussPts(0, 0), 1);
68 &fe_ptr->gaussPts(1, 0), 1);
70 &fe_ptr->gaussPts(2, 0), 1);
71 auto &data = fe_ptr->dataOnElement[
H1];
72 data->dataOnEntities[MBVERTEX][0].getN(
NOBASE).resize(nb_gauss_pts, 3,
75 &*data->dataOnEntities[MBVERTEX][0].getN(
NOBASE).data().begin();
76 cblas_dcopy(3 * nb_gauss_pts,
QUAD_2D_TABLE[rule]->points, 1, shape_ptr,
78 data->dataOnEntities[MBVERTEX][0].getDiffN(
NOBASE).resize(3, 2,
false);
81 data->dataOnEntities[MBVERTEX][0].getDiffN(
NOBASE).data().begin());
90 CHKERR set_base_quadrature();
94 auto get_edges = [&]() {
95 std::bitset<numEdges> edges;
96 for (
int ee = 0; ee != numEdges; ee++) {
98 CHKERR m_field.get_moab().side_element(fe_handle, 1, ee, edge);
108 auto refine_quadrature = [&]() {
111 const int max_level = refinementLevels;
114 double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0};
116 for (
int nn = 0; nn != numNodes; nn++)
117 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
119 CHKERR moab_ref.create_element(MBTRI, nodes, numNodes, tri);
123 Range tris(tri, tri);
125 CHKERR m_field_ref.
get_moab().get_adjacencies(tris, 1,
true, edges,
126 moab::Interface::UNION);
131 auto edges = get_edges();
134 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
135 for (
int ee = 0; ee != numEdges; ee++) {
138 CHKERR moab_ref.side_element(tri, 1, ee, ent);
139 CHKERR moab_ref.add_entities(meshset, &ent, 1);
145 for (
int ll = 0; ll != max_level; ll++) {
147 CHKERR moab_ref.get_entities_by_type(meshset, MBEDGE, ref_edges,
155 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
157 CHKERR m_ref->addVerticesInTheMiddleOfEdges(
161 ->updateMeshsetByEntitiesChildren(
162 meshset,
BitRefLevel().set(ll + 1), meshset, MBEDGE,
true);
168 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(max_level),
178 for (Range::iterator tit = tris.begin(); tit != tris.end();
182 CHKERR moab_ref.get_connectivity(*tit, conn, num_nodes,
false);
183 CHKERR moab_ref.get_coords(conn, num_nodes, &ref_coords(tt, 0));
186 auto &data = fe_ptr->dataOnElement[
H1];
187 const size_t nb_gauss_pts = fe_ptr->gaussPts.size2();
188 MatrixDouble ref_gauss_pts(3, nb_gauss_pts * ref_coords.size1());
191 for (
size_t tt = 0; tt != ref_coords.size1(); tt++) {
192 double *tri_coords = &ref_coords(tt, 0);
195 auto det = t_normal.
l2();
196 for (
size_t ggg = 0; ggg != nb_gauss_pts; ++ggg, ++gg) {
197 for (
int dd = 0; dd != 2; dd++) {
198 ref_gauss_pts(dd, gg) = shape_n(ggg, 0) * tri_coords[3 * 0 + dd] +
199 shape_n(ggg, 1) * tri_coords[3 * 1 + dd] +
200 shape_n(ggg, 2) * tri_coords[3 * 2 + dd];
202 ref_gauss_pts(2, gg) = fe_ptr->gaussPts(2, ggg) * det;
209 CHKERR refine_quadrature();