PreconditionerWrapper.hpp
Go to the documentation of this file.
1#ifndef OPM_MIXED_PREC_HEADER_INCLUDED
2#define OPM_MIXED_PREC_HEADER_INCLUDED
3
5
6namespace Opm {
7
14template <class M, class X, class Y>
16{
17 public:
18
19 using domain_type = X;
20 static constexpr auto block_size = domain_type::block_type::dimension;
21
26 MixedPreconditioner(const M& A, bool use_dilu = false)
27 {
28 // Access double precision matrix data
29 int nrows = A.N();
30 int nnz = A.nonzeroes();
31 double_data_ = &A[0][0][0][0];
32 prec_ = prec_alloc();
33
34 // allocate and initialize mixed-precision matrix
35 mixed_matrix_ = bsr_alloc();
36 bsr_init(mixed_matrix_, nrows, nnz, block_size);
37
38 // copy sparsity pattern from double preccision matrix
39 int *rows = mixed_matrix_->rowptr;
40 int *cols = mixed_matrix_->colidx;
41
42 int irow = 0;
43 int icol = 0;
44 rows[0] = 0;
45 for(auto row=A.begin(); row!=A.end(); row++)
46 {
47 for(auto col = row->begin(); col != row->end(); ++col)
48 {
49 cols[icol++] = col.index();
50 }
51 rows[irow+1] = icol;
52 irow++;
53 }
54
55 // allocate and initialize preconditioner
56 prec_init(prec_,mixed_matrix_);
57
58 // attribute initialization
59 nnz_ = nnz;
60 use_dilu_ = use_dilu;
61
62 // perform matrix factorization
63 update();
64 };
65
68 {
69 bsr_free(mixed_matrix_);
70 prec_free(prec_);
71 }
72
73 virtual void update() override;
74 virtual bool hasPerfectUpdate() const override {return true;}
75 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& y) override {};
76 virtual void post ([[maybe_unused]] X& x) override {};
77 virtual void apply ([[maybe_unused]] X& x, [[maybe_unused]] const Y& y) override;
78 virtual Dune::SolverCategory::Category category() const override { return Dune::SolverCategory::sequential; };
79
80 private:
81 bool use_dilu_;
82 double const *double_data_;
83 bsr_matrix *mixed_matrix_;
84 prec_t *prec_;
85 int nnz_;
86};
87
88template <class M, class X, class Y>
90update ()
91{
92 // transpose each dense block to make them column-major
93 int b = block_size;
94 int bb=b*b;
95 double B[bb];
96 for(int k=0;k<nnz_;k++)
97 {
98 for(int i=0;i<b;i++) for(int j=0;j<b;j++) B[b*j+i] = double_data_[bb*k + b*i + j];
99 for(int i=0;i<bb;i++) mixed_matrix_->dbl[bb*k + i] = B[i];
100 }
101
102 use_dilu_ ? prec_dilu_factorize(prec_, mixed_matrix_) : prec_ilu0_factorize(prec_, mixed_matrix_); // choose dilu or ilu0
103 prec_downcast(prec_);
104}
105
106template <class M, class X, class Y>
108apply ([[maybe_unused]] X& x, [[maybe_unused]] const Y& y)
109{
110 x=y;
111 prec_mapply3c(prec_,&x[0][0]);
112}
113
114}
115#endif // OPM_MIXED_PREC_HEADER_INCLUDED
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.
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:34
Wraps c-implementation of mixed-precision preconditioner.
Definition: PreconditionerWrapper.hpp:16
virtual void post(X &x) override
Definition: PreconditionerWrapper.hpp:76
virtual Dune::SolverCategory::Category category() const override
Definition: PreconditionerWrapper.hpp:78
MixedPreconditioner(const M &A, bool use_dilu=false)
constructor
Definition: PreconditionerWrapper.hpp:26
virtual void apply(X &x, const Y &y) override
Definition: PreconditionerWrapper.hpp:108
virtual bool hasPerfectUpdate() const override
Definition: PreconditionerWrapper.hpp:74
X domain_type
Definition: PreconditionerWrapper.hpp:19
virtual void update() override
Definition: PreconditionerWrapper.hpp:90
~MixedPreconditioner()
destructor
Definition: PreconditionerWrapper.hpp:67
static constexpr auto block_size
Definition: PreconditionerWrapper.hpp:20
virtual void pre(X &x, Y &y) override
Definition: PreconditionerWrapper.hpp:75
Definition: blackoilbioeffectsmodules.hh:45
void prec_ilu0_factorize(prec_t *P, bsr_matrix *A)
ILU0 factorization.
void prec_mapply3c(prec_t *P, double *x)
Preconditioner application in mixed-precision.
void prec_free(prec_t *P)
Delete preconditioner object.
void prec_dilu_factorize(prec_t *P, bsr_matrix *A)
DILU factorization.
void prec_downcast(prec_t *P)
Make single-precision copy of double-precision values.
prec_t * prec_alloc()
Create empty preconditioner object.
void prec_init(prec_t *P, bsr_matrix const *A)
Initialize preconditioner object.
Mixed-precision bsr matrix.
Definition: bsr.h:12
int * colidx
Definition: bsr.h:25
int * rowptr
Definition: bsr.h:23
Preconditioner struct.
Definition: prec.h:14