13class MixedSolver :
public InverseOperator<X,X>
17 MixedSolver(
const M &A,
double tol,
int maxiter,
bool use_dilu)
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.");}
32 jacobian_ = bsr_alloc();
33 bsr_init(jacobian_,nrows,nnz,b);
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];
67 virtual void apply (X& x, X& b, InverseOperatorResult& res)
override
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];
78 bsr_downcast(jacobian_);
81 int count = bslv_pbicgstab3m(mem_, jacobian_, &b[0][0], &x[0][0]);
85 res.converged = (mem_->e[count] < mem_->tol);
86 res.reduction = mem_->e[count];
87 res.iterations = count;
90 virtual void apply (X& x, X& b,
double reduction, InverseOperatorResult& res)
override
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; };
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition parametersystem.hpp:187