NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble::CRSMatrixContainer Class Reference

#include <nimble_linear_solver.h>

Public Member Functions

 CRSMatrixContainer ()
 
 ~CRSMatrixContainer ()=default
 
void AllocateNonzeros (std::vector< int > const &i_index, std::vector< int > const &j_index)
 
void AllocateDiagonalMatrix (int num_rows)
 
void SetAllValues (double value)
 
void SetRowValues (int row, double value)
 
void SetColumnValues (int col, double value)
 
int NumRows () const
 
unsigned int NumNonzeros () const
 
void MatVec (const double *vec, double *result) const
 
void DiagonalMatrixMatVec (const double *vec, double *result) const
 
double operator() (int i_index, int j_index) const
 
double & operator() (int i_index, int j_index)
 

Friends

void PopulateDiagonalPreconditioner (const CRSMatrixContainer &A, CRSMatrixContainer &M)
 Generate a diagonal preconditioner from a sparse matrix.
 

Constructor & Destructor Documentation

◆ CRSMatrixContainer()

nimble::CRSMatrixContainer::CRSMatrixContainer ( )
inline
121: num_rows_(0) {}

◆ ~CRSMatrixContainer()

nimble::CRSMatrixContainer::~CRSMatrixContainer ( )
default

Member Function Documentation

◆ 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 // the matrix must be diagonal
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}

Friends And Related Symbol Documentation

◆ PopulateDiagonalPreconditioner

void PopulateDiagonalPreconditioner ( const CRSMatrixContainer & A,
CRSMatrixContainer & M )
friend

Generate a diagonal preconditioner from a sparse matrix.

Parameters
AInput sparse matrix
MDiagonal preconditioner (mathematically M = (diag(A))^{-1})
139{
140 // the preconditioner must be a diagonal matrix
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: