diff --git a/include/deal.II/multigrid/mg_transfer_matrix_free.h b/include/deal.II/multigrid/mg_transfer_matrix_free.h index eca95d31acd5..57410006fcde 100644 --- a/include/deal.II/multigrid/mg_transfer_matrix_free.h +++ b/include/deal.II/multigrid/mg_transfer_matrix_free.h @@ -1745,6 +1745,178 @@ MGTransferMatrixFree::interpolate_to_mg( } +/** + * Template specialization for device vectors. + * Currently works by transferring device vectors back to the host and + * performing the transfer operation on the host. Eventually this should be + * replaced by all operations occurring on the device. + */ + +template +class MGTransferMatrixFree + : public MGTransferBase< + LinearAlgebra::distributed::Vector> +{ +public: + using VectorType = + LinearAlgebra::distributed::Vector; + using VectorTypeHost = + LinearAlgebra::distributed::Vector; + + MGTransferMatrixFree() + : transfer() + {} + + MGTransferMatrixFree(const MGConstrainedDoFs &mg_constrained_dofs) + : transfer(mg_constrained_dofs) + {} + + MGTransferMatrixFree( + const MGLevelObject> &mg_transfers, + const std::function + &initialize_dof_vector) + : transfer(mg_transfers, initialize_dof_vector) + {} + + void + build(const std::vector> + &external_partitioners = {}) + { + transfer.build(external_partitioners); + } + + void + build(const std::function + &initialize_dof_vector) + { + transfer.build(initialize_dof_vector); + } + + void + build(const DoFHandler &dof_handler, + const std::vector> + &external_partitioners = {}) + { + transfer.build(dof_handler, external_partitioners); + } + + void + build(const DoFHandler &dof_handler, + const std::function + &initialize_dof_vector) + { + transfer.build(dof_handler, initialize_dof_vector); + } + + + template + void + copy_to_mg( + const DoFHandler &dof_handler, + MGLevelObject &dst, + const LinearAlgebra::distributed::Vector + &src) const + { + MGLevelObject dst_host(dst.min_level(), dst.max_level()); + LinearAlgebra::distributed::Vector + src_host; + + copy_to_host(src_host, src); + + transfer.copy_to_mg(dof_handler, dst_host, src_host); + + for (unsigned int l = dst.min_level(); l <= dst.max_level(); ++l) + copy_from_host(dst[l], dst_host[l]); + } + + template + void + copy_from_mg( + const DoFHandler &dof_handler, + LinearAlgebra::distributed::Vector &dst, + const MGLevelObject &src) const + { + LinearAlgebra::distributed::Vector + dst_host; + MGLevelObject src_host(src.min_level(), src.max_level()); + + dst_host.reinit(dst.get_partitioner()); + for (unsigned int l = src.min_level(); l <= src.max_level(); ++l) + copy_to_host(src_host[l], src[l]); + + transfer.copy_from_mg(dof_handler, dst_host, src_host); + + copy_from_host(dst, dst_host); + } + + void + prolongate(const unsigned int to_level, + VectorType &dst, + const VectorType &src) const override + { + VectorTypeHost dst_host; + VectorTypeHost src_host; + + dst_host.reinit(dst.get_partitioner()); + copy_to_host(src_host, src); + + transfer.prolongate(to_level, dst_host, src_host); + + copy_from_host(dst, dst_host); + } + + void + restrict_and_add(const unsigned int from_level, + VectorType &dst, + const VectorType &src) const override + { + VectorTypeHost dst_host; + VectorTypeHost src_host; + + copy_to_host(dst_host, dst); + copy_to_host(src_host, src); + + transfer.restrict_and_add(from_level, dst_host, src_host); + + copy_from_host(dst, dst_host); + } + +private: + MGTransferMatrixFree transfer; + + template + void + copy_to_host( + LinearAlgebra::distributed::Vector &dst, + const LinearAlgebra::distributed::Vector + &src) const + { + LinearAlgebra::ReadWriteVector rw_vector( + src.get_partitioner()->locally_owned_range()); + rw_vector.import_elements(src, VectorOperation::insert); + + dst.reinit(src.get_partitioner()); + dst.import_elements(rw_vector, VectorOperation::insert); + } + + template + void + copy_from_host( + LinearAlgebra::distributed::Vector &dst, + const LinearAlgebra::distributed::Vector + &src) const + { + LinearAlgebra::ReadWriteVector rw_vector( + src.get_partitioner()->locally_owned_range()); + rw_vector.import_elements(src, VectorOperation::insert); + + if (dst.size() == 0) + dst.reinit(src.get_partitioner()); + dst.import_elements(rw_vector, VectorOperation::insert); + } +}; + + template template diff --git a/tests/multigrid/transfer_matrix_free_device_01.cc b/tests/multigrid/transfer_matrix_free_device_01.cc new file mode 100644 index 000000000000..6c4e0af30788 --- /dev/null +++ b/tests/multigrid/transfer_matrix_free_device_01.cc @@ -0,0 +1,190 @@ +// ------------------------------------------------------------------------ +// +// SPDX-License-Identifier: LGPL-2.1-or-later +// Copyright (C) 2016 - 2023 by the deal.II authors +// +// This file is part of the deal.II library. +// +// Part of the source code is dual licensed under Apache-2.0 WITH +// LLVM-exception OR LGPL-2.1-or-later. Detailed license information +// governing the source code and code contributions can be found in +// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II. +// +// ------------------------------------------------------------------------ + + +// Check MGTransferMatrixFree by comparison with MGTransferPrebuilt on a +// series of meshes with uniform meshes for FE_Q + +#include + +#include + +#include + +#include + +#include +#include +#include +#include + +#include "../tests.h" + +using namespace dealii; + +template +void +copy_to_host( + LinearAlgebra::distributed::Vector &dst, + const LinearAlgebra::distributed::Vector &src) +{ + LinearAlgebra::ReadWriteVector rw_vector( + src.get_partitioner()->locally_owned_range()); + rw_vector.import_elements(src, VectorOperation::insert); + + dst.reinit(src.get_partitioner()); + dst.import_elements(rw_vector, VectorOperation::insert); +} + +template +void +copy_from_host( + LinearAlgebra::distributed::Vector &dst, + const LinearAlgebra::distributed::Vector + &src) +{ + LinearAlgebra::ReadWriteVector rw_vector( + src.get_partitioner()->locally_owned_range()); + rw_vector.import_elements(src, VectorOperation::insert); + + if (dst.size() == 0) + dst.reinit(src.get_partitioner()); + dst.import_elements(rw_vector, VectorOperation::insert); +} + +template +void +check(const unsigned int fe_degree) +{ + FE_Q fe(fe_degree); + deallog << "FE: " << fe.get_name() << std::endl; + + // run a few different sizes... + unsigned int sizes[] = {1, 2, 3, 4, 5, 6, 8}; + for (unsigned int cycle = 0; cycle < sizeof(sizes) / sizeof(unsigned int); + ++cycle) + { + unsigned int n_refinements = 0; + unsigned int n_subdiv = sizes[cycle]; + if (n_subdiv > 1) + while (n_subdiv % 2 == 0) + { + n_refinements += 1; + n_subdiv /= 2; + } + n_refinements += 3 - dim; + if (fe_degree < 3) + n_refinements += 1; + parallel::distributed::Triangulation tr( + MPI_COMM_WORLD, + Triangulation::limit_level_difference_at_vertices, + parallel::distributed::Triangulation< + dim>::construct_multigrid_hierarchy); + GridGenerator::subdivided_hyper_cube(tr, n_subdiv); + tr.refine_global(n_refinements); + deallog << "no. cells: " << tr.n_global_active_cells() << std::endl; + + DoFHandler mgdof(tr); + mgdof.distribute_dofs(fe); + mgdof.distribute_mg_dofs(); + + MGConstrainedDoFs mg_constrained_dofs; + mg_constrained_dofs.initialize(mgdof); + mg_constrained_dofs.make_zero_boundary_constraints(mgdof, {0}); + + // build host reference + MGTransferMatrixFree + transfer_host(mg_constrained_dofs); + transfer_host.build(mgdof); + + // build device transfer + MGTransferMatrixFree + transfer_device(mg_constrained_dofs); + transfer_device.build(mgdof); + + // check prolongation for all levels using random vector + for (unsigned int level = 1; + level < mgdof.get_triangulation().n_global_levels(); + ++level) + { + LinearAlgebra::distributed::Vector v1, v2; + LinearAlgebra::distributed::Vector + v1_cpy, v2_cpy, v3; + v1.reinit(mgdof.locally_owned_mg_dofs(level - 1), MPI_COMM_WORLD); + v2.reinit(mgdof.locally_owned_mg_dofs(level), MPI_COMM_WORLD); + v3.reinit(mgdof.locally_owned_mg_dofs(level), MPI_COMM_WORLD); + for (unsigned int i = 0; i < v1.locally_owned_size(); ++i) + v1.local_element(i) = random_value(); + + copy_from_host(v1_cpy, v1); + + transfer_host.prolongate(level, v2, v1); + transfer_device.prolongate(level, v3, v1_cpy); + + copy_from_host(v2_cpy, v2); + + v3 -= v2_cpy; + deallog << "Diff prolongate l" << level << ": " << v3.l2_norm() + << std::endl; + } + + // check restriction for all levels using random vector + for (unsigned int level = 1; + level < mgdof.get_triangulation().n_global_levels(); + ++level) + { + LinearAlgebra::distributed::Vector v1, v2; + LinearAlgebra::distributed::Vector + v1_cpy, v2_cpy, v3; + v1.reinit(mgdof.locally_owned_mg_dofs(level), MPI_COMM_WORLD); + v2.reinit(mgdof.locally_owned_mg_dofs(level - 1), MPI_COMM_WORLD); + v3.reinit(mgdof.locally_owned_mg_dofs(level - 1), MPI_COMM_WORLD); + for (unsigned int i = 0; i < v1.locally_owned_size(); ++i) + v1.local_element(i) = random_value(); + copy_from_host(v1_cpy, v1); + transfer_host.restrict_and_add(level, v2, v1); + transfer_device.restrict_and_add(level, v3, v1_cpy); + copy_from_host(v2_cpy, v2); + v3 -= v2_cpy; + deallog << "Diff restrict l" << level << ": " << v3.l2_norm() + << std::endl; + + v2 = 1.; + v3 = 1.; + transfer_host.restrict_and_add(level, v2, v1); + transfer_device.restrict_and_add(level, v3, v1_cpy); + copy_from_host(v2_cpy, v2); + v3 -= v2_cpy; + deallog << "Diff restrict add l" << level << ": " << v3.l2_norm() + << std::endl; + } + deallog << std::endl; + } +} + + +int +main(int argc, char **argv) +{ + // no threading in this test... + Utilities::MPI::MPI_InitFinalize mpi(argc, argv, 1); + mpi_initlog(); + + check<2, double>(1); + check<2, double>(3); + check<3, double>(1); + check<3, double>(3); + check<2, float>(2); + check<3, float>(2); +} diff --git a/tests/multigrid/transfer_matrix_free_device_01.with_p4est=true.output b/tests/multigrid/transfer_matrix_free_device_01.with_p4est=true.output new file mode 100644 index 000000000000..8a7b7a5c7111 --- /dev/null +++ b/tests/multigrid/transfer_matrix_free_device_01.with_p4est=true.output @@ -0,0 +1,364 @@ + +DEAL::FE: FE_Q<2>(1) +DEAL::no. cells: 16 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 144 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 256 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL:: +DEAL::no. cells: 400 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 576 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 1024 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff prolongate l5: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL::Diff restrict l5: 0.00000 +DEAL::Diff restrict add l5: 0.00000 +DEAL:: +DEAL::FE: FE_Q<2>(3) +DEAL::no. cells: 4 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 16 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 36 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 100 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 144 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 256 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(1) +DEAL::no. cells: 8 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 216 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 512 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 1000 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 1728 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 4096 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(3) +DEAL::no. cells: 1 +DEAL:: +DEAL::no. cells: 8 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 27 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 125 +DEAL:: +DEAL::no. cells: 216 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 512 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::FE: FE_Q<2>(2) +DEAL::no. cells: 16 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 144 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 256 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL:: +DEAL::no. cells: 400 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 576 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 1024 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff prolongate l5: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL::Diff restrict l5: 0.00000 +DEAL::Diff restrict add l5: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(2) +DEAL::no. cells: 8 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 64 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 216 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 512 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL:: +DEAL::no. cells: 1000 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL:: +DEAL::no. cells: 1728 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL:: +DEAL::no. cells: 4096 +DEAL::Diff prolongate l1: 0.00000 +DEAL::Diff prolongate l2: 0.00000 +DEAL::Diff prolongate l3: 0.00000 +DEAL::Diff prolongate l4: 0.00000 +DEAL::Diff restrict l1: 0.00000 +DEAL::Diff restrict add l1: 0.00000 +DEAL::Diff restrict l2: 0.00000 +DEAL::Diff restrict add l2: 0.00000 +DEAL::Diff restrict l3: 0.00000 +DEAL::Diff restrict add l3: 0.00000 +DEAL::Diff restrict l4: 0.00000 +DEAL::Diff restrict add l4: 0.00000 +DEAL::