44#ifndef NIMBLE_LINEAR_SOLVER_H
45#define NIMBLE_LINEAR_SOLVER_H
47#ifdef NIMBLE_HAVE_DARMA
70 for (
auto const& entry : i_index) {
71 if (entry > num_rows_) { num_rows_ = entry; }
74 data_.resize(num_rows_ * num_rows_, 0.0);
80 for (
unsigned int i = 0; i < data_.size(); i++) { data_[i] = value; }
86 for (
int i = 0; i < num_rows_; ++i) { data_[num_rows_ * row + i] = value; }
92 for (
int i = 0; i < num_rows_; ++i) { data_[num_rows_ * i + col] = value; }
104 return data_[num_rows_ * i + j];
110 return data_[num_rows_ * i + j];
115 std::vector<double> data_;
126 AllocateNonzeros(std::vector<int>
const& i_index, std::vector<int>
const& j_index);
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++) {
141 row_first_index_[i] = i;
148 for (
double& d_data : data_) d_data = value;
170 MatVec(
const double* vec,
double* result)
const;
178 return data_[FindIndex(i_index, j_index)];
184 return data_[FindIndex(i_index, j_index)];
187#ifdef NIMBLE_HAVE_DARMA
188 template <
typename ArchiveType>
190 serialize(ArchiveType& ar)
192 ar | num_rows_ | data_ | i_index_ | j_index_ | row_first_index_;
198 FindIndex(
int i_index,
int j_index)
const;
201 std::vector<double> data_;
202 std::vector<int> i_index_;
203 std::vector<int> j_index_;
204 std::vector<int> row_first_index_;
215InnerProduct(
unsigned int num_entries,
const double* vec_1,
const double* vec_2)
218 for (
unsigned int i = 0; i < num_entries; i++) { result += vec_1[i] * vec_2[i]; }
219#ifdef NIMBLE_HAVE_MPI
220 double restmp = result;
221 MPI_Allreduce(&restmp, &result, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
227InnerProduct(
const std::vector<double>& vec_1,
const std::vector<double>& vec_2)
229 return InnerProduct(vec_1.size(), &vec_1[0], &vec_2[0]);
254 M.AllocateDiagonalMatrix(
len_);
259 std::vector<double>
d;
260 std::vector<double>
r;
261 std::vector<double>
s;
262 std::vector<double>
q;
273 double cg_tol = 1.0e-16,
274 int max_iterations = 1000);
Definition nimble_linear_solver.h:119
void MatVec(const double *vec, double *result) const
Definition nimble_linear_solver.cc:118
friend void PopulateDiagonalPreconditioner(const CRSMatrixContainer &A, CRSMatrixContainer &M)
Generate a diagonal preconditioner from a sparse matrix.
Definition nimble_linear_solver.cc:138
unsigned int NumNonzeros() const
Definition nimble_linear_solver.h:164
CRSMatrixContainer()
Definition nimble_linear_solver.h:121
~CRSMatrixContainer()=default
void SetColumnValues(int col, double value)
Definition nimble_linear_solver.cc:86
void AllocateNonzeros(std::vector< int > const &i_index, std::vector< int > const &j_index)
Definition nimble_linear_solver.cc:57
void SetAllValues(double value)
Definition nimble_linear_solver.h:146
void AllocateDiagonalMatrix(int num_rows)
Definition nimble_linear_solver.h:129
void DiagonalMatrixMatVec(const double *vec, double *result) const
Definition nimble_linear_solver.cc:125
int NumRows() const
Definition nimble_linear_solver.h:158
void SetRowValues(int row, double value)
Definition nimble_linear_solver.cc:80
double & operator()(int i_index, int j_index)
Definition nimble_linear_solver.h:182
double operator()(int i_index, int j_index) const
Definition nimble_linear_solver.h:176
Definition nimble_linear_solver.h:60
unsigned int NumNonzeros() const
Definition nimble_linear_solver.h:96
void SetAllValues(double value)
Definition nimble_linear_solver.h:78
double & operator()(int i, int j)
Definition nimble_linear_solver.h:108
~MatrixContainer()
Definition nimble_linear_solver.h:64
void AllocateNonzeros(std::vector< int > const &i_index, std::vector< int > const &j_index)
Definition nimble_linear_solver.h:67
double operator()(int i, int j) const
Definition nimble_linear_solver.h:102
void SetRowValues(int row, double value)
Definition nimble_linear_solver.h:84
MatrixContainer()
Definition nimble_linear_solver.h:62
void SetColumnValues(int col, double value)
Definition nimble_linear_solver.h:90
Definition kokkos_contact_manager.h:49
void LU_Solve(int num_entries, MatrixContainer &mat, double *vec, int *index)
void LU_SolveSystem(int num_entries, MatrixContainer &mat, double *vec, int *scratch)
double InnerProduct(unsigned int num_entries, const double *vec_1, const double *vec_2)
Definition nimble_linear_solver.h:215
bool CG_SolveSystem(nimble::CRSMatrixContainer &A, const double *b, CGScratchSpace &cg_scratch, double *x, int &num_iterations, double cg_tol, int max_iterations)
Definition nimble_linear_solver.cc:155
void LU_Decompose(int num_entries, MatrixContainer &mat, int *index)
Definition nimble_linear_solver.h:242
std::vector< double > q
Definition nimble_linear_solver.h:262
std::vector< double > d
Definition nimble_linear_solver.h:259
CGScratchSpace()
Definition nimble_linear_solver.h:243
int len_
Definition nimble_linear_solver.h:258
std::vector< double > r
Definition nimble_linear_solver.h:260
void Resize(int len)
Definition nimble_linear_solver.h:246
CRSMatrixContainer M
Definition nimble_linear_solver.h:263
std::vector< double > s
Definition nimble_linear_solver.h:261