From: Daniel Arndt Date: Sun, 1 Oct 2017 18:14:50 +0000 (+0200) Subject: Add tests X-Git-Tag: v9.0.0-rc1~995^2~1 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56fcd3db7207599a9cbec4422c30b8d7c200097e;p=dealii.git Add tests --- diff --git a/tests/matrix_free/parallel_multigrid_adaptive_07.cc b/tests/matrix_free/parallel_multigrid_adaptive_07.cc new file mode 100644 index 0000000000..b7373261b7 --- /dev/null +++ b/tests/matrix_free/parallel_multigrid_adaptive_07.cc @@ -0,0 +1,419 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2014 - 2017 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 at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + + +// This test is similar to parallel_multigrid_adaptive_06 but we also test +// for different polynomial degree in different blocks. +// We expect to have the same iteration numbers as in +// parallel_multigrid_adaptive_06 with repsect to the highest polynomial +// degree used. + + +#include "../tests.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +std::ofstream logfile("output"); + +using namespace dealii::MatrixFreeOperators; + +/** + * Block-Laplace operator with Block vector. + */ +template > +class BlockLaplace : public Subscriptor +{ +public: + typedef typename BlockVectorType::value_type value_type; + typedef typename BlockVectorType::size_type size_type; + + BlockLaplace () + : Subscriptor() + { + } + + void initialize (std::shared_ptr> data) + { + laplace1.initialize(data, std::vector(1,0)); + laplace2.initialize(data, std::vector(1,1)); + } + + void initialize (std::shared_ptr> data, + const std::vector &mg_constrained_dofs, + const unsigned int level) + { + laplace1.initialize(data, mg_constrained_dofs[0], level, std::vector(1,0)); + laplace2.initialize(data, mg_constrained_dofs[1], level, std::vector(1,1)); + } + + void vmult_interface_down (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.vmult_interface_down(dst.block(0), src.block(0)); + laplace2.vmult_interface_down(dst.block(1), src.block(1)); + } + + void vmult_interface_up (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.vmult_interface_up(dst.block(0), src.block(0)); + laplace2.vmult_interface_up(dst.block(1), src.block(1)); + } + + void vmult (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.vmult(dst.block(0), src.block(0)); + laplace2.vmult(dst.block(1), src.block(1)); + } + + void Tvmult (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.Tvmult(dst.block(0), src.block(0)); + laplace2.Tvmult(dst.block(1), src.block(1)); + } + + void vmult_add (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.vmult_add(dst.block(0), src.block(0)); + laplace2.vmult_add(dst.block(1), src.block(1)); + } + + void Tvmult_add (BlockVectorType &dst, const BlockVectorType &src) const + { + laplace1.Tvmult_add(dst.block(0), src.block(0)); + laplace2.Tvmult_add(dst.block(1), src.block(1)); + } + + void precondition_Jacobi (BlockVectorType &dst, const BlockVectorType &src, const value_type omega) const + { + laplace1.precondition_Jacobi(dst.block(0), src.block(0), omega); + laplace2.precondition_Jacobi(dst.block(1), src.block(1), omega); + } + + void compute_diagonal () + { + laplace1.compute_diagonal (); + laplace2.compute_diagonal (); + } + + + virtual void clear() + { + laplace1.clear(); + laplace2.clear(); + } + +private: + + MatrixFreeOperators::LaplaceOperator laplace1; + MatrixFreeOperators::LaplaceOperator laplace2; + +}; + + + +template +class MGCoarseIterative : public MGCoarseGridBase > +{ +public: + MGCoarseIterative() {} + + void initialize(const MatrixType &matrix) + { + coarse_matrix = &matrix; + } + + virtual void operator() (const unsigned int level, + LinearAlgebra::distributed::BlockVector &dst, + const LinearAlgebra::distributed::BlockVector &src) const + { + ReductionControl solver_control (1e4, 1e-50, 1e-10); + SolverCG > solver_coarse (solver_control); + solver_coarse.solve (*coarse_matrix, dst, src, PreconditionIdentity()); + } + + const MatrixType *coarse_matrix; +}; + + + +template +void do_test (const std::vector*> &dof) +{ + const unsigned int nb = 2; + if (types_are_equal::value == true) + { + deallog.push("float"); + } + else + { + } + + for (unsigned int i=0; iget_fe().get_name(); + deallog << std::endl; + deallog << "Number of degrees of freedom: " << dof[i]->n_dofs() << std::endl; + } + + std::vector locally_relevant_dofs(dof.size()); + for (unsigned int i=0; i zero_function; + typename FunctionMap::type dirichlet_boundary; + dirichlet_boundary[0] = &zero_function; + + // fine-level constraints + std::vector constraints(dof.size()); + std::vector constraints_ptrs(dof.size()); + for (unsigned int i=0; i quad(n_q_points_1d); + constexpr int max_degree = std_cxx14::max(fe_degree_1, fe_degree_2); + MappingQ mapping(max_degree); + + typename MatrixFree::AdditionalData fine_level_additional_data; + fine_level_additional_data.tasks_parallel_scheme = MatrixFree::AdditionalData::none; + fine_level_additional_data.tasks_block_size = 3; + + std::shared_ptr >fine_level_data (new MatrixFree()); + fine_level_data->reinit (mapping, dof, constraints_ptrs, quad, fine_level_additional_data); + + BlockLaplace> fine_matrix; + + fine_matrix.initialize(fine_level_data); + fine_matrix.compute_diagonal(); + + LinearAlgebra::distributed::BlockVector in(nb), sol(nb); + for (unsigned int b=0; b < nb; ++b) + { + fine_level_data->initialize_dof_vector(in.block(b),b); + fine_level_data->initialize_dof_vector(sol.block(b),b); + } + + in.collect_sizes(); + sol.collect_sizes(); + + // set constant rhs vector + { + for (unsigned int b = 0; b < nb; ++b) + { + // this is to make it consistent with parallel_multigrid_adaptive.cc + ConstraintMatrix hanging_node_constraints; + + hanging_node_constraints.reinit(locally_relevant_dofs[b]); + DoFTools::make_hanging_node_constraints(*dof[b], hanging_node_constraints); + hanging_node_constraints.close(); + + for (unsigned int i = 0; i < in.block(b).local_size(); ++i) + if (!hanging_node_constraints.is_constrained(in.block(b).get_partitioner()->local_to_global(i))) + in.block(b).local_element(i) = 1.; + } + } + + // level constraints: + std::vector mg_constrained_dofs(dof.size()); + for (unsigned int i=0; i> LevelMatrixType; + + MGLevelObject mg_matrices; + MGLevelObject > mg_level_data; + mg_matrices.resize(0, dof[0]->get_triangulation().n_global_levels()-1); + mg_level_data.resize(0, dof[0]->get_triangulation().n_global_levels()-1); + for (unsigned int level = 0; levelget_triangulation().n_global_levels(); ++level) + { + typename MatrixFree::AdditionalData mg_additional_data; + mg_additional_data.tasks_parallel_scheme = MatrixFree::AdditionalData::none; + mg_additional_data.tasks_block_size = 3; + mg_additional_data.level_mg_handler = level; + + std::vector level_constraints(dof.size()); + std::vector level_constraints_ptrs(dof.size()); + for (unsigned int i=0; i >( + mg_level_data[level]), + mg_constrained_dofs, + level); + mg_matrices[level].compute_diagonal(); + } + + MGLevelObject > mg_interface_matrices; + mg_interface_matrices.resize(0, dof[0]->get_triangulation().n_global_levels()-1); + for (unsigned int level=0; levelget_triangulation().n_global_levels(); ++level) + mg_interface_matrices[level].initialize(mg_matrices[level]); + + MGTransferBlockMatrixFree mg_transfer(mg_constrained_dofs); + mg_transfer.build(dof); + + MGCoarseIterative mg_coarse; + mg_coarse.initialize(mg_matrices[0]); + + typedef PreconditionJacobi SMOOTHER; + MGSmootherPrecondition > + mg_smoother; + + mg_smoother.initialize(mg_matrices, typename SMOOTHER::AdditionalData(0.8)); + + mg::Matrix > + mg_matrix(mg_matrices); + mg::Matrix > + mg_interface(mg_interface_matrices); + + Multigrid > mg( + mg_matrix, + mg_coarse, + mg_transfer, + mg_smoother, + mg_smoother); + mg.set_edge_matrices(mg_interface, mg_interface); + PreconditionMG, + MGTransferBlockMatrixFree> + preconditioner(dof, mg, mg_transfer); + + { + // avoid output from inner (coarse-level) solver + deallog.depth_file(3); + + ReductionControl control(30, 1e-20, 1e-7); + SolverCG > solver(control); + solver.solve(fine_matrix, sol, in, preconditioner); + } + + if (types_are_equal::value == true) + deallog.pop(); + + fine_matrix.clear(); + for (unsigned int level = 0; levelget_triangulation().n_global_levels(); ++level) + mg_matrices[level].clear(); +} + + + +template +void test () +{ + parallel::distributed::Triangulation tria(MPI_COMM_WORLD, + Triangulation::limit_level_difference_at_vertices, + parallel::distributed::Triangulation::construct_multigrid_hierarchy); + GridGenerator::hyper_cube (tria); + tria.refine_global(6-dim); + constexpr int max_degree = std_cxx14::max(fe_degree_1, fe_degree_2); + const unsigned int n_runs = max_degree == 1 ? 6-dim : 5-dim; + for (unsigned int i=0; i::active_cell_iterator cell=tria.begin_active(); + cell != tria.end(); ++cell) + if (cell->is_locally_owned() &&( + ((cell->center().norm() < 0.5 && (cell->level() < 5 || + cell->center().norm() > 0.45)) + || + (dim == 2 && cell->center().norm() > 1.2)))) + cell->set_refine_flag(); + tria.execute_coarsening_and_refinement(); + FE_Q fe_1 (fe_degree_1); + DoFHandler dof_1 (tria); + dof_1.distribute_dofs(fe_1); + dof_1.distribute_mg_dofs(); + + FE_Q fe_2 (fe_degree_2); + DoFHandler dof_2 (tria); + dof_2.distribute_dofs(fe_2); + dof_2.distribute_mg_dofs(); + + std::vector *> dh_ptrs {&dof_1, &dof_2}; + + constexpr int n_q_points_1d = std_cxx14::max(fe_degree_1, fe_degree_2)+1; + do_test (dh_ptrs); + } +} + + + +int main (int argc, char **argv) +{ + Utilities::MPI::MPI_InitFinalize mpi_init(argc, argv, 1); + + if (Utilities::MPI::this_mpi_process(MPI_COMM_WORLD) == 0) + { + deallog.attach(logfile); + deallog << std::setprecision (4); + } + + // 2 blocks + { + deallog.push("2d"); + test<2,1,1>(); + deallog << std::endl; + test<2,1,3>(); + deallog << std::endl; + test<2,3,1>(); + deallog.pop(); + deallog << std::endl; + deallog.push("3d"); + test<3,1,1>(); + deallog << std::endl; + test<3,1,2>(); + deallog << std::endl; + test<3,2,1>(); + deallog.pop(); + } + +} diff --git a/tests/matrix_free/parallel_multigrid_adaptive_07.with_mpi=true.with_p4est=true.mpirun=3.output b/tests/matrix_free/parallel_multigrid_adaptive_07.with_mpi=true.with_p4est=true.mpirun=3.output new file mode 100644 index 0000000000..158a6bcb02 --- /dev/null +++ b/tests/matrix_free/parallel_multigrid_adaptive_07.with_mpi=true.with_p4est=true.mpirun=3.output @@ -0,0 +1,108 @@ + +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 507 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 507 +DEAL:2d:cg::Starting value 31.02 +DEAL:2d:cg::Convergence step 7 value 2.774e-07 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 881 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 881 +DEAL:2d:cg::Starting value 39.27 +DEAL:2d:cg::Convergence step 8 value 4.180e-07 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 2147 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 2147 +DEAL:2d:cg::Starting value 61.17 +DEAL:2d:cg::Convergence step 7 value 2.918e-06 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 6517 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 6517 +DEAL:2d:cg::Starting value 108.8 +DEAL:2d:cg::Convergence step 7 value 1.026e-05 +DEAL:2d:: +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 507 +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 4259 +DEAL:2d:cg::Starting value 67.90 +DEAL:2d:cg::Convergence step 9 value 1.556e-06 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 881 +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 7457 +DEAL:2d:cg::Starting value 87.62 +DEAL:2d:cg::Convergence step 9 value 8.294e-06 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 2147 +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 18535 +DEAL:2d:cg::Starting value 137.9 +DEAL:2d:cg::Convergence step 9 value 1.073e-05 +DEAL:2d:: +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 4259 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 507 +DEAL:2d:cg::Starting value 67.90 +DEAL:2d:cg::Convergence step 9 value 1.556e-06 +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 7457 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 881 +DEAL:2d:cg::Starting value 87.62 +DEAL:2d:cg::Convergence step 9 value 8.294e-06 +DEAL:2d::Testing FE_Q<2>(3) +DEAL:2d::Number of degrees of freedom: 18535 +DEAL:2d::Testing FE_Q<2>(1) +DEAL:2d::Number of degrees of freedom: 2147 +DEAL:2d:cg::Starting value 137.9 +DEAL:2d:cg::Convergence step 9 value 1.073e-05 +DEAL:: +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 1103 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 1103 +DEAL:3d:cg::Starting value 44.14 +DEAL:3d:cg::Convergence step 8 value 5.248e-07 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 3694 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 3694 +DEAL:3d:cg::Starting value 77.78 +DEAL:3d:cg::Convergence step 8 value 7.285e-06 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 9566 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 9566 +DEAL:3d:cg::Starting value 107.7 +DEAL:3d:cg::Convergence step 9 value 8.661e-06 +DEAL:3d:: +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 1103 +DEAL:3d::Testing FE_Q<3>(2) +DEAL:3d::Number of degrees of freedom: 7494 +DEAL:3d:cg::Starting value 88.58 +DEAL:3d:cg::Convergence step 9 value 3.537e-06 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 3694 +DEAL:3d::Testing FE_Q<3>(2) +DEAL:3d::Number of degrees of freedom: 26548 +DEAL:3d:cg::Starting value 162.2 +DEAL:3d:cg::Convergence step 10 value 2.508e-06 +DEAL:3d:: +DEAL:3d::Testing FE_Q<3>(2) +DEAL:3d::Number of degrees of freedom: 7494 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 1103 +DEAL:3d:cg::Starting value 88.58 +DEAL:3d:cg::Convergence step 9 value 3.537e-06 +DEAL:3d::Testing FE_Q<3>(2) +DEAL:3d::Number of degrees of freedom: 26548 +DEAL:3d::Testing FE_Q<3>(1) +DEAL:3d::Number of degrees of freedom: 3694 +DEAL:3d:cg::Starting value 162.2 +DEAL:3d:cg::Convergence step 10 value 2.508e-06 diff --git a/tests/multigrid/transfer_06.cc b/tests/multigrid/transfer_06.cc new file mode 100644 index 0000000000..751b5b0f15 --- /dev/null +++ b/tests/multigrid/transfer_06.cc @@ -0,0 +1,218 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2006 - 2016 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 at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// check MGTransferBlockMatrixFree::copy_[from|to]_mg by comparision to non-block +// MGTransferMatrixFree. This is similar to transfer_05 but using +// a separate DoFHandler for each block + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace std; + + +template +void check(const unsigned int fe_degree) +{ + const unsigned int nb = 2; + + FE_Q fe_1(fe_degree+1); + FE_Q fe_2(fe_degree); + + deallog << "FE: " << fe_1.get_name() << std::endl; + deallog << "FE: " << fe_2.get_name() << std::endl; + + // run a few different sizes... + unsigned int sizes [] = {1, 2, 3}; + for (unsigned int cycle=0; cycle 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::construct_multigrid_hierarchy); + GridGenerator::subdivided_hyper_cube(tr, n_subdiv); + tr.refine_global(n_refinements); + + // adaptive refinement into a circle + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() < 0.5) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() > 0.3 && cell->center().norm() < 0.4) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() > 0.33 && cell->center().norm() < 0.37) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + + deallog << "no. cells: " << tr.n_global_active_cells() << std::endl; + + DoFHandler mgdof_1(tr); + mgdof_1.distribute_dofs(fe_1); + mgdof_1.distribute_mg_dofs(fe_1); + + DoFHandler mgdof_2(tr); + mgdof_2.distribute_dofs(fe_2); + mgdof_2.distribute_mg_dofs(fe_2); + + const std::vector*> mgdof_ptr {&mgdof_1, &mgdof_2}; + + std::vector mg_constrained_dofs_vector(2); + ZeroFunction zero_function; + typename FunctionMap::type dirichlet_boundary; + dirichlet_boundary[0] = &zero_function; + for (unsigned int i=0; i< mgdof_ptr.size(); ++i) + mg_constrained_dofs_vector[i].initialize(*mgdof_ptr[i], dirichlet_boundary); + + // build reference non-block + std::vector > transfer_ref; + for (unsigned int b=0; b transfer(mg_constrained_dofs_vector); + transfer.build(mgdof_ptr); + + MGLevelObject> lbv(0, tr.n_global_levels()-1); + LinearAlgebra::distributed::BlockVector bv(nb); + + MGLevelObject> lv(0, tr.n_global_levels()-1); + LinearAlgebra::distributed::Vector v(nb); + + // initialize + for (unsigned int b = 0; b < nb; ++b) + bv.block(b).reinit(mgdof_ptr[b]->locally_owned_dofs(), MPI_COMM_WORLD); + + for (unsigned int l=lbv.min_level(); l<=lbv.max_level(); ++l) + { + lbv[l].reinit(nb); + for (unsigned int b = 0; b < nb; ++b) + lbv[l].block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(l), MPI_COMM_WORLD); + + lbv[l].collect_sizes(); + + // set values: + for (unsigned int b = 0; b < nb; ++b) + for (unsigned int i=0; ilocally_owned_dofs(), MPI_COMM_WORLD); + + for (unsigned int l=lv.min_level(); l<=lv.max_level(); ++l) + { + lv[l].reinit(mgdof_ptr[b]->locally_owned_mg_dofs(l), MPI_COMM_WORLD); + lv[l] = lbv[l].block(b); + } + + transfer_ref[b].copy_from_mg(*mgdof_ptr[b], v, lv); + v -= bv.block(b); + deallog << "Diff copy_from_mg b" << b << ": " << v.l2_norm() << std::endl; + } + + // check copy_to_mg + // use un-initialized level-block vector to make sure that it will be + // set correctly in copy_to_mg(). + MGLevelObject> lbv2(0, tr.n_global_levels()-1); + for (unsigned int b=0; b < nb; ++b) + for (unsigned int i = 0; i < bv.block(b).local_size(); ++i) + bv.block(b).local_element(i) = (double)Testing::rand()/RAND_MAX; + + transfer.copy_to_mg(mgdof_ptr, lbv2, bv); + // Also check that the block vector has its (global) size set on each level: + for (unsigned int l=lv.min_level(); l<=lv.max_level(); ++l) + { + unsigned int total_size = 0; + for (unsigned int b=0; b < nb; ++b) + total_size += lbv2[l].block(b).size(); + + AssertThrow (total_size == lbv2[l].size(), + ExcDimensionMismatch(total_size,lbv2[l].size())); + } + + // Finally check the difference: + for (unsigned int b=0; b < nb; ++b) + { + v.reinit(mgdof_ptr[b]->locally_owned_dofs(), MPI_COMM_WORLD); + + v = bv.block(b); + transfer_ref[b].copy_to_mg(*mgdof_ptr[b], lv, v); + for (unsigned int l=lv.min_level(); l<=lv.max_level(); ++l) + { + lv[l] -= lbv2[l].block(b); + deallog << "Diff copy_to_mg l" << l << ": " << lv[l].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_06.with_mpi=true.with_p4est=true.mpirun=3.output b/tests/multigrid/transfer_06.with_mpi=true.with_p4est=true.mpirun=3.output new file mode 100644 index 0000000000..0a70122af5 --- /dev/null +++ b/tests/multigrid/transfer_06.with_mpi=true.with_p4est=true.mpirun=3.output @@ -0,0 +1,265 @@ + +DEAL::FE: FE_Q<2>(2) +DEAL::FE: FE_Q<2>(1) +DEAL::no. cells: 88 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::no. cells: 250 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l6: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l6: 0.00000 +DEAL:: +DEAL::no. cells: 510 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::FE: FE_Q<2>(4) +DEAL::FE: FE_Q<2>(3) +DEAL::no. cells: 34 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL:: +DEAL::no. cells: 88 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::no. cells: 141 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(2) +DEAL::FE: FE_Q<3>(1) +DEAL::no. cells: 15 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL:: +DEAL::no. cells: 694 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::no. cells: 1791 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(4) +DEAL::FE: FE_Q<3>(3) +DEAL::no. cells: 1 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL:: +DEAL::no. cells: 15 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL:: +DEAL::no. cells: 223 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL:: +DEAL::FE: FE_Q<2>(3) +DEAL::FE: FE_Q<2>(2) +DEAL::no. cells: 88 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::no. cells: 250 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l6: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l6: 0.00000 +DEAL:: +DEAL::no. cells: 510 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::FE: FE_Q<3>(3) +DEAL::FE: FE_Q<3>(2) +DEAL::no. cells: 15 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL:: +DEAL::no. cells: 694 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l5: 0.00000 +DEAL:: +DEAL::no. cells: 1791 +DEAL::Diff copy_from_mg b0: 0.00000 +DEAL::Diff copy_from_mg b1: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL::Diff copy_to_mg l0: 0.00000 +DEAL::Diff copy_to_mg l1: 0.00000 +DEAL::Diff copy_to_mg l2: 0.00000 +DEAL::Diff copy_to_mg l3: 0.00000 +DEAL::Diff copy_to_mg l4: 0.00000 +DEAL:: diff --git a/tests/multigrid/transfer_matrix_free_02_block_02.cc b/tests/multigrid/transfer_matrix_free_02_block_02.cc new file mode 100644 index 0000000000..6ab03ee1fb --- /dev/null +++ b/tests/multigrid/transfer_matrix_free_02_block_02.cc @@ -0,0 +1,181 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2016 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 at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// Check MGTransferBlockMatrixFree by comparison with MGTransferMatrixFree on a +// series of adaptive meshes for FE_Q. This is similar to transfer_matrix_free_02.cc +// but using separate DoFHandlers for each block. + +#include "../tests.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +template +void check(const unsigned int fe_degree) +{ + const unsigned int nb = 2; + + FE_Q fe_1(fe_degree+1); + FE_Q fe_2(fe_degree); + + deallog << "FE: " << fe_1.get_name() << std::endl; + deallog << "FE: " << fe_2.get_name() << std::endl; + + // run a few different sizes... + unsigned int sizes [] = {1, 2, 3}; + for (unsigned int cycle=0; cycle 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::construct_multigrid_hierarchy); + GridGenerator::subdivided_hyper_cube(tr, n_subdiv); + tr.refine_global(n_refinements); + + // adaptive refinement into a circle + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() < 0.5) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() > 0.3 && cell->center().norm() < 0.4) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + for (typename Triangulation::active_cell_iterator cell=tr.begin_active(); cell != tr.end(); ++cell) + if (cell->is_locally_owned() && + cell->center().norm() > 0.33 && cell->center().norm() < 0.37) + cell->set_refine_flag(); + tr.execute_coarsening_and_refinement(); + + deallog << "no. cells: " << tr.n_global_active_cells() << std::endl; + + DoFHandler mgdof_1(tr); + mgdof_1.distribute_dofs(fe_1); + mgdof_1.distribute_mg_dofs(fe_1); + + DoFHandler mgdof_2(tr); + mgdof_2.distribute_dofs(fe_2); + mgdof_2.distribute_mg_dofs(fe_2); + + const std::vector*> mgdof_ptr {&mgdof_1, &mgdof_2}; + + std::vector mg_constrained_dofs_vector(2); + ZeroFunction zero_function; + typename FunctionMap::type dirichlet_boundary; + dirichlet_boundary[0] = &zero_function; + for (unsigned int i=0; i< mgdof_ptr.size(); ++i) + mg_constrained_dofs_vector[i].initialize(*mgdof_ptr[i], dirichlet_boundary); + + // build reference + std::vector > transfer_ref; + for (unsigned int b=0; b transfer(mg_constrained_dofs_vector); + transfer.build(mgdof_ptr); + + // check prolongation for all levels using random vector + for (unsigned int level=1; levelget_triangulation().n_global_levels(); ++level) + { + LinearAlgebra::distributed::BlockVector v1(nb), v2(nb), v3(nb); + for (unsigned int b = 0; b < nb; ++b) + { + v1.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level-1), MPI_COMM_WORLD); + v2.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level), MPI_COMM_WORLD); + v3.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level), MPI_COMM_WORLD); + + for (unsigned int i=0; iget_triangulation().n_global_levels(); ++level) + { + LinearAlgebra::distributed::BlockVector v1(nb), v2(nb), v3(nb); + for (unsigned int b = 0; b < nb; ++b) + { + v1.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level), MPI_COMM_WORLD); + v2.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level-1), MPI_COMM_WORLD); + v3.block(b).reinit(mgdof_ptr[b]->locally_owned_mg_dofs(level-1), MPI_COMM_WORLD); + + for (unsigned int i=0; i(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_02_block_02.with_mpi=true.with_p4est=true.with_trilinos=true.mpirun=5.output b/tests/multigrid/transfer_matrix_free_02_block_02.with_mpi=true.with_p4est=true.with_trilinos=true.mpirun=5.output new file mode 100644 index 0000000000..62ed8e7064 --- /dev/null +++ b/tests/multigrid/transfer_matrix_free_02_block_02.with_mpi=true.with_p4est=true.with_trilinos=true.mpirun=5.output @@ -0,0 +1,265 @@ + +DEAL::FE: FE_Q<2>(2) +DEAL::FE: FE_Q<2>(1) +DEAL::no. cells: 88 +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::no. cells: 250 +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 prolongate l6: 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::Diff restrict l6: 0.00000 +DEAL::Diff restrict add l6: 0.00000 +DEAL:: +DEAL::no. cells: 510 +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>(4) +DEAL::FE: FE_Q<2>(3) +DEAL::no. cells: 34 +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: 88 +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::no. cells: 141 +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>(2) +DEAL::FE: FE_Q<3>(1) +DEAL::no. cells: 15 +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: 694 +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::no. cells: 1791 +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>(4) +DEAL::FE: FE_Q<3>(3) +DEAL::no. cells: 1 +DEAL:: +DEAL::no. cells: 15 +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: 223 +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>(3) +DEAL::FE: FE_Q<2>(2) +DEAL::no. cells: 88 +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::no. cells: 250 +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 prolongate l6: 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::Diff restrict l6: 0.00000 +DEAL::Diff restrict add l6: 0.00000 +DEAL:: +DEAL::no. cells: 510 +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>(3) +DEAL::FE: FE_Q<3>(2) +DEAL::no. cells: 15 +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: 694 +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::no. cells: 1791 +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::