1. Introduction
Potential flow plays an important role in aerodynamic modelling, but also appears in other areas such as the modelling of water waves or wind farms and the calculation of added mass. Besides its prominent use for steady flow around airfoils at high Reynolds numbers, potential flow theory has long provided the tools for vortex methods to simulate unsteady flows around airfoils and bluff bodies. These vortex methods discretize the vorticity in the flow with singular elements such as point vortices, vortex sheets or a combination of both. In the case of an inviscid and incompressible model, the irrotational flow outside of these singular vortex elements is a potential flow. Singular vortex elements that represent the free vorticity in an inviscid vortex model are advected by the local flow velocity according to Helmholtz's second theorem and can be tracked as Lagrangian points. In case the vortex method inserts new vortex elements in the flow behind a bluff body or at sharp edges, Kelvin's circulation theorem dictates that the circulation should be conserved. Singular potential flow elements can also serve to enforce the no-penetration condition, with the most common choice in vortex methods being a distribution of singular vorticity on the body, denoted as the bound vortex sheet. Besides their choice for the type of singular elements, potential flow solvers for vortex methods differ in their way of calculating the flow velocity. This can be done by either using direct interaction between the potential flow elements or by calculating the velocity on a grid over the entire domain and the eventual choice dictates the treatment of boundary and edge conditions.
In the first approach, the Green's function of the Laplacian is applied to the Poisson equation in the velocity–vorticity formulation to give the Biot–Savart integral, which provides the exact solution for a velocity field that satisfies unbounded boundary conditions. Biot–Savart vortex methods often smooth the Biot–Savart kernel, equivalent to replacing point vortices by vortex blobs (Chorin & Bernard Reference Chorin and Bernard1973), to suppress Kelvin–Helmholtz instabilities below a certain wavelength resulting from the interactions between closely spaced vortex elements. The solution generally requires
${O}(N^{2})$ operations, with
$N$ the number of vortex elements, to sum the influences of each discretized vortex element on every other element. With fast multipole methods, it scales optimally as
${O}(N)$ but with a large prefactor and overhead cost. Inviscid vortex methods of this kind can straightforwardly use the potential flow tools to enforce the no penetration, such as conformal mapping or solving the integral equation for a surface singularity distribution through analytical inversion, panel discretization or with Fourier expansions. For a detailed review of this subject, the reader is referred to Cottet & Koumoutsakos (Reference Cottet and Koumoutsakos2000) and Eldredge (Reference Eldredge2019).
A second approach to calculate the flow velocity follows from the discretization of the Poisson equation in the velocity–vorticity formulation or streamfunction–vorticity formulation on an Eulerian grid over the domain of interest and is called a vortex-in-cell (VIC) approach, first developed by Christiansen (Reference Christiansen1973). The procedure requires us first to transfer the circulation from Lagrangian vortex elements onto the grid, then to solve the discrete Poisson equation and finally to interpolate the velocity (or the curl of the streamfunction) back to the vortex elements. It introduces discretization errors but only requires
${O}(M\log {M})$ operations, with
$M$ the number of grid points, to solve the Poisson equation with current numerical techniques and
${O}(N)$ operations to perform the regularization and interpolation. Similar to the regularized Biot–Savart kernel, the grid spacing together with the vorticity regularization scheme determine the cutoff wavelength below which the Kelvin–Helmholtz instabilities get suppressed.
The early work on VIC methods focused on inviscid vortex dynamics using Fourier-based Poisson solvers with Dirichlet or periodic boundary conditions (Meng & Thomson Reference Meng and Thomson1978; Baker Reference Baker1979; Couët, Buneman & Leonard Reference Couët, Buneman and Leonard1981) and the analysis of different interpolation kernels (Ebiana & Bartholomew Reference Ebiana and Bartholomew1996). After viscous schemes for vortex methods were introduced, VIC methods increasingly replaced Biot–Savart methods in an effort to speed up vortex methods for viscous flows, leading to methods with over a billion vortex particles (Chatelain et al. Reference Chatelain, Curioni, Bergdorf, Rossinelli, Andreoni and Koumoutsakos2008). This also stimulated the development of VIC methods for external flows over bodies, mostly for viscous flows. The most straightforward way to include a body in the flow is to use a body-fitted mesh as in Cottet & Poncet (Reference Cottet and Poncet2004), who apply the Helmholtz decomposition on the flow in their VIC method and place a Neumann boundary condition for the scalar potential on the body to account for its presence and employ an analytic boundary condition for the far field. However, a body-fitted mesh is case specific and, therefore, the same work (and later also Poncet Reference Poncet2009), develops an immersed boundary method by introducing a singular distribution of sources that represents the influence of the body and is smeared onto a Cartesian grid using a discrete approximation to the Dirac delta function. The result is a source term that is inserted in the Poisson equation for the scalar potential which is solved on the grid. Similar to the immersed boundary methods, Brinkman penalization methods do not require body-fitted meshes. In vortex methods, the Brinkman penalization method (Coquerelle & Cottet Reference Coquerelle and Cottet2008; Rossinelli et al. Reference Rossinelli, Bergdorf, Cottet and Koumoutsakos2010; Gazzola et al. Reference Gazzola, Chatelain, van Rees and Koumoutsakos2011; Rasmussen, Cottet & Walther Reference Rasmussen, Cottet and Walther2011; Chatelin & Poncet Reference Chatelin and Poncet2014) adds a volume forcing term to the vorticity transport equation that includes a penalization parameter, equivalent to the porosity of the body. However, the method suffers from a strong time step restriction, which motivated Hejlesen et al. (Reference Hejlesen, Koumoutsakos, Leonard and Walther2015) to use an iterative Brinkman penalization method, which Spietz, Hejlesen & Walther (Reference Spietz, Hejlesen and Walther2017) extended to three dimensions. Gillis, Winckelmans & Chatelain (Reference Gillis, Winckelmans and Chatelain2017) formulate this method as a linear system and uses a recycling iterative solver to obtain the solution more efficiently.
The immersed boundary method and Brinkman penalization method both smear out the influence of the interface onto nearby grid points. LeVeque & Li (Reference LeVeque and Li1994) developed the immersed interface method (IIM) to overcome this issue and to obtain a higher spatial order of accuracy than the immersed boundary method. The premise of this method is to discretize the jump conditions caused by the interface with finite differences instead of discretizing the Dirac delta function, and the result is a sharp representation of the interface with a second or higher-order accuracy. Marichal, Chatelain & Winckelmans (Reference Marichal, Chatelain and Winckelmans2014) apply the explicit-jump IIM (Wiegmann & Bube Reference Wiegmann and Bube2000) in his potential flow method. The influence of the interface was condensed into an extra source term in the streamfunction Poisson equation and it was recognized that the term is equivalent to a bound vortex sheet strength regularized to the grid. The bound vortex sheet strength, streamfunction field and outer boundary condition on the streamfunction are then computed iteratively. The work presents results from the flow over a cylinder and an airfoil, for which the Kutta condition enforced through discretization of the streamfunction normal derivatives at the trailing edge. Gillis, Winckelmans & Chatelain (Reference Gillis, Winckelmans and Chatelain2018) extends this method, but applies the IIM on the scalar potential instead. An explicit formula for the singular distribution of sources on the interface is then obtained by applying the Sherman–Morrison–Woodbury decomposition formula to the Poisson equation, similar to Poncet (Reference Poncet2009). Furthermore, by solving the Poisson equation using the lattice Green's function (Katsura & Inawashiro Reference Katsura and Inawashiro1971), which automatically satisfies far-field boundary conditions, the method is no longer iterative and the cost is greatly reduced. Gillis et al. (Reference Gillis, Marichal, Winckelmans and Chatelain2019) apply this method again to the streamfunction in two dimensions and employs it in a viscous VIC method.
In this work we present a grid-based treatment for planar potential flow. The focus of this work is on the flow around point vortices, but the treatment can easily be extended to account for sources and sinks. In the case of the flow around vortices, the treatment follows a VIC approach. In our implementation, the streamfunction–vorticity Poisson equation is solved for the streamfunction on the grid using the lattice Green's function, such that unbounded boundary conditions are accounted for. To enforce the no-penetration condition on surfaces in the flow, the treatment is presented by using the immersed boundary projection method and our implementation is therefore approximately first-order accurate in space (Colonius & Taira Reference Colonius and Taira2008). This approach consists of adding an extra singular vorticity source term to the streamfunction–vorticity Poisson equation that is distributed over the discrete surface points and is smeared onto the nearby grid nodes. This extra vorticity term represents the bound vortex sheet strength and assumes the role of a Lagrange multiplier in this method. The modified Poisson equation combined with the no-penetration constraint then forms a saddle-point system that can be solved with Schur's complement method. Note that the IIM introduces a similar modification to the Poisson equation (Marichal et al. Reference Marichal, Chatelain and Winckelmans2014) and the Sherman–Morrison–Woodbury decomposition can produce an expression for the discrete vortex sheet strength (Gillis et al. Reference Gillis, Marichal, Winckelmans and Chatelain2019) that is equivalent to the formula we obtain by using the Schur complement method. Consequently, one could use the IIM to obtain a second-order method instead. Drawing inspiration from the analytical treatment of the Kutta condition in Biot–Savart methods, this work then introduces a new way of enforcing the Kutta condition in a discrete potential flow treatment by decomposing the discrete vortex sheet strength into a singular and non-singular part and constraining the non-singular part. This amounts to algebraically constraining the system arising from the immersed boundary projection method to make it well behaved.
This paper is structured as follows. We first focus on discretizing the unbounded potential flow problem with point vortices in § 2.1 and then discuss the no-penetration condition in § 2.2. We describe the role of circulation in § 2.3 and introduce the treatment for enforcing the Kutta condition in steady and unsteady flows in § 2.4. We extend the treatment to generalized edge conditions in § 2.5 and introduce methods for computing pressure, impulse and added mass in § 2.6. The extension to multiple bodies is discussed in § 2.7.
2. Methodology
2.1. The basic two-dimensional potential flow problem
A two-dimensional, differentiable velocity field
$\boldsymbol {u}$ on the unbounded domain
$\varOmega = \{ \boldsymbol {x}=(x,y) \}$ can be decomposed according to the Helmholtz decomposition
where
$\phi$ is the scalar potential,
$\psi$ is the streamfunction and
$\boldsymbol {e}_z$ is the unit vector out of the plane. In a potential flow without sources or sinks, this problem can be solved by solving exclusively the governing equation for the streamfunction
where
$\omega$ is the vorticity field, consisting solely of
$N_v$ singular point vortices
\begin{equation} \omega = \sum_{q=1}^{N_v} \varGamma_{v,q} \boldsymbol{\delta}(\boldsymbol{x} - \boldsymbol{X}_q), \end{equation}
where
$\boldsymbol {\delta }$ is the two-dimensional Dirac delta function, and
$\boldsymbol {X}_q = (X_q,Y_q)$ and
$\varGamma _{v,q}$ are the position and strength of the
$q$th point vortex.
Because (2.2) does not account for sources and sinks, one would have to solve the auxiliary Poisson problem for the scalar potential
where
$\varTheta$ is the rate of dilatation, consisting of singular sources and sinks, similar to (2.3). The overall velocity field due to vortices, sinks and sources can then be obtained using the Helmholtz decomposition (2.1).
We now introduce a discrete treatment of this basic potential flow problem and focus on the discrete streamfunction. We consider here a staggered, Cartesian grid with uniform cell size
$\Delta x$ and of infinite extent. The space corresponding to data at cell vertices (nodes) on this grid is denoted by
$\mathcal {N}$, and the physical coordinates of these nodes by
$\boldsymbol{x}_{\mathcal{N}}$ and
$\boldsymbol{y}_{\mathcal{N}}$. Furthermore, we consider a finite number
$N_v$ of Lagrangian, singular point vortices. The space of scalar data on these points is denoted by
$\mathcal {W}^{N_v}$ and we define
$\varGamma _{v} \in \mathcal {W}^{N_v}$ as the vector containing the strengths of the point vortices in our grid-based treatment. The basic (unbounded) potential flow problem is expressed as
where
$\boldsymbol{\mathsf{L}}$ is the discrete 5-point Laplacian operator,
$\boldsymbol{\mathsf{s}} \in \mathcal {N}$ is the discrete streamfunction and
$\boldsymbol{\mathsf{w}} \in \mathcal {N}$ the discrete vorticity. The discrete velocity field
$\boldsymbol{\mathsf{v}}$, whose components lie on the faces of the cells with the corresponding normals, is computed from
$\boldsymbol{\mathsf{s}}$ by the discrete curl operation,
The operator
$\boldsymbol{\mathsf{C}}$ applies centred differences between the nodes to obtain the velocity components at the intermediate centres of cell faces. We denote the space of data that lie on cell faces by
$\mathcal {F}$, so
$\boldsymbol{\mathsf{C}}:\mathcal {N} \mapsto \mathcal {F}$. Figure 1(a) shows the staggered grid structure.
(a) Schematic of the grid and the regularization of data from a Lagrangian point (
$\bullet$) onto the grid with a discrete Dirac delta function of radius two. Symbols (
$\circ$), (
$\square$), (
$|$) and (-) denote the locations holding the components of the nodes
$\mathcal {N}$, cell centres
$\mathcal {C}$, horizontal faces
$\mathcal {F}_x$ and vertical faces
$\mathcal {F}_y$, respectively. Symbols (
$\times$) denote the nodes that are affected by the regularization. (b) Two examples of discrete Dirac delta functions of radius two: the
$M_4'$ function (——) from Monaghan (Reference Monaghan1985) and the smoothed three-point function (- - - -) from Yang et al. (Reference Yang, Zhang, Li and He2009).

