31template <
int structdim>
40template <
int structdim>
47 for (
unsigned int i = 0; i <
vertices.size(); ++i)
87 template <
int dim,
int spacedim>
89 set_user_flag_and_of_its_parents(
92 cell->set_user_flag();
93 if (cell->level() != 0)
94 set_user_flag_and_of_its_parents(cell->parent());
99 template <
int dim,
int spacedim>
100 Description<dim, spacedim>
102 const ::Triangulation<dim, spacedim> &tria,
105 const unsigned int my_rank_in)
107 if (
auto tria_pdt =
dynamic_cast<
110 ExcMessage(
"MPI communicators do not match."));
114 unsigned int my_rank = my_rank_in;
117 ExcMessage(
"Rank has to be smaller than available processes."));
119 if (
auto tria_pdt =
dynamic_cast<
126 "If parallel::distributed::Triangulation as source triangulation, my_rank has to equal global rank."));
130 else if (
auto tria_serial =
131 dynamic_cast<const ::Triangulation<dim, spacedim> *
>(
140 ExcMessage(
"This type of triangulation is not supported!"));
143 Description<dim, spacedim> construction_data;
146 construction_data.comm =
comm;
149 std::map<unsigned int, std::vector<unsigned int>>
150 coinciding_vertex_groups;
151 std::map<unsigned int, unsigned int> vertex_to_coinciding_vertex_group;
154 coinciding_vertex_groups,
155 vertex_to_coinciding_vertex_group);
159 auto add_vertices_of_cell_to_vertices_owned_by_locally_owned_cells =
160 [coinciding_vertex_groups, vertex_to_coinciding_vertex_group](
162 std::vector<bool> &vertices_owned_by_locally_owned_cells) {
164 for (
const auto v : cell->vertex_indices())
166 vertices_owned_by_locally_owned_cells[cell->vertex_index(v)] =
168 const auto coinciding_vertex_group =
169 vertex_to_coinciding_vertex_group.find(cell->vertex_index(v));
170 if (coinciding_vertex_group !=
171 vertex_to_coinciding_vertex_group.end())
172 for (
const auto &co_vertex : coinciding_vertex_groups.at(
173 coinciding_vertex_group->second))
174 vertices_owned_by_locally_owned_cells[co_vertex] =
true;
178 construction_data.smoothing = tria.get_mesh_smoothing();
179 construction_data.settings = settings;
181 const bool construct_multigrid =
188 (tria.get_mesh_smoothing() &
191 "Source triangulation has to be setup with limit_level_difference_at_vertices if the construction of the multigrid hierarchy is requested!"));
194 std::vector<bool> old_user_flags;
195 tria.save_user_flags(old_user_flags);
203 for (
int level = tria.get_triangulation().n_global_levels() - 1;
209 std::vector<bool> vertices_owned_by_locally_owned_cells_on_level(
211 for (
auto cell : tria.cell_iterators_on_level(
level))
212 if ((construct_multigrid &&
213 (cell->level_subdomain_id() == my_rank)) ||
214 (cell->is_active() && cell->subdomain_id() == my_rank))
215 add_vertices_of_cell_to_vertices_owned_by_locally_owned_cells(
216 cell, vertices_owned_by_locally_owned_cells_on_level);
218 for (
auto cell : tria.active_cell_iterators())
219 if (cell->subdomain_id() == my_rank)
220 add_vertices_of_cell_to_vertices_owned_by_locally_owned_cells(
221 cell, vertices_owned_by_locally_owned_cells_on_level);
226 const auto is_locally_relevant_on_level =
228 for (
const auto v : cell->vertex_indices())
229 if (vertices_owned_by_locally_owned_cells_on_level
230 [cell->vertex_index(v)])
236 for (
auto cell : tria.cell_iterators_on_level(
level))
237 if (is_locally_relevant_on_level(cell))
238 set_user_flag_and_of_its_parents(cell);
243 std::map<unsigned int, unsigned int> vertices_locally_relevant;
246 for (
auto cell : tria.cell_iterators_on_level(0))
248 if (!cell->user_flag_set())
253 cell_data.material_id = cell->material_id();
254 cell_data.manifold_id = cell->manifold_id();
255 for (
const auto v : cell->vertex_indices())
256 cell_data.vertices[v] = cell->vertex_index(v);
257 construction_data.coarse_cells.push_back(cell_data);
260 for (
const auto v : cell->vertex_indices())
261 vertices_locally_relevant[cell->vertex_index(v)] =
265 construction_data.coarse_cell_index_to_coarse_cell_id.push_back(
266 cell->id().get_coarse_cell_id());
270 unsigned int vertex_counter = 0;
271 for (
auto &vertex : vertices_locally_relevant)
273 construction_data.coarse_cell_vertices.push_back(
274 tria.get_vertices()[vertex.first]);
275 vertex.second = vertex_counter++;
279 for (
auto &cell : construction_data.coarse_cells)
280 for (
unsigned int v = 0; v < cell.vertices.size(); ++v)
281 cell.vertices[v] = vertices_locally_relevant[cell.vertices[v]];
286 construction_data.cell_infos.resize(
287 tria.get_triangulation().n_global_levels());
290 std::vector<bool> vertices_owned_by_locally_owned_active_cells(
292 for (
auto cell : tria.active_cell_iterators())
293 if (cell->subdomain_id() == my_rank)
294 add_vertices_of_cell_to_vertices_owned_by_locally_owned_cells(
295 cell, vertices_owned_by_locally_owned_active_cells);
299 const auto is_locally_relevant_on_active_level =
301 if (cell->is_active())
302 for (
const auto v : cell->vertex_indices())
303 if (vertices_owned_by_locally_owned_active_cells
304 [cell->vertex_index(v)])
309 for (
unsigned int level = 0;
310 level < tria.get_triangulation().n_global_levels();
314 std::vector<bool> vertices_owned_by_locally_owned_cells_on_level(
316 for (
auto cell : tria.cell_iterators_on_level(
level))
317 if ((construct_multigrid &&
318 (cell->level_subdomain_id() == my_rank)) ||
319 (cell->is_active() && cell->subdomain_id() == my_rank))
320 add_vertices_of_cell_to_vertices_owned_by_locally_owned_cells(
321 cell, vertices_owned_by_locally_owned_cells_on_level);
325 const auto is_locally_relevant_on_level =
327 for (
const auto v : cell->vertex_indices())
328 if (vertices_owned_by_locally_owned_cells_on_level
329 [cell->vertex_index(v)])
334 auto &level_cell_infos = construction_data.cell_infos[
level];
335 for (
auto cell : tria.cell_iterators_on_level(
level))
338 if (!(cell->user_flag_set()))
344 cell_info.id = cell->id().template to_binary<dim>();
347 for (
const auto f : cell->face_indices())
350 cell->face(f)->boundary_id();
352 cell_info.boundary_ids.emplace_back(f, boundary_ind);
362 for (
const auto line : cell->line_indices())
363 cell_info.manifold_line_ids[line] =
368 for (
const auto f : cell->face_indices())
369 cell_info.manifold_quad_ids[f] =
377 if (is_locally_relevant_on_active_level(cell))
379 cell_info.level_subdomain_id = cell->level_subdomain_id();
380 cell_info.subdomain_id = cell->subdomain_id();
382 else if (is_locally_relevant_on_level(cell))
384 cell_info.level_subdomain_id = cell->level_subdomain_id();
388 level_cell_infos.emplace_back(cell_info);
395 return construction_data;
400 template <
int dim,
int spacedim>
401 Description<dim, spacedim>
404 & serial_grid_generator,
407 const unsigned int)> &serial_grid_partitioner,
409 const int group_size,
413#ifndef DEAL_II_WITH_MPI
414 (void)serial_grid_generator;
415 (void)serial_grid_partitioner;
423 const unsigned int my_rank =
425 const unsigned int group_root = (my_rank / group_size) * group_size;
431 if (my_rank == group_root)
438 typename ::Triangulation<dim, spacedim>::MeshSmoothing
>(
441 spacedim>::limit_level_difference_at_vertices) :
443 serial_grid_generator(tria);
446 serial_grid_partitioner(tria,
comm, group_size);
453 const unsigned int end_group =
461 for (
unsigned int other_rank = group_root + 1; other_rank < end_group;
465 const auto construction_data =
471 std::vector<char> buffer;
475 const auto ierr = MPI_Send(buffer.data(),
497 auto ierr = MPI_Probe(group_root, mpi_tag,
comm, &status);
501 MPI_Get_count(&status, MPI_CHAR, &len);
503 std::vector<char> buf(len);
504 ierr = MPI_Recv(buf.data(),
515 auto construction_data =
516 ::Utilities::template unpack<Description<dim, spacedim>>(
521 construction_data.comm =
comm;
523 return construction_data;
534#include "tria_description.inst"
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertThrowMPI(error_code)
static ::ExceptionBase & ExcMessage(std::string arg1)
void collect_coinciding_vertices(const Triangulation< dim, spacedim > &tria, std::map< unsigned int, std::vector< unsigned int > > &coinciding_vertex_groups, std::map< unsigned int, unsigned int > &vertex_to_coinciding_vertex_group)
Description< dim, spacedim > create_description_from_triangulation_in_groups(const std::function< void(::Triangulation< dim, spacedim > &)> &serial_grid_generator, const std::function< void(::Triangulation< dim, spacedim > &, const MPI_Comm &, const unsigned int)> &serial_grid_partitioner, const MPI_Comm &comm, const int group_size=1, const typename Triangulation< dim, spacedim >::MeshSmoothing smoothing=::Triangulation< dim, spacedim >::none, const TriangulationDescription::Settings setting=TriangulationDescription::Settings::default_setting)
Description< dim, spacedim > create_description_from_triangulation(const ::Triangulation< dim, spacedim > &tria, const MPI_Comm &comm, const TriangulationDescription::Settings settings=TriangulationDescription::Settings::default_setting, const unsigned int my_rank_in=numbers::invalid_unsigned_int)
@ construct_multigrid_hierarchy
unsigned int this_mpi_process(const MPI_Comm &mpi_communicator)
unsigned int n_mpi_processes(const MPI_Comm &mpi_communicator)
size_t pack(const T &object, std::vector< char > &dest_buffer, const bool allow_compression=true)
const types::boundary_id internal_face_boundary_id
const types::subdomain_id artificial_subdomain_id
static const unsigned int invalid_unsigned_int
const types::manifold_id flat_manifold_id
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
*braid_SplitCommworld & comm
std::vector< unsigned int > vertices
bool operator==(const CellData< structdim > &other) const
types::manifold_id manifold_id
CellData(const unsigned int n_vertices=GeometryInfo< structdim >::vertices_per_cell)
types::material_id material_id
types::boundary_id boundary_id
std::vector< CellData< 2 > > boundary_quads
bool check_consistency(const unsigned int dim) const
std::vector< CellData< 1 > > boundary_lines