From: Luca Heltai Date: Mon, 11 May 2015 16:51:40 +0000 (+0200) Subject: Fixed a bug in linear operator. X-Git-Tag: v8.3.0-rc1~178^2~1 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64925b9df8a92ad587e20605a167f50f46428b0a;p=dealii.git Fixed a bug in linear operator. --- diff --git a/include/deal.II/lac/linear_operator.h b/include/deal.II/lac/linear_operator.h index f50e634834..e465955f7a 100644 --- a/include/deal.II/lac/linear_operator.h +++ b/include/deal.II/lac/linear_operator.h @@ -380,34 +380,60 @@ operator*(typename Range::value_type number, LinearOperator return_op = op; - // ensure to have valid computation objects by catching number and op by - // value - return_op.vmult = [number, op](Range &v, const Domain &u) - { - op.vmult(v,u); - v *= number; - }; + // the trivial case: number is zero + if (number == 0) + { + return_op.vmult = [] (Range &v, const Domain &) + { + v *= 0; + }; - return_op.vmult_add = [number, op](Range &v, const Domain &u) - { - v /= number; - op.vmult_add(v,u); - v *= number; - }; + return_op.vmult_add = [] (Range &, const Domain &) + { + }; - return_op.Tvmult = [number, op](Domain &v, const Range &u) - { - op.Tvmult(v,u); - v *= number; - }; + return_op.Tvmult = [](Domain &v, const Range &) + { + v *= 0; + }; - return_op.Tvmult_add = [number, op](Domain &v, const Range &u) - { - v /= number; - op.Tvmult_add(v,u); - v *= number; - }; + return_op.Tvmult_add = [](Domain &, const Range &) + { + }; + } + else + { + + // ensure to have valid computation objects by catching number and op by + // value + + return_op.vmult = [number, op](Range &v, const Domain &u) + { + op.vmult(v,u); + v *= number; + }; + + return_op.vmult_add = [number, op](Range &v, const Domain &u) + { + v /= number; + op.vmult_add(v,u); + v *= number; + }; + + return_op.Tvmult = [number, op](Domain &v, const Range &u) + { + op.Tvmult(v,u); + v *= number; + }; + + return_op.Tvmult_add = [number, op](Domain &v, const Range &u) + { + v /= number; + op.Tvmult_add(v,u); + v *= number; + }; + } return return_op; } diff --git a/tests/lac/linear_operator_10.cc b/tests/lac/linear_operator_10.cc new file mode 100644 index 0000000000..a52661dfe6 --- /dev/null +++ b/tests/lac/linear_operator_10.cc @@ -0,0 +1,61 @@ +// --------------------------------------------------------------------- +// +// 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 scaling with a number which might be + +#include "../tests.h" + +#include +#include +#include +#include +#include +#include + +#define PRINTME(name, var) \ + deallog << "Block vector: " name << ":" << std::endl; \ + for (unsigned int i = 0; i < var.n_blocks(); ++i) \ + deallog << "[block " << i << " ] " << var.block(i); + + +using namespace dealii; + +int main() +{ + initlog(); + deallog << std::setprecision(10); + + // SparseMatrix: + { + SparsityPattern sparsity_pattern (10, 5, 0); + sparsity_pattern.compress(); + + SparseMatrix a (sparsity_pattern); + + auto op_a = 0*linear_operator(a); + + Vector u; + op_a.reinit_domain_vector(u, false); + Vector v; + op_a.reinit_range_vector(v, false); + op_a.vmult(v, u); + op_a.vmult_add(v, u); + op_a.Tvmult(u, v); + op_a.Tvmult_add(u, v); + + deallog << "OK" << std::endl; + } +} + diff --git a/tests/lac/linear_operator_10.with_cxx11=on.output b/tests/lac/linear_operator_10.with_cxx11=on.output new file mode 100644 index 0000000000..0fd8fc12f0 --- /dev/null +++ b/tests/lac/linear_operator_10.with_cxx11=on.output @@ -0,0 +1,2 @@ + +DEAL::OK