18 double def_val_tag = 0.0;
21 tag_err, MB_TAG_CREAT | MB_TAG_SPARSE,
24 auto LoCoordsPtr = boost::make_shared<MatrixDouble>();
26 op_ptr->doWorkRhsHook = [&](DataOperator *base_op_ptr,
int side,
28 EntitiesFieldData::EntData &data) {
31 *LoCoordsPtr = op_ptr->getCoordsAtGaussPts();
36 op_ptr_ho->doWorkRhsHook = [&](DataOperator *base_op_ptr,
int side,
38 EntitiesFieldData::EntData &data) {
41 auto fe_ent = op_ptr_ho->getFEEntityHandle();
43 MatrixDouble &lo_mat = *LoCoordsPtr;
44 MatrixDouble &ho_mat = op_ptr_ho->getCoordsAtGaussPts();
45 auto t_lo_coords = getFTensor1FromMat<SPACE_DIM>(lo_mat);
46 auto t_ho_coords = getFTensor1FromMat<SPACE_DIM>(ho_mat);
47 auto t_w = op_ptr_ho->getFTensor0IntegrationWeight();
49 const auto nb_gauss_pts = op_ptr_ho->getGaussPts().size2();
51 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
52 err_int += t_w * ((t_lo_coords(
i) - t_ho_coords(
i)) *
53 (t_lo_coords(
i) - t_ho_coords(
i)));
58 const double err_measure = sqrt(err_int) / op_ptr_ho->getMeasure();
59 if (err_measure > std::numeric_limits<float>::epsilon()) {
68 if (adj_tet.size() != 1)
71 "There should be only one ent adjacent to the boundary ent");
72 auto tet_ent = *adj_tet.begin();
73 double tet_err_measure = 0;
76 if (err_measure > tet_err_measure) {
83 auto fe = boost::make_shared<BoundaryEle>(
mField);
84 fe->getOpPtrVector().push_back(op_ptr);
87 fe->getOpPtrVector(), {NOSPACE},
"GEOMETRY");
88 fe->getOpPtrVector().push_back(op_ptr_ho);
91 DMoFEMLoopFiniteElements(dm,
simple->getBoundaryFEName(), fe),
101 CHKERR PetscOptionsGetReal(PETSC_NULLPTR,
"",
"-ref_geom_threshold",
105 "GEOMETRY_ERROR", tag_err) == MB_SUCCESS) {
107 std::array<double, 2> mean_error_glob = {0.0, 0.0};
108 MPI_Allreduce(&
meanError[0], &mean_error_glob[0], 2, MPI_DOUBLE, MPI_SUM,
118 auto get_ents_to_refine = [&]() {
119 Range outer_ref_ents;
122 op_ptr_ref->doWorkRhsHook = [&](DataOperator *base_op_ptr,
int side,
124 EntitiesFieldData::EntData &data) {
127 auto fe_ent = op_ptr_ref->getFEEntityHandle();
128 double err_measure = 0;
132 outer_ref_ents.insert(fe_ent);
137 auto fe = boost::make_shared<BoundaryEle>(
mField);
138 fe->getOpPtrVector().push_back(op_ptr_ref);
139 auto dm =
simple->getDM();
141 DMoFEMLoopFiniteElements(dm,
simple->getBoundaryFEName(), fe),
143 return outer_ref_ents;
146 auto ents_to_ref = get_ents_to_refine();
148 Range all_domain_ents;
151 Range all_boundary_ents;
153 simple->getBoundaryMeshSet(), all_boundary_ents);
155 Range tets_to_refine[2];
158 moab::Interface::UNION);
162 moab::Interface::UNION);
166 ent_conn,
SPACE_DIM,
true, tets_to_refine[0], moab::Interface::UNION);
167 tets_to_refine[0] = subtract(tets_to_refine[0], tets_to_refine[1]);
171 "ents_to_refine_ho_2.vtk", tets_to_refine[0]);
173 "ents_to_refine_ho_3.vtk", tets_to_refine[1]);
176 for (
int i = 0;
i < 2; ++
i) {
177 Range ents_to_refine;
178 ents_to_refine.merge(tets_to_refine[
i]);
180 Range lower_dim_ents;
182 tets_to_refine[
i], d,
true, lower_dim_ents, moab::Interface::UNION);
183 ents_to_refine.merge(lower_dim_ents);
200 for (
int i = 0;
i < 2; ++
i) {
204 moab::Interface::UNION);
208 adj_faces = intersect(adj_faces, all_boundary_ents);