NGSolve  4.9
linalg/jacobi.hpp
00001 #ifndef FILE_JACOBI
00002 #define FILE_JACOBI
00003 
00004 /* *************************************************************************/
00005 /* File:   jacobi.hh                                                      */
00006 /* Author: Joachim Schoeberl                                              */
00007 /* Date:   06. Oct. 96                                                    */
00008 /* *************************************************************************/
00009 
00010 namespace ngla
00011 {
00012 
00018   class BaseJacobiPrecond : virtual public BaseMatrix
00019   {
00020   public:
00021     virtual void GSSmooth (BaseVector & x, const BaseVector & b) const = 0;
00022     virtual void GSSmooth (BaseVector & x, const BaseVector & b, BaseVector & y /* , BaseVector & help */) const = 0;
00023     virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const = 0;
00024   };
00025 
00027   template <class TM, class TV_ROW, class TV_COL>
00028   class JacobiPrecond : virtual public BaseJacobiPrecond,
00029                         virtual public S_BaseMatrix<typename mat_traits<TM>::TSCAL>
00030   {
00031   protected:
00032     const SparseMatrix<TM,TV_ROW,TV_COL> & mat;
00034     const BitArray * inner;
00036     int height;
00038     Array<TM> invdiag;
00039   public:
00040     // typedef typename mat_traits<TM>::TV_ROW TVX;
00041     typedef typename mat_traits<TM>::TSCAL TSCAL;
00042 
00044     JacobiPrecond (const SparseMatrix<TM,TV_ROW,TV_COL> & amat, 
00045                    const BitArray * ainner = NULL);
00046 
00048     virtual ~JacobiPrecond ();
00049   
00051     virtual void MultAdd (TSCAL s, const BaseVector & x, BaseVector & y) const;
00052 
00053     virtual void MultTransAdd (TSCAL s, const BaseVector & x, BaseVector & y) const
00054     { MultAdd (s, x, y); }
00056     virtual BaseVector * CreateVector () const;
00058     virtual void GSSmooth (BaseVector & x, const BaseVector & b) const;
00059 
00061     virtual void GSSmooth (BaseVector & x, const BaseVector & b, BaseVector & y /* , BaseVector & help */) const
00062     {
00063       GSSmooth (x, b);
00064     }
00065 
00067     virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const;
00068 
00070     virtual void GSSmoothNumbering (BaseVector & x, const BaseVector & b,
00071                                     const Array<int> & numbering, 
00072                                     int forward = 1) const;
00073   };
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00084   template <class TM, class TV>
00085   class JacobiPrecondSymmetric : public JacobiPrecond<TM,TV,TV>
00086   {
00087   public:
00088     typedef TV TVX;
00089 
00091     JacobiPrecondSymmetric (const SparseMatrixSymmetric<TM,TV> & amat, 
00092                             const BitArray * ainner = NULL);
00093 
00095     virtual void GSSmooth (BaseVector & x, const BaseVector & b) const;
00096 
00098     virtual void GSSmooth (BaseVector & x, const BaseVector & b, BaseVector & y /* , BaseVector & help */) const;
00099 
00101     virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const;
00102 
00104     virtual void GSSmoothNumbering (BaseVector & x, const BaseVector & b,
00105                                     const Array<int> & numbering, 
00106                                     int forward = 1) const;
00107   };
00108 
00109 }
00110 
00111 
00112 #endif