00001 #ifndef __FThomasLS_H__ 00002 #define __FThomasLS_H__ 00003 00004 00005 00030 #include "AbsFTriDiagonalLS.hpp" 00031 00032 00033 class FThomasLS : public AbsFTriDiagonalLS 00034 { 00035 private: 00036 00037 FloatVector* uOut; 00038 FloatVector* dOut; 00039 FloatVector* lOut; 00040 00041 FloatVector* y; 00042 00043 protected: 00044 00046 inline void computeLRdecomposition() 00047 { 00048 dOut->set0(0, A->getD0(0) ); 00049 00050 for(int j=1; j<N; j++) 00051 { 00052 lOut->set(j, A->getL(j)/dOut->get(j) ); 00053 00054 dOut->set0(j, A->getD0(j) - lOut->get(j)*A->getU(j) ); 00055 } 00056 } 00057 00059 inline void forwardSubstitution() 00060 { 00061 y->set0(0, b->get0(0) ); 00062 00063 for(int j=1; j<N; j++) 00064 y->set0(j, b->get0(j) - lOut->get(j)*y->get(j) ); 00065 } 00066 00068 inline void backwardSubstitution() 00069 { 00070 x->set(N, y->get(N)/dOut->get(N) ); 00071 00072 for(int j=N-1; j>0; j--) 00073 x->set(j, (y->get(j) - A->getU(j)*x->get0(j))/dOut->get(j) ); 00074 } 00075 00076 public: 00077 00078 FThomasLS(int asize):AbsFTriDiagonalLS(asize) 00079 { 00080 uOut= new FloatVector(N-1); 00081 dOut= new FloatVector(N); 00082 lOut= new FloatVector(N-1); 00083 00084 y= new FloatVector(N); 00085 } 00086 00087 virtual ~FThomasLS(){delete uOut; delete dOut; delete lOut; delete y;} 00088 00089 virtual void loadA(FTriDiagonalMatrix* m); 00090 virtual void loadMatrix(FloatVector* u1, FloatVector* d1, FloatVector* l1); 00091 virtual void loadX(FloatVector* data); 00092 virtual void loadB(FloatVector* data); 00093 00094 00095 virtual bool solve(); // SOLVING to define later 00096 00097 00098 virtual void output() 00099 { 00100 printf("Thomas "); 00101 AbsFTriDiagonalLS::output(); 00102 } 00103 00104 virtual void output(FILE* file) 00105 { 00106 fprintf(file, "Thomas "); 00107 AbsFTriDiagonalLS::output(file); 00108 } 00109 }; 00110 00111 #endif 00112 00113