The grid differencing operators
$\boldsymbol{\mathsf{L}}$ and
$\boldsymbol{\mathsf{C}}$ and others to be defined are scaled by the grid spacing, and thus represent second-order approximations of the corresponding continuous operators, and the discrete streamfunction
$\boldsymbol{\mathsf{s}}$, vorticity
$\boldsymbol{\mathsf{w}}$ and velocity
$\boldsymbol{\mathsf{v}}$ are each approximations of their continuous counterparts. The total flow circulation is equal to the sum of grid vorticity multiplied by the cell area
$\Delta x^{2}$. To support the work that follows, we define an inner product on the grid nodes
for
$\boldsymbol{\mathsf{w}}_1$,
$\boldsymbol{\mathsf{w}}_2 \in \mathcal {N}$. The total circulation can then be written compactly as
where
$\boldsymbol{\mathsf{1}}_{\mathcal{N}} \in \mathcal {N}$ is a grid vector of ones.
The particular solution of (2.5) can be written down immediately with the help of the lattice Green's function for
$\boldsymbol{\mathsf{L}}$ (Katsura & Inawashiro Reference Katsura and Inawashiro1971; Cserti Reference Cserti2000; Liska & Colonius Reference Liska and Colonius2014). We denote this simply by the inverse operator
It can be shown that, with a suitable truncation of the grid, both
$\boldsymbol{\mathsf{L}}$ and its inverse are symmetric operators. However,
$\boldsymbol{\mathsf{L}}$ is only positive semi-definite, and an additional homogeneous solution,
$\boldsymbol{\mathsf{s}}_{\infty } \in \mathcal {N}$ – for example, corresponding to a uniform flow – can be added to the particular solution of this equation
$-\boldsymbol{\mathsf{L}}^{-1} \boldsymbol{\mathsf{w}} + \boldsymbol{\mathsf{s}}_{\infty }$. This homogeneous solution allows us to satisfy boundary conditions at (discrete) infinity. The size of the domain in our simulations is therefore not relevant, as long as it includes the features that are of interest.
As in the VIC approach (Christiansen Reference Christiansen1973), the discrete vorticity is obtained by immersing the vortex elements into the grid and transferring their circulation to the nearby nodes using a tensor product of two one-dimensional, discrete Dirac delta functions
\begin{equation} \boldsymbol{\mathsf{w}} =
\frac{1}{\Delta x^{2}}\sum_{q=1}^{N_v} \varGamma_{v,q} d
\left(\frac{\boldsymbol{x}_{\mathcal{N}}-X_{q}}{\Delta
x}\right)d\left(\frac{\boldsymbol{y}_{\mathcal{N}}-Y_{q}}{\Delta
x}\right), \end{equation}
where
$d$ is a discrete Dirac delta function. (In particular,
$d(x/\Delta x)/\Delta x$ represents a Dirac sequence as
$\Delta x \rightarrow 0$.) By the properties imposed on
$d$
\begin{equation} {\langle \boldsymbol{\mathsf{1}}_{\mathcal{N}},\boldsymbol{\mathsf{w}} \rangle}_{\mathcal{N}} = \sum_{q=1}^{N_v} \varGamma_{v,q}. \end{equation} In this work,
$d$ is the
$M_4'$ function from Monaghan (Reference Monaghan1985), depicted in figure 1(b); panel (a) depicts how data from a Lagrangian point are regularized onto the grid nodes. For compact notation, we define
$\boldsymbol{\mathsf{d}}_{q} \in \mathcal {N}$, the grid vorticity field generated when a vortex of unit strength is immersed into the grid, so that we can write (2.10) as
\begin{equation} \boldsymbol{\mathsf{w}} = \sum_{q=1}^{N_v} \varGamma_{v,q} \boldsymbol{\mathsf{d}}_{q}. \end{equation}
Even more compactly, we define the regularization operator
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}}_\mathcal {W}: \mathcal {W}^{N_v} \mapsto \mathcal {N}$, whose
$N_v$ columns are
$\boldsymbol{\mathsf{d}}_{q}$,
$q = 1,\ldots,N_v$, which allows us to write (2.12) as
the discrete streamfunction field as
$\boldsymbol{\mathsf{s}} = -\boldsymbol{\mathsf{L}}^{-1} {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}}_\mathcal {W} \varGamma _{v} + \boldsymbol{\mathsf{s}}_{\infty }$ and the velocity field as
Figure 2 shows a spatial grid refinement analysis for a flow consisting of point vortices of random strength that are randomly positioned in the lower-left quadrant of the domain. The analysis verifies that the discretization technique of the Poisson equation is second-order accurate in
$\Delta x$. We compute the error as
$\epsilon _{\boldsymbol{\mathsf{s}}} = \Vert \boldsymbol{\mathsf{s}} - \psi (\boldsymbol{x}_{\mathcal{N}},\boldsymbol{y}_{\mathcal{N}}) \Vert _2 / \Vert \psi (\boldsymbol{x}_{\mathcal{N}},\boldsymbol{y}_{\mathcal{N}}) \Vert _2$, where
$\psi$ is the exact solution for the streamfunction. We only consider the values in the upper-right quadrant of the domain to exclude the positions of the point vortices, because the exact singularities at these positions are not comparable to the regularized, discrete version.
(a) Contours (——) of the discrete streamfunction for randomly positioned point vortices (
$\bullet$) of random strengths, and (b) its error (
$\circ$) over the shaded area for different grid spacings. Overlaid is an error (——) that scales as
$\Delta x^{2}$.

To obtain the velocity at the locations of the point vortices, the discrete velocity field
$\boldsymbol{\mathsf{v}}$ should first be interpolated from cell faces to the nodes (using simple averages). Then, the velocity can be interpolated onto the point vortices with the interpolation operator
$ {\mathcal {W}}{}{\boldsymbol{\mathsf{E}}}_\mathcal {N}: \mathcal {N}\mapsto \mathcal {W}^{N_v}$, which is the transpose of the regularization operator,
$ {\mathcal {W}}{}{\boldsymbol{\mathsf{E}}}_\mathcal {N} = {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}}_\mathcal {W}^{T}$, to obtain an overall interpolation scheme that is consistent with (2.13).
It is worth noting here that, if we wish to include sources and sinks, then we can make additional use of a discrete scalar potential, lying at cell centres,
$\boldsymbol{\phi} \in \mathcal {C}$, whose governing equation is the discretized version of (2.4), analogous to (2.5). The sources and sinks can be immersed into a rate of dilatation field at cell centres in a similar manner to vortices to cell nodes (2.10). The velocity field due to the combination of vortices, sinks and sources can then be composed using the discrete version of the Helmholtz decomposition (2.1)
Analogous to the discrete curl operator, the discrete gradient operator
$\boldsymbol{\mathsf{G}}$ applies centred differences to scalar data at cell centres
$\mathcal {C}$ to obtain the velocity components at the cell faces, so
$\boldsymbol{\mathsf{G}}:\mathcal {C} \mapsto \mathcal {F}$.
2.2. Potential flow with an impenetrable surface
Now, let us suppose we have a rigid impenetrable surface
$\mathcal {S}$, on which we seek to enforce the no-penetration condition for the streamfunction. The no-penetration condition asserts that the normal components of the fluid velocity and this surface velocity must be equal. For rigid bodies, this surface motion can be alternatively described by a streamfunction, and the no-penetration condition in the absence of sources and sinks can be imposed equivalently (in two dimensions) by setting the fluid streamfunction equal to that of the surface
$\psi _b$ up to a uniform value. In continuous form, this is described by the Dirichlet problem
In the presence of sources and sinks, one can again solve the auxiliary problem for the scalar potential and enforce the no-penetration condition only for the flow due to the sources and sinks. The overall velocity field (2.1) then satisfies the no-penetration condition. Note that the boundary value problem for the scalar potential is a Neumann problem and requires a slightly different numerical treatment (Poncet Reference Poncet2009; Gillis et al. Reference Gillis, Winckelmans and Chatelain2018).
The continuous Dirichlet problem (2.16)–(2.17) can be solved via Green's theorem with boundary integrals. We will now solve the discrete version of this equation using the immersed boundary projection method, resulting in completely analogous operations.
2.2.1. Discrete surface and its immersion in the grid
We enforce the no-penetration condition at a finite number
$N_s$ of discrete surface forcing points; the space of scalar data on these Lagrangian points is denoted by
$\mathcal {S}^{N_s}$. In particular, let us define
$\boldsymbol{r}_{x}, \boldsymbol{r}_{y} \in \mathcal {S}^{N_s}$ as the vectors of
$x$ and
$y$ coordinates of the surface points. Each surface point
$p$ is associated with a small straight segment of length
$\Delta S_p$. Some of the calculations will require information about the local surface orientation. For this purpose, we define vectors
$\boldsymbol{\mathsf{n}}_{x}, \boldsymbol{\mathsf{n}}_{y} \in \mathcal {S}^{N_s}$ of components of the discrete surface unit normals. We also define the space
$\mathcal {V}^{N_s}$ to hold vector-valued data, such as velocity, on the immersed surface points. For convenience, let us also define unit vectors
$\boldsymbol{\mathsf{e}}_{p}$ on this space, equal to 1 at surface point
$p$ (
$1 \leqslant p \leqslant N_s$) and zero at every other point. For example, the
$x$ coordinate of point
$p$ is picked out of the vector
$\boldsymbol{r}_{x}$ by projection onto the
$p$th unit vector
Each of the surface point spaces has an associated inner product that includes the surface length, e.g.
for any
$\boldsymbol{\mathsf{g}}_1, \boldsymbol{\mathsf{g}}_2 \in \mathcal {S}^{N_s}$, so that the inner product approximates a surface integral. Another vector we will make substantial use of in this paper is
$\boldsymbol{\mathsf{1}}_{\mathcal{S}} \in \mathcal {S}^{N_s}$, a vector of ones on all surface points.
From any vector
$\boldsymbol{\mathsf{g}} \in \mathcal {S}^{N_s}$, we can also form a diagonal
$N_s\times N_s$ operator
$\boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{g}}}$ with the entries of the vector along the diagonal. When this operator acts upon another vector
$\boldsymbol{\mathsf{h}}\in \mathcal {S}^{N_s}$, it represents the Hadamard (i.e. element-by-element) product of the two vectors,
$\boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{g}}} \boldsymbol{\mathsf{h}} = \boldsymbol{\mathsf{g}}\circ \boldsymbol{\mathsf{h}} \in \mathcal {S}^{N_s}$. Note that
$\boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{g}}}\boldsymbol{\mathsf{h}} = \boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{h}}} {\boldsymbol{\mathsf{g}}}$, and that
$\boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{g}}}\boldsymbol{\mathsf{1}}_{\mathcal{S}} = \boldsymbol{\mathsf{g}}$.
Similar to (2.13), surface data are immersed into the grid with the regularization operator
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}}: \mathcal {S}^{N_s} \mapsto \mathcal {N}$. Grid data are interpolated onto the surface points with the interpolation operator
$ {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {N}}: \mathcal {N}\mapsto \mathcal {S}^{N_s}$;
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}}$ can be constructed (and we will assume it has) so that it is the transpose of the interpolation operator,
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}} = {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {N}}^{T}$, with respect to the grid and surface inner products defined in this paper. Furthermore, note that
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}}$ and
$ {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {N}}$ can be constructed with a different choice for the discrete Dirac delta function than the one used for the vortex regularization. In this work, we use the smoothed three-point function from Yang et al. (Reference Yang, Zhang, Li and He2009) (figure 1) and we use a uniform spacing between the surface points.
2.2.2. The immersed surface potential flow problem
The surface's motion is specified by a velocity distribution
$\boldsymbol {v}_{b}$, represented discretely by components
$\boldsymbol{\mathsf{v}}_{b,x}, \boldsymbol{\mathsf{v}}_{b,y} \in \mathcal {S}^{N_s}$. For rigid bodies, this surface motion can be described by a streamfunction. Specifically, translation at velocity
$(U,V)$ and rotation at angular velocity
$\varOmega$ would be described equivalently by velocity components
or by a surface streamfunction
$\boldsymbol{\mathsf{s}}_{b} \in \mathcal {S}^{N_s}$
The no-penetration condition can be imposed by setting the discrete streamfunction equal to that of the surface, up to a uniform value,
$\boldsymbol{\mathsf{s}}_{0} \in \mathcal {S}^{N_s}$
For later shorthand, we will denote the difference between the body motion streamfunction and interpolated uniform flow streamfunction by
$\boldsymbol{\mathsf{s}}'_{b} \equiv \boldsymbol{\mathsf{s}}_{b} - {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {N}} \boldsymbol{\mathsf{s}}_{\infty }$. This modified streamfunction simply consists of subtracting the components
$(U_\infty,V_\infty )$ of the uniform flow from
$(U,V)$ in (2.21). The uniform value
$\boldsymbol{\mathsf{s}}_{0}$ is left unspecified and will later serve the role of enforcing a constraint on circulation. For now, we will suppose that it can be set arbitrarily.
The no-penetration constraint is enforced in the basic potential flow problem (2.5) with the help of a vector of Lagrange multipliers,
$\boldsymbol{\mathsf{f}} \in \mathcal {S}^{N_s}$, on the surface points. The modified potential flow problem is thus
In fact, by simple comparison with the vorticity
$\boldsymbol{\mathsf{w}}$, it is clear that the vector
$\boldsymbol{\mathsf{f}}$ represents the strength of the discrete bound vortex sheet on the surface and serves as another source term of the Poisson equation. Suppose we consider the bound vortex sheet
$\gamma (u)$ that emerges from the analogous continuous problem on the undiscretized surface, where
$u$ is the arc-length parameter along the surface. At each point
$p$, the discrete solution
$\boldsymbol{\mathsf{f}}$ is approximately equal to this continuous solution
The vector of Lagrange multipliers
$\boldsymbol{\mathsf{f}}$ is initially unknown. Thus, the potential flow problem in the presence of the impenetrable surface is
This problem (2.25) has the structure of a generic saddle-point problem (Benzi, Golub & Liesen Reference Benzi, Golub and Liesen2005). We will encounter many such systems in this work, so in Appendix A we summarize a solution approach, based on block-LU (LU, lower-upper) decomposition. The generated solution algorithm of (2.25) is
where the Schur complement
$\boldsymbol{\mathsf{S}}$ is
Based on the properties of the matrices comprising
$\boldsymbol{\mathsf{S}}$, this operator is symmetric and negative definite, and therefore invertible. Its inverse
$\boldsymbol{\mathsf{S}}^{-1}$, also symmetric, maps a surface distribution of streamfunction to a corresponding bound vortex sheet strength. Note that the computation of
$\boldsymbol{\mathsf{f}}$ through
$\boldsymbol{\mathsf{S}}^{-1}$ is sensitive to both the ratio of discrete surface spacing to the grid spacing
$\Delta S/\Delta x$ and the choice of discrete Dirac delta function. On the one hand, small values for
$\Delta S/\Delta x$ and discrete Dirac delta functions with small support generally both lead to more high-frequency noise in
$\boldsymbol{\mathsf{f}}$. This is because the underlying continuous problem for
$\boldsymbol{\mathsf{S}}^{-1}$ is a Fredholm integral equation of the first kind, which is ill posed. As a result, the discrete analogue problem is poorly conditioned (Goza et al. Reference Goza, Liska, Morley and Colonius2016). On the other hand, values for
$\Delta S/\Delta x$ that are too high can lead to streamlines penetrating a surface. We found that values between one to four can provide a good balance between the smoothness of
$\boldsymbol{\mathsf{f}}$ and the accuracy of the streamlines near a surface.
We can describe this algorithm in words: first, solve for the intermediate streamfunction field, associated with vorticity in the fluid, but without regard for the presence of the surface. Second, find the bound vortex sheet whose associated streamfunction cancels the difference between the specified streamfunction on the surface and the intermediate streamfunction evaluated on the surface. Finally, correct the intermediate streamfunction field for the influence of the bound vortex sheet. A version of the Julia code that implements this algorithm, as well as the algorithms in the following sections, are available in the authors’ Github repository (Beckers & Eldredge Reference Beckers and Eldredge2021).
We give two examples of the streamfunction with a body present and show the associated vortex sheet strength. Figure 3 shows a vortex near a circular cylinder and figure 4 shows a circular cylinder that translates horizontally. In both cases, the vortex sheet strength is in good agreement with the analytical solution from potential flow theory.
(a) Contours (——) of the discrete streamfunction for a point vortex (
$\bullet$) with strength
$\varGamma _{v,1}$ at
$(R_v,0)$ near a circular cylinder of radius
$R_c$ and with a bound circulation
$-\varGamma _{v,1}$. The inset shows a closeup of the nodes (
$\circ$) and surface points (
$\blacksquare$) in the boxed area (- - - -). (b) The scaled discrete vortex sheet strength (——) as a function of the angle
$\theta$ measured counter-clockwise from the positive
$x$-axis. Here,
$k=1$ corresponds to the right-most point on the surface and increases counter-clockwise. Overlaid is the exact continuous solution (- - - -, red dashed). The simulation is performed with
$R_v/R_c = 3/2$,
$\Delta x/R_c=0.03$ and
$\Delta S/\Delta x=2$.

