#include <nimble_linear_solver.h>
◆ CRSMatrixContainer()
nimble::CRSMatrixContainer::CRSMatrixContainer |
( |
| ) |
|
|
inline |
◆ ~CRSMatrixContainer()
nimble::CRSMatrixContainer::~CRSMatrixContainer |
( |
| ) |
|
|
default |
◆ AllocateDiagonalMatrix()
void nimble::CRSMatrixContainer::AllocateDiagonalMatrix |
( |
int | num_rows | ) |
|
|
inline |
130 {
131 if (num_rows_ == num_rows) { return; }
132 num_rows_ = num_rows;
133 data_.resize(num_rows_);
134 i_index_.resize(num_rows_);
135 j_index_.resize(num_rows_);
136 row_first_index_.resize(num_rows_);
137 for (int i = 0; i < num_rows_; i++) {
138 data_[i] = 0.0;
139 i_index_[i] = i;
140 j_index_[i] = i;
141 row_first_index_[i] = i;
142 }
143 }
◆ AllocateNonzeros()
void nimble::CRSMatrixContainer::AllocateNonzeros |
( |
std::vector< int > const & | i_index, |
|
|
std::vector< int > const & | j_index ) |
58{
59 i_index_ = i_index;
60 j_index_ = j_index;
61 data_.resize(i_index.size(), 0.0);
62 int max_row = 0;
63 for (auto const& i : i_index) {
64 if (i > max_row) { max_row = i; }
65 }
66 num_rows_ = max_row + 1;
67 row_first_index_.resize(num_rows_ + 1);
68 int current_row = -1;
69 for (int i = 0; i < i_index_.size(); i++) {
70 int row = i_index_[i];
71 if (row > current_row) {
72 row_first_index_[row] = i;
73 current_row = row;
74 }
75 }
76 row_first_index_[num_rows_] = i_index_.size();
77}
◆ DiagonalMatrixMatVec()
void nimble::CRSMatrixContainer::DiagonalMatrixMatVec |
( |
const double * | vec, |
|
|
double * | result ) const |
126{
127
128 if (num_rows_ != data_.size()) {
130 "**** Error in CRSMatrixContainer::DiagonalMatrixMatVec(), matrix is "
131 "not diagonal.\n");
132 }
133
134 for (unsigned int i = 0; i < num_rows_; i++) { result[i] = data_[i] * vec[i]; }
135}
#define NIMBLE_ABORT(...)
Definition nimble_macros.h:87
◆ MatVec()
void nimble::CRSMatrixContainer::MatVec |
( |
const double * | vec, |
|
|
double * | result ) const |
119{
120 for (unsigned int i_row = 0; i_row < num_rows_; i_row++) { result[i_row] = 0.0; }
121 for (unsigned int i = 0; i < data_.size(); i++) { result[i_index_[i]] += data_[i] * vec[j_index_[i]]; }
122}
◆ NumNonzeros()
unsigned int nimble::CRSMatrixContainer::NumNonzeros |
( |
| ) |
const |
|
inline |
165 {
166 return data_.size();
167 }
◆ NumRows()
int nimble::CRSMatrixContainer::NumRows |
( |
| ) |
const |
|
inline |
159 {
160 return num_rows_;
161 }
◆ operator()() [1/2]
double & nimble::CRSMatrixContainer::operator() |
( |
int | i_index, |
|
|
int | j_index ) |
|
inline |
183 {
184 return data_[FindIndex(i_index, j_index)];
185 }
◆ operator()() [2/2]
double nimble::CRSMatrixContainer::operator() |
( |
int | i_index, |
|
|
int | j_index ) const |
|
inline |
177 {
178 return data_[FindIndex(i_index, j_index)];
179 }
◆ SetAllValues()
void nimble::CRSMatrixContainer::SetAllValues |
( |
double | value | ) |
|
|
inline |
147 {
148 for (double& d_data : data_) d_data = value;
149 }
◆ SetColumnValues()
void nimble::CRSMatrixContainer::SetColumnValues |
( |
int | col, |
|
|
double | value ) |
87{
88 for (int i = 0; i < j_index_.size(); i++) {
89 if (j_index_[i] == col) { data_[i] = value; }
90 }
91}
◆ SetRowValues()
void nimble::CRSMatrixContainer::SetRowValues |
( |
int | row, |
|
|
double | value ) |
81{
82 for (int i = row_first_index_[row]; i < row_first_index_[row + 1]; i++) { data_[i] = value; }
83}
◆ PopulateDiagonalPreconditioner
Generate a diagonal preconditioner from a sparse matrix.
- Parameters
-
A | Input sparse matrix |
M | Diagonal preconditioner (mathematically M = (diag(A))^{-1}) |
139{
140
141 if (M.num_rows_ != M.data_.size()) {
142 throw std::invalid_argument(
143 "**** Error in PopulateDiagonalPreconditioner(), preconditioner must "
144 "be a diagonal matrix.\n");
145 }
146
147 int m_index(0);
148 for (int i = 0; i < A.data_.size(); i++) {
149 if (A.i_index_[i] == A.j_index_[i]) { M.data_[m_index++] = 1.0 / A.data_[i]; }
150 }
151}
The documentation for this class was generated from the following files: