]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
A few vector reinit functions using the = operator did not work properly. This is...
authorkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 17 Nov 2008 14:35:35 +0000 (14:35 +0000)
committerkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 17 Nov 2008 14:35:35 +0000 (14:35 +0000)
git-svn-id: https://svn.dealii.org/trunk@17605 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/trilinos_vector.h
deal.II/lac/include/lac/trilinos_vector_base.h
deal.II/lac/source/trilinos_vector_base.cc

index a0babddce0a4c72229833a730f4dff2fb75dace0..3b3d95c38862f6168b25231de9219debad7a67a0 100755 (executable)
@@ -459,7 +459,35 @@ namespace TrilinosWrappers
     Vector & 
     Vector::operator = (const ::dealii::Vector<Number> &v)
     {
-      VectorBase::operator = (v);
+#ifdef DEAL_II_COMPILER_SUPPORTS_MPI
+      map = Epetra_Map (v.size(), 0, Epetra_MpiComm(MPI_COMM_WORLD));
+#else
+      map = Epetra_Map (v.size(), 0, Epetra_SerialComm());
+#endif
+
+      vector = std::auto_ptr<Epetra_FEVector> (new Epetra_FEVector(map));
+      
+      const int min_my_id = map.MinMyGID();
+      const int size = map.NumMyElements();
+
+      Assert (map.MaxLID() == size-1,
+             ExcDimensionMismatch(map.MaxLID(), size-1));
+
+                                  // Need to copy out values, since the
+                                  // deal.II might not use doubles, so 
+                                  // that a direct access is not possible.
+      std::vector<int> indices (size);
+      std::vector<double> values (size);
+      for (unsigned int i=0; i<size; ++i)
+       {
+         indices[i] = map.GID(i);
+         values[i] = v(i);
+       }
+
+      const int ierr = vector->ReplaceGlobalValues (size, &indices[0], 
+                                                   &values[0]);
+      AssertThrow (ierr == 0, ExcTrilinosError());
+
       return *this;
     }
     
@@ -675,7 +703,35 @@ namespace TrilinosWrappers
   Vector & 
   Vector::operator = (const ::dealii::Vector<Number> &v)
   {
-    VectorBase::operator = (v);
+#ifdef DEAL_II_COMPILER_SUPPORTS_MPI
+    map = Epetra_LocalMap (v.size(), 0, Epetra_MpiComm(MPI_COMM_WORLD));
+#else
+    map = Epetra_LocalMap (v.size(), 0, Epetra_SerialComm());
+#endif
+
+    vector = std::auto_ptr<Epetra_FEVector> (new Epetra_FEVector(map));
+      
+    const int min_my_id = map.MinMyGID();
+    const int size = map.NumMyElements();
+
+    Assert (map.MaxLID() == size-1,
+           ExcDimensionMismatch(map.MaxLID(), size-1));
+
+                                  // Need to copy out values, since the
+                                  // deal.II might not use doubles, so 
+                                  // that a direct access is not possible.
+    std::vector<int> indices (size);
+    std::vector<double> values (size);
+    for (unsigned int i=0; i<size; ++i)
+      {
+       indices[i] = map.GID(i);
+       values[i] = v(i);
+      }
+
+    const int ierr = vector->ReplaceGlobalValues (size, &indices[0], 
+                                                 &values[0]);
+    AssertThrow (ierr == 0, ExcTrilinosError());
+
     return *this;
   }
   
index 0448e3c63d9970db226958d4e09998101bc9b1d6..9b0e5f4b3914e6a20e510266d1ef2ed601a4ff5f 100644 (file)
@@ -364,6 +364,17 @@ namespace TrilinosWrappers
       VectorBase &
        operator = (const TrilinosScalar s);
 
+                                       /**
+                                       * Copy function. This function takes
+                                       * a VectorBase vector and copies all
+                                       * the elements. The target vector
+                                       * will have the same parallel
+                                       * distribution as the calling
+                                       * vector.
+                                       */
+      VectorBase & 
+       operator = (const VectorBase &v);
+
                                        /**
                                        * Another copy function. This
                                        * one takes a deal.II vector and
@@ -383,7 +394,7 @@ namespace TrilinosWrappers
                                        */
       template <typename Number>
       VectorBase & 
-      operator = (const ::dealii::Vector<Number> &v);
+       operator = (const ::dealii::Vector<Number> &v);
 
                                        /**
                                         * Test for equality. This
index 9a0e0eaf64c5275775b7b9401839e566b7576c21..c0e69c51aa56d268bb4a773faacfeffd010d739a 100644 (file)
@@ -108,12 +108,14 @@ namespace TrilinosWrappers
                      const bool        fast)
   {
     (void)fast;
-    if (&*vector != 0)
+    if (&*vector == 0)
       vector = std::auto_ptr<Epetra_FEVector>(new Epetra_FEVector(*v.vector));
     else if (vector->Map().SameAs(v.vector->Map()) == false)
       vector = std::auto_ptr<Epetra_FEVector>(new Epetra_FEVector(*v.vector));
   }
 
+
+
   void
   VectorBase::compress ()
   {
@@ -146,6 +148,22 @@ namespace TrilinosWrappers
   }
 
 
+
+  VectorBase &
+  VectorBase::operator = (const VectorBase &v)
+  {
+    if (&*vector == 0)
+      vector = std::auto_ptr<Epetra_FEVector>(new Epetra_FEVector(*v.vector));
+    else if (vector->Map().SameAs(v.vector->Map()) == false)
+      vector = std::auto_ptr<Epetra_FEVector>(new Epetra_FEVector(*v.vector));
+    else
+      *vector = *v.vector;
+
+    return *this;
+  }
+
+
+
   template <typename number>
   VectorBase &
   VectorBase::operator = (const ::dealii::Vector<number> &v)

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.