(a) Contours (——) of the discrete streamfunction for a horizontally translating circular cylinder with radius
$R$, and (b) its scaled discrete vortex sheet strength (——). Overlaid is the exact continuous solution (- - - -, red dashed). The simulation is performed with
$\Delta x/R=0.03$ and
$\Delta S/\Delta x=2$.

For later use, we note that the solution of (2.25) can also be written in inverse form using (A7)
The matrix operator in (2.30) is the inverse of the basic saddle-point system.
2.3. Non-uniqueness and discrete circulation
In two-dimensional potential flows, there is no unique solution to problem (2.25), since one can choose any value for the uniform value
$\boldsymbol{\mathsf{s}}_{0}$ and still enforce the no-penetration condition. Equivalently, we can specify any circulation about the body and still enforce this condition. Let us determine the relationship between
$\boldsymbol{\mathsf{s}}_{0}$ and circulation. For later use, let us write this uniform surface streamfunction as
$\boldsymbol{\mathsf{s}}_{0} = s_{0}\boldsymbol{\mathsf{1}}_{\mathcal{S}}$, where
$s_{0}$ is a single scalar value. The discrete circulation
$\varGamma _{b}$ about the body is given by the sum of the bound vortex sheet data and can be written compactly as
The discrete circulation of the vortex sheet in the solution (2.27) is
Note that we can obtain the same expression if we would use
$s_{0}$ as a Lagrange multiplier to enforce the constraint (2.31) as
\begin{equation} \begin{bmatrix} \boldsymbol{\mathsf{L}} & {\mathcal{N}}{}{\boldsymbol{\mathsf{R}}_\mathcal{S}} & 0 \\ {\mathcal{S}}{}{\boldsymbol{\mathsf{E}}_\mathcal{N}} & 0 & \boldsymbol{\mathsf{1}}_{\mathcal{S}} \\ 0 & \boldsymbol{\mathsf{1}}_{\mathcal{S}}^{T} \boldsymbol{\mathsf{D}}_{\Delta S} & 0 \end{bmatrix} \begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \boldsymbol{\mathsf{f}} \\ s_{0} \end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{w}} \\ \boldsymbol{\mathsf{s}}'_{b} \\ \varGamma_{b} \end{pmatrix}, \end{equation}
where we use the fact that the inner product
${\langle \boldsymbol{\mathsf{1}}_{\mathcal{S}},\boldsymbol{\mathsf{f}} \rangle }_{\mathcal {S}^{N_s}}$ can, by its definition, be rewritten as
$\boldsymbol{\mathsf{1}}_{\mathcal{S}}^{T} \boldsymbol{\mathsf{D}}_{\Delta S}\, \boldsymbol{\mathsf{f}}$. Here,
$\boldsymbol{\mathsf{D}}_{\Delta S}$ is a diagonal matrix containing the surface element arc lengths. We will use
$s_{0}$ in a similar way in the next section to enforce the Kutta condition and demonstrate how to solve the associated saddle-point system.
The scalar factor
${\langle \boldsymbol{\mathsf{1}}_{\mathcal{S}},\boldsymbol{\mathsf{S}}^{-1} \boldsymbol{\mathsf{1}}_{\mathcal{S}} \rangle }_{\mathcal {S}^{N_s}}$ in expression (2.32) is a property of the set of points and their immersion into the Cartesian grid. Part of this factor,
$\boldsymbol{\mathsf{S}}^{-1} \boldsymbol{\mathsf{1}}_{\mathcal{S}}$, represents the bound vortex sheet strength associated with a uniform, unit-strength streamfunction on the surface. This sheet has a particularly important role in some of the discussion to follow, so we will denote its strength by
$\boldsymbol{\mathsf{f}}_{0}$:
The transpose of
$\boldsymbol{\mathsf{f}}_{0}$, equal to
$\boldsymbol{\mathsf{1}}_{\mathcal{S}}^{T}\boldsymbol{\mathsf{S}}^{-1}$, calculates the circulation of the associated bound vortex sheet when it acts upon a surface streamfunction. Thus, the factor
${\langle \boldsymbol{\mathsf{1}}_{\mathcal{S}},\boldsymbol{\mathsf{S}}^{-1} \boldsymbol{\mathsf{1}}_{\mathcal{S}} \rangle }_{\mathcal {S}^{N_s}}$ is the circulation associated with a uniform, unit-strength surface streamfunction. We will refer to this as
$\varGamma _{0}$:
We can rewrite the inner product
${\langle\, \boldsymbol{\mathsf{f}}_{0},\boldsymbol{\mathsf{1}}_{\mathcal{S}} \rangle }_{\mathcal {S}^{N_s}}$ as
$\boldsymbol{\mathsf{f}}_{0}^{T} \boldsymbol{\mathsf{D}}_{\Delta S} \boldsymbol{\mathsf{1}}_{\mathcal{S}}$, and we will define
$\hat {\boldsymbol{f}_{0}} = \boldsymbol{\mathsf{D}}_{\Delta S}\, \boldsymbol{\mathsf{f}}_{0}$, for shorthand in what follows. By this notation,
$\varGamma _{0} = \hat {{f}_{0}}^{T} \boldsymbol{\mathsf{1}}_{\mathcal{S}}$, and
$\hat {{f}_{0}}^{T}$ applied to any surface streamfunction yields the corresponding circulation.
Figure 5 shows the distribution of
$\boldsymbol{\mathsf{f}}_{0}$ for elliptical cylinders with different aspect ratios. For a circular cylinder, the flow due to a uniform streamfunction on the body corresponds to the flow when the cylinder is replaced by a point vortex at its centre. The streamlines are concentric circles and the tangential velocity is constant at a given radius. The resulting vortex sheet strength
$\boldsymbol{\mathsf{f}}_{0}$ therefore assumes a uniform distribution. The figure also demonstrates that, when the aspect ratio increases, the distribution gradually shows stronger variations near the edges of the major axis, corresponding to an acceleration and deceleration of the flow when it passes those edges. The distribution eventually turns singular at the edges of a flat plate as the flow now has to navigate around a sharp corner, which will be discussed in more detail in the next section. To clearly illustrate the emergence of the singularities, the simulations in this figure are performed with an extremely fine grid (
$\Delta x/R=0.004$). Note that such fine grids are not needed in general, as is demonstrated by the other figures in this work.
(a) Geometry and (b) the scaled bound vortex sheet strength
$\boldsymbol{\mathsf{f}}_{0}$, associated with a uniform, unit-strength streamfunction, as a function of the surface point index
$p$ divided by the number of surface points
$N_s$ for elliptical cylinders with different aspect ratios (
$AR$):
$\cdot \cdot \cdot \cdot \cdot \,\cdot$,
$AR = 1$; - - - - (red dashed),
$AR = 2$; – – – (blue broken dashed),
$AR = 3$; —— (green solid line),
$AR = \infty$ (flat plate). The simulations are performed with
$\Delta x/R=0.004$ and
$\Delta S/\Delta x=3$.

