20 #ifndef aspect_block_stokes_preconditioner_h 21 #define aspect_block_stokes_preconditioner_h 23 #include <deal.II/lac/solver_bicgstab.h> 36 template <
class PreconditionerA,
class VectorType,
class ABlockType>
56 void vmult(VectorType &dst,
57 const VectorType &src)
const;
72 template <
class PreconditionerA,
class VectorType,
class ABlockType>
81 preconditioner (preconditioner),
82 do_solve_A (do_solve_A),
83 A_block_is_symmetric (A_block_is_symmetric),
84 solver_tolerance (solver_tolerance)
93 template <
class PreconditionerA,
class VectorType,
class ABlockType>
95 const VectorType &src)
const 104 PrimitiveVectorMemory<VectorType> mem;
112 SolverCG<VectorType> solver(solver_control, mem);
121 SolverBicgstab<VectorType>
122 solver(solver_control,
124 typename SolverBicgstab<VectorType>::AdditionalData(
false));
129 catch (
const std::exception &exc)
135 "BlockSchurPreconditioner::vmult",
136 std::vector<SolverControl> {solver_control},
138 src.get_mpi_communicator());
150 template <
class PreconditionerA,
class VectorType,
class ABlockType>
160 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
171 const AInvOperator &A_inverse_operator,
172 const SInvOperator &S_inverse_operator,
173 const BTOperator &BT_operator);
178 void vmult (VectorType &dst,
179 const VectorType &src)
const;
192 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
195 const AInvOperator &A_inverse_operator,
196 const SInvOperator &S_inverse_operator,
197 const BTOperator &BT_operator)
199 A_inverse_operator (A_inverse_operator),
200 S_inverse_operator (S_inverse_operator),
201 BT_operator (BT_operator)
206 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
210 const VectorType &src)
const 212 typename VectorType::BlockType utmp(src.block(0));
217 dst.block(1) *= -1.0;
224 utmp += src.block(0);
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
const PreconditionerA & preconditioner
const ABlockType & matrix
const SInvOperator & S_inverse_operator
const double solver_tolerance
BlockSchurPreconditioner(const AInvOperator &A_inverse_operator, const SInvOperator &S_inverse_operator, const BTOperator &BT_operator)
Constructor.
const bool A_block_is_symmetric
unsigned int n_iterations_
unsigned int n_iterations() const
void vmult(VectorType &dst, const VectorType &src) const