00001 #ifndef __F_UBiDiag_H__ 00002 #define __F_UBiDiag_H__ 00003 00004 00024 #include <stdio.h> 00025 #include "FloatVector.hpp" 00026 #include "FloatVectorT.hpp" 00027 00028 #include "AFSymMatrix.hpp" 00029 00030 class F_UBiDiag : public AFSymMatrix 00031 { 00032 private: 00033 00034 FloatVector** band; // band0= Diagonal 00035 00036 public: 00037 00038 F_UBiDiag(int asize, float val=0.0); 00039 F_UBiDiag(const F_UBiDiag& v); 00040 F_UBiDiag operator=(const F_UBiDiag& v); 00041 00042 virtual ~F_UBiDiag(){delete band[0]; delete band[1]; delete[] band; } 00043 00044 virtual AFloatMatrix* copy(){return 0;} 00045 virtual AFloatMatrix* t(AFloatMatrix* result=0){return 0;} 00046 00047 void load(F_UBiDiag* m); 00048 void load(FloatVector* d, FloatVector* dnear); 00049 00050 virtual int size()const { return (2*width-1); } 00051 00052 FloatVector* getBand(int i){ return band[i]; } 00053 FloatVector* getUvalues(int i){ return band[1]; } 00054 FloatVector* getDvalues(){ return band[0]; } 00055 00056 virtual void setBand(int i, FloatVector* v){band[i]->load(v);} 00057 00058 // base 0 00059 virtual void set0(int i, int j, float value); 00060 virtual float get0(int i, int j); 00061 00062 inline void setD0(int i, float value){ band[0]->set0(i, value); } 00063 inline float getD0(int i) const{ return band[0]->get0(i); } 00064 00065 // base 1 00066 virtual void set(int i, int j, float value){ set0(i-1, j-1, value); } 00067 virtual float get(int i, int j){ return get0(i-1, j-1); } 00068 00069 inline void setD(int i, float value){ band[0]->set(i, value); } 00070 inline float getD(int i) const{ return band[0]->get(i); } 00071 00072 virtual void setU(int i, float value){ band[1]->set(i, value); } 00073 virtual float getU(int i)const{ return band[1]->get(i); } 00074 00075 // computations 00076 00077 virtual void setAll(float value=0.0){ band[0]->setAll(value); band[1]->setAll(value); } 00078 00079 // direct solvers 00080 virtual FloatVector* solve(FloatVector* b, FloatVector* x=0); // Ux=b 00081 00082 virtual FloatVector* linearSolverU0(FloatVector* b, FloatVector* x=0); // Ux=b 00083 virtual FloatVector* linearSolverU1(FloatVector* b, FloatVector* x=0); // U1x=b 00084 00085 // direct inversion U 00086 AFSymMatrix* invert(); // Uinv = U^-1 00087 00088 virtual float det(){return 0;} 00089 virtual float trace(){return 0;} 00090 00091 virtual float norme2(); 00092 virtual float sum(); 00093 00094 virtual float minimum(); 00095 virtual float maximum(); 00096 virtual float sigma(); 00097 00098 // scalar single operations 00099 void operator*=(float value); 00100 void operator/=(float value); 00101 00102 virtual void add(float value){} 00103 virtual void subst(float value){} 00104 virtual void mult(float value); 00105 virtual void div(float value); 00106 00107 // vector single operations 00108 void operator+=(F_UBiDiag& m); 00109 void operator-=(F_UBiDiag& m); 00110 00111 virtual void add(AFloatMatrix& m){} 00112 virtual void subst(AFloatMatrix& m){} 00113 00114 // u= A*v including implicit transposition 00115 FloatVector* mult_Av(FloatVector* v, FloatVector* result=0); 00116 FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0); 00117 // u= v*A 00118 FloatVector* mult_vA(FloatVector* v, FloatVector* result=0) { return mult_ATv(v, result); } 00119 FloatVector* mult_vAT(FloatVector* vt, FloatVector* result=0){ return mult_Av(vt, result); } 00120 00121 // sub vector usage 00122 // u= A*v 00123 FloatVector* mult_Av(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0); 00124 FloatVector* mult_ATv(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0); 00125 // u= v*A 00126 FloatVector* mult_vA(FloatVector* v, int row0, int col0, bool incremental=false, FloatVector* result=0) 00127 { return mult_ATv(v, col0, row0, incremental, result); } 00128 FloatVector* mult_vAT(FloatVector* vt, int row0, int col0, bool incremental=false, FloatVector* result=0) 00129 { return mult_Av(vt, col0, row0, incremental, result); } 00130 00131 00132 virtual void output(); 00133 virtual void output(FILE* file); 00134 }; 00135 00136 #endif 00137