escript  Revision_
SparseMatrix.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2020 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14 * Development from 2019 by School of Earth and Environmental Sciences
15 **
16 *****************************************************************************/
17 
18 
19 /****************************************************************************/
20 
21 /* Paso: SparseMatrix */
22 
23 /****************************************************************************/
24 
25 /* Author: lgross@uq.edu.au */
26 
27 /****************************************************************************/
28 
29 #ifndef __PASO_SPARSEMATRIX_H__
30 #define __PASO_SPARSEMATRIX_H__
31 
32 #include "Pattern.h"
33 
34 namespace paso {
35 
36 struct SparseMatrix;
37 typedef boost::shared_ptr<SparseMatrix> SparseMatrix_ptr;
38 typedef boost::shared_ptr<const SparseMatrix> const_SparseMatrix_ptr;
39 
40 typedef int SparseMatrixType;
41 
42 // this struct holds a sparse matrix
43 struct SparseMatrix : boost::enable_shared_from_this<SparseMatrix>
44 {
46  dim_t rowBlockSize, dim_t colBlockSize,
47  bool patternIsUnrolled);
48 
49  ~SparseMatrix();
50 
51  void setValues(double value);
52 
53  void copyFromMainDiagonal(double* out) const;
54 
55  void copyToMainDiagonal(const double* in);
56 
57  void copyBlockFromMainDiagonal(double* out) const;
58 
59  void copyBlockToMainDiagonal(const double* in);
60 
61  void applyBlockMatrix(double* block_diag, index_t* pivot, double* x,
62  const double* b) const;
63 
64  void invMain(double* inv_diag, index_t* pivot) const;
65 
68  dim_t n_col_sub,
69  const index_t* row_list,
70  const index_t* new_col_index) const;
71 
72  SparseMatrix_ptr getBlock(int blockid) const;
73 
75 
76  void saveHB_CSC(const char* filename) const;
77 
78  void saveMM(const char* filename) const;
79 
80  inline index_t* borrowMainDiagonalPointer() const
81  {
82  return pattern->borrowMainDiagonalPointer();
83  }
84 
85  inline index_t* borrowColoringPointer() const
86  {
87  return pattern->borrowColoringPointer();
88  }
89 
90  inline dim_t getNumColors() const
91  {
92  return pattern->getNumColors();
93  }
94 
95  inline dim_t maxDeg() const
96  {
97  return pattern->maxDeg();
98  }
99 
100  inline dim_t getTotalNumRows() const
101  {
103  }
104 
105  inline dim_t getTotalNumCols() const
106  {
108  }
109 
110  inline dim_t getNumRows() const
111  {
112  return numRows;
113  }
114 
115  inline dim_t getNumCols() const
116  {
117  return numCols;
118  }
119 
120  inline double getSize() const
121  {
122  return (double)len;
123  }
124 
125  inline double getSparsity() const
126  {
127  return getSize() / ((double)getTotalNumRows()*getTotalNumCols());
128  }
129 
130  static SparseMatrix_ptr loadMM_toCSR(const char* filename);
131 
132 
133  void nullifyRowsAndCols_CSC_BLK1(const double* mask_row,
134  const double* mask_col,
135  double main_diagonal_value);
136 
137  void nullifyRowsAndCols_CSR_BLK1(const double* mask_row,
138  const double* mask_col,
139  double main_diagonal_value);
140 
141  void nullifyRowsAndCols_CSC(const double* mask_row, const double* mask_col,
142  double main_diagonal_value);
143 
144  void nullifyRowsAndCols_CSR(const double* mask_row, const double* mask_col,
145  double main_diagonal_value);
146 
147  void nullifyRows_CSR_BLK1(const double* mask_row,
148  double main_diagonal_value);
149 
150  void nullifyRows_CSR(const double* mask_row, double main_diagonal_value);
151 
152  void maxAbsRow_CSR_OFFSET0(double* array) const;
153 
154  void addAbsRow_CSR_OFFSET0(double* array) const;
155 
156  void addRow_CSR_OFFSET0(double* array) const;
157 
158  void applyDiagonal_CSR_OFFSET0(const double* left, const double* right);
159 
164  dim_t numRows;
165  dim_t numCols;
167  dim_t len;
168 
170  double *val;
171 
174 
176  void* solver_p;
177 };
178 
179 // interfaces:
180 
181 void SparseMatrix_MatrixVector_CSC_OFFSET0(const double alpha,
183  const double* in,
184  const double beta, double* out);
185 
186 void SparseMatrix_MatrixVector_CSC_OFFSET1(const double alpha,
188  const double* in,
189  const double beta, double* out);
190 
191 void SparseMatrix_MatrixVector_CSR_OFFSET0(const double alpha,
193  const double* in,
194  const double beta, double* out);
195 
196 void SparseMatrix_MatrixVector_CSR_OFFSET1(const double alpha,
198  const double* in,
199  const double beta, double* out);
200 
201 void SparseMatrix_MatrixVector_CSR_OFFSET0_DIAG(const double alpha,
203  const double* in,
204  const double beta, double* out);
205 
208 
212 
213 } // namespace paso
214 
215 #endif // __PASO_SPARSEMATRIX_H__
216 
BlockOps.h
MATRIX_FORMAT_BLK1
#define MATRIX_FORMAT_BLK1
Definition: Paso.h:63
paso::SparseMatrix_MatrixVector_CSC_OFFSET1
void SparseMatrix_MatrixVector_CSC_OFFSET1(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:134
paso::UMFPACK_free
void UMFPACK_free(SparseMatrix *A)
frees any UMFPACK related data from the matrix
Definition: UMFPACK.cpp:48
paso::SparseMatrix::getTotalNumRows
dim_t getTotalNumRows() const
Definition: SparseMatrix.h:112
MKL.h
mm_read_mtx_crd_size
int mm_read_mtx_crd_size(std::istream &f, int *M, int *N, int *nz)
Definition: mmio.cpp:182
paso::SparseMatrix::nullifyRowsAndCols_CSR_BLK1
void nullifyRowsAndCols_CSR_BLK1(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:71
paso::N
static dim_t N
Definition: SparseMatrix_saveHB.cpp:50
paso::SparseMatrix::numCols
dim_t numCols
Definition: SparseMatrix.h:177
paso::SparseMatrix::addAbsRow_CSR_OFFSET0
void addAbsRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:356
mm_write_mtx_crd_size
int mm_write_mtx_crd_size(std::ostream &f, int M, int N, int nz)
Definition: mmio.cpp:174
paso::SparseMatrix::block_size
dim_t block_size
Definition: SparseMatrix.h:175
paso::SparseMatrix::copyBlockFromMainDiagonal
void copyBlockFromMainDiagonal(double *out) const
Definition: SparseMatrix.cpp:424
paso::SparseMatrix::row_block_size
dim_t row_block_size
Definition: SparseMatrix.h:173
MATRIX_FORMAT_CSC
#define MATRIX_FORMAT_CSC
Definition: Paso.h:62
paso::SparseMatrix::loadMM_toCSR
static SparseMatrix_ptr loadMM_toCSR(const char *filename)
Definition: SparseMatrix.cpp:215
paso::SparseMatrix::getTotalNumCols
dim_t getTotalNumCols() const
Definition: SparseMatrix.h:117
paso::SparseMatrix::pattern
Pattern_ptr pattern
Definition: SparseMatrix.h:178
paso::SparseMatrix::getNumColors
dim_t getNumColors() const
Definition: SparseMatrix.h:102
paso::SparseMatrix::solver_p
void * solver_p
pointer to data needed by a solver
Definition: SparseMatrix.h:188
mm_set_real
#define mm_set_real(typecode)
Definition: mmio.h:78
paso::BlockOps_invM_2
void BlockOps_invM_2(double *invA, const double *A, int *failed)
Definition: BlockOps.h:111
paso::SparseMatrix::nullifyRowsAndCols_CSR
void nullifyRowsAndCols_CSR(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:113
mmio.h
UMFPACK.h
paso::SparseMatrix::getBlock
SparseMatrix_ptr getBlock(int blockid) const
Definition: SparseMatrix_getSubmatrix.cpp:91
paso::SparseMatrix::maxDeg
dim_t maxDeg() const
Definition: SparseMatrix.h:107
paso::SparseMatrix::SparseMatrix
SparseMatrix(SparseMatrixType type, Pattern_ptr pattern, dim_t rowBlockSize, dim_t colBlockSize, bool patternIsUnrolled)
Definition: SparseMatrix.cpp:120
mm_is_general
#define mm_is_general(typecode)
Definition: mmio.h:62
paso::SparseMatrix::setValues
void setValues(double value)
Definition: SparseMatrix.cpp:489
paso::BlockOps_invM_N
void BlockOps_invM_N(dim_t N, double *mat, index_t *pivot, int *failed)
LU factorization of NxN matrix mat with partial pivoting.
Definition: BlockOps.h:160
paso::SparseMatrix::invMain
void invMain(double *inv_diag, index_t *pivot) const
Definition: SparseMatrix.cpp:504
PASO_MKL
#define PASO_MKL
Definition: Options.h:49
paso::SparseMatrix_MatrixVector_CSR_OFFSET1
void SparseMatrix_MatrixVector_CSR_OFFSET1(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:206
MATRIX_FORMAT_OFFSET1
#define MATRIX_FORMAT_OFFSET1
Definition: Paso.h:64
SparseMatrix.h
Options.h
paso::SparseMatrix_MatrixVector_CSR_OFFSET0_DIAG
void SparseMatrix_MatrixVector_CSR_OFFSET0_DIAG(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:441
paso::BlockOps_solveAll
void BlockOps_solveAll(dim_t n_block, dim_t n, double *D, index_t *pivot, double *x)
Definition: BlockOps.h:231
paso::util::copy
void copy(dim_t N, double *out, const double *in)
out = in
Definition: PasoUtil.h:113
paso::Preconditioner_LocalSmoother_free
void Preconditioner_LocalSmoother_free(Preconditioner_LocalSmoother *in)
Definition: Smoother.cpp:55
paso::SparseMatrix::copyBlockToMainDiagonal
void copyBlockToMainDiagonal(const double *in)
Definition: SparseMatrix.cpp:412
paso::SparseMatrix::type
SparseMatrixType type
Definition: SparseMatrix.h:172
paso::nz
static dim_t nz
Definition: SparseMatrix_saveHB.cpp:50
paso::util::comparIndex
int comparIndex(const void *index1, const void *index2)
this int-comparison function is used by qsort/bsearch in various places
Definition: PasoUtil.cpp:51
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:90
paso::SparseMatrix::saveMM
void saveMM(const char *filename) const
Definition: SparseMatrix.cpp:293
paso::SparseMatrix::maxAbsRow_CSR_OFFSET0
void maxAbsRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:375
paso::const_SparseMatrix_ptr
boost::shared_ptr< const SparseMatrix > const_SparseMatrix_ptr
Definition: SparseMatrix.h:50
paso::BlockOps_invM_3
void BlockOps_invM_3(double *invA, const double *A, int *failed)
Definition: BlockOps.h:129
paso::SparseMatrix::nullifyRows_CSR_BLK1
void nullifyRows_CSR_BLK1(const double *mask_row, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:137
paso::SparseMatrix::getSparsity
double getSparsity() const
Definition: SparseMatrix.h:137
paso::SparseMatrix::getNumCols
dim_t getNumCols() const
Definition: SparseMatrix.h:127
mm_set_matrix
#define mm_set_matrix(typecode)
Definition: mmio.h:71
MM_typecode
char MM_typecode[4]
Definition: mmio.h:34
paso::swap
void swap(index_t *r, index_t *c, double *v, int left, int right)
Definition: SparseMatrix.cpp:69
paso::SparseMatrix::nullifyRowsAndCols_CSC_BLK1
void nullifyRowsAndCols_CSC_BLK1(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:53
paso::MKL_free
void MKL_free(SparseMatrix *A)
Definition: MKL.cpp:49
paso::SparseMatrixType
int SparseMatrixType
Definition: SparseMatrix.h:52
paso::SparseMatrix::nullifyRows_CSR
void nullifyRows_CSR(const double *mask_row, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:154
paso::SparseMatrix::copyToMainDiagonal
void copyToMainDiagonal(const double *in)
Definition: SparseMatrix.cpp:450
paso::SparseMatrix::saveHB_CSC
void saveHB_CSC(const char *filename) const
Definition: SparseMatrix_saveHB.cpp:192
paso::SparseMatrix::~SparseMatrix
~SparseMatrix()
Definition: SparseMatrix.cpp:197
Pattern.h
PASO_PASO
#define PASO_PASO
Definition: Options.h:55
paso::SparseMatrix_MatrixMatrixTranspose
SparseMatrix_ptr SparseMatrix_MatrixMatrixTranspose(const_SparseMatrix_ptr A, const_SparseMatrix_ptr B, const_SparseMatrix_ptr T)
Definition: SparseMatrix_MatrixMatrixTranspose.cpp:72
paso::SparseMatrix::len
dim_t len
Definition: SparseMatrix.h:179
PASO_UMFPACK
#define PASO_UMFPACK
Definition: Options.h:50
paso::SparseMatrix::applyBlockMatrix
void applyBlockMatrix(double *block_diag, index_t *pivot, double *x, const double *b) const
Definition: SparseMatrix.cpp:554
paso::SparseMatrix::copyFromMainDiagonal
void copyFromMainDiagonal(double *out) const
Definition: SparseMatrix.cpp:436
paso::SparseMatrix::solver_package
index_t solver_package
package controlling the solver pointer
Definition: SparseMatrix.h:185
paso::SparseMatrix_ptr
boost::shared_ptr< SparseMatrix > SparseMatrix_ptr
Definition: SparseMatrix.h:48
paso::SparseMatrix::addRow_CSR_OFFSET0
void addRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:394
paso::BlockOps_Cpy_N
void BlockOps_Cpy_N(dim_t N, double *R, const double *V)
Definition: BlockOps.h:52
paso::PasoException
PasoException exception class.
Definition: PasoException.h:45
paso::SparseMatrix::val
double * val
this is used for classical CSR or CSC
Definition: SparseMatrix.h:182
mm_initialize_typecode
#define mm_initialize_typecode(typecode)
Definition: mmio.h:91
escript::DataTypes::index_t
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:85
mm_is_real
#define mm_is_real(typecode)
Definition: mmio.h:57
mm_read_banner
int mm_read_banner(std::istream &f, MM_typecode *matcode)
Definition: mmio.cpp:104
Preconditioner.h
paso::SparseMatrix_MatrixVector_CSR_OFFSET0
void SparseMatrix_MatrixVector_CSR_OFFSET0(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:294
paso::SparseMatrix::getTranspose
SparseMatrix_ptr getTranspose() const
Definition: SparseMatrix.cpp:563
PasoUtil.h
paso::SparseMatrix::getSubmatrix
SparseMatrix_ptr getSubmatrix(dim_t n_row_sub, dim_t n_col_sub, const index_t *row_list, const index_t *new_col_index) const
Definition: SparseMatrix_getSubmatrix.cpp:55
paso::SparseMatrix::nullifyRowsAndCols_CSC
void nullifyRowsAndCols_CSC(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:89
paso::SparseMatrix::getSize
double getSize() const
Definition: SparseMatrix.h:132
mm_write_banner
int mm_write_banner(std::ostream &f, MM_typecode matcode)
Definition: mmio.cpp:356
paso::M
static dim_t M
Definition: SparseMatrix_saveHB.cpp:50
paso::SparseMatrix::numRows
dim_t numRows
Definition: SparseMatrix.h:176
paso::SparseMatrix::getNumRows
dim_t getNumRows() const
Definition: SparseMatrix.h:122
paso::Pattern_ptr
boost::shared_ptr< Pattern > Pattern_ptr
Definition: Pattern.h:50
paso::SparseMatrix::borrowMainDiagonalPointer
index_t * borrowMainDiagonalPointer() const
Definition: SparseMatrix.h:92
paso::SparseMatrix_MatrixVector_CSC_OFFSET0
void SparseMatrix_MatrixVector_CSC_OFFSET0(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:58
mm_set_coordinate
#define mm_set_coordinate(typecode)
Definition: mmio.h:72
escript::IndexList
Definition: escriptcore/src/IndexList.h:28
paso::SparseMatrix_MatrixMatrix
SparseMatrix_ptr SparseMatrix_MatrixMatrix(const_SparseMatrix_ptr A, const_SparseMatrix_ptr B)
Definition: SparseMatrix_MatrixMatrix.cpp:63
paso
Definition: BiCGStab.cpp:26
PASO_SMOOTHER
#define PASO_SMOOTHER
Definition: Options.h:73
paso::SparseMatrix
Definition: SparseMatrix.h:55
paso::SparseMatrix::unroll
SparseMatrix_ptr unroll(SparseMatrixType type) const
Definition: SparseMatrix.cpp:639
paso::q_sort
void q_sort(index_t *row, index_t *col, double *val, int begin, int end, int N)
Definition: SparseMatrix.cpp:87
MATRIX_FORMAT_DEFAULT
#define MATRIX_FORMAT_DEFAULT
Definition: Paso.h:61
paso::SparseMatrix::borrowColoringPointer
index_t * borrowColoringPointer() const
Definition: SparseMatrix.h:97
MATRIX_FORMAT_DIAGONAL_BLOCK
#define MATRIX_FORMAT_DIAGONAL_BLOCK
Definition: Paso.h:65
paso::SparseMatrix::applyDiagonal_CSR_OFFSET0
void applyDiagonal_CSR_OFFSET0(const double *left, const double *right)
Definition: SparseMatrix.cpp:464
paso::SparseMatrix::col_block_size
dim_t col_block_size
Definition: SparseMatrix.h:174
mm_is_sparse
#define mm_is_sparse(typecode)
Definition: mmio.h:51