00001 #ifndef __AbsFTriDiagonalLS_H__
00002 #define __AbsFTriDiagonalLS_H__
00003 
00004 
00029 #include <stdio.h>
00030 #include "FTriDiagonalMatrix.hpp"
00031 #include "FloatVector.hpp"
00032 
00033 class AbsFTriDiagonalLS
00034 {
00035 protected:
00036         
00037 int                                             N;
00038 
00039 FTriDiagonalMatrix*             A;
00040 FloatVector*                    x;                                      
00041  
00042 FloatVector*                    b;                                       
00043 
00044 public:
00045         
00046 AbsFTriDiagonalLS(int asize)
00047         {
00048         N=asize;
00049         
00050         x= new FloatVector(N);
00051         b= new FloatVector(N);
00052 
00053         A= new FTriDiagonalMatrix(N);
00054         }
00055 
00056 virtual ~AbsFTriDiagonalLS(){ delete A; delete x; delete b;}
00057 
00058 virtual void loadA(FTriDiagonalMatrix* m){ A->load(m); }
00059 virtual void loadMatrix(FloatVector* u1, FloatVector* d1, FloatVector* l1){ A->load(u1,d1,l1); }
00060 virtual void loadX(FloatVector* data){ x->load(data); }
00061 virtual void loadB(FloatVector* data){ b->load(data); }
00062 
00063 virtual int size(){ return (3*N-2); }
00064 
00065 virtual int getWidth(){ return N; }
00066 virtual int getHeight(){ return N; }
00067 
00068 virtual FloatVector* getX(){ return x; }
00069 virtual FloatVector* getB(){ return b; }
00070 
00071 virtual FTriDiagonalMatrix* getA(){ return A; }
00072 
00073 virtual bool solve()=0;                                                         
00074 
00075 virtual bool solve(FloatVector* aX, FloatVector* aB)    
00076         {
00077         loadX(aX);
00078         loadB(aB);
00079 
00080         return solve();
00081         }
00082 
00083 virtual bool solve(FTriDiagonalMatrix*  aA, FloatVector* aX, FloatVector* aB)   
00084         {
00085         loadA(aA);
00086 
00087         loadX(aX);
00088         loadB(aB);
00089 
00090         return solve();
00091         }
00092         
00093 
00094 virtual FloatVector* evaluate(FloatVector* aX, FloatVector* aB)
00095         {
00096         solve(aX, aB);
00097 
00098         return getX();
00099         }
00100 
00101 virtual FloatVector* evaluate(FTriDiagonalMatrix* aA, FloatVector* aX, FloatVector* aB)
00102         {
00103         solve(aA, aX, aB);
00104 
00105         return getX();
00106         }
00107         
00108 virtual void output()
00109         {
00110         printf("Linear System\n");
00111         A->output();
00112         printf("x: "); x->output();
00113         printf("b: "); b->output();
00114         }
00115 
00116 virtual void output(FILE* file)
00117         {
00118         fprintf(file, "Linear System\n");
00119         A->output(file);
00120         fprintf(file, "x: "); x->output(file);
00121         fprintf(file, "b: "); b->output(file);
00122         }
00123 };
00124 
00125 #endif
00126 
00127 
00128