00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SELDON_FILE_PRECOND_SSOR_CXX
00021
00022 namespace Seldon
00023 {
00024 template <class T>
00025 class SorPreconditioner
00026 {
00027 protected :
00028 bool symmetric_precond;
00029 int nb_iter;
00030 T omega;
00031
00032 public :
00033 SorPreconditioner();
00034 ~SorPreconditioner(){}
00035
00036 void InitSymmetricPreconditioning() { symmetric_precond = true; }
00037 void InitUnSymmetricPreconditioning() { symmetric_precond = false; }
00038 void SetParameterRelaxation(const T& param) { omega = param; }
00039 void SetNumberIterations(int nb_iterations) { nb_iter = nb_iterations; }
00040
00041 template<class Vector, class Matrix>
00042 void Solve(const Matrix& A, const Vector& r, Vector& z,
00043 bool init_guess_null = true);
00044
00045 template<class Vector, class Matrix>
00046 void TransSolve(const Matrix& A, const Vector& r, Vector& z,
00047 bool init_guess_null = true);
00048
00049 };
00050
00051
00053 template<class T>
00054 SorPreconditioner<T>::SorPreconditioner()
00055 {
00056 nb_iter = 1; omega = T(1);
00057 symmetric_precond = true;
00058 }
00059
00060
00062 template<class T>
00063 template<class Vector, class Matrix>
00064 void SorPreconditioner<T>::
00065 Solve(const Matrix& A, const Vector& r, Vector& z, bool init_guess_null)
00066 {
00067 if (init_guess_null)
00068 z.Zero();
00069
00070 if (symmetric_precond)
00071 Seldon::SOR(A, z, r, omega, nb_iter, 0);
00072 else
00073 Seldon::SOR(A, z, r, omega, nb_iter, 2);
00074 }
00075
00076
00078 template<class T>
00079 template<class Vector, class Matrix>
00080 void SorPreconditioner<T>::
00081 TransSolve(const Matrix& A, const Vector& r, Vector& z, bool init_guess_null)
00082 {
00083 if (init_guess_null)
00084 z.Zero();
00085
00086 if (symmetric_precond)
00087 Seldon::SOR(A, z, r, omega, nb_iter, 0);
00088 else
00089 Seldon::SOR(A, z, r, omega, nb_iter, 3);
00090 }
00091
00092 }
00093
00094 #define SELDON_FILE_PRECOND_SSOR_CXX
00095 #endif