]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
adding functions for PreconditionBlockJacobi
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 19 Oct 2001 08:31:30 +0000 (08:31 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 19 Oct 2001 08:31:30 +0000 (08:31 +0000)
git-svn-id: https://svn.dealii.org/trunk@5156 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/precondition_block.h
deal.II/lac/include/lac/precondition_block.templates.h
deal.II/lac/source/precondition_block.cc

index 9be09e0af7954f892364f7e53c907dafcf9456c4..f2ce8a7b659ffb4637c7d23d81220aa865a32747 100644 (file)
@@ -338,6 +338,36 @@ class PreconditionBlockJacobi : public virtual Subscriptor,
                                      */
     template <typename number2>
     void Tvmult (Vector<number2>&, const Vector<number2>&) const;
+                                    /**
+                                     * Execute block Jacobi
+                                     * preconditioning, adding to @p{dst}.
+                                     *
+                                     * This function will
+                                     * automatically use the inverse
+                                     * matrices if they exist, if not
+                                     * then BlockJacobi will need
+                                     * much time inverting the
+                                     * diagonal block matrices in
+                                     * each preconditioning step.
+                                     */
+    template <typename number2>
+    void vmult_add (Vector<number2>&, const Vector<number2>&) const;
+
+                                    /**
+                                     * Same as @p{vmult_add}, since Jacobi is symmetric.
+                                     */
+    template <typename number2>
+    void Tvmult_add (Vector<number2>&, const Vector<number2>&) const;
+
+  private:
+                                  /**
+                                   * Actual implementation of the
+                                   * preconditioner.
+                                   */
+    template <typename number2>
+    void do_vmult (Vector<number2>&,
+                  const Vector<number2>&,
+                  bool adding) const;
 };
 
 
index a676d2f1b5b73f8836cdb0931f15f6c549b64675..b7d9b53a74273ae3c76665e94dae1c587a321bce 100644 (file)
@@ -226,8 +226,9 @@ PreconditionBlock<number,inverse_type>::memory_consumption () const
 template <typename number, typename inverse_type>
 template <typename number2>
 void PreconditionBlockJacobi<number,inverse_type>
-::vmult (Vector<number2>       &dst,
-        const Vector<number2> &src) const
+::do_vmult (Vector<number2>       &dst,
+           const Vector<number2> &src,
+           bool adding) const
 {
                                   // introduce the following typedef
                                   // since in the use of exceptions,
@@ -278,7 +279,10 @@ void PreconditionBlockJacobi<number,inverse_type>
          M_cell.backward(x_cell,b_cell);
                                           // distribute x_cell to dst
          for (row=cell*blocksize, row_cell=0; row_cell<blocksize; ++row_cell, ++row)
-           dst(row)=x_cell(row_cell);
+           if (adding)
+             dst(row)+=x_cell(row_cell);
+           else
+             dst(row)=x_cell(row_cell);
          
          begin_diag_block+=blocksize;
        }
@@ -293,7 +297,10 @@ void PreconditionBlockJacobi<number,inverse_type>
        inverse(cell).vmult(x_cell, b_cell);
                                         // distribute x_cell to dst
        for (row=cell*blocksize, row_cell=0; row_cell<blocksize; ++row_cell, ++row)
-         dst(row)=x_cell(row_cell);
+         if (adding)
+           dst(row)+=x_cell(row_cell);
+         else
+           dst(row)=x_cell(row_cell);
        
        begin_diag_block+=blocksize;
       }
@@ -304,10 +311,40 @@ void PreconditionBlockJacobi<number,inverse_type>
 template <typename number, typename inverse_type>
 template <typename number2>
 void PreconditionBlockJacobi<number,inverse_type>
-::Tvmult (Vector<number2>       &dst,
+::vmult (Vector<number2>       &dst,
         const Vector<number2> &src) const
 {
-  vmult(dst, src);
+  do_vmult(dst, src, false);
+}
+
+
+template <typename number, typename inverse_type>
+template <typename number2>
+void PreconditionBlockJacobi<number,inverse_type>
+::Tvmult (Vector<number2>       &dst,
+         const Vector<number2> &src) const
+{
+  do_vmult(dst, src, false);
+}
+
+
+template <typename number, typename inverse_type>
+template <typename number2>
+void PreconditionBlockJacobi<number,inverse_type>
+::vmult_add (Vector<number2>       &dst,
+            const Vector<number2> &src) const
+{
+  do_vmult(dst, src, true);
+}
+
+
+template <typename number, typename inverse_type>
+template <typename number2>
+void PreconditionBlockJacobi<number,inverse_type>
+::Tvmult_add (Vector<number2>       &dst,
+             const Vector<number2> &src) const
+{
+  do_vmult(dst, src, true);
 }
 
 
index 193c67f049d2a54cbcf3c943f76ec4fc43475e46..529aa782612314eff20cb3363d4ddc40fb540966 100644 (file)
@@ -43,6 +43,14 @@ template void PreconditionBlockJacobi<float, float>::Tvmult
 (Vector<float> &, const Vector<float> &) const;
 template void PreconditionBlockJacobi<float, float>::Tvmult
 (Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<float, float>::vmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<float, float>::vmult_add
+(Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<float, float>::Tvmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<float, float>::Tvmult_add
+(Vector<double> &, const Vector<double> &) const;
 
 template class PreconditionBlockJacobi<double, float>;
 
@@ -54,6 +62,14 @@ template void PreconditionBlockJacobi<double, float>::Tvmult
 (Vector<float> &, const Vector<float> &) const;
 template void PreconditionBlockJacobi<double, float>::Tvmult
 (Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<double, float>::vmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<double, float>::vmult_add
+(Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<double, float>::Tvmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<double, float>::Tvmult_add
+(Vector<double> &, const Vector<double> &) const;
 
 template class PreconditionBlockJacobi<double, double>;
 
@@ -65,6 +81,14 @@ template void PreconditionBlockJacobi<double, double>::Tvmult
 (Vector<float> &, const Vector<float> &) const;
 template void PreconditionBlockJacobi<double, double>::Tvmult
 (Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<double, double>::vmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<double, double>::vmult_add
+(Vector<double> &, const Vector<double> &) const;
+template void PreconditionBlockJacobi<double, double>::Tvmult_add
+(Vector<float> &, const Vector<float> &) const;
+template void PreconditionBlockJacobi<double, double>::Tvmult_add
+(Vector<double> &, const Vector<double> &) const;
 
 /*--------------------- PreconditionBlockGaussSeidel -----------------------*/
 

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.