From 00d7d69b2531132b732e4491278018f96d834fb5 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Fri, 7 Aug 2009 17:47:16 +0000 Subject: [PATCH] Use a separate communicator for Trilinos objects by forking the existing communicator into a unique and separate one. git-svn-id: https://svn.dealii.org/trunk@19201 0785d39b-7218-0410-832d-ea1e28bc413d --- .../include/lac/trilinos_sparsity_pattern.h | 27 +++++++++- .../lac/source/trilinos_sparsity_pattern.cc | 52 ++++++++++--------- 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/deal.II/lac/include/lac/trilinos_sparsity_pattern.h b/deal.II/lac/include/lac/trilinos_sparsity_pattern.h index f1c43cd3f6..96d9997456 100755 --- a/deal.II/lac/include/lac/trilinos_sparsity_pattern.h +++ b/deal.II/lac/include/lac/trilinos_sparsity_pattern.h @@ -18,11 +18,13 @@ #include #include -#include #include #include #include +#include +#include + #ifdef DEAL_II_USE_TRILINOS # include @@ -636,6 +638,18 @@ namespace TrilinosWrappers void copy_from (const SparsityType &SP); + /** + * Copy operator. This operation is + * only allowed for empty objects, to + * avoid potentially very costly + * operations automatically synthesized + * by the compiler. Use copy_from() + * instead if you know that you really + * want to copy a sparsity pattern with + * non-trivial content. + */ + void operator = (const SparsityPattern &sp); + /** * Release all memory and * return to a state just like @@ -1021,6 +1035,17 @@ namespace TrilinosWrappers << " exist in the Trilinos sparsity pattern."); //@} private: + /** + * A pointer to the communicator used + * for all operations in this object. + * + * Note that we create a new + * communicator (with a unique MPI ID) + * for each object if we are running in + * parallel. + */ + boost::scoped_ptr communicator; + /** * Epetra Trilinos * mapping of the matrix rows diff --git a/deal.II/lac/source/trilinos_sparsity_pattern.cc b/deal.II/lac/source/trilinos_sparsity_pattern.cc index 7d1a6f1ec5..569e4e938f 100755 --- a/deal.II/lac/source/trilinos_sparsity_pattern.cc +++ b/deal.II/lac/source/trilinos_sparsity_pattern.cc @@ -11,8 +11,8 @@ // //--------------------------------------------------------------------------- +#include #include - #include #include #include @@ -83,11 +83,12 @@ namespace TrilinosWrappers SparsityPattern::SparsityPattern () : #ifdef DEAL_II_COMPILER_SUPPORTS_MPI - row_map (0, 0, Epetra_MpiComm(MPI_COMM_SELF)), + communicator (Utilities::Trilinos::duplicate_communicator (MPI_COMM_SELF)), #else - row_map (0, 0, Epetra_SerialComm()), + communicator (new Epetra_SerialComm()), #endif - col_map (row_map), + row_map (0, 0, *communicator), + col_map (0, 0, *communicator), compressed (true), graph (std::auto_ptr (new Epetra_FECrsGraph(View, row_map, col_map, 0))) @@ -95,10 +96,12 @@ namespace TrilinosWrappers graph->FillComplete(); } + SparsityPattern::SparsityPattern (const Epetra_Map &InputMap, const unsigned int n_entries_per_row) : - row_map (InputMap), + communicator (Utilities::Trilinos::duplicate_communicator (InputMap.Comm())), + row_map (Utilities::Trilinos::duplicate_map (InputMap, *communicator)), col_map (row_map), compressed (false), // for more than one processor, need to @@ -127,7 +130,8 @@ namespace TrilinosWrappers SparsityPattern::SparsityPattern (const Epetra_Map &InputMap, const std::vector &n_entries_per_row) : - row_map (InputMap), + communicator (Utilities::Trilinos::duplicate_communicator (InputMap.Comm())), + row_map (Utilities::Trilinos::duplicate_map (InputMap, *communicator)), col_map (row_map), compressed (false), graph (row_map.Comm().NumProc() > 1 ? @@ -149,8 +153,9 @@ namespace TrilinosWrappers const Epetra_Map &InputColMap, const unsigned int n_entries_per_row) : - row_map (InputRowMap), - col_map (InputColMap), + communicator (Utilities::Trilinos::duplicate_communicator (InputRowMap.Comm())), + row_map (Utilities::Trilinos::duplicate_map (InputRowMap, *communicator)), + col_map (Utilities::Trilinos::duplicate_map (InputColMap, *communicator)), compressed (false), graph (row_map.Comm().NumProc() > 1 ? (std::auto_ptr @@ -169,8 +174,9 @@ namespace TrilinosWrappers const Epetra_Map &InputColMap, const std::vector &n_entries_per_row) : - row_map (InputRowMap), - col_map (InputColMap), + communicator (Utilities::Trilinos::duplicate_communicator (InputRowMap.Comm())), + row_map (Utilities::Trilinos::duplicate_map (InputRowMap, *communicator)), + col_map (Utilities::Trilinos::duplicate_map (InputColMap, *communicator)), compressed (false), graph (row_map.Comm().NumProc() > 1 ? (std::auto_ptr @@ -192,29 +198,30 @@ namespace TrilinosWrappers const unsigned int n_entries_per_row) : #ifdef DEAL_II_COMPILER_SUPPORTS_MPI - row_map (m, 0, Epetra_MpiComm(MPI_COMM_SELF)), - col_map (n, 0, Epetra_MpiComm(MPI_COMM_SELF)), + communicator (Utilities::Trilinos::duplicate_communicator (MPI_COMM_SELF)), #else - row_map (m, 0, Epetra_SerialComm()), - col_map (n, 0, Epetra_SerialComm()), + communicator (new Epetra_SerialComm()), #endif + row_map (m, 0, *communicator), + col_map (n, 0, *communicator), compressed (false), graph (std::auto_ptr (new Epetra_FECrsGraph(Copy, row_map, col_map, int(n_entries_per_row), false))) {} + SparsityPattern::SparsityPattern (const unsigned int m, const unsigned int n, const std::vector &n_entries_per_row) : #ifdef DEAL_II_COMPILER_SUPPORTS_MPI - row_map (m, 0, Epetra_MpiComm(MPI_COMM_SELF)), - col_map (n, 0, Epetra_MpiComm(MPI_COMM_SELF)), + communicator (Utilities::Trilinos::duplicate_communicator (MPI_COMM_SELF)), #else - row_map (m, 0, Epetra_SerialComm()), - col_map (n, 0, Epetra_SerialComm()), + communicator (new Epetra_SerialComm()), #endif + row_map (m, 0, *communicator), + col_map (n, 0, *communicator), compressed (false), graph (std::auto_ptr (new Epetra_FECrsGraph(Copy, row_map, col_map, @@ -498,17 +505,12 @@ namespace TrilinosWrappers - /* void SparsityPattern::copy_from (const SparsityPattern &sp) { - graph.reset(); - row_map = sp.row_map; - col_map = sp.col_map; - - graph = std::auto_ptr (new Epetra_FECrsGraph(*sp.graph)); + Assert (false, ExcNotImplemented()); } - */ + template void -- 2.39.5