NGSolve
4.9
|
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