16 #ifndef _aspect_block_stokes_preconditioner_h 17 #define _aspect_block_stokes_preconditioner_h 37 template <
class PreconditionerA,
class VectorType,
class ABlockType>
57 void vmult(VectorType &dst,
58 const VectorType &src)
const;
73 template <
class PreconditionerA,
class VectorType,
class ABlockType>
82 preconditioner (preconditioner),
83 do_solve_A (do_solve_A),
84 A_block_is_symmetric (A_block_is_symmetric),
85 solver_tolerance (solver_tolerance)
94 template <
class PreconditionerA,
class VectorType,
class ABlockType>
96 const VectorType &src)
const 123 solver(solver_control,
130 catch (
const std::exception &exc)
136 "BlockSchurPreconditioner::vmult",
137 std::vector<SolverControl> {solver_control},
139 src.get_mpi_communicator());
151 template <
class PreconditionerA,
class VectorType,
class ABlockType>
161 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
163 #if DEAL_II_VERSION_GTE(9,7,0) 178 const AInvOperator &A_inverse_operator,
179 const SInvOperator &S_inverse_operator,
180 const BTOperator &BT_operator);
185 void vmult (VectorType &dst,
186 const VectorType &src)
const;
200 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
203 const AInvOperator &A_inverse_operator,
204 const SInvOperator &S_inverse_operator,
205 const BTOperator &BT_operator)
207 A_inverse_operator (A_inverse_operator),
208 S_inverse_operator (S_inverse_operator),
209 BT_operator (BT_operator)
214 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
218 const VectorType &src)
const 229 dst.block(1) *= -1.0;
244 tmp.block(0) *= -1.0;
245 tmp.block(0) += src.block(0);
253 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
266 const StokesMatrixType &stokes_matrix,
267 const SchurComplementMatrixType &Schur_complement_block,
268 const bool do_solve_Schur_complement,
269 const double Schur_complement_tolerance);
270 void vmult( VectorType &dst,
const VectorType &src)
const;
271 unsigned int n_iterations()
const;
286 template <
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
288 const StokesMatrixType &stokes_matrix,
289 const SchurComplementMatrixType &Schur_complement_block,
290 const bool do_solve_Schur_complement,
291 const double Schur_complement_tolerance)
293 schur_preconditioner(schur_preconditioner),
294 stokes_matrix(stokes_matrix),
295 Schur_complement_block(Schur_complement_block),
296 do_solve_Schur_complement(do_solve_Schur_complement),
297 Schur_complement_tolerance(Schur_complement_tolerance),
298 n_iterations_Schur_complement_(0)
302 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
304 const VectorType &src)
const 315 if (src.l2_norm() > 1
e-50)
330 catch (
const std::exception &exc)
333 "BlockSchurPreconditioner::vmult",
334 std::vector<SolverControl> {solver_control},
336 src.get_mpi_communicator());
347 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
InverseVelocityBlock(const ABlockType &matrix, const PreconditionerA &preconditioner, const bool do_solve_A, const bool A_block_is_symmetric, const double solver_tolerance)
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="")
const AInvOperator & A_inverse_operator
const BTOperator & BT_operator
void vmult(VectorType &dst, const VectorType &src) const
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
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 PreconditionerA & preconditioner
const StokesMatrixType & stokes_matrix
const double Schur_complement_tolerance
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
const ABlockType & matrix
const SInvOperator & S_inverse_operator
unsigned int n_iterations() const
const double solver_tolerance
BlockSchurPreconditioner(const AInvOperator &A_inverse_operator, const SInvOperator &S_inverse_operator, const BTOperator &BT_operator)
Constructor.
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
const bool A_block_is_symmetric
const bool do_solve_Schur_complement
const OperatorType & schur_preconditioner
unsigned int n_iterations_
unsigned int n_iterations() const
const SchurComplementMatrixType & Schur_complement_block
void vmult(VectorType &dst, const VectorType &src) const
void vmult(VectorType &dst, const VectorType &src) const
unsigned int n_iterations_Schur_complement_