1 Introduction

Traditionally, software to compute numerical approximations to solutions of partial differential equation (PDE) systems has been developed separately for different PDE systems. Developing a new PDE solver is often a daunting task, as many applications demand that software be optimized carefully for parallel high-performance computing (HPC) systems. However, over the past several decades, researchers from applied math have demonstrated that effective numerical methods for a wide range of PDE systems can be represented as variational problems posed over finite-dimensional spaces of solution functions, called finite element (FE) methods [1]. This shared structure suggests that a common set of software abstractions can be used to implement different numerical schemes for different PDEs, spanning a broad range of application domains. In particular, the translation of variational forms into computational kernels for FE assembly is a systematic enough process that optimized code for these kernels can be generated automatically from the mathematical definition of a variational form. A leading example of code generation for numerical PDEs is the FEniCS Project [2]. In its canonical workflow, users write the variational forms of their PDEs in the Python-based Unified Form Language (UFL) [3], and these UFL problem statements are then automatically compiled into efficient C++ kernels [4] that plug into a general high-performance FE solver called DOLFIN [5].

FEniCS has proven highly popular with scientists, mathematicians, and engineers across a wide range of disciplines. Providing a comprehensive picture of its applications to date would require a dedicated review article, but a cursory glance at citation data reveals FEniCS-based work ranging from basic research in numerical methods [6, 7] and exotic physical phenomena [8, 9] to industrial-scale engineering analysis [10,11,12,13]. The concise and readable nature of UFL problem statements also encourages using code as a form of scientific communication. While voices within the computational math and science communities have increasingly called for reproducibility of numerical results [14, 15], code generation enables the stronger condition of transparency, where code shared by researchers is essentially as easy to understand (and thus also to modify and extend) as the notation from published articles. This attribute of code generation has also made it popular in pedagogical works [16, 17].

Despite the promise code generation shows for streamlining the process of conducting and disseminating research, challenges remain. In particular, systems like FEniCS assume that the target problem consists of a single PDE system defined on a given domain, over which a good quality FE mesh can be generated. In engineering problems, it is often the case that multiple coupled subproblems are posed on different subdomains, whose upstream geometrical descriptions are separately parameterized and often even mathematically ill-defined, such as computer-aided design (CAD) models specifying volumes through non-watertight descriptions of boundary surfaces. Geometric complexity can also occur downstream of engineering analysis, as an emergent feature of a PDE system’s solution. Examples of this include large deformations of soft materials and topological changes due to fracture and/or contact mechanics. Numerical schemes to couple non-matching parameterizations of geometry or contend with topological changes—e.g., immersed boundary [18, 19] or meshfree [20] methods—cannot be reduced to the self-contained element-level kernels assumed by FEniCS’s code generation architecture. An active area of research is then: How can code generation capabilities be gainfully applied in conjunction with such methods?

To motivate the present contribution, we introduce a problem which exhibits both upstream and downstream geometric complexity: fluid–structure interaction (FSI) analysis of prosthetic heart valves. In summary, the most popular class of prosthetic valves mimic the structure of native valves, in which thin flexible leaflets are passively opened and closed by periodic blood flow. The large deformation and especially topology change (during valve closure) of the fluid subproblem’s domain are obvious examples of downstream geometric complexity. However, applications like optimizing prosthetic valve leaflets and patient-specific modeling also benefit from seamless integration of analysis with upstream CAD geometry and medical imaging data. Kamensky, Hsu, and various other collaborators have recently published a series of articles on heart valve FSI analysis [21,22,23,24,25].Footnote 1 In particular, these authors directly use a CAD model of the valve as an analysis mesh, which is an example of isogeometric analysis (IGA) [29, 30], and couple it to an unfitted mesh of the artery lumen, which is an instance of an immersed method.Footnote 2 They refer to the synergy between IGA and immersed methods as immersogeometric analysis (IMGA).

The cited works implemented these methods in custom research codes, without regard for transparency. The recent paper [32] implemented a subset of this immersogeometric FSI functionality as the open-source library CouDALFISh [33], which used FEniCS for classical FE analysis of the fluid and the FEniCS-based IGA library tIGAr [34] for IGA of the valve leaflets. However, the functionality of CouDALFISh documented in [32] was quite limited. In particular, there was no option to use boundary-fitted arbitrary Lagrangian–Eulerian (ALE) [35] FSI where feasible, such as for modeling the mild deformations of an elastic artery’s lumen. Reference [22] demonstrated that artery deformation is crucial to accurate analysis, but the heart valve example of [32] simply treated the artery as rigid. The present contribution builds upon [32], introducing the following novelties:

  • Formulating ALE FSI on a static reference domain, leveraging abstractions from FEniCS UFL to maintain a clear interpretation (whereas previous work in [32] was limited to an Eulerian description of the fluid, and did not include a solid subproblem).

  • Interfacing this formulation with the immersogeometric fluid–thin structure interaction method of [21], which entails some changes to the algorithm from [32].

  • Demonstrating the potential for rapid prototyping of soft tissue constitutive models, expressed in symbolic form using FEniCS UFL, which was technically possible with only the technology from [32], but not implemented or tested until the present work.

In the remainder of this paper, we first introduce the mathematical problem under consideration (Sect. 2), then recall the particular immersed technique that we use for the fluid–thin structure interaction analysis (Sect. 3). Section 4 then discusses the implementation of the above-itemized contributions, and how it leverages code generation technology. Numerical results for several problems are then presented, including various benchmarks (Sect. 5) and a simulation of a prosthetic heart valve in a flexible artery (Sect. 6). Finally, Sect.  draws conclusions and discusses potential future developments.

2 Combined fluid–solid and fluid–shell interaction

This paper considers the problem of a thin shell structure (modeled geometrically as a surface of co-dimension one) immersed in a “background” 3D fluid–solid continuum. The two subproblems are constrained to have the same velocity on the topologically 2D midsurface of the shell structure, with the 3D continuum’s traction jump across the surface equal to a normal force acting on the shell. Mathematically, we can write this problem as: Find shell structure midsurface velocity \(\mathbf {v}_\text {sh}\in \mathcal {S}_\text {sh}\), background fluid–solid velocity \(\mathbf {v}_\text {fs}\in \mathcal {S}_\text {fs}\), fluid pressure \(p\in \mathcal {S}_p\), and interface Lagrange multiplier \(\varvec{\lambda }\in \mathcal {S}_\lambda \) such that for all test functions \((\mathbf {w}_\text {sh},\mathbf {w}_\text {fs},q,\delta \varvec{\lambda })\in \mathcal {V}_\text {sh}\times \mathcal {V}_\text {fs}\times \mathcal {V}_p\times \mathcal {V}_\lambda \),

$$\begin{aligned}&R_\text {sh}(\mathbf {v}_\text {sh},\mathbf {w}_\text {sh}) + R_\text {fs}(\{\mathbf {v}_\text {fs},p\},\{\mathbf {w}_\text {fs},q\}) \nonumber \\&\quad + C_\lambda (\mathbf {v}_\text {sh},\mathbf {v}_\text {fs},\delta \varvec{\lambda }) + C_\lambda (\mathbf {w}_\text {sh},\mathbf {w}_\text {fs},\varvec{\lambda }) = 0\text { ,} \end{aligned}$$
(1)

where \(\mathcal {S}_{(\cdot )}\) are spaces of trial functions satisfying Dirichlet boundary conditions (if any) and \(\mathcal {V}_{(\cdot )}\) are corresponding test function spaces. The variational forms \(R_\text {sh}\) and \(R_\text {fs}\) define the shell structure and fluid–solid continuum subproblems, while \(C_\lambda \) defines the FSI kinematic constraint. We now elaborate on these definitions in the following sections.

2.1 Fluid–solid continuum

Following the kinematic framework established by [36], we refer momentum balance for the fluid–solid continuum to a static reference domain \(\Omega _y\). This domain is mapped to the physical domain \(\Omega _x\) by a motion \(\hat{\varvec{\phi }}\), which can be defined by a displacement field, \(\hat{\mathbf {u}}\), such that the spatial point \(\mathbf {x}\) corresponding to a reference point \(\mathbf {y}\) is given by

$$\begin{aligned} \mathbf {x} = \hat{\varvec{\phi }}(\mathbf {y}) = \mathbf {y} + \hat{\mathbf {u}}(\mathbf {y})\text { .} \end{aligned}$$
(2)

The mapping \(\hat{\varvec{\phi }}\) and displacement \(\hat{\mathbf {u}}\) depend, in general, on time, but this dependence has been suppressed above for notational simplicity. When differentiating with respect to time, we must be precise about what spatial coordinate is held fixed. In this paper, we shall use

$$\begin{aligned} \left. \frac{\partial f}{\partial t}\right| _{\mathbf {y}}\quad \text {and}\quad \left. \frac{\partial f}{\partial t}\right| _{\mathbf {x}}, \end{aligned}$$
(3)

to denote partial time derivatives of some field f at a fixed points in the reference domain and spatial domains, respectively. In particular, the velocity of the mapping from the reference to physical domain is

$$\begin{aligned} \hat{\mathbf {v}} = \left. \frac{\partial \hat{\mathbf {u}}}{\partial t}\right| _{\mathbf {y}}\text { .} \end{aligned}$$
(4)

We must similarly disambiguate spatial derivatives. Spatial derivatives in \(\Omega _x\) are denoted using \(\nabla _x\) and spatial derivatives in \(\Omega _y\) are denoted using \(\nabla _y\). We divide the reference domain \(\Omega _y\) into two subsets \(\Omega _y^\text {so}\) and \(\Omega ^\text {f}_y\) such that

$$\begin{aligned} \overline{\Omega _y} = \overline{\Omega ^\text {so}_y}\cup \overline{\Omega ^\text {f}_y}\text { .} \end{aligned}$$
(5)

