46 const
bool allow_artificial_cells,
52 , allow_artificial_cells(allow_artificial_cells)
54 const auto partition_settings =
55 (partition_zoltan | partition_metis | partition_zorder |
56 partition_custom_signal) &
58 (void)partition_settings;
59 Assert(partition_settings == partition_auto ||
60 partition_settings == partition_metis ||
61 partition_settings == partition_zoltan ||
62 partition_settings == partition_zorder ||
63 partition_settings == partition_custom_signal,
64 ExcMessage(
"Settings must contain exactly one type of the active "
65 "cell partitioning scheme."));
67 if (settings & construct_multigrid_hierarchy)
68 Assert(allow_artificial_cells,
69 ExcMessage(
"construct_multigrid_hierarchy requires "
70 "allow_artificial_cells to be set to true."));
93 const unsigned int max_active_cells =
95 this->get_mpi_communicator());
97 max_active_cells == this->n_active_cells(),
99 "A parallel::shared::Triangulation needs to be refined in the same "
100 "way on all processors, but the participating processors don't "
101 "agree on the number of active cells."));
104 auto partition_settings = (partition_zoltan | partition_metis |
105 partition_zorder | partition_custom_signal) &
107 if (partition_settings == partition_auto)
108# ifdef DEAL_II_TRILINOS_WITH_ZOLTAN
109 partition_settings = partition_zoltan;
110# elif defined DEAL_II_WITH_METIS
111 partition_settings = partition_metis;
113 partition_settings = partition_zorder;
116 if (partition_settings == partition_zoltan)
118# ifndef DEAL_II_TRILINOS_WITH_ZOLTAN
121 "Choosing 'partition_zoltan' requires the library "
122 "to be compiled with support for Zoltan! "
123 "Instead, you might use 'partition_auto' to select "
124 "a partitioning algorithm that is supported "
125 "by your current configuration."));
131 else if (partition_settings == partition_metis)
133# ifndef DEAL_II_WITH_METIS
136 "Choosing 'partition_metis' requires the library "
137 "to be compiled with support for METIS! "
138 "Instead, you might use 'partition_auto' to select "
139 "a partitioning algorithm that is supported "
140 "by your current configuration."));
147 else if (partition_settings == partition_zorder)
151 else if (partition_settings == partition_custom_signal)
162 if ((settings & construct_multigrid_hierarchy) &&
163 !(settings & partition_custom_signal))
166 true_subdomain_ids_of_cells.resize(this->n_active_cells());
170 spacedim>::active_cell_iterator
171 cell = this->begin_active(),
174 if (allow_artificial_cells)
185 spacedim>::active_cell_iterator>
186 active_halo_layer_vector =
189 std::set<typename parallel::shared::Triangulation<dim, spacedim>::
190 active_cell_iterator>
191 active_halo_layer(active_halo_layer_vector.begin(),
192 active_halo_layer_vector.end());
194 for (
unsigned int index = 0; cell != endc; cell++, index++)
197 true_subdomain_ids_of_cells[index] = cell->subdomain_id();
199 if (cell->is_locally_owned() ==
false &&
200 active_halo_layer.find(cell) == active_halo_layer.end())
205 if (settings & construct_multigrid_hierarchy)
207 true_level_subdomain_ids_of_cells.resize(this->n_levels());
213 for (
unsigned int lvl = 0; lvl < this->n_levels(); ++lvl)
215 true_level_subdomain_ids_of_cells[lvl].resize(
220 spacedim>::cell_iterator>
221 level_halo_layer_vector =
223 *
this, predicate, lvl);
224 std::set<
typename parallel::shared::
225 Triangulation<dim, spacedim>::cell_iterator>
226 level_halo_layer(level_halo_layer_vector.begin(),
227 level_halo_layer_vector.end());
230 cell_iterator cell = this->begin(lvl),
231 endc = this->end(lvl);
232 for (
unsigned int index = 0; cell != endc; cell++, index++)
236 true_level_subdomain_ids_of_cells[lvl][index] =
237 cell->level_subdomain_id();
246 if (cell->is_active() &&
247 cell->subdomain_id() !=
252 if (cell->has_children())
254 bool keep_cell =
false;
255 for (
unsigned int c = 0;
256 c < GeometryInfo<dim>::max_children_per_cell;
258 if (cell->child(c)->level_subdomain_id() ==
270 if (!cell->is_locally_owned_on_level() &&
271 level_halo_layer.find(cell) != level_halo_layer.
end())
275 cell->set_level_subdomain_id(
284 for (
unsigned int index = 0; cell != endc; cell++, index++)
285 true_subdomain_ids_of_cells[index] = cell->subdomain_id();
292 const unsigned int n_my_cells = std::count_if(
293 this->begin_active(),
296 [](
const auto &i) {
return (i.is_locally_owned()); });
298 const unsigned int total_cells =
300 Assert(total_cells == this->n_active_cells(),
301 ExcMessage(
"Not all cells are assigned to a processor."));
306 if (settings & construct_multigrid_hierarchy)
308 const unsigned int n_my_cells =
309 std::count_if(this->begin(), this->end(), [](
const auto &i) {
310 return (i.is_locally_owned_on_level());
314 const unsigned int total_cells =
316 Assert(total_cells == this->n_cells(),
317 ExcMessage(
"Not all cells are assigned to a processor."));
375 using int_type = std::underlying_type_t<
377 static_assert(
sizeof(int_type) ==
sizeof(std::uint8_t),
378 "Internal type mismatch.");
380 std::vector<int_type> refinement_configurations(this->n_active_cells() *
383 for (
const auto &cell : this->active_cell_iterators())
384 if (cell->is_locally_owned())
386 refinement_configurations[cell->active_cell_index() * 2 + 0] =
387 static_cast<int_type
>(cell->refine_flag_set());
388 refinement_configurations[cell->active_cell_index() * 2 + 1] =
389 static_cast<int_type
>(cell->coarsen_flag_set() ? 1 : 0);
393 this->get_mpi_communicator(),
394 refinement_configurations);
396 for (
const auto &cell : this->active_cell_iterators())
398 cell->clear_refine_flag();
399 cell->clear_coarsen_flag();
402 (refinement_configurations[cell->active_cell_index() * 2 + 0] >
406 refinement_configurations[cell->active_cell_index() * 2 +
410 "Refinement/coarsening flags of cells are not consistent in parallel!"));
412 if (refinement_configurations[cell->active_cell_index() * 2 + 0] !=
415 refinement_configurations[cell->active_cell_index() * 2 + 0]));
417 if (refinement_configurations[cell->active_cell_index() * 2 + 1] >
419 cell->set_coarsen_flag();
425 this->update_number_cache();
const ObserverPointer< const ::parallel::shared::Triangulation< dim, spacedim > > shared_tria
TemporarilyRestoreSubdomainIds(const Triangulation< dim, spacedim > &tria)