#ifndef FILE_JACOBI #define FILE_JACOBI /* *************************************************************************/ /* File: jacobi.hh */ /* Author: Joachim Schoeberl */ /* Date: 06. Oct. 96 */ /* *************************************************************************/ /** Jacobi and Gauss Seidel smoother for scalar, block and system matrices */ class BaseJacobiPrecond : virtual public BaseMatrix { public: virtual void GSSmooth (BaseVector & x, const BaseVector & b) const = 0; virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const = 0; }; /// A Jaboci preconditioner for general sparse matrices template class JacobiPrecond : virtual public BaseJacobiPrecond, virtual public S_BaseMatrix::TSCAL> { protected: const SparseMatrix & mat; /// const BitArray * inner; /// int height; /// TM * invdiag; public: typedef typename mat_traits::TV_ROW TVX; /// JacobiPrecond (const SparseMatrix & amat, const BitArray * ainner = NULL); /// virtual ~JacobiPrecond (); /// virtual void MultAdd (double s, const BaseVector & x, BaseVector & y) const; /// virtual BaseVector * CreateVector () const; /// virtual void GSSmooth (BaseVector & x, const BaseVector & b) const; /// virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const; /// virtual void GSSmoothNumbering (BaseVector & x, const BaseVector & b, const ARRAY & numbering, int forward = 1) const; }; /// A Jaboci preconditioner for symmetric sparse matrices template class JacobiPrecondSymmetric : public JacobiPrecond { public: typedef typename mat_traits::TV_ROW TVX; /// JacobiPrecondSymmetric (const SparseMatrixSymmetric & amat, const BitArray * ainner = NULL); /* : JacobiPrecond (amat, ainner); { ; } */ /// virtual void GSSmooth (BaseVector & x, const BaseVector & b) const; /* { int i; FlatVector & fx = dynamic_cast &> (x).FV(); const FlatVector & fb = dynamic_cast &> (b).FV(); const SparseMatrixSymmetric & smat = dynamic_cast&> (mat); // x := b - L^t x for (i = 0; i < height; i++) { smat.AddRowTransToVectorNoDiag (i, -fx(i), fx); fx(i) = fb(i); } // x := (L+D)^{-1} x for (i = 0; i < height; i++) { TVX hv = fx(i) - smat.RowTimesVectorNoDiag (i, fx); fx(i) = invdiag[i] * hv; } } */ /// virtual void GSSmoothBack (BaseVector & x, const BaseVector & b) const; /* { int i; FlatVector & fx = dynamic_cast &> (x).FV(); const FlatVector & fb = dynamic_cast &> (b).FV(); const SparseMatrixSymmetric & smat = dynamic_cast&> (mat); for (i = height-1; i >= 0; i--) { fx(i) = fb(i) - smat.RowTimesVectorNoDiag (i, fx); } for (i = height-1; i >= 0; i--) { TVX val = invdiag[i] * fx(i); fx(i) = val; smat.AddRowTransToVectorNoDiag (i, -val, fx); } } */ /// virtual void GSSmoothNumbering (BaseVector & x, const BaseVector & b, const ARRAY & numbering, int forward = 1) const; }; #endif