From 07a468b8abeba7fe4d3ee9bbf9dcfb80abb85eb1 Mon Sep 17 00:00:00 2001 From: Matthias Maier Date: Sun, 10 May 2015 13:35:30 +0200 Subject: [PATCH] add a unit test for PackagedOperation --- tests/lac/linear_operator_09.cc | 141 ++++++++++++++++++ .../linear_operator_09.with_cxx11=on.output | 69 +++++++++ 2 files changed, 210 insertions(+) create mode 100644 tests/lac/linear_operator_09.cc create mode 100644 tests/lac/linear_operator_09.with_cxx11=on.output diff --git a/tests/lac/linear_operator_09.cc b/tests/lac/linear_operator_09.cc new file mode 100644 index 0000000000..1c96442ea8 --- /dev/null +++ b/tests/lac/linear_operator_09.cc @@ -0,0 +1,141 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2015 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. +// +// --------------------------------------------------------------------- + +// Test PackagedOperation for +// dealii::Vector +// dealii::SparseMatrix + +#include "../tests.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace dealii; + + +void test_applies(std::string description, + const PackagedOperation > &expr) +{ + // test apply + Vector tmp = expr; + deallog << description << ": " << tmp << std::endl; + + // test apply_add + for (auto &i : tmp) + i = 100.; + expr.apply_add(tmp); + deallog << "100. * 1_n + " << description << ": " << tmp << std::endl; +} + + +int main() +{ + initlog(); + deallog << std::setprecision(10); + + static const int dim = 2; + + // Create mass marix M, and an iterative inverse MInv: + + Triangulation triangulation; + GridGenerator::hyper_cube (triangulation); + triangulation.refine_global(2); + + MappingQ1 mapping_q1; + FE_Q q1(1); + DoFHandler dof_handler(triangulation); + dof_handler.distribute_dofs(q1); + + DynamicSparsityPattern dsp(dof_handler.n_dofs(), dof_handler.n_dofs()); + DoFTools::make_sparsity_pattern(dof_handler, dsp); + dsp.compress(); + SparsityPattern sparsity_pattern; + sparsity_pattern.copy_from(dsp); + sparsity_pattern.compress(); + + SparseMatrix m (sparsity_pattern); + + QGauss quadrature(4); + MatrixCreator::create_mass_matrix(mapping_q1, dof_handler, quadrature, m); + + auto M = linear_operator(m); + + SolverControl solver_control (1000, 1e-12); + SolverCG<> solver (solver_control); + + auto MInv = inverse_operator(M, solver, PreconditionIdentity()); + + // Tests: + + Vector u; + M.reinit_domain_vector(u, true); + for (unsigned int i = 0; i < u.size(); ++i) { + u[i] = (double)(i+1); + } + + deallog << "u: " << u << std::endl; + + // creation via operator+, operator-, operator* + + test_applies("u + u", u + u); + test_applies("u - u", u - u); + test_applies("3. * u", 3. * u); + test_applies("u * 3.", u * 3.); + + // creation via mixed operator+, operator- + + auto expr = 2. * u; + + test_applies("2. * u + u", expr + u); + test_applies("2. * u - u", expr - u); + + test_applies("u + 2. * u", u + expr); + test_applies("u - 2. * u", u - expr); + + // operator+, operator-, operator* + + PackagedOperation > expr2 = u; + + test_applies("2. * u + u", expr + expr2); + test_applies("2. * u - u", expr - expr2); + test_applies("3. * u", 3. * expr2); + test_applies("u * 3.", expr2 * 3.); + + // creation with LinearOperator object + + deallog.depth_file(0); + Vector b = MInv * u; + deallog.depth_file(3); + deallog << "b: " << b << std::endl; + + test_applies("M * b", M * b); + test_applies("b * M", b * M); + + expr = b; + test_applies("M * b", M * expr); + test_applies("b * M", expr * M); +} diff --git a/tests/lac/linear_operator_09.with_cxx11=on.output b/tests/lac/linear_operator_09.with_cxx11=on.output new file mode 100644 index 0000000000..b3dbb71b68 --- /dev/null +++ b/tests/lac/linear_operator_09.with_cxx11=on.output @@ -0,0 +1,69 @@ + +DEAL::u: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::u + u: 2.000000000 4.000000000 6.000000000 8.000000000 10.00000000 12.00000000 14.00000000 16.00000000 18.00000000 20.00000000 22.00000000 24.00000000 26.00000000 28.00000000 30.00000000 32.00000000 34.00000000 36.00000000 38.00000000 40.00000000 42.00000000 44.00000000 46.00000000 48.00000000 50.00000000 +DEAL:: +DEAL::100. * 1_n + u + u: 102.0000000 104.0000000 106.0000000 108.0000000 110.0000000 112.0000000 114.0000000 116.0000000 118.0000000 120.0000000 122.0000000 124.0000000 126.0000000 128.0000000 130.0000000 132.0000000 134.0000000 136.0000000 138.0000000 140.0000000 142.0000000 144.0000000 146.0000000 148.0000000 150.0000000 +DEAL:: +DEAL::u - u: 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 +DEAL:: +DEAL::100. * 1_n + u - u: 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 100.0000000 +DEAL:: +DEAL::3. * u: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + 3. * u: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::u * 3.: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + u * 3.: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::2. * u + u: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + 2. * u + u: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::2. * u - u: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + 2. * u - u: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: +DEAL::u + 2. * u: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + u + 2. * u: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::u - 2. * u: -1.000000000 -2.000000000 -3.000000000 -4.000000000 -5.000000000 -6.000000000 -7.000000000 -8.000000000 -9.000000000 -10.00000000 -11.00000000 -12.00000000 -13.00000000 -14.00000000 -15.00000000 -16.00000000 -17.00000000 -18.00000000 -19.00000000 -20.00000000 -21.00000000 -22.00000000 -23.00000000 -24.00000000 -25.00000000 +DEAL:: +DEAL::100. * 1_n + u - 2. * u: 99.00000000 98.00000000 97.00000000 96.00000000 95.00000000 94.00000000 93.00000000 92.00000000 91.00000000 90.00000000 89.00000000 88.00000000 87.00000000 86.00000000 85.00000000 84.00000000 83.00000000 82.00000000 81.00000000 80.00000000 79.00000000 78.00000000 77.00000000 76.00000000 75.00000000 +DEAL:: +DEAL::2. * u + u: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + 2. * u + u: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::2. * u - u: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + 2. * u - u: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: +DEAL::3. * u: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + 3. * u: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::u * 3.: 3.000000000 6.000000000 9.000000000 12.00000000 15.00000000 18.00000000 21.00000000 24.00000000 27.00000000 30.00000000 33.00000000 36.00000000 39.00000000 42.00000000 45.00000000 48.00000000 51.00000000 54.00000000 57.00000000 60.00000000 63.00000000 66.00000000 69.00000000 72.00000000 75.00000000 +DEAL:: +DEAL::100. * 1_n + u * 3.: 103.0000000 106.0000000 109.0000000 112.0000000 115.0000000 118.0000000 121.0000000 124.0000000 127.0000000 130.0000000 133.0000000 136.0000000 139.0000000 142.0000000 145.0000000 148.0000000 151.0000000 154.0000000 157.0000000 160.0000000 163.0000000 166.0000000 169.0000000 172.0000000 175.0000000 +DEAL:: +DEAL::b: 80.16326531 28.24489796 86.53061224 25.79591837 259.4285714 57.14285714 328.0000000 88.00000000 184.0000000 226.6122449 40.48979592 1446.693878 315.7551020 160.0000000 760.0000000 387.7551020 81.63265306 190.8571429 2286.693878 470.0408163 1140.571429 108.0816327 569.9591837 539.1020408 3018.448980 +DEAL:: +DEAL::M * b: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + M * b: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: +DEAL::b * M: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + b * M: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: +DEAL::M * b: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + M * b: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: +DEAL::b * M: 1.000000000 2.000000000 3.000000000 4.000000000 5.000000000 6.000000000 7.000000000 8.000000000 9.000000000 10.00000000 11.00000000 12.00000000 13.00000000 14.00000000 15.00000000 16.00000000 17.00000000 18.00000000 19.00000000 20.00000000 21.00000000 22.00000000 23.00000000 24.00000000 25.00000000 +DEAL:: +DEAL::100. * 1_n + b * M: 101.0000000 102.0000000 103.0000000 104.0000000 105.0000000 106.0000000 107.0000000 108.0000000 109.0000000 110.0000000 111.0000000 112.0000000 113.0000000 114.0000000 115.0000000 116.0000000 117.0000000 118.0000000 119.0000000 120.0000000 121.0000000 122.0000000 123.0000000 124.0000000 125.0000000 +DEAL:: -- 2.39.5