]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Provide Vector::supports_distributed_data for all vector classes.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 24 May 2013 05:04:17 +0000 (05:04 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 24 May 2013 05:04:17 +0000 (05:04 +0000)
git-svn-id: https://svn.dealii.org/trunk@29560 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/doc/news/changes.h
deal.II/include/deal.II/lac/block_vector_base.h
deal.II/include/deal.II/lac/parallel_vector.h
deal.II/include/deal.II/lac/petsc_parallel_vector.h
deal.II/include/deal.II/lac/petsc_vector.h
deal.II/include/deal.II/lac/trilinos_vector.h
deal.II/include/deal.II/lac/vector.h
deal.II/source/lac/constraint_matrix.cc

index 2b5634e9f450c776303df9004ac7b09369cc9238..2366459758cad22fa9bcc7ff9a0efa69a0ec6b9c 100644 (file)
@@ -75,12 +75,6 @@ this function.
   (Martin Kronbichler, 2013/05/14)
   </li>
 
-  <li> Fixed: setting values in TrilinosWrappers::SparseMatrix
-  in parallel was adding the values instead.
-  <br>
-  (Bruno Turcksin, Timo Heister, 2013/05/03)
-  </li>
-
   <li> New: The step-49 tutorial program now also has a discussion on
   what to do once you have a coarse mesh and want to refine it.
   <br>
@@ -127,6 +121,15 @@ this function.
 <h3>Specific improvements</h3>
 
 <ol>
+<li> New: All vector classes now have a static member variable
+<code>supports_distributed_data</code> that indicates whether the
+vector class supports data that is distributed across multiple
+processors. This variable is provided as a <i>traits variable</i>
+to allow generic algorithms working on general vector types to
+query the capabilities of the vector class at compile time.
+<br>
+(Wolfgang Bangerth, 2013/05/23)
+</li>
 
 <li> Fixed: FETools::back_interpolate has been revised to work correctly
 also with parallel::distributed::Vector.
@@ -228,6 +231,12 @@ vector types, not just dealii::Vector and dealii::BlockVector.
 (Wolfgang Bangerth, 2013/05/06)
 </li>
 
+<li> Fixed: setting values in TrilinosWrappers::SparseMatrix
+in parallel was adding the values instead.
+<br>
+(Bruno Turcksin, Timo Heister, 2013/05/03)
+</li>
+
 <li> Fixed: Generate an error if the user tries to refine a cell
 that is already on the maximum level in a distributed triangulation.
 <br>
index 2eca83b4d2789519a2d935ca56f02320de515a2c..68b469c76f0ecdcda04edba7ec19b179adf4ea18 100644 (file)
@@ -758,6 +758,19 @@ public:
    */
   typedef typename BlockType::real_type real_type;
 
+  /**
+   * A variable that indicates whether this vector
+   * supports distributed data storage. If true, then
+   * this vector also needs an appropriate compress()
+   * function that allows communicating recent set or
+   * add operations to individual elements to be communicated
+   * to other processors.
+   *
+   * For the current class, the variable equals the
+   * value declared for the type of the individual blocks.
+   */
+  static const bool supports_distributed_data = BlockType::supports_distributed_data;
+
   /**
    * Default constructor.
    */
index 0e2521acb1b2bd0db94ca7b958531efef5bf79cc..aeef6b51f36cae9776209c3a3c813565b4a11cc5 100644 (file)
@@ -100,6 +100,19 @@ namespace parallel
       typedef size_t                                            size_type;
       typedef typename numbers::NumberTraits<Number>::real_type real_type;
 
+      /**
+       * A variable that indicates whether this vector
+       * supports distributed data storage. If true, then
+       * this vector also needs an appropriate compress()
+       * function that allows communicating recent set or
+       * add operations to individual elements to be communicated
+       * to other processors.
+       *
+       * For the current class, the variable equals
+       * true, since it does support parallel data storage.
+       */
+      static const bool supports_distributed_data = true;
+
       /**
        * @name 1: Basic Object-handling
        */
index f2a3203ecac2c2b3b025272182be430c98591903..0ace1893568a4537e520c52e11843b5d7d1e8792 100644 (file)
@@ -154,6 +154,19 @@ namespace PETScWrappers
     {
     public:
       /**
+       * A variable that indicates whether this vector
+       * supports distributed data storage. If true, then
+       * this vector also needs an appropriate compress()
+       * function that allows communicating recent set or
+       * add operations to individual elements to be communicated
+       * to other processors.
+       *
+       * For the current class, the variable equals
+       * true, since it does support parallel data storage.
+       */
+      static const bool supports_distributed_data = true;
+
+         /**
        * Default constructor. Initialize the
        * vector as empty.
        */
index c7909f1f0c975fa5af0998d52daa0d56c61a034d..7193166e27d25ac30217f08e39e2e91c06b8c9f2 100644 (file)
@@ -47,6 +47,21 @@ namespace PETScWrappers
   class Vector : public VectorBase
   {
   public:
+    /**
+     * A variable that indicates whether this vector
+     * supports distributed data storage. If true, then
+     * this vector also needs an appropriate compress()
+     * function that allows communicating recent set or
+     * add operations to individual elements to be communicated
+     * to other processors.
+     *
+     * For the current class, the variable equals
+     * false, since it does not support parallel data storage.
+     * If you do need parallel data storage, use
+     * PETScWrappers::MPI::Vector.
+     */
+    static const bool supports_distributed_data = false;
+
     /**
      * Default constructor. Initialize the
      * vector as empty.
index 374bc9a29bda2210ac0f4f9cd7317604c75533e6..79bafae4fab6c712901b65735373b21d0b4c68bf 100644 (file)
@@ -166,10 +166,23 @@ namespace TrilinosWrappers
     class Vector : public VectorBase
     {
     public:
+      /**
+       * A variable that indicates whether this vector
+       * supports distributed data storage. If true, then
+       * this vector also needs an appropriate compress()
+       * function that allows communicating recent set or
+       * add operations to individual elements to be communicated
+       * to other processors.
+       *
+       * For the current class, the variable equals
+       * true, since it does support parallel data storage.
+       */
+      static const bool supports_distributed_data = true;
+
       /**
        * @name Basic constructors and initalization.
        */
-//@{
+      //@{
       /**
        * Default constructor that
        * generates an empty (zero size)
@@ -571,6 +584,21 @@ namespace TrilinosWrappers
   class Vector : public VectorBase
   {
   public:
+    /**
+     * A variable that indicates whether this vector
+     * supports distributed data storage. If true, then
+     * this vector also needs an appropriate compress()
+     * function that allows communicating recent set or
+     * add operations to individual elements to be communicated
+     * to other processors.
+     *
+     * For the current class, the variable equals
+     * false, since it does not support parallel data storage.
+     * If you do need parallel data storage, use
+     * TrilinosWrappers::MPI::Vector.
+     */
+    static const bool supports_distributed_data = false;
+
     /**
      * Default constructor that
      * generates an empty (zero size)
index 05ebaa680d5b2066f6613413f4f40cdec2a1c5f2..33f3a5ef47cc32b1cc0c16ca6a494143145d29ed 100644 (file)
@@ -140,6 +140,19 @@ public:
    */
   typedef typename numbers::NumberTraits<Number>::real_type real_type;
 
+  /**
+   * A variable that indicates whether this vector
+   * supports distributed data storage. If true, then
+   * this vector also needs an appropriate compress()
+   * function that allows communicating recent set or
+   * add operations to individual elements to be communicated
+   * to other processors.
+   *
+   * For the current class, the variable equals
+   * false, since it does not support parallel data storage.
+   */
+  static const bool supports_distributed_data = false;
+
 public:
 
   /**
index 33844ad471620b652355d7828803a8ad8324c135..55f1bdf4d70abb267d7a98d0d2e685324350b596 100644 (file)
@@ -1717,37 +1717,40 @@ ConstraintMatrix::distribute (PETScWrappers::MPI::Vector &vec) const
   typedef std::vector<ConstraintLine>::const_iterator constraint_iterator;
 
 #ifdef DEBUG
-  // the algorithm below pushes contributions c_ij x_j to a constrained
-  // DoF x_j *from the side of the owner of x_j*, as opposed to pulling
-  // it from the owner of the target side x_i. this relies on the
-  // assumption that both target and source know about the constraint
-  // on x_i.
-  //
-  // the disadvantage is that it is incredibly difficult to find out what
-  // is happening if the assumption is not satisfied. to help debug
-  // problems of this kind, we do the following in a first step if
-  // debugging is enabled:
-  // - every processor who owns an x_j where c_ij!=0 sends a one
-  //   to the owner of x_i to add up
-  // - the owner of x_i knows how many nonzero entries exist, so can
-  //   verify that the correct number of ones has been added
-  // - if the sum is not correct, then apparently one of the owners
-  //   of the x_j's did not know to send its one and, consequently,
-  //   will also not know to send the correct c_ij*x_j later on,
-  //   leading to a bug
-  set_zero (vec);
-  for (constraint_iterator it = lines.begin();
-       it != lines.end(); ++it)
-    for (unsigned int i=0; i<it->entries.size(); ++i)
-      if (vec_owned_elements.is_element (it->entries[i].first))
-        vec(it->line) += 1;
-  vec.compress (VectorOperation::add);
-
-  for (constraint_iterator it = lines.begin();
-       it != lines.end(); ++it)
-    if (vec_owned_elements.is_element(it->line))
-      Assert (vec(it->line) == it->entries.size(),
+  if (vec.supports_distributed_data == true)
+    {
+      // the algorithm below pushes contributions c_ij x_j to a constrained
+      // DoF x_j *from the side of the owner of x_j*, as opposed to pulling
+      // it from the owner of the target side x_i. this relies on the
+      // assumption that both target and source know about the constraint
+      // on x_i.
+      //
+      // the disadvantage is that it is incredibly difficult to find out what
+      // is happening if the assumption is not satisfied. to help debug
+      // problems of this kind, we do the following in a first step if
+      // debugging is enabled:
+      // - every processor who owns an x_j where c_ij!=0 sends a one
+      //   to the owner of x_i to add up
+      // - the owner of x_i knows how many nonzero entries exist, so can
+      //   verify that the correct number of ones has been added
+      // - if the sum is not correct, then apparently one of the owners
+      //   of the x_j's did not know to send its one and, consequently,
+      //   will also not know to send the correct c_ij*x_j later on,
+      //   leading to a bug
+      set_zero (vec);
+      for (constraint_iterator it = lines.begin();
+          it != lines.end(); ++it)
+        for (unsigned int i=0; i<it->entries.size(); ++i)
+          if (vec_owned_elements.is_element (it->entries[i].first))
+            vec(it->line) += 1;
+      vec.compress (VectorOperation::add);
+
+      for (constraint_iterator it = lines.begin();
+          it != lines.end(); ++it)
+        if (vec_owned_elements.is_element(it->line))
+          Assert (vec(it->line) == it->entries.size(),
               ExcIncorrectConstraint(it->line, it->entries.size()));
+    }
 #endif
 
   // set the values of all constrained DoFs to zero, then add the

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.