#ifndef MATRIXDEF_H #define MATRIXDEF_H /****************************************************************************** * Common definitions for Matrix and Vector classes * This header file contains macros and inline functions needed for the matrix * classes. All error checking should be defined here as a macro so that it is * neatly disabled when ATC_PRINT_DEBUGGING is not defined ******************************************************************************/ /****************************************************************************** * Headers and namespaces used by Matrix and Vector classes ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include "Utility.h" namespace ATC_matrix { /****************************************************************************** * Typedefs used by Matrix and Vector classes ******************************************************************************/ //* @typedef INDEX //* @brief indexing type (default: unsigned) for matrix classes // can switch typedef back to unsigned to be more precise, but will cause warnings everywhere //typedef unsigned INDEX; typedef int INDEX; //* @typedef CLONE_TYPE //* @brief dimension of matrix to clone enum CLONE_TYPE { CLONE_ROW=0, CLONE_COL=1, CLONE_DIAG=2 }; //* @struct TRIPLET //* @brief Triplet output entity template struct TRIPLET { TRIPLET(int _i=0, int _j=0, T _v=T(0)) : i(_i), j(_j), v(_v) {} INDEX i, j; T v; }; /****************************************************************************** * Definitions for row/column major storage ******************************************************************************/ #define COL_STORAGE /* <--- comment out this line for row-major storage*/ #ifdef COL_STORAGE #define DATA(i,j) _data[(i)+_nRows*(j)] #else #define ROW_STORAGE #define DATA(i,j) _data[(i)*_nCols+(j)] #endif /****************************************************************************** * error checking macros * MICK: checks if index (i,j) is in range MATRIX ONLY * VICK: checks if index (i) is in range VECTOR ONLY * MICM: checks if index (i,j) is in range, displays message MATRIX ONLY * VICM: checks if index (i) is in range, displays message VECTOR ONLY * SQCK: checks if matrix is square, displays message MATRIX ONLY * SSCK: checks if a has the same size as b VECTOR/MATRIX * GCK: generic two object check, checks if c is true VECTOR/MATRIX * GCHK: generic check, checks if c is true ANYTHING ******************************************************************************/ #define ERROR_FOR_BACKTRACE /**/ #define MICK(i,j) /**/ #define VICK(i) /**/ #define MICM(i,j,m) /**/ #define VICM(i,m) /**/ #define SQCK(a,m) /**/ #define SICK(a,b,m) /**/ #define SSCK(a,b,m) /**/ #define GCK(a,b,c,m) /**/ #define GCHK(c,m) /**/ // the following two convert __LINE__ to a string #define STRING2(x) #x #define STRING(x) STRING2(x) // prints file and line number for error messages #define ERROR(x) __FILE__ ":" STRING(__LINE__) " " x /****************************************************************************** * BLAS and LAPACK definitions ******************************************************************************/ #ifdef MKL #include "mkl.h" #define dgemv_ dgemv #define dgemm_ dgemm #define dgetrf_ dgetrf #define dgetri_ dgetri #define dgecon_ dgecon #define dlange_ dlange #define dsygvd_ dsygvd #define dgesvd_ dgesvd #define dgesdd_ dgesdd #else extern "C" { extern void dgemv_(char*,int*,int*,double*,const double*,int*,const double*,int *,double*,double*,int*); extern void dgemm_(char*,char*,int*,int*,int*,double*,const double*,int*,const double*,int*,double*,double*,int*); extern void dgetrf_(int*,int*,double*,int*,int*,int*); extern void dgetri_(int*,double*,int*,int*,double*,int*,int*); extern void dgecon_(char*,int*,double*,int*,double*,double*,double*,int*,int*); extern double dlange_(char*,int*,int*,const double*,int*,double*); extern double dsygvd_(int*,char*,char*,int*,double*,int*,double*,int*,double*,double*,int*,int*,int*,int*); extern double dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,int*,double*,int*,int*); extern double dgesdd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,int*,double*,int*,int*); } #endif // forward declarations of matrix and vector classes template class Matrix; template class DenseMatrix; template class ParDenseMatrix; template class SparseMatrix; template class ParSparseMatrix; template class SparseVector; template class DiagonalMatrix; template class ParDiagonalMatrix; template class Vector; template class DenseVector; template class CloneVector; template class WrapMatrix; template class WrapVector; //* forward declaration of operations //@{ template DenseVector operator*(const Matrix &M, const SparseVector &v); template DenseVector operator*(const SparseVector &v, const Matrix &M); template SparseVector operator*(const SparseMatrix &M, const SparseVector &v); template SparseVector operator*(const SparseVector &v, const SparseMatrix &M); template DenseVector operator*(const SparseMatrix &A, const Vector& x); template DenseVector operator*(const Vector &A, const SparseMatrix& x); template DenseMatrix operator*(const SparseMatrix &A, const Matrix& D); template SparseMatrix operator*(const SparseMatrix &A, const DiagonalMatrix& D); template SparseMatrix operator*(const SparseMatrix &A, const SparseMatrix &B); template T dot(const SparseVector &a, const SparseVector &b); //@} template CloneVector column(Matrix &c, INDEX i) { return CloneVector(c, CLONE_COL, i); } template CloneVector row(Matrix &c, INDEX i) { return CloneVector(c, CLONE_ROW, i); } template CloneVector diagonal(Matrix &c) { return CloneVector(c, CLONE_DIAG); } template const CloneVector column(const Matrix &c, INDEX i) { return CloneVector(c, CLONE_COL, i); } template const CloneVector row(const Matrix &c, INDEX i) { return CloneVector(c, CLONE_ROW, i); } template const CloneVector diagonal(const Matrix &c) { return CloneVector(c, CLONE_DIAG); } template const SparseMatrix *sparse_cast(const Matrix *m); template const DiagonalMatrix *diag_cast(const Matrix *m); template void copy_sparse_to_matrix(const SparseMatrix *s, Matrix &m); template DenseMatrix operator*(const DiagonalMatrix& A, const Matrix &B); template DenseMatrix operator*(const Matrix &B, const DiagonalMatrix& A); // double precision shortcuts typedef Matrix MATRIX; // matrix of double typedef Vector VECTOR; // vector of double typedef DenseMatrix DENS_MAT; // dense matrix of double type typedef ParDenseMatrix PAR_DENS_MAT; // parallel dense matrix of doubles typedef CloneVector CLON_VEC; // cloned vector of double type typedef DenseVector DENS_VEC; // dense vector of double type typedef DiagonalMatrix DIAG_MAT; // diagonal matrix of double type typedef ParDiagonalMatrix PAR_DIAG_MAT; // diagonal matrix of double type typedef SparseMatrix SPAR_MAT; // sparse matrix of double type typedef ParSparseMatrix PAR_SPAR_MAT; // parallel sparse matrix of doubles typedef SparseVector SPAR_VEC; // sparse matrix of double type typedef std::vector > DENS_MAT_VEC; typedef std::vector * > SPAR_MAT_VEC; // int containers typedef DenseMatrix INT_ARRAY; // to become vector or Array2D //typedef SparseMatrix SPAR_INT_ARRAY; // to become ? typedef DenseVector INT_VECTOR; // to become vector or Array // forward declaration of error messages template void ierror(const Matrix &a, const char *FILE, int LINE, INDEX i, INDEX j=0); template void ierror(const Matrix &a, INDEX i, INDEX j, const std::string m); template void merror(const Matrix &a, const Matrix &b, const std::string m); inline void gerror(const std::string m) { std::cout<<"Error: "<