10 using namespace MoFEM;
12 static char help[] =
"...\n\n";
14 int main(
int argc,
char *argv[]) {
22 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
24 pcomm =
new ParallelComm(&moab, PETSC_COMM_WORLD);
28 char mesh_out_file[255] =
"out.h5m";
29 PetscBool flg_file = PETSC_FALSE;
30 PetscBool flg_n_part = PETSC_FALSE;
31 PetscBool flg_part = PETSC_FALSE;
32 PetscBool only_tags = PETSC_FALSE;
33 PetscInt n_partas = 1;
34 PetscBool create_lower_dim_ents = PETSC_TRUE;
38 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"none",
"none");
41 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
43 if (flg_file != PETSC_TRUE)
44 CHKERR PetscOptionsString(
"-file_name",
"mesh file name",
"",
"mesh.h5m",
46 if (flg_file != PETSC_TRUE)
47 SETERRQ(PETSC_COMM_SELF, 1,
48 "*** ERROR -my_file (-file_name) (mesh file needed)");
54 CHKERR PetscOptionsString(
"-output_file",
"output mesh file name",
"",
55 "out.h5m", mesh_out_file, 255, PETSC_NULL);
56 CHKERR PetscOptionsInt(
"-my_nparts",
"number of parts",
"", n_partas,
57 &n_partas, &flg_n_part);
58 CHKERR PetscOptionsInt(
"-nparts",
"number of parts",
"", n_partas,
59 &n_partas, &flg_part);
61 if (!flg_n_part && !flg_part)
62 SETERRQ(PETSC_COMM_SELF, 1,
63 "*** ERROR partitioning number not given (-nparts)");
65 auto get_nb_ents_by_dim = [&](
const int dim) {
67 CHKERR moab.get_number_entities_by_dimension(0, dim, nb);
70 for (; dim >= 0; dim--) {
71 if (get_nb_ents_by_dim(dim))
77 "Dimension of entities to partition not found");
79 CHKERR PetscOptionsInt(
"-dim",
"entities dim",
"", dim, &dim, PETSC_NULL);
81 CHKERR PetscOptionsInt(
"-adj_dim",
"adjacency dim",
"", adj_dim, &adj_dim,
84 "-my_create_lower_dim_ents",
"if true create lower dimension entireties",
85 "", create_lower_dim_ents, &create_lower_dim_ents, PETSC_NULL);
86 CHKERR PetscOptionsBool(
"-block_tags",
"only block and meshsests tags",
"",
87 only_tags, &only_tags, PETSC_NULL);
89 ierr = PetscOptionsEnd();
93 for (
int d : {3, 2, 1})
94 if (ents.num_of_dimension(
d))
104 CHKERR meshsets_interface_ptr->setMeshsetFromFile();
109 for (
auto cit = meshsets_interface_ptr->getBegin();
110 cit != meshsets_interface_ptr->getEnd(); cit++) {
112 CHKERR m_field.
get_moab().get_entities_by_handle(cit->getMeshset(), ents,
114 min_dim = std::min(min_dim,
get_dim(ents));
119 MPI_Allreduce(&min_dim, &g_dim, 1, MPI_INT, MPI_MIN, m_field.
get_comm());
120 if (g_dim < adj_dim) {
122 <<
"The minimum meshsets dimension is = " << min_dim;
124 if (adj_dim >= dim) {
126 <<
"The -adj_dim >= dim, adj_dim = " << adj_dim <<
" dim = " << dim;
132 CHKERR moab.get_entities_by_dimension(0, dim, ents_dim,
false);
133 if (create_lower_dim_ents) {
136 CHKERR moab.get_adjacencies(ents_dim, 2,
true, faces,
137 moab::Interface::UNION);
141 CHKERR moab.get_adjacencies(ents_dim, 1,
true, edges,
142 moab::Interface::UNION);
147 ents_dim, dim, adj_dim, n_partas,
nullptr,
nullptr,
nullptr,
VERBOSE);
150 auto get_tag_list = [&]() {
151 std::vector<Tag> tags_list;
154 for (
auto &
m : list) {
155 auto meshset =
m.getMeshset();
156 std::vector<Tag> tmp_tags_list;
159 for (
auto t : tmp_tags_list) {
160 tags_list.push_back(
t);
170 auto tags_list = get_tag_list();
171 std::sort(tags_list.begin(), tags_list.end());
172 auto new_end = std::unique(tags_list.begin(), tags_list.end());
173 tags_list.resize(std::distance(tags_list.begin(), new_end));
174 tags_list.push_back(pcomm->part_tag());
176 CHKERR moab.write_file(mesh_out_file,
"MOAB",
"", &root_mesh, 1,
177 &*tags_list.begin(), tags_list.size());
179 CHKERR moab.write_file(mesh_out_file,
"MOAB",
"");