mortar_schur_precond.hpp
Go to the documentation of this file.
1//==============================================================================
11//==============================================================================
12#ifndef SCHUR_PRECOND_HPP_
13#define SCHUR_PRECOND_HPP_
14
15#include <dune/istl/preconditioners.hh>
16#include <dune/istl/matrixmatrix.hh>
20
21namespace Opm {
22namespace Elasticity {
23
36 template<class PrecondElasticityBlock>
37class MortarSchurPre : public Dune::Preconditioner<Vector,Vector> {
38 public:
44 MortarSchurPre(const Matrix& P_, const Matrix& B_,
45 PrecondElasticityBlock& Apre_, bool symmetric_=false) :
46 Apre(Apre_), B(B_), N(B.N()), M(B.M()),
47 Lpre(P_, false, false), symmetric(symmetric_)
48 {
49 }
50
53 {
54 }
55
57 void pre(Vector& x, Vector& b) override
58 {
59 // extract displacement DOFs
60 Vector tempx, tempb;
63 Apre.pre(tempx, tempb);
64 MortarUtils::injectBlock(x, tempx, N);
65 MortarUtils::injectBlock(b, tempb, N);
66 }
67
71 void apply(Vector& v, const Vector& d) override
72 {
73 // multiplier block (second row)
74 Vector temp;
75 MortarUtils::extractBlock(temp, d, M, N);
76 Dune::InverseOperatorResult r;
77 Vector temp2;
78 temp2.resize(temp.size());
79 Lpre.apply(temp2, temp, r);
80 MortarUtils::injectBlock(v, temp2, M, N);
81
82 // elasticity block (first row)
84 if (!symmetric)
85 B.mmv(temp2, temp);
86
87 temp2.resize(N);
88 temp2 = 0;
89 Apre.apply(temp2, temp);
90 MortarUtils::injectBlock(v, temp2, N);
91 }
92
94 void post(Vector& x) override
95 {
96 Apre.post(x);
97 }
98
99 Dune::SolverCategory::Category category() const override
100 {
101 return Dune::SolverCategory::sequential;
102 }
103
104 protected:
106 PrecondElasticityBlock& Apre;
107
109 const Matrix& B;
110
112 int N;
113
115 int M;
116
118 LUSolver Lpre;
119
122};
123
124}
125}
126
127#endif
Definition: mortar_schur_precond.hpp:37
void post(Vector &x) override
Dummy post-process function.
Definition: mortar_schur_precond.hpp:94
virtual ~MortarSchurPre()
Destructor.
Definition: mortar_schur_precond.hpp:52
PrecondElasticityBlock & Apre
The preconditioner for the elasticity operator.
Definition: mortar_schur_precond.hpp:106
int M
Number of multiplier DOFs.
Definition: mortar_schur_precond.hpp:115
Dune::SolverCategory::Category category() const override
Definition: mortar_schur_precond.hpp:99
void pre(Vector &x, Vector &b) override
Preprocess preconditioner.
Definition: mortar_schur_precond.hpp:57
const Matrix & B
The mortar coupling matrix.
Definition: mortar_schur_precond.hpp:109
bool symmetric
Whether or not to use a symmetric preconditioner.
Definition: mortar_schur_precond.hpp:121
LUSolver Lpre
Linear solver for the multiplier block.
Definition: mortar_schur_precond.hpp:118
MortarSchurPre(const Matrix &P_, const Matrix &B_, PrecondElasticityBlock &Apre_, bool symmetric_=false)
Constructor.
Definition: mortar_schur_precond.hpp:44
int N
Number of displacement DOFs.
Definition: mortar_schur_precond.hpp:112
void apply(Vector &v, const Vector &d) override
Applies the preconditioner.
Definition: mortar_schur_precond.hpp:71
static void extractBlock(Vector &x, const Vector &y, int len, int start=0)
Extract a range of indices from a vector.
Definition: mortar_utils.hpp:25
static void injectBlock(Vector &x, const Vector &y, int len, int start=0)
Inject a range of indices into a vector.
Definition: mortar_utils.hpp:36
Preconditioners for elasticity upscaling.
Helper class with some matrix operations.
Mortar helper class.
Dune::BCRSMatrix< Dune::FieldMatrix< double, 1, 1 > > Matrix
A sparse matrix holding our operator.
Definition: matrixops.hpp:27
Dune::BlockVector< Dune::FieldVector< double, 1 > > Vector
A vector holding our RHS.
Definition: matrixops.hpp:33
Preconditioner
Definition: elasticity_upscale.hpp:57
Definition: ImplicitAssembly.hpp:43