1#ifndef OPM_MIXED_SOLVER_HEADER_INCLUDED
2#define OPM_MIXED_SOLVER_HEADER_INCLUDED
12template <
class X,
class M>
17 MixedSolver(
const M &A,
double tol,
int maxiter,
bool use_dilu)
20 if (!Opm::Parameters::Get<Opm::Parameters::MatrixAddWellContributions>()) {
21 OPM_THROW(std::logic_error,
"Well operators are currently not supported for mixed precision. "
22 "Use --matrix-add-well-contributions=true to add well contributions to the matrix instead.");}
25 int nnz = A.nonzeroes();
29 if (b!=3) {OPM_THROW(std::logic_error,
"Block sizes other than 3x3 are not supported by mixed precision.");}
36 int *rows = jacobian_->
rowptr;
37 int *cols = jacobian_->
colidx;
42 for(
auto row=A.begin(); row!=A.end(); row++)
44 for(
unsigned int i=0; i<row->getsize(); i++)
46 cols[icol++] = row->getindexptr()[i];
48 rows[irow+1] = rows[irow]+row->getsize();
54 bslv_init(mem_, tol, maxiter, jacobian_, use_dilu);
57 data_ = &A[0][0][0][0];
71 for(
int k=0;k<jacobian_->
nnz;k++)
73 for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++) B[3*j+i] = data_[9*k + 3*i + j];
74 for(
int i=0;i<9;i++) jacobian_->
dbl[9*k + i] = B[i];
85 res.converged = (mem_->
e[count] < mem_->
tol);
86 res.reduction = mem_->
e[count];
87 res.iterations = count;
94 res.reduction = reduction;
95 OPM_THROW(std::invalid_argument,
"MixedSolver::apply(...) not implemented yet.");
99 virtual Dune::SolverCategory::Category
category()
const override {
return Dune::SolverCategory::sequential; };
void bslv_init(bslv_memory *mem, double tol, int max_iter, bsr_matrix const *A, bool use_dilu)
Initialize solver memory object.
int bslv_pbicgstab3m(bslv_memory *mem, bsr_matrix *A, const double *b, double *x)
Preconditioned bicgstab in mixed-precision.
void bslv_free(bslv_memory *mem)
Delete solver memroy object.
bslv_memory * bslv_alloc()
Create empty solver memory object.
void bsr_downcast(bsr_matrix *M)
Make single-precision copy of double-precision values.
bsr_matrix * bsr_alloc()
Create empty bsr matrix.
void bsr_free(bsr_matrix *A)
Delete bsr matrix.
void bsr_init(bsr_matrix *A, int nrows, int nnz, int b)
Initialize bsr matrix.
Definition: wrapper.hpp:14
virtual Dune::SolverCategory::Category category() const override
Definition: wrapper.hpp:99
MixedSolver(const M &A, double tol, int maxiter, bool use_dilu)
Definition: wrapper.hpp:17
~MixedSolver()
Definition: wrapper.hpp:60
virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res) override
Definition: wrapper.hpp:90
virtual void apply(X &x, X &b, InverseOperatorResult &res) override
Definition: wrapper.hpp:67
Definition: fvbaseprimaryvariables.hh:161
Dune::InverseOperatorResult InverseOperatorResult
Definition: GpuBridge.hpp:32
Linear solver memory.
Definition: bslv.h:18
double tol
Definition: bslv.h:23
double * e
Definition: bslv.h:27
Mixed-precision bsr matrix.
Definition: bsr.h:12
int * colidx
Definition: bsr.h:25
double * dbl
Definition: bsr.h:27
int * rowptr
Definition: bsr.h:23
int nnz
Definition: bsr.h:18