The last term in (2.32) illustrates the direct relationship between the scalar value
$s_{0}$ and the bound circulation
$\varGamma _{b}$, and we identified
$s_{0}$ as a means of setting the circulation. Before we use it in the next section to enforce the Kutta condition, we will use it here for an immediate purpose. The prescribed surface streamfunction
$\boldsymbol{\mathsf{s}}'_{b}$ (given by (2.21), with the uniform flow accounted for) may have some associated bound circulation, and it is desirable to adjust it by adding or subtracting a uniform value so that it has none. Equation (2.32) suggests that this circulation can be removed by setting
$s_{0}$ to
${\langle \boldsymbol{\mathsf{1}}_{\mathcal{S}}, \boldsymbol{\mathsf{S}}^{-1}\boldsymbol{\mathsf{s}}'_{b} \rangle }_{\mathcal {S}^{N_s}}/\varGamma _{0}\equiv \hat {{f}_{0}}^{T} \boldsymbol{\mathsf{s}}'_{b}/\varGamma _{0}$ and then subtracting this value (multiplied by the uniform vector
$\boldsymbol{\mathsf{1}}_{\mathcal{S}}$) from
$\boldsymbol{\mathsf{s}}'_{b}$. Overall, this process can be encapsulated in a circulation removal operator,
$\boldsymbol{\mathsf{P}}^{\varGamma }$, that acts upon a surface streamfunction,
$\boldsymbol{\mathsf{q}} \in \mathcal {S}^{N_s}$
\begin{equation} \boldsymbol{\mathsf{P}}^{\varGamma} \equiv \boldsymbol{\mathsf{I}} - \frac{\boldsymbol{\mathsf{1}}_{\mathcal{S}} \hat{{f}_{0}}^{T}}{\varGamma_{0}}. \end{equation}
It is easy to verify that
${\langle \boldsymbol{\mathsf{S}}^{-1}\boldsymbol{\mathsf{1}}_{\mathcal{S}},\boldsymbol{\mathsf{P}}^{\varGamma } \boldsymbol{\mathsf{q}} \rangle }_{\mathcal {S}^{N_s}} = \hat {{f}_{0}}^{T} \boldsymbol{\mathsf{P}}^{\varGamma } \boldsymbol{\mathsf{q}} = 0$ for any
$\boldsymbol{\mathsf{q}} \in \mathcal {S}^{N_s}$, so that the circulation of any surface streamfunction acted upon by
$\boldsymbol{\mathsf{P}}^{\varGamma }$ is indeed zero. It is important to observe, also, that
$\boldsymbol{\mathsf{s}}'_{b}$ can be replaced by
$\boldsymbol{\mathsf{P}}^{\varGamma } \boldsymbol{\mathsf{s}}'_{b}$ without affecting the nature of the no-penetration condition. We also note that the composite operator
$\boldsymbol{\mathsf{S}}^{-1}\boldsymbol{\mathsf{P}}^{\varGamma }$ is symmetric, just as
$\boldsymbol{\mathsf{S}}^{-1}$ is, since
2.4. The Kutta condition
For surfaces that contain convex edges, the vortex sheet strength assumes a singular behaviour in the vicinity of these edges, with a strength that depends on the interior angle of the edge: sharper edges have more singular behaviour. In the discrete representation of the surface, edges are only approximately represented by the sudden disruptions of positions in clusters of adjacent points, without any information about the surface normals. The behaviour in this discrete form is not quite singular, but the solution of (2.27) nonetheless exhibits a large and rapid change of amplitude.
If we seek to eliminate this behaviour, we must first have some means of exposing it. In fact, for any discretized surface, the essence of this nearly singular behaviour lies in the vector
$\boldsymbol{\mathsf{f}}_{0}$, and all other bound vortex sheets associated with the same surface share the same nearly singular behaviour. Thus, we will use a multiplicative decomposition of the vortex sheet strength
where
$\circ$ is the Hadamard product. This decomposed form isolates the singular behaviour into
$\boldsymbol{\mathsf{f}}_{0}$, and
$\tilde {\boldsymbol{\mathsf{f}}}$ is a relatively smoother vector of surface point data. In the regularization operation on
$\boldsymbol{\mathsf{f}}$, we can absorb
$\boldsymbol{\mathsf{f}}_{0}$ into
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}}$, first noting that the Hadamard product can alternatively be written with the help of a diagonal matrix
Then, we can define a re-scaled regularization operator
The re-scaled operator
$ {\mathcal {N}}{}{\tilde {\boldsymbol{\mathsf{R}}}_\mathcal {S}} = {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}} \boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{f}}_{0}}$ can, in turn, be absorbed into the Schur complement, defining
$\tilde {\boldsymbol{\mathsf{S}}} = - {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {N}} \boldsymbol{\mathsf{L}}^{-1} {\mathcal {N}}{}{\tilde {\boldsymbol{\mathsf{R}}}_\mathcal {S}} = \boldsymbol{\mathsf{S}} \boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{f}}_{0}}$. A useful property of
$\tilde {\boldsymbol{\mathsf{S}}}$ is that it preserves uniform vectors
The decomposition of the vortex sheet strength is demonstrated in figure 6 for a flat plate in a uniform flow. We plot the vortex sheet strength against the scaled coordinate
$\xi$, which varies along the plate from
$-1$ at the leading edge to
$1$ at the trailing edge. As expected, the vortex sheet strength
$\boldsymbol{\mathsf{f}}$ shows large amplitude variations at the sharp leading and trailing edges, corresponding to the singularities in the distribution of the continuous vortex sheet strength. By use of decomposition (2.38), these discrete singularities are retained in
$\boldsymbol{\mathsf{f}}_{0}$ and we are left with a non-singular
$\tilde {\boldsymbol{\mathsf{f}}}$, which varies almost linearly with
$\xi$.
(a) Contours (——) of the discrete streamfunction for a flat plate of length
$c$, at
$30^{\circ }$ in a uniform flow
$U_\infty$ without enforcement of the Kutta condition. The inset shows a closeup of the nodes (
$\circ$) and surface points (
$\blacksquare$) in the boxed area (- - - -). The point-wise product of (b) the discrete vortex sheet strength associated with a uniform, unit-strength streamfunction on the body, and (c) the non-singular vector that results from re-scaling the regularization operator, composes (d) the discrete vortex sheet strength. Overlaid is the exact continuous solution (- - - -, red dashed). The simulation is performed with
$\Delta x/c=0.01$ and
$\Delta S/\Delta x=2$.

The Kutta condition corresponds to annihilating the nearly singular behaviour at a surface point. At such points, we will set the corresponding value of
$\tilde {\boldsymbol{\mathsf{f}}}$ to zero. Suppose we wish to enforce the Kutta condition at an edge corresponding to surface point
$k$. The condition is
2.4.1. Using the Kutta condition in a steady-state problem
We will first take the steady-state approach to enforce the Kutta condition: allow the bound circulation to be set appropriately, with the implicit understanding that there is a starting vortex of equal and opposite circulation at infinity that preserves the Kelvin circulation theorem. The Lagrange multiplier for this constraint will not be
$\varGamma _{b}$, but
$s_{0}$, similar to (2.33). We also use the circulation removal operator to adjust the imposed surface streamfunction
\begin{equation} \begin{bmatrix} \boldsymbol{\mathsf{L}} & {\mathcal{N}}{}{\tilde{\boldsymbol{\mathsf{R}}}_\mathcal{S}} & 0 \\ {\mathcal{S}}{}{\boldsymbol{\mathsf{E}}_\mathcal{N}} & 0 & \boldsymbol{\mathsf{1}}_{\mathcal{S}} \\ 0 & \boldsymbol{\mathsf{e}}_{k}^{T} & 0 \end{bmatrix} \begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \tilde{\boldsymbol{\mathsf{f}}} \\ s_{0} \end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{w}} \\ \boldsymbol{\mathsf{P}}^{\varGamma}\boldsymbol{\mathsf{s}}'_{b} \\ 0 \end{pmatrix}. \end{equation} This block system, like the earlier one in (2.25), has a saddle-point form, and we can reduce it by the same block-LU decomposition to develop a solution algorithm. We will interpret it in the general form (A3), with the upper-left
$2\times 2$ block taking the role of
$\mathcal {A}$, the solution vector
$\boldsymbol{\mathsf{x}}$ and constraint force
$\boldsymbol{\mathsf{y}}$ set, respectively, to
the remaining operators set to
and the right-hand side vectors set to
We note that block
$\mathcal {A}$ has the original form of the system before the Kutta constraint (2.25), although with the slight modification of a re-scaled regularization operator, and we already have the inverse of
$\mathcal {A}$ available from (2.30). The solution of this original system forms the intermediate solution of the full system endowed with the Kutta condition
Then, using the general procedure outlined in Appendix A, the solution of the full system (2.43) is easy to develop; its Schur complement is simply
Applying the general solution equations, and using the property (2.41a,b) to simplify the resulting operators, it can be shown that the solution is
\begin{gather}\begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \,\tilde{\boldsymbol{\mathsf{f}}} \end{pmatrix} = \begin{pmatrix} \boldsymbol{\mathsf{s}}^{*} \\ \,\tilde{\boldsymbol{\mathsf{f}}}^{*} \end{pmatrix} - \begin{bmatrix} -\boldsymbol{\mathsf{L}}^{{-}1}{\mathcal{N}}{}{\tilde{\boldsymbol{\mathsf{R}}}_\mathcal{S}} \boldsymbol{\mathsf{1}}_{\mathcal{S}}\\ \boldsymbol{\mathsf{1}}_{\mathcal{S}}\end{bmatrix} \boldsymbol{\mathsf{e}}_{k}^{T} \tilde{\boldsymbol{\mathsf{f}}}^{*}. \end{gather}The entire solution can be written more compactly as
where we have defined the Kutta projection operator,
which acts upon the (non-singular part of the) bound vortex sheet vector, subtracting the value at point
$k$ from every point, including at
$k$ itself.
Note that the Lagrange multiplier for the Kutta condition takes the simple value given by (2.49), revealing that the additional streamfunction on the surface is exactly the value of the intermediate bound vortex sheet at the Kutta point
$k$.
The application of the Kutta condition to a steady-state problem is demonstrated in figure 7 on the flat plate problem that was introduced in the previous section. By constraining the trailing edge point of
$\tilde {\boldsymbol{\mathsf{f}}}$, its whole distribution is shifted upward such that the trailing edge value equals zero. The resulting streamfunction indicates that the flow then indeed leaves the trailing edge smoothly.
(a) Contours (——) of the steady, discrete streamfunction for a flat plate of length
$c$ at
$30^{\circ }$ in a uniform flow with enforcement of the Kutta condition at the trailing edge. (b) Zoomed-in image of the leading edge showing the streamlines for three values of the streamfunction, (c) the non-singular part of the associated discrete vortex sheet strength for
$\Delta x/c=0.01$ with an inset enlarging the boxed area (— — —) and (d) the variation of its error with grid spacing for different values for
$\Delta S/\Delta x$:
$\cdot \cdot \cdot \cdot \cdot \,\cdot$, and
$\diamond$,
$\Delta S/\Delta x=1$; – – – (broken dashed blue) and
$\square$ (blue),
$\Delta S/\Delta x=2$; - - - - (green dashed) and
$\circ$ (green),
$\Delta S/\Delta x=3$; —— (red solid line) and
$\triangle$ (red),
$\Delta S/\Delta x=4$. Overlaid is an error (——) that scales as
$\Delta x$.

