// DENSEMat.H #ifndef DENSEMAT_H #define DENSEMAT_H #include #include #include #include "array.h" #include "../dgtd-performance.hpp" template class denseMat { private: public: int N, M;// N:row M:column T *entry; explicit denseMat(int = 0, int = 0); denseMat(const denseMat& denMat); ~denseMat(); // set functions void setDim(int, int); void addEntry(int rr, int cc, T value){ entry[rr * M + cc] = entry[rr * M + cc] + value; } void setEntry(int rr, int cc, T value){ entry[rr * M + cc] = value; } void reset(){ for (int i = 0; i < N * M; i ++) entry[i] = 0.0; } // get functions int getRowDim() const {return N;} int getColDim() const {return M;} T getEntry(int rr, int cc) const {return entry[rr * M + cc];} T* getEntryPtr() {return entry;} // mathematical operations BLAS 0 Operations denseMat& operator=(const denseMat &); denseMat operator+(const denseMat &) const; denseMat operator-(const denseMat &) const; denseMat operator*(const denseMat &) const; denseMat& operator*(const T &); // Vector operator*(const Vector& x) const; denseMat& operator*=(const T &); denseMat& operator+=(const denseMat &); denseMat& operator-=(const denseMat &); denseMat transpose(); denseMat inverse(); void SquareRoot(denseMat& SqRt); T FindSpectralRadius(); void Clear(); void scale(const T& val); void inverse(denseMat& invert); void transpose(denseMat* ); void SelfTranspose(); // print functions void print(); }; template class denseMat; void solveAx_B(denseMat& A, ArrayFP& B); // solve Ax = B void MXV(const denseMat, fp_t *, fp_t *); void MXV(denseMat*, fp_t *, fp_t *); void AXPY(denseMat* a, fp_t *x, fp_t *y); // free functions void Gaussj(denseMat *); void Gaussj(denseMat *, bool&); // BLAS 2 Operations void aAxpby(fp_t alpha, fp_t beta, denseMat& A, fp_t* x, fp_t* y); void aAxpby(fp_t alpha, fp_t beta, denseMat& A, ArrayFP& x, ArrayFP& y); void aAxpy(fp_t alpha, denseMat& A, fp_t* x, fp_t* y); void aAxpy(fp_t alpha, denseMat& A, ArrayFP& x, ArrayFP& y); void Axpy(denseMat& A, fp_t* x, fp_t* y); void Axpy(denseMat& A, ArrayFP& x, ArrayFP& y); void aAx(fp_t alpha, denseMat& A, fp_t* x, fp_t* y); void aAx(fp_t alpha, denseMat& A, ArrayFP& x, ArrayFP& y); void Ax(denseMat& A, fp_t* x, fp_t* y); void Ax(denseMat& A, ArrayFP& x, ArrayFP& y); // BLAS 3 Operations void aABpbC(fp_t alpha, fp_t beta, denseMat& A, denseMat& B, denseMat& C); void aAB(fp_t alpha, denseMat& A, denseMat& B, denseMat& C); void AB(denseMat& A, denseMat& B, denseMat& C); #endif