]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Direct implementation of SOR, TSOR, SSOR
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 25 Jun 1999 15:56:46 +0000 (15:56 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 25 Jun 1999 15:56:46 +0000 (15:56 +0000)
git-svn-id: https://svn.dealii.org/trunk@1470 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/lac/include/lac/sparse_matrix.2.templates [new file with mode: 0644]
deal.II/lac/include/lac/sparse_matrix.h
deal.II/lac/include/lac/sparse_matrix.templates.h
deal.II/lac/source/sparse_matrix.double.cc
deal.II/lac/source/sparse_matrix.float.cc
deal.II/lac/source/sparse_matrix.long_double.cc

diff --git a/deal.II/lac/include/lac/sparse_matrix.2.templates b/deal.II/lac/include/lac/sparse_matrix.2.templates
new file mode 100644 (file)
index 0000000..9dbccff
--- /dev/null
@@ -0,0 +1,44 @@
+// $Id$
+// Driver file for SparseMatrix functions with two types.
+
+// TYPEMAT and TYPE2 are defined in sparsematrix?.cc
+
+template SparseMatrix<TYPEMAT> &
+SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
+
+template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
+                                                const SparseMatrix<TYPE2> &);
+
+template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
+                                           const Vector<TYPE2> &) const;
+template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
+                                            const Vector<TYPE2> &) const;
+template void SparseMatrix<TYPEMAT>::vmult_add (Vector<TYPE2> &,
+                                               const Vector<TYPE2> &) const;
+template void SparseMatrix<TYPEMAT>::Tvmult_add (Vector<TYPE2> &,
+                                               const Vector<TYPE2> &) const;
+
+template TYPE2
+SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
+
+template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
+                                              const Vector<TYPE2> &,
+                                              const Vector<TYPE2> &) const;
+
+template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
+                                                     const Vector<TYPE2> &,
+                                                     TYPEMAT) const;
+
+template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
+                                                    const Vector<TYPE2> &,
+                                                    TYPEMAT) const;
+
+template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
+                                                       const Vector<TYPE2> &,
+                                                       TYPEMAT) const;
+
+template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
+template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+template void SparseMatrix<TYPEMAT>::SOR_step (Vector<TYPE2> &, const Vector<TYPE2> &, TYPEMAT) const;
+template void SparseMatrix<TYPEMAT>::TSOR_step (Vector<TYPE2> &, const Vector<TYPE2> &, TYPEMAT) const;
+template void SparseMatrix<TYPEMAT>::SSOR_step (Vector<TYPE2> &, const Vector<TYPE2> &, TYPEMAT) const;
index 94c277dc9111aed5e05d46fc5f261f12c3a3b1b9..f16d3070cdc4df8a0e9e9b5d096387ad99fb222a 100644 (file)
@@ -834,6 +834,22 @@ class SparseMatrix : public Subscriptor
     template <typename somenumber>
     void Tvmult (Vector<somenumber>& dst, const Vector<somenumber>& src) const;
   
+                                    /**
+                                     * Adding Matrix-vector multiplication. Add
+                                     * $M*src$ on $dst$ with $M$ being this matrix.
+                                     */
+    template <typename somenumber>
+    void vmult_add (Vector<somenumber>& dst, const Vector<somenumber>& src) const;
+    
+                                    /**
+                                     * Adding Matrix-vector multiplication. Add
+                                     * $M^T*src$  to $dst$ with $M$ being this
+                                     * matrix. This function does the same as
+                                     * #vmult_add# but takes the transposed matrix.
+                                     */
+    template <typename somenumber>
+    void Tvmult_add (Vector<somenumber>& dst, const Vector<somenumber>& src) const;
+  
                                     /**
                                      * Return the norm of the vector $v$ with
                                      * respect to the norm induced by this
@@ -902,35 +918,73 @@ class SparseMatrix : public Subscriptor
     void precondition_Jacobi (Vector<somenumber>       &dst,
                              const Vector<somenumber> &src,
                              const number              om = 1.) const;
-                                    //
+                                    /**
+                                     * Apply SOR preconditioning to #src#.
+                                     */
     template <typename somenumber>
     void precondition_SSOR (Vector<somenumber>       &dst,
                            const Vector<somenumber> &src,
                            const number              om = 1.) const;
-                                    //
+
+                                    /**
+                                     * Apply SOR preconditioning matrix to #src#.
+                                     * The result of this method is
+                                     * $dst = (om D - L)^{-1} src$.
+                                     */
     template <typename somenumber>
     void precondition_SOR (Vector<somenumber>       &dst,
                           const Vector<somenumber> &src,
                           const number              om = 1.) const;
     
                                     /**
-                                     * Perform an SSOR step in-place, i.e.
-                                     * without copying to a second vector.
-                                     * #omega# is the damping parameter.
+                                     * Perform SSOR preconditioning in-place.
+                                     * Apply the preconditioner matrix without
+                                     * copying to a second vector.
+                                     * #omega# is the relaxation parameter.
                                      */
     template <typename somenumber>
