00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00037 #if !defined(_GRID_MATRIX_H_)
00038 #define _GRID_MATRIX_H_ 1
00039
00040 #include "sparse_matrix.h"
00041
00042 namespace Dft {
00043
00044 class Matrix {
00045 public:
00046 virtual ergo_real at(int row, int col) const = 0;
00047 virtual bool isSparse() const = 0;
00048 virtual const SparseMatrix* asSparse() const = 0;
00049 virtual const ergo_real* asFull() const = 0;
00050 virtual ~Matrix() {}
00051 };
00052
00053 class FullMatrix {
00054 public:
00055 ergo_real* mat;
00056 int nbast;
00057 bool owned;
00058 explicit FullMatrix(int nbast_)
00059 : mat(new ergo_real[nbast_*nbast_]), nbast(nbast_), owned(true)
00060 {
00061 for(int i= nbast*nbast-1; i >=0; --i) mat[i] = 0.0;
00062 }
00063 FullMatrix(ergo_real *m, int nbast_)
00064 : mat(m), nbast(nbast_), owned(false)
00065 {
00066 }
00068 FullMatrix(const ergo_real *m, int nbast_)
00069 : mat( (ergo_real*)(m)), nbast(nbast_), owned(false)
00070 {
00071 }
00072
00073 ~FullMatrix() { if (owned && mat) delete []mat; }
00074 void add(int row, int col, ergo_real val)
00075 {
00076 mat[row + col*nbast] += val;
00077 }
00078 ergo_real at(int row, int col) const
00079 {
00080 return mat[row + col*nbast];
00081 }
00082 };
00083
00084 }
00085
00086 #endif