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,
as experiments showed this to give the fastest overall solve times; see Further comments and exercises. 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:
which retains the interaction matrices
that represent the effect of the fluid onto the solid:
which retains the interaction matrices
that represent the effect of the solid onto the fluid:
which suppresses all the interaction matrices: 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:
chosen here was found (by trial and error) to give optimal overall solve times, but this choice is problem-dependent and unless you are willing to perform systematic preliminary investigations, we recommend using the default convergence tolerance of
, as defined in the 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.