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.