The images \(\Omega _x^\text {so}\) and \(\Omega ^\text {f}_x\) of these subsets under the mapping \(\hat{\varvec{\phi }}\) are occupied by solid and fluid material respectively in physical space. In the solid subdomain, we identify each reference point \(\mathbf {y}\in \Omega _y^\text {so}\) with a material point \(\mathbf {X}\), for consistency with prevailing conventions from the literature on nonlinear solid mechanics. Following the convention established by (3), the partial time derivative at a fixed material point is denoted \(\partial /\partial t\vert _\mathbf {X}\) (corresponding to the notation “D/Dt” in many references), and spatial derivatives in \(\Omega ^\text {so}_y\) are denoted with \(\nabla _X\). The fluid–solid continuum residual \(R_\text {fs}\) can be split into two forms integrated over these subdomains:

$$\begin{aligned} R_\text {fs}(\{\mathbf {v},p\},\{\mathbf {w},q\}) = R_\text {f}(\{\mathbf {v},p\},\{\mathbf {w},q\}) + R_\text {so}(\mathbf {v},\mathbf {w})\text { .} \end{aligned}$$
(6)

We now define these forms for an incompressible Newtonian fluid (Sect. 2.1.1) and a hyperelastic solid (Sect. 2.1.2).

2.1.1 Incompressible Newtonian fluid

The weak formulation of the incompressible Navier–Stokes equations on a deforming domain is frequently given as

$$\begin{aligned} R_\text {f}(\{\mathbf {v},p\},\{\mathbf {w},q\}) =\,&\int _{\Omega _x^\text {f}}\rho _\text {f}\left( \left. \frac{\partial \mathbf {v}}{\partial t}\right| _{\mathbf {y}}\right. \nonumber \\&\left. + (\mathbf {v}-\hat{\mathbf {v}})\cdot \nabla _x\mathbf {v}\right) \cdot \mathbf {w} - \mathbf {f}\cdot \mathbf {w}\,d\Omega _x\nonumber \\&+\int _{\Omega _x^\text {f}} \varvec{\sigma }:\nabla _x\mathbf {w} + q\nabla _x\cdot \mathbf {v}\,d\Omega _x \nonumber \\&+ \int _{\partial \Omega _x\cap \partial \Omega _x^\text {f}}\left( \mathbf {h} -\gamma \rho _\text {f}\left\{ (\mathbf {v}-\hat{\mathbf {v}})\cdot \mathbf {n}_x\right\} _-\mathbf {v} \right) \nonumber \\&\quad \cdot \mathbf {w}\,d\partial \Omega _x\text { ,} \end{aligned}$$
(7)

where \(\rho _\text {f}\) is the fluid mass density,

$$\begin{aligned} \varvec{\sigma } = 2\mu _\text {f}{\text {sym}}\nabla _x\mathbf {v} - p\mathbf {I} \end{aligned}$$
(8)

is the Cauchy stress for dynamic viscosity \(\mu _\text {f}\), \(\mathbf {I}\) is the identity tensor, \(\nabla _x\) differentiates with respect to spatial position, \(\mathbf {f}\) is a body force per unit volume, \(\mathbf {h}\) is an applied momentum flux on \(\partial \Omega _x\cap \partial \Omega _x^\text {f}\), \(\mathbf {n}_x\) is the outward-facing unit normal to \(\partial \Omega _x\), \(\{\cdot \}_-\) takes the negative part of its argument, i.e.,

$$\begin{aligned} \{f\}_- = \frac{1}{2}(f - \vert f\vert )\text { ,} \end{aligned}$$
(9)

and \(0 \le \gamma \le 1\) is a dimensionless scalar parameter.

Remark 1

The term involving \(\{\cdot \}_-\) stabilizes the problem when flow enters the domain through a Neumann boundary part. When no flow is entering the boundary, \(\mathbf {h}\) has the interpretation of a traction vector, whereas, when flow is entering the boundary, it becomes a combination of traction and advective flux. The parameter \(\gamma \) controls the strength of this stabilizing effect. See [37] for details. Note that this term is included in the continuous problem, to ensure that it is well-posed.

The formulation (7) contains the awkward combination of a temporal partial derivative taken on the static reference domain and spatial partial derivatives taken on the deforming spatial domain. Our discretization will be based on referring the entire formulation back to the reference domain, which may be accomplished by the following substitutions:

$$\begin{aligned} \int _{\Omega _x^\text {f}}(\cdots )\,d\Omega _x\,&\rightarrow \,\int _{\Omega _y^\text {f}}(\cdots )\,\hat{J}d\Omega _y\text { ,} \end{aligned}$$
(10)
$$\begin{aligned} \int _{\partial \Omega _x\cap \partial \Omega _x^\text {f}}(\cdots )\,d\partial \Omega _x\,&\rightarrow \,\int _{\partial \Omega _y\cap \partial \Omega _y^\text {f}}(\cdots )\,\left| \hat{J}\hat{\mathbf {F}}^{-T}\cdot \mathbf {n}_y\right| d\partial \Omega _y\text { ,} \end{aligned}$$
(11)
$$\begin{aligned} \nabla _x(\cdots )\,&\rightarrow \,\nabla _y(\cdots )\cdot \hat{\mathbf {F}}^{-1}\text { ,} \end{aligned}$$
(12)
$$\begin{aligned} \mathbf {n}_x \,&\rightarrow \, \frac{\hat{J}\hat{\mathbf {F}}^{-T}\cdot \mathbf {n}_y}{\left| \hat{J}\hat{\mathbf {F}}^{-T}\cdot \mathbf {n}_y\right| }\text { ,} \end{aligned}$$
(13)

where

$$\begin{aligned} \hat{\mathbf {F}} = \frac{\partial \hat{\varvec{\phi }}}{\partial \mathbf {y}}, \end{aligned}$$
(14)

is the deformation gradient of the motion \(\hat{\varvec{\phi }}\),

$$\begin{aligned} \hat{J} = {\text {det}}\hat{\mathbf {F}}, \end{aligned}$$
(15)

is its determinant, and \(\mathbf {n}_y\) is the outward-facing unit normal to \(\Omega _y\).

When discretizing the fluid in space, i.e., posing the fluid subproblem on finite-dimensional subspaces of \(\mathcal {S}_\text {fs}\) and \(\mathcal {V}_\text {fs}\), we augment \(R_\text {f}\) with additional terms, following the variational multiscale (VMS) theory utilized by Bazilevs and collaborators in [36, 38,39,40,41,42,43,44,45]. This maintains the stability of the formulation even when the exact solution contains features too small to resolve with a given spatial discretization. A common source of such solution features is flow turbulence, and VMS can correspondingly be understood as an implicit large-eddy simulation filter, as discussed in [38], with favorable comparisons to direct numerical simulation.

2.1.2 Hyperelastic solid

Within the solid subdomain, we assume that the background continuum velocity field can be expressed as the time derivative of a displacement field, viz.,

$$\begin{aligned} \left. \mathbf {v}_\text {fs}^{\,}\,\right| _{\Omega _y^\text {so}} = \left. \frac{\partial \mathbf {u}_\text {so}}{\partial t}\right| _{\mathbf {X}}\text { ,} \end{aligned}$$
(16)

where \(\mathbf {u}_\text {so}\) is the solid material’s displacement field. We further assume that

$$\begin{aligned} \hat{\mathbf {u}} = \mathbf {u}_\text {so}, \end{aligned}$$
(17)

in \(\Omega _y^\text {so}\), i.e., that the reference domain deforms with the material. An obvious implication is that \(\hat{\mathbf {v}} = \mathbf {v}_\text {fs}\) within the solid subdomain. Accordingly, we also drop the \(\hat{(\,\cdot \,)}\) from the deformation gradient (14) and its determinant (15), which now correspond to the material motion:

$$\begin{aligned} \mathbf {F} = \mathbf {I} + \nabla _X\mathbf {u}_\text {so}\quad \text {and}\quad J = {\text {det}}\mathbf {F}\text { .} \end{aligned}$$
(18)

With these assumptions, the solid residual form \(R_\text {so}\) can be written as

$$\begin{aligned} R_\text {so}(\mathbf {v},\mathbf {w}) =\,&\int _{\Omega _y^\text {so}}\rho _{0}^\text {so}\left. \frac{\partial \mathbf {v}}{\partial t}\right| _{\mathbf {X}}\cdot \mathbf {w}\nonumber \\&- \mathbf {f}_0\cdot \mathbf {w} + (\mathbf {F}\mathbf {S}):\nabla _X\mathbf {w} + C_{\text {d}}\rho _{0}^\text {so}\mathbf {v}\cdot \mathbf {w}\,d\Omega _y \nonumber \\&- \int _{\partial \Omega _y^\text {so}\cap \partial \Omega _y}\mathbf {h}_0\cdot \mathbf {w}\,d\partial \Omega _y\text { ,} \end{aligned}$$
(19)

where \(\mathbf {h}_0\) is an applied traction per unit reference boundary area, \(\mathbf {f}_0\) is a body force per unit reference volume, \(\rho _{0}^\text {so}\) is mass density per unit reference volume, \(\mathbf {S}\) is the 2\(^\text {nd}\) Piola–Kirchhoff stress, and \(C_\text {d}\) is a mass damping coefficient. The defining feature of a hyperelastic solid is that \(\mathbf {S}\) can be obtained by differentiating a scalar energy density:

$$\begin{aligned} \mathbf {S} = \frac{\partial \psi }{\partial \mathbf {E}}\text { ,} \end{aligned}$$
(20)

where \(\psi \) is an elastic energy density per unit reference volume and

$$\begin{aligned} \mathbf {E} = \frac{1}{2}\left( \mathbf {F}^T\mathbf {F} - \mathbf {I}\right) , \end{aligned}$$
(21)

is the Green–Lagrange strain tensor. These definitions imply that

$$\begin{aligned} (\mathbf {F}\mathbf {S}):\nabla _X\mathbf {w} = \mathbf {S}:D_\mathbf {w}\mathbf {E} = D_\mathbf {w}\psi \text { ,} \end{aligned}$$
(22)

