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 #if !defined(_GRID_MATRIX_H_)
00028 #define _GRID_MATRIX_H_ 1
00029
00030 #include "sparse_matrix.h"
00031
00032 namespace Dft {
00035 class Matrix {
00036 public:
00037 virtual ergo_real at(int row, int col) const = 0;
00038 virtual bool isSparse() const = 0;
00039 virtual const SparseMatrix* asSparse() const = 0;
00040 virtual const ergo_real* asFull() const = 0;
00041 virtual ~Matrix() {}
00042 };
00043
00044 class FullMatrix {
00045 public:
00046 ergo_real* mat;
00047 int nbast;
00048 bool owned;
00049 explicit FullMatrix(int nbast_)
00050 : mat(new ergo_real[nbast_*nbast_]), nbast(nbast_), owned(true)
00051 {
00052 for(int i= nbast*nbast-1; i >=0; --i) mat[i] = 0.0;
00053 }
00054 FullMatrix(ergo_real *m, int nbast_)
00055 : mat(m), nbast(nbast_), owned(false)
00056 {
00057 }
00059 FullMatrix(const ergo_real *m, int nbast_)
00060 : mat( (ergo_real*)(m)), nbast(nbast_), owned(false)
00061 {
00062 }
00063
00064 ~FullMatrix() { if (owned && mat) delete []mat; }
00065 void add(int row, int col, ergo_real val)
00066 {
00067 mat[row + col*nbast] += val;
00068 }
00069 ergo_real at(int row, int col) const
00070 {
00071 return mat[row + col*nbast];
00072 }
00073 };
00074
00075 };
00076
00077 #endif