Template Class SecondOrderBlockPreconditioner

Class Documentation

template<typename VectorType, typename MatrixType = ImmersXLA::MPI::SparseMatrix>
class SecondOrderBlockPreconditioner

Inexact block factorization for [a M, -b M; c K, a M + d D].

The free-variable Schur complement is a M + d D + (b c / a) K. Both spatial solves use CG with AMG. Their stopping criteria make this a variable preconditioner, so the outer solver must be flexible (FGMRES). Constrained rows and columns are projected symmetrically for the inner CG solves; the outer system retains its own constraint equations.

Matrices already condensed for hanging nodes may be supplied. Constrained diagonal entries are normalized internally and are never passed to CG as nonzero right-hand sides. Spatial operators and mass AMG are retained; changing the integration coefficients rebuilds only the Schur combination and its AMG hierarchy.

Public Types

using ReinitVector = std::function<void(VectorType&, bool)>
using AMGData = typename ImmersXLA::MPI::PreconditionAMG::AdditionalData

Public Functions

inline void initialize(const MatrixType &mass, const MatrixType &stiffness, const MatrixType &damping, const dealii::IndexSet &constrained, ReinitVector reinit_vector, const AMGData &amg_data = {})
inline void prepare_static_inverse()

Prepare the row-swapped factorization of [0, -M; K, D].

The free stiffness block must be invertible, as with Robin support. D need not be invertible. The M/K AMG cycles must be symmetric, as for the CG solves with positive derivative weights. Their fixed actions are reused as local adjoints; the complete pair transpose reverses their order. Positive weights retain their separate factorization.

inline void static_vmult(VectorType &destination_displacement, VectorType &destination_velocity, const VectorType &source_displacement, const VectorType &source_velocity, const bool fixed_linear_action = false) const

Apply the complete static pair inverse, with identity constrained rows.

A fixed AMG action is linear and can be used inside a Schur operator; residual-stopped CG is reserved for a flexible outer preconditioner.

inline void static_Tvmult(VectorType &destination_displacement, VectorType &destination_velocity, const VectorType &source_displacement, const VectorType &source_velocity, const bool fixed_linear_action = false) const

Transposed static inverse; the M, D and K actions reverse order.

inline void set_coefficients(const double a, const double b, const double c, const double d)

Configure one time-discrete Jacobian without spatial quadrature.

inline void mass_inverse(VectorType &destination, const VectorType &source) const

Approximate (a M)^{-1} on free entries, identity on constrained ones.

inline void schur_inverse(VectorType &destination, const VectorType &source) const

Approximate the physical Schur inverse on free entries.

inline void apply_mass_amg(VectorType &destination, const VectorType &source) const

Fixed linear AMG action for use inside a Schur matrix operator.

inline void apply_schur_amg(VectorType &destination, const VectorType &source) const

Fixed linear AMG approximation of the physical Schur inverse.

inline void vmult(VectorType &destination_displacement, VectorType &destination_velocity, const VectorType &source_displacement, const VectorType &source_velocity) const

Apply the complete lower-diagonal-upper block inverse.