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_LOCALMAT_H_
00031 #define _IFP_LOCALMAT_H_
00032
00033 #include <iostream>
00034 #include "ifp_BlockVec.h"
00035 class ifp_LocalPrecon;
00036
00037 class ifp_LocalMat
00038 {
00039 protected:
00040 inline void solve_is_mult(const ifp_BlockVec& B, ifp_BlockVec& X) const;
00041
00042 public:
00043 virtual ~ifp_LocalMat() {}
00044 virtual double *& Data() = 0;
00045 virtual const double *Data() const = 0;
00046
00047 virtual ifp_LocalMat *CreateEmpty() const = 0;
00048 virtual ifp_LocalMat *CreateInv(ifp_LocalPrecon&) const = 0;
00049 virtual void SetToZero(int, int) = 0;
00050 virtual void MatCopy(const ifp_LocalMat& A) = 0;
00051 virtual void Print(std::ostream&) const = 0;
00052
00053 virtual void Mat_Trans(ifp_LocalMat *B) const = 0;
00054 virtual void Mat_Mat_Add(const ifp_LocalMat *B, ifp_LocalMat *C,
00055 double alpha = 1.0) const = 0;
00056 virtual void Mat_Mat_Mult(const ifp_LocalMat *B, ifp_LocalMat *C,
00057 double alpha = 1.0, double beta = 0.0) const = 0;
00058 virtual void Mat_Vec_Mult(const ifp_BlockVec& B, ifp_BlockVec& C,
00059 double alpha = 1.0, double beta = 0.0) const = 0;
00060 virtual void Mat_Trans_Vec_Mult(const ifp_BlockVec& B, ifp_BlockVec&C,
00061 double alpha = 1.0, double beta = 0.0) const = 0;
00062 virtual void Mat_Vec_Solve(const ifp_BlockVec& b,
00063 ifp_BlockVec& x) const = 0;
00064 virtual void Mat_Trans_Vec_Solve(const ifp_BlockVec& b,
00065 ifp_BlockVec& x) const = 0;
00066 };
00067
00068 inline void ifp_LocalMat::solve_is_mult(const ifp_BlockVec& B, ifp_BlockVec& X) const
00069 {
00070 if (&B != &X)
00071 {
00072 Mat_Vec_Mult(B, X);
00073 }
00074 else
00075 {
00076
00077 ifp_BlockVec T(B, -1);
00078 Mat_Vec_Mult(T, X);
00079 }
00080 }
00081
00082 typedef ifp_LocalMat *ifp_LocalMatp;
00083
00084 #endif // _IFP_LOCALMAT_H_