Figure 7 also shows a spatial grid refinement analysis of the non-singular part of the vortex sheet strength. For this analysis, we can use a multiplicative decomposition for the continuous vortex sheet strength,
$\gamma (\xi ) = \gamma _0(\xi ) \tilde {\gamma }(\xi )$, analogous to (2.38). The continuous counterpart of
$\boldsymbol{\mathsf{f}}_{0}$ can be found as the bound vortex sheet strength of a circular cylinder with a point vortex of strength
$\varGamma _{0}$ at its centre, conformally mapped to a flat plate. Due to the definition of
$\boldsymbol{\mathsf{f}}_{0}$, the circulation
$\varGamma _{0}$ depends on the grid spacing. Therefore, if we define
$\gamma _0$ as the continuous counterpart of
$\boldsymbol{\mathsf{f}}_{0}/\varGamma _{0}$, we obtain the grid-independent solution
$\tilde {\gamma }(\xi ) = - {\rm \pi}c U_\infty \sin (\alpha ) (1-\xi )$ as the continuous counterpart of
$\varGamma _{0}\,\tilde {\boldsymbol{\mathsf{f}}}$ for a flat plate with the Kutta condition enforced. We can then define the error for the non-singular part of the vortex sheet strength as
$\epsilon _{\varGamma _{0}\,\tilde {\boldsymbol{\mathsf{f}}}} = \Vert \varGamma _{0}\,\tilde {\boldsymbol{\mathsf{f}}} - \tilde {\gamma }(\xi (\boldsymbol{r}_{x},\boldsymbol{r}_{y})\Vert _2 / \Vert \tilde {\gamma }(\xi (\boldsymbol{r}_{x},\boldsymbol{r}_{y})\Vert _2$. The refinement analysis verifies that the immersed boundary projection method using the vortex sheet strength decomposition is approximately first-order accurate in
$\Delta x$. Furthermore, the figure shows the streamlines near the plate, the vortex sheet strength and the error for four different values of
$\Delta S/\Delta x$. These confirm that a lower value increases the noise in the vortex sheet strength, but a higher value can lead to the streamlines penetrating the surface, as discussed previously.
2.4.2. Using the Kutta condition to set a new vortex element
In the previous section, we used the Kutta condition to set the bound circulation but did not explicitly create a new vortex element. This vortex element was assumed to lie at infinity so that its effect was negligible except insofar as it left equal but opposite circulation about the body.
In this section, we will create a new vortex element in the vicinity of the edge at which we are applying the Kutta condition. We will thus seek to establish the strength of this new element and to do so in such a manner that the overall circulation of the flow is conserved. Once the element is created, it will be allowed to advect with the local fluid velocity.
Let us assume that the new vortex element (which we label with the subscript 1) is introduced at some point in physical space, and that its immersion into the Cartesian grid is described by
$\boldsymbol{\mathsf{d}}_{1}$ and that its strength (i.e. its circulation) is
$\varGamma _{v,1}$. Thus, the fluid vorticity after this new element's introduction can be written as
The Kutta condition (2.42) is still to be enforced. We also seek to ensure that the total circulation is zero to satisfy Kelvin's circulation theorem. (We are assuming that the flow has started from rest.) Let us denote the circulation of the existing fluid vorticity
$\boldsymbol{\mathsf{w}}$ by
Then, the circulation constraint is
The circulation of the bound vortex sheet
$\boldsymbol{\mathsf{f}}$ can be re-written in terms of the non-singular part of the sheet as
${\langle \boldsymbol{\mathsf{1}}_{\mathcal{S}},\boldsymbol{\mathsf{f}} \rangle }_{\mathcal {S}^{N_s}} = {\langle\, \boldsymbol{\mathsf{f}}_{0},\tilde {\boldsymbol{\mathsf{f}}} \rangle }_{\mathcal {S}^{N_s}} = \,\hat {{f}_{0}}^{T} \tilde {\boldsymbol{\mathsf{f}}}$.
With these two constraints, the overall saddle-point system of equations is
\begin{equation} \begin{bmatrix} \boldsymbol{\mathsf{L}} & {\mathcal{N}}{}{\tilde{\boldsymbol{\mathsf{R}}}_\mathcal{S}} & 0 & \boldsymbol{\mathsf{d}}_{1} \\ {\mathcal{S}}{}{\boldsymbol{\mathsf{E}}_\mathcal{N}} & 0 & \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 0\\ 0 & \boldsymbol{\mathsf{e}}_{k}^{T} & 0 & 0 \\ 0 & \hat{{f}_{0}}^{T} & 0 & 1 \end{bmatrix} \begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \tilde{\boldsymbol{\mathsf{f}}} \\ s_{0} \\ \varGamma_{v,1} \end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{w}} \\ \boldsymbol{\mathsf{P}}^{\varGamma}\boldsymbol{\mathsf{s}}'_{b} \\ 0 \\ -\varGamma_{\boldsymbol{\mathsf{w}}} \end{pmatrix}. \end{equation}
Again, the basic saddle-point matrix constitutes the upper left
$2\times 2$ block
$\mathcal {A}$ and the solution vector
$\boldsymbol{x}_{\mathcal{N}}$ is as before. The constraint force vector is
and the remaining vectors and operators are now
\begin{equation} \boldsymbol{\mathsf{r}}_{\boldsymbol{\mathsf{2}}} = \begin{pmatrix} 0 \\ -\varGamma_{\boldsymbol{\mathsf{w}}} \end{pmatrix},\quad \mathcal{B}_{2} = \begin{bmatrix} 0 & \boldsymbol{\mathsf{e}}_{k}^{T} \\ 0 & \hat{{f}_{0}}^{T} \end{bmatrix}, \quad \mathcal{B}_{1}^{T} = \begin{bmatrix} 0 & \boldsymbol{\mathsf{d}}_{1} \\ \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 0\end{bmatrix},\quad \mathcal{C} ={-}\begin{bmatrix} 0 & 0 \\ 0 & 1\end{bmatrix}. \end{equation} The solution algorithm follows, once again, from the equations in Appendix A. After carrying out the block matrix multiplications, it can be shown that the Schur complement (A2) is the
$2\times 2$ matrix
\begin{equation} \mathcal{S} = \begin{bmatrix} -1 & \boldsymbol{\mathsf{e}}_{k}^{T} \tilde{\boldsymbol{f}}_{1} \\ -\hat{{f}_{0}}^{T} \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 1+\hat{{f}_{0}}^{T} \tilde{\boldsymbol{f}}_{1}, \end{bmatrix} \end{equation}where, for convenience, we have defined
which represents the (non-singular part of the) strength of the vortex sheet that ‘reacts’ to the presence of a unit-strength vortex
$\boldsymbol{\mathsf{d}}_{1}$ immersed into the grid, cancelling that vortex's induced velocity on the surface. The term
$\hat {{f}_{0}}^{T} \tilde {\boldsymbol{f}}_{1}$ represents this sheet's bound circulation and
$\boldsymbol{\mathsf{e}}_{k}^{T} \tilde {\boldsymbol{f}}_{1}$ is its contribution to the Kutta condition at point
$k$. The problem (A6) for the constraint forces
$s_{0}$ and
$\varGamma _{v,1}$ is then
\begin{equation} \begin{bmatrix} -1 & \boldsymbol{\mathsf{e}}_{k}^{T} \tilde{\boldsymbol{f}}_{1} \\ -\hat{{f}_{0}}^{T} \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 1+\hat{{f}_{0}}^{T} \tilde{\boldsymbol{f}}_{1}, \end{bmatrix} \begin{pmatrix} s_{0} \\ \varGamma_{v,1}\end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{e}}_{k}^{T} \tilde{\boldsymbol{\mathsf{f}}}^{*} \\ -\varGamma_{\boldsymbol{\mathsf{w}}} - \hat{{f}_{0}}^{T} \tilde{\boldsymbol{\mathsf{f}}}^{*} \end{pmatrix}, \end{equation}
where the intermediate solution
$\tilde {\boldsymbol{\mathsf{f}}}^{*}$ is available from (2.47a,b).
The determinant of this Schur complement matrix is
$-1 - \hat {{f}_{0}}^{T} \boldsymbol{\mathsf{P}}^{K}_{k} \tilde {\boldsymbol{f}}_{1}$, which represents the negative of the circulation of the unit vortex and its associated vortex sheet, after the Kutta condition has been enforced on this sheet. It is straightforward then to calculate the strength of the new vortex
$\varGamma _{v,1}$ and the additional uniform surface streamfunction,
$s_{0}$
\begin{equation} \varGamma_{v,1} = \frac{-\varGamma_{\boldsymbol{\mathsf{w}}} - \hat{{f}_{0}}^{T} \boldsymbol{\mathsf{P}}^{K}_{k} \tilde{\boldsymbol{\mathsf{f}}}^{*}}{1 + \hat{{f}_{0}}^{T} \boldsymbol{\mathsf{P}}^{K}_{k} \tilde{\boldsymbol{f}}_{1}},\quad s_{0} = \boldsymbol{\mathsf{e}}_{k}^{T} (\tilde{\boldsymbol{\mathsf{\,f}}}^{*} + \varGamma_{v,1}\tilde{\boldsymbol{\,f}}_{1}). \end{equation}From these, we can then obtain the vortex sheet strength and the fluid streamfunction,
The intermediate solution, which corresponds to the flow associated with existing vorticity, is corrected here with the new vortex
$1$ to enforce the Kutta condition at the point
$k$.
We now first demonstrate the enforcement of the Kutta condition in unsteady flow on the flat plate problem with a point vortex near the trailing edge to enforce the Kutta condition at that edge. We position the point vortex at a distance
$10 \Delta t U_{\infty }$ from the edge in the direction of the free stream, perpendicular to the plate. Figure 8 demonstrates that, because of the proximity of the point vortex to the flat plate,
$\tilde {\boldsymbol{\mathsf{f}}}$ exhibits a quick variation at the surface points that lie closest to the point vortex. The value at the trailing edge point itself is still constrained to zero and the flow again leaves the edge smoothly. This situation corresponds to the flow right after impulsively starting a uniform flow around a flat plate and the point vortex now represents the starting vortex. The second demonstration of the method (figure 9) is the repeated enforcement of the Kutta condition on a NACA0012 airfoil while advancing the positions of the point vortices in time after impulsively starting the flow. This simulation, and all following simulations, use forward Euler time stepping, unless noted otherwise, and new point vortices are inserted at one third of the way from the edge to the last released vortex from that edge. The streamlines in the figure show that a strong initial vortex and weaker subsequent vortices were created and convected downstream. In turn, at each time step, the airfoil obtained a circulation that enforces the Kutta condition.
(a) Contours (——) of the unsteady, discrete streamfunction for a flat plate of length
$c$ at
$30^{\circ }$ in a uniform flow with release of vorticity into a point vortex (
$\bullet$) for enforcement of the Kutta condition at the trailing edge. (b) The non-singular part of the associated discrete vortex sheet strength. The simulation is performed with
$\Delta x/c=0.01$ and
$\Delta S/\Delta x=2$.

Contours (——) of the unsteady, discrete streamfunction for a NACA0012 airfoil with chord length
$c$ at
$20^{\circ }$, three convective times after impulsively starting a uniform flow
$U_{\infty }$. Vorticity is released into a stream of point vortices (
$\bullet$) for enforcement of the Kutta condition at the trailing edge. The simulation is performed with
$\Delta x/c=0.01$,
$\Delta S/\Delta x=1.5$ and
$\Delta t U_{\infty }/c=0.075$.

2.4.3. Applying more than one Kutta condition on a body
Suppose we wish to enforce the Kutta condition at two edges of the body – at points
$k_{1}$ and
$k_{2}$ – instead of one. Each such point has a constraint
For two such constraints, we need two Lagrange multipliers: the strengths of two new vortices,
$\varGamma _{v,1}$ and
$\varGamma _{v,2}$, immersed into the grid with
$\boldsymbol{\mathsf{d}}_{1}$ and
$\boldsymbol{\mathsf{d}}_{2}$, respectively; and we still need the Lagrange multiplier
$s_{0}$ to ensure that Kelvin's circulation theorem is also enforced. The system in the previous section is thus easily generalized to the following:
\begin{equation} \begin{bmatrix} \boldsymbol{\mathsf{L}} & {\mathcal{N}}{}{\tilde{\boldsymbol{\mathsf{R}}}_\mathcal{S}} & 0 & \boldsymbol{\mathsf{d}}_{1} & \boldsymbol{\mathsf{d}}_{2} \\ {\mathcal{S}}{}{\boldsymbol{\mathsf{E}}_\mathcal{N}} & 0 & \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 0 & 0\\ 0 & \boldsymbol{\mathsf{e}}_{k_{1}}^{T} & 0 & 0 & 0 \\ 0 & \boldsymbol{\mathsf{e}}_{k_{2}}^{T} & 0 & 0 & 0 \\ 0 & \hat{{f}_{0}}^{T} & 0 & 1 & 1 \end{bmatrix} \begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \tilde{\boldsymbol{\mathsf{f}}} \\ s_{0} \\ \varGamma_{v,1} \\ \varGamma_{v,2} \end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{w}} \\ \boldsymbol{\mathsf{P}}^{\varGamma}\boldsymbol{\mathsf{s}}'_{b} \\ 0 \\ 0 \\ -\varGamma_{\boldsymbol{\mathsf{w}}} \end{pmatrix}. \end{equation}The system is reduced in the same manner as before, with the same intermediate solution obtained from the basic system (2.25). Now, the Schur complement problem for the constraint forces takes the form
\begin{equation} \begin{bmatrix} -1 & \boldsymbol{\mathsf{e}}_{k_{1}}^{T} \tilde{\boldsymbol{f}}_{1} & \boldsymbol{\mathsf{e}}_{k_{1}}^{T} \tilde{\boldsymbol{f}}_{2} \\ -1 & \boldsymbol{\mathsf{e}}_{k_{2}}^{T} \,\tilde{\boldsymbol{f}}_{1} & \boldsymbol{\mathsf{e}}_{k_{2}}^{T} \,\tilde{\boldsymbol{f}}_{2} \\ -\hat{{f}_{0}}^{T} \boldsymbol{\mathsf{1}}_{\mathcal{S}} & 1+\hat{{f}_{0}}^{T} \tilde{\boldsymbol{f}}_{1} & 1+\hat{{f}_{0}}^{T} \tilde{\boldsymbol{f}}_{2}, \end{bmatrix} \begin{pmatrix} s_{0} \\ \varGamma_{v,1}\\ \varGamma_{v,2}\end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{e}}_{k_{1}}^{T}\, \tilde{\boldsymbol{\mathsf{f}}}^{*} \\ -\boldsymbol{\mathsf{e}}_{k_{2}}^{T}\, \tilde{\boldsymbol{\mathsf{f}}}^{*} \\ -\varGamma_{\boldsymbol{\mathsf{w}}} - \hat{{f}_{0}}^{T} \tilde{\boldsymbol{\mathsf{f}}}^{*} \end{pmatrix}, \end{equation}where we have now defined bound vortex sheets associated with each of the two new vortices (with unit strengths)
for
$j = 1,2$. It is interesting to note that, if we take the difference between the two Kutta constraints, we obtain
It can be shown that this Schur complement problem can be split into
\begin{equation} \begin{bmatrix}
1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{f}}_{1}
& 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{f}}_{2}
\\ 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{f}}_{1}
& 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{f}}_{2}
\end{bmatrix} \begin{pmatrix}
\varGamma_{v,1}\\ \varGamma_{v,2}
\end{pmatrix} ={-}\begin{pmatrix}
\varGamma_{\boldsymbol{\mathsf{w}}} + \,\hat{{f}_{0}}^{T}
\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{\mathsf{f}}}^{*}\\
\varGamma_{\boldsymbol{\mathsf{w}}} + \,\hat{{f}_{0}}^{T}
\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{\mathsf{f}}}^{*}\end{pmatrix}
\end{equation}
and
The latter equation, when combined with (2.69), reveals that the value of the vortex sheet strength
$\tilde {\boldsymbol{\mathsf{f}}}^{*} + \varGamma _{v,1}\,\tilde {\boldsymbol{f}}_{1} + \varGamma _{v,2}\,\tilde {\boldsymbol{f}}_{2}$ is the same at both Kutta points and equal to
$s_{0}$.
Equation (2.70) can be solved easily for the strengths of the two new point vortices. Then, the solution for the vortex sheet strength and streamfunction are
We now apply this method in figure 10 to enforce the Kutta condition at the leading and trailing edge of our flat plate problem. We position a point vortex close to each edge and observe again that
$\tilde {\boldsymbol{\mathsf{f}}}$ shows strong variation at the surface points closest to the two point vortices. The contours of the streamfunction indicate that the flow indeed leaves the edges smoothly. Like the previous case, this solution corresponds to the flow right after impulsively starting a uniform flow around a flat plate, but unlike the previous case, the flow now separates at the leading edge.
(a) Contours (——) of the unsteady, discrete streamfunction for a flat plate of length
$c$ at
$30^{\circ }$ in a uniform flow with release of vorticity into two point vortices (
$\bullet$) for enforcement of the Kutta condition at both edges. (b) The non-singular part of the associated discrete vortex sheet strength. The simulation is performed with
$\Delta x/c=0.01$ and
$\Delta S/\Delta x=2$.

