The purpose of this tutorial is to show how to use oomph-lib's
FSI preconditioner for the efficient monolithic solution of fluid-structure interaction problems. We illustrate the use of the preconditioner for the collapsible channel problem described in the tutorial demonstrating the use of oomph-lib's
segregated FSI solver. The test problem used is discussed in detail in
where we contrast the relative performance of segregated and monolithic solvers.
The monolithic discretisation of fluid-structure interaction problems in which the fluid node-update in response to changes in the wall shape is performed by one of oomph-lib's
algebraic node update techniques (such as the ones implemented in the AlgebraicMesh
and MacroElementNodeUpdateMesh
classes; see the relevant tutorials for a discussion of the algebraic and macro-element-based node update techniques) leads to Jacobian matrices that contain three types of degree of freedom, namely the fluid velocities, the fluid pressures, and the solid mechanics degrees of freedom.
oomph-lib's
FSI preconditioner employs the library's block-preconditioning framework to (formally) re-order the linear system to be solved during the Newton iteration into 3x3 blocks. We note that all fluid velocity components and all solid degrees of freedom are treated as single blocks of unknowns. The linear system therefore has the following block structure
Here the on-diagonal block matrices
and
are the Jacobian matrices from the corresponding single-physics (fluid and solid) problems. The off-diagonal matrix blocks arise from the interaction between fluid and solid equations: and contain the so-called `‘shape derivatives’' — the derivatives of the Navier–Stokes residuals with respect to the solid displacements that affect the nodal positions in the fluid mesh. Similarly, and contain the derivatives of the solid residuals with respect to the fluid variables; this interaction arises through the fluid loading on the wall. oomph-lib's
algebraic node-update strategy ensures that the interaction matrices are very sparse. The maximum fill level for the examples presented in Heil, Hazel & Boyle's (2008) paper is about 3% and such (relatively) large values only arose in computations with very coarse meshes; the much finer meshes used in typical production runs resulted in much sparser matrices.
We showed in an earlier paper [ Heil, M. "An efficient solver for the fully-coupled solution of large-displacement fluid-structure interaction problems". Computer Methods in Applied Mechanics and Engineering 193, 1-23, (2004)] that the use of block-triangular approximations to the global Jacobian matrix, obtained by neglecting the fluid-solid or solid-fluid interaction blocks,
in the Newton method seriously degrades its performance, resulting in the loss of its quadratic convergence and thus one of its the most attractive features. However, the block-triangular approximations were shown to be excellent preconditioners for the solution of the linear system by Krylov subspace methods. Because of their block-triangular structure, each application of the preconditioners involves linear solves with each of the two single-physics systems (1) and (2), and matrix-vector products with the retained interaction matrices.
The current implementation of the FSI preconditioner within oomph-lib
employs Elman, Silvester & Wathen's `‘least squares commutator’' (LSC) preconditioner, discussed in another tutorial to approximately solve the linear system involving the fluid matrix (1).
To demonstrate how to use the preconditioner, here are the relevant extracts from the driver code fsi_chan_precond_driver.cc
which solves the collapsible channel problem discussed in another tutorial. As explained in the Linear Solvers Tutorial switching to an iterative linear solver is typically performed in the Problem
constructor and involves a few straightforward steps:
GMRES
, oomph-lib's
block-preconditioning framework to identify the types of the various degrees of freedom in the Jacobian matrix. Identifying the fluid elements is straightforward as they are already contained in a distinct (sub-)mesh, accessible via the member function bulk_mesh_pt()
: FSIHermiteBeamElement
elements used for the discretisation of the flexible channel wall are also contained in their own (sub-)mesh, accessible via the member function wall_mesh_pt()
. If displacement control is used, the DisplacementControlElement
introduces a further unknown into the problem: the adjustable external pressure; see the brief discussion of this in another tutorial. We classify the external pressure as a solid mechanics degree of freedom and therefore add the DisplacementControlElement
to a combined solid mesh (constructed from a vector of pointers to its constituent sub-meshes): FSIPreconditioner
allows preconditioning to be performed with either one of the three block-triangular approximations to the Jacobian: oomph-lib's
Least-Squares-Commutator Navier-Stokes preconditioner NavierStokesLSCPreconditioner
, discussed in another tutorial. The behaviour of this (sub-)preconditioner may be customised too. For instance, to employ the Hypre
AMG solver to solve the linear systems involving the pressure Schur complement matrix in the NavierStokesLSCPreconditioner
, we use the procedure discussed earlier: IterativeLinearSolver
base class. SuperLUSolver
. GMRES
, with the three FSI preconditioners or , discussed above, using various (sub-)solver combinations (SuperLUSolver
or (if available) Hypre
) for the solution of linear (sub-)systems. ExactFSIPreconditioner:
A preconditioner formed from the full Jacobian matrix by re-arranging the entries into the appropriate block structure. This is an exact preconditioner (and its application is therefore just as costly as a direct solve) and leads to GMRES convergence in a single iteration. SimpleFSIPreconditioner:
A preconditioner that uses the block-triangular matrices or , stored as full matrices (i.e. without performing any block elimination). A pdf version of this document is available.