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