00001
00011 #include <assert.h>
00012 #include <string>
00013 #include <string.h>
00014 #include <fstream>
00015 #include <memory.h>
00016 #include <math.h>
00017 #include <map>
00018
00019 #ifndef matrix_array_MATRIX_H
00020 #define matrix_array_MATRIX_H
00021
00022 #include "./Interpolation/linear.h"
00023 #include "./Interpolation/spline.h"
00024 #include "./Interpolation/polilinear.h"
00025 #include "./Interpolation/polint.h"
00026 #include "./Interpolation/ratint.h"
00027
00028 #include "../Exceptions/error.h"
00029
00030 using namespace std;
00031
00037 template <typename T>
00038 class Matrix1D {
00039 private:
00040 T *matrix_array;
00041 public:
00042
00043 bool initialized;
00044 int size_x;
00045 string name;
00046
00047
00049 Matrix1D() { initialized = false; };
00050 Matrix1D( int size_x );
00051 Matrix1D( int x_size , string name);
00052 Matrix1D( const Matrix1D<T> &M );
00053 ~Matrix1D();
00054
00055
00056 void AllocateMemory( int size_x );
00057 T max();
00058 T maxabs();
00059
00061 T& operator[](int i);
00062
00063
00065 T& operator()(int x);
00066
00067 Matrix1D& operator= (const Matrix1D<T> &M);
00068 Matrix1D& operator= (T Val);
00069 Matrix1D operator/ (T Val);
00070 Matrix1D operator* (T Val);
00071 Matrix1D operator/ (Matrix1D<T> &M);
00072 Matrix1D operator* (Matrix1D<T> &M);
00073
00074
00075 void Interpolate(Matrix1D<T> &old_function, Matrix1D<T> &old_grid, Matrix1D<T> &new_grid);
00076 void Spline(Matrix1D<T> &old_function, Matrix1D<T> &old_grid, Matrix1D<T> &new_grid, double lb, double ub, double lin_spline_coef = 0, double max_second_der = 0);
00077 void Polint(Matrix1D<T> &old_function, Matrix1D<T> &old_grid, Matrix1D<T> &new_grid);
00078 void Ratint(Matrix1D<T> &old_function, Matrix1D<T> &old_grid, Matrix1D<T> &new_grid);
00079 void Polilinear(Matrix1D<T> &old_function, Matrix1D<T> &old_grid, Matrix1D<T> &new_grid, double lb, double ub);
00080
00081
00082 void writeToFile(string filename);
00083 void writeToFile(string filename, Matrix1D<T> &grid_x);
00084 void readFromFile(string filename);
00085 void readFromFile(string filename, Matrix1D<T> &grid_x);
00086 };
00087
00093 template <typename T> class Matrix2D {
00094 private:
00097 T **matrix_array;
00098 public:
00099
00100 bool initialized;
00101 int size_x, size_y;
00102 string name;
00103
00104
00105 int index1d(int x, int y);
00106
00107
00108 Matrix2D() { initialized = false; };
00109 Matrix2D( const Matrix2D<T> &M );
00110 Matrix2D( int size_x, int size_y );
00111 ~Matrix2D();
00112
00113
00114 void AllocateMemory(int size_x, int size_y);
00115
00117 T* operator[](int i) { return matrix_array[i]; }
00118
00121
00122 Matrix2D& operator= (const Matrix2D<T> &M);
00123 Matrix2D& operator= (T val);
00124 Matrix2D operator/ (T Val);
00125 Matrix2D operator* (T Val);
00126 Matrix2D operator/ (Matrix2D<T> &M);
00127 Matrix2D operator* (Matrix2D<T> &M);
00128
00129
00130
00131 Matrix2D max(T val);
00132
00133 void Interpolate(Matrix2D<T> &old_function, Matrix2D<T> &old_grid_x, Matrix2D<T> &old_grid_y, Matrix2D<T> &new_grid_x, Matrix2D<T> &new_grid_y);
00134
00135
00136 void writeToFile(string filename);
00137 void writeToFile(string filename, Matrix2D<T> &grid_x, Matrix2D<T> &grid_y);
00138 void readFromFile(string filename);
00139 void readFromFile(string filename, Matrix2D<T> &grid_x, Matrix2D<T> &grid_y);
00140 };
00141
00147 template <typename T> class Matrix3D {
00148 private:
00150 T *plane_array;
00152 T ***matrix_array;
00153 public:
00154
00155 bool initialized;
00156 string change_ind;
00157 int size_x, size_y, size_z;
00158 string name;
00159
00160
00161 int index1d(int x, int y, int z);
00162
00163
00165 Matrix3D() { initialized = false; };
00166 Matrix3D( const Matrix3D<T> &M );
00167 Matrix3D(int size_x, int size_y, int size_z);
00168 ~Matrix3D();
00169
00170
00171 void AllocateMemory(int size_x, int size_y, int size_z);
00172 T max();
00173 T maxabs();
00174 Matrix3D<T> abs();
00175
00176 Matrix2D<T> xSlice(int p_x);
00177 Matrix2D<T> ySlice(int p_y);
00178 Matrix2D<T> zSlice(int p_z);
00179
00180
00182 T** operator[](int i);
00183
00185 T& operator()(int x, int y, int z);
00186 inline T& Value(int x, int y, int z) { return operator()(x, y, z); }
00187
00188 Matrix3D& operator= (const Matrix3D<T> &M);
00189 Matrix3D& operator= (Matrix2D<T> &M);
00190 Matrix3D& operator= (T Val);
00191 Matrix3D operator/ (T Val);
00192 Matrix3D operator* (T Val);
00193 Matrix3D operator/ (Matrix3D<T> &M);
00194 Matrix3D operator* (Matrix3D<T> &M);
00195 Matrix3D operator+ (Matrix3D<T> &M);
00196 Matrix3D operator- (Matrix3D<T> &M);
00197
00198
00199 void writeToFile(string filename);
00200 void writeToFile(string filename, Matrix3D<T> &grid_x, Matrix3D<T> &grid_y, Matrix3D<T> &grid_z);
00201
00202 void readFromFile(string filename);
00203 void readFromFile(string filename, Matrix3D<T> &grid_x, Matrix3D<T> &grid_y, Matrix3D<T> &grid_z);
00204
00205 };
00206
00207
00213 typedef map <int , Matrix1D<double> > DiagMatrix;
00214
00218 class CalculationMatrix : public DiagMatrix {
00219 public:
00220
00221 bool initialized;
00222 int x_size, y_size, total_size;
00223
00224 string change_ind;
00225
00226
00227 CalculationMatrix() { this->initialized = false; }
00228
00229 CalculationMatrix(int x_size, int y_size = 1, int z_size = 1, int n_of_diags = 1);
00230
00231
00232
00233 void Initialize(int x_size, int y_size = 1, int z_size = 1, int n_of_diags = 1);
00234
00235
00236 int index1d(int x, int y = 0, int z = 0);
00237
00238
00239 void writeToFile(string filename);
00240
00241 };
00242
00243
00244 #endif