GEOS
HypreMatrix.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef GEOS_LINEARALGEBRA_INTERFACES_HYPREMATRIX_HPP_
21 #define GEOS_LINEARALGEBRA_INTERFACES_HYPREMATRIX_HPP_
22 
23 #include "common/DataTypes.hpp"
28 
36 
38 extern "C" struct hypre_IJMatrix_struct;
39 
41 extern "C" struct hypre_ParCSRMatrix_struct;
42 
44 
45 namespace geos
46 {
47 
54 class HypreMatrix final : public virtual LinearOperator< HypreVector >,
55  private MatrixBase< HypreMatrix, HypreVector >
56 {
57 public:
58 
61 
64 
66  using HYPRE_IJMatrix = hypre_IJMatrix_struct *;
67 
69  using HYPRE_ParCSRMatrix = hypre_ParCSRMatrix_struct *;
70 
75 
82 
87  HypreMatrix( HypreMatrix const & src );
88 
93  HypreMatrix( HypreMatrix && src ) noexcept;
94 
101 
107  HypreMatrix & operator=( HypreMatrix && src ) noexcept;
108 
112  ~HypreMatrix() override;
113 
115 
120 
123  using MatrixBase::closed;
124  using MatrixBase::assembled;
127  using MatrixBase::ready;
128  using MatrixBase::residual;
131  using MatrixBase::create;
132  using MatrixBase::extract;
136 
137  virtual void create( CRSMatrixView< real64 const, globalIndex const > const & localMatrix,
138  localIndex const numLocalColumns,
139  MPI_Comm const & comm ) override;
140 
141  virtual void createWithLocalSize( localIndex const localRows,
142  localIndex const localCols,
143  localIndex const maxEntriesPerRow,
144  MPI_Comm const & comm ) override;
145 
146  virtual void createWithGlobalSize( globalIndex const globalRows,
147  globalIndex const globalCols,
148  localIndex const maxEntriesPerRow,
149  MPI_Comm const & comm ) override;
150 
151  virtual void open() override;
152 
153  virtual void close() override;
154 
158  virtual bool created() const override;
159 
160  virtual void reset() override;
161 
162  virtual void set( real64 const value ) override;
163 
164  virtual void zero() override;
165 
166  virtual void add( globalIndex const rowIndex,
167  globalIndex const colIndex,
168  real64 const value ) override;
169 
170  virtual void set( globalIndex const rowIndex,
171  globalIndex const colIndex,
172  real64 const value ) override;
173 
174  virtual void insert( globalIndex const rowIndex,
175  globalIndex const colIndex,
176  real64 const value ) override;
177 
178  virtual void add( globalIndex const rowIndex,
179  globalIndex const * colIndices,
180  real64 const * values,
181  localIndex const size ) override;
182 
183  virtual void set( globalIndex const rowIndex,
184  globalIndex const * colIndices,
185  real64 const * values,
186  localIndex const size ) override;
187 
188  virtual void insert( globalIndex const rowIndex,
189  globalIndex const * colIndices,
190  real64 const * values,
191  localIndex const size ) override;
192 
193  virtual void add( globalIndex const rowIndex,
194  arraySlice1d< globalIndex const > const & colIndices,
195  arraySlice1d< real64 const > const & values ) override;
196 
197  virtual void set( globalIndex const rowIndex,
198  arraySlice1d< globalIndex const > const & colIndices,
199  arraySlice1d< real64 const > const & values ) override;
200 
201  virtual void insert( globalIndex const rowIndex,
202  arraySlice1d< globalIndex const > const & colIndices,
203  arraySlice1d< real64 const > const & values ) override;
204 
205  virtual void add( arraySlice1d< globalIndex const > const & rowIndices,
206  arraySlice1d< globalIndex const > const & colIndices,
207  arraySlice2d< real64 const > const & values ) override;
208 
209  virtual void set( arraySlice1d< globalIndex const > const & rowIndices,
210  arraySlice1d< globalIndex const > const & colIndices,
211  arraySlice2d< real64 const > const & values ) override;
212 
213  virtual void insert( arraySlice1d< globalIndex const > const & rowIndices,
214  arraySlice1d< globalIndex const > const & colIndices,
215  arraySlice2d< real64 const > const & values ) override;
216 
217  virtual void add( globalIndex const * rowIndices,
218  globalIndex const * colIndices,
219  real64 const * values,
220  localIndex const numRows,
221  localIndex const numCols ) override;
222 
223  virtual void set( globalIndex const * rowIndices,
224  globalIndex const * colIndices,
225  real64 const * values,
226  localIndex const numRows,
227  localIndex const numCols ) override;
228 
229  virtual void insert( globalIndex const * rowIndices,
230  globalIndex const * colIndices,
231  real64 const * values,
232  localIndex const numRows,
233  localIndex const numCols ) override;
234 
235  virtual void insert( arrayView1d< globalIndex const > const & rowIndices,
236  arrayView1d< globalIndex const > const & colIndices,
237  arrayView1d< real64 const > const & values ) override;
238 
239  virtual void apply( HypreVector const & src,
240  HypreVector & dst ) const override;
241 
242  virtual void applyTranspose( HypreVector const & src,
243  HypreVector & dst ) const override;
244 
245  virtual void multiply( HypreMatrix const & src,
246  HypreMatrix & dst ) const override;
247 
248  virtual void leftMultiplyTranspose( HypreMatrix const & src,
249  HypreMatrix & dst ) const override;
250 
251  virtual void rightMultiplyTranspose( HypreMatrix const & src,
252  HypreMatrix & dst ) const override;
253 
254  virtual void multiplyRAP( HypreMatrix const & R,
255  HypreMatrix const & P,
256  HypreMatrix & dst ) const override;
257 
258  virtual void multiplyP1tAP2( Matrix const & P1,
259  Matrix const & P2,
260  Matrix & dst ) const override;
261 
262  virtual void gemv( real64 const alpha,
263  HypreVector const & x,
264  real64 const beta,
265  HypreVector & y,
266  bool useTranspose = false ) const override;
267 
268  virtual void scale( real64 const scalingFactor ) override;
269 
270  virtual void leftScale( HypreVector const & vec ) override;
271 
272  virtual void rescaleRows( arrayView1d< globalIndex const > const & rowIndices,
273  RowSumType const rowSumType ) override;
274 
275  virtual void rightScale( HypreVector const & vec ) override;
276 
280  virtual void computeScalingVector( HypreVector & scaling ) const override;
281 
286  virtual void leftRightScale( HypreVector const & vecLeft,
287  HypreVector const & vecRight ) override;
288 
289  virtual void transpose( HypreMatrix & dst ) const override;
290 
292  integer const dofPerPoint ) const override;
293 
294  virtual real64 clearRow( globalIndex const row,
295  bool const keepDiag = false,
296  real64 const diagValue = 0.0 ) override;
297 
298  virtual void addEntries( HypreMatrix const & src,
299  MatrixPatternOp const op,
300  real64 const scale ) override;
301 
302  virtual void addDiagonal( HypreVector const & src,
303  real64 const scale ) override;
304 
305  virtual void clampEntries( real64 const lo,
306  real64 const hi,
307  bool const excludeDiag ) override;
308 
312  virtual localIndex maxRowLengthLocal() const override;
313 
314  virtual localIndex rowLength( globalIndex const globalRowIndex ) const override;
315 
316  virtual void getRowLengths( arrayView1d< localIndex > const & lengths ) const override;
317 
318  virtual void getRowLocalLengths( arrayView1d< localIndex > const & lengths ) const override;
319 
320  virtual void getRowCopy( globalIndex globalRowIndex,
321  arraySlice1d< globalIndex > const & colIndices,
322  arraySlice1d< real64 > const & values ) const override;
323 
324  virtual void extractDiagonal( HypreVector & dst ) const override;
325 
326  virtual void extract( CRSMatrixView< real64, globalIndex > const & localMat ) const override;
327 
328  virtual void extract( CRSMatrixView< real64, globalIndex const > const & localMat ) const override;
329 
330  virtual void extractLocal( CRSMatrixView< real64, localIndex > const & localMat ) const override;
331 
332  virtual void getRowSums( HypreVector & dst,
333  RowSumType const rowSumType ) const override;
334 
338  virtual globalIndex numGlobalRows() const override;
339 
343  virtual globalIndex numGlobalCols() const override;
344 
348  virtual localIndex numLocalRows() const override;
349 
353  virtual localIndex numLocalCols() const override;
354 
358  virtual globalIndex ilower() const override;
359 
363  virtual globalIndex iupper() const override;
364 
368  virtual globalIndex jlower() const override;
369 
373  virtual globalIndex jupper() const override;
374 
378  virtual localIndex numLocalNonzeros() const override;
379 
383  virtual globalIndex numGlobalNonzeros() const override;
384 
388  virtual real64 normInf() const override;
389 
393  virtual real64 norm1() const override;
394 
398  virtual real64 normFrobenius() const override;
399 
403  virtual real64 normMax() const override;
404 
405  virtual real64 normMax( arrayView1d< globalIndex const > const & rowIndices ) const override;
406 
407  virtual localIndex getLocalRowID( globalIndex const index ) const override;
408 
409  virtual globalIndex getGlobalRowID( localIndex const index ) const override;
410 
414  virtual MPI_Comm comm() const override;
415 
416  virtual void print( std::ostream & os = std::cout ) const override;
417 
418  virtual void write( string const & filename,
419  LAIOutputFormat const format = LAIOutputFormat::MATRIX_MARKET ) const override;
420 
422 
427  HYPRE_ParCSRMatrix const & unwrapped() const;
428 
433  HYPRE_IJMatrix const & unwrappedIJ() const;
434 
435 private:
436 
440  void parCSRtoIJ( HYPRE_ParCSRMatrix const & parCSRMatrix );
441 
445  HYPRE_IJMatrix m_ij_mat{};
446 
450  HYPRE_ParCSRMatrix m_parcsr_mat{};
451 
452 };
453 
454 } // namespace geos
455 
456 #endif /*GEOS_LINEARALGEBRA_INTERFACES_HYPREMATRIX_HPP_*/
Facilitates exporting Hypre matrix and associated vector objects (either in parallel or serial).
Definition: HypreExport.hpp:38
Wrapper class for hypre's ParCSRMatrix.
Definition: HypreMatrix.hpp:56
virtual real64 normFrobenius() const override
Returns the Frobenius norm of the matrix.
virtual localIndex maxRowLengthLocal() const override
Returns the number of nonzero entries in the longest local row of the matrix.
virtual void rightMultiplyTranspose(HypreMatrix const &src, HypreMatrix &dst) const override
Matrix/Matrix transpose multiplication.
virtual void set(globalIndex const rowIndex, arraySlice1d< globalIndex const > const &colIndices, arraySlice1d< real64 const > const &values) override
Set elements of one row using array1d.
virtual void write(string const &filename, LAIOutputFormat const format=LAIOutputFormat::MATRIX_MARKET) const override
Write the matrix to filename in a matlab-compatible format.
virtual void clampEntries(real64 const lo, real64 const hi, bool const excludeDiag) override
Clamp each matrix value between values of lo and hi.
virtual globalIndex numGlobalRows() const override
virtual localIndex rowLength(globalIndex const globalRowIndex) const override
Get row length via global row index.
virtual void leftScale(HypreVector const &vec) override
Pre-multiplies (left) with diagonal matrix consisting of the values in vec.
virtual void insert(globalIndex const rowIndex, globalIndex const *colIndices, real64 const *values, localIndex const size) override
Insert elements to one row using c-style arrays.
hypre_ParCSRMatrix_struct * HYPRE_ParCSRMatrix
ParCSRMatrix pointer alias.
Definition: HypreMatrix.hpp:69
virtual globalIndex jupper() const override
Returns index one past the last global col owned by that processor.
virtual void createWithGlobalSize(globalIndex const globalRows, globalIndex const globalCols, localIndex const maxEntriesPerRow, MPI_Comm const &comm) override
Create a rectangular matrix from number of rows/columns.
virtual void extract(CRSMatrixView< real64, globalIndex const > const &localMat) const override
Extract local part of the matrix using previously allocated storage and structure.
virtual void multiply(HypreMatrix const &src, HypreMatrix &dst) const override
Matrix/Matrix multiplication.
virtual void multiplyRAP(HypreMatrix const &R, HypreMatrix const &P, HypreMatrix &dst) const override
Compute the triple product dst = R * this * P
hypre_IJMatrix_struct * HYPRE_IJMatrix
IJMatrix pointer alias.
Definition: HypreMatrix.hpp:66
virtual bool created() const override
Query matrix creation status.
virtual real64 clearRow(globalIndex const row, bool const keepDiag=false, real64 const diagValue=0.0) override
Clear a row, and optionally set diagonal element to diagValue.
virtual void add(globalIndex const rowIndex, globalIndex const *colIndices, real64 const *values, localIndex const size) override
Add elements to one row using c-style arrays.
virtual void print(std::ostream &os=std::cout) const override
Print the matrix in Trilinos format to a stream.
HypreMatrix & operator=(HypreMatrix &&src) noexcept
Move assignment.
virtual void insert(arraySlice1d< globalIndex const > const &rowIndices, arraySlice1d< globalIndex const > const &colIndices, arraySlice2d< real64 const > const &values) override
Insert a dense block of values.
virtual void getRowLengths(arrayView1d< localIndex > const &lengths) const override
Get the row lengths of every local row.
virtual localIndex numLocalNonzeros() const override
virtual globalIndex ilower() const override
Returns the index of the first global row owned by that processor.
virtual void apply(HypreVector const &src, HypreVector &dst) const override
Apply operator to a vector, dst = this(src).
virtual void createWithLocalSize(localIndex const localRows, localIndex const localCols, localIndex const maxEntriesPerRow, MPI_Comm const &comm) override
Create a rectangular matrix from number of rows/columns.
virtual real64 norm1() const override
Returns the one norm of the matrix.
virtual void reset() override
Reset the matrix to default state.
HYPRE_IJMatrix const & unwrappedIJ() const
Returns a pointer to implementation.
virtual void zero() override
Set all elements to zero.
HypreMatrix(HypreMatrix const &src)
Copy constructor.
virtual void leftRightScale(HypreVector const &vecLeft, HypreVector const &vecRight) override
Post-multiplies (right) with diagonal matrix consisting of the values in vecRight and pre-multiplies ...
virtual void add(globalIndex const *rowIndices, globalIndex const *colIndices, real64 const *values, localIndex const numRows, localIndex const numCols) override
Add a dense block of values.
virtual void gemv(real64 const alpha, HypreVector const &x, real64 const beta, HypreVector &y, bool useTranspose=false) const override
Compute gemv y = alpha*A*x + beta*y.
virtual real64 normMax() const override
Returns the max norm of the matrix (the largest absolute element value).
virtual real64 normInf() const override
Returns the infinity norm of the matrix.
virtual void add(globalIndex const rowIndex, arraySlice1d< globalIndex const > const &colIndices, arraySlice1d< real64 const > const &values) override
Add elements to one row using array1d.
virtual localIndex numLocalRows() const override
virtual void add(arraySlice1d< globalIndex const > const &rowIndices, arraySlice1d< globalIndex const > const &colIndices, arraySlice2d< real64 const > const &values) override
Add a dense block of values.
virtual void set(arraySlice1d< globalIndex const > const &rowIndices, arraySlice1d< globalIndex const > const &colIndices, arraySlice2d< real64 const > const &values) override
Set a dense block of values.
virtual real64 normMax(arrayView1d< globalIndex const > const &rowIndices) const override
Returns the max norm of the matrix on a subset of rows.
virtual globalIndex numGlobalCols() const override
virtual void set(globalIndex const *rowIndices, globalIndex const *colIndices, real64 const *values, localIndex const numRows, localIndex const numCols) override
Set a dense block of values.
HypreMatrix(HypreMatrix &&src) noexcept
Move constructor.
virtual void open() override
Open matrix for adding new entries.
virtual void multiplyP1tAP2(Matrix const &P1, Matrix const &P2, Matrix &dst) const override
Compute the triple product dst = P1^T * this * P2
virtual void insert(globalIndex const rowIndex, arraySlice1d< globalIndex const > const &colIndices, arraySlice1d< real64 const > const &values) override
Insert elements of one row using array1d.
virtual void set(globalIndex const rowIndex, globalIndex const *colIndices, real64 const *values, localIndex const size) override
Set elements to one row using c-style arrays.
virtual void applyTranspose(HypreVector const &src, HypreVector &dst) const override
Apply transpose of the matrix to a vector.
virtual void rightScale(HypreVector const &vec) override
Post-multiplies (right) with diagonal matrix consisting of the values in vec.
virtual void getRowSums(HypreVector &dst, RowSumType const rowSumType) const override
Populate a vector with row sums of this.
virtual void getRowLocalLengths(arrayView1d< localIndex > const &lengths) const override
Get the local row lengths of every local row (number of nonzeros in local columns)
HypreMatrix()
Empty matrix constructor.
virtual globalIndex getGlobalRowID(localIndex const index) const override
Map a local row index to global row index.
virtual void separateComponentFilter(HypreMatrix &dst, integer const dofPerPoint) const override
Apply a separate component approximation (filter) to this matrix.
virtual void transpose(HypreMatrix &dst) const override
Matrix transposition.
virtual globalIndex numGlobalNonzeros() const override
virtual void extract(CRSMatrixView< real64, globalIndex > const &localMat) const override
Extract local part of the matrix using previously allocated storage.
virtual globalIndex jlower() const override
Returns the index of the first global col owned by that processor.
HYPRE_ParCSRMatrix const & unwrapped() const
Returns a pointer to implementation.
~HypreMatrix() override
Virtual destructor.
virtual void set(real64 const value) override
Set all non-zero elements to a value.
virtual void extractLocal(CRSMatrixView< real64, localIndex > const &localMat) const override
Extract block of the matrix corresponding to locally owned columns using previously allocated storage...
virtual void insert(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Insert one element.
HypreMatrix & operator=(HypreMatrix const &src)
Copy assignment.
virtual void addEntries(HypreMatrix const &src, MatrixPatternOp const op, real64 const scale) override
Add entries of another matrix to this.
virtual void addDiagonal(HypreVector const &src, real64 const scale) override
Add (scaled) entries of a vector to the diagonal of this matrix.
virtual void close() override
Assemble and compress the matrix.
virtual void set(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Set one element.
virtual void rescaleRows(arrayView1d< globalIndex const > const &rowIndices, RowSumType const rowSumType) override
Rescales selected rows of matrix using row sum reciprocal as a factor.
virtual void extractDiagonal(HypreVector &dst) const override
Extract diagonal values into a vector.
virtual void leftMultiplyTranspose(HypreMatrix const &src, HypreMatrix &dst) const override
Matrix/Matrix transpose multiplication.
virtual void create(CRSMatrixView< real64 const, globalIndex const > const &localMatrix, localIndex const numLocalColumns, MPI_Comm const &comm) override
Create parallel matrix from a local CRS matrix.
virtual void scale(real64 const scalingFactor) override
Multiply all elements by scalingFactor.
virtual void insert(arrayView1d< globalIndex const > const &rowIndices, arrayView1d< globalIndex const > const &colIndices, arrayView1d< real64 const > const &values) override
Insert values stored in 3 linear vectors.
virtual void insert(globalIndex const *rowIndices, globalIndex const *colIndices, real64 const *values, localIndex const numRows, localIndex const numCols) override
Insert dense matrix.
virtual localIndex getLocalRowID(globalIndex const index) const override
Map a global row index to local row index.
virtual void getRowCopy(globalIndex globalRowIndex, arraySlice1d< globalIndex > const &colIndices, arraySlice1d< real64 > const &values) const override
Returns a copy of the data in row globalRow.
virtual MPI_Comm comm() const override
Get the MPI communicator the matrix was created with.
virtual localIndex numLocalCols() const override
virtual void computeScalingVector(HypreVector &scaling) const override
Compute left and right scaling vectors for diagonal scaling.
virtual void add(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Add to one element.
virtual globalIndex iupper() const override
Returns index one past the last global row owned by that processor.
Wrapper class for hypre's ParVector.
Definition: HypreVector.hpp:51
Abstract base class for linear operators.
Common base template for all matrix wrapper types.
Definition: MatrixBase.hpp:76
virtual void multiplyPtAP(Matrix const &P, Matrix &dst) const
Compute the triple product dst = P^T * this * P
Definition: MatrixBase.hpp:648
virtual void residual(Vector const &x, Vector const &b, Vector &r) const override
Compute residual r = b - A * x.
Definition: MatrixBase.hpp:553
void setDofManager(DofManager const *const dofManager)
Associate a DofManager with this matrix.
Definition: MatrixBase.hpp:159
bool assembled() const
Query matrix assembled status.
Definition: MatrixBase.hpp:110
bool closed() const
Query matrix closed status.
Definition: MatrixBase.hpp:104
virtual void createWithGlobalSize(globalIndex const globalSize, localIndex const maxEntriesPerRow, MPI_Comm const &comm)
Create a square matrix from global number of rows.
Definition: MatrixBase.hpp:206
bool insertable() const
Query matrix status.
Definition: MatrixBase.hpp:132
virtual void createWithLocalSize(localIndex const localSize, localIndex const maxEntriesPerRow, MPI_Comm const &comm)
Create a square matrix from local number of rows.
Definition: MatrixBase.hpp:188
CRSMatrix< real64, globalIndex > extract() const
Extract local part of the matrix.
Definition: MatrixBase.hpp:875
DofManager const * dofManager() const
Definition: MatrixBase.hpp:167
bool ready() const
Query matrix ready status.
Definition: MatrixBase.hpp:117
bool modifiable() const
Query matrix status.
Definition: MatrixBase.hpp:125
virtual void multiplyP1tAP2(Matrix const &P1, Matrix const &P2, Matrix &dst) const
Compute the triple product dst = P1^T * this * P2
Definition: MatrixBase.hpp:628
CRSMatrix< real64, localIndex > extractLocal() const
Extract block of the matrix corresponding to locally owned columns.
Definition: MatrixBase.hpp:898
virtual void create(CRSMatrixView< real64 const, globalIndex const > const &localMatrix, localIndex const numLocalColumns, MPI_Comm const &comm)
Create parallel matrix from a local CRS matrix.
Definition: MatrixBase.hpp:250
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:179
RowSumType
Type of row sum to compute.
Definition: MatrixBase.hpp:36
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:87
LAIOutputFormat
Definition: common.hpp:142
ArraySlice< T, 2, USD > arraySlice2d
Alias for 2D array slice.
Definition: DataTypes.hpp:199
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:84
ArraySlice< T, 1, USD > arraySlice1d
Alias for 1D array slice.
Definition: DataTypes.hpp:183
LvArray::CRSMatrixView< T, COL_INDEX, INDEX_TYPE const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:309
int integer
Signed integer type.
Definition: DataTypes.hpp:81
MatrixPatternOp
Describes relationship between and treatment of nonzero patterns of arguments in matrix functions lik...
Definition: MatrixBase.hpp:48