GEOSX
EpetraMatrix.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University
7  * Copyright (c) 2018-2020 TotalEnergies
8  * Copyright (c) 2019- GEOSX Contributors
9  * All rights reserved
10  *
11  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
12  * ------------------------------------------------------------------------------------------------------------
13  */
14 
19 #ifndef GEOS_LINEARALGEBRA_INTERFACES_EPETRAMATRIX_HPP_
20 #define GEOS_LINEARALGEBRA_INTERFACES_EPETRAMATRIX_HPP_
21 
22 #include "common/DataTypes.hpp"
27 
28 class Epetra_Map;
29 class Epetra_CrsMatrix;
30 class Epetra_FECrsMatrix;
31 
32 namespace geos
33 {
34 
38 class EpetraMatrix final : public virtual LinearOperator< EpetraVector >,
39  private MatrixBase< EpetraMatrix, EpetraVector >
40 {
41 public:
42 
45 
48 
53 
60 
65  EpetraMatrix( EpetraMatrix const & src );
66 
71  EpetraMatrix( EpetraMatrix && src ) noexcept;
72 
79 
85  EpetraMatrix & operator=( EpetraMatrix && src ) noexcept;
86 
90  virtual ~EpetraMatrix() override;
91 
93 
98 
101  using MatrixBase::create;
102  using MatrixBase::closed;
103  using MatrixBase::assembled;
106  using MatrixBase::ready;
107  using MatrixBase::residual;
110 
111  virtual void createWithLocalSize( localIndex const localRows,
112  localIndex const localCols,
113  localIndex const maxEntriesPerRow,
114  MPI_Comm const & comm ) override;
115 
116  virtual void createWithGlobalSize( globalIndex const globalRows,
117  globalIndex const globalCols,
118  localIndex const maxEntriesPerRow,
119  MPI_Comm const & comm ) override;
120 
121  virtual void open() override;
122 
123  virtual void close() override;
124 
128  virtual bool created() const override;
129 
130  virtual void reset() override;
131 
132  virtual void set( real64 const value ) override;
133 
134  virtual void zero() override;
135 
136  virtual void add( globalIndex const rowIndex,
137  globalIndex const colIndex,
138  real64 const value ) override;
139 
140  virtual void set( globalIndex const rowIndex,
141  globalIndex const colIndex,
142  real64 const value ) override;
143 
144  virtual void insert( globalIndex const rowIndex,
145  globalIndex const colIndex,
146  real64 const value ) override;
147 
148  virtual void add( globalIndex const rowIndex,
149  globalIndex const * colIndices,
150  real64 const * values,
151  localIndex const size ) override;
152 
153  virtual void set( globalIndex const rowIndex,
154  globalIndex const * colIndices,
155  real64 const * values,
156  localIndex const size ) override;
157 
158  virtual void insert( globalIndex const rowIndex,
159  globalIndex const * colIndices,
160  real64 const * values,
161  localIndex const size ) override;
162 
163  virtual void add( globalIndex const rowIndex,
164  arraySlice1d< globalIndex const > const & colIndices,
165  arraySlice1d< real64 const > const & values ) override;
166 
167  virtual void set( globalIndex const rowIndex,
168  arraySlice1d< globalIndex const > const & colIndices,
169  arraySlice1d< real64 const > const & values ) override;
170 
171  virtual void insert( globalIndex const rowIndex,
172  arraySlice1d< globalIndex const > const & colIndices,
173  arraySlice1d< real64 const > const & values ) override;
174 
175  virtual void add( arraySlice1d< globalIndex const > const & rowIndices,
176  arraySlice1d< globalIndex const > const & colIndices,
177  arraySlice2d< real64 const > const & values ) override;
178 
179  virtual void set( arraySlice1d< globalIndex const > const & rowIndices,
180  arraySlice1d< globalIndex const > const & colIndices,
181  arraySlice2d< real64 const > const & values ) override;
182 
183  virtual void insert( arraySlice1d< globalIndex const > const & rowIndices,
184  arraySlice1d< globalIndex const > const & colIndices,
185  arraySlice2d< real64 const > const & values ) override;
186 
187  virtual void add( globalIndex const * rowIndices,
188  globalIndex const * colIndices,
189  real64 const * values,
190  localIndex const numRows,
191  localIndex const numCols ) override;
192 
193  virtual void set( globalIndex const * rowIndices,
194  globalIndex const * colIndices,
195  real64 const * values,
196  localIndex const numRows,
197  localIndex const numCols ) override;
198 
199  virtual void insert( globalIndex const * rowIndices,
200  globalIndex const * colIndices,
201  real64 const * values,
202  localIndex const numRows,
203  localIndex const numCols ) override;
204 
205  virtual void insert( arrayView1d< globalIndex const > const & rowIndices,
206  arrayView1d< globalIndex const > const & colIndices,
207  arrayView1d< real64 const > const & values ) override;
208 
209  virtual void apply( EpetraVector const & src,
210  EpetraVector & dst ) const override;
211 
212  virtual void applyTranspose( EpetraVector const & src,
213  EpetraVector & dst ) const override;
214 
215  virtual void multiply( EpetraMatrix const & src,
216  EpetraMatrix & dst ) const override;
217 
218  virtual void leftMultiplyTranspose( EpetraMatrix const & src,
219  EpetraMatrix & dst ) const override;
220 
221  virtual void rightMultiplyTranspose( EpetraMatrix const & src,
222  EpetraMatrix & dst ) const override;
223 
224  virtual void multiplyRAP( EpetraMatrix const & R,
225  EpetraMatrix const & P,
226  EpetraMatrix & dst ) const override;
227 
228  virtual void multiplyPtAP( EpetraMatrix const & P,
229  EpetraMatrix & dst ) const override;
230 
231  virtual void gemv( real64 const alpha,
232  EpetraVector const & x,
233  real64 const beta,
234  EpetraVector & y,
235  bool useTranspose = false ) const override;
236 
237  virtual void scale( real64 const scalingFactor ) override;
238 
239  virtual void leftScale( EpetraVector const & vec ) override;
240 
241  virtual void rightScale( EpetraVector const & vec ) override;
242 
243  virtual void leftRightScale( EpetraVector const & vecLeft,
244  EpetraVector const & vecRight ) override;
245 
246  virtual void rescaleRows( arrayView1d< globalIndex const > const & rowIndices,
247  RowSumType const rowSumType ) override;
248 
249  virtual void transpose( EpetraMatrix & dst ) const override;
250 
252  integer const dofsPerNode ) const override;
253 
254  virtual real64 clearRow( globalIndex const row,
255  bool const keepDiag = false,
256  real64 const diagValue = 0.0 ) override;
257 
258  virtual void addEntries( EpetraMatrix const & src,
259  MatrixPatternOp const op,
260  real64 const scale ) override;
261 
262  virtual void addDiagonal( EpetraVector const & src,
263  real64 const scale ) override;
264 
265  virtual void clampEntries( real64 const lo,
266  real64 const hi,
267  bool const excludeDiag ) override;
268 
272  virtual localIndex maxRowLength() const override;
273 
274  virtual localIndex rowLength( globalIndex const globalRowIndex ) const override;
275 
276  virtual void getRowLengths( arrayView1d< localIndex > const & lengths ) const override;
277 
278  virtual void getRowCopy( globalIndex globalRow,
279  arraySlice1d< globalIndex > const & colIndices,
280  arraySlice1d< real64 > const & values ) const override;
281 
282  virtual void extractDiagonal( EpetraVector & dst ) const override;
283 
284  virtual void getRowSums( EpetraVector & dst,
285  RowSumType const rowSumType ) const override;
286 
290  virtual globalIndex numGlobalRows() const override;
291 
295  virtual globalIndex numGlobalCols() const override;
296 
300  virtual localIndex numLocalRows() const override;
301 
305  virtual localIndex numLocalCols() const override;
306 
310  virtual globalIndex ilower() const override;
311 
315  virtual globalIndex iupper() const override;
316 
320  virtual globalIndex jlower() const override;
321 
325  virtual globalIndex jupper() const override;
326 
330  virtual localIndex numLocalNonzeros() const override;
331 
335  virtual globalIndex numGlobalNonzeros() const override;
336 
340  virtual real64 normInf() const override;
341 
345  virtual real64 norm1() const override;
346 
350  virtual real64 normFrobenius() const override;
351 
355  virtual real64 normMax() const override;
356 
357  virtual real64 normMax( arrayView1d< globalIndex const > const & rowIndices ) const override;
358 
359  virtual localIndex getLocalRowID( globalIndex const index ) const override;
360 
361  virtual globalIndex getGlobalRowID( localIndex const index ) const override;
362 
366  virtual MPI_Comm comm() const override;
367 
368  virtual void print( std::ostream & os = std::cout ) const override;
369 
370  virtual void write( string const & filename,
371  LAIOutputFormat const format = LAIOutputFormat::MATRIX_MARKET ) const override;
372 
374 
379  Epetra_FECrsMatrix const & unwrapped() const;
380 
385  Epetra_FECrsMatrix & unwrapped();
386 
387 private:
388 
392  void multiply( bool const transA,
393  EpetraMatrix const & B,
394  bool const transB,
395  EpetraMatrix & C ) const;
396 
401  void create( Epetra_CrsMatrix const & src );
402 
404  std::unique_ptr< Epetra_FECrsMatrix > m_matrix;
405 
407  std::unique_ptr< Epetra_Map > m_src_map;
408 
410  std::unique_ptr< Epetra_Map > m_dst_map;
411 };
412 
413 } // namespace geos
414 
415 #endif /*GEOS_LINEARALGEBRA_INTERFACES_EPETRAMATRIX_HPP_*/
Facilitates exporting Epetra matrix and associated vector objects (either in parallel or serial).
Wrapper class for Epetra's CrsMatrix.
virtual void rightMultiplyTranspose(EpetraMatrix const &src, EpetraMatrix &dst) const override
Matrix/Matrix transpose multiplication.
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 add(globalIndex const rowIndex, globalIndex const *colIndices, real64 const *values, localIndex const size) override
Add elements to one row using c-style arrays.
virtual globalIndex numGlobalCols() const override
Get the number of global columns.
virtual void open() override
Open matrix for adding new entries.
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 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 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 globalIndex iupper() const override
Returns index one past the last global row owned by that processor.
virtual void rightScale(EpetraVector const &vec) override
Post-multiplies (right) with diagonal matrix consisting of the values in vec.
virtual localIndex rowLength(globalIndex const globalRowIndex) const override
Get row length via global row index.
virtual localIndex maxRowLength() const override
Returns the number of nonzero entries in the longest row of the matrix.
virtual void apply(EpetraVector const &src, EpetraVector &dst) const override
Apply operator to a vector, dst = this(src).
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 insert(globalIndex const *rowIndices, globalIndex const *colIndices, real64 const *values, localIndex const numRows, localIndex const numCols) override
Insert dense matrix.
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 globalIndex numGlobalNonzeros() const override
Returns the total number of nonzeros in the matrix.
Epetra_FECrsMatrix & unwrapped()
Returns a non-const pointer to the underlying matrix.
EpetraMatrix & operator=(EpetraMatrix &&src) noexcept
Move assignment.
virtual ~EpetraMatrix() override
Virtual destructor.
virtual void multiply(EpetraMatrix const &src, EpetraMatrix &dst) const override
Matrix/Matrix multiplication.
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 void clampEntries(real64 const lo, real64 const hi, bool const excludeDiag) override
Clamp each matrix value between values of lo and hi.
virtual void getRowSums(EpetraVector &dst, RowSumType const rowSumType) const override
Populate a vector with row sums of this.
virtual void add(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Add to one element.
EpetraMatrix & operator=(EpetraMatrix const &src)
Copy assignment.
virtual void getRowCopy(globalIndex globalRow, arraySlice1d< globalIndex > const &colIndices, arraySlice1d< real64 > const &values) const override
Returns a copy of the data in row globalRow.
virtual void transpose(EpetraMatrix &dst) const override
Matrix transposition.
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 insert(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Insert one element.
virtual void separateComponentFilter(EpetraMatrix &dst, integer const dofsPerNode) const override
Apply a separate component approximation (filter) to this matrix.
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 print(std::ostream &os=std::cout) const override
Print the matrix in Trilinos format to a stream.
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 leftMultiplyTranspose(EpetraMatrix const &src, EpetraMatrix &dst) const override
Matrix/Matrix transpose multiplication.
virtual globalIndex jlower() const override
Returns the index of the first global col owned by that processor.
virtual globalIndex ilower() const override
Returns the index of the first global row owned by that processor.
virtual globalIndex numGlobalRows() const override
Get the number of global rows.
virtual real64 normFrobenius() const override
Returns the Frobenius norm of the matrix.
virtual void leftRightScale(EpetraVector const &vecLeft, EpetraVector const &vecRight) override
Post-multiplies (right) with diagonal matrix consisting of the values in vecRight and pre-multiplies ...
virtual localIndex getLocalRowID(globalIndex const index) const override
Map a global row index to local row index.
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.
virtual void gemv(real64 const alpha, EpetraVector const &x, real64 const beta, EpetraVector &y, bool useTranspose=false) const override
Compute gemv y = alpha*A*x + beta*y.
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 zero() override
Set all elements to zero.
virtual globalIndex getGlobalRowID(localIndex const index) const override
Map a local row index to global row index.
EpetraMatrix(EpetraMatrix &&src) noexcept
Move constructor.
virtual real64 normMax() const override
Returns the max norm of the matrix (the largest absolute element value).
virtual void reset() override
Reset the matrix to default state.
virtual real64 normInf() const override
Returns the infinity norm of the matrix.
virtual void set(real64 const value) override
Set all non-zero elements to a value.
virtual MPI_Comm comm() const override
Get the MPI communicator the matrix was created with.
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 real64 normMax(arrayView1d< globalIndex const > const &rowIndices) const override
Returns the max norm of the matrix on a subset of rows.
virtual void extractDiagonal(EpetraVector &dst) const override
Extract diagonal values into a vector.
virtual localIndex numLocalRows() const override
Get the number of local rows.
virtual void addEntries(EpetraMatrix const &src, MatrixPatternOp const op, real64 const scale) override
Add entries of another matrix to this.
virtual localIndex numLocalNonzeros() const override
Returns the number of nonzeros in the local portion of the matrix.
EpetraMatrix(EpetraMatrix const &src)
Copy constructor.
virtual bool created() const override
Query matrix creation status.
Epetra_FECrsMatrix const & unwrapped() const
Returns a const pointer to the underlying matrix.
virtual void close() override
Assemble and compress the matrix.
virtual void addDiagonal(EpetraVector const &src, real64 const scale) override
Add (scaled) entries of a vector to the diagonal of this matrix.
virtual void leftScale(EpetraVector const &vec) override
Pre-multiplies (left) with diagonal matrix consisting of the values in vec.
virtual void getRowLengths(arrayView1d< localIndex > const &lengths) const override
Get the row lengths of every local row.
virtual void scale(real64 const scalingFactor) override
Multiply all elements by scalingFactor.
virtual void multiplyPtAP(EpetraMatrix const &P, EpetraMatrix &dst) const override
Compute the triple product dst = P^T * this * P
virtual globalIndex jupper() const override
Returns index one past the last global col owned by that processor.
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.
virtual void multiplyRAP(EpetraMatrix const &R, EpetraMatrix const &P, EpetraMatrix &dst) const override
Compute the triple product dst = R * this * P
virtual real64 norm1() const override
Returns the one norm of the matrix.
virtual void applyTranspose(EpetraVector const &src, EpetraVector &dst) const override
Apply transpose of the matrix to a vector.
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 localIndex numLocalCols() const override
Get the number of local columns.
EpetraMatrix()
Empty matrix constructor.
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:247
virtual void set(globalIndex const rowIndex, globalIndex const colIndex, real64 const value) override
Set one element.
virtual void set(globalIndex const rowIndex, arraySlice1d< globalIndex const > const &colIndices, arraySlice1d< real64 const > const &values) override
Set elements of one row using array1d.
Wrapper around Trilinos' Epetra_Vector object.
Abstract base class for linear operators.
Common base template for all matrix wrapper types.
Definition: MatrixBase.hpp:75
virtual void residual(Vector const &x, Vector const &b, Vector &r) const override
Compute residual r = b - A * x.
Definition: MatrixBase.hpp:550
void setDofManager(DofManager const *const dofManager)
Associate a DofManager with this matrix.
Definition: MatrixBase.hpp:156
bool assembled() const
Query matrix assembled status.
Definition: MatrixBase.hpp:107
bool closed() const
Query matrix closed status.
Definition: MatrixBase.hpp:101
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:203
bool insertable() const
Query matrix status.
Definition: MatrixBase.hpp:129
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:185
DofManager const * dofManager() const
Definition: MatrixBase.hpp:164
bool ready() const
Query matrix ready status.
Definition: MatrixBase.hpp:114
bool modifiable() const
Query matrix status.
Definition: MatrixBase.hpp:122
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:247
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:220
RowSumType
Type of row sum to compute.
Definition: MatrixBase.hpp:35
LAIOutputFormat
Definition: common.hpp:140
ArraySlice< T, 2, USD > arraySlice2d
Alias for 2D array slice.
Definition: DataTypes.hpp:240
double real64
64-bit floating point type.
Definition: DataTypes.hpp:139
ArraySlice< T, 1, USD > arraySlice1d
Alias for 1D array slice.
Definition: DataTypes.hpp:224
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:122
GEOSX_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:128
GEOSX_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:125
MatrixPatternOp
Describes relationship between and treatment of nonzero patterns of arguments in matrix functions lik...
Definition: MatrixBase.hpp:47