From 6c66b24dc1590dbaa460f2250c113402f7259265 Mon Sep 17 00:00:00 2001 From: Peter Munch Date: Sat, 28 Aug 2021 15:41:51 +0200 Subject: [PATCH] Allow to partition levels in TriangulationDescription::Utilities::create_description_from_triangulation() --- include/deal.II/grid/tria_description.h | 20 +- source/grid/tria_description.cc | 105 ++++++- source/grid/tria_description.inst.in | 11 +- .../repartitioning_01.cc | 10 +- .../repartitioning_06.cc | 160 ++++++++++ ...tioning_06.with_p4est=true.mpirun=4.output | 287 ++++++++++++++++++ 6 files changed, 582 insertions(+), 11 deletions(-) create mode 100644 tests/fullydistributed_grids/repartitioning_06.cc create mode 100644 tests/fullydistributed_grids/repartitioning_06.with_p4est=true.mpirun=4.output diff --git a/include/deal.II/grid/tria_description.h b/include/deal.II/grid/tria_description.h index b0a12d3f02..0a75e87d24 100644 --- a/include/deal.II/grid/tria_description.h +++ b/include/deal.II/grid/tria_description.h @@ -501,6 +501,9 @@ namespace TriangulationDescription * CellAccessor::global_active_cell_index()). This function allows to * repartition distributed Triangulation objects. * + * If the setup of multigrid levels is requested, they are partitioned + * according to a first-child policy. + * * @note The communicator is extracted from the vector @p partition. * * @note The triangulation @p tria can be set up on a subcommunicator of the @@ -515,8 +518,23 @@ namespace TriangulationDescription Description create_description_from_triangulation( const Triangulation & tria, - const LinearAlgebra::distributed::Vector &partition); + const LinearAlgebra::distributed::Vector &partition, + const TriangulationDescription::Settings settings = + TriangulationDescription::Settings::default_setting); + /** + * Similar to the above function but allowing the user to prescribe the + * partitioning of the multigrid levels. + */ + template + Description + create_description_from_triangulation( + const Triangulation & tria, + const LinearAlgebra::distributed::Vector &partition, + const std::vector> + & mg_partitions, + const TriangulationDescription::Settings settings = + TriangulationDescription::Settings::default_setting); /** * Construct a TriangulationDescription::Description. In contrast diff --git a/source/grid/tria_description.cc b/source/grid/tria_description.cc index 37210bbb8c..3bb3e28a01 100644 --- a/source/grid/tria_description.cc +++ b/source/grid/tria_description.cc @@ -872,7 +872,77 @@ namespace TriangulationDescription Description create_description_from_triangulation( const Triangulation & tria, - const LinearAlgebra::distributed::Vector &partition) + const LinearAlgebra::distributed::Vector &partition, + const TriangulationDescription::Settings settings) + { + const bool construct_multigrid = + (partition.size() > 0) && + (settings & + TriangulationDescription::Settings::construct_multigrid_hierarchy); + + Assert( + construct_multigrid == false || + (tria.get_mesh_smoothing() & + Triangulation::limit_level_difference_at_vertices), + ExcMessage( + "Source triangulation has to be set up with " + "limit_level_difference_at_vertices if the construction of the " + "multigrid hierarchy is requested!")); + + std::vector> partitions_mg; + + if (construct_multigrid) // perform first child policy + { + const auto tria_parallel = + dynamic_cast *>( + &tria); + + Assert(tria_parallel, ExcInternalError()); + + partition.update_ghost_values(); + + partitions_mg.resize(tria.n_global_levels()); + + for (unsigned int l = 0; l < tria.n_global_levels(); ++l) + partitions_mg[l].reinit( + tria_parallel->global_level_cell_index_partitioner(l).lock()); + + for (int level = tria.n_global_levels() - 1; level >= 0; --level) + { + for (const auto &cell : tria.cell_iterators_on_level(level)) + { + if (cell->is_locally_owned_on_level() == false) + continue; + + if (cell->is_active()) + partitions_mg[level][cell->global_level_cell_index()] = + partition[cell->global_active_cell_index()]; + else + partitions_mg[level][cell->global_level_cell_index()] = + partitions_mg[level + 1] + [cell->child(0)->global_level_cell_index()]; + } + + partitions_mg[level].update_ghost_values(); + } + } + + return create_description_from_triangulation(tria, + partition, + partitions_mg, + settings); + } + + + + template + Description + create_description_from_triangulation( + const Triangulation & tria, + const LinearAlgebra::distributed::Vector &partition, + const std::vector> + & partitions_mg, + const TriangulationDescription::Settings settings_in) { #ifdef DEAL_II_WITH_MPI if (tria.get_communicator() == MPI_COMM_NULL) @@ -881,12 +951,17 @@ namespace TriangulationDescription if (partition.size() == 0) { + AssertDimension(partitions_mg.size(), 0); return create_description_from_triangulation(tria, - tria.get_communicator()); + tria.get_communicator(), + settings_in); } partition.update_ghost_values(); + for (const auto &partition : partitions_mg) + partition.update_ghost_values(); + // 1) determine processes owning locally owned cells const std::vector relevant_processes = [&]() { std::set relevant_processes; @@ -895,12 +970,23 @@ namespace TriangulationDescription relevant_processes.insert( static_cast(partition.local_element(i))); + for (const auto &partition : partitions_mg) + for (unsigned int i = 0; i < partition.local_size(); ++i) + relevant_processes.insert( + static_cast(partition.local_element(i))); + return std::vector(relevant_processes.begin(), relevant_processes.end()); }(); - TriangulationDescription::Settings settings = - TriangulationDescription::Settings::default_setting; + const bool construct_multigrid = partitions_mg.size() > 0; + + TriangulationDescription::Settings settings = settings_in; + + if (construct_multigrid) + settings = static_cast( + settings | + TriangulationDescription::Settings::construct_multigrid_hierarchy); const auto subdomain_id_function = [&partition](const auto &cell) { if ((cell->is_active() && (cell->is_artificial() == false))) @@ -910,9 +996,14 @@ namespace TriangulationDescription return numbers::artificial_subdomain_id; }; - const auto level_subdomain_id_function = [](const auto & /*cell*/) { - return numbers::artificial_subdomain_id; - }; + const auto level_subdomain_id_function = + [&construct_multigrid, &partitions_mg](const auto &cell) { + if (construct_multigrid && (cell->is_artificial_on_level() == false)) + return static_cast( + partitions_mg[cell->level()][cell->global_level_cell_index()]); + else + return numbers::artificial_subdomain_id; + }; CreateDescriptionFromTriangulationHelper helper( tria, diff --git a/source/grid/tria_description.inst.in b/source/grid/tria_description.inst.in index fca624f43e..1cacb8c06c 100644 --- a/source/grid/tria_description.inst.in +++ b/source/grid/tria_description.inst.in @@ -49,7 +49,16 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS) template Description create_description_from_triangulation( const Triangulation &tria, - const LinearAlgebra::distributed::Vector &partition); + const LinearAlgebra::distributed::Vector &partition, + const TriangulationDescription::Settings settings); + + template Description + create_description_from_triangulation( + const Triangulation &tria, + const LinearAlgebra::distributed::Vector &partition, + const std::vector> + & mg_partitions, + const TriangulationDescription::Settings settings); #endif \} \} diff --git a/tests/fullydistributed_grids/repartitioning_01.cc b/tests/fullydistributed_grids/repartitioning_01.cc index f840ea9ba8..0be4c56f4b 100644 --- a/tests/fullydistributed_grids/repartitioning_01.cc +++ b/tests/fullydistributed_grids/repartitioning_01.cc @@ -67,7 +67,10 @@ template void test(const MPI_Comm comm, const unsigned int n_partitions) { - parallel::distributed::Triangulation tria(comm); + parallel::distributed::Triangulation tria( + comm, + Triangulation::none, + parallel::distributed::Triangulation::construct_multigrid_hierarchy); GridGenerator::subdivided_hyper_cube(tria, 4); tria.refine_global(3); @@ -77,7 +80,9 @@ test(const MPI_Comm comm, const unsigned int n_partitions) // repartition triangulation so that it has strided partitioning const auto construction_data = TriangulationDescription::Utilities::create_description_from_triangulation( - tria, partition_new); + tria, + partition_new, + TriangulationDescription::Settings::construct_multigrid_hierarchy); parallel::fullydistributed::Triangulation tria_pft(comm); tria_pft.create_triangulation(construction_data); @@ -85,6 +90,7 @@ test(const MPI_Comm comm, const unsigned int n_partitions) FE_Q fe(2); DoFHandler dof_handler(tria_pft); dof_handler.distribute_dofs(fe); + dof_handler.distribute_mg_dofs(); // print statistics print_statistics(tria_pft); diff --git a/tests/fullydistributed_grids/repartitioning_06.cc b/tests/fullydistributed_grids/repartitioning_06.cc new file mode 100644 index 0000000000..4aebe0fa11 --- /dev/null +++ b/tests/fullydistributed_grids/repartitioning_06.cc @@ -0,0 +1,160 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2021 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + + +// Test +// TriangulationDescription::Utilities::create_description_from_triangulation() +// so that it also works for p:d:T set up on a subcommunicator. + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include + +#include "./tests.h" + +using namespace dealii; + +namespace dealii +{ + namespace parallel + { + template + std::function< + unsigned int(const typename Triangulation::cell_iterator &, + const typename Triangulation::CellStatus)> + hanging_nodes_weighting(const double weight) + { + return [weight](const auto &cell, const auto &) -> unsigned int { + if (cell->is_locally_owned() == false) + return 0; + + bool flag = false; + + for (const auto f : cell->face_indices()) + if (!cell->at_boundary(f) && + (cell->neighbor(f)->has_children() || + cell->level() != cell->neighbor(f)->level())) + flag = true; + + if (flag) + return 10000 * weight; + else + return 10000; + }; + } + } // namespace parallel +} // namespace dealii + + +template +void +create_triangulation(Triangulation &tria) +{ + const unsigned int n_ref_global = 3; + const unsigned int n_ref_local = 3; + GridGenerator::hyper_cube(tria, -1.0, +1.0); + tria.refine_global(n_ref_global); + + for (unsigned int i = 0; i < n_ref_local; ++i) + { + for (auto cell : tria.active_cell_iterators()) + if (cell->is_locally_owned()) + { + bool flag = true; + for (unsigned int d = 0; d < dim; ++d) + if (cell->center()[d] > 0.0) + flag = false; + if (flag) + cell->set_refine_flag(); + } + tria.execute_coarsening_and_refinement(); + } +} + + +template +void +test(const MPI_Comm comm) +{ + parallel::distributed::Triangulation tria( + comm, + Triangulation::none, + parallel::distributed::Triangulation::construct_multigrid_hierarchy); + create_triangulation(tria); + + const RepartitioningPolicyTools::FirstChildPolicy policy(tria); + + // const RepartitioningPolicyTools::CellWeightPolicy + // policy(parallel::hanging_nodes_weighting(2.0)); + + const auto construction_data = + TriangulationDescription::Utilities::create_description_from_triangulation( + tria, + policy.partition(tria), + TriangulationDescription::Settings::construct_multigrid_hierarchy); + + parallel::fullydistributed::Triangulation tria_pft(comm); + tria_pft.create_triangulation(construction_data); + + if (false) + { + GridOut grid_out; + grid_out.write_mesh_per_processor_as_vtu(tria_pft, "test", true, true); + } + + FE_Q fe(2); + + DoFHandler dof_handler(tria); + dof_handler.distribute_dofs(fe); + dof_handler.distribute_mg_dofs(); + + DoFHandler dof_handler_pft(tria_pft); + dof_handler_pft.distribute_dofs(fe); + dof_handler_pft.distribute_mg_dofs(); + + // print statistics + print_statistics(tria, true); + print_statistics(tria_pft, true); + print_statistics(dof_handler, true); + print_statistics(dof_handler_pft, true); +} + + + +int +main(int argc, char **argv) +{ + Utilities::MPI::MPI_InitFinalize mpi(argc, argv, 1); + MPILogInitAll all; + + MPI_Comm comm = MPI_COMM_WORLD; + + deallog.push("all"); + test<2>(comm); + deallog.pop(); +} diff --git a/tests/fullydistributed_grids/repartitioning_06.with_p4est=true.mpirun=4.output b/tests/fullydistributed_grids/repartitioning_06.with_p4est=true.mpirun=4.output new file mode 100644 index 0000000000..80d065ad9c --- /dev/null +++ b/tests/fullydistributed_grids/repartitioning_06.with_p4est=true.mpirun=4.output @@ -0,0 +1,287 @@ + +DEAL:0:all::n_levels: 7 +DEAL:0:all::n_cells: 577 +DEAL:0:all::n_active_cells: 433 +DEAL:0:all::n_cells on level=0: 1 +DEAL:0:all::n_cells on level=1: 4 +DEAL:0:all::n_cells on level=2: 16 +DEAL:0:all::n_cells on level=3: 24 +DEAL:0:all::n_cells on level=4: 44 +DEAL:0:all::n_cells on level=5: 116 +DEAL:0:all::n_cells on level=6: 372 +DEAL:0:all::n_active_cells on level=0: 0 +DEAL:0:all::n_active_cells on level=1: 0 +DEAL:0:all::n_active_cells on level=2: 10 +DEAL:0:all::n_active_cells on level=3: 13 +DEAL:0:all::n_active_cells on level=4: 15 +DEAL:0:all::n_active_cells on level=5: 23 +DEAL:0:all::n_active_cells on level=6: 372 +DEAL:0:all:: +DEAL:0:all::n_levels: 7 +DEAL:0:all::n_cells: 577 +DEAL:0:all::n_active_cells: 433 +DEAL:0:all::n_cells on level=0: 1 +DEAL:0:all::n_cells on level=1: 4 +DEAL:0:all::n_cells on level=2: 16 +DEAL:0:all::n_cells on level=3: 24 +DEAL:0:all::n_cells on level=4: 44 +DEAL:0:all::n_cells on level=5: 116 +DEAL:0:all::n_cells on level=6: 372 +DEAL:0:all::n_active_cells on level=0: 0 +DEAL:0:all::n_active_cells on level=1: 0 +DEAL:0:all::n_active_cells on level=2: 10 +DEAL:0:all::n_active_cells on level=3: 13 +DEAL:0:all::n_active_cells on level=4: 15 +DEAL:0:all::n_active_cells on level=5: 23 +DEAL:0:all::n_active_cells on level=6: 372 +DEAL:0:all:: +DEAL:0:all::n_dofs: 4813 +DEAL:0:all::n_locally_owned_dofs: 1233 +DEAL:0:all::n_dofs on level=0: 9 +DEAL:0:all::n_dofs on level=1: 25 +DEAL:0:all::n_dofs on level=2: 81 +DEAL:0:all::n_dofs on level=3: 289 +DEAL:0:all::n_dofs on level=4: 441 +DEAL:0:all::n_dofs on level=5: 1369 +DEAL:0:all::n_dofs on level=6: 4225 +DEAL:0:all::n_locally_owned_mg_dofs on level=0: 9 +DEAL:0:all::n_locally_owned_mg_dofs on level=1: 9 +DEAL:0:all::n_locally_owned_mg_dofs on level=2: 15 +DEAL:0:all::n_locally_owned_mg_dofs on level=3: 31 +DEAL:0:all::n_locally_owned_mg_dofs on level=4: 93 +DEAL:0:all::n_locally_owned_mg_dofs on level=5: 329 +DEAL:0:all::n_locally_owned_mg_dofs on level=6: 1233 +DEAL:0:all:: +DEAL:0:all::n_dofs: 4813 +DEAL:0:all::n_locally_owned_dofs: 1233 +DEAL:0:all::n_dofs on level=0: 9 +DEAL:0:all::n_dofs on level=1: 25 +DEAL:0:all::n_dofs on level=2: 81 +DEAL:0:all::n_dofs on level=3: 289 +DEAL:0:all::n_dofs on level=4: 441 +DEAL:0:all::n_dofs on level=5: 1369 +DEAL:0:all::n_dofs on level=6: 4225 +DEAL:0:all::n_locally_owned_mg_dofs on level=0: 9 +DEAL:0:all::n_locally_owned_mg_dofs on level=1: 9 +DEAL:0:all::n_locally_owned_mg_dofs on level=2: 15 +DEAL:0:all::n_locally_owned_mg_dofs on level=3: 31 +DEAL:0:all::n_locally_owned_mg_dofs on level=4: 93 +DEAL:0:all::n_locally_owned_mg_dofs on level=5: 329 +DEAL:0:all::n_locally_owned_mg_dofs on level=6: 1233 +DEAL:0:all:: + +DEAL:1:all::n_levels: 7 +DEAL:1:all::n_cells: 713 +DEAL:1:all::n_active_cells: 535 +DEAL:1:all::n_cells on level=0: 1 +DEAL:1:all::n_cells on level=1: 4 +DEAL:1:all::n_cells on level=2: 16 +DEAL:1:all::n_cells on level=3: 32 +DEAL:1:all::n_cells on level=4: 64 +DEAL:1:all::n_cells on level=5: 168 +DEAL:1:all::n_cells on level=6: 428 +DEAL:1:all::n_active_cells on level=0: 0 +DEAL:1:all::n_active_cells on level=1: 0 +DEAL:1:all::n_active_cells on level=2: 8 +DEAL:1:all::n_active_cells on level=3: 16 +DEAL:1:all::n_active_cells on level=4: 22 +DEAL:1:all::n_active_cells on level=5: 61 +DEAL:1:all::n_active_cells on level=6: 428 +DEAL:1:all:: +DEAL:1:all::n_levels: 7 +DEAL:1:all::n_cells: 713 +DEAL:1:all::n_active_cells: 535 +DEAL:1:all::n_cells on level=0: 1 +DEAL:1:all::n_cells on level=1: 4 +DEAL:1:all::n_cells on level=2: 16 +DEAL:1:all::n_cells on level=3: 32 +DEAL:1:all::n_cells on level=4: 64 +DEAL:1:all::n_cells on level=5: 168 +DEAL:1:all::n_cells on level=6: 428 +DEAL:1:all::n_active_cells on level=0: 0 +DEAL:1:all::n_active_cells on level=1: 0 +DEAL:1:all::n_active_cells on level=2: 8 +DEAL:1:all::n_active_cells on level=3: 16 +DEAL:1:all::n_active_cells on level=4: 22 +DEAL:1:all::n_active_cells on level=5: 61 +DEAL:1:all::n_active_cells on level=6: 428 +DEAL:1:all:: +DEAL:1:all::n_dofs: 4813 +DEAL:1:all::n_locally_owned_dofs: 1184 +DEAL:1:all::n_dofs on level=0: 9 +DEAL:1:all::n_dofs on level=1: 25 +DEAL:1:all::n_dofs on level=2: 81 +DEAL:1:all::n_dofs on level=3: 289 +DEAL:1:all::n_dofs on level=4: 441 +DEAL:1:all::n_dofs on level=5: 1369 +DEAL:1:all::n_dofs on level=6: 4225 +DEAL:1:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:1:all::n_locally_owned_mg_dofs on level=1: 0 +DEAL:1:all::n_locally_owned_mg_dofs on level=2: 6 +DEAL:1:all::n_locally_owned_mg_dofs on level=3: 20 +DEAL:1:all::n_locally_owned_mg_dofs on level=4: 80 +DEAL:1:all::n_locally_owned_mg_dofs on level=5: 304 +DEAL:1:all::n_locally_owned_mg_dofs on level=6: 1184 +DEAL:1:all:: +DEAL:1:all::n_dofs: 4813 +DEAL:1:all::n_locally_owned_dofs: 1184 +DEAL:1:all::n_dofs on level=0: 9 +DEAL:1:all::n_dofs on level=1: 25 +DEAL:1:all::n_dofs on level=2: 81 +DEAL:1:all::n_dofs on level=3: 289 +DEAL:1:all::n_dofs on level=4: 441 +DEAL:1:all::n_dofs on level=5: 1369 +DEAL:1:all::n_dofs on level=6: 4225 +DEAL:1:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:1:all::n_locally_owned_mg_dofs on level=1: 0 +DEAL:1:all::n_locally_owned_mg_dofs on level=2: 6 +DEAL:1:all::n_locally_owned_mg_dofs on level=3: 20 +DEAL:1:all::n_locally_owned_mg_dofs on level=4: 80 +DEAL:1:all::n_locally_owned_mg_dofs on level=5: 304 +DEAL:1:all::n_locally_owned_mg_dofs on level=6: 1184 +DEAL:1:all:: + + +DEAL:2:all::n_levels: 7 +DEAL:2:all::n_cells: 717 +DEAL:2:all::n_active_cells: 538 +DEAL:2:all::n_cells on level=0: 1 +DEAL:2:all::n_cells on level=1: 4 +DEAL:2:all::n_cells on level=2: 16 +DEAL:2:all::n_cells on level=3: 36 +DEAL:2:all::n_cells on level=4: 72 +DEAL:2:all::n_cells on level=5: 168 +DEAL:2:all::n_cells on level=6: 420 +DEAL:2:all::n_active_cells on level=0: 0 +DEAL:2:all::n_active_cells on level=1: 0 +DEAL:2:all::n_active_cells on level=2: 7 +DEAL:2:all::n_active_cells on level=3: 18 +DEAL:2:all::n_active_cells on level=4: 30 +DEAL:2:all::n_active_cells on level=5: 63 +DEAL:2:all::n_active_cells on level=6: 420 +DEAL:2:all:: +DEAL:2:all::n_levels: 7 +DEAL:2:all::n_cells: 717 +DEAL:2:all::n_active_cells: 538 +DEAL:2:all::n_cells on level=0: 1 +DEAL:2:all::n_cells on level=1: 4 +DEAL:2:all::n_cells on level=2: 16 +DEAL:2:all::n_cells on level=3: 36 +DEAL:2:all::n_cells on level=4: 72 +DEAL:2:all::n_cells on level=5: 168 +DEAL:2:all::n_cells on level=6: 420 +DEAL:2:all::n_active_cells on level=0: 0 +DEAL:2:all::n_active_cells on level=1: 0 +DEAL:2:all::n_active_cells on level=2: 7 +DEAL:2:all::n_active_cells on level=3: 18 +DEAL:2:all::n_active_cells on level=4: 30 +DEAL:2:all::n_active_cells on level=5: 63 +DEAL:2:all::n_active_cells on level=6: 420 +DEAL:2:all:: +DEAL:2:all::n_dofs: 4813 +DEAL:2:all::n_locally_owned_dofs: 1168 +DEAL:2:all::n_dofs on level=0: 9 +DEAL:2:all::n_dofs on level=1: 25 +DEAL:2:all::n_dofs on level=2: 81 +DEAL:2:all::n_dofs on level=3: 289 +DEAL:2:all::n_dofs on level=4: 441 +DEAL:2:all::n_dofs on level=5: 1369 +DEAL:2:all::n_dofs on level=6: 4225 +DEAL:2:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:2:all::n_locally_owned_mg_dofs on level=1: 0 +DEAL:2:all::n_locally_owned_mg_dofs on level=2: 4 +DEAL:2:all::n_locally_owned_mg_dofs on level=3: 22 +DEAL:2:all::n_locally_owned_mg_dofs on level=4: 76 +DEAL:2:all::n_locally_owned_mg_dofs on level=5: 296 +DEAL:2:all::n_locally_owned_mg_dofs on level=6: 1168 +DEAL:2:all:: +DEAL:2:all::n_dofs: 4813 +DEAL:2:all::n_locally_owned_dofs: 1168 +DEAL:2:all::n_dofs on level=0: 9 +DEAL:2:all::n_dofs on level=1: 25 +DEAL:2:all::n_dofs on level=2: 81 +DEAL:2:all::n_dofs on level=3: 289 +DEAL:2:all::n_dofs on level=4: 441 +DEAL:2:all::n_dofs on level=5: 1369 +DEAL:2:all::n_dofs on level=6: 4225 +DEAL:2:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:2:all::n_locally_owned_mg_dofs on level=1: 0 +DEAL:2:all::n_locally_owned_mg_dofs on level=2: 4 +DEAL:2:all::n_locally_owned_mg_dofs on level=3: 22 +DEAL:2:all::n_locally_owned_mg_dofs on level=4: 76 +DEAL:2:all::n_locally_owned_mg_dofs on level=5: 296 +DEAL:2:all::n_locally_owned_mg_dofs on level=6: 1168 +DEAL:2:all:: + + +DEAL:3:all::n_levels: 7 +DEAL:3:all::n_cells: 613 +DEAL:3:all::n_active_cells: 460 +DEAL:3:all::n_cells on level=0: 1 +DEAL:3:all::n_cells on level=1: 4 +DEAL:3:all::n_cells on level=2: 16 +DEAL:3:all::n_cells on level=3: 64 +DEAL:3:all::n_cells on level=4: 76 +DEAL:3:all::n_cells on level=5: 168 +DEAL:3:all::n_cells on level=6: 284 +DEAL:3:all::n_active_cells on level=0: 0 +DEAL:3:all::n_active_cells on level=1: 0 +DEAL:3:all::n_active_cells on level=2: 0 +DEAL:3:all::n_active_cells on level=3: 45 +DEAL:3:all::n_active_cells on level=4: 34 +DEAL:3:all::n_active_cells on level=5: 97 +DEAL:3:all::n_active_cells on level=6: 284 +DEAL:3:all:: +DEAL:3:all::n_levels: 7 +DEAL:3:all::n_cells: 613 +DEAL:3:all::n_active_cells: 460 +DEAL:3:all::n_cells on level=0: 1 +DEAL:3:all::n_cells on level=1: 4 +DEAL:3:all::n_cells on level=2: 16 +DEAL:3:all::n_cells on level=3: 64 +DEAL:3:all::n_cells on level=4: 76 +DEAL:3:all::n_cells on level=5: 168 +DEAL:3:all::n_cells on level=6: 284 +DEAL:3:all::n_active_cells on level=0: 0 +DEAL:3:all::n_active_cells on level=1: 0 +DEAL:3:all::n_active_cells on level=2: 0 +DEAL:3:all::n_active_cells on level=3: 45 +DEAL:3:all::n_active_cells on level=4: 34 +DEAL:3:all::n_active_cells on level=5: 97 +DEAL:3:all::n_active_cells on level=6: 284 +DEAL:3:all:: +DEAL:3:all::n_dofs: 4813 +DEAL:3:all::n_locally_owned_dofs: 1228 +DEAL:3:all::n_dofs on level=0: 9 +DEAL:3:all::n_dofs on level=1: 25 +DEAL:3:all::n_dofs on level=2: 81 +DEAL:3:all::n_dofs on level=3: 289 +DEAL:3:all::n_dofs on level=4: 441 +DEAL:3:all::n_dofs on level=5: 1369 +DEAL:3:all::n_dofs on level=6: 4225 +DEAL:3:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:3:all::n_locally_owned_mg_dofs on level=1: 16 +DEAL:3:all::n_locally_owned_mg_dofs on level=2: 56 +DEAL:3:all::n_locally_owned_mg_dofs on level=3: 216 +DEAL:3:all::n_locally_owned_mg_dofs on level=4: 192 +DEAL:3:all::n_locally_owned_mg_dofs on level=5: 440 +DEAL:3:all::n_locally_owned_mg_dofs on level=6: 640 +DEAL:3:all:: +DEAL:3:all::n_dofs: 4813 +DEAL:3:all::n_locally_owned_dofs: 1228 +DEAL:3:all::n_dofs on level=0: 9 +DEAL:3:all::n_dofs on level=1: 25 +DEAL:3:all::n_dofs on level=2: 81 +DEAL:3:all::n_dofs on level=3: 289 +DEAL:3:all::n_dofs on level=4: 441 +DEAL:3:all::n_dofs on level=5: 1369 +DEAL:3:all::n_dofs on level=6: 4225 +DEAL:3:all::n_locally_owned_mg_dofs on level=0: 0 +DEAL:3:all::n_locally_owned_mg_dofs on level=1: 16 +DEAL:3:all::n_locally_owned_mg_dofs on level=2: 56 +DEAL:3:all::n_locally_owned_mg_dofs on level=3: 216 +DEAL:3:all::n_locally_owned_mg_dofs on level=4: 192 +DEAL:3:all::n_locally_owned_mg_dofs on level=5: 440 +DEAL:3:all::n_locally_owned_mg_dofs on level=6: 640 +DEAL:3:all:: + -- 2.39.5