-    void SSOR (Vector<somenumber> &dst,
+    void SSOR (Vector<somenumber> &v,
               const number        omega = 1.) const;
 
                                     /**
-                                     * Perform an SOR step in-place, i.e.
-                                     * without copying to a second vector.
+                                     * Perform an SOR preconditioning in-place.
+                                     * The result is $v = (\omega D - L)^{-1} v$.
                                      * #omega# is the damping parameter.
                                      */
     template <typename somenumber>
-    void SOR (Vector<somenumber> &dst,
+    void SOR (Vector<somenumber> &v,
              const number        om = 1.) const;
 
+                                    /**
+                                     * Do one SOR step on #v#.
+                                     * Performs a direct SOR step with right hand
+                                     * side #b#.
+                                     */
+    template <typename somenumber>
+    void SOR_step (Vector<somenumber> &v,
+                  const Vector<somenumber> &b,
+                  const number        om = 1.) const;
+
+                                    /**
+                                     * Do one adjoint SOR step on #v#.
+                                     * Performs a direct TSOR step with right hand
+                                     * side #b#.
+                                     */
+    template <typename somenumber>
+    void TSOR_step (Vector<somenumber> &v,
+                   const Vector<somenumber> &b,
+                   const number        om = 1.) const;
+
+                                    /**
+                                     * Do one adjoint SSOR step on #v#.
+                                     * Performs a direct SSOR step with right hand
+                                     * side #b# by performing TSOR after SOR.
+                                     */
+    template <typename somenumber>
+    void SSOR_step (Vector<somenumber> &v,
+                   const Vector<somenumber> &b,
+                   const number        om = 1.) const;
+
                                     /**
                                      * Return a (constant) reference to the
                                      * underlying sparsity pattern of this
index 5818de14c40a4a4b57e926c3301fd28a89f7e5ea..3ebf0eca2fa3ec936cf1237260b8e3f9d35247aa 100644 (file)
@@ -226,6 +226,53 @@ SparseMatrix<number>::Tvmult (Vector<somenumber>& dst, const Vector<somenumber>&
 
 
 
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrix<number>::vmult_add (Vector<somenumber>& dst, const Vector<somenumber>& src) const
+{
+  Assert (cols != 0, ExcMatrixNotInitialized());
+  Assert (val != 0, ExcMatrixNotInitialized());
+  Assert(m() == dst.size(), ExcDimensionsDontMatch(m(),dst.size()));
+  Assert(n() == src.size(), ExcDimensionsDontMatch(n(),src.size()));
+
+  const unsigned int n_rows = m();
+  const number *val_ptr = &val[cols->rowstart[0]];
+  const int *colnum_ptr = &cols->colnums[cols->rowstart[0]];
+  somenumber   *dst_ptr = &dst(0);
+  for (unsigned int row=0; row<n_rows; ++row)
+    {
+      somenumber s = 0.;
+      const number *const val_end_of_row = &val[cols->rowstart[row+1]];
+      while (val_ptr != val_end_of_row)
+       s += *val_ptr++ * src(*colnum_ptr++);
+      *dst_ptr++ += s;
+    };
+};
+
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrix<number>::Tvmult_add (Vector<somenumber>& dst, const Vector<somenumber>& src) const
+{
+  Assert (val != 0, ExcMatrixNotInitialized());
+  Assert (cols != 0, ExcMatrixNotInitialized());
+  Assert(n() == dst.size(), ExcDimensionsDontMatch(n(),dst.size()));
+  Assert(m() == src.size(), ExcDimensionsDontMatch(m(),src.size()));
+
+  for (unsigned int i=0;i<m();i++)
+    {
+      for (unsigned int j=cols->rowstart[i]; j<cols->rowstart[i+1] ;j++)
+       {
+         int p = cols->colnums[j];
+         dst(p) += val[j] * src(i);
+       }
+    }
+}
+
+
+
 template <typename number>
 template <typename somenumber>
 somenumber
@@ -452,6 +499,65 @@ SparseMatrix<number>::SOR (Vector<somenumber>& dst, const number om) const
 }
 
 
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrix<number>::SOR_step (Vector<somenumber> &v,
+              const Vector<somenumber> &b,
+              const number        om) const
+{
+  Assert (cols != 0, ExcMatrixNotInitialized());
+  Assert (val != 0, ExcMatrixNotInitialized());
+  Assert (m() == n(), ExcMatrixNotSquare());
+  Assert (m() == v.size(), ExcDimensionsDontMatch(m(),v.size()));
+  Assert (m() == b.size(), ExcDimensionsDontMatch(m(),b.size()));
+
+  for (unsigned int row=0; row<m(); ++row)
+    {
+      somenumber s = b(row);
+      for (unsigned int j=cols->rowstart[row]; j<cols->rowstart[row+1]; ++j)
+       {
+         s -= val[j] * v(cols->colnums[j]);
+       }
+      v(row) += s * om / val[cols->rowstart[row]];
+    }
+}
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrix<number>::TSOR_step (Vector<somenumber> &v,
+              const Vector<somenumber> &b,
+              const number        om) const
+{
+  Assert (cols != 0, ExcMatrixNotInitialized());
+  Assert (val != 0, ExcMatrixNotInitialized());
+  Assert (m() == n(), ExcMatrixNotSquare());
+  Assert (m() == v.size(), ExcDimensionsDontMatch(m(),v.size()));
+  Assert (m() == b.size(), ExcDimensionsDontMatch(m(),b.size()));
+
+  for (int row=m()-1; row>=0; --row)
+    {
+      somenumber s = b(row);
+      for (unsigned int j=cols->rowstart[row]; j<cols->rowstart[row+1]; ++j)
+       {
+         s -= val[j] * v(cols->colnums[j]);
+       }
+      v(row) += s * om / val[cols->rowstart[row]];
+    }
+}
+
+template <typename number>
+template <typename somenumber>
+void
+SparseMatrix<number>::SSOR_step (Vector<somenumber> &v,
+              const Vector<somenumber> &b,
+              const number        om) const
+{
+  SOR_step(v,b,om);
+  TSOR_step(v,b,om);
+}
+
 
 template <typename number>
 template <typename somenumber>
@@ -460,6 +566,8 @@ SparseMatrix<number>::SSOR (Vector<somenumber>& dst, const number om) const
 {
   Assert (cols != 0, ExcMatrixNotInitialized());
   Assert (val != 0, ExcMatrixNotInitialized());
+  Assert (m() == n(), ExcMatrixNotSquare());
+  Assert (m() == dst.size(), ExcDimensionsDontMatch(m(),dst.size()));
 
   int p;
   const unsigned int  n = dst.size();
index 3ad663c0520f6d22addf298f06bc3f989ce20087..d129b74e99d8fb0c7ff1e2fc6a886fcecd4743b2 100644 (file)
@@ -18,71 +18,14 @@ template class SparseMatrix<TYPEMAT>;
 
 #define TYPE2 float
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
 
 #undef TYPE2
 #define TYPE2 double
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
+#include <lac/sparsematrix.2.templates>
 
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
+#undef TYPE2
+#define TYPE2 long double
 
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
index 88c4460cf05a6aec6061df0f3e3925868feb90d4..f7d2f03495e6493c13a1df1b2aa52bed7cbd6b0e 100644 (file)
@@ -18,71 +18,14 @@ template class SparseMatrix<TYPEMAT>;
 
 #define TYPE2 float
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                               const Vector<TYPE2> &,
-                                               const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
 
 #undef TYPE2
 #define TYPE2 double
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
+#include <lac/sparsematrix.2.templates>
 
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template double
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template double SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
+#undef TYPE2
+#define TYPE2 long double
 
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
index 7334d98ccec88599c98167af94d8ad65924160c6..dbd0e62aa0b63f893caa890d787cefe8849d287a 100644 (file)
@@ -18,179 +18,14 @@ template class SparseMatrix<TYPEMAT>;
 
 #define TYPE2 float
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
 
 #undef TYPE2
 #define TYPE2 double
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>
 
 #undef TYPE2
 #define TYPE2 long double
 
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
-
-#undef TYPEMAT
-#define TYPEMAT double
-
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
-
-#undef TYPEMAT
-#define TYPEMAT float
-
-template SparseMatrix<TYPEMAT> &
-SparseMatrix<TYPEMAT>::copy_from (const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::add_scaled (const TYPEMAT,
-                                                const SparseMatrix<TYPE2> &);
-
-template void SparseMatrix<TYPEMAT>::vmult (Vector<TYPE2> &,
-                                           const Vector<TYPE2> &) const;
-template void SparseMatrix<TYPEMAT>::Tvmult (Vector<TYPE2> &,
-                                            const Vector<TYPE2> &) const;
-
-template TYPE2
-SparseMatrix<TYPEMAT>::matrix_norm (const Vector<TYPE2> &) const;
-
-template TYPE2 SparseMatrix<TYPEMAT>::residual (Vector<TYPE2> &,
-                                              const Vector<TYPE2> &,
-                                              const Vector<TYPE2> &) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SSOR (Vector<TYPE2> &,
-                                                     const Vector<TYPE2> &,
-                                                     TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_SOR (Vector<TYPE2> &,
-                                                    const Vector<TYPE2> &,
-                                                    TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::precondition_Jacobi (Vector<TYPE2> &,
-                                                       const Vector<TYPE2> &,
-                                                       TYPEMAT) const;
-
-template void SparseMatrix<TYPEMAT>::SOR (Vector<TYPE2> &, TYPEMAT) const;
-template void SparseMatrix<TYPEMAT>::SSOR (Vector<TYPE2> &, TYPEMAT) const;
+#include <lac/sparsematrix.2.templates>

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.