33 template <
int dim,
int spacedim>
35 add_indices_recursively_for_first_child_policy(
42 if (cell->level() > 0 && cell->parent()->child(0) == cell)
43 add_indices_recursively_for_first_child_policy(cell->parent(),
50 template <
int dim,
int spacedim>
55 template <
int dim,
int spacedim>
70#ifndef DEAL_II_WITH_MPI
78 tria->n_locally_owned_active_cells() > 0;
86 unsigned int offset = 0;
108 template <
int dim,
int spacedim>
111 : n_coarse_cells(
tria_fine.n_global_coarse_cells())
112 , n_global_levels(
tria_fine.n_global_levels())
115 tria_fine.all_reference_cells_are_hyper_cube(),
117 "FirstChildPolicy is only working for pure hex meshes at the moment."))
123 for (
const auto &cell :
tria_fine.active_cell_iterators())
124 if (cell->is_locally_owned())
132 template <
int dim,
int spacedim>
145 if (cell->is_locally_owned())
152 process(is_level_partitions,
160 std::pair<types::global_cell_index, types::global_cell_index>>,
161 std::vector<unsigned int>>
177 partition[cell->global_active_cell_index()] =
185 template <
int dim,
int spacedim>
187 const unsigned int n_min_cells)
188 : n_min_cells(n_min_cells)
193 template <
int dim,
int spacedim>
209 const unsigned int n_locally_owned_active_cells =
210 std::count_if(
tria_in.begin_active(),
213 [](
const auto &cell) { return cell.is_locally_owned(); });
225 tria_in.n_global_active_cells();
228 std::max<unsigned int>(1,
229 std::min<types::global_cell_index>(
230 n_global_active_cells / n_min_cells,
235 const auto convert = [&](
const unsigned int i) {
243 const unsigned int rank =
253 for (
const auto i :
partition.locally_owned_elements())
261 template <
int dim,
int spacedim>
267 : weighting_function(weighting_function)
272 template <
int dim,
int spacedim>
277#ifndef DEAL_II_WITH_MPI
288 const auto partitioner =
291 std::vector<unsigned int> weights(partitioner->locally_owned_size());
293 const auto mpi_communicator =
tria_in.get_communicator();
297 for (
const auto &cell :
299 weights[partitioner->global_to_local(cell->global_active_cell_index())] =
305 for (
const auto &weight : weights)
337 weight += weights[i], ++i)
339 static_cast<double>(weight * n_subdomains /
total_weight);
351#include "repartitioning_policy_tools.inst"
void set_size(const size_type size)
void add_index(const size_type index)
virtual MPI_Comm get_communicator() const
virtual const std::weak_ptr< const Utilities::MPI::Partitioner > global_active_cell_index_partitioner() const
types::global_cell_index translate(const TriaIterator< Accessor > &cell) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
IteratorRange< active_cell_iterator > active_cell_iterators() const
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcNeedsMPI()
#define Assert(cond, exc)
#define AssertThrowMPI(error_code)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
T sum(const T &t, const MPI_Comm mpi_communicator)
unsigned int n_mpi_processes(const MPI_Comm mpi_communicator)
T min(const T &t, const MPI_Comm mpi_communicator)
const MPI_Datatype mpi_type_id_for_type
const ::Triangulation< dim, spacedim > & tria