22 #ifndef _aspect_block_stokes_preconditioner_h
23 #define _aspect_block_stokes_preconditioner_h
43 template <
class PreconditionerA,
class VectorType,
class ABlockType>
63 void vmult(VectorType &dst,
64 const VectorType &src)
const;
79 template <
class PreconditionerA,
class VectorType,
class ABlockType>
81 const ABlockType &matrix,
82 const PreconditionerA &preconditioner,
83 const bool do_solve_A,
84 const bool A_block_is_symmetric,
85 const double solver_tolerance)
88 preconditioner (preconditioner),
89 do_solve_A (do_solve_A),
90 A_block_is_symmetric (A_block_is_symmetric),
91 solver_tolerance (solver_tolerance)
100 template <
class PreconditionerA,
class VectorType,
class ABlockType>
102 const VectorType &src)
const
108 if (do_solve_A ==
true)
110 SolverControl solver_control(10000, src.l2_norm() * solver_tolerance);
117 if (A_block_is_symmetric)
120 solver.
solve(matrix, dst, src, preconditioner);
129 solver(solver_control,
132 solver.
solve(matrix, dst, src, preconditioner);
134 n_iterations_ += solver_control.
last_step();
136 catch (
const std::exception &exc)
142 "BlockSchurPreconditioner::vmult",
143 std::vector<SolverControl> {solver_control},
145 src.get_mpi_communicator());
150 preconditioner.vmult (dst, src);
157 template <
class PreconditionerA,
class VectorType,
class ABlockType>
160 return n_iterations_;
167 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
169 #if DEAL_II_VERSION_GTE(9,7,0)
191 void vmult (VectorType &dst,
192 const VectorType &src)
const;
206 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
209 const AInvOperator &A_inverse_operator,
210 const SInvOperator &S_inverse_operator,
211 const BTOperator &BT_operator)
213 A_inverse_operator (A_inverse_operator),
214 S_inverse_operator (S_inverse_operator),
215 BT_operator (BT_operator)
220 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
223 vmult (VectorType &dst,
224 const VectorType &src)
const
234 S_inverse_operator.vmult(dst.block(1),src.block(1));
235 dst.block(1) *= -1.0;
245 BT_operator.vmult(tmp, dst);
248 BT_operator.vmult(tmp.block(0), dst.block(1));
250 tmp.block(0) *= -1.0;
251 tmp.block(0) += src.block(0);
254 A_inverse_operator.vmult(dst.block(0), tmp.block(0));
259 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
276 void vmult( VectorType &dst,
const VectorType &src)
const;
292 template <
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
294 const StokesMatrixType &stokes_matrix,
295 const SchurComplementMatrixType &Schur_complement_block,
296 const bool do_solve_Schur_complement,
297 const double Schur_complement_tolerance)
299 schur_preconditioner(schur_preconditioner),
300 stokes_matrix(stokes_matrix),
301 Schur_complement_block(Schur_complement_block),
302 do_solve_Schur_complement(do_solve_Schur_complement),
303 Schur_complement_tolerance(Schur_complement_tolerance),
304 n_iterations_Schur_complement_(0)
308 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
310 const VectorType &src)
const
312 if (do_solve_Schur_complement)
315 SolverControl solver_control(100, src.l2_norm() * Schur_complement_tolerance,
true);
321 if (src.l2_norm() > 1
e-50)
328 solver.
solve(Schur_complement_block,
330 schur_preconditioner);
331 n_iterations_Schur_complement_ += solver_control.
last_step();
336 catch (
const std::exception &exc)
339 "BlockSchurPreconditioner::vmult",
340 std::vector<SolverControl> {solver_control},
342 src.get_mpi_communicator());
349 schur_preconditioner.vmult(dst,src);
350 n_iterations_Schur_complement_ += 1;
353 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
356 return n_iterations_Schur_complement_;
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
unsigned int last_step() const
const AInvOperator & A_inverse_operator
BlockSchurPreconditioner(const AInvOperator &A_inverse_operator, const SInvOperator &S_inverse_operator, const BTOperator &BT_operator)
Constructor.
const SInvOperator & S_inverse_operator
void vmult(VectorType &dst, const VectorType &src) const
const BTOperator & BT_operator
const ABlockType & matrix
const PreconditionerA & preconditioner
const double solver_tolerance
unsigned int n_iterations() const
unsigned int n_iterations_
void vmult(VectorType &dst, const VectorType &src) const
const bool A_block_is_symmetric
InverseVelocityBlock(const ABlockType &matrix, const PreconditionerA &preconditioner, const bool do_solve_A, const bool A_block_is_symmetric, const double solver_tolerance)
const double Schur_complement_tolerance
unsigned int n_iterations_Schur_complement_
const OperatorType & schur_preconditioner
SchurApproximation(const OperatorType &schur_preconditioner, const StokesMatrixType &stokes_matrix, const SchurComplementMatrixType &Schur_complement_block, const bool do_solve_Schur_complement, const double Schur_complement_tolerance)
Constructor.
const bool do_solve_Schur_complement
const StokesMatrixType & stokes_matrix
unsigned int n_iterations() const
void vmult(VectorType &dst, const VectorType &src) const
const SchurComplementMatrixType & Schur_complement_block
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
void throw_linear_solver_failure_exception(const std::string &solver_name, const std::string &function_name, const std::vector< SolverControl > &solver_controls, const std::exception &exc, const MPI_Comm mpi_communicator, const std::string &output_filename="")