00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _IFP_BRELAX_H_
00031 #define _IFP_BRELAX_H_
00032
00033 #include "ifp_GlobalPrecon.h"
00034
00035 class ifp_LocalMat;
00036 class ifp_BlockMat;
00037
00038 class ifp_None : public ifp_GlobalPrecon
00039 {
00040 public:
00041 void setup(const ifp_BlockMat&) {};
00042 void apply (int nr, int nc, const double *u, int ldu, double *v, int ldv);
00043 };
00044
00045 class ifp_BJacobi : public ifp_GlobalPrecon
00046 {
00047 private:
00048 const ifp_BlockMat *Ap;
00049 ifp_LocalMat **diag;
00050
00051 public:
00052 ifp_BJacobi();
00053 ~ifp_BJacobi();
00054
00055 void setup(const ifp_BlockMat& A);
00056 void apply (int, int, const double *, int, double *, int);
00057 double condest();
00058 };
00059
00060 class ifp_BSOR_Base : public ifp_GlobalPrecon
00061 {
00062 protected:
00063 const ifp_BlockMat *Ap;
00064 ifp_LocalMat **diag;
00065 int *idiag;
00066
00067 double omega_;
00068 int iterations_;
00069
00070 public:
00071 ifp_BSOR_Base();
00072 virtual ~ifp_BSOR_Base();
00073
00074 double& omega() {return omega_;}
00075 int& iterations() {return iterations_;}
00076
00077 void setup(const ifp_BlockMat& A, double omega = 1.0, int iterations = 1);
00078 };
00079
00080 class ifp_BSOR : public ifp_BSOR_Base
00081 {
00082 public:
00083 ifp_BSOR() {};
00084 ~ifp_BSOR() {};
00085 void apply (int, int, const double *, int, double *, int);
00086 };
00087
00088 class ifp_BSSOR : public ifp_BSOR_Base
00089 {
00090 public:
00091 ifp_BSSOR() {};
00092 ~ifp_BSSOR() {};
00093 void apply (int, int, const double *, int, double *, int);
00094 };
00095
00096 #endif // _IFP_BRELAX_H_