It should be observed that these solutions are posed in a manner easily extensible to an arbitrary number of edges.
2.5. Generalized edge condition
In the previous section, we demonstrated the means of annihilating the (nearly) singular behaviour at edges on a discretized surface. In some cases, our desire is not to annihilate this behaviour, but simply to keep it within some bounds. In the analytical treatment of potential flow problems, this objective is served by placing an inequality constraint on the edge-suction parameter (Ramesh et al. Reference Ramesh, Gopalarathnam, Granlund, OL and Edwards2014; Darakananda & Eldredge Reference Darakananda and Eldredge2019; Eldredge Reference Eldredge2019). That parameter is proportional to the coefficient on the bound vortex sheet strength's singularity (Eldredge Reference Eldredge2019), so in this discrete setting, in which we have extracted the singular part of
$\boldsymbol{\mathsf{f}}$ in the form of
$\boldsymbol{\mathsf{f}}_{0}$, we expect the suction parameter to be related to the value of
$\tilde {\boldsymbol{\mathsf{f}}}$ at the edge. In fact, by simple comparison, it can be shown that
for a flat plate of length
$c$, where
${\sigma}_{k}$ is the suction parameter at the edge corresponding to point
$k$.
Let
${\sigma}^{{min}}_{k}$ and
${\sigma}^{{max}}_{k}$ denote the minimum and maximum tolerable values of
${\sigma}_{k}$ at edge
$k$. We then seek to confine the suction parameter to the range
${\sigma}^{{min}}_{k} \leqslant {\sigma}_{k} \leqslant {\sigma}^{{max}}_{k}$. This generalized edge constraint is placed on the suction parameter of the intermediate sheet
$\tilde {\boldsymbol{\mathsf{f}}}^{*}$. To avoid confusion, we will redefine the bounds based on this non-singular part of the vortex sheet rather than
${\sigma}_{k}$ itself; for this, we define
$\tilde {f}^{{min}}_{k} = -2{\rm \pi} c {\sigma}^{{max}}_{k}/\varGamma _{0}$ and
$\tilde {f}^{{max}}_{k} = -2{\rm \pi} c {\sigma}^{{min}}_{k}/\varGamma _{0}$ if
$\varGamma _{0}$ is positive or
$\tilde {f}^{{max}}_{k} = -2{\rm \pi} c {\sigma}^{{max}}_{k}/\varGamma _{0}$ and
$\tilde {f}^{{min}}_{k} = -2{\rm \pi} c {\sigma}^{{min}}_{k}/\varGamma _{0}$ if
$\varGamma _{0}$ is negative. Thus, we inspect whether the value
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}}^{*}$ lies in the range
If
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}}^{*}$ lies within this range, then no new vortex is created near the edge (or equivalently, a new vortex of zero strength is created); if
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}}^{*} > \tilde {f}^{{max}}_{k}$, then we create a new vortex so that
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}} = \tilde {f}^{{max}}_{k}$; and if
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}}^{*} < \tilde {f}^{{min}}_{k}$, then we do the same, but now so that
$\boldsymbol{\mathsf{e}}_{k}^{T}\tilde {\boldsymbol{\mathsf{f}}} = \tilde {f}^{{min}}_{k}$. Note that the Kutta condition simply corresponds to setting
$\tilde {f}^{{min}}_{k} = \tilde {f}^{{max}}_{k} = 0$.
We can easily accommodate these constraints into our solution approach for enforcing the Kutta condition from the previous section: in the case of two edges, by modifying the right-hand side vector of (2.70) (if the edge suction lies outside of its bounds) or setting the vortex strength corresponding to that edge to zero. For example, suppose that
$\boldsymbol{\mathsf{e}}_{k_1}^{T}\,\tilde {\boldsymbol{\mathsf{f}}}^{*} < \,\tilde {f}^{{min}}_{k_1}$ and
$\boldsymbol{\mathsf{e}}_{k_2}^{T}\,\tilde {\boldsymbol{\mathsf{f}}}^{*} > \tilde {f}^{{max}}_{k_2}$; then we solve the system
\begin{equation} \begin{bmatrix} 1 + \,
\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{f}}_{1}
& 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{f}}_{2}
\\ 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{f}}_{1}
& 1 + \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{f}}_{2}
\end{bmatrix} \begin{pmatrix}
\varGamma_{v,1}\\ \varGamma_{v,2}
\end{pmatrix} ={-}\begin{pmatrix}
\varGamma_{\boldsymbol{\mathsf{w}}} + \,\hat{{f}_{0}}^{T}
\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{\mathsf{f}}}^{*}+\varGamma_{0}\,\tilde{f}^{{min}}_{k_1}\\
\varGamma_{\boldsymbol{\mathsf{w}}} + \,\hat{{f}_{0}}^{T}
\boldsymbol{\mathsf{P}}^{K}_{k_{2}}\,\tilde{\boldsymbol{\mathsf{f}}}^{*}+\varGamma_{0}\,\tilde{f}^{{max}}_{k_2}\end{pmatrix}.
\end{equation}
But if, say,
$\tilde {f}^{{min}}_{k_2} \leqslant \boldsymbol{\mathsf{e}}_{k_2}^{T}\,\tilde{\boldsymbol{\mathsf{f}}}^{*} \leqslant \tilde {f}^{{max}}_{k_2}$, then we set
$\varGamma _{v,2}=0$ and this system reduces to
\begin{equation} \varGamma_{v,1}
={-}\frac{\varGamma_{\boldsymbol{\mathsf{w}}} + \,\hat{{f}_{0}}^{T}
\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{\mathsf{f}}}^{*}+\varGamma_{0}\,\tilde{f}^{{min}}_{k_1}}{1
+ \,\hat{{f}_{0}}^{T}\boldsymbol{\mathsf{P}}^{K}_{k_{1}}\,\tilde{\boldsymbol{f}}_{1}}.
\end{equation}
The effect of applying these generalized edge conditions to the leading edge of a flat plate is shown in figure 11 for the first instants after impulsively starting a uniform flow. The positions of the point vortices emanating from the leading edge in the figure indicate that as
${\sigma}^{{max}}_{k}$ increases, the stream of point vortices is swept back from the edge. At the trailing edge, the Kutta condition is enforced in each case and the positions of the point vortices overlap, as they are not yet influenced by the different situations at the leading edge in these first instants.
Effect of increasing
$\boldsymbol{\sigma}^{{max}}_{{LE}}/U_\infty$ from
$0$ (
$\bullet$, green) to 0.05 (
$\blacksquare$, blue) and
$0.1$ (
$\blacktriangle$, red) on (a) the positions of shedded point vortices and (b) the non-singular part of the associated discrete vortex sheet strength for a flat plate of length
$c$ at
$60^{\circ }$,
$0.15$ convective times after impulsively starting a uniform flow
$U_\infty$. The inset enlarges the boxed area (— — —) and overlays the positions of the vortices (
$\circ$,
$\square$ and
$\triangle$) obtained using the Biot–Savart method of Darakananda & Eldredge (Reference Darakananda and Eldredge2019). At the trailing edge, the Kutta condition is enforced. The simulation is performed with
$\Delta x/c=0.01$,
$\Delta S/\Delta x=2$ and
$\Delta t U_{\infty }/c=0.025$.