where \(D_\mathbf {w}\) is a Gateaux derivative with respect to displacement in the direction \(\mathbf {w}\).

In this work, we consider only moderately compressible solids.Footnote 3 In that case, an appropriate discretization is the Bubnov–Galerkin method, i.e., simply restricting the form \(R_\text {so}\) to finite-dimensional subsets of \(\mathcal {S}_{\text {fs}}\) and \(\mathcal {V}_\text {fs}\).

2.2 Kirchhoff–Love shell structure

The thin immersed structure is a simplification of the hyperelastic solid, where the reference domain is instead a thin region of thickness \(h_{\text {th}}\), extending symmetrically in the normal direction from a 2D midsurface manifold \(\Gamma _0\). As in the case of the solid, we assume that the shell structure velocity is derived from a displacement field,

$$\begin{aligned} \mathbf {v}_\text {sh} = \frac{\partial \mathbf {u}_\text {sh}}{\partial t}\text { ,} \end{aligned}$$
(23)

where the partial time derivative is taken at a fixed point in \(\Gamma _0\). If the through-thickness direction is parameterized by an arc-length coordinate \(\xi ^3\in (-h_\text {th}/2,h_\text {th}/2)\), then the residual form can be written as

$$\begin{aligned} R_\text {sh}(\mathbf {v},\mathbf {w}) = h_\text {th}\int _{\Gamma _0}\rho _{0}^\text {sh}\frac{\partial \mathbf {v}}{\partial t}\,d\Gamma _0 + \int _{-h_{\text {th}}/2}^{h_{\text {th}}/2}\int _{\Gamma _0}\mathbf {S}:D_\mathbf {w}\mathbf {E}\,d\Gamma _0 d\xi ^3 \text { ,} \end{aligned}$$
(24)

where \(\rho _{0}^\text {sh}\) is the shell structure’s mass density per unit reference volume, and \(\mathbf {S}\) and \(\mathbf {E}\) are again the \(2^{\text {nd}}\) Piola–Kirchhoff stress and Green–Lagrange strain. However, in the Kirchhoff–Love thin shell theory, kinematic assumptions are invoked to simplify the definition of \(\mathbf {E}\) so that it depends entirely on derivatives of the midsurface displacement, and \(\mathbf {S}\) is assumed to satisfy a plane stress condition in the tangent plane to \(\Gamma _0\). For the case of hyperelastic material models, the complete shell structure formulation used in this work can be found in [46].

A notable feature of the Kirchhoff–Love shell model is that the approximate expression for \(\mathbf {E}\) involves second derivatives of the midsurface displacement, as does \(\mathbf {S}\) (through its dependence on \(\mathbf {E}\)). This means that the displacement function spaces \(\mathcal {S}_\text {sh}\) and \(\mathcal {V}_\text {sh}\) must be at least contained in the Sobolev space \(H^2(\Gamma _0)\) for \(R_\text {sh}\) to be well defined. In practical terms, this means that, if one wishes to use a conforming Bubnov–Galerkin discretization with piecewise polynomial displacements, the discrete displacements must be at least \(C^1\) between elements. As mentioned in [29, 47], we accomplish this in the present work using IGA with smooth B-spline function spaces for the midsurface displacement.

2.3 FSI kinematic constraint

The fluid–thin-structure constraint form \(C_\lambda \) in (1) is defined generally as

$$\begin{aligned} C_\lambda (\mathbf {a}_1,\mathbf {a}_2,\mathbf {b}) = \int _{\Gamma _0}(\mathbf {a}_1-\mathbf {a}_2)\cdot \mathbf {b}\,d\Gamma _0\text { .} \end{aligned}$$
(25)

This corresponds to enforcement of the constraint \(\mathbf {v}_\text {fs} = \mathbf {v}_\text {sh}\) on the shell midsurface, enforced by the Lagrange multiplier \(\varvec{\lambda }\), in (1).

Note that the integral over the reference shell midsurface \(\Gamma _0\) differs from many formulations in the literature, implying that \(\varvec{\lambda }\) is a traction per unit reference midsurface area. This does not affect the velocity solutions to the continuous problem, but it simplifies the implementation of some numerical schemes. In particular, if the integral is discretized using a collection of quadrature points on \(\Gamma _0\), their corresponding weights will not depend on spatial derivatives of the shell midsurface displacement \(\mathbf {u}_\text {sh}\).

2.4 Shell structure self-contact

In principle, the FSI kinematic constraint should prevent initially separated parts of an immersed shell structure from interpenetrating (since they are constrained to follow the motion of a continuous velocity field).Footnote 4 However, when FSI kinematics are enforced approximately in the discrete setting, it is usually necessary to augment the shell structure formulation with some treatment of contact mechanics. In this work, we use a nonlocal regularization of contact, fitting into the general framework of volumetric potentials introduced by [49]. In summary, the residual (24) of the shell structure subproblem is augmented with a term of the form

$$\begin{aligned} +D_\mathbf {w}E_\text {c}\text { ,} \end{aligned}$$
(26)

whereFootnote 5

$$\begin{aligned} E_{\text {c}} = \frac{1}{2}\int _{\Gamma _0\setminus B_{R_{\text {self}}}\left( \mathbf {X}_1\right) }\int _{\Gamma _0}\phi \left( r_{1\rightarrow 2}\right) \,d\mathbf {X}_1d\mathbf {X}_2, \end{aligned}$$
(27)

is a potential energy associated with contact forces, in which \(B_{R_\text {self}}(\mathbf {X}_1)\) is a ball of radius \(R_\text {self} > 0\) about \(\mathbf {X}_1\) (to exclude “contact” between points that are within \(R_\text {self}\) of each other in the reference configuration),

$$\begin{aligned} r_{1\rightarrow 2} = \left\| (\mathbf {X}_2 +\mathbf {u}_\text {sh}(\mathbf {X}_2)) - (\mathbf {X}_1 +\mathbf {u}_\text {sh}(\mathbf {X}_1))\right\| _{\ell ^2}, \end{aligned}$$
(28)

is the distance between the deformed images of material points \(\mathbf {X}_1,\mathbf {X}_2\in \Gamma _0\), and the potential density \(\phi \) governs the repulsion between material points. In this work, \(\phi \) is selected such that its derivative (i.e., the magnitude of repulsive force density) is

$$\begin{aligned} \phi '(r) = -k_\text {c}\left\{ \begin{array}{lcr}0&{},&{}r\ge r_\text {max}\text { ,}\\ (r_\text {max}-r)^2/(2s_\text {c}r_\text {max}) &{} , &{} (1-s_\text {c})r_\text {max}< r < r_\text {max}\text { ,}\\ r_\text {max}(1-s_\text {c}/2)-r &{},&{} r \le (1-s_\text {c})r_\text {max}\text { ,} \end{array}\right. \end{aligned}$$
(29)

where \(k_\text {c}\) modulates the stiffness of contact forces, \(0<r_\text {max}<R_\text {self}\) is the maximum range of nonlocal contact, and \(0\le s_\text {c}\le 1\) is the fraction of \(r_\text {max}\) over which activation of forces is smoothed. While it does not preclude penetration of the shell surface through itself at finite \(k_\text {c}\), it provides more reliable nonlinear convergence with a fixed time step than the singular potential given in [49], which required a specialized time integrator and line search algorithm.

When the integrals of (27) are discretized using a finite set of quadrature points, the method becomes computationally similar to the “pinball” method of [50], as discussed in [49, Section 3.2]. In this work, we use as quadrature points the nodes of the finite element function space to which tIGAr extracts the isogeometric midsurface displacement space. An extension of the model given by (27) to frictional contact can be found in [51], while [52] reviews nonlocal regularizations of contact mechanics more generally.

2.5 Deformation of the fluid mesh

While we have now fully specified the physical problem being solved, we have yet to specify how the reference-to-physical displacement \(\hat{\mathbf {u}}\) is defined in the fluid subdomain. In this work, we define it to satisfy an artificial elasticity-like problem with 2\(^\text {nd}\) Piola–Kirchhoff stress

$$\begin{aligned} \hat{\mathbf {S}} = \hat{K}\left( {\text {tr}}\hat{\mathbf {E}}\right) \mathbf {I} + 2\hat{\mu }\left( \hat{\mathbf {E}} - \frac{{\text {tr}}\hat{\mathbf {E}}}{3}\mathbf {I}\right) \text { ,} \end{aligned}$$
(30)

where \(\hat{\mathbf {E}}\) is the Green–Lagrange strain associated with the motion \(\hat{\varvec{\phi }}\) and \(\hat{\mu }\) and \(\hat{K}\) are artificial shear and bulk moduli. These artificial material parameters are scaled inversely by a power of \(\hat{J}\), i.e.,

$$\begin{aligned} \hat{\mu } = \hat{K} = \hat{K}_0 \hat{J}^{-p}\text { ,} \end{aligned}$$
(31)

where \(\hat{K}_0 > 0\) is a reference stiffness value for the fictitious problem and larger values of \(p \ge 0\) penalize deformations that locally flatten volume elements. This scaling of artificial material parameters is related to earlier work on Jacobian-based mesh stiffening [36, 53,54,55,56,57], and has the goal of preserving physical-domain mesh element quality in the fluid subproblem. The reference-to-physical displacement field is subject to the boundary condition

$$\begin{aligned} \hat{\mathbf {u}} = \mathbf {u}_\text {so}\quad \text {on}\quad \overline{\Omega _y^\text {so}}\cap \overline{\Omega _y^\text {f}}\text { .} \end{aligned}$$
(32)

It may also be subject to other Dirichlet boundary conditions on \(\partial \Omega _y\cap \partial \Omega _y^\text {f}\), which depend on the particular problem being solved.

3 FSI with the dynamic augmented Lagrangian method and explicit geometry

