]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Use a separate communicator for Trilinos objects by forking the existing communicator...
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 7 Aug 2009 17:47:16 +0000 (17:47 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 7 Aug 2009 17:47:16 +0000 (17:47 +0000)
git-svn-id: https://svn.dealii.org/trunk@19201 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/trilinos_sparsity_pattern.h
deal.II/lac/source/trilinos_sparsity_pattern.cc

index f1c43cd3f62864096d6e76f099a28aac81ac9eb5..96d9997456a7f9df2a3e26ccd384b68440ac0c0c 100755 (executable)
 #include <base/subscriptor.h>
 #include <lac/exceptions.h>
 
-#include <base/std_cxx1x/shared_ptr.h>
 #include <vector>
 #include <cmath>
 #include <memory>
 
+#include <base/std_cxx1x/shared_ptr.h>
+#include <boost/scoped_ptr.hpp>
+
 #ifdef DEAL_II_USE_TRILINOS
 
 #  include <Epetra_FECrsGraph.h>
@@ -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<Epetra_Comm> communicator;
+
                                        /**
                                        * Epetra Trilinos
                                        * mapping of the matrix rows
index 7d1a6f1ec5808fc74d13a89f027c900245e2310c..569e4e938f783c558a337e4eb7252617645d0bf6 100755 (executable)
@@ -11,8 +11,8 @@
 //
 //---------------------------------------------------------------------------
 
+#include <base/utilities.h>
 #include <lac/trilinos_sparsity_pattern.h>
-
 #include <lac/sparsity_pattern.h>
 #include <lac/compressed_sparsity_pattern.h>
 #include <lac/compressed_set_sparsity_pattern.h>
@@ -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<Epetra_FECrsGraph>
                         (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<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),
                  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<Epetra_FECrsGraph>
@@ -169,8 +174,9 @@ namespace TrilinosWrappers
                                    const Epetra_Map                &InputColMap,
                                    const std::vector<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<Epetra_FECrsGraph>
@@ -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<Epetra_FECrsGraph>
                         (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<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<Epetra_FECrsGraph>
                         (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<Epetra_FECrsGraph> (new Epetra_FECrsGraph(*sp.graph));
+    Assert (false, ExcNotImplemented());
   }
-  */
 
+  
 
   template <typename SparsityType>
   void 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.