Test mesh refinement by splitting edges.
static char help[] =
"testing mesh refinement algorithm\n\n";
int main(
int argc,
char *argv[]) {
try {
PetscBool flg = PETSC_TRUE;
255, &flg);
if (flg != PETSC_TRUE) {
"*** ERROR -my_file (MESH FILE NEEDED)");
}
moab::Core mb_instance;
moab::Interface &moab = mb_instance;
const char *option;
option = "";
auto get_dim = [&]() {
int dim;
int nb_ents_3d;
0, 3, nb_ents_3d, true);
if (nb_ents_3d > 0) {
dim = 3;
} else {
int nb_ents_2d;
0, 2, nb_ents_2d, true);
if (nb_ents_2d > 0) {
dim = 2;
} else {
dim = 1;
}
}
return dim;
};
auto dim = get_dim();
bit_level0.set(0);
if (dim == 3 || dim == 2) {
0, dim, bit_level0);
} else {
"Dimension not handled by test");
}
bit_level1.set(1);
auto refine_edges = [&](
auto bit0,
auto bit) {
auto meshset_ptr = get_temp_meshset_ptr(moab);
auto meshset_ref_edges_ptr = get_temp_meshset_ptr(moab);
CHKERR moab.get_entities_by_type(*meshset_ptr, MBEDGE, edges_to_refine);
int ii = 0;
for (Range::iterator eit = edges_to_refine.begin();
eit != edges_to_refine.end(); eit++, ii++) {
int numb = ii % 2;
if (numb == 0) {
CHKERR moab.add_entities(*meshset_ref_edges_ptr, &*eit, 1);
}
}
CHKERR refine->addVerticesInTheMiddleOfEdges(*meshset_ref_edges_ptr,
bit,
if (dim == 3) {
} else if (dim == 2) {
} else {
"Dimension not handled by test");
}
};
auto refine_ents_hanging_nodes = [&](
auto bit0,
auto bit) {
auto meshset_ptr = get_temp_meshset_ptr(moab);
auto meshset_ref_edges_ptr = get_temp_meshset_ptr(moab);
CHKERR moab.get_entities_by_dimension(*meshset_ptr, dim, ents_dim);
int ii = 0;
for (Range::iterator eit = ents_dim.begin(); eit != ents_dim.end();
eit++, ii++) {
int numb = ii % 2;
if (numb == 0) {
std::vector<EntityHandle> adj_ents;
CHKERR moab.get_adjacencies(&*eit, 1, 1,
false, adj_ents);
CHKERR moab.add_entities(*meshset_ref_edges_ptr, &*adj_ents.begin(),
adj_ents.size());
}
}
CHKERR refine->addVerticesInTheMiddleOfEdges(*meshset_ref_edges_ptr,
bit,
if (dim == 3) {
CHKERR refine->refineTetsHangingNodes(*meshset_ptr,
bit,
QUIET,
true);
} else if (dim == 2) {
CHKERR refine->refineTrisHangingNodes(*meshset_ptr,
bit,
QUIET,
true);
} else {
"Dimension not handled by test");
}
};
auto save_blessed_field = [&](
auto bit) {
std::ofstream myfile;
myfile.open("mesh_refine.txt");
auto out_meshset_tet_ptr = get_temp_meshset_ptr(moab);
CHKERR moab.get_entities_by_handle(*out_meshset_tet_ptr, tets);
{
int ii = 0;
for (Range::iterator tit = tets.begin(); tit != tets.end(); tit++) {
int num_nodes;
CHKERR moab.get_connectivity(*tit, conn, num_nodes,
true);
for (int nn = 0; nn < num_nodes; nn++) {
myfile << conn[nn] << " ";
}
myfile << std::endl;
if (ii > 25)
break;
}
}
myfile.close();
};
auto save_vtk = [&](
auto bit) {
auto out_meshset_tet_ptr = get_temp_meshset_ptr(moab);
CHKERR moab.write_file(
"out_mesh_refine.vtk",
"VTK",
"",
out_meshset_tet_ptr->get_ptr(), 1);
};
}
return 0;
}
static PetscErrorCode ierr
#define CATCH_ERRORS
Catch errors.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ MOFEM_ATOM_TEST_INVALID
#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.
implementation of Data Operators for Forces and Sources
virtual moab::Interface & get_moab()=0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Mesh refinement interface.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.