Mesh Adaptation on Hybrid Unstructured Meshes for Immersed Boundary Methods
Extracted source text · arXiv 2607.27580
%----------------------------------------------------------------------------------------------------------------------%
\documentclass[a4paper,fleqn,times]{cas-sc}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% PACKAGES
%----------------------------------------------------------------------------------------------------------------------%
\usepackage{etex}
\usepackage{ifthen}
\usepackage{xifthen}
\usepackage{xkeyval}
\usepackage{xstring}
\usepackage{etoolbox}
%------------------------------%
% MATHS
%------------------------------%
\usepackage{array}
\usepackage{amsthm}
\usepackage{amsbsy}
\usepackage{amsmath}
\usepackage{mathtools}
\newcommand\hmmax{0} % default 3
\newcommand\bmmax{0} % default 4
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{bm}
%------------------------------%
% Graphics & figures
%------------------------------%
\usepackage{xcolor}
\usepackage{graphicx}
%--------------------------------------------------%
% Fonts
%--------------------------------------------------%
\usepackage{relsize}
% % % \usepackage{times} % Font in document
% % % \usepackage{pifont} % Special symbols
% % % \usepackage{contour} % Contour for letters
% % % \usepackage{textcomp} % Special symbols
\usepackage{stmaryrd} % Special symbols
% % % \usepackage{scrextend} % Font sizes
% % % \usepackage{bold-extra} % Bold scshape
% % % \usepackage[annataritalic]{tengwarscript} % Tengwar fonts
% % % \usepackage[bitstream-charter,cal=cmcal]{mathdesign}
% % % % \usepackage{dutchcal}
% % %
% % % %\usepackage{bickham}
% % % % \usepackage{boondox-cal}
% % % %\usepackage{boondox-calo}
% % % % \usepackage[cal=boondoxo]{mathalfa}
%--------------------------------------------------%
% Lists, Listings, Algorithms
%--------------------------------------------------%
\RequirePackage{tabto}
\RequirePackage{environ}
\RequirePackage{paralist}
\RequirePackage{enumitem}
\RequirePackage{etaremune}
\RequirePackage{listings}
\RequirePackage{mdwlist}
\RequirePackage{verbatim}
\RequirePackage{fancyvrb}
% % % \RequirePackage{algpseudocode}
\RequirePackage[noEnd=false,indLines=false]{algpseudocodex}
%------------------------------%
% Tables
%------------------------------%
\usepackage{dcolumn}
\usepackage{booktabs}
\usepackage{multicol}
\usepackage{multirow}
\usepackage{rccol}
\usepackage{tabularx}
%------------------------------%
% Others
%------------------------------%
\usepackage{suffix}
\usepackage{lipsum}
\usepackage{siunitx}
\usepackage{comment}
\usepackage{csquotes}
\usepackage{enumitem}
\usepackage{datetime}
\usepackage[noabbrev]{cleveref}
\usepackage{fix-cm}
\usepackage{xspace}
\usepackage{epigraph}
\usepackage{lastpage}
\usepackage{adjustbox}
%--------------------------------------------------%
% Document Encoding
%--------------------------------------------------%
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%--------------------------------------------------%
% The last ones
%--------------------------------------------------%
% % % \usepackage[pdftex]{hyperref}%
% % % \usepackage[english,spanish,noabbrev]{cleveref}
%--------------------------------------------------%
%----------------------------------------------------------------------------------------------------------------------%
\usepackage{tcolorbox}
\usepackage[sort&compress,longnamesfirst,numbers]{natbib}
% \usepackage[authoryear]{natbib}
% \usepackage[authoryear,longnamesfirst]{natbib}
%----------------------------------------------------------------------------------------------------------------------%
\tcbuselibrary{breakable}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% AUTHOR'S MACROS
%----------------------------------------------------------------------------------------------------------------------%
\DeclareFontFamily{U}{dutchcal}{\skewchar\font=45 }
\DeclareFontShape{U}{dutchcal}{m}{n}{<-> s*[1.0] dutchcal-r}{}
\DeclareFontShape{U}{dutchcal}{b}{n}{<-> s*[1.0] dutchcal-b}{}
\DeclareMathAlphabet{\mathlcal}{U}{dutchcal}{m}{n}
\SetMathAlphabet{\mathlcal}{bold}{U}{dutchcal}{b}{n}
%----------------------------------------------------------------------------------------------------------------------%
\newcommand{\vectorsym}[1]{\ensuremath{\boldsymbol{#1}}}
\newcommand{\tensorsym}[1]{\ensuremath{\boldsymbol{#1}}}
\newcommand{\matrixsym}[1]{\ensuremath{\boldsymbol{#1}}}
\newcommand{\average}[1]{\ensuremath{\left\{\!\!\left\{#1\right\}\!\!\right\}}}
\newcommand{\jump}[1]{\ensuremath{\left\llbracket#1\right\rrbracket}}
%----------------------------------------------------------------------------------------------------------------------%
% \DeclareMathOperator{\diag}{diag}
% \DeclareMathOperator{\sign}{sign}
\newcommand{\Bullet}{\small{\blacktriangleright}}
\newcommand{\textbt}[1]{\textbf{\textit{#1}}}
\newcommand{\textbs}[1]{\textbf{\textsf{#1}}}
\newcommand{\bra}[1]{\left\langle#1\right|}
\newcommand{\ket}[1]{\left|#1\right\rangle}
\newcommand{\vs}[3]{\left\langle#1\right|#2\left|#3\right\rangle}
\newcommand{\diff}[1]{\,\mathrm{d}#1}
\newcommand{\dn}[2]{\dfrac{\diff#1}{\diff#2}}
\newcommand{\dnl}[3]{\dfrac{\diff^{#1}\phantom{#2}}{\diff#2^{#1}}#3}
\newcommand{\dpn}[2]{\dfrac{\partial#1}{\partial#2}}
\newcommand{\dpnl}[3]{\dfrac{\partial^{#1}}{\partial#2^{#1}}#3}
\newcommand{\dppn}[3]{\dfrac{\partial^{(2)}#1}{\partial#2\partial#3}}
\newcommand{\dppnl}[3]{\dfrac{\partial^{#1}}{\partial#2\partial#3}}
\newcommand{\dpppn}[4]{\dfrac{\partial^{(3)}#1}{\partial#2\partial#3\partial#4}}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcolumntype{N}[2]{>{\centering\arraybackslash}R[.][.]{#1}{#2}}
\setlength{\heavyrulewidth}{0.10em}
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
%----------------------------------------------------------------------------------------------------------------------%
\newcommand{\textfb}[1]{\textbf{\protect\detokenize{#1}}}
%----------------------------------------------------------------------------------------------------------------------%
\def\highlight#1{\textcolor{blue}{#1}}
%----------------------------------------------------------------------------------------------------------------------%
\def\figurespath{./}
%----------------------------------------------------------------------------------------------------------------------%
\definecolor{base}{rgb}{0.25,0.50,0.75}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\ExplSyntaxOn
\keys_set:nn { stm / mktitle } { nologo }
\ExplSyntaxOff
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\makeatletter
%----------------------------------------------------------------------------------------------------------------------%
\newtoks\arxiv@@algname@current
%
\def\createalglabel#1#2{%
\arxiv@@algname@current={#2}%
\edef\arxiv@temp{\the\arxiv@@algname@current}%
\@bsphack\protected@write{\@auxout}{}{\string\arxiv@@newalglabel{#1}{\expandafter\strip@prefix\meaning\arxiv@temp}}\@esphack%
}
%
\def\arxiv@@newalglabel#1#2{%
\expandafter\xdef\csname arxiv@@alglabel@#1\endcsname{#2}%
}
%----------------------------------------------------------------------------------------------------------------------%
\algnewcommand\algorithmiccall{\textbf{call}}
\algnewcommand\algorithmicnot{\textbf{not}}
\algnewcommand\algorithmicand{\textbf{and}}
\algnewcommand\algorithmicnil{\textbf{nil}}
\algnewcommand\algorithmicor{\textbf{or}}
\algnewcommand\algorithmicto{\textbf{to}}
%----------------------------------------------------------------------------------------------------------------------%
\algnewcommand\algorithmicswitch{\textbf{switch}}
\algnewcommand\algorithmiccase{\textbf{case}}
\algnewcommand\algorithmicuse{\textbf{use}}
%----------------------------------------------------------------------------------------------------------------------%
\algnewcommand\UseAlgorithm[1]{\algorithmicuse~Algorithm~\ref{#1}:~\textrm{\csname arxiv@@alglabel@#1\endcsname}}
\algnewcommand\UseVariable[2]{\algorithmicuse~\textit{#1} (\textrm{#2})}
\algnewcommand\DefineVariable[2]{\textbf{#1} \textit{#2}}
\algnewcommand\CallProcedure[2]{\algorithmiccall~\Call{#1}{#2}}
\algnewcommand\CallFunction[2]{\Call{#1}{#2}}
\algnewcommand\Variable[1]{\textit{#1}}
%----------------------------------------------------------------------------------------------------------------------%
\algrenewcommand\textproc{\textrm}% font for procedure/function names
%----------------------------------------------------------------------------------------------------------------------%
\algdef{SE}[SWITCH]{Switch}{EndSwitch}[1]{%
\algpx@startCodeCommand\algpx@startIndent\algorithmicswitch\ #1\ \algorithmicdo%
}{%
\algpx@startEndBlockCommand\algpx@endIndent\algorithmicend\ \algorithmicswitch%
}%
%----------------------------------------------------------------------------------------------------------------------%
\algdef{SE}[CASE]{Case}{EndCase}[1]{%
\algpx@startCodeCommand\algpx@startIndent\algorithmiccase\ #1%
}{%
\algpx@startEndBlockCommand\algpx@endIndent\algorithmicend\ \algorithmiccase%
}%
%----------------------------------------------------------------------------------------------------------------------%
\ifbool{algpx@noEnd}{%
\algtext*{EndSwitch}%
\algtext*{EndCase}%
\pretocmd{\EndSwitch}{\algpx@endIndent}{}{}
\pretocmd{\EndCase}{\algpx@endIndent}{}{}
}{%
\algtext*{EndCase}%
\pretocmd{\EndCase}{\algpx@endIndent}{}{}
}%
\pretocmd{\Switch}{\algpx@endCodeCommand}{}{}
\pretocmd{\Case}{\algpx@endCodeCommand}{}{}
\ifbool{algpx@noEnd}{%
\pretocmd{\EndSwitch}{\algpx@endCodeCommand[1]}{}{}%
\pretocmd{\EndCase}{\algpx@endCodeCommand[1]}{}{}%
}{%
\pretocmd{\EndSwitch}{\algpx@endCodeCommand[0]}{}{}%
\pretocmd{\EndCase}{\algpx@endCodeCommand[0]}{}{}%
}%
%----------------------------------------------------------------------------------------------------------------------%
\algsetblock{Procedure}{EndProcedure}{}{1.0em}
\algrenewtext{For}[3]{$\algorithmicfor\ #1 = #2\ \algorithmicto\ #3\ \algorithmicdo$}
%----------------------------------------------------------------------------------------------------------------------%
\makeatother
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% 'remarks' environment (tcolorbox)
%----------------------------------------------------------------------------------------------------------------------%
\tcbset{%
my-remarks/.style={%
coltitle=red,
colbacktitle=gray!20,
colupper=red,
colback=gray!10,
colframe=base,
halign title=flush center,
fonttitle=\large\bfseries\rmfamily,
arc=1.00pt,
toptitle=0.20cm,
bottomtitle=0.20cm,
lefttitle=0.20cm,
righttitle=0.20cm,
top=0.25cm,
bottom=0.25cm,
left=0.25cm,
right=0.25cm,
boxsep=0.00cm,
boxrule=2.00pt,
subtitle style={%
halign=center,
colupper=base,
colback=gray!10,
boxrule=0.75pt,
boxsep=0.00cm,
},
breakable
}
}
%----------------------------------------------------------------------------------------------------------------------%
% 'algorithm' environment (tcolorbox)
%----------------------------------------------------------------------------------------------------------------------%
\tcbset{%
my-algorithm/.style={%
coltitle=black,
colbacktitle=white,
colupper=black,
colback=white,
colframe=black,
fonttitle=\normalsize,
fontupper=\small,
fontlower=\small,
arc=0.00pt,
toptitle=0.20cm,
bottomtitle=0.20cm,
lefttitle=0.20cm,
righttitle=0.20cm,
top=0.25cm,
bottom=0.25cm,
left=0.25cm,
right=0.25cm,
boxsep=0.00cm,
boxrule=0.75pt,
subtitle style={%
halign=center,
colupper=base,
colback=gray!10,
boxrule=0.75pt,
boxsep=0.00cm,
},
breakable
}
}
%----------------------------------------------------------------------------------------------------------------------%
% 'algorithm' tcolorbox environment
%----------------------------------------------------------------------------------------------------------------------%
\newcounter{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
\newenvironment{algorithm}[3]%
{%
\refstepcounter{algorithm}%
\begin{tcolorbox}[%
my-algorithm,%
title={%
\textbf{Algorithm~\thealgorithm:}~\textrm{#2}%
\ifthenelse{\equal{#1}{}}{\relax}{\label{#1}\createalglabel{#1}{#2}}%
}%
]%
\small
}%
{%
\end{tcolorbox}
}
%----------------------------------------------------------------------------------------------------------------------%
% 'remarks' tcolorbox environment
%----------------------------------------------------------------------------------------------------------------------%
\newenvironment{remarks}%
{%
\begin{tcolorbox}[%
my-remarks,%
title={PENDING},%
]%
}%
{%
\end{tcolorbox}%
}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\begin{document}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% % % \let\WriteBookmarks\relax
\def\floatpagepagefraction{1}
\def\textpagefraction{0.001}
%----------------------------------------------------------------------------------------------------------------------%
\shorttitle{Mesh adaptation for immersed boundary methods}
\shortauthors{Núñez}
%----------------------------------------------------------------------------------------------------------------------%
\title[mode=title]{Mesh adaptation on hybrid unstructured meshes\\ for immersed boundary methods}
% \tnotemark[1]
% \tnotetext[1]{This is a title}
%----------------------------------------------------------------------------------------------------------------------%
\author[1,2]{Jonatan {Núñez-de la Rosa}}[%
auid=001,%
bioid=001,%
orcid=0000-0002-4541-2768]
\cormark[1]
% \fnmark[1]
\ead{jonatan.nunez@upm.es}
% \ead[url]{www.author1.com}
\credit{Conceptualization of this study, Methodology, Software}
%----------------------------------------------------------------------------------------------------------------------%
\author[1,2]{Esteban Ferrer}[%
auid=002,%
bioid=002,%
orcid=0000-0003-1519-0444]
\ead{estaban.ferrer@upm.es}
\credit{Conceptualization, Methodology, Project administration, Funding acquisition}
%----------------------------------------------------------------------------------------------------------------------%
\author[1,2]{Eusebio Valero}[%
auid=003,%
bioid=003,%
orcid=0000-0002-1627-6883]
\ead{eusebio.valero@upm.es}
\credit{Conceptualization, Methodology, Project administration, Funding acquisition}
%----------------------------------------------------------------------------------------------------------------------%
\affiliation[1]{%
organization={School of Aeronautics, Universidad Politécnica de Madrid},
addressline={Plaza del Cardenal Cisneros 3},
city={Madrid},
postcode={28040},
country={Spain}%
}
\affiliation[2]{%
organization={Center for Computational Simulation, Universidad Politécnica de Madrid},
addressline={Campus Montegancedo},
city={Boadilla del Monte},
postcode={28660},
country={Spain}%
}
%----------------------------------------------------------------------------------------------------------------------%
% CORRESPONDING AUTHOR
%----------------------------------------------------------------------------------------------------------------------%
\cortext[1]{Corresponding author}
%----------------------------------------------------------------------------------------------------------------------%
% \fntext[1]{Footnote text}
%----------------------------------------------------------------------------------------------------------------------%
% For a title note without a number/mark
%\nonumnote{}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% ABSTRACT
%----------------------------------------------------------------------------------------------------------------------%
\begin{abstract}
In this work, we describe a new preprocessing tool for mesh adaptation on hybrid unstructured meshes with a target application on immersed boundary methods. The tool has as input an unstructured, hybrid, and conforming mesh generated by an external mesh generation software, and the main goal is to refine this mesh around immersed geometries in such a way that the CFD solver using the immersed boundary method can simulate flow problems in an accurate and efficient manner. The input background mesh can be made of different types of elements, like tetrahedra, hexahedra, prisms, and pyramids, which, unlike Cartesian meshes, permit for a more flexible mesh. Hybrid unstructured meshes enable one to use the immersed boundary technology in a new class of flow problems where the full geometry is decomposed into a fixed geometry part and a changing geometry part. A body-fitted mesh is generated for the fixed geometry while for the changing one is used the immersed boundary method. We simulate several flow problems to test the new meshes, including subsonic flow past a cylinder and subsonic flow past an NACA0012 airfoil, both using finite volume and discontinuous Galerkin methods and solving the Navier--Stokes equations. As an industrial example of our mesh generation, we consider the simulation of a multi-element airfoil: in this case, a mesh generation software generates an unstructured conforming background mesh for the slat and main airfoil, while the flap is placed as immersed geometry in this body-fitted mesh. As accurate and efficient results are sought, this mesh is refined around the flap and then the subsonic flow at high-lift flow conditions is simulated with a finite volume method coupled with an immersed boundary method and using the Reynolds--averaged Navier--Stokes equations. The reported numerical simulations are in good agreement with their corresponding full body-fitted simulations and with experimental data. As a final application example, we study the optimization of the flap position in a two-element airfoil with respect to the lift coefficient. To this end, we have developed an optimization methodology using the open-source GEMSEO optimization suite and the CODA CFD solver.
\end{abstract}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% GRAPHICAL ABSTRACT
%----------------------------------------------------------------------------------------------------------------------%
% \begin{graphicalabstract}
% \centering
% \includegraphics[width=1.00\linewidth]{\figurespath/graphicalabstract.pdf}%
% \end{graphicalabstract}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% RESEARCH HIGHLIGHTS
%----------------------------------------------------------------------------------------------------------------------%
% % % \begin{highlights}
% % % \item {This paper presents\ldots}
% % % \item {This paper presents\ldots}
% % % \item {This paper presents\ldots}
% % % \end{highlights}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% KEYWORDS
%----------------------------------------------------------------------------------------------------------------------%
\begin{keywords}
mesh adaptation \sep
hybrid meshes \sep
immersed boundaries \sep
computational fluid dynamics
\end{keywords}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\maketitle
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Introduction}\label{sec:introduction}
%----------------------------------------------------------------------------------------------------------------------%
Computational fluid dynamics has become a powerful tool to simulate fluid flow problems in science and engineering, such as blood flow through the circulatory system~\cite{marom2015a}, airflow around aircrafts or wind turbines~\cite{bazilevs2014a,sclafani2014b,volpiani2024a}, relativistic flows in astrophysics~\cite{nunez2016a,nunez2016b,nunez2018a,berta2024a}, or even plasmas in fusion reactors~\cite{blokland2007a,schneider2015a}. In recent years, numerical schemes have been developed to increase the fidelity of CFD simulations. Whether they are based on finite difference, finite volume, or discontinuous Galerkin methods, CFD solvers have a common feature: they require a computational mesh. To obtain a good solution of the fluid dynamics governing equations, accurate numerical schemes along with high-quality computational meshes are important in the simulation workflow. In industrial applications, complex geometries are ubiquitous, and therefore their good representation is essential. The generation of an appropriate body-fitted mesh for a given simulation problem in fluid dynamics can be tedious and very expensive, requiring not only an excellent mesh generation software but also a skilled simulation engineer.\par
%----------------------------------------------------------------------------------------------------------------------%
Immersed boundary methods have arisen as an alternative to numerical schemes using body-fitted meshes. These numerical techniques are used in computational fluid dynamics to model the interaction between fluids and rigid or flexible bodies without requiring complex body-fitted mesh generation. Instead of a conformal mesh, a Cartesian background mesh is used and the body geometry is immersed in it. This means that complex structures, such as solid objects or porous media, are represented as part of the fluid computational domain without the need for a grid that conforms to their complicated shapes~\cite{verzicco2023a}. The underlying numerical scheme, whether this is a finite-difference or a finite-volume scheme, or even a discontinuous Galerkin method, suffers little change in case it is combined with an immersed boundary method. In fact, the boundary conditions have to be adapted/modified in order to take into account the immersed body.\par
%----------------------------------------------------------------------------------------------------------------------%
Immersed boundary methods are classified according to the way in which the interaction between the fluid and the immersed body is carried out. Among the available approaches, the most relevant are the direct forcing approach~\cite{goldstein1993a,fadlun2000a,luo2012a,boukharfane2018a}, the cut-cell methods~\cite{udaykumar2001a,orley2015a}, the ghost cell methods~\cite{tseng2003a,hu2013c}, the sharp interface methods~\cite{ghias2007a,de-vanna2020a}, and the volume penalization schemes~\cite{liu2007a,engels2015a,abalakin2016a}. The latter family of immersed boundary methods has become a promising technique for avoiding the complications of generating body-fitted meshes for intricate geometries and also for simulating moving geometries. In the works of~\citet{mittal2005a,sotiropoulos2014a,griffith2020a,verzicco2023a} more details on the different families of immersed boundary methods can be found. For the fluid flow problems we discuss in this work, the use of these techniques to simulate turbulent aerodynamic flows is discussed in~\cite{capizzano2011a,capizzano2016a,capizzano2018a,peron2021a,constant2024a,nunez2025a,nunez2026a,nunez2026b}.\par
%----------------------------------------------------------------------------------------------------------------------%
Simulations of aerodynamics flow problems based on immersed boundary methods require a huge number of nodes or elements to accurately predict the fluid flow properties, especially in the local areas close to the wall boundary. Uniform Cartesian meshes are prohibitive in this case because the mesh will need billion nodes/elements to satisfy the requirement previously mentioned, therefore adaptive mesh refinement algorithms are necessary to overcome this issue. Recently, new strategies have been developed to construct adaptive Cartesian meshes for complex three-dimensional geometries in the context of finite difference methods~\cite{wang2020a,luo2025a}, finite volume~\cite{capizzano2018a,peron2021a,meng2022a,constant2024a,nunez2025a}, and discontinuous Galerkin~\cite{ouyang2024a,qi2024a,nunez2025a}.\par
%----------------------------------------------------------------------------------------------------------------------%
In this work, we have developed a new mesh refinement preprocessing tool that works on hybrid unstructured meshes for immersed boundary methods. The idea is to import a mesh generated by an external mesh generation software. This external mesh is an unstructured, hybrid and conforming mesh, made basically of tetrahedra, hexahedra, prisms, and pyramids. The input mesh is created in such a way that it is body-fitted for certain parts of the geometry, but it is an immersed boundary mesh in locations where other geometries can be placed. Then this mesh is refined only in the locations where the immersed body is located, allowing, unlike Cartesian meshes, more flexibility. In this way, immersed boundary methods can be used in a new family of flow problems where the whole geometry is broken up into a fixed geometry and a changing geometry. A body-fitted mesh is generated for the fixed geometry while for the changing one is placed as an immersed body. This kind of body-fitted/immersed-boundary meshes is of particular interest in industrial aerodynamics.\par
%----------------------------------------------------------------------------------------------------------------------%
The finite volume and discontinuous Galerkin methods coupled with the immersed boundary volume penalization schemes are used in order to simulate fluid flow problems with complex geometries. To solve the Navier--Stokes and Reynolds--Averaged Navier--Stokes equations, we have employed the CODA CFD solver~\cite{kroll2016a} with the immersed boundary penalization plugin already implemented in a previous work~\cite{nunez2025a}. CODA is a numerical framework for multidisciplinary analysis and optimization of aircraft and helicopters based on advanced and accurate numerical techniques. The solver is being developed as part of a collaboration between the French National Aerospace Research Center (ONERA), the German Aerospace Center (DLR), and Airbus. The spatial discretization schemes used in CODA to solve partial differential equations are the finite volume method, the modal discontinuous Galerkin method, and the discontinuous Galerkin spectral element method. In CODA are also available explicit, implicit, and implicit-explicit time integrators.\par
%----------------------------------------------------------------------------------------------------------------------%
This work is organized as follows: in \cref{sec:governing-equations} are summarized the governing equations that have been used to simulate fluid flow problems within the CODA CFD solver, namely the Navier--Stokes equations and the Reynolds-averaged Navier--Stokes equations. In \cref{sec:numerical-methods} are briefly discussed the numerical schemes that have been employed to solve the governing equations: for the spatial discretization, these schemes are the finite volume and discontinuous Galerkin methods, and for the time discretization, the backward Euler method; the immersed boundary volume penalization are also introduced. In \cref{sec:mesh-refinement} are explained in detail the most important algorithms that have been developed and implemented in the mesh refinement preprocessing tool. Next, in \cref{sec:numerical-computations} we present several numerical computations performed with the CODA CFD solver coupled with the immersed boundary volume penalization method and using the meshes refined with our preprocessing tool: the subsonic flow past a cylinder, the subsonic flow past an NACA0012 airfoil, the subsonic flow past an MDA30P30N multi-element airfoil, and the optimization of the flap position in a two-element airfoil with respect to the lift coefficient. Finally, in \cref{sec:conclusions}, a summary of this work is presented and the advantages and disadvantages of the immersed boundary volume penalization methods for aerodynamic simulations in industrial scenarios are discussed.
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Governing equations}\label{sec:governing-equations}
%----------------------------------------------------------------------------------------------------------------------%
In this work, we have considered the Navier--Stokes and Reynolds--Averaged Navier-Stokes equations. The final goal is to simulate fluid flow problems in industrial aerodynamics with the immersed boundary methods on refined unstructured meshes. We formulate these equations as systems of conservation laws, which is the natural form used by finite volume and discontinuous Galerkin methods.
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Navier--Stokes equations}\label{sec:governing-equations:navier-stokes}
%----------------------------------------------------------------------------------------------------------------------%
The Navier--Stokes equations are a system of partial differential equations that describes the motion of viscous fluids. These equations can be written as a hyperbolic-parabolic system of conservation laws in the following manner
\begin{equation}
\dpn{\vectorsym{u}}{t}+\nabla\cdot\vectorsym{f}(\vectorsym{u},\nabla{\vectorsym{u}})=\vectorsym{0}.
\end{equation}
The vector of conserved quantities is defined by $\vectorsym{u}(\vectorsym{x},t)=\left(\rho,\rho\vectorsym{v},\rho{}E\right)$, where $\rho$ is the mass density, $\vectorsym{v}=\left(v_{x},v_{y},v_{z}\right)$ is the velocity vector and $E$ is the total energy. The physical flux is defined by
\begin{equation}
\vectorsym{f}(\vectorsym{u},\nabla\vectorsym{u})=
\vectorsym{f}^{A}(\vectorsym{u})-\vectorsym{f}^{D}(\vectorsym{u},\nabla\vectorsym{u}),
\end{equation}
with the advective and diffusive fluxes given, respectively, by
\begin{equation}
\vectorsym{f}^{A}(\vectorsym{u})=%
\begin{pmatrix}
\rho\,\vectorsym{v}\\
\rho\,\vectorsym{v}\otimes\vectorsym{v}+p\tensorsym{I}\\
\vectorsym{v}\left(\rho{}E+p\right)
\end{pmatrix},\quad
\vectorsym{f}^{D}(\vectorsym{u},\nabla\vectorsym{u})=%
\begin{pmatrix}
0\\
-\boldsymbol{\tau}\\
\boldsymbol{\tau}\cdot\vectorsym{v}-\vectorsym{q}
\end{pmatrix}.
\end{equation}
Viscous stresses are described by the stress tensor $\boldsymbol{\tau}$, defined by
\begin{equation}
\boldsymbol{\tau}=2\mu{}\tensorsym{S}^{D}=\mu\left(\nabla\vectorsym{v}+\left(\nabla\vectorsym{v}\right)^{\intercal}-\frac{2}{3}\left(\nabla\cdot\vectorsym{v}\right)\tensorsym{I}\right),
\end{equation}
where $\tensorsym{S}^{D}$ is the deviatoric component of the strain-rate tensor
\begin{equation}
\tensorsym{S}=\frac{1}{2}\left(\nabla\vectorsym{v}+\left(\nabla\vectorsym{v}\right)^{\intercal}\right),
\end{equation}
and
\begin{equation}
\vectorsym{q}=-k\nabla{T},\quad k=\mu\frac{c_{p}}{\mathrm{Pr}}.
\end{equation}
The equation of state is given by
\begin{equation}
p=\left(\gamma-1\right)\left(\rho{}E-\frac{1}{2}\rho{}v^{2}\right),
\end{equation}
where $p$ is the static pressure, $\gamma$ is the ideal gas index, $\mu$ is the dynamic viscosity, $T$ is the temperature, $k$ is the thermal conductivity and $\mu$ denotes the dynamic viscosity coefficient. The kinematic viscosity coefficient is defined by the formula
\begin{equation}
\nu = \mu/\rho.
\end{equation}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Reynolds-averaged Navier--Stokes equations}\label{sec:governing-equations:rans}
%----------------------------------------------------------------------------------------------------------------------%
The Navier--Stokes equations govern the motion of fluids in both laminar and turbulent regimes. Because of the large range of spatial and temporal scales present in turbulent flows, directly solving the Navier--Stokes equations is prohibitively expensive. Therefore, the Reynolds--averaged Navier--Stokes (RANS) equations are solved instead to model steady turbulent mean flows. The RANS equations couple the mean flow equations with the one-equation turbulence model of Spallart--Allmaras. These equations can be written also as a hyperbolic-parabolic system of conservation laws with source term in the following way
\begin{equation}
\dpn{\vectorsym{u}}{t}+\nabla\cdot\vectorsym{f}(\vectorsym{u},\nabla{\vectorsym{u}})=\vectorsym{s}\left(\vectorsym{u}\right).
\end{equation}
Here, $\vectorsym{u}$ is the vector of time-averaged conservative variables over a given time interval and has the following components: $\vectorsym{u}(\vectorsym{x},t)=\left(\rho,\rho\vectorsym{v},\rho{}E,\rho\tilde{\nu}\right)$, where $\rho$ is the time-averaged mass density, $\vectorsym{v}=\left(v_{x},v_{y},v_{z}\right)$ is the time-averaged velocity vector, $E$ is the time-averaged total energy, and $\rho\tilde{\nu}$ is a new conservative variable relating the time-averaged mass density and the eddy viscosity $\tilde{\nu}$. The advective and diffusive components of the physical flux associated with the quantity $\rho\tilde{\nu}$ are given by
\begin{equation}
\vectorsym{f}^{A}\left[\rho\tilde{\nu}\right]=\rho\tilde{\nu}\vectorsym{v},\quad
\vectorsym{f}^{D}\left[\rho\tilde{\nu}\right]=\frac{1}{\sigma}\left(\mu+f_{n1}\rho\tilde{\nu}\right)\nabla{}\tilde{\nu}.
\end{equation}
The turbulent stress tensor $\boldsymbol{\tau}_{t}$ and the turbulent heat fluxes $\vectorsym{q}_{t}$ are added, respectively, to $\boldsymbol{\tau}$ and $\vectorsym{q}$ appearing in the mean flow equations:
\begin{equation}
\boldsymbol{\tau}_{t}=2\mu_{t}\tensorsym{S}^{D},\quad
\vectorsym{q}_{t}=-\frac{\mu_{t}}{\mathrm{Pr}_{t}}c_{p}\nabla{}T,
\end{equation}
where $\mathrm{Pr}_{t}=0.9$ is the turbulent Prandtl number and $\mu_{t}$ is the turbulent dynamic viscosity
\begin{equation}
\mu_{t}=
\begin{cases}
\rho\tilde{\nu}f_{v1}\left(\chi\right) & \text{for $\tilde{\nu}\ge{}0$},\\
0 & \text{for $\tilde{\nu}<0$},\\
\end{cases}
\end{equation}
with
\begin{equation}
f_{v1}\left(\chi\right)=\frac{\chi^{3}}{\chi^{3}+c_{v1}^{3}},\quad
\chi=\frac{\rho\tilde{\nu}}{\mu}.
\end{equation}
The source terms only have a nonzero component in the equation for the turbulent variable $\rho\tilde{\nu}$:
\begin{equation}
\vectorsym{S}\left[\rho\tilde{\nu}\right]=-\rho\left(P-D\right)-\frac{c_{b2}}{\sigma}\rho\nabla\tilde{\nu}+\frac{1}{\sigma}\left(\nu+f_{n1}\tilde{\nu}\right)\nabla\rho\cdot\nabla\tilde{\nu},
\end{equation}
where the production and destruction terms, $P$ and $D$, are defined by:
\begin{align}
P&=
\begin{cases}
c_{b1}\left(1-f_{t2}\right)\tilde{\omega}\tilde{\nu} & \text{for $\tilde{\nu}\ge{}0$},\\
c_{b1}\left(1-c_{t3}\right)\omega\tilde{\nu} & \text{for $\tilde{\nu}<0$},\\
\end{cases}\\
D&=
\begin{cases}
\left(c_{w1}f_{w}-\frac{c_{b1}}{\kappa^{2}}f_{t2}\right)\left(\frac{\tilde{\nu}}{d}\right)^{2}
& \text{for $\tilde{\nu}\ge{}0$},\\
-c_{w1}\left(\frac{\tilde{\nu}}{d}\right)^{2} & \text{for $\tilde{\nu}<0$},\\
\end{cases}
\end{align}
and
\begin{align}
f_{n1}&=
\begin{cases}
1 & \text{for $\tilde{\nu}\ge{}0$},\\
\frac{c_{n1}+\chi^{3}}{c_{n1}-\chi^{3}} & \text{for $\tilde{\nu}<0$},\\
\end{cases}\\
f_{t2}&=c_{t3}\exp{\left(-c_{t4}\chi^{2}\right)},\\
f_{w}&=g\left(\frac{1+c_{w3}^{6}}{g^{6}+c_{w3}^{6}}\right)^{\frac{1}{6}},
\end{align}
with
\begin{equation}
g=r+c_{w2}\left(r^{6}-r\right),\quad r=\min\left(r_{\mathrm{lim}},\frac{\tilde{\nu}}{\omega\kappa^{2}d^{2}}\right),
\end{equation}
and $d$ is the distance to the nearest wall and $\omega$ is the magnitude of the vorticity. The modified vorticity magnitude $\tilde{\omega}$ is given by
\begin{equation}
\tilde{\omega}=
\begin{cases}
\omega+\bar{\omega} & \text{for $\bar{\omega}>-c_{v2}\omega$},\\
\omega+\frac{\omega\left( c_{v2}^{2}+c_{v3}\bar{\omega}\right)}{\left(c_{v3}-2c_{v2}\right)\omega-\bar{\omega}} & \text{for $\bar{\omega}<-c_{v2}\omega$},
\end{cases}
\end{equation}
where $\bar{\omega}$ and $f_{v2}$ are given by
\begin{equation}
\bar{\omega}=\frac{\tilde{\nu}}{\kappa^{2}d^{2}}f_{v2},\quad f_{v2}=1-\frac{\chi}{1-f_{v1}}.
\end{equation}
For completeness, we give the values of the constants in the above expressions:
${c_{v1}=\num{7.1}}$,
${\sigma=2/3}$,
${c_{b1}=\num{0.1355}}$,
${c_{b2}=\num{0.622}}$,
${\kappa=\num{0.41}}$,
${c_{w2}=\num{0.3}}$,
${c_{w3}=2}$,
${r_{\mathrm{lim}}=\num{10}}$,
${c_{t3}=1.2}$,
${c_{t4}=0.5}$,
${c_{v2}=0.7}$,
${c_{v3}=0.9}$,
${c_{n1}=16}$.
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Numerical methods}\label{sec:numerical-methods}
%----------------------------------------------------------------------------------------------------------------------%
The spatial discretization schemes used in CODA to solve the Navier--Stokes and Reynolds-Averaged Navier--Stokes equations are the finite volume method, the modal discontinuous Galerkin method, and the discontinuous Galerkin spectral element method. These numerical schemes are implemented in order to solve partial differential equations in a multi-physics context. Here we will briefly describe the finite volume and modal discontinuous Galerkin methods for hyperbolic systems of conservation laws. Regarding the time discretization, in CODA there are available explicit, implicit, and implicit-explicit integrators. In this work, we have used an implicit backward-Euler scheme based on preconditioned matrix-free GMRES.\par
%----------------------------------------------------------------------------------------------------------------------%
As we have already seen, the partial differential equations of interest can be written as a hyperbolic-parabolic system of conservation laws with source terms in differential form
\begin{equation}\label{eqn:conservation-law:differential-form}
\dpn{\vectorsym{u}}{t}+\nabla\cdot\vectorsym{f}(\vectorsym{u},\nabla{\vectorsym{u}})=\vectorsym{s}\left(\vectorsym{u}\right),
\end{equation}
where $\vectorsym{u}=\vectorsym{u}(\vectorsym{x},t)$ is the vector of conserved quantities and $\vectorsym{f}=\vectorsym{f}(\vectorsym{u},\nabla\vectorsym{u})$ is the tensor of physical fluxes, which has two terms, the advective term and the diffusive term, namely
\begin{equation}
\vectorsym{f}(\vectorsym{u},\nabla\vectorsym{u})=
\vectorsym{f}^{A}(\vectorsym{u})-\vectorsym{f}^{D}(\vectorsym{u},\nabla\vectorsym{u}),
\end{equation}
and $\vectorsym{s}=\vectorsym{s}\left(\vectorsym{u}\right)$ represents the source terms. The \cref{eqn:conservation-law:differential-form} can also be written in integral form as follows
\begin{equation}\label{eqn:conservation-law:integral-form}
\dpn{}{t}\int_{\Omega}\vectorsym{u}\diff{\Omega} +
\oint_{\partial\Omega}\left(\vectorsym{f}^{A}(\vectorsym{u})-\vectorsym{f}^{D}(\vectorsym{u},\nabla\vectorsym{u})\right)\cdot\vectorsym{n}\diff{\sigma} = \int_{\Omega}\vectorsym{s}\diff{\Omega}.
\end{equation}
Here, $\Omega$ is the spatial domain and $\vectorsym{n}$ is the normal vector on the surface $\partial\Omega$ enclosing the spatial domain. The numerical methods we discuss in this section are based on \cref{eqn:conservation-law:integral-form}.
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Finite volume methods}\label{sec:numerical-methods:finite-volume-methods}
%----------------------------------------------------------------------------------------------------------------------%
In the finite-volume framework~\cite{blazek2015a}, the computational domain is divided into a set of non-overlapping polyhedral control volumes or cells, that is, $\Omega=\bigcup_{i}^{N}\Omega_{k}$, and the integral form of the equations is discretized for each control volume $\Omega_{k}$. Defining the mean value of the function $\vectorsym{u}$ in the cell $\Omega_{k}$ by
\begin{equation}
\vectorsym{u}_{k}:=\dfrac{1}{\left|\Omega_{k}\right|}\int_{\Omega_{k}}\vectorsym{u}\left(\vectorsym{x},t\right)\diff{\Omega},
\end{equation}
we get the so-called semi-discrete formulation
\begin{equation}
\dn{\vectorsym{u}_{k}}{t}:=-\dfrac{1}{\left|\Omega_{k}\right|}
\biggl\{
\sum_{l}\bigl[\vectorsym{f}^{A}\cdot\hat{\vectorsym{n}}\bigr]^{*}\sigma_{l}-\sum_{l}\bigl[\vectorsym{f}^{D}\cdot\hat{\vectorsym{n}}\bigr]^{*}\sigma_{l}
- \vectorsym{s}\left|\Omega_{k}\right|
\biggr\}.
\end{equation}
The surface integral has been approximated by a sum of fluxes through the faces $\partial\Omega_{l}$ of the cell $\Omega_{k}$. The $\sigma_{l}$ stands for the area of the face $\partial\Omega_{l}$, $\hat{\vectorsym{n}}$ is the normal vector of the face $\partial\Omega_{l}$, and $\left|\Omega_{k}\right|$ is the volume of the cell $\Omega_{k}$. The fluxes across the faces of the elements are calculated by numerical fluxes (this is represented in the equation as the operator $\left[\cdot\right]^{*}$). The computation of the numerical advective fluxes requires a reconstruction procedure that takes cell-centered values of conserved quantities, momentum and temperature gradients, and interpolates them to the faces. Typically, Roe schemes with an entropy fix are employed. The gradients are computed using the Green--Gauss theorem. This procedure reconstructs values needed at face integration points to approximate the Green--Gauss integral linearly. Gradient limiters can be applied in the vicinity of strong discontinuities. The finite volume discretization implemented in CODA is second-order accurate. More details on how the element and face gradients are computed can be found in~\citet{blazek2015a}.
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Discontinuous Galerkin methods}\label{sec:numerical-methods:discontinuous-galerkin-methods}
%----------------------------------------------------------------------------------------------------------------------%
The discontinuous Galerkin method is based on the weak formulation of the governing equations. The method has the capacity to handle complicated geometries and, due to its locality, is highly parallelizable. Arbitrary high-order discontinuous Galerkin discretizations can be obtained simply by increasing the degree of the polynomial basis functions. In this work, we have used the modal approach of the discontinuous Galerkin scheme, which uses a hierarchical and orthogonal polynomial basis.\par
%----------------------------------------------------------------------------------------------------------------------%
Let us start by considering the domain $\Omega$ with boundary $\partial\Omega$. We decompose $\Omega$ into a shape-regular partition $\mathcal{T}_{h}=\left\{\Omega_{k}\right\}$ consisting of $N$ non-overlapping elements $\Omega_{k}$ of characteristic size $h$. These elements can be, for instance, tetrahedra, hexahedra, pyramids, and prisms. Let us define the sets $\mathcal{E}_{i}$ and $\mathcal{E}_{b}$ of the interior and boundary faces in $\mathcal{T}_{h}$, such that $\mathcal{E}_{h}=\mathcal{E}_{i}\cup\mathcal{E}_{b}$.\par
%----------------------------------------------------------------------------------------------------------------------%
Let $\mathcal{V}_{h}^{p}=\left\{\phi_{h}\in L^{2}(\Omega)\colon\ \phi|_{\Omega_{k}}\in\mathcal{P}^{p}(\Omega_{k}),\ \forall{}\Omega_{k}\in\mathcal{T}_{h}\right\}$ be the functional space formed by piecewise polynomials of degree at most $p$ in each element $\Omega_{k}$, and $\left\{\phi_{\Omega_{k}}^{1},\ldots,\phi_{\Omega_{k}}^{N_{p}}\right\}\in\mathcal{P}^{p}(\Omega_{k})$ a hierarchical and orthonormal basis of $\mathcal{V}_{h}^{p}$, of dimension $N_{p}$. As a hierarchical and orthonormal basis, we used one computed with the methodology introduced by \citet{bassi2012a}, where an initial set of monomial basis functions is defined in each element arbitrarily shaped, and then a modified Gram--Schmidt orthonormalization procedure is applied. In each element of the discretization, the resulting basis yields a diagonal mass matrix that simplifies the resolution of the equations in the variational formulation. Using this basis, the number of degrees of freedom per element is $N_{p}=(p+1)(p+2)(p+3)/6$ in a three-dimensional space. The solution in each element $\Omega_{k}\in\mathcal{T}_{h}$ and for all $t\ge{0}$ is
\begin{equation}
\vectorsym{u}_{h}(\vectorsym{x},t)=\sum_{l=1}^{N_{p}}\phi_{\Omega_{k}}^{l}(\vectorsym{x})\vectorsym{u}_{\Omega_{k}}^{l}(t),\ \forall\vectorsym{x}\in{}\Omega_{k}.
\end{equation}
Polynomial coefficients $\vectorsym{u}_{\Omega_{k}}^{l}$, for ${1\le{}l\le{}N_{p}}$, are the degrees of freedom of the discrete problem in the element $\Omega_{k}\in\mathcal{T}_{h}$.
The \cref{eqn:conservation-law:differential-form} can also be written in a weak form as follows
\begin{equation}
\dpn{}{t}\int_{\Omega_{k}}\phi_{h}\vectorsym{u}_{h}\diff{\Omega} + \boldsymbol{\mathcal{L}}_{A}\left(\vectorsym{u}_{h},\phi_{h}\right) + \boldsymbol{\mathcal{L}}_{D}\left(\vectorsym{u}_{h},\phi_{h}\right)=0,
\end{equation}
where $\boldsymbol{\mathcal{L}}_{A}$ and $\boldsymbol{\mathcal{L}}_{D}$ represent the weak form of the advective and diffusive terms, respectively. Before we explicitly write the terms $\boldsymbol{\mathcal{L}}_{A}$ and $\boldsymbol{\mathcal{L}}_{D}$, we introduce the following notation: for a given cell interface between two elements, we define the average operator as
\begin{equation}
\average{\vectorsym{u}}=\frac{1}{2}\left(\vectorsym{u}^{+}+\vectorsym{u}^{-}\right),
\end{equation}
and the jump operator as
\begin{equation}
\jump{\vectorsym{u}}=\vectorsym{u}^{+}\otimes\vectorsym{n}-\vectorsym{u}^{-}\otimes\vectorsym{n},
\end{equation}
where $\vectorsym{u}^{+}$ and $\vectorsym{u}^{-}$ are the values of the solution $\vectorsym{u}$ at the interface between elements $\Omega_{k}^{+}$ and $\Omega_{k}^{-}$. The weak form of the advective terms is given by
\begin{equation}
\begin{split}
\boldsymbol{\mathcal{L}}_{A}\left(\vectorsym{u}_{h},\phi_{h}\right)=&-\int_{\Omega_{k}}\vectorsym{f}^{A}\left(\vectorsym{u}_{h}\right)\cdot\nabla_{h}\phi_{h}\diff{\Omega}\\
&+\int_{\mathcal{E}_{i}}\jump{\phi_{h}}\vectorsym{h}_{A}\left(\vectorsym{u}_{h}^{+},\vectorsym{u}_{h}^{-},\vectorsym{n}\right)\diff{\sigma}\\
&+\int_{\mathcal{E}_{b}}\phi_{h}^{+}\vectorsym{f}^{A}\left(\vectorsym{u}_{b}\right)\cdot\vectorsym{n}\diff{\sigma},
\end{split}
\end{equation}
where $\vectorsym{u}_{b}=\vectorsym{u}_{b}\left(\vectorsym{u}_{h}^{+},\vectorsym{u}_{\mathrm{ext}},\vectorsym{n}\right)$ are the boundary values, with $\vectorsym{u}_{\mathrm{ext}}$ a reference external state satisfying the boundary conditions on $\mathcal{E}_{b}$. The numerical flux $\vectorsym{h}_{A}$ is chosen such that it is consistent and conservative, for example, the Roe flux.\par
%----------------------------------------------------------------------------------------------------------------------%
The diffusive terms are discretized using the \textrm{BR1} method of \citet{bassi1997b}. This methodology is based on the definition of the gradients of conservative variables as auxiliary variables $\boldsymbol{\Theta}=\nabla\vectorsym{u}$, which verify the following equations:
\begin{align}
&\boldsymbol{\Theta}-\nabla\vectorsym{u}=\vectorsym{0},\\
&\dpn{\vectorsym{u}}{t}+\nabla\cdot\vectorsym{f}^{A}\left(\vectorsym{u}\right)+\nabla\cdot\vectorsym{f}^{D}\left(\vectorsym{u},\boldsymbol{\Theta}\right)=0.
\end{align}
The global lifting operator $\vectorsym{L}_{h}$, which accounts for the jumps across the element interfaces, is defined in such a way that:
\begin{equation}
\boldsymbol{\Theta}_{h}=\nabla_{h}\vectorsym{u}_{h}+\vectorsym{L}_{h}.
\end{equation}
The operator $\vectorsym{L}_{h}$ satisfies the following condition
\begin{equation}
\begin{split}
\int_{\Omega_{k}}\phi_{h}\vectorsym{L}_{h}\diff{\Omega}=&-\int_{\mathcal{E}_{i}}\average{\phi}\jump{\vectorsym{u}_{h}}\diff{\sigma}\\&
-\int_{\mathcal{E}_{b}}\frac{1}{2}\phi^{+}\left(\vectorsym{u}_{h}^{+}-\vectorsym{u}_{b}\right)\otimes\vectorsym{n}\diff{\sigma}.
\end{split}
\end{equation}
Therefore, the discrete variational form of the diffusive term for the \textrm{BR1} method takes the following form
\begin{equation}
\begin{split}
\boldsymbol{\mathcal{L}}_{D}\left(\vectorsym{u}_{h},\phi_{h}\right)=&-\int_{\Omega_{k}}\vectorsym{f}^{D}\left(\vectorsym{u}_{h},\nabla_{h}\vectorsym{u}_{h}+\vectorsym{L}_{h}\right)\cdot\nabla_{h}\phi_{h}\diff{\Omega}\\
&-\int_{\mathcal{E}_{i}}\jump{\phi_{h}}\average{\vectorsym{f}^{D}\left(\vectorsym{u}_{h},\nabla_{h}\vectorsym{u}_{h}+\vectorsym{L}_{h}\right)}\cdot\vectorsym{n}\diff{\sigma}\\
&-\int_{\mathcal{E}_{b}}\phi_{h}^{+}\vectorsym{f}^{D}\left(\vectorsym{u}_{b},\nabla\vectorsym{u}_{b}+\vectorsym{L}_{h}\right)\cdot\vectorsym{n}\diff{\sigma}.
\end{split}
\end{equation}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Backward Euler method}\label{sec:numerical-methods:backward-euler-method}
%----------------------------------------------------------------------------------------------------------------------%
Regarding the time discretization, we have employed an implicit scheme. When the method of lines is applied to \cref{eqn:conservation-law:integral-form}, we get, for each element $\Omega_{k}$, a system of coupled ordinary differential equations in time
\begin{equation}\label{eqn:method-of-lines}
\matrixsym{M}\dn{\vectorsym{u}_{k}}{t}=-\vectorsym{R}\left(\vectorsym{u}_{k}\right),
\end{equation}
where $\vectorsym{u}_{k}$ is the vector of conservative variables in element $\Omega_{k}$, $\matrixsym{M}$ is the mass matrix, and $\vectorsym{R}$ is the residual, that is, the complete spatial discretization including the source terms.\par
%----------------------------------------------------------------------------------------------------------------------%
Approximating \cref{eqn:method-of-lines} with the backward Euler method yields
\begin{equation}\label{eqn:backward-euler:base}
\matrixsym{M}\dfrac{\Delta\vectorsym{u}^{n}_{k}}{\Delta{}t}=-\vectorsym{R}\left(\vectorsym{u}^{n+1}_{k}\right),
\end{equation}
where
\begin{equation}
\Delta\vectorsym{u}^{n}_{k}=\vectorsym{u}^{n+1}_{k}-\vectorsym{u}^{n}_{k}.
\end{equation}
The implicit formulation leads to a set of non-linear equations for the unknown flow variables at the time $t^{n+1}$. The residual $\vectorsym{R}\left(\vectorsym{u}^{n+1}_{k}\right)$ is linearized according to
\begin{equation}\label{eqn:backward-euler:linearization}
\vectorsym{R}\left(\vectorsym{u}^{n+1}_{k}\right)=\vectorsym{R}\left(\vectorsym{u}^{n}_{k}\right)+\left(\dpn{\vectorsym{R}}{\vectorsym{u}}\right)^{n}_{k}\Delta\vectorsym{u}^{n}_{k},
\end{equation}
where $\left(\dpn{\vectorsym{R}}{\vectorsym{u}}\right)^{n}_{k}$ is the flux Jacobian matrix. If we substitute the linearization~\cref{eqn:backward-euler:linearization} into~\cref{eqn:backward-euler:base}, we get the implicit scheme
\begin{equation}\label{eqn:backward-euler:scheme}
\left[\dfrac{\matrixsym{M}}{\Delta{}t} + \left(\dpn{\vectorsym{R}}{\vectorsym{u}}\right)^{n}_{k}\right]\Delta\vectorsym{u}^{n}_{k}=-\vectorsym{R}\left(\vectorsym{u}^{n}_{k}\right).
\end{equation}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Immersed boundary methods}\label{sec:numerical-methods:immersed-boundary-methods}
%----------------------------------------------------------------------------------------------------------------------%
The immersed boundary method was introduced by \citet{peskin1972a} to analyze the flow through the native mitral heart valve, and since then, the method has been applied to the numerical simulation of flow problems over complex geometries~\cite{iaccarino2003a}, multiphase flows~\cite{shao2013a}, and fluid-structure interaction~\cite{wang2015d}.\par
%----------------------------------------------------------------------------------------------------------------------%
Immersed boundary methods are numerical techniques used to simulate fluid-structure interaction problems involving complex geometries, providing a flexible framework for modeling fluid flow over complicated immersed bodies on meshes that do not conform to the surface of the body by treating these as immersed boundaries within the computational domain, and therefore, an alternative to numerical methods based on body-fitted meshes. In this way, immersed boundary methods overcome the challenges of generating high-quality meshes around complex geometries, which can be time-consuming and computationally demanding, while accurately resolving complex flows using simple grids. The geometric components are discretized using a separate representation, such as a surface or volume mesh, which is then immersed within the computational mesh. Special immersed boundary conditions are applied to take into account the geometric components in the flow.\par
%----------------------------------------------------------------------------------------------------------------------%
In industrial applications, like aerodynamics of aircrafts, a high mesh resolution is necessary in order to accurately model the boundary layer. In these kinds of situation, the use of immersed boundary methods to simulate fluid flow over immersed bodies requires a very high resolution of this background mesh to obtain reliable numerical solutions. Using very fine meshes in the computational domain makes the use of immersed boundary methods for industrial applications unpractical. Actually, fine meshes are only necessary in specific locations in the computational domain, like around the immersed geometry or wake regions. Fine meshes far away from the immersed bodies are unnecessary. This aspect of the physics and numerics of the problem motivates the development of mesh adaptation algorithms to refine the mesh only in the regions where it is in fact essential for accurate computations.\par
%----------------------------------------------------------------------------------------------------------------------%
As we have already mentioned, there are different immersed boundary techniques currently available, among them, the more relevant are the cut-cell methods, the ghost cell methods, the direct forcing approach, sharp interface methods, and the volume penalization schemes. The latter is of special interest to us and is employed in this work. In the immersed boundary volume penalization methods, the flow equations are solved on the whole computational domain, while a source term is introduced to represent the body as a porous medium with very low permeability. The main idea of this method is to apply a penalization to the integration points which are located inside the immersed geometry using source terms instead of using a boundary condition on the surface of the body, as is the case when using conforming body-fitted meshes. In this manner, a simple Cartesian mesh can be used to solve the flow equations over arbitrary geometries, reducing the time required for the mesh generation.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.75\linewidth]{\figurespath/immersed-boundary-mesh.pdf}%
%----------------------------------------------------------------------%
\caption{Schematic diagram of a hybrid background mesh for the immersed boundary method. A mask function is used to discriminate between those points and cells that are inside or outside the immersed body.}%
%----------------------------------------------------------------------%
\label{fig:numerical-methods:ibm-hybrid-mesh}%
%----------------------------------------------------------------------%
\end{figure}
%----------------------------------------------------------------------------------------------------------------------%
In the immersed boundary volume penalization method, a mask function is used to discriminate between the points inside or outside the immersed geometry (see \cref{fig:numerical-methods:ibm-hybrid-mesh}). The mask function is computed with the ray casting method. In this approach, a ray is generated starting from a given point and follows any direction; the idea is to test how many times this ray intersects the faces of the immersed geometry. If the point is located outside the body surface, the ray will intersect the faces an even number of times. If the points are located inside the body surface, the ray will intersect the faces an odd number of times. Once the mask function has been calculated in the preprocessing phase of the simulation, the source terms are applied to the flow equations to modify the behavior of the flow field inside the immersed body.\par
%----------------------------------------------------------------------------------------------------------------------%
Provided the governing equations for a compressible viscous fluid,
\begin{equation}
\dpn{\vectorsym{u}}{t}+\nabla\cdot\vectorsym{f}(\vectorsym{u},\nabla{\vectorsym{u}})=\vectorsym{s}(\vectorsym{u}),
\end{equation}
the immersed boundary source term $\vectorsym{s}(\vectorsym{u})$ is given by
\begin{equation}
\vectorsym{s}(\vectorsym{u};\chi,\eta)=%
\frac{\chi}{\eta}
\begin{pmatrix}
0\\
\rho(\vectorsym{v}-\vectorsym{v}_{\mathrm{s}})\\
\dfrac{1}{2}\rho{}\left(\vectorsym{v}\cdot\vectorsym{v}-\vectorsym{v}_{\mathrm{s}}\cdot\vectorsym{v}_{\mathrm{s}}\right)
\end{pmatrix},
\end{equation}
where $\vectorsym{v}_{\mathrm{s}}$ is the velocity of the moving geometry (for a static object $\vectorsym{v}_{\mathrm{s}}=0$) and $\chi$ represents the mask function and distinguishes between the fluid region $\Omega_{\mathrm{f}}$ and the solid region $\Omega_{\mathrm{s}}$:
\begin{equation}
\chi\left(\vectorsym{x},t\right) =%
\begin{cases}
1, & \text{if $\vectorsym{x}\in\Omega_{\mathrm{s}}$},\\
0, & \text{otherwise},
\end{cases}
\end{equation}
and $0<\eta\ll{}1$ is the penalization parameter. If turbulent flow is simulated with the Reynolds-averaged Navier--Stokes equations and the Spalart--Allmaras model is used, the eddy viscosity, $\tilde{\nu}$, is set to zero inside the body~\cite{tamaki2017a}:
\begin{equation}
\vectorsym{s}_{\mathrm{SA}}(\vectorsym{u};\chi,\eta)=-\frac{\chi}{\eta}\tilde{\nu}.
\end{equation}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Mesh refinement}\label{sec:mesh-refinement}
%----------------------------------------------------------------------------------------------------------------------%
In this section, we present the mesh refinement algorithms developed and implemented in our preprocessing tool. This software can create an initial Cartesian background mesh made exclusively of hexahedral elements, typically used in immersed-boundary-based simulations. This kind of meshes are very simple to generate, but when they are used in industrial aerodynamic flow problems, a large amount of elements are required if we want to obtain accurate solutions as good as those obtained with full body-fitted meshes. Some industrial simulation problems only require the geometry to be changed in certain specific locations. For instance, if we want to optimize the flap positioning in a multi-element airfoil, it is this new geometry configuration that causes the remeshing of the entire computational domain when using body-fitted meshes. If we want to take advantage of the immersed boundary methods, it would be useful to generate a full body-fitted mesh exclusively for the main airfoil while the flap is ommited. In the region where the flap is supposed to be located, we can place it as an immersed body and refine around its surface (this example is considered in more detail in \cref{sec:numerical-computations}). In order to make feasible this idea, we need that the mesh preprocessing tool be capable of importing an external body-fitted mesh and then refining its elements, which, in general, are of different shapes, like hexahedra, tetrahedra and prisms. Usually hexahedra are used to accurately model the flow on the boundary layer, therefore they are employed on the geometry surface. The rest of the computational domain is filled with prisms and tetrahedra (see \cref{fig:mesh-refinement:hybrid-body-fitted-mesh}).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.49\linewidth]{\figurespath/mesh-body-fitted-crmhl.pdf}%
\hfill
\includegraphics[width=0.49\linewidth]{\figurespath/mesh-body-fitted-mda30p30n-slat.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Hybrid full body-fitted meshes around complex geometries: unstructured grid of a NASA CRM-HL aircraft (left), and unstructured grid of a multi-element airfoil (right).}%
%----------------------------------------------------------------------%
\label{fig:mesh-refinement:hybrid-body-fitted-mesh}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Elements splitting convention}
%----------------------------------------------------------------------------------------------------------------------%
Our mesh refinement preprocessing tool is capable of refining hybrid meshes made of tetrahedra, pyramids, prisms, and hexahedra. In \cref{fig:mesh-refinement:elements-splitting} is depicted the splitting convention adopted in our work, which is typically used in the computational fluid dynamics community. Next, we present the node numbering convention for the children resulting from the element splitting. In the figure hanging nodes can be seen at element faces and edges. These hanging nodes generate nonconforming faces between elements.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=1.0\linewidth]{\figurespath/elements-splitting.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Splitting of different types of elements implemented in the preprocessing tool. A tetrahedron is split into $8$ tetrahedra. A pyramid is split into $6$ pyramids and $4$ tetrahedra. A prism is split into $8$ prisms. A hexahedron is split into $8$ hexahedra.}%
%----------------------------------------------------------------------%
\label{fig:mesh-refinement:elements-splitting}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
A tetrahedron is divided into $8$ tetrahedra:
\begingroup
\allowdisplaybreaks
\begin{align*}
E^{1}_{\mathrm{TETRA4}} &= \{n_{1},n_{5},n_{7},n_{8}\},\\
E^{2}_{\mathrm{TETRA4}} &= \{n_{5},n_{2},n_{6},n_{9}\},\\
E^{3}_{\mathrm{TETRA4}} &= \{n_{6},n_{3},n_{7},n_{10}\},\\
E^{4}_{\mathrm{TETRA4}} &= \{n_{8},n_{9},n_{10},n_{4}\},\\
E^{5}_{\mathrm{TETRA4}} &= \{n_{5},n_{7},n_{8},n_{9}\},\\
E^{6}_{\mathrm{TETRA4}} &= \{n_{5},n_{6},n_{7},n_{9}\},\\
E^{7}_{\mathrm{TETRA4}} &= \{n_{7},n_{8},n_{9},n_{10}\},\\
E^{8}_{\mathrm{TETRA4}} &= \{n_{7},n_{9},n_{6},n_{10}\}.
\end{align*}
\endgroup
%----------------------------------------------------------------------------------------------------------------------%
A pyramid is divided into $6$ pyramids and $4$ tetrahedra:
\begingroup
\allowdisplaybreaks
\begin{align*}
E^{1}_{\mathrm{PYRA5}} &= \{n_{1},n_{6},n_{14},n_{9},n_{10}\},\\
E^{2}_{\mathrm{PYRA5}} &= \{n_{6},n_{2},n_{7},n_{14},n_{11}\},\\
E^{3}_{\mathrm{PYRA5}} &= \{n_{9},n_{14},n_{8},n_{4},n_{13}\},\\
E^{4}_{\mathrm{PYRA5}} &= \{n_{14},n_{7},n_{3},n_{8},n_{12}\},\\
E^{5}_{\mathrm{PYRA5}} &= \{n_{10},n_{11},n_{12},n_{13},n_{5}\},\\
E^{6}_{\mathrm{PYRA5}} &= \{n_{10},n_{13},n_{12},n_{11},n_{14}\},\\
E^{7}_{\mathrm{TETRA4}} &= \{n_{6},n_{10},n_{11},n_{14}\},\\
E^{8}_{\mathrm{TETRA4}} &= \{n_{7},n_{11},n_{12},n_{14}\},\\
E^{9}_{\mathrm{TETRA4}} &= \{n_{8},n_{12},n_{13},n_{14}\},\\
E^{10}_{\mathrm{TETRA4}} &= \{n_{9},n_{13},n_{10},n_{14}\}.
\end{align*}
\endgroup
%----------------------------------------------------------------------------------------------------------------------%
A prism is divided into $8$ prisms:
\begingroup
\allowdisplaybreaks
\begin{align*}
E^{1}_{\mathrm{PRISM6}} &= \{n_{1},n_{7},n_{9},n_{10},n_{16},n_{18}\},\\
E^{2}_{\mathrm{PRISM6}} &= \{n_{7},n_{2},n_{8},n_{16},n_{11},n_{17}\},\\
E^{3}_{\mathrm{PRISM6}} &= \{n_{9},n_{8},n_{3},n_{18},n_{17},n_{12}\},\\
E^{4}_{\mathrm{PRISM6}} &= \{n_{7},n_{8},n_{9},n_{16},n_{17},n_{18}\},\\
E^{5}_{\mathrm{PRISM6}} &= \{n_{10},n_{16},n_{18},n_{4},n_{13},n_{15}\},\\
E^{6}_{\mathrm{PRISM6}} &= \{n_{16},n_{11},n_{17},n_{13},n_{5},n_{14}\},\\
E^{7}_{\mathrm{PRISM6}} &= \{n_{18},n_{17},n_{12},n_{15},n_{14},n_{6}\},\\
E^{8}_{\mathrm{PRISM6}} &= \{n_{16},n_{17},n_{18},n_{13},n_{14},n_{15}\}.
\end{align*}
\endgroup
%----------------------------------------------------------------------------------------------------------------------%
A hexahedron is divided into $8$ hexahedra:
\begingroup
\allowdisplaybreaks
\begin{align*}
E^{1}_{\mathrm{HEXA8}} &= \{n_{1},n_{9},n_{21},n_{12},n_{13},n_{22},n_{27},n_{25}\},\\
E^{2}_{\mathrm{HEXA8}} &= \{n_{9},n_{2},n_{10},n_{21},n_{22},n_{14},n_{23},n_{27}\},\\
E^{3}_{\mathrm{HEXA8}} &= \{n_{12},n_{21},n_{11},n_{4},n_{25},n_{27},n_{24},n_{16}\},\\
E^{4}_{\mathrm{HEXA8}} &= \{n_{21},n_{10},n_{3},n_{11},n_{27},n_{23},n_{15},n_{24}\},\\
E^{5}_{\mathrm{HEXA8}} &= \{n_{13},n_{22},n_{27},n_{25},n_{5},n_{17},n_{26},n_{20}\},\\
E^{6}_{\mathrm{HEXA8}} &= \{n_{22},n_{14},n_{23},n_{27},n_{17},n_{6},n_{18},n_{26}\},\\
E^{7}_{\mathrm{HEXA8}} &= \{n_{25},n_{27},n_{24},n_{16},n_{20},n_{26},n_{19},n_{8}\},\\
E^{8}_{\mathrm{HEXA8}} &= \{n_{27},n_{23},n_{15},n_{24},n_{26},n_{18},n_{7},n_{19}\}.
\end{align*}
\endgroup
%----------------------------------------------------------------------------------------------------------------------%
As a consequence of this splitting, provided that two initially conforming neighboring elements have the same level of refinement, if one of them is further refined, then the sharing face of this element, which can be a triangular or a quadrilateral face (depending on the kind of elements), will eventually present hanging nodes with a refinement level ratio $\text{2:1}$.\par
%----------------------------------------------------------------------------------------------------------------------%
The \textsc{Tri4Tri} and \textsc{Quad4Quad} interfaces establish the relationship of the master face nodes with the slave face nodes. We can easily set up arrays of neighboring elements and faces. These arrays connect an element with a refinement level $l$ with its direct neighbors that have been refined to the level $l+1$. We use a convention regarding the nodes numbering to describe the \textsc{Tri4Tri} and \textsc{Quad4Quad} interfaces. For the \textsc{Tri4Tri} interface, if a triangular face with nodes numbers $n_{1}$, $n_{2}$, and $n_{3}$ has been split into four triangular faces and the new hanging nodes created after the split have nodes numbers $n_{4}$, $n_{5}$, and $n_{6}$ (their location is depicted in \cref{fig:mesh-refinement:nonconforming-interfaces}, left), then the numbering of the children faces is as follows: first child face $T_{1}=\{n_{1},n_{4},n_{6}\}$, second child face $T_{2}=\{n_{4},n_{2},n_{5}\}$, third child face $T_{3}=\{n_{6},n_{5},n_{3}\}$, fourth child face $T_{4}=\{n_{4},n_{5},n_{6}\}$. In a similar fashion, for the \textsc{Quad4Quad} interface, if a quadrilateral face with nodes numbers $n_{1}$, $n_{2}$, $n_{3}$, and $n_{4}$ has been split into four quadrilateral faces, and the new hanging nodes created after the split have nodes numbers $n_{5}$, $n_{6}$, $n_{7}$, $n_{8}$, and $n_{9}$ (their location is depicted in \cref{fig:mesh-refinement:nonconforming-interfaces}, right), then the numbering of the children faces is as follows: first child face $Q_{1}=\{n_{1},n_{5},n_{9},n_{8}\}$, second child face $Q_{2}=\{n_{5},n_{2},n_{6},n_{9}\}$, third child face $Q_{3}=\{n_{8},n_{9},n_{7},n_{4}\}$, fourth child face $Q_{4}=\{n_{9},n_{6},n_{3},n_{7}\}$. An efficient algorithm to construct the \textsc{Tri4Tri} and \textsc{Quad4Quad} interfaces plays a key role in the preprocessing tool and is discussed later in this work.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=1.0\linewidth]{\figurespath/nonconforming-interfaces.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Hanging nodes numbering convention used by the preprocessing tool for the \textsc{Tri4Tri} (left) and a \textsc{Quad4Quad} (right) interfaces. These interfaces arise between an element with refinement level $l$ and a neighboring element that has been refined up to level $l+1$.}%
%----------------------------------------------------------------------%
\label{fig:mesh-refinement:nonconforming-interfaces}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
For the \textsc{Tri4Tri} interface, the hanging nodes coordinates are computed in the following manner:
\begingroup
\allowdisplaybreaks
\begin{align}
n_{4} &= \frac{1}{2}\left(n_{1}+n_{2}\right),\\
n_{5} &= \frac{1}{2}\left(n_{2}+n_{3}\right),\\
n_{6} &= \frac{1}{2}\left(n_{1}+n_{3}\right),
\end{align}
\endgroup
and for the \textsc{Quad4Quad} interface, the hanging nodes coordinates are calculated as follows:
\begingroup
\allowdisplaybreaks
\begin{align}
n_{5} &= \frac{1}{2}\left(n_{1}+n_{2}\right),\\
n_{6} &= \frac{1}{2}\left(n_{2}+n_{3}\right),\\
n_{7} &= \frac{1}{2}\left(n_{3}+n_{4}\right),\\
n_{8} &= \frac{1}{2}\left(n_{1}+n_{4}\right),\\
n_{9} &= \frac{1}{4}\left(n_{1}+n_{2}+n_{3}+n_{4}\right).
\end{align}
\endgroup
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Algorithms and data structures}
%----------------------------------------------------------------------------------------------------------------------%
The general idea of the mesh refinement methodology used in this work is sketched in \cref{fig:mesh-refinement:flowchart}. Next we will describe with more detail the algorithms associated with the main refinement loop (\cref{alg:MeshPreprocessing}) and those algorithms used by this, like the distribution of the immersed geometry facets in the mesh (\cref{alg:DistributeGeometryInMesh}), the creation of the arrays of nonconforming sides and elements (\cref{alg:CreateNonConformingSidesList}), the flagging of the elements that overlap with the immersed geometry (\cref{alg:FlagElementsOverlappingGeometry}), the flagging of the elements inside of a box region where we want a finer mesh and where the geometry will be finally immersed (\cref{alg:FlagElementsInsideBox}), the flagging of the elements for balancing such that the refinement level ratio $\text{2:1}$ between neighboring elements is preserved (\cref{alg:FlagElementsForBalancing}), and finally, the refinement of the flagged elements (\cref{alg:RefineElements}).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=1.0\linewidth]{\figurespath/flowchart-mesh-refinement.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow diagram sketching the necessary steps to refine a hybrid mesh around an immersed geometry.}%
%----------------------------------------------------------------------%
\label{fig:mesh-refinement:flowchart}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
The algorithms implemented in the preprocessing tool work mainly on the following data structures: arrays, linked lists, hash tables, and $kd$-trees. An array of logical values is used to store the flag of elements to be refined (see \textsc{ElementsToRefine} data structure in the algorithms). An array of floats is used to store the vertices coordinates of the facets composing the immersed geometry (see \textsc{GeometryFacets} data structure in the algorithms). The most important variable is the linked list that stores the elements of the mesh (see \textsc{ElementsList} data structure in the algorithms). Each node of this linked list stores, for the corresponding element, its element identification number, its element type, its number of nodes, its refinement flag, its refinement level, the number of facets that overlap with it, a pointer for the faces of the element, a pointer array of the nodes of the element, and pointers to the previous and next element in the linked list. This data structure includes methods for creating, adding, and removing elements, nodes, and faces in the list itself. In this way, full flexibility in the mesh generation is ensured. Hash tables are used mainly to construct mappings between nodes and faces, which allow to find a face if the nodes that constitute this face are provided. A $kd$-trees is used to find the nearest neighbors of the geometry facets to the mesh elements, so the overlap of the geometry facets with the mesh elements can be efficiently computed.\par
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:MeshPreprocessing} are summarized the main steps to refine a hybrid mesh around an immersed geometry (see \cref{fig:mesh-refinement:flowchart}). The mesh refinement preprocessing tool starts by calling the initialization procedure, where all preprocessing parameters are read from an input file, and then important mesh variables are initialized or allocated. In the second step, the mesh import procedure is called, where an external mesh that has been previously created by, for instance, the GMSH mesh generator, is imported and stored in the \textsc{ElementsList} data structure. In the third step, the geometry import procedure is called, where the surface of the body to be immersed is loaded from a file in STL format and then stored in the \textsc{GeometryFacets} data structure. Next, the nonconforming sides list creation procedure is called, where the \textsc{NonConformingSidesList} data structure is created from the \textsc{ElementsList} data structure. It is important to mention that if the mesh is conforming, which means that there are no hanging nodes in this mesh, then the \textsc{Tri4Tri} and \textsc{Quad4Quad} arrays are not created. As mentioned earlier, these arrays allow us to find in a practical manner the neighboring elements with the refinement level $l+1$ of a given master element with the refinement level $l$. This case occurs only if hanging nodes take place. In the next step, a refined subregion is created, where the immersed geometry will be placed. The idea is to have a coarse mesh far away from the zones where the immersed body surfaces are placed and to have a finer mesh close to these surfaces and even finer very close to them. At this point, the immersed geometry has not been inserted into the computational mesh. The region bounding box is defined in the input parameter file, and all elements in the computational domain (provided by the input body-fitted mesh) that lie inside this region are marked as elements to be refined and also are marked as those elements that require a balancing such that the refinement level ratio $\text{2:1}$ between neighboring elements is preserved. Once all of these elements have been marked, the elements are refined using the \textsc{RefineElements} procedure. This part of the mesh is refined to the level $b_{\mathrm{max}}$. Having refined this box region, refinement of the elements that overlap with the immersed geometry is carried out. In this way, the imported geometry is distributed in the mesh and all elements that intersect with the triangles of the body surface are flagged. To preserve the refinement level ratio $\text{2:1}$ between neighboring elements, the flagging of elements is performed to maintain balance, and finally, all marked elements are refined. These steps are repeated until the maximum level of refinement $l_{\mathrm{max}}$ is reached. The resulting mesh is exported in \textrm{HDF5} format, compatible with the CFD solver.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:MeshPreprocessing}{MeshPreprocessing}{}
\begin{algorithmic}[1]
\Procedure{MeshPreprocessing}{}
\State {\UseAlgorithm{alg:DistributeGeometryInMesh}}
\State {\UseAlgorithm{alg:CreateNonConformingSidesList}}
\State {\UseAlgorithm{alg:FlagElementsOverlappingGeometry}}
\State {\UseAlgorithm{alg:FlagElementsInsideBox}}
\State {\UseAlgorithm{alg:FlagElementsForBalancing}}
\State {\UseAlgorithm{alg:RefineElements}}
\State {\CallProcedure{Initialization}{}}
\State {\CallProcedure{ImportBackgroundMesh}{}}
\State {\CallProcedure{ImportImmersedGeometry}{}}
\State {\CallProcedure{CreateNonConformingSidesList}{}}
\For{b}{1}{b_{\mathrm{max}}}
\State {\CallProcedure{FlagElementsInsideBox}{}}
\State {\CallProcedure{FlagElementsForBalancing}{}}
\State {\CallProcedure{RefineElements}{}}
\State {\CallProcedure{CreateNonConformingSidesList}{}}
\EndFor
\For{l}{b_{\mathrm{max}}+1}{l_{\mathrm{max}}}
\State {\CallProcedure{DistributeGeometryInMesh}{}}
\State {\CallProcedure{FlagElementsOverlappingGeometry}{}}
\State {\CallProcedure{FlagElementsForBalancing}{}}
\State {\CallProcedure{RefineElements}{}}
\State {\CallProcedure{CreateNonConformingSidesList}{}}
\EndFor
\State \CallProcedure{ExportMesh}{}
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:DistributeGeometryInMesh} are sketched the steps to distribute the imported geometry (stored in the \textsc{GeometryFacets} data structure) in the imported unstructured hybrid mesh (stored in the \textsc{ElementsList} data structure). To improve the efficiency of the mesh/geometry overlap computation, the geometry facets barycenters are stored in a $kd$-tree data structure (see \textsc{FacetsBarycenters} variable in the algorithms). After creating the $kd$-tree, the intersection of the mesh elements with the geometry facets is tested. For each element, the neighboring facets in the vicinity of the element itself are sought (this vicinity is defined as a sphere of radius ten times the element size; it is advisable that the facets of the geometry have a size of the same order of magnitude as the elements of the refined box region). If an element/facet overlap takes place, the number of facets that intersect the element is stored in the corresponding node of the \textsc{ElementsList} data structure.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:DistributeGeometryInMesh}{DistributeGeometryInMesh}{}
\begin{algorithmic}[1]
\Procedure{DistributeGeometryInMesh}{}
\State {\UseVariable{ElementsList}{linked list}}
\State {\UseVariable{GeometryFacets}{array}}
\State {\Variable{FacetsBary} $\gets$ \CallFunction{CreateKDTree}{\Variable{GeometryFacets}}}
\State {\Variable{Elem}~$\to$~\Variable{ElementsList.head}}
\While {\Variable{Elem}~\algorithmicnot~\algorithmicnil}
\State {\Variable{BBox} $\gets$ \Variable{Elem.BoundingBox}}
\State {\Variable{Facet} $\gets$ \CallFunction{NearestNeighbors}{\Variable{BBox},\Variable{FacetsBary}}}
\If {\CallFunction{TriangleBoxOverlap}{\Variable{BBox},\Variable{Facet}}}
\State {$\Variable{Elem.nFacets} \gets \Variable{Elem.nFacets}+1$}
\EndIf
\State {\Variable{Elem} $\to$ \Variable{Elem.next}}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:CreateNonConformingSidesList}, the procedure to create the \textsc{Tri4Tri} and \textsc{Quad4Quad} interfaces is explained. The idea is based on the creation of a list with all nonconforming faces of the mesh, that is, the interior faces of the mesh that are not shared between two elements because of the hanging nodes. A face that is shared between two elements shares the same nodes. If hanging nodes are present in the mesh, then two elements can be neighbors while they do not share the same faces (see \cref{fig:mesh-refinement:nonconforming-interfaces}). The goal is to find, for a given master face belonging to an element with refinement level $l$, the neighboring faces belonging to elements with refinement level $l+1$, and that have in common the nodes of the master face. This idea is carried out through the use of hash tables and $kd$-trees data structures. The first step is the creation of nonconforming faces. All interior faces of the mesh belonging to a unique element are stored in the \textsc{NonConformingSidesList}. This list is used to create a hash table for retrieving a face provided its nodes (see \textsc{NodesToFacesMap} data structure). At the same time, a $kd$-tree of the node coordinates of each nonconforming face is created (see \textsc{NonConformingSidesNodes}). With these three data structures, the \textsc{Tri4Tri} and \textsc{Quad4Quad} interfaces can be generated. Using the \textsc{NonConformingSidesList} data structure, the node numbers of a face can be obtained and then the target nodes (these are the hanging nodes) are constructed from these nodes ($n_{4},\ldots,n_{6}$ for a triangular face and $n_{5},\ldots,n_{9}$ for a quadrilateral face); next, the $kd$-tree data structure (\textsc{NonConformingSidesNodes}) is used to check if the target nodes exist and if they are in the hash table, so the slave faces can be built from them and later store them in the \textsc{Tri4Tri} and \textsc{Quad4Quad} arrays. Once these arrays are constructed, the arrays with the master/slave cell and face numbers relations are created, which will be used in \cref{alg:FlagElementsForBalancing} to mark elements for balancing.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:CreateNonConformingSidesList}{CreateNonConformingSidesList}{}
\begin{algorithmic}[1]
\Procedure{CreateNonConformingSidesList}{}
\State {\UseVariable{ElementsList}{linked list}}
\State {\Variable{NCSList} $\gets$ \CallFunction{CreateNCSides}{\Variable{ElementsList}}}
\State {\Variable{NodesToFacesMap} $\gets$ \CallFunction{CreateHashTable}{\Variable{NCSList}}}
\State {\Variable{NCSNodes} $\gets$ \CallFunction{CreateKDTree}{\Variable{NCSList}}}
\State {\Variable{Side}~$\to$~\Variable{NCSList.head}}
\While {\Variable{Side}~\algorithmicnot~\algorithmicnil}
\State {\Variable{NodeIDs} $\gets$ \CallFunction{GetNodeIDs}{\Variable{Side}}}
\State {\Variable{Target} $\gets$ \CallFunction{CreateTargetNodes}{\Variable{NodeIDs}}}
\State {\Variable{Found} $\gets$ \CallFunction{NearestNeighbors}{\Variable{NCSNodes},\Variable{Target}}}
\If {$\Variable{Found}=\Variable{Target}$}
\State {\Variable{Master} $\gets$ \CallFunction{CreateMasterFaces}{\Variable{NodeIDs}}}
\State {\Variable{Slaves} $\gets$ \CallFunction{CreateSlaveFaces}{\Variable{NodeIDs},\Variable{Target}}}
\State {\Variable{MasterSlavesList} $\gets$ \CallFunction{Append}{\Variable{Master},\Variable{Slaves}}}
\EndIf
\State {\Variable{Side} $\to$ \Variable{Side.next}}
\EndWhile
\State {\Variable{Tri4Tri} $\gets$ \CallFunction{CreateArray}{\Variable{MasterSlavesList}}}
\State {\Variable{Quad4Quad} $\gets$ \CallFunction{CreateArray}{\Variable{MasterSlavesList}}}
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:FlagElementsOverlappingGeometry} is shown the creation of the \textsc{ElementsToRefine} array. For each element of the mesh, it is checked if the number of facets intersecting it is greater than zero. If this is the case, the true or false value of this check is stored in the \textsc{ElementsToRefine} array. Recall that in \cref{alg:DistributeGeometryInMesh} this number of facets that overlap with a given element was calculated.
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:FlagElementsOverlappingGeometry}{FlagElementsOverlappingGeometry}{}
\begin{algorithmic}[1]
\Procedure{FlagElementsOverlappingGeometry}{}
\State {\UseVariable{ElementsToRefine}{array}}
\State {\UseVariable{ElementsList}{linked list}}
\State {\Variable{Elem}~$\to$~\Variable{ElementsList.head}}
\While {\Variable{Elem}~\algorithmicnot~\algorithmicnil}
\If {$\Variable{Elem.nFacets}>1$}
\State {\Variable{ElementsToRefine}(\Variable{Elem.ElemID}) $\gets$ \Variable{True}}
\EndIf
\State {\Variable{Elem} $\to$ \Variable{Elem.next}}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:FlagElementsInsideBox}, as mentioned before, the idea is to mark, for each element of the mesh, if the element is within a subregion previously defined in the parameter file. If this is the case, the true or false value of this test is stored in the \textsc{ElementsToRefine} array.
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:FlagElementsInsideBox}{FlagElementsInsideBox}{}
\begin{algorithmic}[1]
\Procedure{FlagElementsInsideBox}{}
\State {\UseVariable{ElementsList}{linked list}}
\State {\UseVariable{ElementsToRefine}{array}}
\State {\Variable{BoxRegion} $\gets$ \CallFunction{CreateBoxRegion}{\Variable{ElementsList}}}
\State {\Variable{Elem}~$\to$~\Variable{ElementsList.head}}
\While {\Variable{Elem}~\algorithmicnot~\algorithmicnil}
\If {\CallFunction{IsInsideBox}{\Variable{Elem},\Variable{BoxRegion}}}
\State {\Variable{ElementsToRefine}(\Variable{Elem.ElemID}) $\gets$ \Variable{True}}
\EndIf
\State {\Variable{Elem} $\to$ \Variable{Elem.next}}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:FlagElementsForBalancing} are outlined the steps to flag elements in such a way that the refinement level ratio $\text{2:1}$ between neighboring elements is preserved. In order to do this task, it is necessary to use the \textsc{Tri4Tri} and \textsc{Quad4Quad} hanging node interfaces. These interfaces enable us to know the connectivity of neighboring cells with the refinement level $l+1$ of a cell with the refinement level $l$ (see \cref{fig:mesh-refinement:nonconforming-interfaces}). With this information, for each \textsc{Tri4Tri} and \textsc{Quad4Quad} interface, we check that the master element with a refinement level $l-1$ has neighboring refined elements with a refinement level $l$ and they are flagged for refinement. In this way, since already refined elements that have been marked for refinement will become refined elements with refinement level $l+1$, we need to flag the master element, whose refinement level is $l-1$, as an element to be refined, so that the refinement level ratio $\text{2:1}$ between neighboring elements is preserved. If the master element is marked for refinement, then this flag is stored in the \textsc{ElementsToRefine} array.
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:FlagElementsForBalancing}{FlagElementsForBalancing}{}
\begin{algorithmic}[1]
\Procedure{FlagElementsForBalancing}{}
\State {\UseVariable{Tri4Tri}{array}}
\State {\UseVariable{Quad4Quad}{array}}
\State {\UseVariable{ElementsToRefine}{array}}
\If {$\Variable{nTri4Tri}>0$}
\For{l}{L-1}{1}
\For{\Variable{i}}{1}{\Variable{nTri4Tri}}
\State {\Variable{Master} $\gets$ \Call{GetMaster}{\Variable{$\Variable{Tri4Tri}(i)$}}}
\State {\Variable{Slaves} $\gets$ \Call{GetSlaves}{\Variable{$\Variable{Tri4Tri}(i)$}}}
\State {\Variable{MasterLevel} $\gets$ \Variable{ElementsToLevel}(\Variable{Master})}
\State {\Variable{Flag1} $\gets$ $\left(\Variable{MasterLevel}=l-1\right)$}
\State {\Variable{Flag2} $\gets$ $\left(\Call{Any}{\Variable{ElementsToRefine}(\Variable{Slaves}}\right)$}
\If {\Variable{Flag1}~\algorithmicand~\Variable{Flag2}}
\State {\Variable{ElementsToRefine}(Master) $\gets$ \Variable{True}}
\EndIf
\EndFor
\EndFor
\EndIf
\If {$\Variable{nQuad4Quad}>0$}
\For{l}{L-1}{1}
\For{\Variable{i}}{1}{\Variable{nQuad4Quad}}
\State {\Variable{Master} $\gets$ \Call{GetMaster}{\Variable{$\Variable{Quad4Quad}(i)$}}}
\State {\Variable{Slaves} $\gets$ \Call{GetSlaves}{\Variable{$\Variable{Quad4Quad}(i)$}}}
\State {\Variable{MasterLevel} $\gets$ \Variable{ElementsToLevel}(\Variable{Master})}
\State {\Variable{Flag1} $\gets$ $\left(\Variable{MasterLevel}=l-1\right)$}
\State {\Variable{Flag2} $\gets$ $\left(\Call{Any}{\Variable{ElementsToRefine}(\Variable{Slaves}}\right)$}
\If {\Variable{Flag1}~\algorithmicand~\Variable{Flag2}}
\State {\Variable{ElementsToRefine}(Master) $\gets$ \Variable{True}}
\EndIf
\EndFor
\EndFor
\EndIf
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{alg:RefineElements}, the refinement of the flagged elements is described. The basic idea is to loop over all elements of the mesh (stored in the \textsc{ElementsList} data structure) and check if the element is marked for refinement (stored in the \textsc{ElementsToRefine} data structure). The flagged element is then refined by calling a splitting procedure corresponding to the element type.
%----------------------------------------------------------------------------------------------------------------------%
\begin{algorithm}{alg:RefineElements}{RefineElements}{}
\begin{algorithmic}[1]
\Procedure{RefineElements}{}
\State {\UseVariable{ElementsList}{linked list}}
\State {\UseVariable{ElementsToRefine}{array}}
\State {\Variable{Elem}~$\to$~\Variable{ElementsList.head}}
\While {\Variable{Elem}~\algorithmicnot~\algorithmicnil}
\If {\Variable{ElementsToRefine}(\Variable{Elem.ElemID})}
\Switch {\Variable{Elem.ElemType}}
\Case {\Variable{TETRA4}}
\State {\CallProcedure{SplitElement\_TETRA4}{\Variable{Elem}}}
\EndCase
\Case {\Variable{HEXA8}}
\State {\CallProcedure{SplitElement\_HEXA8}{\Variable{Elem}}}
\EndCase
\Case {\Variable{PRISM6}}
\State {\CallProcedure{SplitElement\_PRISM6}{\Variable{Elem}}}
\EndCase
\Case {\Variable{PYRA5}}
\State {\CallProcedure{SplitElement\_PYRA5}{\Variable{Elem}}}
\EndCase
\EndSwitch
\EndIf
\State {\Variable{Elem} $\to$ \Variable{Elem.next}}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{algorithm}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Numerical computations}\label{sec:numerical-computations}
%----------------------------------------------------------------------------------------------------------------------%
In this section, we discuss some test problems in order to illustrate the capabilities of the immersed boundary methods on hexahedral and hybrid unstructured meshes refined by our mesh preprocessing tool. These problems are solved by the CODA CFD solver using the Navier--Stokes and Reynolds-Averaged Navier--Stokes equations. The experimental results of most of these problems are reported in the literature, and thus will serve as validation of our methodology. We have employed the second-order finite volume method and the second- and third-order discontinuous Galerkin method, both schemes coupled with the immersed boundary volume penalization. A linearized implicit Euler scheme is employed for the time discretization. All simulations were executed using $\num{192}$ cores on the Magerit Supercomputer at the Supercomputing and Visualization Center of Madrid (CeSViMa).\par
%----------------------------------------------------------------------------------------------------------------------%
All body-fitted meshes have been created with GMSH mesh generator~\cite{geuzaine2009a}. This software was also used to generate the initial background meshes for the immersed boundary computations, which are further refined around the immersed geometry with the preprocessing tool. In \cref{fig:numerical-computations:meshes} are depicted the initial background meshes for the immersed boundary simulations: the full computational domain (left), close-up view of the hybrid unstructured mesh (center) and close-up view of the full hexahedral mesh (right). The initial background mesh is a multiblock circular domain of radius $R=500$. The inner square block has dimensions $[-20,+20]\times[0,1]\times[-20,+20]$.
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/mesh-ibm-base.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mesh-ibm-hybrid.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mesh-ibm-hexahedral.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Initial unstructured background mesh created with GMSH~\cite{geuzaine2009a}, and used in the immersed boundary computations. The full computational domain is a disk of radius $R=500$ (left), with an inner square subdomain with dimensions $[-20,+20]\times[0,1]\times[-20,+20]$. This inner subdomain is made of either hybrid shape elements (center), or only hexahedral elements (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:meshes}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Flow past a cylinder}
%----------------------------------------------------------------------------------------------------------------------%
We start by considering the flow past a two-dimensional circular cylinder in laminar regime. The governing equations we have used for this test are the Navier--Stokes equations with the immersed boundary volume penalization source terms. We present numerical computations based on a body-fitted mesh and also on hexahedral and hybrid unstructured meshes with immersed geometries.\par
%----------------------------------------------------------------------------------------------------------------------%
The computational domain is a disk of radius $R=500$ in the $xz$-plane extruded into the $y$-direction a distance $d=\num{1}$. The cylinder has a diameter $D=\num{1}$. We highlight that all meshes have been created with one element in the extrusion direction. The body-fitted mesh is a full hexahedral mesh with elements on the cylinder surface of size $h=\num{5.06E-4}$. This mesh is made of $\num{120000}$ hexahedral elements. Two different background meshes for the immersed boundary method have been created: the first is a hybrid unstructured mesh made of $\num{307637}$ hexahedra and prisms, and the second mesh is a full hexahedral mesh with $\num{169779}$ elements. Both meshes have been refined around the immersed geometry, with a level of refinement $l=\num{5}$ for the hybrid mesh (smallest element size around the immersed geometry $h=\num{1.25E-3}$) and $l=\num{8}$ for the full hexahedral mesh (smallest element size around the immersed geometry $h=\num{1.56E-3}$). The immersed geometry has $\num{440070}$ triangles with characteristic length $\num{5E-3}$. Close-up views of the computational meshes are shown in \cref{fig:numerical-computations:cylinder:meshes+velocity} (top).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-fv-p1-r00-bfm-hexahedral-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-fv-p1-r05-ibm-hybrid-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-dg-p2-r08-ibm-hexahedral-mesh.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-fv-p1-r00-bfm-hexahedral-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-fv-p1-r05-ibm-hybrid-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/cylinder-dg-p2-r08-ibm-hexahedral-velocity-magnitude.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around a cylinder: computational meshes (top) and contour plots of the velocity magnitude (bottom). The simulation on the body-fitted mesh was performed with a second-order finite volume method (left), the immersed boundary method simulation on the hybrid unstructured mesh with refinement level $l=\num{5}$ was computed with a second-order finite volume method (center), and the immersed boundary method computation on the full hexahedral mesh with refinement level $l=\num{8}$ was computed with a third-order discontinuous Galerkin method (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:cylinder:meshes+velocity}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
Regarding flow conditions, the gas has an adiabatic index $\gamma=\num{1.4}$ and flows with Reynolds number $\mathrm{Re}=\num{40}$ and freestream Mach number $M=\num{0.2}$. The simulations were performed with angle of attack $\alpha=\SI{0}{\degree}$. Under these conditions, the flow remains steady~\cite{canuto2015a}. The non-dimensional density is set to $\rho=\num{1}$, and the non-dimensional pressure $p=\num{1}$. At the boundaries of the computational domain the following boundary conditions were set: far field boundary conditions on the outer face of the disk ($R=500$), and symmetry plane boundary conditions on the front and back faces. For the case of the body-fitted simulation, the cylinder surface was set to the non-slip adiabatic wall boundary condition.\par
%----------------------------------------------------------------------------------------------------------------------%
The simulation based on a body-fitted mesh was performed with a second-order finite volume method (convergence achieved after $\num{53}$ iterations). The simulation based on the immersed boundary method and using the full hexahedral mesh was calculated with a third-order discontinuous Galerkin method (convergence achieved after $\num{143}$ iterations), and the simulation using the hybrid mesh was calculated with a second-order finite volume method (convergence achieved after $\num{315}$ iterations).
Mesh blanking was not used in immersed-boundary-based simulations, which has an important influence on solver performance~\cite{nunez2025a}. In \cref{fig:numerical-computations:cylinder:meshes+velocity} (bottom) is depicted the contour plot of the velocity magnitude for the three cases considered.\par
%----------------------------------------------------------------------------------------------------------------------%
The pressure coefficient $C_{p}$ is plotted in \cref{fig:numerical-computations:cylinder:pressure-coefficient}. The immersed boundary computations are compared with the full body-fitted simulations based on the same CFD solver. In spite of using lower resolution meshes in the vecinity of the immersed geometry, all results show good agreement on the distribution of the pressure coefficient. Some small oscillations can be observed in the plot associated with the solution computed with the finite volume method on the hybrid mesh. Good agreement for the drag coefficient is shown in \cref{tab:numerical-computations:cylinder:drag-coefficient}. The third-order discontinuous Galerkin solution provides a value of the drag coefficient closer to that obtained with the full body-fitted computation.
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.75\linewidth]{\figurespath/cylinder-pressure-coefficient.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around a cylinder: comparison of pressure coefficient at $\mathrm{Re}=\num{40}$, $M=\num{0.2}$ and $\alpha=\SI{0}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a hybrid mesh (FV-$\mathcal{O}2$-IBM) and a third-order discontinuous Galerkin method + immersed boundary method on a hexahedral mesh (DG-$\mathcal{O}3$-IBM).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:cylinder:pressure-coefficient}%
%----------------------------------------------------------------------%
\end{figure}
%----------------------------------------------------------------------------------------------------------------------%
\begin{table}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\setlength{\fboxsep}{0.00pt}%
\renewcommand{\arraystretch}{1.2}%
\arrayrulecolor{base}
\newcolumntype{A}{p{0.3\linewidth}}%
%----------------------------------------------------------------------%
\caption{Flow around a cylinder: drag coefficient at $\mathrm{Re}=\num{40}$, $M=\num{0.2}$ and $\alpha=\SI{0}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a hybrid mesh (FV-$\mathcal{O}2$-IBM) and a third-order discontinuous Galerkin method + immersed boundary method on a hexahedral mesh (DG-$\mathcal{O}3$-IBM).}%
%----------------------------------------------------------------------%
\label{tab:numerical-computations:cylinder:drag-coefficient}%
%----------------------------------------------------------------------%
\begin{tabularx}{1.00\linewidth}{XXll}
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\rowcolor{gray!20}
%-----------------------------------%
Method &
Mesh &
$h_{\mathrm{min}}$ &
$C_{D}$ \\
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
FV-$\mathcal{O}2$-BFM & Full Body-fitted & $\num{5.06E-4}$ & $\num{1.56}$ \\
FV-$\mathcal{O}2$-IBM & IBM Hybrid & $\num{1.56E-3}$ & $\num{1.53}$ \\
DG-$\mathcal{O}3$-IBM & IBM Hexahedral & $\num{1.25E-3}$ & $\num{1.55}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\multicolumn{3}{l}{\citet{canuto2015a}} & $\num{1.56}$ \\
\multicolumn{3}{l}{\citet{yu2022a}} & $\num{1.57}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\end{tabularx}
\end{table}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Flow past an NACA0012 airfoil}
%----------------------------------------------------------------------------------------------------------------------%
The second test we have considered is the flow over an NACA0012 airfoil under weakly compressible flow conditions~\cite{crumpton1993a,jawahar2000a}. The governing equations are again the Navier--Stokes equations. We have performed numerical computations based on a body-fitted mesh and also on hexahedral and hybrid unstructured meshes with immersed geometries. The simulation based on a body-fitted mesh was performed with a second-order finite volume method. The simulation based on the immersed boundary method on the full hexahedral mesh was computed with a second-order discontinuous Galerkin method, and the simulation based on the immersed boundary method on the hybrid mesh was computed with a second-order finite volume method. \par
%----------------------------------------------------------------------------------------------------------------------%
The computational domain is a disk of radius $R=500$ in the $xz$-plane extruded into the $y$-direction a distance $d=\num{1}$. Like in the previous test, all meshes have been created with one element in the extrusion direction. The airfoil chord is $c=\num{1}$. The body-fitted mesh is a hybrid mesh with a layer of hexahedral elements on the surface of the airfoil and a minimum size $h=\num{E-6}$. This mesh is made up of $\num{329731}$ elements. Two different background meshes for the immersed boundary method have been created: the first is a hybrid unstructured mesh made of $\num{1578995}$ hexahedra and prisms, and the second mesh is a full hexahedral mesh with $\num{1867553}$ elements. Both meshes have been refined around the immersed geometry, with a level of refinement $l=\num{4}$ for the hybrid mesh (smallest element size around the immersed geometry $h=\num{1.6E-04}$) and $l=\num{14}$ for the full hexahedral mesh (smallest element size around the immersed geometry $h=\num{6.1E-05}$). The immersed geometry has $\num{817542}$ triangles with characteristic length $\num{2.5E-3}$. The final level of refinement depends on the element size of the initial background mesh in the region to be refined: $h=\num{2.5E-03}$ for the hybrid mesh and $h=\num{3.9E-03}$ for the full hexahedral mesh. Close-up views of the computational meshes are shown in \cref{fig:numerical-computations:naca0012:meshes+velocity} (top).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-fv-p1-r00-bfm-hybrid-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-fv-p1-r04-ibm-hybrid-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-dg-p1-r14-ibm-hexahedral-mesh.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-fv-p1-r00-bfm-hybrid-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-fv-p1-r04-ibm-hybrid-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/naca0012-dg-p1-r14-ibm-hexahedral-velocity-magnitude.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around an NACA0012 airfoil: computational meshes (top) and contour plots of the velocity magnitude (bottom). The simulation on the body-fitted mesh was performed with a second-order finite volume method (left), the immersed boundary method simulation on the hybrid unstructured mesh with refinement level $l=\num{4}$ was computed with a second-order finite volume method (center), and the immersed boundary method computation on the full hexahedral mesh with refinement level $l=\num{14}$ was computed with a second-order discontinuous Galerkin method (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:naca0012:meshes+velocity}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
The flow conditions are the following: the gas has an adiabatic index $\gamma=\num{1.4}$ and flows with Reynolds number $\mathrm{Re}=\num{5000}$ and freestream Mach number $M=\num{0.5}$. The simulations were performed with angle of attack $\alpha=\SI{0}{\degree}$. The non-dimensional density is set to $\rho=\num{1}$, and the non-dimensional pressure $p=\num{1}$. At the boundaries of the computational domain the following boundary conditions were set: the outer face of the disk ($R=500$) is set to far field boundary conditions, and the front and back faces are set to symmetry plane boundary conditions. The airfoil surface was set to the non-slip adiabatic wall boundary condition for the case of the body-fitted simulation.\par
%----------------------------------------------------------------------------------------------------------------------%
The simulation based on a body-fitted mesh was performed with a second-order finite volume method (convergence achieved after $\num{87}$ iterations). The simulation based on the immersed boundary method in the hybrid mesh was calculated with a second-order finite volume method (convergence achieved after $\num{139}$ iterations) and the simulation in the full hexahedral mesh was calculated with a second-order discontinuous Galerkin method (convergence achieved after $\num{147}$ iterations).
The solver stopped iterating once the residual of the conservative variables falls below a predefined threshold ($\delta=\num{E-10}$). In \cref{fig:numerical-computations:naca0012:meshes+velocity} (bottom) is shown the contour plot of the velocity magnitude for the three cases considered.\par
%----------------------------------------------------------------------------------------------------------------------%
In \cref{fig:numerical-computations:naca0012:pressure-coefficient} the pressure coefficient $C_{p}$ is plotted for the different meshes and numerical methods used in this test. We observe a good agreement on the distribution of the pressure coefficient. In \cref{tab:numerical-computations:naca0012:drag-coefficient} we show the drag coefficient, which is in good agreement with the values reported in the literature~\cite{crumpton1993a,jawahar2000a,qiu2016a,swanson2016a}.
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.75\linewidth]{\figurespath/naca0012-pressure-coefficient.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around an NACA0012 airfoil: comparison of pressure coefficient at $\mathrm{Re}=\num{5000}$, $M=\num{0.5}$ and $\alpha=\SI{0}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a hybrid mesh (FV-$\mathcal{O}2$-IBM) and a second-order discontinuous Galerkin method + immersed boundary method on a hexahedral mesh (DG-$\mathcal{O}2$-IBM).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:naca0012:pressure-coefficient}%
%----------------------------------------------------------------------%
\end{figure}
%----------------------------------------------------------------------------------------------------------------------%
\begin{table}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\setlength{\fboxsep}{0.00pt}%
\renewcommand{\arraystretch}{1.2}%
\arrayrulecolor{base}
\newcolumntype{A}{p{0.3\linewidth}}%
%----------------------------------------------------------------------%
\caption{Flow around an NACA0012 airfoil: drag coefficient for computations at $\mathrm{Re}=\num{5000}$, $M=\num{0.5}$ and $\alpha=\SI{0}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a hybrid mesh (FV-$\mathcal{O}2$-IBM) and a second-order discontinuous Galerkin method + immersed boundary method on a hexahedral mesh (DG-$\mathcal{O}2$-IBM).}%
%----------------------------------------------------------------------%
\label{tab:numerical-computations:naca0012:drag-coefficient}%
%----------------------------------------------------------------------%
\begin{tabularx}{1.0\linewidth}{XXll}
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\rowcolor{gray!20}
%-----------------------------------%
Method &
Mesh &
$h_{\mathrm{min}}$ &
$C_{D}$ \\
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
FV-$\mathcal{O}2$-BFM & Full Body-fitted & $\num{1.0E-06}$ & $\num{0.05576}$ \\
FV-$\mathcal{O}2$-IBM & IBM Hybrid & $\num{1.6E-04}$ & $\num{0.05631}$ \\
DG-$\mathcal{O}2$-IBM & IBM Hexahedral & $\num{6.1E-05}$ & $\num{0.05592}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\multicolumn{3}{l}{\citet{crumpton1993a}} & $\num{0.05610}$ \\
\multicolumn{3}{l}{\citet{jawahar2000a}} & $\num{0.05557}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\end{tabularx}
\end{table}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Flow past an MDA30P30N multi-element airfoil}
%----------------------------------------------------------------------------------------------------------------------%
The third test we have considered in the benchmarking is the flow past a multi-element airfoil, namely the McDonnell Douglas 30P-30N landing configuration (MDA30P30N). Extensive experimental and numerical studies have been conducted for the flow past multi-element airfoils in the last decades~\cite{valarezo1991a,valarezo1992a,rogers1994a,rogers1994b,anderson1995a,klausmeyer1997a,rumsey1998a,spaid2000a}. A very well known fact in the aircraft industry is that the accurate prediction of the flow over multi-element airfoils during high-lift conditions allows to enhance the performance and the safety factor of aircrafts. This airfoil has been extensively tested in the NASA Langley Low Turbulence Pressure Tunnel at various Reynolds and Mach numbers and has also been numerically simulated using a wide range of numerical techniques to solve the Navier--Stokes equations along with different turbulence models.\par
%----------------------------------------------------------------------------------------------------------------------%
In our numerical simulations, we have solved the Reynolds-averaged Navier--Stokes equations. The multi-element configuration is characterized by the leading edge slat and the trailing edge flap having a deflection angle of $\SI{30}{\degree}$. Only computations based on a body-fitted mesh for the slat and wing profiles are considered. The immersed geometry corresponds to the flap of the multi-element configuration and, due to the initial background body-fitted mesh, this geometry is placed in a region made of prisms and hexahedra. The equations are solved by the CODA CFD solver based on a second-order finite volume method coupled with the immersed boundary volume penalization method.\par
%----------------------------------------------------------------------------------------------------------------------%
Like in the previous tests, the computational domain is a disk of radius $R=500$ in the $xz$-plane, and it has been extruded into the $y$-direction a distance $d=\num{1}$, with one element in the extrusion direction. The full body-fitted mesh is a hybrid mesh with a layer of hexahedral elements on the slat, wing, and flap surfaces. This viscous layer has a starting size from the surface $h=\num{E-6}$. This mesh is made up of $\num{736472}$ elements. We used the computations on this mesh to compare them with those based on immersed boundary methods. Two hybrid meshes for the simulations based on the immersed boundary methods were considered (both meshes have a layer of hexahedral elements only on the slat and wing surfaces, and the flap geometry is not used during the generation of this body-fitted mesh): the first mesh, with $\num{913456}$ elements, has a region where we place the flap, with the smallest element size around the immersed geometry being $h=\num{2.0E-3}$; the second mesh is obtained by refining the previous mesh around the flap surface up to refinement level $l=\num{7}$, getting a mesh with $\num{4585591}$ elements, where the smallest element size around the immersed geometry is $h=\num{1.6E-05}$. The immersed geometry is made of $\num{376196}$ triangles with characteristic length $\num{2.0E-3}$. Close-up views of the computational meshes are shown in \cref{fig:numerical-computations:mda30p30n:meshes+velocity} (top).\par
%----------------------------------------------------------------------------------------------------------------------%
For this problem, we set the following flow conditions: the gas has an adiabatic index $\gamma=\num{1.4}$ and flows with Reynolds number $\mathrm{Re}=\num{9E6}$ and freestream Mach number $M=\num{0.2}$. The simulations were performed with angle of attack $\alpha=\SI{5.5}{\degree}$. The non-dimensional density is set to $\rho=\num{1}$, and the non-dimensional pressure $p=\num{1}$. At the boundaries of the computational domain the following boundary conditions were set: the outer face of the disk ($R=500D$) is set to far field boundary conditions, and the front and back faces are set to symmetry plane boundary conditions. At slat and wing surfaces were set with non-slip adiabatic wall boundary conditions. On the boundaries of the computational domain the following boundary conditions were set: far field boundary conditions on the outer face of the disk (at $R=500$), and symmetry plane boundary conditions on the front and back faces. At the surfaces of the slat and wing (and also on the flap for the full body-fitted mesh), non-slip adiabatic wall boundary conditions were established.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r00-bfm-hybrid-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r00-bfm-ibm-hybrid-mesh.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r07-bfm-ibm-hybrid-mesh.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r00-bfm-hybrid-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r00-bfm-ibm-hybrid-velocity-magnitude.pdf}%
\hfill%
\includegraphics[width=0.325\linewidth]{\figurespath/mda30p30n-fv-p1-r07-bfm-ibm-hybrid-velocity-magnitude.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around an MDA30P30N multi-element airfoil: computational meshes (top) and contour plots of the velocity magnitude (bottom). The simulation on the full body-fitted mesh for the wing-slat-flap system was performed with a second-order finite volume method (left), and a second-order finite volume method coupled with the immersed boundary volume penalization method was used in the simulations on the hybrid unstructured mesh without refinement (center) and on the hybrid mesh with refinement level $l=\num{7}$ (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:mda30p30n:meshes+velocity}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
In \cref{fig:numerical-computations:mda30p30n:meshes+velocity} (bottom), the contour plots of the velocity magnitude are depicted for the three cases considered. The solution obtained on the full body-fitted mesh is our reference solution (\cref{fig:numerical-computations:mda30p30n:meshes+velocity} (bottom-left)). In the figure, we can observe a remarkable discrepancy between the flow characteristics on the upper surface of the flap between the simulations on the hybrid unstructured mesh without refinement (bottom-center) and the one on the hybrid mesh with refinement (bottom-right). The computations on the fine mesh are in good agreement with the full body-fitted simulation, except for the small separation region present on the suction side of the upstream side of the trailing edge of the flap. Analysis of the pressure coefficient $C_{p}$ (see \cref{fig:numerical-computations:mda30p30n:pressure-coefficient}) allows us to confirm the very good agreement between the experimental data (taken from~\citet{murayama2014b}), the full body-fitted mesh calculations and those based on the fine mesh, and also allows us to conclude that the results obtained on the coarse mesh and using immersed boundary methods have a notable disagreement with respect to the experimental data on the upper surface of the slat, wing and flap. The employment of the immersed boundary methods requires very fine meshes around the immersed geometry. The lift coefficient values are shown in \cref{tab:numerical-computations:mda30p30n:lift-coefficient}. The computations based on immersed boundary methods show a large difference in the lift coefficient for the case of the coarse mesh, but this difference becomes smaller as the mesh is refined, getting closer to the experimental value $C_{L}=\num{2.876}$, taken from~\cite{murayama2014b,wu2023a}.\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.75\linewidth]{\figurespath/mda30p30n-pressure-coefficient.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flow around an MDA30P30N multi-element airfoil: comparison of pressure coefficient at $\mathrm{Re}=\num{9.0E06}$, $M=\num{0.2}$ and $\alpha=\SI{5.5}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a coarse hybrid mesh and a fine hybrid mesh (FV-$\mathcal{O}2$-IBM). Experimental data from~\citet{murayama2014b} are also shown.}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:mda30p30n:pressure-coefficient}%
%----------------------------------------------------------------------%
\end{figure}
%----------------------------------------------------------------------------------------------------------------------%
\begin{table}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\setlength{\fboxsep}{0.00pt}%
\renewcommand{\arraystretch}{1.2}%
\arrayrulecolor{base}
\newcolumntype{A}{p{0.3\linewidth}}%
%----------------------------------------------------------------------%
\caption{Flow around an MDA30P30N multi-element airfoil: lift coefficient at $\mathrm{Re}=\num{9.0E06}$, $M=\num{0.2}$ and $\alpha=\SI{5.5}{\degree}$. Values were obtained with a second-order finite volume method on a full body-fitted mesh (FV-$\mathcal{O}2$-BFM), a second-order finite volume scheme + immersed boundary method on a coarse hybrid mesh and a fine hybrid mesh (FV-$\mathcal{O}2$-IBM). Numerical and experimental data from~\citet{murayama2014b,wu2023a} are also shown.}%
%----------------------------------------------------------------------%
\label{tab:numerical-computations:mda30p30n:lift-coefficient}%
%----------------------------------------------------------------------%
\begin{tabularx}{1.0\linewidth}{XXll}
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\rowcolor{gray!20}
%-----------------------------------%
Method &
Mesh &
$h_{\mathrm{min}}$ &
$C_{L}$ \\
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
FV-$\mathcal{O}2$-BFM & Full Body-fitted & $\num{1.0E-06}$ & $\num{2.847E0}$ \\
FV-$\mathcal{O}2$-IBM & IBM Hybrid & $\num{2.0E-03}$ & $\num{2.040E0}$ \\
FV-$\mathcal{O}2$-IBM & IBM Hybrid & $\num{1.6E-05}$ & $\num{2.776E0}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\multicolumn{3}{l}{\citet{wu2023a}} & $\num{2.820E0}$ \\
\multicolumn{3}{l}{\citet{murayama2014b}} & $\num{2.876E0}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\end{tabularx}
\end{table}
%----------------------------------------------------------------------------------------------------------------------%
\subsection{Optimization of flap positioning}
%----------------------------------------------------------------------------------------------------------------------%
Finally, we want to illustrate with the following example an industrial application of the immersed boundary methods along with the mesh refinement tool we have developed. The application consists in optimizing the flap position in a two-element airfoil with respect to the lift coefficient. To this end, we have developed an optimization methodology using the open-source GEMSEO optimization suite and the CODA CFD solver. GEMSEO stands for Generic Engine for Multidisciplinary Scenarios, Exploration and Optimization~\citep{gallard2018a}. GEMSEO is an open source Python software designed to automate multidisciplinary processes, starting with multidisciplinary design optimization ones, and offering a catalog of different algorithms and formulations to make this automation possible.\par
%----------------------------------------------------------------------------------------------------------------------%
Our optimization methodology can use either full body-fitted meshes or meshes with immersed geometries. The first case requires the mesh generation tool to remesh the grid at each optimization function evaluation, while the second case can remesh an initial background mesh via our preprocessing tool to adjust the mesh to the immersed geometry or can simply use an initial background mesh which is already refined in a larger region covering all possible locations of the immersed geometry during the optimization, avoiding the need to remeshing at each function evaluation. Our aim with the optimization procedure is to maximize the lift coefficient under a given high-lift flight condition. We use GEMSEO and CODA CFD solver to perform this task, where the position of the flap is modified and the main airfoil location is held fixed. We have selected the profile corresponding to the HERA cross-section of the wing/flap at $y=\SI{5}{m}$ from the original $\mathrm{3D}$ setup, as seen in \cref{fig:numerical-computations:hera-wing-flap:geometry-slice} (left). The position of the flap with respect to the wing is characterized by the variables: gap, overlap, and deflection angle. The gap and overlap variables are measured with respect to the trailing edge coordinates of the wing and the leading edge of the flap. The deflection angle is the angle between the chord of the wing and the chord of the flap, as seen in \cref{fig:numerical-computations:hera-wing-flap:geometry-slice} (right).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.49\linewidth]{\figurespath/hera-wing-flap-geometry-slice.pdf}%
\hfill
\includegraphics[width=0.49\linewidth]{\figurespath/hera-wing-flap-description.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Wing/flap $\mathrm{3D}$ configuration (left) and its $\mathrm{2D}$ cross-section at $y=\SI{5}{m}$ (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:hera-wing-flap:geometry-slice}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=\linewidth]{\figurespath/flowchart-optimization.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Flowchart of the optimization methodology used in this work.}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:hera-wing-flap:flowchart-optimization}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
The optimization is carried out with GEMSEO using the following design variables: angle of attack, gap, overlap, and deflection angle of the flap with respect to the wing. The general workflow is sketched in \cref{fig:numerical-computations:hera-wing-flap:flowchart-optimization}. The objective function (maximum lift or $L/D$) requires calculating the flow through the wing/flap system with the design variables as input variables, and a mesh file created for each configuration of the airfoil. An initial unstructured body-fitted mesh of the domain containing the wing is created, and this mesh is further refined in the region where the flap is located according to the position given by the optimizer. The CODA CFD solver simulates the flow past the wing/flap system for the current position of the flap, with appropriate initial and boundary conditions according to the high-lift flight configuration. In the first optimization step, the output of the objective function is the maximization of the lift coefficient. GEMSEO will call this objective function as many times as the optimization algorithm requires. The COBYQA optimization algorithm is used because of its excellent convergence properties and because it does not require the computation of the adjoint. COBYQA stands for Constrained Optimization BY Quadratic Approximations, and it is designed to supersede COBYLA as a general derivative-free optimization solver. It can handle unconstrained, bound-constrained, linearly constrained, and nonlinearly constrained problems. It uses only function values of the objective and constraint functions, if any. No derivative information is needed. Note that other optimization algorithms are available in GEMSEO and can be adapted to the framework with minimum effort.\par
%----------------------------------------------------------------------------------------------------------------------%
The convergence history of the optimization process is presented in \cref{fig:numerical-computations:hera-wing-flap:convergence-history}. We point out that GEMSEO along with the COBYQA algorithm was able to converge after $\num{76}$ iterations, also in $\num{76}$ CODA evaluations. In the figure, the evolution of the lift coefficient for different wing/flap configurations is shown. The values of the design variables for the optimal position of the flap where the lift coefficient is maximum are summarized in \cref{tab:numerical-computations:hera-wing-flap:lift-coefficient}. Additionally, we show the contour plots of the velocity magnitude for the baseline configuration \cref{fig:numerical-computations:hera-wing-flap:velocity-magnitude} (left) and the optimal configuration \cref{fig:numerical-computations:hera-wing-flap:velocity-magnitude} (right).\par
%----------------------------------------------------------------------------------------------------------------------%
\begin{table}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\setlength{\fboxsep}{0.00pt}%
\renewcommand{\arraystretch}{1.2}%
\arrayrulecolor{base}
\newcolumntype{A}{p{0.3\linewidth}}%
%----------------------------------------------------------------------%
\caption{Optimization of flap position: design variables values of the original and optimized configurations. The flow conditions are $\mathrm{Re}=\num{12.0E06}$ and $M=\num{0.2}$.}
%----------------------------------------------------------------------%
\label{tab:numerical-computations:hera-wing-flap:lift-coefficient}%
%----------------------------------------------------------------------%
\begin{tabularx}{1.0\linewidth}{Xlllll}
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\rowcolor{gray!20}
%-----------------------------------%
Configuration &
$\alpha$ &
$\delta_{\mathrm{Overlap}}$ &
$\delta_{\mathrm{Gap}}$ &
$\theta_{\mathrm{Flap}}$ &
$C_{L\mathrm{max}}$ \\
%-----------------------------------%
\specialrule{2.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
% % % Original & $\SI{16}{\degree}$ & $\num{0.0}$ & $\num{0.0}$ & $\SI{30}{\degree}$ & $\num{1.5880}$ \\
% % % Optimized & $\SI{16}{\degree}$ & $\num{5.3392E-2}$ & $\num{2.5207E-4}$ & $\SI{36.68}{\degree}$ & $\num{1.6557}$ \\
Original & $\SI{16}{\degree}$ & $\num{0.0}$ & $\num{0.0}$ & $\SI{30}{\degree}$ & $\num{1.5880}$ \\
Optimized & $\SI{16}{\degree}$ & $\num{0.053}$ & $\num{0.000252}$ & $\SI{36.68}{\degree}$ & $\num{1.6557}$ \\
%-----------------------------------%
\specialrule{1.00pt}{0.00pt}{0.00pt}
%-----------------------------------%
\end{tabularx}
\end{table}
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.75\linewidth]{\figurespath/hera-wing-flap-optimization.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Optimization of flap position: Convergence history of the optimization process, showing the angle of attack and flap deflection design variables, and the target variable lift coefficient.}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:hera-wing-flap:convergence-history}%
%----------------------------------------------------------------------%
\end{figure}
%----------------------------------------------------------------------------------------------------------------------%
\begin{figure*}
%----------------------------------------------------------------------%
\centering
%----------------------------------------------------------------------%
\includegraphics[width=0.49\linewidth]{\figurespath/hera-wing-flap-aoa-16.00-velocity-magnitude-original.pdf}%
\hfill%
\includegraphics[width=0.49\linewidth]{\figurespath/hera-wing-flap-aoa-16.00-velocity-magnitude-optimized.pdf}%
%----------------------------------------------------------------------%
\\[\medskipamount]
%----------------------------------------------------------------------%
\caption{Optimization of flap position: contour plots of the velocity magnitude for the baseline configuration of the airfoil-flap system (left) and the optimized airfoil-flap configuration (right).}%
%----------------------------------------------------------------------%
\label{fig:numerical-computations:hera-wing-flap:velocity-magnitude}%
%----------------------------------------------------------------------%
\end{figure*}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section{Conclusions}\label{sec:conclusions}
%----------------------------------------------------------------------------------------------------------------------%
We have developed a new preprocessing tool that enables mesh adaptation on hybrid unstructured meshes for immersed boundary method simulations, providing flexibility for complex geometries in computational fluid dynamics. The preprocessing tool places immersed bodies in unstructured body-fitted meshes made of different types of elements, such as tetrahedra, hexahedra, prisms, and pyramids, and can refine the mesh around the surface of the geometry to enhance accuracy and efficiency in complex computational fluid dynamics simulations. This approach can be used to treat only geometrical details (control surfaces, ice shapes, etc.) as immersed in a body-fitted, wall-resolved mesh of a clean aerodynamic surface. The unstructured hybrid meshes refined with our preprocessing tool are compatible with the finite volume and discontinuous Galerkin methods coupled with the immersed boundary volume penalization scheme.\par
%----------------------------------------------------------------------------------------------------------------------%
The main data structures and algorithms used in the development of the mesh preprocessing tool are explained in detail. Arrays, linked lists, hash tables and $kd$-trees data structures were implemented to allow the processing and refinement of dynamic meshes with different types of elements and with hanging nodes. The mesh is stored in a linked list, and the immersed geometry in an array. Hash tables and $kd$-trees were used to distribute the geometry in the mesh and to create the interfaces that establish the relationship of the master face nodes with the slave face nodes. Efficient algorithms to compute the overlap of the mesh elements with the facets of the geometry were taken from the current computer graphics state-of-the-art algorithms.\par
%----------------------------------------------------------------------------------------------------------------------%
Several numerical computations were performed by solving the Navier--Stokes and Reynolds-Averaged Navier--Stokes equations: the subsonic flow past a cylinder, the subsonic flow past an NACA0012 airfoil, and the subsonic flow past an MDA30P30N multi-element airfoil. As input meshes, full hexahedral and hybrid unstructured meshes were used for the simulations based on finite volume and discontinuous Galerkin methods coupled with the immersed boundary volume penalization scheme. In spite of using lower resolution meshes in the vicinity of the immersed geometry, all results are in good agreement with the corresponding full body-fitted computations and also with the experimental data for the pressure coefficient curves and the lift and drag coefficients. Our findings allow us to conclude that finer meshes are required if an excellent agreement is sought, but, as a consequence, the number of elements of the refined mesh will increase. Convergence can be accelerated if mesh blanking is used. In addition to the cases considered on the test bench, an industrial application example was investigated: optimization of the flap position in a two-element airfoil with respect to the lift coefficient. An optimization methodology was developed using the open-source GEMSEO optimization framework, the CODA CFD solver, and our mesh preprocessing tool. GEMSEO used the COBYQA optimization algorithm, and the optimization was performed using maximum lift as the objective function. The results were consistent with a similar optimization workflow with only body-fitted meshes generated by a mesh generator like GMSH.\par
%----------------------------------------------------------------------------------------------------------------------%
Future work will include the extension of the mesh preprocessing tool to parallel systems and with acceleration performed with graphics processor units. A parallel version of the code will enable the generation of refined meshes with up to a billion elements in a flexible and efficient manner. These large meshes are typical in complex three-dimensional geometries, such as an aircraft or a wind turbine with moving blades.\par
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% CREDIT AUTHORSHIP CONTRIBUTION DETAILS
%----------------------------------------------------------------------------------------------------------------------%
\printcredits
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\section*{Acknowledgments}
%----------------------------------------------------------------------------------------------------------------------%
Jonatan Núñez-de la Rosa, Esteban Ferrer, and Eusebio Valero acknowledge the funding received by the Grant NextSim\slash AEI\slash 10.13039\slash 501100011033 and H2020, Grant Agreement No. 956104. This project has received funding from the Clean Aviation Joint Undertaking under the European Union's Horizon Europe Research and Innovation Programme under Grant Agreement HERA (Hybrid-Electric Regional Architecture) No. 101102007. However, the views and opinions expressed are those of the author(s) only and do not necessarily reflect those of the European Union or CAJU. Neither the European Union nor the granting authority can be held responsible for them. Finally, all authors gratefully acknowledge the Universidad Politécnica de Madrid (\url{www.upm.es}) for providing computing resources on the Magerit Supercomputer.
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
% BIBLIOGRAPHY
%----------------------------------------------------------------------------------------------------------------------%
\bibliographystyle{cas-model2-names}
\bibliography{references}
% % % \input{article.bbl}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\end{document}
%----------------------------------------------------------------------------------------------------------------------%
%
%----------------------------------------------------------------------------------------------------------------------%
\typeout{get arXiv to do 4 passes: Label(s) may have changed. Rerun}
%----------------------------------------------------------------------------------------------------------------------%
\begin{thebibliography}{67}
\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
\providecommand{\url}[1]{\texttt{#1}}
\providecommand{\href}[2]{#2}
\providecommand{\path}[1]{#1}
\providecommand{\DOIprefix}{doi:}
\providecommand{\ArXivprefix}{arXiv:}
\providecommand{\URLprefix}{URL: }
\providecommand{\Pubmedprefix}{pmid:}
\providecommand{\doi}[1]{\href{http://dx.doi.org/#1}{\path{#1}}}
\providecommand{\Pubmed}[1]{\href{pmid:#1}{\path{#1}}}
\providecommand{\bibinfo}[2]{#2}
\ifx\xfnm\relax \def\xfnm[#1]{\unskip,\space#1}\fi
%Type = Article
\bibitem[{{A}balakin et~al.(2016){A}balakin, {Z}hdanova and
{K}ozubskaya}]{abalakin2016a}
\bibinfo{author}{{A}balakin, I.}, \bibinfo{author}{{Z}hdanova, N.},
\bibinfo{author}{{K}ozubskaya, T.}, \bibinfo{year}{2016}.
\newblock \bibinfo{title}{{I}mmersed boundary method implemented for the
simulationof an external flow on unstructured meshes}.
\newblock \bibinfo{journal}{{M}athematical {M}odels and {C}omputer
{S}imulations} \bibinfo{volume}{8}, \bibinfo{pages}{219--230}.
\newblock \DOIprefix\doi{10.1134/S2070048216030029}.
%Type = Article
\bibitem[{{A}nderson et~al.(1995){A}nderson, {B}onhaus, {M}c{G}hee and
{W}alker}]{anderson1995a}
\bibinfo{author}{{A}nderson, W.}, \bibinfo{author}{{B}onhaus, D.},
\bibinfo{author}{{M}c{G}hee, R.}, \bibinfo{author}{{W}alker, B.},
\bibinfo{year}{1995}.
\newblock \bibinfo{title}{{N}avier--{S}tokes computations and experimental
comparisons for multielement airfoil configurations}.
\newblock \bibinfo{journal}{{J}ournal of {A}ircraft} \bibinfo{volume}{32},
\bibinfo{pages}{1246--1253}.
\newblock \DOIprefix\doi{10.2514/3.46871}.
%Type = Article
\bibitem[{{B}assi et~al.(2012){B}assi, {B}otti, {C}olombo, {Di Pietro} and
{T}esini}]{bassi2012a}
\bibinfo{author}{{B}assi, F.}, \bibinfo{author}{{B}otti, L.},
\bibinfo{author}{{C}olombo, A.}, \bibinfo{author}{{Di Pietro}, D.},
\bibinfo{author}{{T}esini, P.}, \bibinfo{year}{2012}.
\newblock \bibinfo{title}{{O}n the flexibility of agglomeration based physical
space discontinuous {G}alerkin discretizations}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{231}, \bibinfo{pages}{45--65}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2011.08.018}.
%Type = Article
\bibitem[{{B}assi and {R}ebay(1997)}]{bassi1997b}
\bibinfo{author}{{B}assi, F.}, \bibinfo{author}{{R}ebay, S.},
\bibinfo{year}{1997}.
\newblock \bibinfo{title}{{A} high-order accurate discontinuous finite element
method for the numerical solution of the compressible {N}avier--{S}tokes
equations}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{131}, \bibinfo{pages}{267--279}.
\newblock \DOIprefix\doi{10.1006/jcph.1996.5572}.
%Type = Article
\bibitem[{{B}azilevs et~al.(2014){B}azilevs, {T}akizawa, {T}ezduyar, {H}su,
{K}ostov and {M}c{I}ntyre}]{bazilevs2014a}
\bibinfo{author}{{B}azilevs, Y.}, \bibinfo{author}{{T}akizawa, K.},
\bibinfo{author}{{T}ezduyar, T.}, \bibinfo{author}{{H}su, M.C.},
\bibinfo{author}{{K}ostov, N.}, \bibinfo{author}{{M}c{I}ntyre, S.},
\bibinfo{year}{2014}.
\newblock \bibinfo{title}{{A}erodynamic and {FSI} analysis of wind turbines
with the {ALE}-{VMS} and {ST}-{VMS} methods}.
\newblock \bibinfo{journal}{{A}rchives of {C}omputational {M}ethods in
{E}ngineering} \bibinfo{volume}{21}, \bibinfo{pages}{359--398}.
\newblock \DOIprefix\doi{10.1007/s11831-014-9119-7}.
%Type = Article
\bibitem[{{B}erta et~al.(2024){B}erta, {M}ignone, {B}ugli and
{M}attia}]{berta2024a}
\bibinfo{author}{{B}erta, V.}, \bibinfo{author}{{M}ignone, A.},
\bibinfo{author}{{B}ugli, M.}, \bibinfo{author}{{M}attia, G.},
\bibinfo{year}{2024}.
\newblock \bibinfo{title}{{A} 4th-order accurate finite volume method for ideal
classical and special relativistic {MHD} based on pointwise reconstructions}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{499}, \bibinfo{pages}{112701}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2023.112701}.
%Type = Book
\bibitem[{{B}lazek(2015)}]{blazek2015a}
\bibinfo{author}{{B}lazek, J.}, \bibinfo{year}{2015}.
\newblock \bibinfo{title}{{C}omputational {F}luid {D}ynamics: {P}rinciples and
{A}pplications}.
\newblock \bibinfo{edition}{3} ed., \bibinfo{publisher}{{E}lsevier {S}cience},
\bibinfo{address}{{A}msterdam}.
%Type = Article
\bibitem[{{B}lokland et~al.(2007){B}lokland, van~der {H}olst, {K}eppens and
{G}oedbloed}]{blokland2007a}
\bibinfo{author}{{B}lokland, J.W.}, \bibinfo{author}{van~der {H}olst, B.},
\bibinfo{author}{{K}eppens, R.}, \bibinfo{author}{{G}oedbloed, H.},
\bibinfo{year}{2007}.
\newblock \bibinfo{title}{{PHOENIX}: {MHD} spectral code for rotating
laboratory and gravitating astrophysical plasmas}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{226}, \bibinfo{pages}{509--533}.
%Type = Article
\bibitem[{{B}oukharfane et~al.(2018){B}oukharfane, {R}ibeiro, {B}ouali and
{M}ura}]{boukharfane2018a}
\bibinfo{author}{{B}oukharfane, R.}, \bibinfo{author}{{R}ibeiro, F.},
\bibinfo{author}{{B}ouali, Z.}, \bibinfo{author}{{M}ura, A.},
\bibinfo{year}{2018}.
\newblock \bibinfo{title}{{A} combined ghost-point-forcing / direct-forcing
immersed boundary method ({IBM}) for compressible flow simulations}.
\newblock \bibinfo{journal}{{C}omputers \& {F}luids} \bibinfo{volume}{162},
\bibinfo{pages}{91--112}.
\newblock \DOIprefix\doi{10.1016/j.compfluid.2017.11.018}.
%Type = Article
\bibitem[{{C}anuto and {T}aira(2015)}]{canuto2015a}
\bibinfo{author}{{C}anuto, D.}, \bibinfo{author}{{T}aira, K.},
\bibinfo{year}{2015}.
\newblock \bibinfo{title}{{T}wo-dimensional compressible viscous flow around a
circular cylinder}.
\newblock \bibinfo{journal}{{J}ournal of {F}luid {M}echanics}
\bibinfo{volume}{785}, \bibinfo{pages}{349--371}.
\newblock \DOIprefix\doi{10.1017/jfm.2015.635}.
%Type = Article
\bibitem[{{C}apizzano(2011)}]{capizzano2011a}
\bibinfo{author}{{C}apizzano, F.}, \bibinfo{year}{2011}.
\newblock \bibinfo{title}{{T}urbulent wall model for immersed boundary
methods}.
\newblock \bibinfo{journal}{{AIAA} {J}ournal} \bibinfo{volume}{49},
\bibinfo{pages}{2367--2381}.
\newblock \DOIprefix\doi{10.2514/1.J050466}.
%Type = Article
\bibitem[{{C}apizzano(2016)}]{capizzano2016a}
\bibinfo{author}{{C}apizzano, F.}, \bibinfo{year}{2016}.
\newblock \bibinfo{title}{{C}oupling a wall diffusion model with an immersed
boundary technique}.
\newblock \bibinfo{journal}{{AIAA} {J}ournal} \bibinfo{volume}{54},
\bibinfo{pages}{728--734}.
\newblock \DOIprefix\doi{10.2514/1.J054197}.
%Type = Article
\bibitem[{{C}apizzano(2018)}]{capizzano2018a}
\bibinfo{author}{{C}apizzano, F.}, \bibinfo{year}{2018}.
\newblock \bibinfo{title}{{A}utomatic generation of locally refined {C}artesian
meshes: {D}ata management and algorithms}.
\newblock \bibinfo{journal}{{I}nternational {J}ournal of {N}umerical {M}ethods
in {E}ngineering} \bibinfo{volume}{113}, \bibinfo{pages}{789--813}.
\newblock \DOIprefix\doi{10.1002/nme.5636}.
%Type = Article
\bibitem[{{C}onstant et~al.(2024){C}onstant, {P}{\'{e}}ron, {B}eaugendre and
{B}enoit}]{constant2024a}
\bibinfo{author}{{C}onstant, B.}, \bibinfo{author}{{P}{\'{e}}ron, S.},
\bibinfo{author}{{B}eaugendre, H.}, \bibinfo{author}{{B}enoit, C.},
\bibinfo{year}{2024}.
\newblock \bibinfo{title}{{A}n improved immersed boundary method for turbulent
flow simulations on {C}artesian grids: extension of a global geometric
approach for thin boundary layers and strong flow incidence}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{519}, \bibinfo{pages}{113441}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2024.113441}.
%Type = Article
\bibitem[{{C}rumpton et~al.(1993){C}rumpton, {M}ackenzie and
{M}orton}]{crumpton1993a}
\bibinfo{author}{{C}rumpton, P.}, \bibinfo{author}{{M}ackenzie, J.},
\bibinfo{author}{{M}orton, K.}, \bibinfo{year}{1993}.
\newblock \bibinfo{title}{{C}ell vertex algorithms for the compressible
{N}avier--{S}tokes equations}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{109}, \bibinfo{pages}{1--15}.
\newblock \DOIprefix\doi{10.1006/jcph.1993.1194}.
%Type = Article
\bibitem[{{{D}e {V}anna} et~al.(2020){{D}e {V}anna}, {P}icano and
{B}enini}]{de-vanna2020a}
\bibinfo{author}{{{D}e {V}anna}, F.}, \bibinfo{author}{{P}icano, F.},
\bibinfo{author}{{B}enini, E.}, \bibinfo{year}{2020}.
\newblock \bibinfo{title}{{A} sharp-interface immersed boundary method for
moving objects in compressible viscous flows}.
\newblock \bibinfo{journal}{{C}omputers \& {F}luids} \bibinfo{volume}{201},
\bibinfo{pages}{104415}.
\newblock \DOIprefix\doi{10.1016/j.compfluid.2019.104415}.
%Type = Article
\bibitem[{{E}ngels et~al.(2015){E}ngels, {K}olomenskiy, {S}chneider and
{S}esterhenn}]{engels2015a}
\bibinfo{author}{{E}ngels, T.}, \bibinfo{author}{{K}olomenskiy, D.},
\bibinfo{author}{{S}chneider, K.}, \bibinfo{author}{{S}esterhenn, J.},
\bibinfo{year}{2015}.
\newblock \bibinfo{title}{{N}umerical simulation of fluid-structure interaction
with the volume penalization method}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{281}, \bibinfo{pages}{96--115}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2014.10.005}.
%Type = Article
\bibitem[{{F}adlun et~al.(2000){F}adlun, {V}erzicco, {O}rlandi and {M}ohd
{Y}usof}]{fadlun2000a}
\bibinfo{author}{{F}adlun, E.}, \bibinfo{author}{{V}erzicco, R.},
\bibinfo{author}{{O}rlandi, P.}, \bibinfo{author}{{M}ohd {Y}usof, J.},
\bibinfo{year}{2000}.
\newblock \bibinfo{title}{{C}ombined {I}mmersed-{B}oundary
{F}inite-{D}ifference {M}ethods for {T}hree-{D}imensional {C}omplex {F}low
{S}imulations}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{161}, \bibinfo{pages}{35--60}.
\newblock \DOIprefix\doi{10.1006/jcph.2000.6484}.
%Type = Inproceedings
\bibitem[{{G}allard et~al.(8--12 {J}anuary 2018){G}allard, {V}anaret, {G}uenot,
{G}achelin, {L}afage, {P}auwels, {B}arjhoux and {G}azaix}]{gallard2018a}
\bibinfo{author}{{G}allard, F.}, \bibinfo{author}{{V}anaret, C.},
\bibinfo{author}{{G}uenot, D.}, \bibinfo{author}{{G}achelin, V.},
\bibinfo{author}{{L}afage, R.}, \bibinfo{author}{{P}auwels, B.},
\bibinfo{author}{{B}arjhoux, P.J.}, \bibinfo{author}{{G}azaix, A.},
\bibinfo{year}{8--12 {J}anuary 2018}.
\newblock \bibinfo{title}{{GEMS}: {A} {P}ython library for automation of
multidisciplinary design optimization process generation}, in:
\bibinfo{booktitle}{{P}roceedings of the 2018 {AIAA}/{ASCE}/{AHS}/{ASC}
{S}tructures, {S}tructural {D}ynamics, and {M}aterials {C}onference},
\bibinfo{address}{{K}issimmee, {F}lorida, {USA}}.
\newblock \DOIprefix\doi{10.2514/6.2018-0657}.
%Type = Article
\bibitem[{{G}euzaine and {R}emacle(2009)}]{geuzaine2009a}
\bibinfo{author}{{G}euzaine, C.}, \bibinfo{author}{{R}emacle, J.F.},
\bibinfo{year}{2009}.
\newblock \bibinfo{title}{{G}msh: {A} {3-{D}} finite element mesh generator
with built-in pre- and post-processing facilities}.
\newblock \bibinfo{journal}{{I}nternational {J}ournal for {N}umerical {M}ethods
in {E}ngineering} \bibinfo{volume}{79}, \bibinfo{pages}{1309--1331}.
\newblock \DOIprefix\doi{10.1002/nme.2579}.
%Type = Article
\bibitem[{{G}hias et~al.(2007){G}hias, {M}ittal and {D}ong}]{ghias2007a}
\bibinfo{author}{{G}hias, R.}, \bibinfo{author}{{M}ittal, R.},
\bibinfo{author}{{D}ong, H.}, \bibinfo{year}{2007}.
\newblock \bibinfo{title}{{A} sharp interface immersed boundary method for
compressible viscous flows}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{225}, \bibinfo{pages}{528--553}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2006.12.007}.
%Type = Article
\bibitem[{{G}oldstein et~al.(1993){G}oldstein, {H}andler and
{S}irovich}]{goldstein1993a}
\bibinfo{author}{{G}oldstein, D.}, \bibinfo{author}{{H}andler, R.},
\bibinfo{author}{{S}irovich, L.}, \bibinfo{year}{1993}.
\newblock \bibinfo{title}{{M}odeling a no-slip flow boundary with an external
force field}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{105}, \bibinfo{pages}{354--366}.
\newblock \DOIprefix\doi{10.1006/jcph.1993.1081}.
%Type = Article
\bibitem[{{G}riffith and {P}atankar(2020)}]{griffith2020a}
\bibinfo{author}{{G}riffith, B.}, \bibinfo{author}{{P}atankar, N.},
\bibinfo{year}{2020}.
\newblock \bibinfo{title}{{I}mmersed methods for fluid-structure interaction}.
\newblock \bibinfo{journal}{{A}nnual {R}eview of {F}luid {M}echanics}
\bibinfo{volume}{52}, \bibinfo{pages}{421--448}.
\newblock \DOIprefix\doi{10.1146/annurev-fluid-010719-060228}.
%Type = Article
\bibitem[{{H}u et~al.(2013){H}u, {Z}hao and {L}iu}]{hu2013c}
\bibinfo{author}{{H}u, O.}, \bibinfo{author}{{Z}hao, N.},
\bibinfo{author}{{L}iu, J.}, \bibinfo{year}{2013}.
\newblock \bibinfo{title}{{A} ghost cell method for turbulent compressible
viscous flows on adaptive {C}artesian grids}.
\newblock \bibinfo{journal}{{P}rocedia {E}ngineering} \bibinfo{volume}{67},
\bibinfo{pages}{241--249}.
\newblock \DOIprefix\doi{10.1016/j.proeng.2013.12.023}.
%Type = Article
\bibitem[{{I}accarino and {V}erzicco(2003)}]{iaccarino2003a}
\bibinfo{author}{{I}accarino, G.}, \bibinfo{author}{{V}erzicco, R.},
\bibinfo{year}{2003}.
\newblock \bibinfo{title}{{I}mmersed boundary technique for turbulent flow
simulations}.
\newblock \bibinfo{journal}{{A}pplied {M}echanics {R}eviews}
\bibinfo{volume}{56}, \bibinfo{pages}{331--347}.
\newblock \DOIprefix\doi{10.1115/1.1563627}.
%Type = Article
\bibitem[{{J}awahar and {K}amath(2000)}]{jawahar2000a}
\bibinfo{author}{{J}awahar, P.}, \bibinfo{author}{{K}amath, H.},
\bibinfo{year}{2000}.
\newblock \bibinfo{title}{{A} high-resolution procedure for {E}uler and
{N}avier-–{S}tokes computations on unstructured grids}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{164}, \bibinfo{pages}{165--203}.
\newblock \DOIprefix\doi{10.1006/jcph.2000.6596}.
%Type = Techreport
\bibitem[{{K}lausmeyer and {L}in(1997)}]{klausmeyer1997a}
\bibinfo{author}{{K}lausmeyer, S.}, \bibinfo{author}{{L}in, J.},
\bibinfo{year}{1997}.
\newblock \bibinfo{title}{{C}omparative results from a {CFD} challenge over a
{2{D}} three-element high-lift airfoil}.
\newblock \bibinfo{type}{{NASA} {T}echnical {M}emorandum}
\bibinfo{number}{{NASA}-{TM}-112858}. {NASA} {L}angley {R}esearch {C}enter.
\bibinfo{address}{{H}ampton, {V}irginia, {USA}}.
%Type = Article
\bibitem[{{K}roll et~al.(2016){K}roll, {A}bu {Z}urayk, {D}imitrov, {F}ranz,
{F}{\"{u}}hrer, {G}erhold, {G}{\"{o}}rtz, {H}einrich, {I}lic, {J}epsen,
{J}{\"{a}}gersk{\"{u}}pper, {K}ruse, {K}rumbein, {L}anger, {L}iu, {L}iepelt,
{R}eimer, {R}itter, {S}chw{\"{o}}ppe, {S}cherer, {S}piering, {T}hormann,
{T}ogiti, {V}ollmer and {W}endisch}]{kroll2016a}
\bibinfo{author}{{K}roll, N.}, \bibinfo{author}{{A}bu {Z}urayk, M.},
\bibinfo{author}{{D}imitrov, D.}, \bibinfo{author}{{F}ranz, T.},
\bibinfo{author}{{F}{\"{u}}hrer, T.}, \bibinfo{author}{{G}erhold, T.},
\bibinfo{author}{{G}{\"{o}}rtz, S.}, \bibinfo{author}{{H}einrich, R.},
\bibinfo{author}{{I}lic, C.}, \bibinfo{author}{{J}epsen, J.},
\bibinfo{author}{{J}{\"{a}}gersk{\"{u}}pper, J.}, \bibinfo{author}{{K}ruse,
M.}, \bibinfo{author}{{K}rumbein, A.}, \bibinfo{author}{{L}anger, S.},
\bibinfo{author}{{L}iu, D.}, \bibinfo{author}{{L}iepelt, R.},
\bibinfo{author}{{R}eimer, L.}, \bibinfo{author}{{R}itter, M.},
\bibinfo{author}{{S}chw{\"{o}}ppe, A.}, \bibinfo{author}{{S}cherer, J.},
\bibinfo{author}{{S}piering, F.}, \bibinfo{author}{{T}hormann, R.},
\bibinfo{author}{{T}ogiti, V.}, \bibinfo{author}{{V}ollmer, D.},
\bibinfo{author}{{W}endisch, J.H.}, \bibinfo{year}{2016}.
\newblock \bibinfo{title}{{DLR} project {D}igital-{X}: towards virtual aircraft
design and flight testing based on high-fidelity methods}.
\newblock \bibinfo{journal}{{CEAS} {A}eronautical {J}ournal}
\bibinfo{volume}{7}, \bibinfo{pages}{3--27}.
\newblock \DOIprefix\doi{10.1007/s13272-015-0179-7}.
%Type = Article
\bibitem[{{L}iu and {V}asilyev(2007)}]{liu2007a}
\bibinfo{author}{{L}iu, Q.}, \bibinfo{author}{{V}asilyev, O.},
\bibinfo{year}{2007}.
\newblock \bibinfo{title}{{A} {B}rinkman penalization method for compressible
flows in complex geometries}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{227}, \bibinfo{pages}{946--966}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2007.07.037}.
%Type = Article
\bibitem[{{L}uo et~al.(2025){L}uo, {B}i, {M}eng, {G}ao, {Y}uan and
{T}ang}]{luo2025a}
\bibinfo{author}{{L}uo, C.}, \bibinfo{author}{{B}i, L.},
\bibinfo{author}{{M}eng, S.}, \bibinfo{author}{{G}ao, H.},
\bibinfo{author}{{Y}uan, X.}, \bibinfo{author}{{T}ang, Z.},
\bibinfo{year}{2025}.
\newblock \bibinfo{title}{{A} novel algorithm for fluid dynamics simulation
with cell-adaptive {C}artesian grids and immersed boundary method}.
\newblock \bibinfo{journal}{{P}hysics of {F}luids} \bibinfo{volume}{37},
\bibinfo{pages}{046122}.
\newblock \DOIprefix\doi{10.1063/5.0262707}.
%Type = Article
\bibitem[{{L}uo et~al.(2012){L}uo, {X}ia, {L}i, {N}ourgaliev and
{C}ai}]{luo2012a}
\bibinfo{author}{{L}uo, H.}, \bibinfo{author}{{X}ia, Y.},
\bibinfo{author}{{L}i, S.}, \bibinfo{author}{{N}ourgaliev, R.},
\bibinfo{author}{{C}ai, C.}, \bibinfo{year}{2012}.
\newblock \bibinfo{title}{{A} {{H}ermit}e {WENO} reconstruction-based
discontinuous {G}alerkin method for the {E}uler equations on tetrahedral
grids}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{231}, \bibinfo{pages}{5489--5503}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2012.05.011}.
%Type = Article
\bibitem[{{M}arom(2015)}]{marom2015a}
\bibinfo{author}{{M}arom, G.}, \bibinfo{year}{2015}.
\newblock \bibinfo{title}{{N}umerical methods for fluid--structure interaction
models of aortic valves}.
\newblock \bibinfo{journal}{{A}rchives of {C}omputational {M}ethods in
{E}ngineering} \bibinfo{volume}{22}, \bibinfo{pages}{595--620}.
\newblock \DOIprefix\doi{10.1007/s11831-014-9133-9}.
%Type = Article
\bibitem[{{M}eng et~al.(2022){M}eng, {Z}hou, {Y}uan, {L}i, {C}hen and
{B}i}]{meng2022a}
\bibinfo{author}{{M}eng, S.}, \bibinfo{author}{{Z}hou, D.},
\bibinfo{author}{{Y}uan, X.}, \bibinfo{author}{{L}i, X.},
\bibinfo{author}{{C}hen, H.}, \bibinfo{author}{{B}i, L.},
\bibinfo{year}{2022}.
\newblock \bibinfo{title}{{E}nhanced strategy for adaptive {C}artesian grid
generation with arbitrarily complex {3{D}} geometry}.
\newblock \bibinfo{journal}{{A}dvances in {E}ngineering {S}oftware}
\bibinfo{volume}{174}, \bibinfo{pages}{103304}.
\newblock \DOIprefix\doi{10.1016/j.advengsoft.2022.103304}.
%Type = Article
\bibitem[{{M}ittal and {I}accarino(2005)}]{mittal2005a}
\bibinfo{author}{{M}ittal, R.}, \bibinfo{author}{{I}accarino, G.},
\bibinfo{year}{2005}.
\newblock \bibinfo{title}{{I}mmersed {B}oundary {M}ethods}.
\newblock \bibinfo{journal}{{A}nnual {R}eview of {F}luid {M}echanics}
\bibinfo{volume}{37}, \bibinfo{pages}{239--261}.
\newblock \DOIprefix\doi{10.1146/annurev.fluid.37.061903.175743}.
%Type = Inproceedings
\bibitem[{{M}urayama et~al.(16--20 {J}une 2014){M}urayama, {N}akakita,
{Y}amamoto, {U}ra, {I}to and {C}houdhari}]{murayama2014b}
\bibinfo{author}{{M}urayama, M.}, \bibinfo{author}{{N}akakita, K.},
\bibinfo{author}{{Y}amamoto, K.}, \bibinfo{author}{{U}ra, H.},
\bibinfo{author}{{I}to, Y.}, \bibinfo{author}{{C}houdhari, M.},
\bibinfo{year}{16--20 {J}une 2014}.
\newblock \bibinfo{title}{{E}xperimental study on slat noise from {30{P}30{N}}
three-element high-lift airfoil at {JAXA} {H}ard-{W}all {L}owspeed {W}ind
{T}unnel}, in: \bibinfo{booktitle}{{P}roceedings of the {20th} {AIAA}/{CEAS}
{A}eroacoustics {C}onference}, \bibinfo{address}{{A}tlanta, {G}eorgia,
{USA}}.
\newblock \DOIprefix\doi{10.2514/6.2014-2080}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}
et~al.(2026a){{N}{\'{u}}{\~{n}}ez-de la {R}osa}, {F}errer and
{V}alero}]{nunez2026b}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{F}errer, E.}, \bibinfo{author}{{V}alero, E.},
\bibinfo{year}{2026}a.
\newblock \bibinfo{title}{Mesh adaptation on hybrid unstructured meshes for
immersed boundary methods with applications to industrial aerodynamics}.
\newblock \bibinfo{journal}{{E}ngineering {P}roceedings} \bibinfo{volume}{133},
\bibinfo{pages}{62}.
\newblock \DOIprefix\doi{10.3390/engproc2026133001}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}
et~al.(2025){{N}{\'{u}}{\~{n}}ez-de la {R}osa}, {H}uergo, {L}odares,
{S}hrestha, {G}uerra, {F}lorenciano, {F}errer and {V}alero}]{nunez2025a}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{H}uergo, D.}, \bibinfo{author}{{L}odares, D.},
\bibinfo{author}{{S}hrestha, S.}, \bibinfo{author}{{G}uerra, J.},
\bibinfo{author}{{F}lorenciano, J.}, \bibinfo{author}{{F}errer, E.},
\bibinfo{author}{{V}alero, E.}, \bibinfo{year}{2025}.
\newblock \bibinfo{title}{{I}mplementation of immersed boundaries via volume
penalization in the industrial aeronautical computational fluid dynamics
solver {CODA}}.
\newblock \bibinfo{journal}{{E}ngineering with {C}omputers}
\DOIprefix\doi{10.1007/s00366-025-02119-x}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}
et~al.(2026b){{N}{\'{u}}{\~{n}}ez-de la {R}osa}, {M}ateo, {F}errer and
{V}alero}]{nunez2026a}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{M}ateo, A.}, \bibinfo{author}{{F}errer, E.},
\bibinfo{author}{{V}alero, E.}, \bibinfo{year}{2026}b.
\newblock \bibinfo{title}{Optimization of the flap position of a high-lift
multi-element airfoil using a body-fitted mesh along with immersed boundary
methods}.
\newblock \bibinfo{journal}{{E}ngineering {P}roceedings} \bibinfo{volume}{133},
\bibinfo{pages}{61}.
\newblock \DOIprefix\doi{10.3390/engproc2026133002}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa} and {M}unz(2016a)}]{nunez2016a}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{M}unz, C.D.}, \bibinfo{year}{2016}a.
\newblock \bibinfo{title}{{XTROEM-FV}: a new code for computational
astrophysics based on very high order finite-volume methods -- i.
{M}agnetohydrodynamics}.
\newblock \bibinfo{journal}{{M}onthly {N}otices of the {R}oyal {A}stronomical
{S}ociety} \bibinfo{volume}{455}, \bibinfo{pages}{3458--3479}.
\newblock \DOIprefix\doi{10.1093/mnras/stv2531}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa} and {M}unz(2016b)}]{nunez2016b}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{M}unz, C.D.}, \bibinfo{year}{2016}b.
\newblock \bibinfo{title}{{XTROEM-FV}: a new code for computational
astrophysics based on very high order finite-volume methods -- ii.
{R}elativistic hydro- and magnetohydrodynamics}.
\newblock \bibinfo{journal}{{M}onthly {N}otices of the {R}oyal {A}stronomical
{S}ociety} \bibinfo{volume}{460}, \bibinfo{pages}{535--559}.
\newblock \DOIprefix\doi{10.1093/mnras/stw999}.
%Type = Article
\bibitem[{{{N}{\'{u}}{\~{n}}ez-de la {R}osa} and {M}unz(2018)}]{nunez2018a}
\bibinfo{author}{{{N}{\'{u}}{\~{n}}ez-de la {R}osa}, J.},
\bibinfo{author}{{M}unz, C.D.}, \bibinfo{year}{2018}.
\newblock \bibinfo{title}{{H}ybrid {DG}/{FV} schemes for magnetohydrodynamics
and relativistic hydrodynamics}.
\newblock \bibinfo{journal}{{C}omputer {P}hysics {C}ommunications}
\bibinfo{volume}{222}, \bibinfo{pages}{113--135}.
\newblock \DOIprefix\doi{10.1016/j.cpc.2017.09.026}.
%Type = Article
\bibitem[{{\"{O}}rley et~al.(2015){\"{O}}rley, {P}asquariello, {H}ickel and
{A}dams}]{orley2015a}
\bibinfo{author}{{\"{O}}rley, F.}, \bibinfo{author}{{P}asquariello, V.},
\bibinfo{author}{{H}ickel, S.}, \bibinfo{author}{{A}dams, N.},
\bibinfo{year}{2015}.
\newblock \bibinfo{title}{{C}ut-element based immersed boundary method for
moving geometries in compressible liquid flows with cavitation}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{283}, \bibinfo{pages}{1--22}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2014.11.028}.
%Type = Article
\bibitem[{{O}uyang et~al.(2024){O}uyang, {H}uang, {W}ang, {A}n, {L}iu and
{L}yu}]{ouyang2024a}
\bibinfo{author}{{O}uyang, W.}, \bibinfo{author}{{H}uang, J.},
\bibinfo{author}{{W}ang, T.}, \bibinfo{author}{{A}n, W.},
\bibinfo{author}{{L}iu, X.}, \bibinfo{author}{{L}yu, H.},
\bibinfo{year}{2024}.
\newblock \bibinfo{title}{{C}artesian mesh adaptation: immersed boundary method
based on high-order discontinuous {G}alerkin method}.
\newblock \bibinfo{journal}{{P}hysics of {F}luids} \bibinfo{volume}{36},
\bibinfo{pages}{096139}.
\newblock \DOIprefix\doi{10.1063/5.0223305}.
%Type = Article
\bibitem[{{P}{\'{e}}ron et~al.(2021){P}{\'{e}}ron, {B}enoit, {R}enaud and
{M}ary}]{peron2021a}
\bibinfo{author}{{P}{\'{e}}ron, S.}, \bibinfo{author}{{B}enoit, C.},
\bibinfo{author}{{R}enaud, T.}, \bibinfo{author}{{M}ary, I.},
\bibinfo{year}{2021}.
\newblock \bibinfo{title}{{A}n immersed boundary method on {{C}artesian}
adaptive grids for the simulation of compressible flows around arbitrary
geometries}.
\newblock \bibinfo{journal}{{E}ngineering with {C}omputers}
\bibinfo{volume}{37}, \bibinfo{pages}{2419--2437}.
\newblock \DOIprefix\doi{10.1007/s00366-020-00950-y}.
%Type = Article
\bibitem[{{P}eskin(1972)}]{peskin1972a}
\bibinfo{author}{{P}eskin, C.}, \bibinfo{year}{1972}.
\newblock \bibinfo{title}{{F}low patterns around heart valves: a numerical
method}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{10}, \bibinfo{pages}{252--271}.
\newblock \DOIprefix\doi{10.1016/0021-9991(72)90065-4}.
%Type = Article
\bibitem[{{Q}i et~al.(2024){Q}i, {W}ang, {Z}hu, {T}ian and {Z}hao}]{qi2024a}
\bibinfo{author}{{Q}i, X.}, \bibinfo{author}{{W}ang, Z.},
\bibinfo{author}{{Z}hu, J.}, \bibinfo{author}{{T}ian, L.},
\bibinfo{author}{{Z}hao, N.}, \bibinfo{year}{2024}.
\newblock \bibinfo{title}{{H}igh-order discontinuous {G}alerkin method with
immersed boundary treatment for compressible flows on parallel adaptive
{C}artesian grids}.
\newblock \bibinfo{journal}{{P}hysics of {F}luids} \bibinfo{volume}{36},
\bibinfo{pages}{116139}.
\newblock \DOIprefix\doi{10.1063/5.0238605}.
%Type = Article
\bibitem[{{Q}iu et~al.(2016){Q}iu, {S}hu, {W}u, {S}un, {Y}ang and
{G}uo}]{qiu2016a}
\bibinfo{author}{{Q}iu, Y.}, \bibinfo{author}{{S}hu, C.},
\bibinfo{author}{{W}u, J.}, \bibinfo{author}{{S}un, Y.},
\bibinfo{author}{{Y}ang, L.}, \bibinfo{author}{{G}uo, T.},
\bibinfo{year}{2016}.
\newblock \bibinfo{title}{{A} boundary condition-enforced immersed boundary
method for compressible viscous flows}.
\newblock \bibinfo{journal}{{C}omputers \& {F}luids} \bibinfo{volume}{136},
\bibinfo{pages}{104--113}.
\newblock \DOIprefix\doi{10.1016/j.compfluid.2016.06.004}.
%Type = Article
\bibitem[{{R}ogers(1994)}]{rogers1994a}
\bibinfo{author}{{R}ogers, S.}, \bibinfo{year}{1994}.
\newblock \bibinfo{title}{{P}rogress in high-lift aerodynamic calculations}.
\newblock \bibinfo{journal}{{J}ournal of {A}ircraft} \bibinfo{volume}{31},
\bibinfo{pages}{1244--1251}.
\newblock \DOIprefix\doi{10.2514/3.46642}.
%Type = Inproceedings
\bibitem[{{R}ogers et~al.(10--13 {J}anuary 1994){R}ogers, {M}enter, {D}urbin
and {M}ansour}]{rogers1994b}
\bibinfo{author}{{R}ogers, S.}, \bibinfo{author}{{M}enter, F.},
\bibinfo{author}{{D}urbin, P.}, \bibinfo{author}{{M}ansour, N.},
\bibinfo{year}{10--13 {J}anuary 1994}.
\newblock \bibinfo{title}{{A} comparison of turbulence models in computing
multi-element airfoil flows}, in: \bibinfo{booktitle}{{P}roceedings of the
{32nd} {AIAA} {A}erospace {S}ciences {M}eeting and {E}xhibit},
\bibinfo{address}{{R}eno, {N}evada, {USA}}.
\newblock \DOIprefix\doi{10.2514/6.1994-291}.
%Type = Article
\bibitem[{{R}umsey et~al.(1998){R}umsey, {G}atski, {Y}ing and
{B}ertelrud}]{rumsey1998a}
\bibinfo{author}{{R}umsey, C.}, \bibinfo{author}{{G}atski, T.},
\bibinfo{author}{{Y}ing, S.}, \bibinfo{author}{{B}ertelrud, A.},
\bibinfo{year}{1998}.
\newblock \bibinfo{title}{{P}rediction of high-lift flows using turbulent
closure models}.
\newblock \bibinfo{journal}{{AIAA} {J}ournal} \bibinfo{volume}{36},
\bibinfo{pages}{765--774}.
\newblock \DOIprefix\doi{10.2514/2.435}.
%Type = Article
\bibitem[{{S}chneider(2015)}]{schneider2015a}
\bibinfo{author}{{S}chneider, K.}, \bibinfo{year}{2015}.
\newblock \bibinfo{title}{{I}mmersed boundary methods for numerical simulation
of confined fluid and plasma turbulence in complex geometries: a review}.
\newblock \bibinfo{journal}{{J}ournal of {P}lasma {P}hysics}
\bibinfo{volume}{81}, \bibinfo{pages}{435810601}.
\newblock \DOIprefix\doi{10.1017/S0022377815000598}.
%Type = Article
\bibitem[{{S}clafani et~al.(2014){S}clafani, {V}assberg, {W}inkler, {D}organ,
{M}ani, {O}lsen and {C}oder}]{sclafani2014b}
\bibinfo{author}{{S}clafani, A.}, \bibinfo{author}{{V}assberg, J.},
\bibinfo{author}{{W}inkler, C.}, \bibinfo{author}{{D}organ, A.},
\bibinfo{author}{{M}ani, M.}, \bibinfo{author}{{O}lsen, M.},
\bibinfo{author}{{C}oder, J.}, \bibinfo{year}{2014}.
\newblock \bibinfo{title}{{A}nalysis of the {C}ommon {R}esearch {M}odel using
structured and unstructured meshes}.
\newblock \bibinfo{journal}{{J}ournal of {A}ircraft} \bibinfo{volume}{51},
\bibinfo{pages}{1223--1243}.
\newblock \DOIprefix\doi{10.2514/1.C032411}.
%Type = Article
\bibitem[{{S}hao et~al.(2013){S}hao, {S}hu and {C}hew}]{shao2013a}
\bibinfo{author}{{S}hao, J.Y.}, \bibinfo{author}{{S}hu, C.},
\bibinfo{author}{{C}hew, Y.T.}, \bibinfo{year}{2013}.
\newblock \bibinfo{title}{{D}evelopment of an immersed boundary-phase
field-lattice {B}oltzmann method for {N}eumann boundary condition to study
contact line dynamics}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{234}, \bibinfo{pages}{8--32}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2012.08.040}.
%Type = Article
\bibitem[{{S}otiropoulos and {Y}ang(2014)}]{sotiropoulos2014a}
\bibinfo{author}{{S}otiropoulos, F.}, \bibinfo{author}{{Y}ang, X.},
\bibinfo{year}{2014}.
\newblock \bibinfo{title}{{I}mmersed boundary methods for simulating
fluid-structure interaction}.
\newblock \bibinfo{journal}{{P}rogress in {A}erospace {S}ciences}
\bibinfo{volume}{65}, \bibinfo{pages}{1--21}.
\newblock \DOIprefix\doi{10.1016/j.paerosci.2013.09.003}.
%Type = Article
\bibitem[{{S}paid(2000)}]{spaid2000a}
\bibinfo{author}{{S}paid, F.}, \bibinfo{year}{2000}.
\newblock \bibinfo{title}{{H}igh {R}eynolds number, multielement airfoil
flowfield measurements}.
\newblock \bibinfo{journal}{{J}ournal of {A}ircraft} \bibinfo{volume}{37},
\bibinfo{pages}{499--507}.
\newblock \DOIprefix\doi{10.2514/2.2626}.
%Type = Techreport
\bibitem[{{S}wanson and {L}anger(2016)}]{swanson2016a}
\bibinfo{author}{{S}wanson, R.}, \bibinfo{author}{{L}anger, S.},
\bibinfo{year}{2016}.
\newblock \bibinfo{title}{{C}omparison of {NACA} 0012 laminar flow solutions:
structured and unstructured grid methods}.
\newblock \bibinfo{type}{{NASA} {T}echnical {M}emorandum}
\bibinfo{number}{{NASA}-{TM}-2016-219003}. {NASA} {L}angley {R}esearch
{C}enter. \bibinfo{address}{{H}ampton, {V}irginia, {USA}}.
%Type = Article
\bibitem[{{T}amaki et~al.(2017){T}amaki, {H}arada and {I}mamura}]{tamaki2017a}
\bibinfo{author}{{T}amaki, Y.}, \bibinfo{author}{{H}arada, M.},
\bibinfo{author}{{I}mamura, T.}, \bibinfo{year}{2017}.
\newblock \bibinfo{title}{{N}ear-wall modification of {S}palart--{A}llmaras
turbulence model for immersed boundary method}.
\newblock \bibinfo{journal}{{AIAA} {J}ournal} \bibinfo{volume}{55},
\bibinfo{pages}{3027--3039}.
\newblock \DOIprefix\doi{10.2514/1.J055824}.
%Type = Article
\bibitem[{{T}seng and {F}erziger(2003)}]{tseng2003a}
\bibinfo{author}{{T}seng, Y.H.}, \bibinfo{author}{{F}erziger, J.},
\bibinfo{year}{2003}.
\newblock \bibinfo{title}{{A} ghost-cell immersed boundary method for flow in
complex geometry}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{192}, \bibinfo{pages}{593--623}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2003.07.024}.
%Type = Article
\bibitem[{{U}daykumar et~al.(2001){U}daykumar, {M}ittal, {R}ampunggoon and
{K}hanna}]{udaykumar2001a}
\bibinfo{author}{{U}daykumar, H.}, \bibinfo{author}{{M}ittal, R.},
\bibinfo{author}{{R}ampunggoon, P.}, \bibinfo{author}{{K}hanna, A.},
\bibinfo{year}{2001}.
\newblock \bibinfo{title}{{A} {S}harp {I}nterface {C}artesian {G}rid {M}ethod
for {S}imulating {F}lows with {C}omplex {M}oving {B}oundaries}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{174}, \bibinfo{pages}{345--380}.
\newblock \DOIprefix\doi{10.1006/jcph.2001.6916}.
%Type = Inproceedings
\bibitem[{{V}alarezo(6--8 {J}uly 1992)}]{valarezo1992a}
\bibinfo{author}{{V}alarezo, W.}, \bibinfo{year}{6--8 {J}uly 1992}.
\newblock \bibinfo{title}{{H}igh-lift testing at high {R}eynolds numbers}, in:
\bibinfo{booktitle}{{P}roceedings of the {17th} {AIAA} {A}erospace {G}round
{T}esting {C}onference}, \bibinfo{address}{{N}ashville, {T}ennessee, {USA}}.
\newblock \DOIprefix\doi{10.2514/6.1992-3986}.
%Type = Inproceedings
\bibitem[{{V}alarezo et~al.(23--25 {S}eptember 1991){V}alarezo, {D}ominik,
{M}c{G}hee, {G}oodman and {P}aschal}]{valarezo1991a}
\bibinfo{author}{{V}alarezo, W.}, \bibinfo{author}{{D}ominik, C.},
\bibinfo{author}{{M}c{G}hee, R.}, \bibinfo{author}{{G}oodman, W.},
\bibinfo{author}{{P}aschal, K.}, \bibinfo{year}{23--25 {S}eptember 1991}.
\newblock \bibinfo{title}{{M}ulti-element airfoil optimization for maximum lift
at high {R}eynolds numbers}, in: \bibinfo{booktitle}{{P}roceedings of the
{9th} {AIAA} {A}pplied {A}erodynamics {C}onference},
\bibinfo{address}{{B}altimore, {M}aryland, {USA}}.
\newblock \DOIprefix\doi{10.2514/6.1991-3332}.
%Type = Article
\bibitem[{{V}erzicco(2023)}]{verzicco2023a}
\bibinfo{author}{{V}erzicco, R.}, \bibinfo{year}{2023}.
\newblock \bibinfo{title}{{I}mmersed boundary methods: historical perspective
and future outlook}.
\newblock \bibinfo{journal}{{A}nnual {R}eview of {F}luid {M}echanics}
\bibinfo{volume}{55}, \bibinfo{pages}{129--155}.
\newblock \DOIprefix\doi{10.1146/annurev-fluid-120720-022129}.
%Type = Article
\bibitem[{{V}olpiani et~al.(2024){V}olpiani, {C}hapelier, {S}chw{\"{o}}ppe,
{J}{\"{a}}gersk{\"{u}}pper and {C}hampagneux}]{volpiani2024a}
\bibinfo{author}{{V}olpiani, P.}, \bibinfo{author}{{C}hapelier, J.B.},
\bibinfo{author}{{S}chw{\"{o}}ppe, A.},
\bibinfo{author}{{J}{\"{a}}gersk{\"{u}}pper, J.},
\bibinfo{author}{{C}hampagneux, S.}, \bibinfo{year}{2024}.
\newblock \bibinfo{title}{{A}ircraft simulations using the new {CFD} software
from {ONERA}, {DLR}, and {A}irbus}.
\newblock \bibinfo{journal}{{J}ournal of {A}ircraft} \bibinfo{volume}{61},
\bibinfo{pages}{857--869}.
\newblock \DOIprefix\doi{10.2514/1.C037506}.
%Type = Article
\bibitem[{{W}ang et~al.(2015){W}ang, {S}hu, {T}eo and {W}u}]{wang2015d}
\bibinfo{author}{{W}ang, Y.}, \bibinfo{author}{{S}hu, C.},
\bibinfo{author}{{T}eo, C.J.}, \bibinfo{author}{{W}u, J.},
\bibinfo{year}{2015}.
\newblock \bibinfo{title}{{A}n immersed boundary-lattice {B}oltzmann flux
solver and its applications to fluid-structure interaction problems}.
\newblock \bibinfo{journal}{{J}ournal of {F}luids and {S}tructures}
\bibinfo{volume}{54}, \bibinfo{pages}{440--465}.
\newblock \DOIprefix\doi{10.1016/j.jfluidstructs.2014.12.003}.
%Type = Article
\bibitem[{{W}ang and {S}un(2020)}]{wang2020a}
\bibinfo{author}{{W}ang, Z.}, \bibinfo{author}{{S}un, X.},
\bibinfo{year}{2020}.
\newblock \bibinfo{title}{{A}daptive mesh refinement for simulating
fluid-structure interaction using a sharp interface immersed boundary
method}.
\newblock \bibinfo{journal}{{I}nternational {J}ournal of {N}umerical {M}ethods
in {E}ngineering} \bibinfo{volume}{92}, \bibinfo{pages}{1890--1913}.
\newblock \DOIprefix\doi{10.1002/fld.4853}.
%Type = Article
\bibitem[{{W}u et~al.(2023){W}u, {M}in, {H}an, {M}a, {Y}an and
{D}eng}]{wu2023a}
\bibinfo{author}{{W}u, W.}, \bibinfo{author}{{M}in, Y.},
\bibinfo{author}{{H}an, X.}, \bibinfo{author}{{M}a, Y.},
\bibinfo{author}{{Y}an, Z.}, \bibinfo{author}{{D}eng, X.},
\bibinfo{year}{2023}.
\newblock \bibinfo{title}{{S}elf-adaptive turbulence eddy simulation with a
high-order finite differencing method for high {R}eynolds number complex
flows}.
\newblock \bibinfo{journal}{{A}erospace {S}cience and {T}echnology}
\bibinfo{volume}{141}, \bibinfo{pages}{108562}.
\newblock \DOIprefix\doi{10.1016/j.ast.2023.108562}.
%Type = Article
\bibitem[{{Y}u and {P}antano(2022)}]{yu2022a}
\bibinfo{author}{{Y}u, H.}, \bibinfo{author}{{P}antano, C.},
\bibinfo{year}{2022}.
\newblock \bibinfo{title}{{A}n immersed boundary method with implicit body
force for compressible viscous flow}.
\newblock \bibinfo{journal}{{J}ournal of {C}omputational {P}hysics}
\bibinfo{volume}{459}, \bibinfo{pages}{111125}.
\newblock \DOIprefix\doi{10.1016/j.jcp.2022.111125}.
\end{thebibliography}