v0.14.0
Loading...
Searching...
No Matches
mofem_part.cpp
Go to the documentation of this file.
1/** \file reading_med.cpp
2
3 \brief Partition mesh and configuring blocksets
4
5*/
6
7
8
9#include <MoFEM.hpp>
10using namespace MoFEM;
11
12static char help[] = "...\n\n";
13
14int main(int argc, char *argv[]) {
15
16 MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
17
18 try {
19
20 moab::Core mb_instance;
21 moab::Interface &moab = mb_instance;
22 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
23 if (pcomm == NULL)
24 pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
25
26 // global variables
27 char mesh_file_name[255];
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;
35 PetscInt dim = 3;
36 PetscInt adj_dim = 0;
37
38 ierr = PetscOptionsBegin(PETSC_COMM_WORLD, "", "none", "none");
39 CHKERRQ(ierr);
40
41 CHKERR PetscOptionsString("-my_file", "mesh file name", "", "mesh.h5m",
42 mesh_file_name, 255, &flg_file);
43 if (flg_file != PETSC_TRUE)
44 CHKERR PetscOptionsString("-file_name", "mesh file name", "", "mesh.h5m",
45 mesh_file_name, 255, &flg_file);
46 if (flg_file != PETSC_TRUE)
47 SETERRQ(PETSC_COMM_SELF, 1,
48 "*** ERROR -my_file (-file_name) (mesh file needed)");
49
50 const char *option;
51 option = "";
52 CHKERR moab.load_file(mesh_file_name, 0, option);
53
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);
60
61 if (!flg_n_part && !flg_part)
62 SETERRQ(PETSC_COMM_SELF, 1,
63 "*** ERROR partitioning number not given (-nparts)");
64
65 auto get_nb_ents_by_dim = [&](const int dim) {
66 int nb;
67 CHKERR moab.get_number_entities_by_dimension(0, dim, nb);
68 return nb;
69 };
70 for (; dim >= 0; dim--) {
71 if (get_nb_ents_by_dim(dim))
72 break;
73 }
74
75 if (!dim)
76 SETERRQ(PETSC_COMM_WORLD, MOFEM_DATA_INCONSISTENCY,
77 "Dimension of entities to partition not found");
78
79 CHKERR PetscOptionsInt("-dim", "entities dim", "", dim, &dim, PETSC_NULL);
80 // adj_dim = dim - 1;
81 CHKERR PetscOptionsInt("-adj_dim", "adjacency dim", "", adj_dim, &adj_dim,
82 PETSC_NULL);
83 CHKERR PetscOptionsBool(
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);
88
89 ierr = PetscOptionsEnd();
90 CHKERRQ(ierr);
91
92 auto get_dim = [](const Range &ents) -> int {
93 for (int d : {3, 2, 1})
94 if (ents.num_of_dimension(d))
95 return d;
96 return 0;
97 };
98
99 // Create MoFEM database
100 MoFEM::Core core(moab);
101 MoFEM::Interface &m_field = core;
102
103 auto meshsets_interface_ptr = m_field.getInterface<MeshsetsManager>();
104 CHKERR meshsets_interface_ptr->setMeshsetFromFile();
105
106 MOFEM_LOG_CHANNEL("WORLD");
107 MOFEM_LOG_TAG("WORLD", "mofem_part");
108 int min_dim = 3;
109 for (auto cit = meshsets_interface_ptr->getBegin();
110 cit != meshsets_interface_ptr->getEnd(); cit++) {
111 Range ents;
112 CHKERR m_field.get_moab().get_entities_by_handle(cit->getMeshset(), ents,
113 true);
114 min_dim = std::min(min_dim, get_dim(ents));
115 MOFEM_LOG("WORLD", Sev::inform) << *cit;
116 }
117
118 int g_dim; // global dimension
119 MPI_Allreduce(&min_dim, &g_dim, 1, MPI_INT, MPI_MIN, m_field.get_comm());
120 if (g_dim < adj_dim) {
121 MOFEM_LOG("WORLD", Sev::warning)
122 << "The minimum meshsets dimension is = " << min_dim;
123 }
124 if (adj_dim >= dim) {
125 MOFEM_LOG("WORLD", Sev::warning)
126 << "The -adj_dim >= dim, adj_dim = " << adj_dim << " dim = " << dim;
127 }
128 MOFEM_LOG_CHANNEL("WORLD");
129
130 {
131 Range ents_dim;
132 CHKERR moab.get_entities_by_dimension(0, dim, ents_dim, false);
133 if (create_lower_dim_ents) {
134 if (dim == 3) {
135 Range faces;
136 CHKERR moab.get_adjacencies(ents_dim, 2, true, faces,
137 moab::Interface::UNION);
138 }
139 if (dim > 2) {
140 Range edges;
141 CHKERR moab.get_adjacencies(ents_dim, 1, true, edges,
142 moab::Interface::UNION);
143 }
144 }
145 CommInterface *comm_interafce_ptr = m_field.getInterface<CommInterface>();
146 CHKERR comm_interafce_ptr->partitionMesh(
147 ents_dim, dim, adj_dim, n_partas, nullptr, nullptr, nullptr, VERBOSE);
148 }
149
150 auto get_tag_list = [&]() {
151 std::vector<Tag> tags_list;
152 auto meshsets_mng = m_field.getInterface<MeshsetsManager>();
153 auto &list = meshsets_mng->getMeshsetsMultindex();
154 for (auto &m : list) {
155 auto meshset = m.getMeshset();
156 std::vector<Tag> tmp_tags_list;
157 CHKERR m_field.get_moab().tag_get_tags_on_entity(meshset,
158 tmp_tags_list);
159 for (auto t : tmp_tags_list) {
160 tags_list.push_back(t);
161 }
162 }
163
164 return tags_list;
165 };
166
167 EntityHandle root_mesh = 0;
168 if (m_field.get_comm_rank() == 0) {
169 if (only_tags) {
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());
175 // tags_list.push_back(m_field.get_moab().globalId_tag());
176 CHKERR moab.write_file(mesh_out_file, "MOAB", "", &root_mesh, 1,
177 &*tags_list.begin(), tags_list.size());
178 } else {
179 CHKERR moab.write_file(mesh_out_file, "MOAB", "");
180 }
181 }
182 }
184
186 CHKERRQ(ierr);
187
188 return 0;
189}
int main()
Definition: adol-c_atom.cpp:46
@ VERBOSE
Definition: definitions.h:209
#define CATCH_ERRORS
Catch errors.
Definition: definitions.h:372
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:215
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
#define CHKERR
Inline error check.
Definition: definitions.h:535
const int dim
FTensor::Index< 'm', SPACE_DIM > m
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
Definition: LogManager.hpp:339
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
Definition: LogManager.hpp:284
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.
char mesh_file_name[255]
static char help[]
Definition: mofem_part.cpp:12
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Exceptions.hpp:76
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
constexpr double t
plate stiffness
Definition: plate.cpp:59
Managing BitRefLevels.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
Core (interface) class.
Definition: Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition: Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition: Core.cpp:112
Deprecated interface functions.
Interface for managing meshsets containing materials and boundary conditions.
CubitMeshSet_multiIndex & getMeshsetsMultindex()
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.