Our discretizations of the shell, solid, and fluid subproblems use well-known formulations, as mentioned in Sects. 2.2 and 2.1. The discretization of the kinematic constraint from Sect. 2.3 uses a method introduced in [21], which we now refer to as the dynamic augmented Lagrangian (DAL) scheme [58, 59], along with a time-explicit treatment of the computational geometry problem of computing the shell–mesh intersection, which increases robustness without incurring any of the “added mass” instabilities [60] that often plague explicit fluid–structure coupling.

3.1 The dynamic augmented Lagrangian method

DAL is formulated in the discrete-in-time setting, where we want to enforce the constraint

$$\begin{aligned} C_\lambda (\mathbf {v}_\text {fs}^{n+\alpha },\mathbf {v}^{n+\alpha }_\text {sh},\delta \varvec{\lambda }) = \int _{\Gamma _0}\left( \mathbf {v}_{\text {fs}}^{n+\alpha } - \mathbf {v}_{\text {sh}}^{n+\alpha }\right) \cdot \delta \varvec{\lambda }\,d\Gamma _0 = 0\quad \forall \delta \varvec{\lambda }\in \mathcal {V}_\lambda \text { ,} \end{aligned}$$
(33)

where \(n+\alpha \) is an intermediate time level between steps n and \(n+1\), where the constraint enforcement is collocated. Typically, the choice of \(\alpha \) here is tied to some initial baseline time integration scheme used to discretize time derivatives in the fluid–solid and shell subproblems. For instance, if the subproblems are discretized with backward Euler, we would use \(\alpha =1\), if they were discretized with the implicit midpoint rule, we would use \(\alpha =1/2\), and if they were discretized with generalized-\(\alpha \) [61, 62], we would use \(\alpha =\alpha _\text {f}\), where \(\alpha _\text {f}\) is interpreted following the notation conventions of [36] rather than the original reference.

Emphasizing constraint enforcement and suppressing unnecessary functional arguments for visual clarity, we write our discrete-in-time formulation as: Find \(\mathbf {v}_\text {fs}^{n+1}\), \(p^{n+1}\), \(\mathbf {v}_\text {sh}^{n+1}\), and \(\varvec{\lambda }^{n+1}\) such that for all \(\mathbf {w}_\text {fs}\), q, \(\mathbf {w}_\text {sh}\), and \(\delta \varvec{\lambda }\),

$$\begin{aligned} R_{\text {fs}} + R_{\text {sh}}&+ \int _{\Gamma _0}\left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \cdot \varvec{\lambda }^{n+1}\,d\Gamma _0\nonumber \\&+ \int _{\Gamma _0}\left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \delta \varvec{\lambda }\,d\Gamma _0\nonumber \\&+\int _{\Gamma _0}\beta \left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \,d\Gamma _0 = 0\text { ,} \end{aligned}$$
(34)

where we have added a penalty term, with penalty parameter \(\beta \ge 0\), to augment the constraint enforcement of the Lagrange multiplier \(\varvec{\lambda }^{n+1}\). In the spatially continuous setting, this penalty term is technically redundant in light of the Lagrange multiplier terms, but it will play a crucial role in the derivation of the DAL method.

To obtain the DAL method, we first regularize the formulation (34) using only a scalar Lagrange multiplier associated with the normal part of the kinematic constraint:

$$\begin{aligned} R_{\text {fs}} + R_{\text {sh}}&+ \int _{\Gamma _0}\lambda ^{n+1}\left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \cdot \mathbf {n}_\text {sh}^{n+\alpha }\,d\Gamma _0\nonumber \\&+ \int _{\Gamma _0}\delta \lambda \left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \mathbf {n}_\text {sh}^{n+\alpha }\,d\Gamma _0\nonumber \\&+\int _{\Gamma _0}\beta \left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \,d\Gamma _0 = 0\text { ,} \end{aligned}$$
(35)

where \(\mathbf {n}_\text {sh}^{n+\alpha }\) is the unit normal vector to the deformed shell structure midsurface at time level \(n+\alpha \). In this modified problem, the tangential portion of the constraint is regularized, and enforced entirely through the penalty term. If the penalty \(\beta \) scales inversely with a refinement parameter \(h\rightarrow 0\), this still enforces the tangential constraint exactly in fully-converged analyses.

The essential feature of the DAL method is to update the Lagrange multiplier explicitly, using the forces computed from an implicit treatment of the penalty term. This results in a two-step solution procedure for each time step: Find \(\mathbf {v}_\text {fs}^{n+1}\), \(p^{n+1}\), and \(\mathbf {v}_\text {sh}^{n+1}\) such that for all \(\mathbf {w}_\text {fs}\), q, and \(\mathbf {w}_\text {sh}\),

$$\begin{aligned} R_{\text {fs}} + R_{\text {sh}}&+ \int _{\Gamma _0}\lambda ^{n}\left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \cdot \mathbf {n}_\text {sh}^{n+\alpha }\,d\Gamma _0\nonumber \\&+\int _{\Gamma _0}\beta \left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \left( \mathbf {w}_\text {fs} - \mathbf {w}_\text {sh}\right) \,d\Gamma _0 = 0\text { ,} \end{aligned}$$
(36)

then find \(\lambda ^{n+1}\) such that for all \(\delta \lambda \)

