From a6be5e78cb2a3e962fa6b75f535c941167967884 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Mon, 20 Sep 2021 10:28:53 -0400 Subject: [PATCH] Add test --- tests/lac/block_matrices_06.cc | 480 ++++++++++++++++++ ..._matrices_06.with_complex_values=on.output | 338 ++++++++++++ 2 files changed, 818 insertions(+) create mode 100644 tests/lac/block_matrices_06.cc create mode 100644 tests/lac/block_matrices_06.with_complex_values=on.output diff --git a/tests/lac/block_matrices_06.cc b/tests/lac/block_matrices_06.cc new file mode 100644 index 0000000000..92916f5ee6 --- /dev/null +++ b/tests/lac/block_matrices_06.cc @@ -0,0 +1,480 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2000 - 2020 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. +// +// --------------------------------------------------------------------- + +// Like lac/block_matrices_04 but for complex numbers + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../tests.h" + + +template +class LaplaceProblem +{ +public: + LaplaceProblem(const unsigned int n_blocks); + + void + run(); + void + reinit_sparsity(); + void + reinit_vectors(); + + VectorType solution; + +private: + void + make_grid_and_dofs(); + void + assemble_system(); + void + solve(); + + const unsigned int n_blocks; + + Triangulation<2> triangulation; + FE_Q<2> fe; + DoFHandler<2> dof_handler; + + Sparsity sparsity_pattern; + Matrix system_matrix; + + VectorType system_rhs; +}; + + +template +LaplaceProblem::LaplaceProblem( + const unsigned int n_blocks) + : n_blocks(n_blocks) + , fe(1) + , dof_handler(triangulation) +{ + sparsity_pattern.reinit(n_blocks, n_blocks); +} + + + +template <> +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::LaplaceProblem(const unsigned int n_blocks) + : n_blocks(n_blocks) + , fe(1) + , dof_handler(triangulation) +{} + + + +template <> +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::LaplaceProblem(const unsigned int n_blocks) + : n_blocks(n_blocks) + , fe(1) + , dof_handler(triangulation) +{} + + + +template +void +LaplaceProblem::make_grid_and_dofs() +{ + GridGenerator::hyper_cube(triangulation, -1, 1); + triangulation.refine_global(3); + deallog << "Number of active cells: " << triangulation.n_active_cells() + << std::endl; + deallog << "Total number of cells: " << triangulation.n_cells() << std::endl; + + dof_handler.distribute_dofs(fe); + + deallog << "Number of degrees of freedom: " << dof_handler.n_dofs() + << std::endl; + + reinit_sparsity(); + DoFTools::make_sparsity_pattern(dof_handler, sparsity_pattern); + sparsity_pattern.compress(); + + system_matrix.reinit(sparsity_pattern); + reinit_vectors(); +} + + +template <> +void +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::reinit_sparsity() +{ + sparsity_pattern.reinit(dof_handler.n_dofs(), + dof_handler.n_dofs(), + dof_handler.max_couplings_between_dofs()); +} + + + +template <> +void +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::reinit_vectors() +{ + solution.reinit(dof_handler.n_dofs()); + system_rhs.reinit(dof_handler.n_dofs()); +} + + + +template <> +void +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::reinit_sparsity() +{ + sparsity_pattern.reinit(dof_handler.n_dofs(), + dof_handler.n_dofs(), + dof_handler.max_couplings_between_dofs()); +} + + + +template <> +void +LaplaceProblem>, + SparseMatrix>, + SparsityPattern>::reinit_vectors() +{ + solution.reinit(dof_handler.n_dofs()); + system_rhs.reinit(dof_handler.n_dofs()); +} + + + +template <> +void +LaplaceProblem>, + BlockSparseMatrix>, + BlockSparsityPattern>::reinit_sparsity() +{ + switch (n_blocks) + { + case 2: + { + const types::global_dof_index n_dofs = dof_handler.n_dofs(); + const types::global_dof_index block_size[2] = {n_dofs / 3, + n_dofs - n_dofs / 3}; + + for (unsigned int i = 0; i < 2; ++i) + for (unsigned int j = 0; j < 2; ++j) + sparsity_pattern.block(i, j).reinit( + block_size[i], + block_size[j], + dof_handler.max_couplings_between_dofs()); + sparsity_pattern.collect_sizes(); + + break; + }; + + case 3: + { + const types::global_dof_index n_dofs = dof_handler.n_dofs(); + const types::global_dof_index block_size[3] = { + n_dofs / 5, n_dofs / 7, n_dofs - n_dofs / 5 - n_dofs / 7}; + + for (unsigned int i = 0; i < 3; ++i) + for (unsigned int j = 0; j < 3; ++j) + sparsity_pattern.block(i, j).reinit( + block_size[i], + block_size[j], + dof_handler.max_couplings_between_dofs()); + sparsity_pattern.collect_sizes(); + + break; + }; + + default: + AssertThrow(false, ExcNotImplemented()); + }; +} + + + +template <> +void +LaplaceProblem>, + BlockSparseMatrix>, + BlockSparsityPattern>::reinit_vectors() +{ + switch (n_blocks) + { + case 2: + { + const types::global_dof_index n_dofs = dof_handler.n_dofs(); + const types::global_dof_index block_size_[2] = {n_dofs / 3, + n_dofs - n_dofs / 3}; + const std::vector block_size( + &block_size_[0], &block_size_[2]); + + solution.reinit(block_size); + system_rhs.reinit(block_size); + + break; + }; + + case 3: + { + const types::global_dof_index n_dofs = dof_handler.n_dofs(); + const types::global_dof_index block_size_[3] = { + n_dofs / 5, n_dofs / 7, n_dofs - n_dofs / 5 - n_dofs / 7}; + const std::vector block_size( + &block_size_[0], &block_size_[3]); + + solution.reinit(block_size); + system_rhs.reinit(block_size); + + break; + }; + + default: + AssertThrow(false, ExcNotImplemented()); + }; +} + + + +template +void +LaplaceProblem::assemble_system() +{ + QGauss<2> quadrature_formula(2); + FEValues<2> fe_values(fe, + quadrature_formula, + UpdateFlags(update_values | update_gradients | + update_JxW_values)); + + const unsigned int dofs_per_cell = fe.dofs_per_cell; + const unsigned int n_q_points = quadrature_formula.size(); + + FullMatrix cell_matrix(dofs_per_cell, + dofs_per_cell); + ::Vector cell_rhs(dofs_per_cell); + + std::vector local_dof_indices(dofs_per_cell); + + DoFHandler<2>::active_cell_iterator cell = dof_handler.begin_active(), + endc = dof_handler.end(); + for (; cell != endc; ++cell) + { + fe_values.reinit(cell); + + cell_matrix = 0; + cell_rhs = 0; + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + for (unsigned int j = 0; j < dofs_per_cell; ++j) + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + cell_matrix(i, j) += + (fe_values.shape_grad(i, q_point) * + fe_values.shape_grad(j, q_point) * fe_values.JxW(q_point)); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + for (unsigned int q_point = 0; q_point < n_q_points; ++q_point) + cell_rhs(i) += + (fe_values.shape_value(i, q_point) * 1 * fe_values.JxW(q_point)); + + cell->get_dof_indices(local_dof_indices); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + for (unsigned int j = 0; j < dofs_per_cell; ++j) + system_matrix.add(local_dof_indices[i], + local_dof_indices[j], + cell_matrix(i, j)); + + for (unsigned int i = 0; i < dofs_per_cell; ++i) + system_rhs(local_dof_indices[i]) += cell_rhs(i); + }; + + + std::map + boundary_values; + VectorTools::interpolate_boundary_values( + dof_handler, + 0, + Functions::ZeroFunction<2, typename VectorType::value_type>(), + boundary_values); + MatrixTools::apply_boundary_values(boundary_values, + system_matrix, + solution, + system_rhs); +} + + +template +void +LaplaceProblem::solve() +{ + SolverControl solver_control(1000, 1e-12, false, false); + PrimitiveVectorMemory vector_memory; + SolverCG cg(solver_control, vector_memory); + + PreconditionJacobi preconditioner; + preconditioner.initialize(system_matrix, 0.8); + + cg.solve(system_matrix, solution, system_rhs, preconditioner); +} + + +template +void +LaplaceProblem::run() +{ + make_grid_and_dofs(); + assemble_system(); + solve(); + + for (unsigned int i = 0; i < solution.size(); ++i) + deallog + //<< typeid(VectorType).name () + //<< ' ' + //<< typeid(Matrix).name () + //<< '-' + << i << ' ' << solution(i) << std::endl; +} + + + +int +main() +{ + initlog(); + deallog << std::setprecision(2); + + + // vector of solution vectors + std::vector>> solutions; + + if (true) + { + LaplaceProblem>, + SparseMatrix>, + SparsityPattern> + laplace_problem(2); + laplace_problem.run(); + + solutions.push_back(std::vector>()); + solutions.back().resize(laplace_problem.solution.size()); + for (unsigned int i = 0; i < laplace_problem.solution.size(); ++i) + solutions.back()[i] = laplace_problem.solution(i); + }; + + if (true) + { + LaplaceProblem>, + SparseMatrix>, + SparsityPattern> + laplace_problem(3); + laplace_problem.run(); + + solutions.push_back(std::vector>()); + solutions.back().resize(laplace_problem.solution.size()); + for (unsigned int i = 0; i < laplace_problem.solution.size(); ++i) + solutions.back()[i] = laplace_problem.solution(i); + }; + + if (true) + { + LaplaceProblem>, + BlockSparseMatrix>, + BlockSparsityPattern> + laplace_problem(2); + laplace_problem.run(); + + solutions.push_back(std::vector>()); + solutions.back().resize(laplace_problem.solution.size()); + for (unsigned int i = 0; i < laplace_problem.solution.size(); ++i) + solutions.back()[i] = laplace_problem.solution(i); + }; + + if (true) + { + LaplaceProblem>, + BlockSparseMatrix>, + BlockSparsityPattern> + laplace_problem(3); + laplace_problem.run(); + + solutions.push_back(std::vector>()); + solutions.back().resize(laplace_problem.solution.size()); + for (unsigned int i = 0; i < laplace_problem.solution.size(); ++i) + solutions.back()[i] = laplace_problem.solution(i); + }; + + const unsigned int n_datasets = solutions.size(); + deallog << "Checking " << n_datasets << " data sets." << std::endl; + + for (unsigned int i = 1; i < n_datasets; ++i) + Assert(solutions[i].size() == solutions[i].size(), ExcInternalError()); + + deallog << std::setprecision(16); + for (unsigned int i = 1; i < n_datasets; ++i) + { + // relative accuracy. data set 1 is computed using floats + // instead of doubles, so lower our requirements + const double accuracy = (i == 1 ? 1e-6 : 1e-12); + + for (unsigned int j = 0; j < solutions[0].size(); ++j) + if (std::abs(solutions[i][j] - solutions[0][j]) > + accuracy * std::abs(solutions[i][j] + solutions[0][j])) + { + deallog << "Discrepancy: i=" << i << ", j=" << j + << ", sol[i][j]=" << solutions[i][j] + << ", sol[0][j]=" << solutions[0][j] << std::endl; + deallog << std::flush; + Assert(false, ExcInternalError()); + }; + }; + + + return 0; +} diff --git a/tests/lac/block_matrices_06.with_complex_values=on.output b/tests/lac/block_matrices_06.with_complex_values=on.output new file mode 100644 index 0000000000..46a1add110 --- /dev/null +++ b/tests/lac/block_matrices_06.with_complex_values=on.output @@ -0,0 +1,338 @@ + +DEAL::Number of active cells: 64 +DEAL::Total number of cells: 85 +DEAL::Number of degrees of freedom: 81 +DEAL::0 (0.0,0.0) +DEAL::1 (0.0,0.0) +DEAL::2 (0.0,0.0) +DEAL::3 (0.075,0.0) +DEAL::4 (0.0,0.0) +DEAL::5 (0.11,0.0) +DEAL::6 (0.0,0.0) +DEAL::7 (0.11,0.0) +DEAL::8 (0.18,0.0) +DEAL::9 (0.0,0.0) +DEAL::10 (0.14,0.0) +DEAL::11 (0.0,0.0) +DEAL::12 (0.14,0.0) +DEAL::13 (0.22,0.0) +DEAL::14 (0.23,0.0) +DEAL::15 (0.0,0.0) +DEAL::16 (0.14,0.0) +DEAL::17 (0.22,0.0) +DEAL::18 (0.0,0.0) +DEAL::19 (0.14,0.0) +DEAL::20 (0.23,0.0) +DEAL::21 (0.27,0.0) +DEAL::22 (0.28,0.0) +DEAL::23 (0.28,0.0) +DEAL::24 (0.30,0.0) +DEAL::25 (0.0,0.0) +DEAL::26 (0.14,0.0) +DEAL::27 (0.0,0.0) +DEAL::28 (0.11,0.0) +DEAL::29 (0.22,0.0) +DEAL::30 (0.18,0.0) +DEAL::31 (0.0,0.0) +DEAL::32 (0.075,0.0) +DEAL::33 (0.0,0.0) +DEAL::34 (0.0,0.0) +DEAL::35 (0.11,0.0) +DEAL::36 (0.0,0.0) +DEAL::37 (0.27,0.0) +DEAL::38 (0.22,0.0) +DEAL::39 (0.28,0.0) +DEAL::40 (0.23,0.0) +DEAL::41 (0.14,0.0) +DEAL::42 (0.0,0.0) +DEAL::43 (0.14,0.0) +DEAL::44 (0.0,0.0) +DEAL::45 (0.0,0.0) +DEAL::46 (0.14,0.0) +DEAL::47 (0.22,0.0) +DEAL::48 (0.0,0.0) +DEAL::49 (0.11,0.0) +DEAL::50 (0.18,0.0) +DEAL::51 (0.27,0.0) +DEAL::52 (0.28,0.0) +DEAL::53 (0.22,0.0) +DEAL::54 (0.23,0.0) +DEAL::55 (0.0,0.0) +DEAL::56 (0.075,0.0) +DEAL::57 (0.11,0.0) +DEAL::58 (0.0,0.0) +DEAL::59 (0.0,0.0) +DEAL::60 (0.0,0.0) +DEAL::61 (0.14,0.0) +DEAL::62 (0.14,0.0) +DEAL::63 (0.0,0.0) +DEAL::64 (0.0,0.0) +DEAL::65 (0.27,0.0) +DEAL::66 (0.22,0.0) +DEAL::67 (0.22,0.0) +DEAL::68 (0.18,0.0) +DEAL::69 (0.14,0.0) +DEAL::70 (0.0,0.0) +DEAL::71 (0.11,0.0) +DEAL::72 (0.0,0.0) +DEAL::73 (0.14,0.0) +DEAL::74 (0.11,0.0) +DEAL::75 (0.0,0.0) +DEAL::76 (0.0,0.0) +DEAL::77 (0.075,0.0) +DEAL::78 (0.0,0.0) +DEAL::79 (0.0,0.0) +DEAL::80 (0.0,0.0) +DEAL::Number of active cells: 64 +DEAL::Total number of cells: 85 +DEAL::Number of degrees of freedom: 81 +DEAL::0 (0.0,0.0) +DEAL::1 (0.0,0.0) +DEAL::2 (0.0,0.0) +DEAL::3 (0.075,0.0) +DEAL::4 (0.0,0.0) +DEAL::5 (0.11,0.0) +DEAL::6 (0.0,0.0) +DEAL::7 (0.11,0.0) +DEAL::8 (0.18,0.0) +DEAL::9 (0.0,0.0) +DEAL::10 (0.14,0.0) +DEAL::11 (0.0,0.0) +DEAL::12 (0.14,0.0) +DEAL::13 (0.22,0.0) +DEAL::14 (0.23,0.0) +DEAL::15 (0.0,0.0) +DEAL::16 (0.14,0.0) +DEAL::17 (0.22,0.0) +DEAL::18 (0.0,0.0) +DEAL::19 (0.14,0.0) +DEAL::20 (0.23,0.0) +DEAL::21 (0.27,0.0) +DEAL::22 (0.28,0.0) +DEAL::23 (0.28,0.0) +DEAL::24 (0.30,0.0) +DEAL::25 (0.0,0.0) +DEAL::26 (0.14,0.0) +DEAL::27 (0.0,0.0) +DEAL::28 (0.11,0.0) +DEAL::29 (0.22,0.0) +DEAL::30 (0.18,0.0) +DEAL::31 (0.0,0.0) +DEAL::32 (0.075,0.0) +DEAL::33 (0.0,0.0) +DEAL::34 (0.0,0.0) +DEAL::35 (0.11,0.0) +DEAL::36 (0.0,0.0) +DEAL::37 (0.27,0.0) +DEAL::38 (0.22,0.0) +DEAL::39 (0.28,0.0) +DEAL::40 (0.23,0.0) +DEAL::41 (0.14,0.0) +DEAL::42 (0.0,0.0) +DEAL::43 (0.14,0.0) +DEAL::44 (0.0,0.0) +DEAL::45 (0.0,0.0) +DEAL::46 (0.14,0.0) +DEAL::47 (0.22,0.0) +DEAL::48 (0.0,0.0) +DEAL::49 (0.11,0.0) +DEAL::50 (0.18,0.0) +DEAL::51 (0.27,0.0) +DEAL::52 (0.28,0.0) +DEAL::53 (0.22,0.0) +DEAL::54 (0.23,0.0) +DEAL::55 (0.0,0.0) +DEAL::56 (0.075,0.0) +DEAL::57 (0.11,0.0) +DEAL::58 (0.0,0.0) +DEAL::59 (0.0,0.0) +DEAL::60 (0.0,0.0) +DEAL::61 (0.14,0.0) +DEAL::62 (0.14,0.0) +DEAL::63 (0.0,0.0) +DEAL::64 (0.0,0.0) +DEAL::65 (0.27,0.0) +DEAL::66 (0.22,0.0) +DEAL::67 (0.22,0.0) +DEAL::68 (0.18,0.0) +DEAL::69 (0.14,0.0) +DEAL::70 (0.0,0.0) +DEAL::71 (0.11,0.0) +DEAL::72 (0.0,0.0) +DEAL::73 (0.14,0.0) +DEAL::74 (0.11,0.0) +DEAL::75 (0.0,0.0) +DEAL::76 (0.0,0.0) +DEAL::77 (0.075,0.0) +DEAL::78 (0.0,0.0) +DEAL::79 (0.0,0.0) +DEAL::80 (0.0,0.0) +DEAL::Number of active cells: 64 +DEAL::Total number of cells: 85 +DEAL::Number of degrees of freedom: 81 +DEAL::0 (0.0,0.0) +DEAL::1 (0.0,0.0) +DEAL::2 (0.0,0.0) +DEAL::3 (0.075,0.0) +DEAL::4 (0.0,0.0) +DEAL::5 (0.11,0.0) +DEAL::6 (0.0,0.0) +DEAL::7 (0.11,0.0) +DEAL::8 (0.18,0.0) +DEAL::9 (0.0,0.0) +DEAL::10 (0.14,0.0) +DEAL::11 (0.0,0.0) +DEAL::12 (0.14,0.0) +DEAL::13 (0.22,0.0) +DEAL::14 (0.23,0.0) +DEAL::15 (0.0,0.0) +DEAL::16 (0.14,0.0) +DEAL::17 (0.22,0.0) +DEAL::18 (0.0,0.0) +DEAL::19 (0.14,0.0) +DEAL::20 (0.23,0.0) +DEAL::21 (0.27,0.0) +DEAL::22 (0.28,0.0) +DEAL::23 (0.28,0.0) +DEAL::24 (0.30,0.0) +DEAL::25 (0.0,0.0) +DEAL::26 (0.14,0.0) +DEAL::27 (0.0,0.0) +DEAL::28 (0.11,0.0) +DEAL::29 (0.22,0.0) +DEAL::30 (0.18,0.0) +DEAL::31 (0.0,0.0) +DEAL::32 (0.075,0.0) +DEAL::33 (0.0,0.0) +DEAL::34 (0.0,0.0) +DEAL::35 (0.11,0.0) +DEAL::36 (0.0,0.0) +DEAL::37 (0.27,0.0) +DEAL::38 (0.22,0.0) +DEAL::39 (0.28,0.0) +DEAL::40 (0.23,0.0) +DEAL::41 (0.14,0.0) +DEAL::42 (0.0,0.0) +DEAL::43 (0.14,0.0) +DEAL::44 (0.0,0.0) +DEAL::45 (0.0,0.0) +DEAL::46 (0.14,0.0) +DEAL::47 (0.22,0.0) +DEAL::48 (0.0,0.0) +DEAL::49 (0.11,0.0) +DEAL::50 (0.18,0.0) +DEAL::51 (0.27,0.0) +DEAL::52 (0.28,0.0) +DEAL::53 (0.22,0.0) +DEAL::54 (0.23,0.0) +DEAL::55 (0.0,0.0) +DEAL::56 (0.075,0.0) +DEAL::57 (0.11,0.0) +DEAL::58 (0.0,0.0) +DEAL::59 (0.0,0.0) +DEAL::60 (0.0,0.0) +DEAL::61 (0.14,0.0) +DEAL::62 (0.14,0.0) +DEAL::63 (0.0,0.0) +DEAL::64 (0.0,0.0) +DEAL::65 (0.27,0.0) +DEAL::66 (0.22,0.0) +DEAL::67 (0.22,0.0) +DEAL::68 (0.18,0.0) +DEAL::69 (0.14,0.0) +DEAL::70 (0.0,0.0) +DEAL::71 (0.11,0.0) +DEAL::72 (0.0,0.0) +DEAL::73 (0.14,0.0) +DEAL::74 (0.11,0.0) +DEAL::75 (0.0,0.0) +DEAL::76 (0.0,0.0) +DEAL::77 (0.075,0.0) +DEAL::78 (0.0,0.0) +DEAL::79 (0.0,0.0) +DEAL::80 (0.0,0.0) +DEAL::Number of active cells: 64 +DEAL::Total number of cells: 85 +DEAL::Number of degrees of freedom: 81 +DEAL::0 (0.0,0.0) +DEAL::1 (0.0,0.0) +DEAL::2 (0.0,0.0) +DEAL::3 (0.075,0.0) +DEAL::4 (0.0,0.0) +DEAL::5 (0.11,0.0) +DEAL::6 (0.0,0.0) +DEAL::7 (0.11,0.0) +DEAL::8 (0.18,0.0) +DEAL::9 (0.0,0.0) +DEAL::10 (0.14,0.0) +DEAL::11 (0.0,0.0) +DEAL::12 (0.14,0.0) +DEAL::13 (0.22,0.0) +DEAL::14 (0.23,0.0) +DEAL::15 (0.0,0.0) +DEAL::16 (0.14,0.0) +DEAL::17 (0.22,0.0) +DEAL::18 (0.0,0.0) +DEAL::19 (0.14,0.0) +DEAL::20 (0.23,0.0) +DEAL::21 (0.27,0.0) +DEAL::22 (0.28,0.0) +DEAL::23 (0.28,0.0) +DEAL::24 (0.30,0.0) +DEAL::25 (0.0,0.0) +DEAL::26 (0.14,0.0) +DEAL::27 (0.0,0.0) +DEAL::28 (0.11,0.0) +DEAL::29 (0.22,0.0) +DEAL::30 (0.18,0.0) +DEAL::31 (0.0,0.0) +DEAL::32 (0.075,0.0) +DEAL::33 (0.0,0.0) +DEAL::34 (0.0,0.0) +DEAL::35 (0.11,0.0) +DEAL::36 (0.0,0.0) +DEAL::37 (0.27,0.0) +DEAL::38 (0.22,0.0) +DEAL::39 (0.28,0.0) +DEAL::40 (0.23,0.0) +DEAL::41 (0.14,0.0) +DEAL::42 (0.0,0.0) +DEAL::43 (0.14,0.0) +DEAL::44 (0.0,0.0) +DEAL::45 (0.0,0.0) +DEAL::46 (0.14,0.0) +DEAL::47 (0.22,0.0) +DEAL::48 (0.0,0.0) +DEAL::49 (0.11,0.0) +DEAL::50 (0.18,0.0) +DEAL::51 (0.27,0.0) +DEAL::52 (0.28,0.0) +DEAL::53 (0.22,0.0) +DEAL::54 (0.23,0.0) +DEAL::55 (0.0,0.0) +DEAL::56 (0.075,0.0) +DEAL::57 (0.11,0.0) +DEAL::58 (0.0,0.0) +DEAL::59 (0.0,0.0) +DEAL::60 (0.0,0.0) +DEAL::61 (0.14,0.0) +DEAL::62 (0.14,0.0) +DEAL::63 (0.0,0.0) +DEAL::64 (0.0,0.0) +DEAL::65 (0.27,0.0) +DEAL::66 (0.22,0.0) +DEAL::67 (0.22,0.0) +DEAL::68 (0.18,0.0) +DEAL::69 (0.14,0.0) +DEAL::70 (0.0,0.0) +DEAL::71 (0.11,0.0) +DEAL::72 (0.0,0.0) +DEAL::73 (0.14,0.0) +DEAL::74 (0.11,0.0) +DEAL::75 (0.0,0.0) +DEAL::76 (0.0,0.0) +DEAL::77 (0.075,0.0) +DEAL::78 (0.0,0.0) +DEAL::79 (0.0,0.0) +DEAL::80 (0.0,0.0) +DEAL::Checking 4 data sets. -- 2.39.5