From: Peter Munch Date: Tue, 5 Nov 2019 21:52:40 +0000 (+0100) Subject: Add copy_triangulation to parallel::fullydistributed::Triangulation X-Git-Tag: v9.2.0-rc1~641^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F9007%2Fhead;p=dealii.git Add copy_triangulation to parallel::fullydistributed::Triangulation --- diff --git a/include/deal.II/distributed/fully_distributed_tria.h b/include/deal.II/distributed/fully_distributed_tria.h index bf91573e49..7b6a448892 100644 --- a/include/deal.II/distributed/fully_distributed_tria.h +++ b/include/deal.II/distributed/fully_distributed_tria.h @@ -21,6 +21,8 @@ #include +#include + #include #ifdef DEAL_II_WITH_MPI @@ -194,7 +196,7 @@ namespace parallel * to the communicator inside of parallel::fullydistributed::Triangulation * and an assert is thrown if they do not match. * - * @note Please note this is necessary since the communicator inside of + * @note This is necessary since the communicator inside of * parallel::TriangulationBase is const and cannot be changed after the * constructor has been called. * @@ -208,6 +210,7 @@ namespace parallel }; + /** * A distributed triangulation with a distributed coarse grid. * @@ -322,6 +325,43 @@ namespace parallel const std::vector> &cells, const SubCellData &subcelldata) override; + /** + * Implementation of the same function as in the base class. + * + * @param other_tria The triangulation to be copied. It can be a serial + * Triangulation or a parallel::distributed::Triangulation. Both + * can have been refined already. + * + * @note This function uses the partitioner registered with + * set_partitioner(). + */ + void + copy_triangulation( + const dealii::Triangulation &other_tria) override; + + /** + * Register a partitioner, which is used within the method + * copy_triangulation. + * + * @param partitioner A partitioning function, which takes as input argument + * a reference to the triangulation to be partitioned + * and the number of partitions to be created. + * The function needs to set subdomain + * ids for each active cell of the given triangulation, + * with values between zero (inclusive) + * and the second argument to the function (exclusive). + * @param settings See the description of the Settings enumerator. + * + * @note As a default, GridTools::partition_triangulation_zorder() is used + * as partitioner and data structures on multigrid levels are not + * set up. + */ + void + set_partitioner( + const std::function &, + const unsigned int)> &partitioner, + const Settings & settings); + /** * Coarsen and refine the mesh according to refinement and coarsening * flags set. @@ -378,6 +418,13 @@ namespace parallel */ Settings settings; + /** + * Partitioner used in copy_triangulation(). + */ + std::function &, + const unsigned int)> + partitioner; + /** * Sorted list of pairs of coarse-cell ids and their indices. */ diff --git a/source/distributed/fully_distributed_tria.cc b/source/distributed/fully_distributed_tria.cc index a19a86ae1c..0b1ae5b718 100644 --- a/source/distributed/fully_distributed_tria.cc +++ b/source/distributed/fully_distributed_tria.cc @@ -15,8 +15,12 @@ #include +#include #include +#include + +#include DEAL_II_NAMESPACE_OPEN @@ -39,6 +43,10 @@ namespace parallel Triangulation::Triangulation(MPI_Comm mpi_communicator) : parallel::DistributedTriangulationBase(mpi_communicator) , settings(Settings::default_setting) + , partitioner([](dealii::Triangulation &tria, + const unsigned int n_partitions) { + GridTools::partition_triangulation_zorder(n_partitions, tria); + }) , currently_processing_create_triangulation_for_internal_usage(false) , currently_processing_prepare_coarsening_and_refinement_for_internal_usage( false) @@ -285,6 +293,74 @@ namespace parallel + template + void + Triangulation::copy_triangulation( + const dealii::Triangulation &other_tria) + { + // pointer to the triangulation for which the construction data + // should be created (normally it is the input triangulation but + // in the case of a serial triangulation we create a copy which should + // be used) + const dealii::Triangulation *other_tria_ptr = &other_tria; + + // temporary serial triangulation (since the input triangulation is const + // and we might modify its subdomain_ids + // and level_subdomain_ids during partitioning); this pointer only points + // to anything if the source triangulation is serial, and ensures that our + // copy is eventually deleted + std::unique_ptr> serial_tria; + + // check if other triangulation is not a parallel one, which needs to be + // partitioned + if (dynamic_cast + *>(&other_tria) == nullptr) + { + serial_tria = + std::make_unique>(); + + // actually copy the serial triangulation + serial_tria->copy_triangulation(other_tria); + + // partition triangulation + this->partitioner(*serial_tria, + dealii::Utilities::MPI::n_mpi_processes( + this->mpi_communicator)); + + // partition multigrid levels + if (this->is_multilevel_hierarchy_constructed()) + GridTools::partition_multigrid_levels(*serial_tria); + + // use the new serial triangulation to create the construction data + other_tria_ptr = serial_tria.get(); + } + + // create construction data + const auto construction_data = + Utilities::create_construction_data_from_triangulation( + *other_tria_ptr, + this->mpi_communicator, + this->is_multilevel_hierarchy_constructed()); + + // finally create triangulation + this->create_triangulation(construction_data); + } + + + + template + void + Triangulation::set_partitioner( + const std::function &, + const unsigned int)> &partitioner, + const Settings & settings) + { + this->partitioner = partitioner; + this->settings = settings; + } + + + template void Triangulation::update_number_cache() diff --git a/source/distributed/fully_distributed_tria_util.inst.in b/source/distributed/fully_distributed_tria_util.inst.in index 222553930e..6962da1d47 100644 --- a/source/distributed/fully_distributed_tria_util.inst.in +++ b/source/distributed/fully_distributed_tria_util.inst.in @@ -15,7 +15,7 @@ -for (deal_II_dimension : DIMENSIONS) +for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS) { namespace parallel \{ @@ -23,26 +23,28 @@ for (deal_II_dimension : DIMENSIONS) \{ namespace Utilities \{ - template ConstructionData +#if deal_II_dimension <= deal_II_space_dimension + template ConstructionData create_construction_data_from_triangulation( - const dealii::Triangulation - & tria, - const MPI_Comm comm, + const dealii::Triangulation &tria, + const MPI_Comm comm, const bool construct_multilevel_hierarchy, const unsigned int my_rank_in); - template ConstructionData + template ConstructionData create_construction_data_from_triangulation_in_groups( std::function &)> - serial_grid_generator, - std::function &, - const MPI_Comm, - const unsigned int)> serial_grid_partitioner, - const MPI_Comm comm, - const int group_size, - const bool construct_multilevel_hierarchy); + dealii::Triangulation + &)> serial_grid_generator, + std::function &, + const MPI_Comm, + const unsigned int)> serial_grid_partitioner, + const MPI_Comm comm, + const int group_size, + const bool construct_multilevel_hierarchy); +#endif \} \} \} diff --git a/tests/fullydistributed_grids/copy_serial_tria_07.cc b/tests/fullydistributed_grids/copy_serial_tria_07.cc new file mode 100644 index 0000000000..00c4ae4a23 --- /dev/null +++ b/tests/fullydistributed_grids/copy_serial_tria_07.cc @@ -0,0 +1,103 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2019 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. +// +// --------------------------------------------------------------------- + + +// Create a serial triangulation with multigrid levels and copy it with . +// copy_triangulation. + +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "./tests.h" + +using namespace dealii; + +template +void +test(int n_refinements, const int n_subdivisions, MPI_Comm comm) +{ + // create serial triangulation + Triangulation basetria( + Triangulation::limit_level_difference_at_vertices); + GridGenerator::subdivided_hyper_cube(basetria, n_subdivisions); + basetria.refine_global(n_refinements); + + // create instance of pft + parallel::fullydistributed::Triangulation tria_pft(comm); + + // register dynamic construction data + tria_pft.set_partitioner( + [](dealii::Triangulation &tria, const unsigned int n_partitions) { + GridTools::partition_triangulation_zorder(n_partitions, tria); + }, + parallel::fullydistributed::Settings::construct_multigrid_hierarchy); + + // actually create triangulation + tria_pft.copy_triangulation(basetria); + + // test triangulation + 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, true); + print_statistics(dof_handler, true); +} + +int +main(int argc, char *argv[]) +{ + Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1); + MPILogInitAll all; + + const MPI_Comm comm = MPI_COMM_WORLD; + + + { + deallog.push("1d"); + const int n_refinements = 6; + const int n_subdivisions = 8; + test<1>(n_refinements, n_subdivisions, comm); + deallog.pop(); + } + { + deallog.push("2d"); + const int n_refinements = 3; + const int n_subdivisions = 8; + test<2>(n_refinements, n_subdivisions, comm); + deallog.pop(); + } + + { + deallog.push("3d"); + const int n_refinements = 3; + const int n_subdivisions = 4; + test<3>(n_refinements, n_subdivisions, comm); + deallog.pop(); + } +} diff --git a/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=1.output b/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=1.output new file mode 100644 index 0000000000..d535590834 --- /dev/null +++ b/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=1.output @@ -0,0 +1,82 @@ + +DEAL:0:1d::n_levels: 7 +DEAL:0:1d::n_cells: 1016 +DEAL:0:1d::n_active_cells: 512 +DEAL:0:1d::n_cells on level=0: 8 +DEAL:0:1d::n_cells on level=1: 16 +DEAL:0:1d::n_cells on level=2: 32 +DEAL:0:1d::n_cells on level=3: 64 +DEAL:0:1d::n_cells on level=4: 128 +DEAL:0:1d::n_cells on level=5: 256 +DEAL:0:1d::n_cells on level=6: 512 +DEAL:0:1d::n_active_cells on level=0: 0 +DEAL:0:1d::n_active_cells on level=1: 0 +DEAL:0:1d::n_active_cells on level=2: 0 +DEAL:0:1d::n_active_cells on level=3: 0 +DEAL:0:1d::n_active_cells on level=4: 0 +DEAL:0:1d::n_active_cells on level=5: 0 +DEAL:0:1d::n_active_cells on level=6: 512 +DEAL:0:1d:: +DEAL:0:1d::n_dofs: 1025 +DEAL:0:1d::n_locally_owned_dofs: 1025 +DEAL:0:1d::n_dofs on level=0: 17 +DEAL:0:1d::n_dofs on level=1: 33 +DEAL:0:1d::n_dofs on level=2: 65 +DEAL:0:1d::n_dofs on level=3: 129 +DEAL:0:1d::n_dofs on level=4: 257 +DEAL:0:1d::n_dofs on level=5: 513 +DEAL:0:1d::n_dofs on level=6: 1025 +DEAL:0:1d::n_locally_owned_mg_dofs on level=0: 17 +DEAL:0:1d::n_locally_owned_mg_dofs on level=1: 33 +DEAL:0:1d::n_locally_owned_mg_dofs on level=2: 65 +DEAL:0:1d::n_locally_owned_mg_dofs on level=3: 129 +DEAL:0:1d::n_locally_owned_mg_dofs on level=4: 257 +DEAL:0:1d::n_locally_owned_mg_dofs on level=5: 513 +DEAL:0:1d::n_locally_owned_mg_dofs on level=6: 1025 +DEAL:0:1d:: +DEAL:0:2d::n_levels: 4 +DEAL:0:2d::n_cells: 5440 +DEAL:0:2d::n_active_cells: 4096 +DEAL:0:2d::n_cells on level=0: 64 +DEAL:0:2d::n_cells on level=1: 256 +DEAL:0:2d::n_cells on level=2: 1024 +DEAL:0:2d::n_cells on level=3: 4096 +DEAL:0:2d::n_active_cells on level=0: 0 +DEAL:0:2d::n_active_cells on level=1: 0 +DEAL:0:2d::n_active_cells on level=2: 0 +DEAL:0:2d::n_active_cells on level=3: 4096 +DEAL:0:2d:: +DEAL:0:2d::n_dofs: 16641 +DEAL:0:2d::n_locally_owned_dofs: 16641 +DEAL:0:2d::n_dofs on level=0: 289 +DEAL:0:2d::n_dofs on level=1: 1089 +DEAL:0:2d::n_dofs on level=2: 4225 +DEAL:0:2d::n_dofs on level=3: 16641 +DEAL:0:2d::n_locally_owned_mg_dofs on level=0: 289 +DEAL:0:2d::n_locally_owned_mg_dofs on level=1: 1089 +DEAL:0:2d::n_locally_owned_mg_dofs on level=2: 4225 +DEAL:0:2d::n_locally_owned_mg_dofs on level=3: 16641 +DEAL:0:2d:: +DEAL:0:3d::n_levels: 4 +DEAL:0:3d::n_cells: 37440 +DEAL:0:3d::n_active_cells: 32768 +DEAL:0:3d::n_cells on level=0: 64 +DEAL:0:3d::n_cells on level=1: 512 +DEAL:0:3d::n_cells on level=2: 4096 +DEAL:0:3d::n_cells on level=3: 32768 +DEAL:0:3d::n_active_cells on level=0: 0 +DEAL:0:3d::n_active_cells on level=1: 0 +DEAL:0:3d::n_active_cells on level=2: 0 +DEAL:0:3d::n_active_cells on level=3: 32768 +DEAL:0:3d:: +DEAL:0:3d::n_dofs: 274625 +DEAL:0:3d::n_locally_owned_dofs: 274625 +DEAL:0:3d::n_dofs on level=0: 729 +DEAL:0:3d::n_dofs on level=1: 4913 +DEAL:0:3d::n_dofs on level=2: 35937 +DEAL:0:3d::n_dofs on level=3: 274625 +DEAL:0:3d::n_locally_owned_mg_dofs on level=0: 729 +DEAL:0:3d::n_locally_owned_mg_dofs on level=1: 4913 +DEAL:0:3d::n_locally_owned_mg_dofs on level=2: 35937 +DEAL:0:3d::n_locally_owned_mg_dofs on level=3: 274625 +DEAL:0:3d:: diff --git a/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=5.output b/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=5.output new file mode 100644 index 0000000000..9ab22515e2 --- /dev/null +++ b/tests/fullydistributed_grids/copy_serial_tria_07.mpirun=5.output @@ -0,0 +1,414 @@ + +DEAL:0:1d::n_levels: 7 +DEAL:0:1d::n_cells: 221 +DEAL:0:1d::n_active_cells: 112 +DEAL:0:1d::n_cells on level=0: 3 +DEAL:0:1d::n_cells on level=1: 6 +DEAL:0:1d::n_cells on level=2: 10 +DEAL:0:1d::n_cells on level=3: 16 +DEAL:0:1d::n_cells on level=4: 28 +DEAL:0:1d::n_cells on level=5: 54 +DEAL:0:1d::n_cells on level=6: 104 +DEAL:0:1d::n_active_cells on level=0: 0 +DEAL:0:1d::n_active_cells on level=1: 1 +DEAL:0:1d::n_active_cells on level=2: 2 +DEAL:0:1d::n_active_cells on level=3: 2 +DEAL:0:1d::n_active_cells on level=4: 1 +DEAL:0:1d::n_active_cells on level=5: 2 +DEAL:0:1d::n_active_cells on level=6: 104 +DEAL:0:1d:: +DEAL:0:1d::n_dofs: 1025 +DEAL:0:1d::n_locally_owned_dofs: 205 +DEAL:0:1d::n_dofs on level=0: 17 +DEAL:0:1d::n_dofs on level=1: 33 +DEAL:0:1d::n_dofs on level=2: 65 +DEAL:0:1d::n_dofs on level=3: 129 +DEAL:0:1d::n_dofs on level=4: 257 +DEAL:0:1d::n_dofs on level=5: 513 +DEAL:0:1d::n_dofs on level=6: 1025 +DEAL:0:1d::n_locally_owned_mg_dofs on level=0: 5 +DEAL:0:1d::n_locally_owned_mg_dofs on level=1: 9 +DEAL:0:1d::n_locally_owned_mg_dofs on level=2: 15 +DEAL:0:1d::n_locally_owned_mg_dofs on level=3: 27 +DEAL:0:1d::n_locally_owned_mg_dofs on level=4: 53 +DEAL:0:1d::n_locally_owned_mg_dofs on level=5: 103 +DEAL:0:1d::n_locally_owned_mg_dofs on level=6: 205 +DEAL:0:1d:: +DEAL:0:2d::n_levels: 4 +DEAL:0:2d::n_cells: 1338 +DEAL:0:2d::n_active_cells: 1009 +DEAL:0:2d::n_cells on level=0: 22 +DEAL:0:2d::n_cells on level=1: 88 +DEAL:0:2d::n_cells on level=2: 276 +DEAL:0:2d::n_cells on level=3: 952 +DEAL:0:2d::n_active_cells on level=0: 0 +DEAL:0:2d::n_active_cells on level=1: 19 +DEAL:0:2d::n_active_cells on level=2: 38 +DEAL:0:2d::n_active_cells on level=3: 952 +DEAL:0:2d:: +DEAL:0:2d::n_dofs: 16641 +DEAL:0:2d::n_locally_owned_dofs: 3409 +DEAL:0:2d::n_dofs on level=0: 289 +DEAL:0:2d::n_dofs on level=1: 1089 +DEAL:0:2d::n_dofs on level=2: 4225 +DEAL:0:2d::n_dofs on level=3: 16641 +DEAL:0:2d::n_locally_owned_mg_dofs on level=0: 69 +DEAL:0:2d::n_locally_owned_mg_dofs on level=1: 241 +DEAL:0:2d::n_locally_owned_mg_dofs on level=2: 885 +DEAL:0:2d::n_locally_owned_mg_dofs on level=3: 3409 +DEAL:0:2d:: +DEAL:0:3d::n_levels: 4 +DEAL:0:3d::n_cells: 10651 +DEAL:0:3d::n_active_cells: 9324 +DEAL:0:3d::n_cells on level=0: 35 +DEAL:0:3d::n_cells on level=1: 280 +DEAL:0:3d::n_cells on level=2: 1448 +DEAL:0:3d::n_cells on level=3: 8888 +DEAL:0:3d::n_active_cells on level=0: 0 +DEAL:0:3d::n_active_cells on level=1: 99 +DEAL:0:3d::n_active_cells on level=2: 337 +DEAL:0:3d::n_active_cells on level=3: 8888 +DEAL:0:3d:: +DEAL:0:3d::n_dofs: 274625 +DEAL:0:3d::n_locally_owned_dofs: 57409 +DEAL:0:3d::n_dofs on level=0: 729 +DEAL:0:3d::n_dofs on level=1: 4913 +DEAL:0:3d::n_dofs on level=2: 35937 +DEAL:0:3d::n_dofs on level=3: 274625 +DEAL:0:3d::n_locally_owned_mg_dofs on level=0: 197 +DEAL:0:3d::n_locally_owned_mg_dofs on level=1: 1161 +DEAL:0:3d::n_locally_owned_mg_dofs on level=2: 7833 +DEAL:0:3d::n_locally_owned_mg_dofs on level=3: 57409 +DEAL:0:3d:: + +DEAL:1:1d::n_levels: 7 +DEAL:1:1d::n_cells: 236 +DEAL:1:1d::n_active_cells: 120 +DEAL:1:1d::n_cells on level=0: 4 +DEAL:1:1d::n_cells on level=1: 8 +DEAL:1:1d::n_cells on level=2: 12 +DEAL:1:1d::n_cells on level=3: 18 +DEAL:1:1d::n_cells on level=4: 32 +DEAL:1:1d::n_cells on level=5: 56 +DEAL:1:1d::n_cells on level=6: 106 +DEAL:1:1d::n_active_cells on level=0: 0 +DEAL:1:1d::n_active_cells on level=1: 2 +DEAL:1:1d::n_active_cells on level=2: 3 +DEAL:1:1d::n_active_cells on level=3: 2 +DEAL:1:1d::n_active_cells on level=4: 4 +DEAL:1:1d::n_active_cells on level=5: 3 +DEAL:1:1d::n_active_cells on level=6: 106 +DEAL:1:1d:: +DEAL:1:1d::n_dofs: 1025 +DEAL:1:1d::n_locally_owned_dofs: 204 +DEAL:1:1d::n_dofs on level=0: 17 +DEAL:1:1d::n_dofs on level=1: 33 +DEAL:1:1d::n_dofs on level=2: 65 +DEAL:1:1d::n_dofs on level=3: 129 +DEAL:1:1d::n_dofs on level=4: 257 +DEAL:1:1d::n_dofs on level=5: 513 +DEAL:1:1d::n_dofs on level=6: 1025 +DEAL:1:1d::n_locally_owned_mg_dofs on level=0: 4 +DEAL:1:1d::n_locally_owned_mg_dofs on level=1: 6 +DEAL:1:1d::n_locally_owned_mg_dofs on level=2: 12 +DEAL:1:1d::n_locally_owned_mg_dofs on level=3: 26 +DEAL:1:1d::n_locally_owned_mg_dofs on level=4: 50 +DEAL:1:1d::n_locally_owned_mg_dofs on level=5: 102 +DEAL:1:1d::n_locally_owned_mg_dofs on level=6: 204 +DEAL:1:1d:: +DEAL:1:2d::n_levels: 4 +DEAL:1:2d::n_cells: 1512 +DEAL:1:2d::n_active_cells: 1141 +DEAL:1:2d::n_cells on level=0: 28 +DEAL:1:2d::n_cells on level=1: 112 +DEAL:1:2d::n_cells on level=2: 324 +DEAL:1:2d::n_cells on level=3: 1048 +DEAL:1:2d::n_active_cells on level=0: 0 +DEAL:1:2d::n_active_cells on level=1: 31 +DEAL:1:2d::n_active_cells on level=2: 62 +DEAL:1:2d::n_active_cells on level=3: 1048 +DEAL:1:2d:: +DEAL:1:2d::n_dofs: 16641 +DEAL:1:2d::n_locally_owned_dofs: 3344 +DEAL:1:2d::n_dofs on level=0: 289 +DEAL:1:2d::n_dofs on level=1: 1089 +DEAL:1:2d::n_dofs on level=2: 4225 +DEAL:1:2d::n_dofs on level=3: 16641 +DEAL:1:2d::n_locally_owned_mg_dofs on level=0: 60 +DEAL:1:2d::n_locally_owned_mg_dofs on level=1: 220 +DEAL:1:2d::n_locally_owned_mg_dofs on level=2: 852 +DEAL:1:2d::n_locally_owned_mg_dofs on level=3: 3344 +DEAL:1:2d:: +DEAL:1:3d::n_levels: 4 +DEAL:1:3d::n_cells: 12732 +DEAL:1:3d::n_active_cells: 11146 +DEAL:1:3d::n_cells on level=0: 44 +DEAL:1:3d::n_cells on level=1: 352 +DEAL:1:3d::n_cells on level=2: 1840 +DEAL:1:3d::n_cells on level=3: 10496 +DEAL:1:3d::n_active_cells on level=0: 0 +DEAL:1:3d::n_active_cells on level=1: 122 +DEAL:1:3d::n_active_cells on level=2: 528 +DEAL:1:3d::n_active_cells on level=3: 10496 +DEAL:1:3d:: +DEAL:1:3d::n_dofs: 274625 +DEAL:1:3d::n_locally_owned_dofs: 55264 +DEAL:1:3d::n_dofs on level=0: 729 +DEAL:1:3d::n_dofs on level=1: 4913 +DEAL:1:3d::n_dofs on level=2: 35937 +DEAL:1:3d::n_dofs on level=3: 274625 +DEAL:1:3d::n_locally_owned_mg_dofs on level=0: 152 +DEAL:1:3d::n_locally_owned_mg_dofs on level=1: 1000 +DEAL:1:3d::n_locally_owned_mg_dofs on level=2: 7272 +DEAL:1:3d::n_locally_owned_mg_dofs on level=3: 55264 +DEAL:1:3d:: + + +DEAL:2:1d::n_levels: 7 +DEAL:2:1d::n_cells: 233 +DEAL:2:1d::n_active_cells: 118 +DEAL:2:1d::n_cells on level=0: 3 +DEAL:2:1d::n_cells on level=1: 6 +DEAL:2:1d::n_cells on level=2: 10 +DEAL:2:1d::n_cells on level=3: 18 +DEAL:2:1d::n_cells on level=4: 32 +DEAL:2:1d::n_cells on level=5: 56 +DEAL:2:1d::n_cells on level=6: 108 +DEAL:2:1d::n_active_cells on level=0: 0 +DEAL:2:1d::n_active_cells on level=1: 1 +DEAL:2:1d::n_active_cells on level=2: 1 +DEAL:2:1d::n_active_cells on level=3: 2 +DEAL:2:1d::n_active_cells on level=4: 4 +DEAL:2:1d::n_active_cells on level=5: 2 +DEAL:2:1d::n_active_cells on level=6: 108 +DEAL:2:1d:: +DEAL:2:1d::n_dofs: 1025 +DEAL:2:1d::n_locally_owned_dofs: 208 +DEAL:2:1d::n_dofs on level=0: 17 +DEAL:2:1d::n_dofs on level=1: 33 +DEAL:2:1d::n_dofs on level=2: 65 +DEAL:2:1d::n_dofs on level=3: 129 +DEAL:2:1d::n_dofs on level=4: 257 +DEAL:2:1d::n_dofs on level=5: 513 +DEAL:2:1d::n_dofs on level=6: 1025 +DEAL:2:1d::n_locally_owned_mg_dofs on level=0: 2 +DEAL:2:1d::n_locally_owned_mg_dofs on level=1: 6 +DEAL:2:1d::n_locally_owned_mg_dofs on level=2: 14 +DEAL:2:1d::n_locally_owned_mg_dofs on level=3: 26 +DEAL:2:1d::n_locally_owned_mg_dofs on level=4: 52 +DEAL:2:1d::n_locally_owned_mg_dofs on level=5: 104 +DEAL:2:1d::n_locally_owned_mg_dofs on level=6: 208 +DEAL:2:1d:: +DEAL:2:2d::n_levels: 4 +DEAL:2:2d::n_cells: 1669 +DEAL:2:2d::n_active_cells: 1260 +DEAL:2:2d::n_cells on level=0: 33 +DEAL:2:2d::n_cells on level=1: 132 +DEAL:2:2d::n_cells on level=2: 368 +DEAL:2:2d::n_cells on level=3: 1136 +DEAL:2:2d::n_active_cells on level=0: 0 +DEAL:2:2d::n_active_cells on level=1: 40 +DEAL:2:2d::n_active_cells on level=2: 84 +DEAL:2:2d::n_active_cells on level=3: 1136 +DEAL:2:2d:: +DEAL:2:2d::n_dofs: 16641 +DEAL:2:2d::n_locally_owned_dofs: 3296 +DEAL:2:2d::n_dofs on level=0: 289 +DEAL:2:2d::n_dofs on level=1: 1089 +DEAL:2:2d::n_dofs on level=2: 4225 +DEAL:2:2d::n_dofs on level=3: 16641 +DEAL:2:2d::n_locally_owned_mg_dofs on level=0: 56 +DEAL:2:2d::n_locally_owned_mg_dofs on level=1: 212 +DEAL:2:2d::n_locally_owned_mg_dofs on level=2: 832 +DEAL:2:2d::n_locally_owned_mg_dofs on level=3: 3296 +DEAL:2:2d:: +DEAL:2:3d::n_levels: 4 +DEAL:2:3d::n_cells: 12702 +DEAL:2:3d::n_active_cells: 11120 +DEAL:2:3d::n_cells on level=0: 46 +DEAL:2:3d::n_cells on level=1: 368 +DEAL:2:3d::n_cells on level=2: 1872 +DEAL:2:3d::n_cells on level=3: 10416 +DEAL:2:3d::n_active_cells on level=0: 0 +DEAL:2:3d::n_active_cells on level=1: 134 +DEAL:2:3d::n_active_cells on level=2: 570 +DEAL:2:3d::n_active_cells on level=3: 10416 +DEAL:2:3d:: +DEAL:2:3d::n_dofs: 274625 +DEAL:2:3d::n_locally_owned_dofs: 54944 +DEAL:2:3d::n_dofs on level=0: 729 +DEAL:2:3d::n_dofs on level=1: 4913 +DEAL:2:3d::n_dofs on level=2: 35937 +DEAL:2:3d::n_dofs on level=3: 274625 +DEAL:2:3d::n_locally_owned_mg_dofs on level=0: 148 +DEAL:2:3d::n_locally_owned_mg_dofs on level=1: 984 +DEAL:2:3d::n_locally_owned_mg_dofs on level=2: 7184 +DEAL:2:3d::n_locally_owned_mg_dofs on level=3: 54944 +DEAL:2:3d:: + + +DEAL:3:1d::n_levels: 7 +DEAL:3:1d::n_cells: 236 +DEAL:3:1d::n_active_cells: 120 +DEAL:3:1d::n_cells on level=0: 4 +DEAL:3:1d::n_cells on level=1: 8 +DEAL:3:1d::n_cells on level=2: 12 +DEAL:3:1d::n_cells on level=3: 18 +DEAL:3:1d::n_cells on level=4: 32 +DEAL:3:1d::n_cells on level=5: 56 +DEAL:3:1d::n_cells on level=6: 106 +DEAL:3:1d::n_active_cells on level=0: 0 +DEAL:3:1d::n_active_cells on level=1: 2 +DEAL:3:1d::n_active_cells on level=2: 3 +DEAL:3:1d::n_active_cells on level=3: 2 +DEAL:3:1d::n_active_cells on level=4: 4 +DEAL:3:1d::n_active_cells on level=5: 3 +DEAL:3:1d::n_active_cells on level=6: 106 +DEAL:3:1d:: +DEAL:3:1d::n_dofs: 1025 +DEAL:3:1d::n_locally_owned_dofs: 204 +DEAL:3:1d::n_dofs on level=0: 17 +DEAL:3:1d::n_dofs on level=1: 33 +DEAL:3:1d::n_dofs on level=2: 65 +DEAL:3:1d::n_dofs on level=3: 129 +DEAL:3:1d::n_dofs on level=4: 257 +DEAL:3:1d::n_dofs on level=5: 513 +DEAL:3:1d::n_dofs on level=6: 1025 +DEAL:3:1d::n_locally_owned_mg_dofs on level=0: 4 +DEAL:3:1d::n_locally_owned_mg_dofs on level=1: 6 +DEAL:3:1d::n_locally_owned_mg_dofs on level=2: 12 +DEAL:3:1d::n_locally_owned_mg_dofs on level=3: 26 +DEAL:3:1d::n_locally_owned_mg_dofs on level=4: 52 +DEAL:3:1d::n_locally_owned_mg_dofs on level=5: 102 +DEAL:3:1d::n_locally_owned_mg_dofs on level=6: 204 +DEAL:3:1d:: +DEAL:3:2d::n_levels: 4 +DEAL:3:2d::n_cells: 1512 +DEAL:3:2d::n_active_cells: 1141 +DEAL:3:2d::n_cells on level=0: 28 +DEAL:3:2d::n_cells on level=1: 112 +DEAL:3:2d::n_cells on level=2: 324 +DEAL:3:2d::n_cells on level=3: 1048 +DEAL:3:2d::n_active_cells on level=0: 0 +DEAL:3:2d::n_active_cells on level=1: 31 +DEAL:3:2d::n_active_cells on level=2: 62 +DEAL:3:2d::n_active_cells on level=3: 1048 +DEAL:3:2d:: +DEAL:3:2d::n_dofs: 16641 +DEAL:3:2d::n_locally_owned_dofs: 3312 +DEAL:3:2d::n_dofs on level=0: 289 +DEAL:3:2d::n_dofs on level=1: 1089 +DEAL:3:2d::n_dofs on level=2: 4225 +DEAL:3:2d::n_dofs on level=3: 16641 +DEAL:3:2d::n_locally_owned_mg_dofs on level=0: 56 +DEAL:3:2d::n_locally_owned_mg_dofs on level=1: 212 +DEAL:3:2d::n_locally_owned_mg_dofs on level=2: 836 +DEAL:3:2d::n_locally_owned_mg_dofs on level=3: 3312 +DEAL:3:2d:: +DEAL:3:3d::n_levels: 4 +DEAL:3:3d::n_cells: 12732 +DEAL:3:3d::n_active_cells: 11146 +DEAL:3:3d::n_cells on level=0: 44 +DEAL:3:3d::n_cells on level=1: 352 +DEAL:3:3d::n_cells on level=2: 1840 +DEAL:3:3d::n_cells on level=3: 10496 +DEAL:3:3d::n_active_cells on level=0: 0 +DEAL:3:3d::n_active_cells on level=1: 122 +DEAL:3:3d::n_active_cells on level=2: 528 +DEAL:3:3d::n_active_cells on level=3: 10496 +DEAL:3:3d:: +DEAL:3:3d::n_dofs: 274625 +DEAL:3:3d::n_locally_owned_dofs: 54080 +DEAL:3:3d::n_dofs on level=0: 729 +DEAL:3:3d::n_dofs on level=1: 4913 +DEAL:3:3d::n_dofs on level=2: 35937 +DEAL:3:3d::n_dofs on level=3: 274625 +DEAL:3:3d::n_locally_owned_mg_dofs on level=0: 128 +DEAL:3:3d::n_locally_owned_mg_dofs on level=1: 920 +DEAL:3:3d::n_locally_owned_mg_dofs on level=2: 6968 +DEAL:3:3d::n_locally_owned_mg_dofs on level=3: 54080 +DEAL:3:3d:: + + +DEAL:4:1d::n_levels: 7 +DEAL:4:1d::n_cells: 216 +DEAL:4:1d::n_active_cells: 109 +DEAL:4:1d::n_cells on level=0: 2 +DEAL:4:1d::n_cells on level=1: 4 +DEAL:4:1d::n_cells on level=2: 8 +DEAL:4:1d::n_cells on level=3: 16 +DEAL:4:1d::n_cells on level=4: 28 +DEAL:4:1d::n_cells on level=5: 54 +DEAL:4:1d::n_cells on level=6: 104 +DEAL:4:1d::n_active_cells on level=0: 0 +DEAL:4:1d::n_active_cells on level=1: 0 +DEAL:4:1d::n_active_cells on level=2: 0 +DEAL:4:1d::n_active_cells on level=3: 2 +DEAL:4:1d::n_active_cells on level=4: 1 +DEAL:4:1d::n_active_cells on level=5: 2 +DEAL:4:1d::n_active_cells on level=6: 104 +DEAL:4:1d:: +DEAL:4:1d::n_dofs: 1025 +DEAL:4:1d::n_locally_owned_dofs: 204 +DEAL:4:1d::n_dofs on level=0: 17 +DEAL:4:1d::n_dofs on level=1: 33 +DEAL:4:1d::n_dofs on level=2: 65 +DEAL:4:1d::n_dofs on level=3: 129 +DEAL:4:1d::n_dofs on level=4: 257 +DEAL:4:1d::n_dofs on level=5: 513 +DEAL:4:1d::n_dofs on level=6: 1025 +DEAL:4:1d::n_locally_owned_mg_dofs on level=0: 2 +DEAL:4:1d::n_locally_owned_mg_dofs on level=1: 6 +DEAL:4:1d::n_locally_owned_mg_dofs on level=2: 12 +DEAL:4:1d::n_locally_owned_mg_dofs on level=3: 24 +DEAL:4:1d::n_locally_owned_mg_dofs on level=4: 50 +DEAL:4:1d::n_locally_owned_mg_dofs on level=5: 102 +DEAL:4:1d::n_locally_owned_mg_dofs on level=6: 204 +DEAL:4:1d:: +DEAL:4:2d::n_levels: 4 +DEAL:4:2d::n_cells: 1329 +DEAL:4:2d::n_active_cells: 1002 +DEAL:4:2d::n_cells on level=0: 21 +DEAL:4:2d::n_cells on level=1: 84 +DEAL:4:2d::n_cells on level=2: 272 +DEAL:4:2d::n_cells on level=3: 952 +DEAL:4:2d::n_active_cells on level=0: 0 +DEAL:4:2d::n_active_cells on level=1: 16 +DEAL:4:2d::n_active_cells on level=2: 34 +DEAL:4:2d::n_active_cells on level=3: 952 +DEAL:4:2d:: +DEAL:4:2d::n_dofs: 16641 +DEAL:4:2d::n_locally_owned_dofs: 3280 +DEAL:4:2d::n_dofs on level=0: 289 +DEAL:4:2d::n_dofs on level=1: 1089 +DEAL:4:2d::n_dofs on level=2: 4225 +DEAL:4:2d::n_dofs on level=3: 16641 +DEAL:4:2d::n_locally_owned_mg_dofs on level=0: 48 +DEAL:4:2d::n_locally_owned_mg_dofs on level=1: 204 +DEAL:4:2d::n_locally_owned_mg_dofs on level=2: 820 +DEAL:4:2d::n_locally_owned_mg_dofs on level=3: 3280 +DEAL:4:2d:: +DEAL:4:3d::n_levels: 4 +DEAL:4:3d::n_cells: 10642 +DEAL:4:3d::n_active_cells: 9316 +DEAL:4:3d::n_cells on level=0: 34 +DEAL:4:3d::n_cells on level=1: 272 +DEAL:4:3d::n_cells on level=2: 1448 +DEAL:4:3d::n_cells on level=3: 8888 +DEAL:4:3d::n_active_cells on level=0: 0 +DEAL:4:3d::n_active_cells on level=1: 91 +DEAL:4:3d::n_active_cells on level=2: 337 +DEAL:4:3d::n_active_cells on level=3: 8888 +DEAL:4:3d:: +DEAL:4:3d::n_dofs: 274625 +DEAL:4:3d::n_locally_owned_dofs: 52928 +DEAL:4:3d::n_dofs on level=0: 729 +DEAL:4:3d::n_dofs on level=1: 4913 +DEAL:4:3d::n_dofs on level=2: 35937 +DEAL:4:3d::n_dofs on level=3: 274625 +DEAL:4:3d::n_locally_owned_mg_dofs on level=0: 104 +DEAL:4:3d::n_locally_owned_mg_dofs on level=1: 848 +DEAL:4:3d::n_locally_owned_mg_dofs on level=2: 6680 +DEAL:4:3d::n_locally_owned_mg_dofs on level=3: 52928 +DEAL:4:3d:: +