escript  Revision_
SparseMatrix.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 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 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 
18 /****************************************************************************/
19 
20 /* Paso: SparseMatrix */
21 
22 /****************************************************************************/
23 
24 /* Author: lgross@uq.edu.au */
25 
26 /****************************************************************************/
27 
28 #ifndef __PASO_SPARSEMATRIX_H__
29 #define __PASO_SPARSEMATRIX_H__
30 
31 #include "Pattern.h"
32 
33 namespace paso {
34 
35 struct SparseMatrix;
36 typedef boost::shared_ptr<SparseMatrix> SparseMatrix_ptr;
37 typedef boost::shared_ptr<const SparseMatrix> const_SparseMatrix_ptr;
38 
39 typedef int SparseMatrixType;
40 
41 // this struct holds a sparse matrix
42 struct SparseMatrix : boost::enable_shared_from_this<SparseMatrix>
43 {
44  SparseMatrix(SparseMatrixType type, Pattern_ptr pattern,
45  dim_t rowBlockSize, dim_t colBlockSize,
46  bool patternIsUnrolled);
47 
48  ~SparseMatrix();
49 
50  void setValues(double value);
51 
52  void copyFromMainDiagonal(double* out) const;
53 
54  void copyToMainDiagonal(const double* in);
55 
56  void copyBlockFromMainDiagonal(double* out) const;
57 
58  void copyBlockToMainDiagonal(const double* in);
59 
60  void applyBlockMatrix(double* block_diag, index_t* pivot, double* x,
61  const double* b) const;
62 
63  void invMain(double* inv_diag, index_t* pivot) const;
64 
65  SparseMatrix_ptr unroll(SparseMatrixType type) const;
66  SparseMatrix_ptr getSubmatrix(dim_t n_row_sub,
67  dim_t n_col_sub,
68  const index_t* row_list,
69  const index_t* new_col_index) const;
70 
71  SparseMatrix_ptr getBlock(int blockid) const;
72 
73  SparseMatrix_ptr getTranspose() const;
74 
75  void saveHB_CSC(const char* filename) const;
76 
77  void saveMM(const char* filename) const;
78 
80  {
81  return pattern->borrowMainDiagonalPointer();
82  }
83 
85  {
86  return pattern->borrowColoringPointer();
87  }
88 
89  inline dim_t getNumColors() const
90  {
91  return pattern->getNumColors();
92  }
93 
94  inline dim_t maxDeg() const
95  {
96  return pattern->maxDeg();
97  }
98 
99  inline dim_t getTotalNumRows() const
100  {
101  return numRows * row_block_size;
102  }
103 
104  inline dim_t getTotalNumCols() const
105  {
106  return numCols * col_block_size;
107  }
108 
109  inline dim_t getNumRows() const
110  {
111  return numRows;
112  }
113 
114  inline dim_t getNumCols() const
115  {
116  return numCols;
117  }
118 
119  inline double getSize() const
120  {
121  return (double)len;
122  }
123 
124  inline double getSparsity() const
125  {
126  return getSize() / ((double)getTotalNumRows()*getTotalNumCols());
127  }
128 
129  static SparseMatrix_ptr loadMM_toCSR(const char* filename);
130 
131 
132  void nullifyRowsAndCols_CSC_BLK1(const double* mask_row,
133  const double* mask_col,
134  double main_diagonal_value);
135 
136  void nullifyRowsAndCols_CSR_BLK1(const double* mask_row,
137  const double* mask_col,
138  double main_diagonal_value);
139 
140  void nullifyRowsAndCols_CSC(const double* mask_row, const double* mask_col,
141  double main_diagonal_value);
142 
143  void nullifyRowsAndCols_CSR(const double* mask_row, const double* mask_col,
144  double main_diagonal_value);
145 
146  void nullifyRows_CSR_BLK1(const double* mask_row,
147  double main_diagonal_value);
148 
149  void nullifyRows_CSR(const double* mask_row, double main_diagonal_value);
150 
151  void maxAbsRow_CSR_OFFSET0(double* array) const;
152 
153  void addAbsRow_CSR_OFFSET0(double* array) const;
154 
155  void addRow_CSR_OFFSET0(double* array) const;
156 
157  void applyDiagonal_CSR_OFFSET0(const double* left, const double* right);
158 
159  SparseMatrixType type;
167 
169  double *val;
170 
173 
175  void* solver_p;
176 };
177 
178 // interfaces:
179 
180 void SparseMatrix_MatrixVector_CSC_OFFSET0(const double alpha,
181  const_SparseMatrix_ptr A,
182  const double* in,
183  const double beta, double* out);
184 
185 void SparseMatrix_MatrixVector_CSC_OFFSET1(const double alpha,
186  const_SparseMatrix_ptr A,
187  const double* in,
188  const double beta, double* out);
189 
190 void SparseMatrix_MatrixVector_CSR_OFFSET0(const double alpha,
191  const_SparseMatrix_ptr A,
192  const double* in,
193  const double beta, double* out);
194 
195 void SparseMatrix_MatrixVector_CSR_OFFSET1(const double alpha,
196  const_SparseMatrix_ptr A,
197  const double* in,
198  const double beta, double* out);
199 
200 void SparseMatrix_MatrixVector_CSR_OFFSET0_DIAG(const double alpha,
201  const_SparseMatrix_ptr A,
202  const double* in,
203  const double beta, double* out);
204 
205 SparseMatrix_ptr SparseMatrix_MatrixMatrix(const_SparseMatrix_ptr A,
206  const_SparseMatrix_ptr B);
207 
208 SparseMatrix_ptr SparseMatrix_MatrixMatrixTranspose(const_SparseMatrix_ptr A,
209  const_SparseMatrix_ptr B,
210  const_SparseMatrix_ptr T);
211 
212 } // namespace paso
213 
214 #endif // __PASO_SPARSEMATRIX_H__
215 
void copyBlockToMainDiagonal(const double *in)
Definition: SparseMatrix.cpp:399
void SparseMatrix_MatrixVector_CSC_OFFSET0(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:43
boost::shared_ptr< Pattern > Pattern_ptr
Definition: Pattern.h:37
void SparseMatrix_MatrixVector_CSR_OFFSET1(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:191
dim_t block_size
Definition: SparseMatrix.h:162
SparseMatrixType type
Definition: SparseMatrix.h:159
index_t * borrowMainDiagonalPointer() const
Definition: SparseMatrix.h:79
boost::shared_ptr< const SparseMatrix > const_SparseMatrix_ptr
Definition: SparseMatrix.h:37
int SparseMatrixType
Definition: SparseMatrix.h:39
index_t * borrowColoringPointer() const
Definition: SparseMatrix.h:84
void addRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:381
double getSize() const
Definition: SparseMatrix.h:119
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:43
void setValues(double value)
Definition: SparseMatrix.cpp:476
void nullifyRows_CSR(const double *mask_row, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:141
void copyFromMainDiagonal(double *out) const
Definition: SparseMatrix.cpp:423
dim_t getNumColors() const
Definition: SparseMatrix.h:89
dim_t numCols
Definition: SparseMatrix.h:164
static SparseMatrix_ptr loadMM_toCSR(const char *filename)
Definition: SparseMatrix.cpp:202
void SparseMatrix_MatrixVector_CSR_OFFSET0(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:279
void * solver_p
pointer to data needed by a solver
Definition: SparseMatrix.h:175
boost::shared_ptr< SparseMatrix > SparseMatrix_ptr
Definition: SparseMatrix.h:35
dim_t row_block_size
Definition: SparseMatrix.h:160
dim_t getNumCols() const
Definition: SparseMatrix.h:114
dim_t col_block_size
Definition: SparseMatrix.h:161
void nullifyRowsAndCols_CSC(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:76
void SparseMatrix_MatrixVector_CSC_OFFSET1(const double alpha, const_SparseMatrix_ptr A, const double *in, const double beta, double *out)
Definition: SparseMatrix_MatrixVector.cpp:119
void applyBlockMatrix(double *block_diag, index_t *pivot, double *x, const double *b) const
Definition: SparseMatrix.cpp:541
SparseMatrix_ptr getBlock(int blockid) const
Definition: SparseMatrix_getSubmatrix.cpp:79
dim_t numRows
Definition: SparseMatrix.h:163
Definition: AMG.cpp:45
void nullifyRowsAndCols_CSR_BLK1(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:58
dim_t maxDeg() const
Definition: SparseMatrix.h:94
int index_t
type for array/matrix indices used both globally and on each rank
Definition: DataTypes.h:59
void invMain(double *inv_diag, index_t *pivot) const
Definition: SparseMatrix.cpp:491
void nullifyRows_CSR_BLK1(const double *mask_row, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:124
dim_t len
Definition: SparseMatrix.h:166
void addAbsRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:343
SparseMatrix_ptr getTranspose() const
Definition: SparseMatrix.cpp:550
dim_t getTotalNumCols() const
Definition: SparseMatrix.h:104
dim_t getNumRows() const
Definition: SparseMatrix.h:109
void copyToMainDiagonal(const double *in)
Definition: SparseMatrix.cpp:437
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:426
Definition: SparseMatrix.h:42
void saveHB_CSC(const char *filename) const
Definition: SparseMatrix_saveHB.cpp:179
~SparseMatrix()
Definition: SparseMatrix.cpp:184
SparseMatrix_ptr SparseMatrix_MatrixMatrixTranspose(const_SparseMatrix_ptr A, const_SparseMatrix_ptr B, const_SparseMatrix_ptr T)
Definition: SparseMatrix_MatrixMatrixTranspose.cpp:52
double * val
this is used for classical CSR or CSC
Definition: SparseMatrix.h:169
SparseMatrix_ptr SparseMatrix_MatrixMatrix(const_SparseMatrix_ptr A, const_SparseMatrix_ptr B)
Definition: SparseMatrix_MatrixMatrix.cpp:44
void maxAbsRow_CSR_OFFSET0(double *array) const
Definition: SparseMatrix.cpp:362
void applyDiagonal_CSR_OFFSET0(const double *left, const double *right)
Definition: SparseMatrix.cpp:451
index_t solver_package
package controlling the solver pointer
Definition: SparseMatrix.h:172
void nullifyRowsAndCols_CSR(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:100
SparseMatrix_ptr unroll(SparseMatrixType type) const
Definition: SparseMatrix.cpp:626
SparseMatrix(SparseMatrixType type, Pattern_ptr pattern, dim_t rowBlockSize, dim_t colBlockSize, bool patternIsUnrolled)
Definition: SparseMatrix.cpp:107
double getSparsity() const
Definition: SparseMatrix.h:124
dim_t getTotalNumRows() const
Definition: SparseMatrix.h:99
Pattern_ptr pattern
Definition: SparseMatrix.h:165
void nullifyRowsAndCols_CSC_BLK1(const double *mask_row, const double *mask_col, double main_diagonal_value)
Definition: SparseMatrix_nullifyRowsAndCols.cpp:40
index_t dim_t
Definition: DataTypes.h:64
void copyBlockFromMainDiagonal(double *out) const
Definition: SparseMatrix.cpp:411
void saveMM(const char *filename) const
Definition: SparseMatrix.cpp:280