2.6. Pressure, force and the added mass
In this section, we present the means for calculating pressure and force (and moment) in the grid-based treatment.
2.6.1. Pressure
Here, we devise a means of computing the pressure, both throughout the flow field,
$\boldsymbol{\mathsf{p}} \in \mathcal {C}$, as well as on the surface of a body. As we will show below, our immersed boundary treatment naturally gives rise to the jump in pressure across this surface,
$\Delta \boldsymbol{\mathsf{p}} = \boldsymbol{\mathsf{p}}^{+} - \boldsymbol{\mathsf{p}}^{-} \in \mathcal {S}^{N_s}$ (with
$+$ in the direction of the surface normal,
$\boldsymbol{\mathsf{n}}_{} \in \mathcal {V}^{N_s}$). Thus, to distinguish the pressures on either side of the surface from one another, we use the fact that the interpolation of
$\boldsymbol{\mathsf{p}}$ onto the surface produces the average of surface values,
$ {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {C}} \boldsymbol{\mathsf{p}} = (\boldsymbol{\mathsf{p}}^{+} + \boldsymbol{\mathsf{p}}^{-})/2 \in \mathcal {S}$, where
$ {\mathcal {S}}{}{\boldsymbol{\mathsf{E}}_\mathcal {C}}$ interpolates data from cell centres to the surface. It is thus easy to see that the pressure on either side is
Thus, we seek
$\Delta \boldsymbol{\mathsf{p}}$ and
$\boldsymbol{\mathsf{p}}$. It should not be a surprise that our starting point for these quantities is the Euler equations. However, our approach exploits the fact that the methodology we have presented thus far already solves the Euler equations in the fluid – in vorticity form, via transport of vortex elements – and provides us with the instantaneous velocity field
$\boldsymbol{\mathsf{v}}$ and strength of the bound vortex sheet
$\boldsymbol{\mathsf{f}}$ on any bodies. This approach, which satisfies the incompressibility constraint by expressing velocity in the null space of the divergence operator (i.e. as curl of a streamfunction), obviates the need for computing pressure, the Lagrange multiplier for this constraint. However, now that we seek pressure, we use the Euler equations in their velocity form to provide it.
It is important to note that the immersed boundary treatment enriches the Euler equations’ standard form with surface terms (Eldredge Reference Eldredge2022). Written in their spatially discrete form, these immersed boundary Euler equations are
\begin{align} \rho \frac{\mathrm{d}\boldsymbol{v}}{\mathrm{d}t} + \rho (\boldsymbol{\mathsf{w}} + {\mathcal{N}}{}{\boldsymbol{\mathsf{R}}_\mathcal{S}} \boldsymbol{\mathsf{f}} ) \times \boldsymbol{v} &={-} \boldsymbol{\mathsf{G}} \left(\boldsymbol{\mathsf{p}} + \frac{1}{2}\rho|\boldsymbol{v}|^{2} \right) \nonumber\\ &\quad + {\mathcal{F}}{}{\boldsymbol{\mathsf{R}}_\mathcal{V}} [\boldsymbol{\mathsf{n}}_{} \circ \Delta\boldsymbol{\mathsf{p}} + \rho \Delta \boldsymbol{v} ({\mathcal{V}}{}{\boldsymbol{\mathsf{E}}_\mathcal{F}}\boldsymbol{v} - \boldsymbol{v}_{b} )\boldsymbol{\cdot}\boldsymbol{\mathsf{n}}_{}], \end{align}
where
$\rho$ is the fluid density and
$ {\mathcal {V}}{}{\boldsymbol{\mathsf{E}}_\mathcal {F}}$ interpolates grid data from
$\mathcal {F}$ to the space of vector-valued surface data
$\mathcal {V}^{N_s}$. Note the appearance of a few terms that are not typically seen in the Euler equations. First, we note the final bracketed pair of surface terms on the right-hand side, containing the jumps in pressure and velocity (
$\Delta \boldsymbol{\mathsf{v}}$) across the surface, as well as the difference between the normal components of the fluid velocity (interpolated onto the surface) and the surface velocity itself,
$\boldsymbol{\mathsf{v}}_{b}\in \mathcal {V}^{N_s}$. (This difference is zero by virtue of the no-flow-through condition, but we keep it here since it combines with other terms in later manipulations.) These surface terms are immersed into the grid by the operator
$ {\mathcal {F}}{}{\boldsymbol{\mathsf{R}}_\mathcal {V}}$. In fact, if we had chosen to solve the Euler equations in velocity – instead of by streamfunction–vorticity – form, then we would have used the pressure jump in this term as a Lagrange multiplier for enforcing the no-flow-through condition on
$\boldsymbol{\mathsf{v}}$. The second new term is the bound vortex sheet strength, appearing alongside the fluid vorticity on the left-hand side. This term emerges because the curl of the velocity field in the immersed boundary method generates both of these:
$\boldsymbol{\mathsf{C}}^{T} \boldsymbol{\mathsf{v}} = \boldsymbol{\mathsf{w}} + {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}} \boldsymbol{\mathsf{f}}$, where
$\boldsymbol{\mathsf{C}}^{T}: \mathcal {F} \mapsto \mathcal {N}$. (Our notation for this operator is consistent with that of previous authors, such as Colonius & Taira Reference Colonius and Taira2008.)
These quantities,
$\Delta \boldsymbol{\mathsf{p}}$ and
$\boldsymbol{\mathsf{p}}$, can be solved for simultaneously from the Schur complement system that arises from solving the Euler equations (2.78) and the associated constraints of divergence-free velocity and no-flow-through condition. Indeed, the approach we outline here is the natural outcome of that system. However, rather than present a detailed derivation, we present the equations with an intuitive explanation.
First, we develop an equation for
$\Delta \boldsymbol{\mathsf{p}}$ by taking the discrete curl
$\boldsymbol{\mathsf{C}}^{T}$ of (2.78) to eliminate the gradient term – since
$\boldsymbol{\mathsf{C}}^{T} \boldsymbol{\mathsf{G}}$ is identically zero – and obtain a vorticity form of the immersed boundary Euler equations. With some manipulation to account for the motion of the surface (embodied in the time variation of
$ {\mathcal {N}}{}{\boldsymbol{\mathsf{R}}_\mathcal {S}}$), these equations can be written as
where
$\mathrm {d}\boldsymbol{\mathsf{f}}/\mathrm {d}t$ represents the time derivative of each element of
$\boldsymbol{\mathsf{f}}$ while following a point moving with velocity
$\boldsymbol{\mathsf{v}}_{b}$. We assume that each immersed point moves with this local surface velocity, so this is simply the time derivative of the vector
$\boldsymbol{\mathsf{f}}$. We have written the equation in this intermediate form on purpose in order to make a few key points. First, it is important to note that we have already satisfied the vorticity equation in the fluid – the first terms in parentheses on the left-hand side – by advecting the point vortices. Thus, we can set these terms to zero, leaving only those terms associated with the surface. Aside from
$\Delta \boldsymbol{\mathsf{p}}$, these remaining terms involve only known quantities, and we could solve them in the current form for
$\Delta \boldsymbol{\mathsf{p}}$ using similar techniques to the ones we will describe below. However, we will first write the equation in a more familiar form, and define some helpful operators and quantities to enable this.
In (2.79) we see a composite of the curl of the regularization operator; let us write this more compactly as
$\boldsymbol{\mathsf{C}}_\mathcal {S}^{T}: \mathcal {S}^{N_s} \mapsto \mathcal {N}$,
for some surface scalar data,
$\boldsymbol{\sigma } \in \mathcal {S}^{N_s}$. We refer to this as a surface curl operator. Its transpose,
$\boldsymbol{\mathsf{C}}_\mathcal {S}: \mathcal {N} \mapsto \mathcal {S}^{N_s}$, also arises in what follows, and can also be described as a surface curl operator. It is defined as
for
$\boldsymbol{\mathsf{s}} \in \mathcal {N}$. The operator
$\boldsymbol{\mathsf{C}}_\mathcal {S}$ obtains the normal component of velocity on an immersed surface for a given streamfunction
$\boldsymbol{\mathsf{s}}$. Before we explain the role of its transpose, it is useful to remember that any potential flow generated by (or about) an impenetrable surface can be equivalently described by either a distribution of vortices (a vortex sheet, with strength
$\boldsymbol{\mathsf{f}}$) or a distribution of dipoles (a double layer) on the surface. In the latter case, the strength of the double layer is given by the negative of the jump in scalar potential across the surface,
$-\boldsymbol{\Delta} {\boldsymbol{\phi} } \in \mathcal {S}^{N_s}$. In fact, the two distributions’ strengths can be related to each other, either by using Stokes’ theorem or by the properties of the generalized functions that underpin the immersed boundary method (Eldredge Reference Eldredge2022), leading to
Thus,
$\boldsymbol{\mathsf{C}}_\mathcal {S}^{T}$ produces the equivalent bound vorticity distribution (immersed into the grid) associated with a given jump in scalar potential on the surface. To calculate
$\boldsymbol{\Delta {\phi}}$ in terms of
$\boldsymbol{\mathsf{f}}$, we apply
$\boldsymbol{\mathsf{C}}_\mathcal {S} \boldsymbol{\mathsf{L}}^{-1}$ to both sides of (2.82) to equate the normal velocity induced on the surface by each distribution. The composite operator
$-\boldsymbol{\mathsf{C}}_\mathcal {S}\boldsymbol{\mathsf{L}}^{-1} \boldsymbol{\mathsf{C}}_\mathcal {S}^{T}$ is positive semi-definite, and its null space can be shown to consist only of uniform values on the surface (i.e. the null space has an equivalent bound vorticity equal to zero). Thus, the jump in scalar potential associated with a vortex sheet of strength
$\boldsymbol{\mathsf{f}}$ is
to which we can add any constant value without affecting the result.
Now, armed with this insight, we can return to (2.79), and rewrite the surface terms on the left-hand side in terms of
$\boldsymbol{\Delta {\phi}}$
where
$\mathrm {d} \boldsymbol{\Delta {\phi}} /\mathrm {d}t$ denotes the time derivative of
$\boldsymbol{\Delta {\phi}}$ associated with a particular immersed point, assumed to be moving with velocity
$\boldsymbol{\mathsf{v}}_{b}$. This equation implies that the expression in brackets must be equal to a uniform value, which we can take to be zero without loss of generality. We can immediately write an immersed boundary Bernoulli equation
This equation is the discrete equivalent of a continuous version that appears in previous works, e.g. Jones (Reference Jones2003) and Eldredge (Reference Eldredge2019). At each time step, we use (2.84) to compute the instantaneous jump in scalar potential associated with the vortex sheet
$\boldsymbol{\mathsf{f}}$, and then use (2.85) to find
$\Delta \boldsymbol{\mathsf{p}}$.
Now we can substitute
$\Delta \boldsymbol{\mathsf{p}}$ from (2.85) into the Euler equations (2.78) and operate on these equations with the discrete divergence operator, so that
$\boldsymbol{\mathsf{L}} = \boldsymbol{\mathsf{D}}\boldsymbol{\mathsf{G}}$ acts on
$\boldsymbol{\mathsf{p}}$. We solve the resulting equation, obtaining
It should be noted that any uniform value can be arbitrarily added to this expression. Also, we note in passing that the final set of terms (with the inverse Laplacian acting on the term in brackets) is equivalent to the time derivative of the scalar potential field, rendering the overall equation equivalent to a Bernoulli equation on the grid. However, there is no particular advantage in writing the equation in that form. In the current form, the first term in brackets (the divergence of the Lamb vector) represents the direct force exerted on the fluid by the fluid vorticity. The remaining terms in brackets collectively constitute the effects of surface motion and of the surface's modification of the flow induced by fluid elements (e.g. vorticity, free stream).
We now demonstrate the pressure calculations with two examples that have an analytical solution for the pressure distribution on the surface. Figures 12 and 13 depict the pressure field and surface distribution for a vortex near a cylinder and a plate, respectively. The pressure inside the cylinder is close to the exact solution of a uniform value, except for some noise at the side near the vortex, which is visible on the interior surface distribution of the pressure. The exterior surface pressure distribution on the cylinder shows good agreement with the analytical solution. In the example of the flat plate, shown in figure 13, the bottom and top surface pressure distributions again show good agreement with the analytical solution except for at the edges, which is expected. Note that, in these examples, we used a smaller value for
$\Delta S/\Delta x$ than before, which was necessary to prevent the low pressure from the vortex from leaking through the surface. As a result, high-frequency components of the surface pressure are incorrectly amplified through the regularization and interpolation operators (Goza et al. Reference Goza, Liska, Morley and Colonius2016), especially at the edges.
(a) Contours (——) of the discrete pressure for a point vortex (
$\bullet$) with strength
$\varGamma _{v,1}$ at
$(R_v,0)$ near a cylinder consisting of
$N_s$ points with radius
$R_c$ and a bound circulation
$-\varGamma _{v,1}$. (b) The scaled discrete pressure at the exterior (——) and interior (
$\cdot \cdot \cdot \cdot \cdot \,\cdot$) of the cylinder. Overlaid is the exact continuous solution (- - - -, red dashed) for the exterior pressure. The simulation is performed with
$R_v/R_c = 3/2$,
$\Delta x/R_c=0.05$,
$\Delta S/\Delta x=1.4$ and
$\Delta t \varGamma _{v,1}/R_c^{2}=0.01$.

(a) Contours (——) of the discrete pressure for a point vortex (
$\bullet$) with strength
$\varGamma _{v,1}$ at
$(0,R_v)$ near a flat plate consisting of
$N_s$ points with chord length
$c$ and a bound circulation
$-\varGamma _{v,1}$. The scaled discrete pressure (——) at (b) the top side and (c) the bottom side of the plate. Overlaid is the exact continuous solution (- - - -, red dashed). The simulation is performed with
$R_v/c = 0.25$,
$\Delta x/c=0.01$,
$\Delta S/\Delta x=1.4$ and
$\Delta t \varGamma _{v,1}/c^{2}=0.005$.

2.6.2. Impulse-based calculations of force and moment
The integral of the pressure distribution over the surface (plus any edge-suction parameters in the case of sharp edges) will be equal to the force on the surface. However, in this section we provide an alternative means of calculating the force and moment on the body through the negative rate of change of impulse in the fluid. The continuous expressions for linear and angular impulse (about the origin) are, in two dimensions (Saffman Reference Saffman1993; Eldredge Reference Eldredge2019)
If there is only a single body, then the force and moment (about the origin) exerted by the fluid on that body are given by
where
$\rho$ is the fluid density. In the two-dimensional applications of this paper, the angular impulse and the moment have only a single component, e.g.
$\boldsymbol {\varPi_{\mathrm {O}} =\varPi_{O}}\boldsymbol {e}_z$, where
$\boldsymbol {e}_z$ is the unit vector out of the plane.
It should be observed that, by definition, the bound vortex sheet strength
$\gamma$ is equal to the jump in tangential velocity between the fluid and the surface,
$\boldsymbol {n}\times \boldsymbol {u}= \gamma \boldsymbol {e}_z + \boldsymbol {n}\times \boldsymbol {u}_{b}$, where
$\boldsymbol {n}$ is the unit surface normal vector directed into the fluid,
$\boldsymbol {u}$ is the fluid velocity, and
$\boldsymbol {u}_{b}$ is the velocity of the surface. Thus, the surface integrals in (2.87) and (2.88) can be re-written in terms of the vortex sheet strength and the body motion.
We can easily develop discrete forms of the integrals (2.87) and (2.88) with the solutions and notation described in this paper. For the volume integrals, let us denote diagonal matrices containing the coordinates of the grid nodes by
$\boldsymbol{\mathsf{D}}_{\boldsymbol{x}_{\mathcal{N}}}$ and
$\boldsymbol{\mathsf{D}}_{\boldsymbol{y}_{\mathcal{N}}}$. Thus, the expressions in (2.87) and (2.88) can be written in discrete form as
and
The overall force and moment exerted on the body are obtained from calculating these impulses and computing their rates of change in (2.89a,b). Part of this force and moment is attributable to the dynamics of vorticity in the fluid. The remaining part is due to surface motion relative to the fluid, and we will discuss this in the next section.
To illustrate the accuracy of the impulse-based calculation of force, we apply the method to two examples. In the first example, we simulate the trajectories of two point vortices of opposite strength, in which case each vortex is convected past a cylinder due to the presence of the other vortex. The time stepping in this example is carried out using a fourth-order Runge–Kutta scheme. Figure 14 shows the trajectories and the
$x$ component of the impulse together with their exact solutions, which show good agreement with the exact solution. In the second example, we compare our simulation of the first instants of the unsteady, fully separated flow around a flat plate after impulsively starting a uniform flow with the Biot–Savart method from Darakananda & Eldredge (Reference Darakananda and Eldredge2019), using the same positioning rules to insert point vortices and the same time step. The vortex positions and the corresponding impulse and lift are compared in figure 15 and show good agreement as well.
(a) Numerically simulated trajectories (——) of two point vortices (
$\bullet$) of opposite strengths
$\varGamma _{v,1}$ and
$\varGamma _{v,1}=-\varGamma_{v,}[2]$ being convected past a circular cylinder with radius
$R$, and (b) the
$x$ component of the associated, numerically simulated impulse (——) in the fluid. Overlaid are the exact continuous trajectories and impulse (- - - -, red dashed). The simulation is performed with
$\Delta x/R=0.04$,
$\Delta S/\Delta x=2$ and
$\Delta t \varGamma _{v,1}/R^{2}=0.1$.

Comparison of the simulated vortex shedding behind a flat plate of length
$c$ at
$60^{\circ }$ in a uniform flow using the method in this paper (
$\bullet$ and ——) and using the Biot–Savart method of Darakananda & Eldredge (Reference Darakananda and Eldredge2019) (
$\circ$, red open circle and - - - -, red dashed). (a) The positions of the shedded point vortices, (b) the lift coefficient and (c) the moment coefficient, one convective time after impulsively starting the uniform flow. At both edges, the Kutta condition is enforced. The simulation is performed with
$\Delta x/c=0.01$,
$\Delta S/\Delta x=2$ and
$\Delta t U_{\infty }/c=0.05$.