$$\begin{aligned} \int _{\Gamma _0}\left( \lambda ^{n+1} - \left( \lambda ^n + \beta \left( \mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \mathbf {n}_\text {sh}^{n+\alpha } \right) \right) \delta \lambda \,d\Gamma _0 = 0\text { .} \end{aligned}$$
(37)

If \(\mathcal {V}_\lambda \) is a piecewise-constant space defined on \(\Gamma _0\) and the integral \(\int _{\Gamma _0}\) is approximated using one quadrature point per element on this space, then a static condensation procedure provides the following explicit formula for updating the Lagrange multiplier field:

$$\begin{aligned} \lambda ^{n+1} = \lambda ^n + \beta \left( \mathbf {v}^{n+\alpha }_\text {fs} - \mathbf {v}_\text {sh}^{n+\alpha }\right) \cdot \mathbf {n}^{n+\alpha }_\text {sh}\text { .} \end{aligned}$$
(38)

In this way, the DAL approach eliminates the need to solve a discrete saddle point problem, while also allowing for strong constraint enforcement in the steady limit with only moderate values of the penalty value \(\beta \), which do not harm the conditioning of the implicit algebraic problem solved at each time step. Extensive discussion of DAL and comparison with related methods can be found in [59, Section 4.4].

Remark 2

References [58, 63] introduced improvements to the basic DAL method described above. These improvements allow for a priori error estimation in the context of a simplified model problem [64], and can greatly improve the quality of the approximate Lagrange multiplier. However, their impact on the velocity solutions of the fluid and shell structure are minimal in most cases, and they are conceptually orthogonal to the main contributions of the present work.

Remark 3

An important question about DAL is: How well does it prevent flow through immersed structures? A naive investigation into this question might focus on the constraint residual, \(\mathbf {v}_\text {fs}^{n+\alpha } - \mathbf {v}_\text {sh}^{n+\alpha }\). However, the effect of the concentrated multiplier and penalty forces on the accuracy of the surrounding fluid solution is of far greater significance than constraint satisfaction to apparent flow through the structure. The numerical tests of [21, Section 4.4] show how solutions with accurate satisfaction of the constraint can still have large apparent leakage through the structure. This is fundamentally due to stabilized FE formulations not being “pressure-robust” in the sense defined by [65]. The solution of [21] was to locally modify stabilization parameters near the immersed boundary. This solution is analyzed mathematically in [24, Appendix A] and found effective by [32, 66,67,68] across a variety of immersed-boundary methods and software frameworks. The present work also uses this local modification of stabilization parameters. An alternative solution is to use a pressure-robust formulation for the background fluid, as done in [24, 69, 70]. A pressure-robust stabilized IGA formulation was recently implemented with FEniCS/tIGAr in [71], but CouDALFISh is designed around a classical FE discretization with the standard VMS formulation cited earlier.

3.2 Explicit treatment of geometry

When resolving the problem (36) implicitly, the location of deformed shell midsurface points pulled back to \(\Omega _y\) by \(\hat{\varvec{\phi }}\) depends on the unknown shell structure displacement \(\mathbf {u}_\text {sh}^{n+1}\) and the displacement \(\hat{\mathbf {u}}^{n+1}\) of \(\Omega _y\) to \(\Omega _x\), which depends, through the boundary condition (32), on the unknown solid displacement \(\mathbf {u}_\text {so}\). When a time-independent finite element mesh for the background fluid–solid subproblem is defined on \(\Omega _y\), this means that material points on the shell midsurface may jump between elements of the background mesh during an iterative nonlinear solution process, making convergence difficult, due to non-smoothness of the residual.

Reference [32] circumvented this difficulty by treating the geometry of the shell–mesh intersection explicitly. In that work, the background mesh was static, so this reduced to using an explicit predictor for \(\mathbf {u}^{n+1}_\text {sh}\) to locate the \((n+\alpha )\)-level shell–mesh intersection throughout the nonlinear iteration, while still updating \(\mathbf {u}^{n+1}_\text {sh}\) implicitly in the nonlinear residual (36) to avoid added mass instabilities.

We now generalize this explicit treatment of geometry to the deforming-mesh setting of the present work. To maintain a fixed shell–mesh intersection throughout the nonlinear iteration to solve (36), we also use an explicit predictor for \(\hat{\mathbf {u}}^{n+1}\) throughout the nonlinear iteration. We then solve the mesh deformation problem described in Sect. 2.5 once at the end of each time step to obtain \(\hat{\mathbf {u}}^{n+1}\), using the converged solution of \(\mathbf {u}^{n+1}_\text {so}\) in the boundary condition (32).

4 Implementation leveraging FEniCS and tIGAr

As discussed in Sect. 1, the primary contribution of the present work is to implement the formulation and discretization described in Sects. 2 and 3 in an open-source library that makes effective use of code generation technology. Our starting point is the library CouDALFISh (pronounced “cuttlefish” and standing for Coupling via DAL of Fluids with Isogeometric Shells), described in [32]. The original version of this library described in the cited reference coupled an isogeometric discretization of a thin shell with a stabilized finite element discretization of incompressible Newtonian fluid on a static domain. The isogeometric shell analysis was implemented using the library tIGAr [34], which extends FEniCS to IGA, while the fluid subproblem was implemented using pure FEniCS. To make the shell and fluid discretizations modular and individually reusable, they were abstracted behind the concise modules ShNAPr (Shell Nonlinear Analysis Programs) [72] and VarMINT (Variational Multiscale Incompressible Navier–Stokes Technology) [73] respectively.

In the language and notation of Sect. 2, the problem considered in [32] would correspond to the special case in which \(\Omega _x = \Omega _y = \Omega _y^\text {f}\), implying that \(\hat{\mathbf {u}} = \mathbf {0}\), \(\Omega ^\text {so}_y = \emptyset \), the background solid subproblem can be neglected entirely, and there is no need to formulate (much less solve) a fictitious problem for \(\hat{\mathbf {u}}\) in \(\Omega _y^\text {f}\). Restriction to this special case greatly simplified the implementation of CouDALFISh. We refer the reader to [32] for a detailed discussion of the initial version of CouDALFISh, and focus the present section on what has been modified since then, to generalize it to the problem setting described in Sect. 2. In particular, we discuss how code generation simplifies treatment of the deforming fluid domain (Sect. 4.1) and how we integrate this treatment into the overall solution algorithm of CouDALFISh (Sect. 4.2).

4.1 Transparent pullbacks to the reference domain

The pullback of the fluid subproblem (7) to \(\Omega _y\), summarized as the substitutions (10)–(13), would be tedious to implement directly in a finite element solver without leveraging code generation. In many traditional finite element implementations, this change of variables is simply offloaded to existing shape function routines, under the assumption that the reference-to-physical displacement \(\hat{\mathbf {u}}\) is approximated using isoparametric elements. In such implementations, the coordinates of nodes in the mesh data structure are updated using \(\hat{\mathbf {u}}\), and (7) is assembled over the deformed mesh. However, this approach can be limiting for various reasons:

  • One might wish to use an analytical or superparametric deformation of the reference domain.

  • The hyperelastic background solid subproblem and the artificial problem for \(\hat{\mathbf {u}}\) in the fluid subdomain are more naturally posed on \(\Omega _y\).

  • Expressing the pullback symbolically as part of the problem residual enables automated differentiation of the residual with respect to \(\hat{\mathbf {u}}\). This functional derivative may be needed in some types of implicit solvers or shape optimization schemes.

As such, to maximize the generality of our implementation (which we may wish to use in contexts other than immersed FSI), we prefer to pull the fluid subproblem back to the reference domain. Fortunately, this choice adds no significant complexity to the implementation when taking advantage of modern code generation capabilities.


The value of UFL for simplifying the implementation of the fluid subproblem on \(\Omega _y\) lies in its extensibility. Because UFL is embedded within the Python programming language, it can be augmented with new auxiliary operators by simply defining Python functions. For example, the spatial gradient operator defined by the substitution (12) can be implemented as

figure a

where x is a symbolic UFL expression of spatial position \(\mathbf {x} = \hat{\varvec{\phi }}(\mathbf {y}) = \mathbf {y} + \hat{\mathbf {u}}(\mathbf {y})\), the native UFL grad function acts as \(\nabla _y\) when the finite element mesh is defined on \(\Omega _y\) (so that grad(x) is effectively \(\hat{\mathbf {F}}\)), dot contracts over the last index of its first argument and first index of its second, and inv symbolically inverts a UFL matrix. This applies naturally to a tensor f of arbitrary rank, with the unambiguous index-notation interpretation

$$\begin{aligned} \hat{F}_{kA} = \frac{\partial \hat{u}_k}{\partial y_A} + \delta _{kA}\quad \text {and}\quad (\nabla _x\mathbf {f})_{i\cdots jk} = \frac{\partial f_{i\cdots j}}{\partial y_A}F^{-1}_{Ak}\text { .} \end{aligned}$$
(39)

In this work, we augment functions from the original implementation of VarMINT used by [32] to include optional keyword arguments for the spatial position \(\mathbf {x}\), which are then used to apply the corresponding domain pullback, via easily understandable constructions like the gradx function listed out explicitly above.

Remark 4

As explained in [34], a similar change-of-variables implementation is used for IGA by tIGAr, wherein DOLFIN operates directly on a mesh in the spline parameter space.

4.2 Temporary mesh motion and solution algorithm

In the specific context of immersed FSI, updating the mesh to be in \(\Omega _x\) is overwhelmingly advantageous for one specific task: locating the background elements containing deformed images of quadrature points on \(\Gamma _0\). DOLFIN already implements robust computational geometry routines for locating points in finite element meshes, but these are only applicable to immersed FSI if the mesh is in \(\Omega _x\). Thus, we follow the approach of temporarily updating the mesh by adding \(\hat{\mathbf {u}}\) to its vertices, performing this computational geometry operation, then reverting the mesh to its original position in \(\Omega _y\), over which the fluid, solid, and reference-to-physical mapping problems are posed. Thus, the overall algorithm for computing the \((n+1)\)-level solution within a single time step can be summarized as follows:

  1. 1.

    Compute explicit predictors for the \((n+1)\)-level fluid–solid velocity, shell structure displacement, and mesh displacement.

  2. 2.

    Compute the \((n+\alpha )\)-level deformed positions of fluid–shell coupling points using the predicted \((n+1)\)-level shell structure displacement.

  3. 3.

    Repeat the following steps until reaching a convergedFootnote 6 solution to the nonlinear problem (36). Each pass of these steps is referred to as a “block iteration”, following the terminology of [74]. (This is a generalization of the block iteration algorithm analyzed in [24, Section 4] for the case of a static fluid domain.)

    1. (a)

      Assemble the vector and matrix corresponding to the monolithic fluid–solid residual (6) and its derivative with respect to \(\mathbf {v}_\text {fs}^{n+1}\).

    2. (b)

      Temporarily move the fluid–solid mesh of \(\Omega _y\) to the current configuration (using the explicit predictor for \(\hat{\mathbf {u}}^{n+1}\), as discussed in Sect. 3.2).

    3. (c)

      Add contributions from the \(\Gamma _0\) integrals in (36) to the assembled fluid–solid system.

    4. (d)

      Apply Dirichlet boundary conditions to the assembled fluid–solid residual vector and Jacobian matrix.

    5. (e)

      Solve for an increment of the fluid–solid solution and update the current values.

    6. (f)

      Assemble the vector and matrix corresponding to the shell subproblem residual (24) and its derivative with respect to \(\mathbf {u}_\text {sh}^{n+1}\).

    7. (g)

      Add contributions to the assembled shell structure system corresponding to the contact residual (26) and its Jacobian.

    8. (h)

      Add contributions from the \(\Gamma _0\) integrals in (36) to the assembled shell structure system, using the updated fluid solution from step 3e.

    9. (i)

      Apply Dirichlet boundary conditions to the assembled shell structure system.

    10. (j)

      Solve for an increment of the shell displacement solution and update the current values.

    11. (k)

      Move the mesh back to its static reference configuration.

  4. 4.

    Solve the fictitious hyperelastic mesh deformation problem of Sect. 2.5 to obtain \(\hat{\mathbf {u}}^{n+1}\), using the converged solution for \(\mathbf {u}_\text {so}^{n+1}\) as a boundary condition.

Remark 5

Our reliance on temporary modification of the mesh data structure for applying point sources in \(\Omega _x\) effectively limits the mesh displacement \(\hat{\mathbf {u}}\) to being piecewise linear, due to many of the computational geometry routines in FEniCS being restricted to affine simplicial elements. Because \(\hat{\mathbf {u}}\) must coincide with the solid displacement in \(\Omega _y^\text {so}\) and we assume a single continuous FE space on \(\Omega _y\) for \(\mathbf {v}_\text {fs}\), the piecewise-linear restriction on \(\hat{\mathbf {u}}\) propagates to the fluid velocity. This limitation on the polynomial degree of velocity elements imposes high resolution requirements for fully resolving turbulent flow features. Section 6 discusses the implications of this for heart valve FSI.

5 Benchmark tests

This section summarizes the results of benchmark testing to verify the implementations of pullbacks to \(\Omega _y\) and computation of immersed boundary forces on a deforming \(\Omega _x^\text {f}\).

5.1 Navier–Stokes on a deforming domain

To test the deforming-domain fluid formulation in the updated library VarMINT, we use the classic 2D Taylor–Green vortex problem [75], a special case of the Navier–Stokes equations for incompressible fluids that has an analytic solution. This problem allows us to verify the implementation of the fluid ALE-VMS formulation from Sect. 2.1.1 and the pullbacks to the reference configuration described in Sect. 4.1. The exact two-dimensional velocity solution is

$$\begin{aligned} \mathbf {v}(\mathbf {x},t) = \left( \sin (x_1)\cos (x_2)\mathbf {e}_1 - \cos (x_1)\sin (x_2)\mathbf {e}_2\right) e^{-2\nu _\text {f} t} \text {,} \end{aligned}$$
(40)

where \(\nu _\text {f} = \mu _\text {f}/\rho _\text {f}\) is the kinematic viscosity and \(\{\mathbf {e}_i\}\) are standard Cartesian basis vectors in physical space. We choose the spatial domain \(\Omega _x = [-\pi ,\pi ]\times [-\pi ,\pi ]\). The problem is solved on the static reference domain \(\Omega _y\), which deforms to \(\Omega _x\) via a nontrivial time-dependent deformation with the prescribed displacement field

$$\begin{aligned} \hat{\mathbf {u}}(\mathbf {y},t) = \frac{1}{5}\sin {\left( y_1\right) } \sin {\left( y_2\right) } \sin {\left( \frac{2 \pi t }{T}\right) } \left( \mathbf {e}_1 + \mathbf {e}_2 \right) \text {,} \end{aligned}$$
(41)

where T is the simulation duration. To simplify the enforcement of boundary conditions, the displacement field is chosen to specifically maintain \(\partial \Omega _y = \partial \Omega _x\).

The computations presented here use continuous degree-one finite element spaces for the pressure and all velocity components with \(\nu _\text {f} = 0.01\) and \(T = 1\). Each mesh is generated from a uniform \(N \times N\) structured quadrilateral mesh divided into triangles. The computation uses an implicit midpoint time-stepping scheme and takes N time steps to uniformly cover the interval [0, T]. The exact velocity solution is strongly enforced across the domain boundary and the exact pressure is enforced at a single corner of the domain. For further details, the reader is referred to the published GitHub repository [73] that contains the script needed to reproduce the results shown here.

Figure 1 shows the convergence of solutions to this problem under mesh refinement. We see optimal first- and second-order convergence of the \(H^1\) and \(L^2\) norms of the error, respectively. The reported error norms are calculated at \(t=T\) and plotted against a mesh-size parameter, \(h = \frac{2 \pi }{N}\). A representative snapshot of a numerical solution is also shown in Fig. 2, illustrating how the qualitative structure of the solution in \(\Omega _x\) is preserved, despite the motion of the mesh.

Fig. 1
figure 1

Optimal convergence of Taylor–Green vortex problem to the analytical solution for given element sizes, h

Fig. 2
figure 2

Representative solution snapshot of the decaying Taylor–Green vortex on a deformed domain. The solution presented here was computed on a \(16\times 16\) \(\left( \log \left( h\right) = -0.406\right) \) uniform quadrilateral mesh split into triangles and is shown at \(t = 0.21875\)

5.2 Conforming FSI: The Turek and Hron benchmark

We next consider a test of the coupled fluid–solid problem without any immersed shell structure to validate the boundary-fitted coupling and mesh motion implementations behind (6). For this, we use the 2D benchmark proposed by Turek and Hron [76] and studied extensively by other authors (e.g., [77,78,79,80,81,82]). The benchmark involves incompressible channel flow over a rectangular block of solid material, which is fixed to a cylinder at its leading edge and deflects periodically due to vortex shedding. The FSI3 case of [76] is adopted here. Detailed information on the problem setup and a set of converged reference results are provided by [76]. Here we give a brief summary. The length and height of the channel domain are 2.5 m and 0.41 m, respectively. The center of the cylinder is positioned at (\(0.2\,\text {m},0.2\,\text {m}\)) measured from the bottom-left corner of the channel. The radius of the cylinder is 0.05 m. The elastic structure bar has a length and height of 0.35 m and 0.02 m, respectively. The bottom-right corner of the structure is positioned at (\(0.6\,\text {m},0.19\,\text {m}\)) and the left end is fully attached to the fixed cylinder. The setting is intentionally non-symmetric in the vertical direction to ensure that the onset of a vortex street does not rely on an initial small perturbation.

A parabolic inflow velocity profile [76, Eq. (10)] is prescribed at the left channel boundary with a mean inflow velocity of 2.0 m/s. A smooth increase of the velocity profile in time [76, Eq. (11)] is applied as the initial inflow condition. The outflow boundary condition is traction-free, and the no-slip condition is applied on the remaining boundaries, including the fluid–structure interface. The structure is elastic and compressible, modeled as a St. Venant–Kirchhoff material. The density of the structure is \(\rho _{0}^\text {so} = 1.0\times 10^3\) kg/m\(^3\), the Poisson’s ratio is \(\nu =0.4\), and the shear modulus is \(\mu _\text {s}=2.0\) MPa. The fluid is incompressible Newtonian. The density is \(\rho _\text {f}=1.0\times 10^3\) kg/m\(^3\) and the kinematic viscosity is \(\nu _\text {f}=1.0\times 10^{-3}\) m\(^2\)/s.

Each finite element mesh of the domain is generated with Gmsh [83]. Table 1 describes the meshes size, h, near the fluid–object interface (both the cylinder and the structure). The maximum element size for all of the mesh levels is \(h_\text {max} = 15\) mm. The interface mesh size h is maintained for any elements within 25 mm of the interface. Outside of the uniformly-refined region, the elements are sized according to a linear interpolation between h and \(h_\text {max}\) over 525 mm. In the absence of refinement, the elements maintain an average size of \(h_\text {max}\) and conform to the outer boundary.

Table 1 Setup cases for the Turek–Hron FSI3 benchmark where N is the total number of triangular elements and h is the mesh size at the interface

We discretize this 2D problem using the updated version of VarMINT for the deforming fluid subdomain and a standard Bubnov–Galerkin formulation of hyperelasticity in the solid subdomain. The problem utilizes a fully implicit backward-Euler time integration scheme and a consistent time step size of \(1.0\times 10^{-3}\) s between different mesh refinement levels. The solid displacement at the fluid–structure interface and the channel domain boundaries are used as boundary conditions for the mesh problem, solved as a hyperelasticity problem for the internal mesh displacement per (30). The strongly coupled fluid–solid problems and mesh motion problem are solved iteratively until both converge in a typical block-iterative fashion [74] to validate the fluid–solid coupling. That is, this benchmark does not make use of the CouDALFISh solution algorithm described in Sect. 4.2 so that the two coupling types (conforming fluid–solid and immersed fluid–shell) could be independently validated. The sparse, parallel, direct solver MUMPS [84] was used as the linear solver for both the fluid–solid and mesh problems. Again, the reader is referred to the GitHub repository [73] that contains the scripts used to produce the results here.

A representative snapshot of the results on a coarse mesh (M1) is shown in Fig. 3. The snapshot displays the velocity field and highlights the boundary-fitted nature of the mesh. Table 2 shows the comparison quantity results over several mesh resolutions, which compare well with the published benchmark results in [76]. The displacements in Table 2 are evaluated at the center of the tip of the structure bar, initially located at \((0.6\,\text {m},0.2\,\text {m})\). The displacements are presented here in terms of their mean, amplitude, and frequency in accordance with [76]. The lift and drag forces in Table 2 are computed over the entire fluid–object boundary using the conservative definition of traction [85, Eq. (37)], which accounts for any contributions from the stabilization terms at the boundary.

Fig. 3
figure 3

A sample solution of the Turek–Hron FSI3 benchmark on mesh M1 showing the boundary-fitted nature of the mesh

Table 2 Numerical results for the Turek–Hron FSI3 benchmark. \(u_1\) and \(u_2\) are the horizontal and vertical displacements of the structure bar recorded at the center of its tip

5.3 2D valve immersed in a deforming domain

We now move on to a more complicated verification test, which can be viewed as a 2D model problem sharing some features with a heart valve. Minor variants of this problem have been thoroughly studied in numerous references [21, 58, 86,87,88]. We refer to [21, Section 4.7] for a complete statement of the domain dimensions, boundary conditions, material properties, etc. that are reused in the present work. However, we briefly summarize the problem here. A horizontal channel is modeled by a rectangular domain of \(8.0\times 1.61\) with no-slip boundary conditions on the top and bottom, a homogeneous Neumann boundary condition on the right end, and a parabolic inflow profile [21, Eq. (55)] on the left, whose amplitude varies periodically in time. Two thin beams, each with a height of 0.7 and a thickness of 0.0212, are located 2.0 from the inlet and are immersed in this channel, one with a cantilever support on the top side and the other with a cantilever support on the bottom. These beams deflect periodically, in response to the inflow profile. Although they never contact each other in the standard version of the benchmark,Footnote 7 the beams are still referred to as “leaflets”, in a loose analogy to heart valve mechanics. The fluid and structure have equal densities of \(\rho _\text {f}=\rho _0^\text {sh}=100\). The dynamic viscosity of the fluid is \(\mu _\text {f}=10\). The beam is modeled using a St. Venant–Kirchhoff material with \(E = 5.6\times 10^7\) and Poisson’s ratio of \(\nu =0.4\).

Because immersed shells are fundamentally a 3D problem, this 2D problem was solved on a finite element mesh with a layer of two elements. To maintain the 2D nature of the problem, the out-of-plane velocity component in both the fluid and shell was strongly constrained to zero. The final discrete mesh contains \(N \times 5N \times 2\) tetrahedral elements where N is the number of elements in the \(x_2\) direction. The default structured tetrahedral mesh generated in FEniCS (mesh = BoxMesh(N,5N,2)) is not symmetric. We found that the asymmetric nature of the background fluid mesh introduced asymmetry in the velocity solution. To remedy this, and avoid using an external mesh generator, we discovered that the uniform refinement algorithm in FEniCS (mesh = refine(BoxMesh(N/2,5N/2,1)) produces a symmetric mesh of \(N \times 5N \times 2\) elements. The temporal discretization is refined with the spatial discretization such that the time step size \(\Delta t = T/(32N)\), where \(T = 3.0\) is the total simulation time. In this study, three meshes, N = 16, 32, and 64, are considered. The interested reader is referred to the published CouDALFISh repository [33] for the complete code (geometry, mesh, boundary conditions, solver algorithms, problem script, etc.) to reproduce the exact problem setup and results shown here.

This problem was previously used to verify the initial implementation of CouDALFISh in [32], with the stationary-domain restriction of \(\Omega _x = \Omega _y = \Omega _x^\text {f}\). As with the 2D Taylor–Green problem in Sect. 5.1, we now solve with a nontrivial time-dependent deformation of \(\Omega _y\), given by displacement

$$\begin{aligned} \hat{\mathbf {u}}(\mathbf {y},t) = A \sin {\left( 2 \pi \frac{y_1}{L}\right) } \sin {\left( 2 \pi \frac{y_2}{H}\right) } \sin {\left( f \pi \frac{t}{T}\right) } \left( \mathbf {e}_1+\mathbf {e}_2\right) , \end{aligned}$$
(42)

where \(A = 0.15\) is a chosen displacement amplitude, \(f = 8\) is a chosen oscillation frequency, \(T = 3\) is the total simulation time, and \(L = 8\) and \(H = 1.61\) are the domain length and height, respectively.

Fig. 4
figure 4

Sample solutions at two different time steps on a coarse mesh deformed in two different configurations

Fig. 5
figure 5

Plots showing the convergence of both the \(x_1\)- and \(x_2\)-displacement of the top-leaflet tip to the boundary-fitted reference

Fig. 6
figure 6

Each plot shows the difference in displacement between the two tips, one plot for each independent direction of displacement (\(x_1\) and \(x_2\) directions). The differences are presented as percentages of the maxima with respect to time of the corresponding tip displacement components. The convergence towards zero signifies a symmetric displacement between the two leaflet tips under refinement of the fluid mesh

Several representative snapshots of the solution are shown in Fig. 4, demonstrating that the overall symmetry of the solution is preserved, despite a mesh deformation that does respect that symmetry. We also compare the results with a converged reference solution from [21, Section 4.7.2]. In particular, we look at the deflection of the top leaflet as a function of time. The time histories plotted in Fig. 5 show a clear convergence toward the reference solution as the immersed discretizations are refined. Figure 6 also plots the difference between the tip deflections of the top and bottom leaflets for each immersed discretization. The asymmetry clearly converges to zero, despite the asymmetric mesh deformation.

6 Application to FSI of a bioprosthetic heart valve

Having verified the accuracy of the deforming-domain fluid solver, using benchmarks for both pure Navier–Stokes and FSI, we move on to a complex application, namely, FSI simulation of a bioprosthetic heart valve immersed in a flexible artery. We summarize the problem setup in Sect. 6.1, followed by a presentation and discussion of the simulation results in Sect. 6.2. For all results in this section, the geometry definitions, mesh creation scripts, boundary and initial condition files, solver algorithms, problem scripts, and basic post-processing tools are included in the CouDALFISh repository on GitHub [33] for simulation reproducibility and transparency.

6.1 Geometry, boundary conditions, and parameters

Many of the main modeling assumptions for the background artery FSI (Sect. 6.1.1) and immersed leaflet shell structure (Sect. 6.1.2) are adopted from prior work, e.g. [21,22,23,24,25, 89,90,91,92], but we reiterate them here for completeness.

6.1.1 Fluid–solid background problem

The background fluid–solid domain is defined in its reference configuration, \(\Omega _y\), to model the aortic root, sinuses, and a short portion of the ascending aorta. Our finite element mesh of this geometry is shown in Fig. 7, consisting of 742, 716 tetrahedral elements. The solid domain is comprised of 112, 752 structured elements in two layers. The fluid domain is 629, 964 elements split between three layers of boundary-layer structured elements and a center unstructured region that is refined near the valve. The mesh was generated with the open-source meshing tool Gmsh [83]. We designate the ventricular end as the “inflow” and the aortic end as the “outflow”, based on the nominal flow direction permitted by the valve. The artery wall thickness is \(14\%\) of the lumen radius at a given axial cross-section, while the overall length of the domain from inflow to outflow is 10.5 cm. The diameter of the artery lumen’s cross section is 2.3 cm at the inflow and 3.0 cm at the outflow, following the aorta geometry from [90]. The bottom of the sinus (aortic annulus) is located 1.0 cm from the inlet.

Fig. 7
figure 7

Subfigure a shows a cross-section of the computational mesh for the heart valve problem. The flow “inlet” is on the bottom and the flow “outlet” is on the top. The solid domain (112, 752 structured tetrahedral elements) is shown in red and fluid domain (629, 964 elements) in gray. Subfigure b shows the relative positioning of the valve and the background mesh. The valve stent base is aligned with the root of the sinus, shown in more detail in c. Subfigure d shows the relative sizes of fluid elements and shell elements along the valve’s belly region

Following [22], we use a neo-Hookean hyperelastic solid with mass damping and a dilational penalty as an effective model for the elasticity of the artery and dissipation due to interaction with surrounding tissue. (We do not claim that this provides accurate stresses within the artery wall, as it neglects the layered structure.) Specifically, the second Piola–Kirchhoff stress in the material is given by

$$\begin{aligned} \mathbf{S} = \mu _\text {s} J^{-2/3} \left( \mathbf{I} - \frac{1}{3} \left( {\text {tr}}{} \mathbf{C} \right) \mathbf{C} ^{-1}\right) + \frac{1}{2} \kappa \left( J^2 - 1 \right) \mathbf{C} ^{-1} \text { ,} \end{aligned}$$
(43)

where we choose a Young’s modulus \(E=1.0 \times 10^7\) dyn/cm\(^2\) and the Poisson’s ratio \(\nu =0.45\). The shear modulus and bulk modulus, respectively, are found from the following equations: \(\mu _\text {s} = \frac{E}{2\left( 1+\nu \right) }\) and \(\kappa = \frac{E}{3\left( 1-2\nu \right) }\). For the mass-proportional damping term, we choose \(C_\text {d} = 1.0 \times 10^{-4}\) s\(^{-1}\). The density of the solid is \(\rho _{0}^\text {so} = 1.0\) g/cm\(^3\). The solid subdomain is subject to sliding boundary conditions [93] at the inflow and outflow, and is fixed at its intersection with the prosthetic valve’s stent. The outer boundaries of the artery are treated as traction-free (where, again, the effects of interaction with surrounding tissue are modeled through the choice of effective stiffness and mass damping).

For the fluid subproblem posed within the artery lumen, we assume a NewtonianFootnote 8 dynamic viscosity of \(\mu _\text {f}=3.0 \times 10^{-2}\,\text {g/(cm\,s)}\) and a mass density of \(\rho _\text {f}=1.0 \text {\,g/cm}^3\). The fluid subproblem is driven by applied fluxes at the inflow and outflow. The inflow flux is given by the pressure profile

$$\begin{aligned} \mathbf {h}\vert _\text {inflow} = -p_\text {in}\mathbf {n}_x\text { ,} \end{aligned}$$
(44)

where the scalar pressure \(p_\text {in}\) varies periodically in time, following the profile of [90, Figure 18] (varying between approximately 128 mmHg during systole and \(-2\) mmHg during diastole in a cardiac cycle of 0.86 s). The flux at the outflow is determined based on the volumetric flow rate, viz.,

$$\begin{aligned} \mathbf {h}\vert _\text {outflow} = -(p_0 + RQ)\mathbf {n}_x\text { ,} \end{aligned}$$
(45)

where \(p_0 = 80\) mmHg is a baseline pressure value, \(R=70\) dyn s/cm\(^5\) is a resistance coefficient, and

$$\begin{aligned} Q = \int _{\left. \partial \Omega _x^\text {f}\right| _\text {outflow}}\mathbf {v}\cdot \mathbf {n}_x\,d\partial \Omega _x, \end{aligned}$$
(46)

is the volumetric flow rate through the outflow. The backflow stabilization coefficient \(\gamma \) in (7) is set to 1 on both the inflow and outflow.

Remark 6

The choice of \(\gamma =1\) is motivated by mathematical stability analysis of model problems (e.g., the coercivity analysis of [95, Section 2.1] for advection–diffusion with Neumann boundary conditions). The coefficient \(\gamma \) was not considered a free parameter in the first reference [96] introducing this form of backflow stabilization. It was later introduced in [37] with the the possibility of \(\gamma < 1\). Reducing \(\gamma \) may lessen the impact of stabilization on the flow solution while remaining stable in practice. In this example, we opt for the original choice of \(\gamma =1\). In any case, it is important to note that the value of \(\gamma \), especially at the inflow, affects the calibration of resistance boundary conditions, because backflow stabilization adds a net resistance to flow when applied to both ends of a tube. Thus, resistance boundary conditions must be calibrated for specific choices of \(\gamma \). (However, in the present example, we simply choose a value of R that provides a volumetric flow rate within the physiological range, and do not attempt to calibrate it using patient-specific data.)

The velocity and pressure fields are initialized to zero throughout the whole domain. To ease convergence at the start of the simulation, the simulation starts at \(t = 0.6\) s (during the diastole of the cardiac cycle) and the pressures \(p_\text {in}\) and \(p_0\) are linearly increased over 0.03 s (300 steps when \(\Delta t = 1\times 10^{-4}\)) until \(p_\text {in}\) matches the inlet pressure profile in [90, Figure 18] and \(p_0\) matches the outlet baseline pressure. The results presented in this section correspond to the next complete cardiac cycle, which starts at \(t = 0.86\) s. Based on previous experience with these problems, we observe this “first” cycle to have a well-settled solution in the fluid domain and relatively periodic valve kinematics between cardiac cycles.

6.1.2 Modeling the valve

We model a bioprosthetic valve consisting of thin leaflets clamped into a rigid stent. The valve and stent are modeled as a multi-patch B-spline surface, designed in the CAD software Rhinoceros [97]. The valve has an overall height of 0.94 cm and diameter of 2.235 cm (not including the suture ring). The outer diameter of the suture ring is 2.8 cm. The spline geometry is shown in Fig. 8. Following the IGA paradigm, this spline model also serves as the analysis mesh. The mesh has a total of 1386 cubic B-spline elements, 960 of which make up the three leaflets and 426 elements make up the stent patches. The valve is located such that the suture ring is level with the aortic annulus and centered in the aortic root, shown in Fig. 7. The stent patches are entirely fixed, while the clamped attachments of leaflets are modeled by fixing two rows of B-spline control points at each attachment edge.

Fig. 8
figure 8

Isometric, top, and side views of the valve geometry and discretization with the leaflet patches shown in white and the stent patches shown in red


Constitutive modeling of the chemically treated soft tissue used in bioprosthetic valves remains a subject of ongoing research [98,99,100]. It is thus useful to develop a software framework that permits rapid prototyping of different hyperelastic potentials. The present contribution achieves this through the flexible isogeometric shell analysis module ShNAPr. While an initial version of ShNAPr was introduced in [32], the present study looks deeper into its implications for studying material models in heart valve FSI. In particular, the submodule ShNAPr.hyperelastic provides a universal interface to automate the implementation of incompressible hyperelastic constitutive models, which uses computer algebra within FEniCS UFL to circumvent the manual calculation of tensor derivatives spelled out in [89]. The general form of a hyperelastic energy density for an incompressible material is

$$\begin{aligned} \psi (\mathbf {E}) = \psi _\text {el}(\mathbf {E}) - p(J-1)\text { ,} \end{aligned}$$
(47)

where p is a Lagrange multiplier to enforce the constraint that \(J=1\). To perform simulations with a given hyperelastic potential, one must only implement a single Python function psi_el(E) corresponding to \(\psi _\text {el}(\mathbf {E})\), given a UFL representation E of the 3D Green–Lagrange strain in a local Cartesian coordinate system whose third basis vector is orthogonal to the shell midsurface. For example, to use an incompressible neo-Hookean model, one would simply define

figure b

where the UFL scalar mu is assumed to be the shear modulus. Note that this user-defined function corresponds to the 3D constitutive model. Following the formulation [46, Section 5.1], (47) is then implemented generically within the library as

figure c

where

figure d

defines the Jacobian determinant J in terms of E, and p is the return value of the function

figure e

which uses a plane-stress criterion on the second Piola–Kirchhoff stress to statically condense the Lagrange multiplier for an arbitrary user-defined choice of \(\psi _\text {el}\). This procedure is not limited to the neo-Hookean model defined as an example earlier.

Remark 7

The indices of E and dpsi_el_dC (corresponding to \(\partial \psi _\text {el}/\partial \mathbf {C}\)) and the variable name C22 for the out-of-plane component of \(\mathbf {C}\) follow the convention of indices starting from zero, not one, which FEniCS UFL inherits from the Python programming language it is embedded in.

As a demonstration of the value of code generation to heart valve FSI, we compare simulation results using two different material models for the valve leaflets. Specifically, we consider the isotropic neo-Hookean (NH) potential,

$$\begin{aligned} \psi _\text {el} = \frac{1}{2} c_0 \left( I_1 - 3 \right) \text { ,} \end{aligned}$$
(48)

and the isotropic Lee–Sacks (LSI) potential [89],

$$\begin{aligned} \psi _\text {el} = \frac{1}{2} c_0 \left( I_1 - 3 \right) + \frac{1}{2} c_1 \left( e^{c_2 (I_1-3)^2} - 1 \right) \text { ,} \end{aligned}$$
(49)

where \(I_1 = \text {tr}\,\mathbf {C}\) and \(\{c_i\}\) are material parameters that are given in Table 3.

The parameters of the Lee–Sacks models are chosen according to the calibration of [89] and the shear modulus for the neo-Hookean model is derived from the Young’s modulus, E, of the St. Venant–Kirchhoff model in [23, Section 3.1] assuming a perfectly incompressible medium. That is, assuming a Poisson’s ratio of 0.5, \(c_0 = \mu _\text {s} = E/3\). Additionally, the density of the valve is \(\rho _{0}^\text {sh} = 1.0\) g/cm\(^3\) and the leaflet thickness is 0.0386 cm in all cases, following the data reported in [89].

Table 3 Material properties for the different models compared in this work

6.1.3 Contact parameters

The contact parameter \(R_\text {self}\) must be selected to be less than the initial distance between leaflets in the reference configuration, to permit contact forces between the leaflets. In this work, it is chosen as \(R_{\text {self}} = 0.0308\) cm. The range of contact forces must be less than this, as mentioned earlier, and \(r_\text {max}\) is correspondingly set to \(r_\text {max} = R_\text {self}/1.3\approx 0.0237\) cm. The stiffness and smoothing parameters are set to \(k_\text {c} = 1.0 \times 10^{11}\) \(\text {g}\,\text {cm}^{-4}\text {s}^{-2}\) and \(s_\text {c} = 0.2\), based on experience with this problem class.

6.1.4 Time-integration scheme

All heart valve FSI results here were computed with a time step size of \(\Delta t = 1\times 10^{-4}\) s and a generalized-\(\alpha \) time integration scheme for the baseline time integrator for subproblems, on top of which DAL is applied (cf. Section 3.1). The spectral radius of the amplification matrix in the limit of \(\Delta t\rightarrow \infty \) is set to \(\rho _\infty = 0.0\), to maximize numerical damping of high-frequency modes, which improves robustness in complicated calculations (while maintaining formal second-order accuracy of the generalized-\(\alpha \) scheme).

6.1.5 Nonlinear solution procedure

Section 4.2 presents the nonlinear solution procedure for the valve without any mention of the nonlinear tolerances or special considerations, so we include those here for completeness. For a full simulation of a cardiac cycle, the computation is limited to three block iterations or a relative tolerance of \(1.0\times 10^{-3}\), whichever is reached first. The size of the background mesh problem necessitates an iterative solver, but the scaling of the stability parameters near the immersed boundary [21, Section 4.4] makes it difficult to converge the linear solver within each Newton iteration. Following the original heart valve example published with CouDALFISh, we again fix the number of GMRES [101] iterations for the fluid linear solver to 300 iterations, which is usually enough to still allow the outer nonlinear iteration to converge. The shell structure problem uses a direct solver (UMFPACK [102]).

6.2 Results

Figure 9 shows slice-intersection renderings of several snapshots of the FSI analysis results for the Lee–Sacks model. The flow-field solutions show the development of the jet upon opening of the valve and the stopping of flow at the valve closing. The element size and polynomial degree in the fluid mesh downstream of the valve is not sufficient to resolve the detailed vortex dynamics expected at the flow’s peak Reynolds number, especially as it encounters an adverse pressure gradient during the onset of diastole. However, the primary quantity of interest in many bioprosthetic valve analyses is the stress field within the leaflets, which is relatively insensitive to downstream vortex dynamics. Fully-resolved fluid dynamics may be relevant to other questions, though (e.g., studies on hemolysis, wall shear stress, or noise), and we refer the reader to [103,104,105,106] for examples of highly-resolved simulations of valvular hemodynamics and in-depth discussion of the turbulent flow features.

Figure 10 shows slice-intersection renderings comparing the aorta displacement at systole and diastole (\(t = 0.25\) s and \(t = 0.52\) s, respectively). The deformation solutions show the significant displacement of the domain, especially near the inlet during systole. The significance of arterial wall deformation for valvular FSI analysis was clearly demonstrated by [22], where it was shown to provide a mechanism for dissipating the kinetic energy of the diastolic blood hammer, damping the oscillation of the heart valve, which is clearly visible in plots of volumetric flow rate over time [22, Figure 8].Footnote 9 This important damping effect is reproduced in the present work, where the outflow flow rate in Fig. 11 exhibits no significant oscillation after valve closure. Additionally, the flow rate in Fig. 11 implies a cardiac output of 6.97 L/min and is quantitatively consistent with the results of [22, 23].

The deformation and flow field for the neo-Hookean model (48) are qualitatively similar to the Lee–Sacks results. However, a closer examination in Fig. 12 reveals significant differences in the strain (and therefore stress) distributions, which can have major implications for the long-term durability of valve leaflets [107]. Figure 12 shows snapshots of the valve leaflet deformations, with the maximum in-plane eigenvalue of \(\mathbf {E}\) (MIPE) plotted over the surface, evaluated on the aortic side of the leaflets. In particular, we see that the neo-Hookean model has large concentrations of strain near the commissure points of each leaflet, while the strain is more evenly distributed with the Lee–Sacks model. This is in agreement with the earlier observations of [23, Figure 5], where a Fung-type constitutive model with similar exponential stiffening properties also led to more even strain distributions, by more strongly penalizing strain concentrations in the energy functional.

Fig. 9
figure 9

A sample of the flow-field solutions at selected time steps showing the development of the jet upon opening and the stopping of flow at the valve closing. The duration of a single cardiac cycle is 0.86 s

Fig. 10
figure 10

Two section views showing the difference in the aorta shape between peak systole (\(t = 0.25\) s, shown in red) and diastole (\(t = 0.52\) s, shown in blue)

Fig. 11
figure 11

The volumetric flow rate at the outlet of the domain throughout the cardiac cycle. The flow rate is quantitatively comparable to [23] and results in an overall cardiac output of 6.97 L/min

Fig. 12
figure 12

Selected snapshots comparing MIPE for the different constitutive models

7 Conclusion

This paper has introduced a modern, open-source implementation of the immersogeometric FSI analysis techniques of [21, 22], emphasizing the role of code generation technology in ensuring transparency and versatility. In particular, it generalizes the work of [32] by immersing thin structures into deforming fluid domains. In doing so, we showed how code generation can be used to design clear abstractions for referring problems on deforming domains back to static reference configurations. The suitability of this implementation for complex applications was demonstrated using it to test the effects of different material models on FSI-induced strain of prosthetic heart valve leaflets in a deforming artery. In the context of this application, our use of code generation was shown to greatly simplify the process of implementing new material models in FSI analysis. The code for this project will be maintained in the publicly-accessible Git repository [33] and its dependencies [72, 73, 108]. Any discussion of code structure in this document refers to the state of the repository at time of submission,Footnote 10 and some results shown in the paper were computed using earlier versions. The comparison between material models in Sect. 6.2 served primarily to demonstrate methodology and software capabilities, rather than to answer a question of scientific interest. However, we believe that the present contribution will lower the human resource cost and increase the reproducibility and transparency of studies like [91, 109], which derive nontrivial physical insights from FSI simulations using DAL-based IMGA.