14#include <deal.II/base/mpi.templates.h>
33#ifdef DEAL_II_WITH_MPI
38 template <
int dim,
int spacedim>
52 const auto partition_settings =
61 ExcMessage(
"Settings must contain exactly one type of the active "
62 "cell partitioning scheme."));
66 ExcMessage(
"construct_multigrid_hierarchy requires "
67 "allow_artificial_cells to be set to true."));
72 template <
int dim,
int spacedim>
82 template <
int dim,
int spacedim>
90 const unsigned int max_active_cells =
96 "A parallel::shared::Triangulation needs to be refined in the same "
97 "way on all processors, but the participating processors don't "
98 "agree on the number of active cells."));
105# ifdef DEAL_II_TRILINOS_WITH_ZOLTAN
107# elif defined DEAL_II_WITH_METIS
115# ifndef DEAL_II_TRILINOS_WITH_ZOLTAN
118 "Choosing 'partition_zoltan' requires the library "
119 "to be compiled with support for Zoltan! "
120 "Instead, you might use 'partition_auto' to select "
121 "a partitioning algorithm that is supported "
122 "by your current configuration."));
130# ifndef DEAL_II_WITH_METIS
133 "Choosing 'partition_metis' requires the library "
134 "to be compiled with support for METIS! "
135 "Instead, you might use 'partition_auto' to select "
136 "a partitioning algorithm that is supported "
137 "by your current configuration."));
183 active_halo_layer_vector =
186 std::set<typename parallel::shared::Triangulation<dim, spacedim>::
187 active_cell_iterator>
188 active_halo_layer(active_halo_layer_vector.begin(),
189 active_halo_layer_vector.end());
191 for (
unsigned int index = 0; cell != endc; cell++, index++)
196 if (cell->is_locally_owned() ==
false &&
197 active_halo_layer.find(cell) == active_halo_layer.end())
210 for (
unsigned int lvl = 0; lvl < this->
n_levels(); ++lvl)
218 level_halo_layer_vector =
220 *
this, predicate, lvl);
221 std::set<
typename parallel::shared::
222 Triangulation<dim, spacedim>::cell_iterator>
223 level_halo_layer(level_halo_layer_vector.begin(),
224 level_halo_layer_vector.end());
227 cell_iterator cell = this->
begin(lvl),
228 endc = this->
end(lvl);
229 for (
unsigned int index = 0; cell != endc; cell++, index++)
234 cell->level_subdomain_id();
243 if (cell->is_active() &&
244 cell->subdomain_id() !=
249 if (cell->has_children())
251 bool keep_cell =
false;
252 for (
unsigned int c = 0; c < cell->n_children(); ++c)
253 if (cell->child(c)->level_subdomain_id() ==
265 if (!cell->is_locally_owned_on_level() &&
266 level_halo_layer.find(cell) != level_halo_layer.
end())
270 cell->set_level_subdomain_id(
279 for (
unsigned int index = 0; cell != endc; cell++,
index++)
280 true_subdomain_ids_of_cells[
index] = cell->subdomain_id();
287 const unsigned int n_my_cells = std::count_if(
291 [](
const auto &i) {
return (i.is_locally_owned()); });
293 const unsigned int total_cells =
296 ExcMessage(
"Not all cells are assigned to a processor."));
303 const unsigned int n_my_cells =
304 std::count_if(this->
begin(), this->
end(), [](
const auto &i) {
305 return (i.is_locally_owned_on_level());
309 const unsigned int total_cells =
312 ExcMessage(
"Not all cells are assigned to a processor."));
319 template <
int dim,
int spacedim>
328 template <
int dim,
int spacedim>
330 const std::vector<types::subdomain_id>
338 template <
int dim,
int spacedim>
340 const std::vector<types::subdomain_id>
342 const unsigned int level)
const
354 template <
int dim,
int spacedim>
371 using int_type = std::underlying_type_t<
373 static_assert(
sizeof(int_type) ==
sizeof(std::uint8_t),
374 "Internal type mismatch.");
376 std::vector<int_type> refinement_configurations(this->
n_active_cells() *
380 if (cell->is_locally_owned())
382 refinement_configurations[cell->active_cell_index() * 2 + 0] =
383 static_cast<int_type
>(cell->refine_flag_set());
384 refinement_configurations[cell->active_cell_index() * 2 + 1] =
385 static_cast<int_type
>(cell->coarsen_flag_set() ? 1 : 0);
390 refinement_configurations);
394 cell->clear_refine_flag();
395 cell->clear_coarsen_flag();
398 (refinement_configurations[cell->active_cell_index() * 2 + 0] >
402 refinement_configurations[cell->active_cell_index() * 2 +
406 "Refinement/coarsening flags of cells are not consistent in parallel!"));
408 if (refinement_configurations[cell->active_cell_index() * 2 + 0] !=
411 refinement_configurations[cell->active_cell_index() * 2 + 0]));
413 if (refinement_configurations[cell->active_cell_index() * 2 + 1] >
415 cell->set_coarsen_flag();
422 template <
int dim,
int spacedim>
428 return ::Triangulation<dim, spacedim>::
429 prepare_coarsening_and_refinement();
434 template <
int dim,
int spacedim>
447 template <
int dim,
int spacedim>
460 const typename ::Triangulation<dim, spacedim>::DistortedCellList
473 template <
int dim,
int spacedim>
479 (void)construction_data;
486 template <
int dim,
int spacedim>
493 const ::parallel::DistributedTriangulationBase<dim, spacedim>
494 *
>(&other_tria) ==
nullptr),
496 "Cannot use this function on parallel::distributed::Triangulation."));
512 template <
int dim,
int spacedim>
522 template <
int dim,
int spacedim>
532 template <
int dim,
int spacedim>
534 const std::vector<unsigned int>
538 return true_subdomain_ids_of_cells;
543 template <
int dim,
int spacedim>
545 const std::vector<unsigned int>
547 const unsigned int)
const
550 return true_level_subdomain_ids_of_cells;
566 template <
int dim,
int spacedim>
578 const std::vector<types::subdomain_id> &true_subdomain_ids =
579 shared_tria->get_true_subdomain_ids_of_cells();
581 saved_subdomain_ids.resize(shared_tria->n_active_cells());
582 for (const auto &cell : shared_tria->active_cell_iterators())
584 const unsigned int index = cell->active_cell_index();
585 saved_subdomain_ids[index] = cell->subdomain_id();
586 cell->set_subdomain_id(true_subdomain_ids[index]);
593 template <
int dim,
int spacedim>
600 for (
const auto &cell :
shared_tria->active_cell_iterators())
602 const unsigned int index = cell->active_cell_index();
613#include "distributed/shared_tria.inst"
unsigned int n_active_cells() const
cell_iterator end() const
unsigned int n_cells() const
active_cell_iterator begin_active(const unsigned int level=0) const
std::vector< Point< spacedim > > vertices
unsigned int n_active_cells() const
unsigned int n_levels() const
unsigned int n_cells() const
MeshSmoothing smooth_grid
active_cell_iterator begin_active(const unsigned int level=0) const
std::vector< unsigned int > saved_subdomain_ids
const ObserverPointer< const ::parallel::shared::Triangulation< dim, spacedim > > shared_tria
TemporarilyRestoreSubdomainIds(const Triangulation< dim, spacedim > &tria)
types::subdomain_id n_subdomains
const MPI_Comm mpi_communicator
virtual MPI_Comm get_mpi_communicator() const override
virtual void update_number_cache()
TriangulationBase(const MPI_Comm mpi_communicator, const typename ::Triangulation< dim, spacedim >::MeshSmoothing smooth_grid=(::Triangulation< dim, spacedim >::none), const bool check_for_distorted_cells=false)
types::subdomain_id my_subdomain
virtual void copy_triangulation(const ::Triangulation< dim, spacedim > &old_tria) override
virtual void execute_coarsening_and_refinement() override
std::vector< types::subdomain_id > true_subdomain_ids_of_cells
virtual void copy_triangulation(const ::Triangulation< dim, spacedim > &other_tria) override
const std::vector< types::subdomain_id > & get_true_subdomain_ids_of_cells() const
std::vector< std::vector< types::subdomain_id > > true_level_subdomain_ids_of_cells
@ partition_custom_signal
@ construct_multigrid_hierarchy
virtual bool prepare_coarsening_and_refinement() override
bool with_artificial_cells() const
const std::vector< types::subdomain_id > & get_true_level_subdomain_ids_of_cells(const unsigned int level) const
typename ::Triangulation< dim, spacedim >::cell_iterator cell_iterator
void communicate_coarsening_and_refinement_flags()
typename ::Triangulation< dim, spacedim >::active_cell_iterator active_cell_iterator
Triangulation(const MPI_Comm mpi_communicator, const typename ::Triangulation< dim, spacedim >::MeshSmoothing=(::Triangulation< dim, spacedim >::none), const bool allow_artificial_cells=false, const Settings settings=partition_auto)
virtual bool is_multilevel_hierarchy_constructed() const override
const bool allow_artificial_cells
virtual void create_triangulation(const std::vector< Point< spacedim > > &vertices, const std::vector< CellData< dim > > &cells, const SubCellData &subcelldata) override
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ASSERT_UNREACHABLE()
#define DEAL_II_NOT_IMPLEMENTED()
IteratorRange< active_cell_iterator > active_cell_iterators() const
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
T sum(const T &t, const MPI_Comm mpi_communicator)
T max(const T &t, const MPI_Comm mpi_communicator)
constexpr types::subdomain_id artificial_subdomain_id