21int main(
int argc,
char *argv[]) {
27 moab::Core mb_instance;
28 moab::Interface &moab = mb_instance;
29 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
31 pcomm =
new ParallelComm(&moab, PETSC_COMM_WORLD);
35 char mesh_out_file[255] =
"out.h5m";
36 PetscBool flg_file = PETSC_FALSE;
37 PetscBool flg_n_part = PETSC_FALSE;
38 PetscBool flg_part = PETSC_FALSE;
39 PetscBool only_tags = PETSC_FALSE;
40 PetscInt n_partas = 1;
41 PetscBool create_lower_dim_ents = PETSC_TRUE;
45 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"none",
"none");
47 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
49 if (flg_file != PETSC_TRUE)
50 CHKERR PetscOptionsString(
"-file_name",
"mesh file name",
"",
"mesh.h5m",
52 if (flg_file != PETSC_TRUE)
53 SETERRQ(PETSC_COMM_SELF, 1,
54 "*** ERROR -my_file (-file_name) (mesh file needed)");
60 CHKERR PetscOptionsString(
"-output_file",
"output mesh file name",
"",
61 "out.h5m", mesh_out_file, 255, PETSC_NULLPTR);
62 CHKERR PetscOptionsInt(
"-my_nparts",
"number of parts",
"", n_partas,
63 &n_partas, &flg_n_part);
64 CHKERR PetscOptionsInt(
"-nparts",
"number of parts",
"", n_partas,
65 &n_partas, &flg_part);
67 if (!flg_n_part && !flg_part)
68 SETERRQ(PETSC_COMM_SELF, 1,
69 "*** ERROR partitioning number not given (-nparts)");
71 auto get_nb_ents_by_dim = [&](
const int dim) {
73 CHKERR moab.get_number_entities_by_dimension(0, dim, nb);
76 for (; dim >= 0; dim--) {
77 if (get_nb_ents_by_dim(dim))
83 "Dimension of entities to partition not found");
85 CHKERR PetscOptionsInt(
"-dim",
"entities dim",
"", dim, &dim, PETSC_NULLPTR);
87 CHKERR PetscOptionsInt(
"-adj_dim",
"adjacency dim",
"", adj_dim, &adj_dim,
90 "-my_create_lower_dim_ents",
"if true create lower dimension entireties",
91 "", create_lower_dim_ents, &create_lower_dim_ents, PETSC_NULLPTR);
92 CHKERR PetscOptionsBool(
"-block_tags",
"only block and meshsests tags",
"",
93 only_tags, &only_tags, PETSC_NULLPTR);
97 auto get_dim = [](
const Range &ents) ->
int {
98 for (
int d : {3, 2, 1})
99 if (ents.num_of_dimension(d))
114 for (
auto cit = meshsets_interface_ptr->getBegin();
115 cit != meshsets_interface_ptr->getEnd(); cit++) {
117 CHKERR m_field.
get_moab().get_entities_by_handle(cit->getMeshset(), ents,
119 min_dim = std::min(min_dim, get_dim(ents));
124 MPI_Allreduce(&min_dim, &g_dim, 1, MPI_INT, MPI_MIN, m_field.
get_comm());
125 if (g_dim < adj_dim) {
127 <<
"The minimum meshsets dimension is = " << min_dim;
129 if (adj_dim >= dim) {
131 <<
"The -adj_dim >= dim, adj_dim = " << adj_dim <<
" dim = " << dim;
137 CHKERR moab.get_entities_by_dimension(0, dim, ents_dim,
false);
138 if (create_lower_dim_ents) {
141 CHKERR moab.get_adjacencies(ents_dim, 2,
true, faces,
142 moab::Interface::UNION);
146 CHKERR moab.get_adjacencies(ents_dim, 1,
true, edges,
147 moab::Interface::UNION);
152 ents_dim, dim, adj_dim, n_partas,
nullptr,
nullptr,
nullptr,
VERBOSE);
155 auto get_tag_list = [&]() {
156 std::vector<Tag> tags_list;
159 for (
auto &
m : list) {
160 auto meshset =
m.getMeshset();
161 std::vector<Tag> tmp_tags_list;
164 for (
auto t : tmp_tags_list) {
165 tags_list.push_back(
t);
175 auto tags_list = get_tag_list();
176 std::sort(tags_list.begin(), tags_list.end());
177 auto new_end = std::unique(tags_list.begin(), tags_list.end());
178 tags_list.resize(std::distance(tags_list.begin(), new_end));
179 tags_list.push_back(pcomm->part_tag());
181 CHKERR moab.write_file(mesh_out_file,
"MOAB",
"", &root_mesh, 1,
182 &*tags_list.begin(), tags_list.size());
184 CHKERR moab.write_file(mesh_out_file,
"MOAB",
"");
186 MOFEM_LOG(
"WORLD", Sev::inform) <<
"Wrote file " << mesh_out_file;
MoFEMErrorCode partitionMesh(const Range &ents, const int dim, const int adj_dim, const int n_parts, Tag *th_vertex_weights=nullptr, Tag *th_edge_weights=nullptr, Tag *th_part_weights=nullptr, int verb=VERBOSE, const bool debug=false)
Set partition tag to each finite element in the problem.