From: Timo Heister Date: Mon, 12 Jan 2015 16:38:59 +0000 (-0500) Subject: handle self-assignment in reinit() and copy_from() X-Git-Tag: v8.3.0-rc1~553^2~3 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f1550e435f0ef8d2ef59896b74a114493bbf9dd;p=dealii.git handle self-assignment in reinit() and copy_from() also include a test --- diff --git a/source/lac/trilinos_sparse_matrix.cc b/source/lac/trilinos_sparse_matrix.cc index 0cdafb5eb2..292fdfea62 100644 --- a/source/lac/trilinos_sparse_matrix.cc +++ b/source/lac/trilinos_sparse_matrix.cc @@ -378,6 +378,9 @@ namespace TrilinosWrappers void SparseMatrix::copy_from (const SparseMatrix &rhs) { + if (this == &rhs) + return; + nonlocal_matrix.reset(); nonlocal_matrix_exporter.reset(); @@ -794,6 +797,9 @@ namespace TrilinosWrappers void SparseMatrix::reinit (const SparseMatrix &sparse_matrix) { + if (this == &sparse_matrix) + return; + column_space_map.reset (new Epetra_Map (sparse_matrix.domain_partitioner())); matrix.reset (); nonlocal_matrix_exporter.reset(); diff --git a/tests/gla/mat_06.cc b/tests/gla/mat_06.cc new file mode 100644 index 0000000000..6b2cea3c39 --- /dev/null +++ b/tests/gla/mat_06.cc @@ -0,0 +1,110 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2004 - 2013 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 reinit and copy_from self-assignment for LA::MPI::SparseMatrix + +#include "../tests.h" +#include +#include +#include +#include +#include +#include + +#include "gla.h" + +template +void test () +{ + unsigned int myid = Utilities::MPI::this_mpi_process (MPI_COMM_WORLD); + unsigned int numproc = Utilities::MPI::n_mpi_processes (MPI_COMM_WORLD); + + if (myid==0) + deallog << "numproc=" << numproc << std::endl; + + // each processor owns 2 indices and all + // are ghosting Element 1 (the second) + + IndexSet local_active(numproc*2); + local_active.add_range(myid*2,myid*2+2); + IndexSet local_relevant= local_active; + local_relevant.add_range(0,1); + + CompressedSimpleSparsityPattern csp (local_relevant); + + for (unsigned int i=0; i<2*numproc; ++i) + if (local_relevant.is_element(i)) + csp.add(i,i); + + csp.add(0,1); + + + typename LA::MPI::SparseMatrix mat; + mat.reinit (local_active, local_active, csp, MPI_COMM_WORLD); + + Assert(mat.n()==numproc*2, ExcInternalError()); + Assert(mat.m()==numproc*2, ExcInternalError()); + + // set local values + mat.set(myid*2,myid*2, myid*2.0); + mat.set(myid*2+1,myid*2+1, myid*2.0+1.0); + + mat.compress(VectorOperation::insert); + + mat.add(0,1,1.0); + + mat.compress(VectorOperation::add); + + deallog << "l1-norm: " << mat.l1_norm() << std::endl; + if (myid==0) + deallog << "mat(0,1): " << mat(0,1) << std::endl; + + mat.copy_from(mat); + deallog << "l1-norm: " << mat.l1_norm() << std::endl; + if (myid==0) + deallog << "mat(0,1): " << mat(0,1) << std::endl; + + mat.reinit(mat); + deallog << "l1-norm: " << mat.l1_norm() << std::endl; + if (myid==0) + deallog << "mat(0,1): " << mat(0,1) << std::endl; + + if (myid==0) + deallog << "OK" << std::endl; +} + + + +int main (int argc, char **argv) +{ + Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1); + MPILogInitAll log; + { + deallog.push("PETSc"); + test(); + deallog.pop(); + deallog.push("Trilinos"); + test(); + deallog.pop(); + } + + // compile, don't run + //if (myid==9999) + // test(); + + +} diff --git a/tests/gla/mat_06.mpirun=3.output b/tests/gla/mat_06.mpirun=3.output new file mode 100644 index 0000000000..d2e2efe879 --- /dev/null +++ b/tests/gla/mat_06.mpirun=3.output @@ -0,0 +1,33 @@ + +DEAL:0:PETSc::numproc=3 +DEAL:0:PETSc::l1-norm: 5.00000 +DEAL:0:PETSc::mat(0,1): 3.00000 +DEAL:0:PETSc::l1-norm: 5.00000 +DEAL:0:PETSc::mat(0,1): 3.00000 +DEAL:0:PETSc::l1-norm: 5.00000 +DEAL:0:PETSc::mat(0,1): 3.00000 +DEAL:0:PETSc::OK +DEAL:0:Trilinos::numproc=3 +DEAL:0:Trilinos::l1-norm: 5.00000 +DEAL:0:Trilinos::mat(0,1): 3.00000 +DEAL:0:Trilinos::l1-norm: 5.00000 +DEAL:0:Trilinos::mat(0,1): 3.00000 +DEAL:0:Trilinos::l1-norm: 5.00000 +DEAL:0:Trilinos::mat(0,1): 3.00000 +DEAL:0:Trilinos::OK + +DEAL:1:PETSc::l1-norm: 5.00000 +DEAL:1:PETSc::l1-norm: 5.00000 +DEAL:1:PETSc::l1-norm: 5.00000 +DEAL:1:Trilinos::l1-norm: 5.00000 +DEAL:1:Trilinos::l1-norm: 5.00000 +DEAL:1:Trilinos::l1-norm: 5.00000 + + +DEAL:2:PETSc::l1-norm: 5.00000 +DEAL:2:PETSc::l1-norm: 5.00000 +DEAL:2:PETSc::l1-norm: 5.00000 +DEAL:2:Trilinos::l1-norm: 5.00000 +DEAL:2:Trilinos::l1-norm: 5.00000 +DEAL:2:Trilinos::l1-norm: 5.00000 +