21 #ifndef _aspect_simulator_solver_stokes_matrix_free_h 22 #define _aspect_simulator_solver_stokes_matrix_free_h 30 #include <deal.II/multigrid/mg_transfer_matrix_free.h> 31 #include <deal.II/multigrid/mg_transfer_global_coarsening.templates.h> 33 #include <deal.II/lac/solver_bicgstab.h> 113 template <
class StokesMatrixType,
class ABlockMatrixType,
class BTBlockOperatorType,
114 class SchurComplementMatrixType,
class ABlockPreconditionerType,
115 class SchurComplementPreconditionerType>
117 #if DEAL_II_VERSION_GTE(9,7,0) 118 EnableObserverPointer
144 const ABlockMatrixType &A_block,
145 const BTBlockOperatorType &BT_block,
146 const SchurComplementMatrixType &Schur_complement_block,
147 const ABlockPreconditionerType &A_block_preconditioner,
148 const SchurComplementPreconditionerType &Schur_complement_preconditioner,
149 const bool do_solve_A,
150 const bool do_solve_Schur_complement,
151 const bool A_block_is_symmetric,
152 const double A_block_tolerance,
153 const double Schur_complement_tolerance);
158 void vmult (::LinearAlgebra::distributed::BlockVector<double> &dst,
159 const ::LinearAlgebra::distributed::BlockVector<double> &src)
const;
161 unsigned int n_iterations_A_block()
const;
162 unsigned int n_iterations_Schur_complement()
const;
187 mutable ::LinearAlgebra::distributed::BlockVector<double>
utmp;
190 template <
class StokesMatrixType,
class ABlockMatrixType,
class BTBlockOperatorType,
class SchurComplementMatrixType,
191 class ABlockPreconditionerType,
class SchurComplementPreconditionerType>
193 ABlockPreconditionerType, SchurComplementPreconditionerType>::
194 BlockSchurGMGPreconditioner (
const StokesMatrixType &Stokes_matrix,
195 const ABlockMatrixType &A_block,
196 const BTBlockOperatorType &BT_block,
197 const SchurComplementMatrixType &Schur_complement_block,
198 const ABlockPreconditionerType &A_block_preconditioner,
199 const SchurComplementPreconditionerType &Schur_complement_preconditioner,
200 const bool do_solve_A,
201 const bool do_solve_Schur_complement,
202 const bool A_block_symmetric,
203 const double A_block_tolerance,
204 const double Schur_complement_tolerance)
206 stokes_matrix (Stokes_matrix),
209 Schur_complement_block (Schur_complement_block),
210 A_block_preconditioner (A_block_preconditioner),
211 Schur_complement_preconditioner (Schur_complement_preconditioner),
212 do_solve_A (do_solve_A),
213 do_solve_Schur_complement (do_solve_Schur_complement),
214 A_block_is_symmetric (A_block_symmetric),
216 n_iterations_Schur_complement_ (0),
217 A_block_tolerance (A_block_tolerance),
218 Schur_complement_tolerance (Schur_complement_tolerance)
221 template <
class StokesMatrixType,
class ABlockMatrixType,
class BTBlockOperatorType,
222 class SchurComplementMatrixType,
class ABlockPreconditionerType,
223 class SchurComplementPreconditionerType>
226 ABlockPreconditionerType, SchurComplementPreconditionerType>
:: 232 template <
class StokesMatrixType,
class ABlockMatrixType,
class BTBlockOperatorType,
class SchurComplementMatrixType,
233 class ABlockPreconditionerType,
class SchurComplementPreconditionerType>
236 ABlockPreconditionerType, SchurComplementPreconditionerType>
:: 242 template <
class StokesMatrixType,
class ABlockMatrixType,
class BTBlockOperatorType,
class SchurComplementMatrixType,
243 class ABlockPreconditionerType,
class SchurComplementPreconditionerType>
246 ABlockPreconditionerType, SchurComplementPreconditionerType>
:: 247 vmult (::LinearAlgebra::distributed::BlockVector<double> &dst,
248 const ::LinearAlgebra::distributed::BlockVector<double> &src)
const 267 SolverCG<::LinearAlgebra::distributed::Vector<double>> solver(solver_control);
274 if (src.block(1).l2_norm() > 1e-50)
279 dst.block(1), src.block(1),
286 catch (
const std::exception &exc)
289 "BlockSchurGMGPreconditioner::vmult",
290 std::vector<SolverControl> {solver_control},
292 src.block(0).get_mpi_communicator());
302 dst.block(1) *= -1.0;
306 utmp.block(0) *= -1.0;
307 utmp.block(0) += src.block(0);
316 PrimitiveVectorMemory<::LinearAlgebra::distributed::Vector<double>> mem;
322 SolverCG<::LinearAlgebra::distributed::Vector<double>> solver(solver_control,mem);
332 SolverBicgstab<::LinearAlgebra::distributed::Vector<double>>
333 solver(solver_control,
335 SolverBicgstab<::LinearAlgebra::distributed::Vector<double>>::AdditionalData(
false));
345 catch (
const std::exception &exc)
348 "BlockSchurGMGPreconditioner::vmult",
349 std::vector<SolverControl> {solver_control},
351 src.block(0).get_mpi_communicator());
virtual std::size_t get_dof_handler_memory_consumption() const =0
const SchurComplementMatrixType & Schur_complement_block
const Simulator< dim > * simulator
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 bool A_block_is_symmetric
const SchurComplementPreconditionerType & Schur_complement_preconditioner
virtual std::size_t get_mg_transfer_memory_consumption() const =0
void vmult(::LinearAlgebra::distributed::BlockVector< double > &dst, const ::LinearAlgebra::distributed::BlockVector< double > &src) const
virtual std::size_t get_cell_data_memory_consumption() const =0
std::unique_ptr< StokesMatrixFreeHandler< dim > > create_matrix_free_solver(Simulator< dim > &simulator, const Parameters< dim > ¶meters)
unsigned int n_iterations_A_block() const
mutable ::LinearAlgebra::distributed::BlockVector< double > utmp
unsigned int n_iterations_Schur_complement_
virtual void assemble()=0
const ABlockMatrixType & A_block
virtual void build_preconditioner()=0
const ABlockPreconditionerType & A_block_preconditioner
unsigned int n_iterations_Schur_complement() const
const double Schur_complement_tolerance
const StokesMatrixType & stokes_matrix
const bool do_solve_Schur_complement
unsigned int n_iterations_A_
const double A_block_tolerance
static void declare_parameters(ParameterHandler &prm)
virtual void setup_dofs()=0
virtual std::size_t get_constraint_memory_consumption() const =0
const BTBlockOperatorType & BT_block