00001 #ifndef __FTriDiagonalMatrix_H__
00002 #define __FTriDiagonalMatrix_H__
00003 
00004 
00005 
00025 #include <stdio.h>
00026 #include "FloatVector.hpp"
00027 
00028 #include "AFSymMatrix.hpp"
00029 
00030 class FTriDiagonalMatrix : public AFSymMatrix
00031 {
00032 private:
00033         
00034 int                             N;
00035 
00036 FloatVector*            up;                                     
00037 FloatVector*            d;                                      
00038 FloatVector*            low;                            
00039 
00040 public:
00041         
00042 FTriDiagonalMatrix(int asize, float val=0.0);
00043 FTriDiagonalMatrix(int asize, float lval, float dval, float uval);
00044 FTriDiagonalMatrix(const FTriDiagonalMatrix& v);
00045 FTriDiagonalMatrix operator=(const FTriDiagonalMatrix& v);
00046 
00047 virtual ~FTriDiagonalMatrix(){ delete d; delete up; delete low;}
00048 
00049 virtual AFloatMatrix* copy(){ return new FTriDiagonalMatrix(*this); }
00050 virtual AFloatMatrix* t(AFloatMatrix* result=0){return (AFloatMatrix*)0;}
00051 
00052 
00053 virtual AFSymMatrix* copyL0();                          
00054 virtual AFSymMatrix* copyU0();
00055 
00056 virtual AFSymMatrix* copyL();                           
00057 virtual AFSymMatrix* copyU();
00058 
00059 virtual AFSymMatrix* copyL1();                          
00060 virtual AFSymMatrix* copyU1();
00061 
00062 void load(FTriDiagonalMatrix* m);
00063 void load(FloatVector* u1, FloatVector* d1, FloatVector* l1);
00064 
00065 virtual int size()const { return (3*N-2); }
00066 
00067 FloatVector* getUvalues(){ return up; }
00068 FloatVector* getDvalues(){ return d; }
00069 FloatVector* getLvalues(){ return low; }
00070 
00071 
00072 virtual void set0(int i, int j, float value);
00073 virtual float get0(int i, int j);
00074 
00075 inline void setD0(int i, float value){ d->set0(i, value); }
00076 inline float getD0(int i)const { return d->get0(i); }
00077 
00078 inline void setU0(int i, float value){ up->set0(i, value); }
00079 inline float getU0(int i)const { return up->get0(i); }
00080 
00081 inline void setL0(int i, float value){ low->set0(i, value); }
00082 inline float getL0(int i)const { return low->get0(i); }
00083 
00084 virtual Simple1DIndexList* indexesInRow0(int k, Simple1DIndexList* oldRow=0);
00085 virtual Simple1DIndexList* indexesInCol0(int k, Simple1DIndexList* oldCol=0);
00086 
00087 
00088 virtual void set(int i, int j, float value);
00089 virtual float get(int i, int j);
00090 
00091 inline void setD(int i, float value){ d->set(i, value); }
00092 inline float getD(int i)const { return d->get(i); }
00093 
00094 inline void setU(int i, float value){ up->set(i, value); }
00095 inline float getU(int i)const { return up->get(i); }
00096 
00097 inline void setL(int i, float value){ low->set(i, value); }
00098 inline float getL(int i)const { return low->get(i); }
00099 
00100 virtual Simple1DIndexList* indexesInRow(int k, Simple1DIndexList* oldRow=0);
00101 virtual Simple1DIndexList* indexesInCol(int k, Simple1DIndexList* oldCol=0);
00102 
00103 
00104 virtual FloatVector* linearSolverU0(FloatVector* b, FloatVector* x=0);          
00105 virtual FloatVector* linearSolverU1(FloatVector* b, FloatVector* x=0);          
00106 virtual FloatVector* linearSolverL0(FloatVector* b, FloatVector* x=0);          
00107 virtual FloatVector* linearSolverL1(FloatVector* b, FloatVector* x=0);          
00108 
00109 
00110 virtual AFSymMatrix* factorisationL1U0();               
00111 virtual AFSymMatrix* factorisationL0U1();               
00112 
00113 
00114 virtual FloatVector* gaussSeidel(FloatVector* b, FloatVector* x=0);
00115 virtual FloatVector* jacobi(FloatVector* b, FloatVector* x=0, FloatVector* dest=0);
00116 virtual FloatVector* sor(FloatVector* b, float omega=1.0, FloatVector* x=0);
00117 
00118 virtual AFSymMatrix* jacobiMatrix();                                    
00119 
00120 
00121 
00122 virtual void setAll(float value=0.0);
00123 
00124 virtual float det();
00125 virtual float trace();
00126 
00127 virtual float norme2();
00128 virtual float sum();
00129 
00130 virtual float minimum();
00131 virtual float maximum();
00132 virtual float sigma();
00133 
00134 
00135 FTriDiagonalMatrix sqrt();
00136 FTriDiagonalMatrix pow(float pow);
00137 FTriDiagonalMatrix sqr();
00138 FTriDiagonalMatrix exp();
00139 FTriDiagonalMatrix log();
00140 FTriDiagonalMatrix log(float base);
00141 
00142 FTriDiagonalMatrix sin();
00143 FTriDiagonalMatrix cos();
00144 FTriDiagonalMatrix tan();
00145 
00146 
00147 void operator+=(float value);
00148 void operator-=(float value);
00149 void operator*=(float value);
00150 void operator/=(float value);
00151 
00152 virtual void add(float value);
00153 virtual void subst(float value);
00154 virtual void mult(float value);
00155 virtual void div(float value);
00156 
00157 
00158 void operator+=(const FTriDiagonalMatrix& m);
00159 void operator-=(const FTriDiagonalMatrix& m);
00160 
00161 virtual void add(AFloatMatrix& m){}
00162 virtual void subst(AFloatMatrix& m){}
00163 
00164 
00165 FloatVector* mult_Av(FloatVector* v, FloatVector* result=0);
00166 FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0);
00167 
00168 FloatVector* mult_vA(FloatVector* v, FloatVector* result=0)     { return mult_ATv(v, result); }
00169 FloatVector* mult_vAT(FloatVector* vt, FloatVector* result=0){ return mult_Av(vt, result); }
00170 
00171 
00172 
00173 FloatVector* mult_Av(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0);
00174 FloatVector* mult_ATv(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0);
00175 
00176 FloatVector* mult_vA(FloatVector* v, int row0, int col0, bool incremental=false, FloatVector* result=0)
00177                         { return mult_ATv(v, col0, row0, incremental, result); }
00178 FloatVector* mult_vAT(FloatVector* vt, int row0, int col0, bool incremental=false, FloatVector* result=0)
00179                         { return mult_Av(vt, col0, row0, incremental, result); }
00180 
00181 
00182 friend FloatVectorT operator*(const FloatVectorT& vt, const FTriDiagonalMatrix& m);     
00183 friend FloatVector operator*(const FTriDiagonalMatrix& m, const FloatVector& v);        
00184         
00185 void output();
00186 void output(FILE* file);
00187 };
00188 
00189 #endif
00190 
00191 
00192