OGS
PETScMatrix.h
Go to the documentation of this file.
1
15#pragma once
16
17#include <string>
18#include <vector>
19
21#include "PETScMatrixOption.h"
22
23typedef Mat PETSc_Mat;
24
25namespace MathLib
26{
27class PETScVector;
32{
33public:
34 using IndexType = PetscInt;
35
36public:
44 PETScMatrix(const PetscInt nrows,
45 const PETScMatrixOption& mat_op = PETScMatrixOption());
46
54 PETScMatrix(const PetscInt nrows, const PetscInt ncols,
55 const PETScMatrixOption& mat_op = PETScMatrixOption());
56
58 PETScMatrix(PETScMatrix const& A);
59
61
67 void finalizeAssembly(const MatAssemblyType asm_type = MAT_FINAL_ASSEMBLY)
68 {
69 MatAssemblyBegin(A_, asm_type);
70 MatAssemblyEnd(A_, asm_type);
71 }
72
74 PetscInt getNumberOfRows() const { return nrows_; }
76 PetscInt getNumberOfColumns() const { return ncols_; }
78 PetscInt getNumberOfLocalRows() const { return n_loc_rows_; }
80 PetscInt getNumberOfLocalColumns() const { return n_loc_cols_; }
82 PetscInt getRangeBegin() const { return start_rank_; }
84 PetscInt getRangeEnd() const { return end_rank_; }
86 Mat& getRawMatrix() { return A_; }
93 Mat const& getRawMatrix() const { return A_; }
95 void setZero() { MatZeroEntries(A_); }
105 void setRowsColumnsZero(std::vector<PetscInt> const& row_pos);
106
113 void set(const PetscInt i, const PetscInt j, const PetscScalar value)
114 {
115 MatSetValue(A_, i, j, value, INSERT_VALUES);
116 }
117
124 void add(const PetscInt i, const PetscInt j, const PetscScalar value)
125 {
126 MatSetValue(A_, i, j, value, ADD_VALUES);
127 }
128
145 template <class T_DENSE_MATRIX>
146 void add(RowColumnIndices<PetscInt> const& indices,
147 const T_DENSE_MATRIX& sub_matrix)
148 {
149 // Set global column indices to positive to allow all entries of columns
150 // to be added to the global matrix. For the ghost columns, only the
151 // off diagonal entries are added due to the negative indices of the
152 // corresponding rows.
153 std::vector<PetscInt> cols;
154 cols.reserve(indices.columns.size());
155 for (auto col : indices.columns)
156 {
157 // Ghost entries, and its original index is 0.
158 if (col == -ncols_)
159 {
160 cols.push_back(0);
161 }
162 else
163 {
164 cols.push_back(std::abs(col));
165 }
166 }
167
168 add(indices.rows, cols, sub_matrix);
169 }
170
179 template <class T_DENSE_MATRIX>
180 void add(std::vector<PetscInt> const& row_pos,
181 std::vector<PetscInt> const& col_pos,
182 const T_DENSE_MATRIX& sub_mat);
183
213 void viewer(const std::string& file_name,
214 const PetscViewerFormat vw_format = PETSC_VIEWER_ASCII_MATLAB);
215
216private:
217 void destroy()
218 {
219 if (A_ != nullptr)
220 {
221 MatDestroy(&A_);
222 }
223 A_ = nullptr;
224 }
225
227 Mat A_ = nullptr;
228
230 PetscInt nrows_;
231
233 PetscInt ncols_;
234
236 PetscInt n_loc_rows_;
237
239 PetscInt n_loc_cols_;
240
242 PetscInt start_rank_;
243
245 PetscInt end_rank_;
246
255 void create(const PetscInt d_nz, const PetscInt o_nz);
256
257 friend bool finalizeMatrixAssembly(PETScMatrix& mat,
258 const MatAssemblyType asm_type);
259};
260
261template <class T_DENSE_MATRIX>
262void PETScMatrix::add(std::vector<PetscInt> const& row_pos,
263 std::vector<PetscInt> const& col_pos,
264 const T_DENSE_MATRIX& sub_mat)
265{
266 const PetscInt nrows = static_cast<PetscInt>(row_pos.size());
267 const PetscInt ncols = static_cast<PetscInt>(col_pos.size());
268
269 MatSetValues(A_, nrows, &row_pos[0], ncols, &col_pos[0], &sub_mat(0, 0),
270 ADD_VALUES);
271};
272
280 PETScMatrix& mat, const MatAssemblyType asm_type = MAT_FINAL_ASSEMBLY);
281
282} // namespace MathLib
Define data for the configuration of PETSc matrix and linear solver.
Mat PETSc_Mat
Definition PETScMatrix.h:23
Wrapper class for PETSc matrix routines for matrix.
Definition PETScMatrix.h:32
PetscInt n_loc_cols_
Number of the local columns.
Mat const & getRawMatrix() const
Definition PETScMatrix.h:93
PetscInt getNumberOfLocalRows() const
Get the number of local rows.
Definition PETScMatrix.h:78
friend bool finalizeMatrixAssembly(PETScMatrix &mat, const MatAssemblyType asm_type)
General interface for the matrix assembly.
PETScMatrix & operator=(PETScMatrix const &A)
Mat & getRawMatrix()
Get matrix reference.
Definition PETScMatrix.h:86
PetscInt getNumberOfColumns() const
Get the number of columns.
Definition PETScMatrix.h:76
void add(RowColumnIndices< PetscInt > const &indices, const T_DENSE_MATRIX &sub_matrix)
Add sub-matrix at positions given by global indices, in which negative index indicates ghost entry.
void setZero()
Set all entries to zero.
Definition PETScMatrix.h:95
void create(const PetscInt d_nz, const PetscInt o_nz)
Create the matrix, configure memory allocation and set the related member data.
PetscInt getRangeEnd() const
Get the end global index of the rows in the same rank.
Definition PETScMatrix.h:84
void set(const PetscInt i, const PetscInt j, const PetscScalar value)
Set a single entry with a value.
PetscInt end_rank_
Ending index in a rank.
PetscInt getRangeBegin() const
Get the start global index of the rows of the same rank.
Definition PETScMatrix.h:82
void finalizeAssembly(const MatAssemblyType asm_type=MAT_FINAL_ASSEMBLY)
Perform MPI collection of assembled entries in buffer.
Definition PETScMatrix.h:67
PetscInt n_loc_rows_
Number of the local rows.
Mat A_
PETSc matrix.
PetscInt nrows_
Number of the global rows.
void setRowsColumnsZero(std::vector< PetscInt > const &row_pos)
Set the specified rows to zero except diagonal entries, i.e. , where This function must be called...
PetscInt ncols_
Number of the global columns.
void viewer(const std::string &file_name, const PetscViewerFormat vw_format=PETSC_VIEWER_ASCII_MATLAB)
void add(const PetscInt i, const PetscInt j, const PetscScalar value)
Add value to a single entry.
PetscInt getNumberOfRows() const
Get the number of rows.
Definition PETScMatrix.h:74
PetscInt start_rank_
Starting index in a rank.
PetscInt getNumberOfLocalColumns() const
Get the number of local columns.
Definition PETScMatrix.h:80
bool finalizeMatrixAssembly(MAT_T &)
This a struct data containing the configuration information to create a PETSc type matrix.