22 #ifndef aspect_block_stokes_preconditioner_h 23 #define aspect_block_stokes_preconditioner_h 25 #include <deal.II/lac/solver_bicgstab.h> 26 #include <deal.II/lac/solver_cg.h> 29 #include <deal.II/lac/la_parallel_vector.h> 30 #include <deal.II/lac/la_parallel_block_vector.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>
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 111 PrimitiveVectorMemory<VectorType> mem;
119 SolverCG<VectorType> solver(solver_control, mem);
128 SolverBicgstab<VectorType>
129 solver(solver_control,
131 typename SolverBicgstab<VectorType>::AdditionalData(
false));
136 catch (
const std::exception &exc)
142 "BlockSchurPreconditioner::vmult",
143 std::vector<SolverControl> {solver_control},
145 src.get_mpi_communicator());
157 template <
class PreconditionerA,
class VectorType,
class ABlockType>
167 template <
class AInvOperator,
class SInvOperator,
class BTOperator,
class VectorType>
169 #if DEAL_II_VERSION_GTE(9,7,0) 170 EnableObserverPointer
184 const AInvOperator &A_inverse_operator,
185 const SInvOperator &S_inverse_operator,
186 const BTOperator &BT_operator);
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>
224 const VectorType &src)
const 235 dst.block(1) *= -1.0;
244 if constexpr (std::is_same_v<VectorType, ::LinearAlgebra::distributed::BlockVector<double>>)
250 tmp.block(0) *= -1.0;
251 tmp.block(0) += src.block(0);
259 template<
class OperatorType,
class StokesMatrixType,
class SchurComplementMatrixType,
class VectorType>
272 const StokesMatrixType &stokes_matrix,
273 const SchurComplementMatrixType &Schur_complement_block,
274 const bool do_solve_Schur_complement,
275 const double Schur_complement_tolerance);
276 void vmult( VectorType &dst,
const VectorType &src)
const;
277 unsigned int n_iterations()
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 317 SolverCG<VectorType> solver(solver_control);
321 if (src.l2_norm() > 1e-50)
336 catch (
const std::exception &exc)
339 "BlockSchurPreconditioner::vmult",
340 std::vector<SolverControl> {solver_control},
342 src.get_mpi_communicator());
353 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
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
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.
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_