10#include <kernel/global/filter.hpp>
11#include <kernel/global/matrix.hpp>
12#include <kernel/global/vector.hpp>
13#include <kernel/lafem/saddle_point_matrix.hpp>
14#include <kernel/lafem/tuple_filter.hpp>
15#include <kernel/lafem/tuple_mirror.hpp>
16#include <kernel/lafem/tuple_vector.hpp>
17#include <kernel/solver/base.hpp>
60 template <
typename MatrixA_,
typename MatrixB_,
typename MatrixD_,
typename FilterV_,
typename FilterP_>
62 public SolverBase<typename MatrixD_::VectorTypeL>
82 const MatrixA_& _matrix_a;
83 const MatrixB_& _matrix_b;
84 const MatrixD_& _matrix_d;
87 const FilterP_& _filter_p;
119 const MatrixA_& matrix_a,
120 const MatrixB_& matrix_b,
121 const MatrixD_& matrix_d,
122 const FilterV_& filter_v,
123 const FilterP_& filter_p,
124 std::shared_ptr<SolverLeft> solver_left,
125 std::shared_ptr<SolverRight> solver_right,
134 _lumped_velo_mass_vec(lumped_velo_mass_vec)
136 XASSERTM(solver_left !=
nullptr,
"left-solver must be given");
137 XASSERTM(solver_right !=
nullptr,
"right-solver must be given");
163 _vec_tmp_v2 = _matrix_b.create_vector_l();
213 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
217 VectorTypeV& tmp_v2 = this->_vec_tmp_v2;
227 _matrix_b.apply(tmp_v1, vec_cor_right);
228 this->_filter_v.filter_def(tmp_v1);
231 tmp_v1.component_product(tmp_v1, _lumped_velo_mass_vec);
232 this->_filter_v.filter_def(tmp_v1);
235 _matrix_a.apply(tmp_v2, tmp_v1);
236 this->_filter_v.filter_def(tmp_v2);
239 tmp_v2.component_product(tmp_v2, _lumped_velo_mass_vec);
240 this->_filter_v.filter_def(tmp_v2);
243 _matrix_d.apply(vec_def_left, tmp_v2);
244 this->_filter_p.filter_def(vec_def_left);
251 vec_cor.scale(vec_cor, -1);
262 typename MatrixA_,
typename MatrixB_,
typename MatrixD_,
263 typename FilterV_,
typename FilterP_,
typename MirrorV_,
267 Global::Matrix<MatrixA_, MirrorV_, MirrorV_>,
276 typename MatrixB_::VectorTypeL,
277 typename MatrixD_::VectorTypeL>,
291 typedef typename GlobalVectorType::DataType
DataType;
302 typedef typename MatrixB_::VectorTypeL LocalVectorTypeV;
303 typedef typename MatrixD_::VectorTypeL LocalVectorTypeP;
329 std::shared_ptr<SolverA> solver_left,
330 std::shared_ptr<SolverS> solver_right,
340 _lumped_velo_mass_vec(lumped_velo_mass_vec)
385 virtual Status apply(GlobalVectorTypeP& vec_cor,
const GlobalVectorTypeP& vec_def)
override
387 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->
name()));
406 this->_filter_v.filter_def(_vec_tmp_v2);
410 this->_filter_v.filter_def(_vec_tmp_v2);
413 _matrix_d.
apply(vec_def_left, _vec_tmp_v2);
414 this->_filter_p.filter_def(vec_def_left);
420 vec_cor.scale(vec_cor, -1.0);
421 Statistics::add_solver_expression(
448 template <
typename MatrixA_,
typename MatrixB_,
typename MatrixD_,
typename FilterV_,
typename FilterP_>
449 inline std::shared_ptr<BFBT<MatrixA_, MatrixB_, MatrixD_, FilterV_, FilterP_>>
new_bfbt(
450 const MatrixA_& matrix_a,
const MatrixB_& matrix_b,
451 const MatrixD_& matrix_d,
const FilterV_& filter_v,
452 const FilterP_& filter_p,
455 const typename MatrixB_::VectorTypeL& lumped_velo_mass_vec)
457 return std::make_shared<BFBT<MatrixA_, MatrixB_, MatrixD_, FilterV_, FilterP_>>
458 (matrix_a, matrix_b, matrix_d, filter_v, filter_p, solver_left, solver_right, lumped_velo_mass_vec);
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Global Filter wrapper class template.
Global Matrix wrapper class template.
VectorTypeL create_vector_l() const
Creates and returns a new L-compatible global vector object.
void apply(VectorTypeL &r, const VectorTypeR &x) const
Performs a matrix-vector multiplication: r <- A*x.
Global vector wrapper class template.
void component_product(const Vector &x, const Vector &y)
Computes the component-wise product of two vector.
void clear()
Clears the underlying vector.
Saddle-Point matrix meta class template.
TupleVector meta-mirror class template.
Variadic TupleVector class template.
FEAT::Solver::BFBT< Global::Matrix< MatrixA_, MirrorV_, MirrorV_ >, Global::Matrix< MatrixB_, MirrorV_, MirrorP_ >, Global::Matrix< MatrixD_, MirrorP_, MirrorV_ >, Global::Filter< FilterV_, MirrorV_ >, Global::Filter< FilterP_, MirrorP_ > >::done_numeric virtual void done_numeric() override
Numeric finalization method.
FEAT::Solver::BFBT< Global::Matrix< MatrixA_, MirrorV_, MirrorV_ >, Global::Matrix< MatrixB_, MirrorV_, MirrorP_ >, Global::Matrix< MatrixD_, MirrorP_, MirrorV_ >, Global::Filter< FilterV_, MirrorV_ >, Global::Filter< FilterP_, MirrorP_ > >::init_symbolic virtual void init_symbolic() override
Symbolic initialization method.
FEAT::Solver::BFBT< Global::Matrix< MatrixA_, MirrorV_, MirrorV_ >, Global::Matrix< MatrixB_, MirrorV_, MirrorP_ >, Global::Matrix< MatrixD_, MirrorP_, MirrorV_ >, Global::Filter< FilterV_, MirrorV_ >, Global::Filter< FilterP_, MirrorP_ > >::done_symbolic virtual void done_symbolic() override
Symbolic finalization method.
FEAT::Solver::BFBT< Global::Matrix< MatrixA_, MirrorV_, MirrorV_ >, Global::Matrix< MatrixB_, MirrorV_, MirrorP_ >, Global::Matrix< MatrixD_, MirrorP_, MirrorV_ >, Global::Filter< FilterV_, MirrorV_ >, Global::Filter< FilterP_, MirrorP_ > >::init_numeric virtual void init_numeric() override
Numeric initialization method.
FEAT::Solver::BFBT< Global::Matrix< MatrixA_, MirrorV_, MirrorV_ >, Global::Matrix< MatrixB_, MirrorV_, MirrorP_ >, Global::Matrix< MatrixD_, MirrorP_, MirrorV_ >, Global::Filter< FilterV_, MirrorV_ >, Global::Filter< FilterP_, MirrorP_ > >::name virtual String name() const override
Returns a descriptive string.
BFBT Schur-complement preconditioner.
LAFEM::TupleVector< VectorTypeV, VectorTypeP > VectorType
system vector type
std::shared_ptr< SolverRight > _solver_right
our right solver
SolverBase< VectorTypeP > SolverRight
right solver type
virtual void done_symbolic() override
Symbolic finalization method.
virtual Status apply(VectorTypeP &vec_cor, const VectorTypeP &vec_def) override
Solver application method.
MatrixA_::DataType DataType
our data type
virtual void init_symbolic() override
Symbolic initialization method.
virtual void init_numeric() override
Numeric initialization method.
const FilterV_ & _filter_v
our system filter
SolverBase< VectorTypeP > SolverLeft
left solver type
std::shared_ptr< SolverLeft > _solver_left
our left solver
virtual void done_numeric() override
Numeric finalization method.
BFBT(const MatrixA_ &matrix_a, const MatrixB_ &matrix_b, const MatrixD_ &matrix_d, const FilterV_ &filter_v, const FilterP_ &filter_p, std::shared_ptr< SolverLeft > solver_left, std::shared_ptr< SolverRight > solver_right, const VectorTypeV &lumped_velo_mass_vec)
Constructs a scaled BFBT preconditioner.
virtual String name() const override
Returns a descriptive string.
SolverBase< VectorTypeP > BaseClass
base-class typedef
VectorTypeV _vec_tmp_v1
a temporary defect vector
MatrixB_::VectorTypeL VectorTypeV
velocity vector type
MatrixD_::VectorTypeL VectorTypeP
pressure vector type
Polymorphic solver interface.
virtual void init_symbolic()
Symbolic initialization method.
virtual void init_numeric()
Numeric initialization method.
virtual void done_symbolic()
Symbolic finalization method.
virtual void done_numeric()
Numeric finalization method.
String class implementation.
bool status_success(Status status)
Status success check function.
Status
Solver status return codes enumeration.
@ success
solving successful (convergence criterion fulfilled)
@ aborted
premature abort (solver aborted due to internal errors or preconditioner failure)
std::shared_ptr< BFBT< MatrixA_, MatrixB_, MatrixD_, FilterV_, FilterP_ > > new_bfbt(const MatrixA_ &matrix_a, const MatrixB_ &matrix_b, const MatrixD_ &matrix_d, const FilterV_ &filter_v, const FilterP_ &filter_p, std::shared_ptr< SolverBase< typename MatrixD_::VectorTypeL > > solver_left, std::shared_ptr< SolverBase< typename MatrixD_::VectorTypeL > > solver_right, const typename MatrixB_::VectorTypeL &lumped_velo_mass_vec)
Creates a new BFBT solver object.