2.6.3. Added mass
The added mass tensor provides a measure of the inertial influence of the fluid on the body in response to changes in the body's translational or rotational motion. The coefficients of the added mass tensor of a body are obtained by computing the impulse components associated with a unit-valued component of motion. The motion's influence is both direct, via the surface velocity, and indirect, in the bound vortex sheet that develops on the surface.
For example, suppose that we consider translation at unit velocity in the
$x$ direction, for which the motion is described by
$\boldsymbol{\mathsf{v}}_{b,x} = \boldsymbol{\mathsf{1}}_{\mathcal{S}}$,
$\boldsymbol{\mathsf{v}}_{b,y} = 0$ and
$\boldsymbol{\mathsf{s}}'_{b} = \boldsymbol{r}_{y}$, and the associated bound vortex sheet – obtained without the Kutta condition by solving the basic problem (2.25) – is
$\boldsymbol{\mathsf{f}} = \boldsymbol{\mathsf{S}}^{-1}\boldsymbol{\mathsf{P}}^{\varGamma }\boldsymbol{\mathsf{s}}'_{b} = \boldsymbol{\mathsf{S}}^{-1}\boldsymbol{\mathsf{P}}^{\varGamma }\boldsymbol{r}_{y}$. The added mass coefficients corresponding to this motion are derived by substituting these into the impulse formulas (2.90)–(2.92)
Thus, the components of the added mass coefficients tensor associated with translation in the
$x$ direction are
where
$\boldsymbol {X}_c$ is the centroid of the body, which can be calculated using (B8), and the superscripts
$F$ and
$M$ are used to denote the coefficient for the force and moment, respectively.
A similar approach can be used to obtain the added mass coefficients due to unit translation in the
$y$ direction, for which
$\boldsymbol{\mathsf{v}}_{b,x} = 0$,
$\boldsymbol{\mathsf{v}}_{b,y} = \boldsymbol{\mathsf{1}}_{\mathcal{S}}$ and
$\boldsymbol{\mathsf{s}}'_{b} = -\boldsymbol{r}_{x}$. The coefficients due to unit rotation follow from taking
$\boldsymbol{\mathsf{v}}_{b,x} = -\boldsymbol{r}_{y}$,
$\boldsymbol{\mathsf{v}}_{b,y} = \boldsymbol{r}_{x}$ and
$\boldsymbol{\mathsf{s}}'_{b} = -\tfrac {1}{2}(\boldsymbol{\mathsf{D}}_{\boldsymbol{r}_{x}}\boldsymbol{r}_{x}+\boldsymbol{\mathsf{D}}_{\boldsymbol{r}_{y}}\boldsymbol{r}_{y})$.
2.7. Multiple bodies
The previous sections provided the formulations for potential flow with the presence of a body. The extension of these expressions to multiple bodies is straightforward and consists of allocating partitions of
$\boldsymbol{\mathsf{f}}$ to the different bodies. The surface streamfunction has to be partitioned accordingly, with the body motion streamfunction
$\boldsymbol{\mathsf{s}}_{b}$ containing the values for the discrete surface points from all the bodies and
$\boldsymbol{\mathsf{s}}_{0} = \sum _j \boldsymbol{\mathsf{1}}{{_{\mathcal{S}}}_j} s_{0,j}$ allocating a uniform value
$s_{0,j}$ to the
$j$th body, where
$\boldsymbol{\mathsf{1}}{{_{\mathcal{S}}}_j} \in \mathcal {S}^{N_s}$ is a vector whose
$i$th component is one if it belongs to the
$j$th body and zero otherwise. The system (2.25) can then be solved for the streamfunction field without modification.
As in the single-body case, if we want to enforce an edge condition on the
$j$th body, we treat its uniform streamfunction value
$s_{0,j}$ as a Lagrange multiplier and add a constraint on
$\boldsymbol{\mathsf{f}}$ to the saddle-point system. In the unsteady case, we add a circulation constraint for each body and consider each new point vortex to be released from a specified body. For example, let us consider two bodies, with each body having one sharp edge. We assume
$\varGamma _{v,1}$ and
$\varGamma _{v,2}$ are the strengths from the vortices that were released from the first and second body, respectively. We can compute these strengths by enforcing the Kutta condition for both bodies using the saddle-point system
\begin{equation} \begin{bmatrix} \boldsymbol{\mathsf{L}} & {\mathcal{N}}{}{\tilde{\boldsymbol{\mathsf{R}}}_\mathcal{S}} & 0 & 0 & \boldsymbol{\mathsf{d}}_{1} & \boldsymbol{\mathsf{d}}_{2} \\ {\mathcal{S}}{}{\boldsymbol{\mathsf{E}}_\mathcal{N}} & 0 & \boldsymbol{\mathsf{1}}{{_{\mathcal{S}}}_1} & \boldsymbol{\mathsf{1}}{{_{\mathcal{S}}}_2} & 0 & 0\\ 0 & \boldsymbol{\mathsf{e}}_{k_{1}}^{T} & 0 & 0 & 0 & 0 \\ 0 & \boldsymbol{\mathsf{e}}_{k_{2}}^{T} & 0 & 0 & 0 & 0 \\ 0 & \hat{\boldsymbol{f}}^{T}_{0,1} & 0 & 0 & 1 & 0 \\ 0 & \hat{\boldsymbol{f}}^{T}_{0,2} & 0 & 0 & 0 & 1 \end{bmatrix} \begin{pmatrix} \boldsymbol{\mathsf{s}} \\ \tilde{\boldsymbol{\mathsf{f}}} \\ s_{0,1} \\ s_{0,2} \\ \varGamma_{v,1} \\ \varGamma_{v,2} \end{pmatrix} = \begin{pmatrix} -\boldsymbol{\mathsf{w}} \\ \boldsymbol{\mathsf{P}}^{\varGamma}\boldsymbol{\mathsf{s}}'_{b} \\ 0 \\ 0 \\ -\varGamma_{\boldsymbol{\mathsf{w}},1} \\ -\varGamma_{\boldsymbol{\mathsf{w}},2} \end{pmatrix}, \end{equation}
where we defined
$\varGamma _{\boldsymbol{\mathsf{w}},j}$ as the circulation of the existing vorticity in the flow that has previously been released from the
$j$th body and
$\boldsymbol{\mathsf{f}}_{0,j} = \boldsymbol{\mathsf{D}}_{\boldsymbol{\mathsf{f}}_{0}}\boldsymbol{\mathsf{1}}{{_{\mathcal{S}}}_j}$. Again, these solutions are easily extensible to an arbitrary number of edges per body. For example, figure 16 demonstrates the method for two flat plates in a uniform flow where the leading edge and trailing edge are regularized for both plates by releasing four point vortices during each time step.
Evolution of the flow around two flat plates of length
$c$ at
$60^{\circ }$, vertically separated by a distance of
$c/2$, at
$t U_{\infty }/c$ equal to (a)
$0$, (b)
$0.3$, (c)
$0.6$ and (d)
$0.9$ after impulsively starting a uniform flow. The simulation is performed with
$\Delta x/c=0.01$,
$\Delta S/\Delta x=2$ and
$\Delta t U_{\infty }/c=0.01$.

The formulas for pressure, force and added mass also generalize to systems with multiple bodies. For example, figure 17 demonstrates an example of a potential flow model with an array of nine circular cylinders and compares the ratio of the largest eigenvalue of added mass coefficient tensor and the largest self-added mass coefficient of the system with the results of Chen (Reference Chen1975).
(a) Contours of the discrete streamfunction for an array of nine circular cylinders with radius
$R$, spaced with a gap distance
$G$ between each cylinder, of which the bottom left cylinder translates horizontally. (b) Numerically simulated variation (
$\bullet$) of the ratio between the largest eigenvalue of the added mass coefficient tensor and the largest self-added mass coefficient with the gap-to-radius ratio
$G/R$. Overlaid are the values (
$\circ$, red) obtained by Chen (Reference Chen1975) from solving a system of truncated analytical expressions. The simulations are performed with
$\Delta x/R=0.05$ and
$\Delta S/\Delta x=2$.

3. Conclusion
A treatment of potential flow on Cartesian grids was presented. The main body of this work is based on the computation of the discrete streamfunction through the streamfunction–vorticity Poisson equation with singular vortex elements as vorticity sources. The potential flow in the presence of sinks and sources requires the computation of the discrete scalar potential, which is completely analogous except for the scalar potential Neumann boundary condition instead of the streamfunction Dirichlet boundary condition to enforce no penetration on surfaces in the flow. The Helmholtz decomposition then shows how the velocity fields associated with the scalar potential and streamfunction can be superposed to obtain the combined flow due to sources, sinks and vortices.
In our potential flow treatment, we used two algebraic techniques that allowed us to mimic the analytical treatment of potential flows around sharp-edged bodies with bound vortex sheets. The first technique is to account for surfaces in the flow by using the immersed boundary projection method. We introduce a Lagrange multiplier for the no-penetration constraint in the streamfunction–vorticity Poisson equation and identify it as a discrete version of the continuous strength distribution of a bound vortex sheet on the body. The discrete equations that solve the associated saddle-point system are then completely analogous to the continuous boundary integral equations. It should be noted that this underlying continuous problem is a Fredholm integral equation of the first kind and is ill posed, leading to poorly conditioned discrete operators in the solution method. We have not attempted to address this issue here, but the work of Goza et al. (Reference Goza, Liska, Morley and Colonius2016) did and its methods are straightforward to apply. The second algebraic technique is to decompose the discrete bound vortex sheet strength for sharp-edged bodies into a singular and non-singular part. One can then add constraints on the elements of the non-singular part that are located at the edges to make the recomposed bound vortex sheet well behaved. This way, we enforced the Kutta condition in a way that is similar to analytical treatments of the Kutta condition and that allows for generalized edge conditions as well. Furthermore, we leveraged the concept of the discrete bound vortex sheet strength to create expressions for the pressure in the flow and on surfaces, the impulse in the flow around surfaces and the added mass matrix for a system of arbitrarily shaped bodies. Finally, it is important to note that the treatment of potential flow that we presented is not restricted to the specific finite-difference discretization tools that we used in our implementation to provide the examples in this work. Also, one is not restricted to use the immersed boundary projection method to obtain an expression for the discrete vortex sheet strength and can use, for example, the immersed interface method instead, as in Gillis et al. (Reference Gillis, Marichal, Winckelmans and Chatelain2019).
We found that the method can accurately replicate the results of a Biot–Savart method for the unsteady flow around a flat plate. This motivates the goal of implementing a three-dimensional version of this method using vortex particles (with a vector representing their strengths) or filaments (Cottet & Koumoutsakos Reference Cottet and Koumoutsakos2000), since the concepts of the immersed boundary projection method and the enforcement of edge conditions through the multiplicative decomposition of the vortex sheet strength generalize to three dimensions. Such a three-dimensional, grid-based solver would rely on the vector potential and a vector treatment of the vorticity field, while properly accounting for vortex stretching. It could potentially make significant cost improvements over unsteady three-dimensional panel methods, which generally scale poorly as the number of panels and vortex elements in the flow increase.
Funding
The support for this work by the US Air Force Office of Scientific Research (grant number FA9550-18-1-0440) with programme manager G. Abate is gratefully acknowledged.
Declaration of interests
The authors report no conflict of interest.
Data availability
All the computational results can be reproduced with the code available at: https://github.com/JuliaIBPM/GridPotentialFlow.jl.
Appendix A. Solution of general saddle-point systems
A general block system (with positive semi-definite matrix
$\mathcal {A}$) can be decomposed as follows:
where
is the Schur complement of the matrix system and
$\boldsymbol{\mathsf{I}}$ is the identity. By this decomposition, we can develop an algorithm for the solution of the block system
We will refer to
$\boldsymbol{\mathsf{x}}$ as the solution vector and
$\boldsymbol{\mathsf{y}}$ as the constraint force. We define the intermediate solution vector
$(\boldsymbol{\mathsf{x}}^{*}, \boldsymbol{\mathsf{y}}^{*})^{{\rm T}}$ as the solution of the lower-triangular system
and then the solution we seek can be found by back substitution of
The algorithm we derive from this is
\begin{equation} \left.\begin{gathered} \mathcal{A} \boldsymbol{\mathsf{x}}^{*} = \boldsymbol{\mathsf{r}}_{\boldsymbol{\mathsf{1}}}, \\ \mathcal{S} \boldsymbol{\mathsf{y}}^{*} = \boldsymbol{\mathsf{r}}_{\boldsymbol{\mathsf{2}}} - \mathcal{B}_{2} \boldsymbol{\mathsf{x}}^{*}, \\ \boldsymbol{\mathsf{y}} = \boldsymbol{\mathsf{y}}^{*}, \\ \boldsymbol{\mathsf{x}} = \boldsymbol{\mathsf{x}}^{*} - \mathcal{A}^{{-}1}\mathcal{B}_{1}^{T} \boldsymbol{\mathsf{y}} . \end{gathered}\right\} \end{equation}It is also useful to have an inverse representation of the block matrix system
Appendix B. Some geometric relations for discrete surfaces
Consider a closed surface
$\mathcal {S}_b$ with unit normal
$\boldsymbol {n}$. We will recall some basic geometric relations here, and then provide some discrete versions of these relations based on the set of points with coordinates
$\boldsymbol{r}_{x}$,
$\boldsymbol{r}_{y}$, normal components
$\boldsymbol{\mathsf{n}}_{x}$ and
$\boldsymbol{\mathsf{n}}_{y}$ (which, the reader will recall, contain the surface length or area of each segment or panel associated with the points).
The volume
$\mathcal {V}_b$ of the region enclosed by
$\mathcal {S}_b$ can be computed from the integral
where
$n_d$ is the number of spatial dimensions (2 or 3). Using the notation above, the approximate form of this expression is
\begin{equation} \mathcal{V}_b \approx \frac{1}{n_d} \sum_j \boldsymbol{\mathsf{r}}_{j}^{T} \boldsymbol{\mathsf{n}}_{j}, \end{equation}
where the sum is taken over the
$n_d$ components.
An alternative formula for the volume is
The components of this integral can be written discretely as
And finally, a third alternative is
where
$\boldsymbol {I}$ is the identity. The discrete form of this is a diagonal matrix with
$\boldsymbol{\mathsf{r}}_{x}^{T}\boldsymbol{\mathsf{n}}_{x}$,
$\boldsymbol{\mathsf{r}}_{y}^{T}\boldsymbol{\mathsf{n}}_{y}$ and
$\boldsymbol{\mathsf{r}}_{z}^{T}\boldsymbol{\mathsf{n}}_{z}$ along the diagonal.
Thus, we can conclude that the volume of the body is approximately
or any average of some combination of these.
The centroid of the body can be derived from the equation
or, in discrete form,




































































































































































