ADflow: Open-Source CFD Solver Guide
ADflow: Open-Source CFD Solver Guide
net/publication/342358808
CITATIONS READS
22 1,264
4 authors:
Some of the authors of this publication are also working on these related projects:
Nonlocal, Nonparallel Flow Stability Analysis Transition to Turbulence Prediction over Aeronautical Applications View project
All content following this page was uploaded by Joaquim R. R. A. Martins on 25 June 2020.
Abstract
Computational fluid dynamics through the solution of the Navier–Stokes equations with tur-
bulence models has become commonplace. However, simply solving these equations is not
sufficient to be able to perform efficient design optimization with a flow solver in the loop.
This paper discusses the recommendations for developing a flow solver that is suitable for
efficient aerodynamic and multidisciplinary design optimization. One of the major recom-
mendations is to be able to load the flow solver as a library that provides direct memory
access to the relevant data. Other recommendations are to use a higher-level language for
scripting and to pay special attention to solution warm starting, code efficiency, flow solver
robustness, and solution failure handling. As an example of a flow solver that follows these
recommendation, we present the open-source flow solver ADflow. Results from aerodynamic
optimization, aerostructural analysis, and aerostructural optimization using ADflow demon-
strate the performance advantages claimed in the recommendations. The publication of these
recommendations and the availability of the source code opens the door for other solvers to
adopt the same application programming interface. ADflow is part of a wider aerodynamic
shape optimization tool suite that is also available under an open-source license.
1 Introduction
The increase in computational power and availability has profoundly changed how computa-
tional methods are used in engineering design. Computationally intensive simulations that
were once used only for final design verifications are now used on a daily basis at the pre-
liminary design stage. This increased power and availability may be exploited in a number
of ways:
1
1. Simulations can be performed with higher resolution—either spatial or temporal.
4. Multiple designs can be evaluated for improvement and for understanding the design
performance trades; this may involve parameter sweeps or the use of an optimization
algorithm.
Venkatamaran and Haftka [1] considered the historical effects of increasing computational
performance on structural analysis and optimization. They noted that computational anal-
ysis tends to follow Parkinson’s Law [2], which states that the work done expands to fill up
all the available time. A related law by Thimbleby [3] states that software applications grow
to fill up increased computer memory, processing capabilities, and storage space. Venkata-
maran and Haftka [1] also point out that anecdotal evidence suggests that time required for
“adequate” structural analysis has remained constant, at 6 to 8 hours over the last 30 years.
This indicates that computational improvements have been used to refine the computational
models, which describes scenarios 1 and 2 above. We believe that the main reason for this
is because the first two scenarios alone do not fundamentally change the complexity of an
engineering design work flow.
In this work, we examine the requirements necessary to fulfill scenarios 3 through 5
in the context of computational fluid dynamics (CFD). These three scenarios require the
computational method to be used repeatedly in a completely automated fashion, which in
turn requires additional features for successful computation. One of these required features
is the ability to use the solver as a compiled library with direct memory access through
a well-defined, streamlined application program interface (API). This allows the solver to
be deployed effectively as part of an analysis framework on large-scale high-performance
computing (HPC) facilities.
In this paper, we demonstrate how these requirements are met in ADflow, a structured,
multi-block, overset flow solver, which is available under an open-source license.1 Specifically,
ADflow is used to solve both aerodynamic and aerostructural design optimization problems
for the Common Research Model (CRM) geometry [4]. All of the computations demonstrated
in this paper are steady-state RANS solutions. However, the concepts outlined in this
paper are not limited to a particular fidelity choice or solution methodology. The API has
been applied to 2D and 3D panel solvers as well as multiple 3D flow solvers. ADflow is
also capable of time-accurate and time-spectral calculations in addition to the steady-state
solutions shown here.
1
[Link] accessed March 2020
2
The outline of the paper is as follows. Section 2 details the requirements for a multi-
disciplinary solver and Section 3 introduces the concept of the solver as a software library.
Section 4 describes the Python API developed to address the needs listed in Section 2.
These sections are meant to be a general guide for solver requirements and are therefore
solver agnostic. Section 5 details how these requirements were met for the ADflow solver,
and provides a summary of previous studies made possible by ADflow. Finally, Section 6
presents the results from a number of analyses and optimizations to demonstrate the per-
formance of ADflow. Section 7 summarizes the main conclusions of this work.
3
2.2 Solution restart
A second implication from the requirement to run several solutions automatically in sequence
is that there is a strong motivation for minimizing the cost of each solution in the sequence.
The simplest way to accomplish this is to implement a solution restart procedure, where
each solution after the first one starts with the converged state of the previous one. In
many cases, for example when computing drag polars, parameters sweeps, and performing
gradient-based optimizations, this previous solution state is a better starting point than the
default uniform flow. While this can be accomplished with file I/O for most solvers, it is
much faster to do through memory. Solution restarts can also be combined with a good
choice of algorithm to speed up the subsequent solutions. In particular, Newton’s method
yields excellent terminal convergence with a good starting point, a property that can be
utilized when the solver is restarted with the previous solution as the initial guess. For cases
where this previous solution is not a good starting point, this restart functionality should be
made accessible as an option through the API, allowing the user to disable this functionality
if starting from a uniform flow is more beneficial.
4
2.5 Efficient convergence through all phases of solution
A typical external aerodynamic simulation, such as those we compute with ADflow, can be
split into three phases: startup, transition, and terminal. In the startup phase, the initial
flow solution interacts with the near-field of the aerodynamic surface. In the transition
analysis phase, the flow solver handles the interactions between the near-field solution and
the far-field boundaries. In the terminal phase, the solver has already captured the overall
flow patterns and converges the numerical solution of the flow to further reduce the residuals
to the specified convergence tolerance.
Conventional engineering flow simulations tend to focus on the first two phases. This
is because it is only necessary to converge through the transition phase of the solution
far enough to have engineering confidence in the solution. However, when performing an
optimization, tight numerical convergence of the solution is desirable, especially towards the
end of the optimization process, so all three phases of the solution become important.
Different algorithms have different convergence characteristics in each of these phases.
Therefore, it becomes important to be able to switch easily between solution algorithms
during each simulation to maximize the convergence performance. These switches should be
automatic and be based on the relative reduction of the nonlinear residual norm, which is a
good metric for monitoring the convergence stage.
5
tions are often closely related. For iterative methods, it is prudent to reuse this information
from one solution to the next to reduce computational cost. This operation requires a restart
capability, which is generally not an onerous requirement, but it does increase the amount of
information to be written to and read from the disk. These two factors make it significantly
more expensive to run many subsequent analyses with a stand alone code as compared to a
code run as a library with an API.
Unfortunately, the file I/O approach is the only option if an API is not supplied with
direct access to the required functions, as is often the case with commercial codes. To avoid
the pitfalls of file I/O, it is critical that all data transfer from the CFD code occur strictly
using direct memory access. Using this approach, the analysis code is compiled as a library,
rather than a stand-alone executable, and a process script is used to direct the sequence of
operations performed during the analysis or optimization. The process script then configures
each subsequent analysis to run directly, rather than through an input file. This allows all the
data that has to be transferred in and out of the CFD solver—the aerodynamic states, forces,
and gradients, for example—to be passed through memory. This eliminates the need to write
any data to disk, which greatly reduces the cost of cycling iterations. Since we are passing
variables through memory, there is no cost to stopping and starting the iteration process,
which happens when updating coupling variables or when switching iteration algorithms.
Kenway [6] compares the relative cost of direct memory access and file I/O approaches for a
static aeroelastic solution with ADflow, where he found that the I/O approach was twice as
costly.
6
2.8 Additional requirements for efficient multidisciplinary design opti-
mization
While having the capabilities listed in the previous subsections is sufficient to enable efficient
multidisciplinary analysis, given the high cost of analyzing most multidisciplinary systems, it
is important to use efficient optimization methods as well as efficient solvers when conducting
multidisciplinary optimization.
As shown in the study by Yu et al. [7], gradient-based optimization algorithms are
much more efficient at finding optimal solutions for CFD-based optimization problems than
gradient-free optimization algorithms. To this end, not only is it important to have efficient
primal solution algorithms, but to also have efficient computation of derivatives for a multi-
disciplinary flow solver. In particular, efficient computation of derivatives of a few functions
of interest with respect to a large number of design variables is required. The adjoint method
is a useful approach for accomplishing this [8–10]. Kenway et al. [11] describes efficient ap-
proaches for implementing adjoint methods for CFD solvers and benchmarks ADflow and
OpenFOAM adjoint implementations.
File I/O wrapping: This is the simplest, least intrusive, and most universal of the methods
because it can be done by treating the solver as a “black box” without having access
to the source code. Using this approach, a script writes an input file, executes the
solver, and then parses the resulting output. However, this approach suffers from the
drawbacks described previously. The DAFoam wrapper for OpenFOAM developed by
He et al. [12] is an example of this approach.
Function wrapping: This level of wrapping exposes some but not all of the underlying
methods in the solver. This is the approach used to wrap ADflow. For example,
methods such as solve or getSolution are made available through the API, but the
lower-level functions used by the solver are not. This method is often employed when
the code was written originally as a stand-alone solver and just a subset of high-level
methods required for the API are exposed for the scripting level interface.
7
Direct object wrapping: The most intrusive wrapping approach exposes all of the un-
derlying data and methods to the scripting interface. The scripting code is responsible
for creating all the required objects, down to the lowest level. This approach is most
often used when developing a wrapper for an object-oriented code written in C++.
An example of a CFD code that uses this approach is elsA [13, 14].
Figure 1 shows a simple control script for solving a flow problem. This script includes the
main settings of a typical TUI file for a CFD solver: flow conditions, normalization values,
and solver parameters. The only additional complexity comes from the module imports and
the creation of the two required Python objects, AeroProblem and CFDSolver. This type of
run file is functionally equivalent to a TUI file. The power of this approach comes from the
flexibility of implementing both simple and complex automation tasks.
Consider, for example, the creation of a drag polar for an airfoil, which requires a sweep
over a range of angle of attack variables. Figure 2 details the script that can do this task with
Python. The polar requires only a simple for loop over the required angle of attack range.
8
The script writes the results to a simple text file for further processing. In this script, we also
take the opportunity to compute a derived value (the lift-to-drag ratio), demonstrating the
ability to perform customized post-processing online with the aerodynamic simulations. This
example highlights some of the advantages of the pure scripting approach over a scripting
language that creates an input file and parses the results: No restart files are written or
read, and even though the solver is called multiple times, the initialization needs to be run
only once.
4 Python API
The key to using the flow solver with a scripting language effectively is a well-designed
API. To that end, we have developed a Python API that meets all of the requirements
for a solver that is to be used in multidisciplinary analysis and design optimization. This
API is extensible to various types of flow solvers and has been demonstrated on several
different types of codes, including a structured multi-block and overset solver (ADflow), an
unstructured solver (OpenFOAM) [15, 16], a 3D surface panel code (Tripan) [17], and a 2D
airfoil solver (XFoil) [18]. The following subsections describe the key elements of this API.
9
needs. Therefore, we define the boundaries of a typical CFD analysis to establish a general
method for modularizing CFD codes.
The key concept for enabling this is to define the geometric surface of the CFD problem
as the point of interaction for the flow solver. In most CFD problems, this geometric surface
defines the boundary of the flow domain. This is true regardless of the flow solver fidelity
level. Both analyses with a volumetric analysis domain, such as RANS and Euler CFD
codes, and analyses with a surface domain, such as a panel code, can be handled using this
approach.
Furthermore, having the interface defined at the surface allows for straightforward use
in both multidisciplinary analysis and design optimization applications. It is on this surface
that physical quantities are integrated. For example, the transfers of the heat fluxes in an
aerothermodynamic analyses or the displacements and forces in an aerostructural analyses
are done through this surface.
A second important concept for the API is the separation between the flow conditions
definition for a given analysis and the geometric definition of the problem. Several tasks,
from parameters sweeps to multipoint optimization problems, require the analysis of a single
geometry at multiple flow conditions. By separating the definition of the from the solver
itself, it is possible to analyze any number of these flow conditions without re-initializing the
flow solver and incurring the associated startup penalty.
10
4.2.1 ADflow class layout
The ADflow API uses class inheritance, as shown in Figure 3, where each class inherits the
properties and methods of all of the classes to its left. The base class is the Python object
class, which is part of the Python standard and is the basic building block for all classes in
this language.
The BaseSolver class is used for different types of solvers and defines methods for option
handling and class naming, which are common to all the solvers we implement. The Aero-
Solver class is the first layer of specialization for aerodynamic solvers. This class contains
attributes to access mesh and geometry objects, as well as basic implementations of most of
the API calls outlined in this work. The fourth and final class is the ADFLOW class, which
contains specific implementations of the functionality described in this work.
The purpose of each of these calls is provided in the following sections. Functions starting
and ending with are intrinsic Python functions that are part of a standard Python class
definition.
ADFLOW
curAP
mesh
_updateGeomInfo
adflow
AeroSolver comm
coords0
DVGeo
families
BaseSolver DVGeo __init__
mesh solveAdjoint
solverCreated _updateGeomInfo computeJacobianVectorProductFwd
imOptions computeJacobianVectorProductBwd
name getStates getSurfaceConnectivity
category setStates setStates
defaultOptions checkSolutionFailure setAdjoint
object options __init__ setMesh
solveAdjoint solveAdjointForRHS
getOption getResNorms writeSolution
printCurrentOptions getResidual setAeroProblem
__init__ setMesh getResNorms
__call__ setDVGeo __call__
printModifiedOptions resetFlow setDisplacements
setOption getInitialSurfaceCoordinates resetAdjoint
setSurfaceCoordinates __del__
getForces resetFlow
getSurfaceCoordinates setSurfaceCoordinates
evalFunctionsSens
evalFunctions
getSurfaceCoordinates
getResidual
getAdjoint
getStates
getForces
11
This class contains an instance of the ICAOAtmosphere class in the atm attribute. This
class has a smoothed implementation of the ICAO standard atmosphere tables that computes
fluid temperature, pressure, and density for the altitude corresponding to the flight condition.
AeroProblem
ICAOAtmosphere R
V
englishUnits gamma
inputs
q
hermite
a
__call__
SSuthDim
__init__
__dict__
getTP
altitude
name
funcNames
mach
T
TSuthDim
P
rho
atm
Pr
reynoldsLength
nu
mu
re
reynolds
object muSuthDim
DVs
bcVarData
__init__
_setStates
_updateFromV
setDesignVars
addVariablesPyOpt
_updateFromRe
addDV
evalFunctionsSens
evalFunctions
_updateFromM
12
as needed.
Figure 5 shows the getSurfaceCoordinates function, which returns the coordinates of
CFD boundary surfaces. The default functionality is to return all solid wall boundaries of
the model, while the groupName argument allows the user to select specific subsets of the
boundary points to be returned.
Subset-selection is important for some types of multidisciplinary analysis. For example, in
a static aeroelastic (aerostructural) analysis with a wing-body-tail CFD mesh that only has
a wing-box structure, the user would probably not want the deflections of the wing structure
to affect the fuselage or the tail. With this API, the user can request just the coordinates of
the wing surface, so that this subset can be used to create the association between the aero-
dynamic and structural meshes. The surfaces are typically stored in a distributed manner,
with a portion of the surface on each processor, eliminating serial processing bottlenecks.
Figure 5: Function that returns the surface coordinates that define the boundary surface of
the flow problem.
def getSurfaceCoordinates (self , groupName =None ):
"""
Return the coordinates for the surfaces defined by groupName .
"""
return coords
The getSurfaceConnectivity function returns a connectivity array for the surface co-
ordinates. This connectivity describes the boundary surface mesh of the CFD based on the
coordinates returned in the getSurfaceCoordinates function. This additional information
is required to facilitate the communication with other disciplines, such as structural analysis
and mesh deformation.
The final surface manipulation function is setSurfaceCoordinates, which allows the
coordinates, as returned in getSurfaceCoordinates to be updated at any time.
13
def call (self , aeroProblem ):
This function takes in an AeroProblem object and updates any solver specific settings for
the information contained in the AeroProblem. It also updates the volume mesh based on
the current surface, configures the solver with the current options, and handles the file input
and output.
This function can be configured to run for a fixed number of iterations, a fixed wall
time, or until the solver reaches a specific convergence tolerance. This allows for fine-grained
control over the flow solution process, which is useful for optimizations and multidisciplinary
analyses, as previously mentioned.
The incoming AeroProblem identifies the flow solution to be used, while evalFuncs is
a list of the functions to be evaluated. The evaluated functions are added to the funcs
dictionary, which can be accessed from the main script. By using a dictionary, we identify
the different functions evaluated from separate AeroProblems with unique keys, making it
substantially easier to handle complex cases with many functions and flow solutions.
14
of the system, both in Python and in the compiled library. In ADflow, this re-initialization
is accomplished by the resetFlow routine, which purges and resets all of the variables
in memory both in the Python layer and in the compiled library. This method has the
signature:
def resetFlow (self , aeroProblem ):
where aeroProblem corresponds to the flow condition associated with the failed solution.
• Evaluate matrix-vector products with the state Jacobian and its transpose
The advanced API methods are listed in Figures 3 and 4, and are detailed below.
15
4.3.1 Get and set states
The getStates and setStates functions are useful for cases where multiple flow solutions
are required. The function signatures for these methods are:
def getStates (self ):
return states
This functionality serves two purposes. First, it allows the state of the system to be saved
from one flow solution to the next for a straight-forward restart process. This is particularly
important when running multiple cases, such as in multipoint optimization, where the flow
solver must regularly switch between flow cases. Second, this functionality allows for tighter
integration with frameworks such as OpenMDAO [19]. By providing access to the flow states,
the solver can be integrated into various different coupled architectures.
These functions evaluate the solver residuals and their norm at the Python level and can
help with the implementation of various multidisciplinary solver architectures.
16
4.3.5 Evaluate matrix-vector products with the state Jacobian
Being able to compute matrix-vector products with the partial derivatives of the functions
and residuals in the flow solver from the API is extremely useful. In this context, we mean
partial derivatives to be the derivatives of these quantities with out re-solving the non linear
system. These matrix-vector products can be used in adjoint solvers [11] and Newton-Krylov
solvers [21], so being able to evaluate these derivatives through the API allows tremendous
flexibility when setting up single discipline or multidisciplinary solvers.
The lower-level API functions used for direct interaction with the aerodynamic partial
derivative computations are the computeJacobianVectorProductFwd() and
computeJacobianVectorProductBwd() functions, which are used to evaluate vector prod-
ucts with the state Jacobian matrix, and its transpose respectively. These functions allow
the user to compute any combination of partial derivatives through the solver, depending on
what input arguments are provided.
Figure 6 shows the specific implementation of the backward variant, which computes the
transpose vector products used for adjoint derivative computation. This allows derivatives
to be computed for any combination of algorithmic differentiation seeds provided and can
either be used to compute stand-alone derivative vectors or linear combinations of those
derivatives as necessary.
17
for each disciplinary output individually. This requires the API to handle communication
of arbitrary right-hand side vectors to the adjoint solver. Frameworks, such as OpenM-
DAO [19], also benefit from this functionality, since they will often create their own right
hand side combinations for the adjoint solver when that functionality is supported.
For volumetric flow solvers, such as ADflow, the setMesh extension allows a mesh manipu-
lation object to be included in the flow solver. This external object is used inside the flow
solver to translate the surface perturbations set in the setSurfaceCoordinates call in the
main API to the volume mesh defined in the flow solver. It is also responsible for computing
the sensitivity of this operation during the derivative process. For surface based solvers, such
as panel codes, this extension to the API is not necessary.
If physically meaningful shape variables are desired for design perturbation, an external
geometry manipulation module is required to define the perturbations to the surface mesh
as a function of theses variables [22]. This functionality is added to the flow solver through
the setDVGeo extension. Again, this external object is responsible for providing both the
relationship between the geometric design variables and the surface mesh coordinates as well
as the derivatives of these operations. Objects that satisfy these needs in conjunction with
ADflow are part of the broader MACH-Aero framework, which integrates all the components
required to perform aerodynamic shape optimization 2 .
18
the computational models in ADflow After detailing how the requirements are met, we list
the various studies that ADflow has made possible in the last few years.
19
Aerodynamic problem 1
Aerodynamic problem 2
Aerodynamic problem 3
the reference. This enables the solver to determine the convergence stage even when we use
the previous converged state as the initial guess.
For the initial stages of convergence, we have two alternative algorithms: multi-grid, and
approximate Newton–Krylov (ANK). The multi-grid algorithms in ADflow can be used with
multi-block meshes, where obtaining coarser levels of the mesh is straightforward for meshes
with the correct number of nodes or cells. Using this approach, ADflow can use a 5-stage
4th order accurate Runge–Kutta or the D3ADI [31] schemes as smoothers in the multi-grid
startup process.
The ANK solver was developed to add robustness to the pure NK algorithm [21]. It
uses a pseudo-transient continuation (PTC) method and an approximate Jacobian with the
backward Euler time-stepping scheme. This solver does not require coarser levels of the mesh
and it is therefore applicable to both multi-block and overset meshes. The approximate
nature of the linear system used in the solver, along with PTC, allows the algorithm to
progress the solution even when the state is far away from the final solution. The adaptive
nature of our implementation allows the solver to reduce the amount of approximation in
the linear approximation as the solver converges. This allows the solver to improve in
performance as the solution gets closer to the converged state.
When tuning an ANK solver, there is a trade-off between efficiency and robustness. We
have tuned the ANK solver defaults to favor robustness. This is because in an optimization
context, the optimizer is likely to try infeasible intermediate designs, and also because an
interruption of the optimization process is costly. The robustness of the ANK solver enables
ADflow to obtain steady-state solutions even with these intermediate cases, which helps the
optimization convergence by reducing the number of failed flow solutions.
For the terminal stage of convergence, ADflow switches to the Newton–Krylov (NK)
solver. This solver uses Newton’s method to converge the nonlinear system and a Krylov
20
subspace solver to solve the resulting linear systems. This approach can yield convergence
approaching quadratic, but only if the initial guess is in the basin of attraction of the solu-
tion. Therefore, we only use this method when the relative convergence of the more robust
nonlinear solver is below 10−3 − 10−5 .
Efficient solver restarting is important within an optimization context, where the flow
solver is repeatedly called to solve similar problems between optimization iterations. During
successive CFD simulations, we use the converged solution from the previous optimization
iteration as the initial guess. If the design changes are large, the nonlinear residual norm
increases, and the solver defaults to one of the desired startup strategies. This is done to
prevent failures that might occur with the NK solver, when the initial guess is far from the
solution. However, if the design changes are small (as it is likely to happen during the final
stages of an optimization process), the previous flow solution provides a good enough initial
guess for the NK solver to converge. As a result, ADflow can rapidly obtain solutions for
new problems with slightly perturbed designs.
When using gradient-based optimization, the flow solver needs to provide the derivatives
of the functions of interest (objective and constraint functions) with respect to the design
variables. In aerodynamic design optimization problems of interest, there are usually far
more design variables than functions of interest. As a result, the derivatives can be efficiently
computed using the adjoint method.
Kenway et al. [11] detail the adjoint solver implementation in ADflow. The overall ap-
proach is to use automatic differentiation to compute the terms necessary to form the discrete
adjoint equations, resulting in accurate derivatives. This approach to adjoint development
also reduces the overhead to maintaining the adjoint code, since the automatic differenti-
ation tool can be used to update the derivative code whenever changes are made in the
analysis code. Furthermore, the cost of the adjoint approach is independent of the number
of variables (but it scales with the number functions of interest), which makes it suitable for
solving large-scale aerodynamic shape optimization problems.
For computational efficiency, ADflow implements the three levels of improvements men-
tioned previously. First of all, we use state-of-the-art algorithms to converge the resulting
nonlinear and linear systems. The ANK, NK, and adjoint solvers use Jacobian-free methods
to solve the underlying linear solution algorithms. This minimizes the code memory require-
ments, while the solution algorithms themselves provide fast convergence for the nonlinear
and linear systems. Secondly, we have direct memory access between ADflow and other
analysis code we couple to it. This removes any file I/O bottlenecks. The flow solver is
only initialized once and the allocated memory is recycled only between design iterations.
Finally, ADflow uses a cache-blocking technique to minimize cache misses with the residual
calculations. Besides mitigating the memory access bottleneck, this also enables us to take
full advantage of the vector instruction sets in modern processor architectures. All these
enhancements contribute to the performance of ADflow and help reduce the cost of the
optimization problems to manageable levels.
In addition to these enhancements, various implementation details in ADflow help de-
velopers to easily extend the code for novel applications. Because the API is written in
21
Python, developers can use the flexibility of this object-oriented language to achieve the de-
sired results with minimal coding effort. On the other hand, the high-performance routines
in ADflow are written in Fortran 90. This enables the developers to use a compiled coding
language for parts of the implementation that are performance critical. Furthermore, this
Fortran layer is coded in a modular way, so developers can easily implement new turbulence
models or modify the governing equations without needing to change the core code. Finally,
we use the portable, extensible toolkit for scientific computation (PETSc) as the underly-
ing linear algebra package [32]. This provides us with state-of-the-art implementations of
modern linear algebra algorithms, which we rely on for the nonlinear and linear solvers in
ADflow. These factors lower the initial coding investment when implementing new features
in ADflow and enable users to extend the code for their multidisciplinary applications.
22
Table 1: Optimization problems solved with ADflow.
Application References
Optimization of hydrofoils
We have used ADflow for both 2D and 3D aerodynamic shape optimization studies. Li
et al. [33] developed a data-based approach for analysis and optimization of airfoil shapes
23
that resulted in the online airfoil analysis and design optimization tool Webfoil. 4 Mangano
and Martins [43] performed multipoint shape optimization of airfoils with mixed transonic
and supersonic conditions. He et al. [34] developed a robust framework for aerodynamic
shape optimization and demonstrated it for an airfoil shape optimization that started from
a circle shape and converged to a supercritical airfoil.
Besides these 2D results, we have performed various investigations based on the NASA
Common Research Model (CRM) [68] for both aerodynamic and aerostructural shape op-
timization. These include single- and multipoint optimizations of the CRM wing [35, 37],
and the aerodynamic shape optimization of the CRM wing-body-tail configuration [38, 42].
Some of these cases are open benchmarks developed by the AIAA Aerodynamic Design
Optimization Discussion Group. While these efforts focused only on aerodynamics, they
demonstrate that ADflow can be used in design optimization with geometry manipulation
and mesh deformation algorithms.
We used ADflow along with Toolkit for the Analysis of Composite Structures (TACS) [69]
in the MACH framework to perform aerostructural design optimization. These include multi-
point [47] and multi-mission [48] optimizations of the CRM configuration that resulted in the
development of open benchmark cases for aerostructural design optimization studies, includ-
ing a higher aspect ratio version of the CRM configuration [49]. These studies demonstrate
the effectiveness of ADflow within a multidisciplinary analysis and optimization framework
that considers both aerodynamics and structures.
Using MACH, we have also applied our methodology to the design optimization of aircraft
utilizing new technologies, such as tow-steered composite wings [50, 51] and morphing wing
technology [36, 52, 53]. ADflow has been used in design optimization of novel configurations,
including flying wings [39], blended-wing-body aircraft [40], and the D8 configuration [70].
The overset implementation in ADflow [71] enabled us to create a component based aerody-
namic shape optimization framework [72], which was used to perform the design optimization
of a strut-braced wing configuration [41].
We have also coupled ADflow to pyCycle [73] using the OpenMDAO framework [19] to
perform aeropropulsive design optimization [59]. This coupling is important for studying
boundary layer ingestion concepts because they require the simultaneous consideration of
aerodynamics and propulsion [57]. This framework was used to optimize the design of the
STARC-ABL concept [58–61].
We have extended the MACH framework to handle spatial integration constraints [44, 45]
and we are currently developing a time-spectral formulation for flutter prediction [54–56].
Furthermore, we are improving the OpenMDAO integration of ADflow to achieve even more
flexibility to include other disciplines in the optimization formulations, such as a combined
design-allocation optimization problem [46].
Beyond the aircraft applications cited above, we have used ADflow in design optimization
of wind-turbines [62, 63] and hydrofoils [66, 67]. One set of baseline and optimized hydrofoils
was built and validated in a water tunnel, yielding good agreement with the numerical
predictions [65]. Even though ADflow solves the compressible flow equations, the design
4
[Link]
24
optimization capabilities of ADflow made it a good choice for these incompressible flow
design problems.
All of this work was made possible by the considerations we listed in the previous sub-
section. The flexibility of the API enabled us to couple ADflow to different frameworks and
disciplines, while the efficiency of the code reduced the cost of these massive problems.
6 Computational performance
While the performance of a multidisciplinary analysis and optimization setup depends on
many factors, we focus on the impact of treating the flow solver as a library using three
problems. These problems also serve as additional example problems that demonstrate the
flexibility of the API.
The first problem is a simple aerodynamic optimization with two design variables, which
gives an idea of the relative importance of different phases of the solutions process in an aero-
dynamic optimization. The second problem is a simple aerostructural analysis, which high-
lights the additional areas of a multidisciplinary analysis that become performance critical—
more specifically, the reduced cost of the flow solution process relative to other portions of
the analysis. Finally, in the third problem, we solve an aerostructural optimization problem
with the same two design variables. This case extends the multidisciplinary analysis com-
parison to a full optimization and further demonstrates how the API developed in this work
addresses those challenges.
All three cases are based on the CRM aircraft configuration that consists of wing, fuselage,
and horizontal tail. The results are reported in TauBench work units (TWU) as defined by
the guidelines from the International Workshop on High-Order CFD Methods 5 . This allows
for a normalized comparison of the results between different computers and codes, rather
than relying on a more subjective iteration count or wall time comparison.
25
Table 2: TauBench work unit (TWU) results for the NASA Pleiades Cluster with the Ivy
Bridge nodes
et al. [38], while the aerostructural model is the undeformed CRM benchmark developed by
Brooks et al. [49].
Figure 8 shows the CFD surface and structural models, as well as the solution at the
aerostructural optimum. The full family of CFD meshes for the CRM is detailed in Table 3.
We use a wing-box mesh with 25 998 third-order shell elements based on 101 129 nodes with
606 774 degrees of freedom. Mesh convergence results for the full family of CFD meshes are
shown in Table 4.
26
Figure 8: Common Research Model used for aerodynamic and aerostructural optimization
examples
27
Figure 9: Script that solves the aerodynamic optimization problem.
Because this type of aerodynamic shape optimization problem has a smooth design space,
it is well-suited to gradient-based optimization [34, 35]. In this particular problem, it is
28
possible to visualize the design space because we have only two design variables, as shown
in Figure 10. The contours show the variation of the M L/D objective over the region, while
the lines show the optimization paths of the optimization from four different starting points.
We use the algorithm developed by Kenway and Martins [42] to generate these contours.
The four starting points (listed in Table 5) were selected to provide four distinct com-
binations of α and Mach number. These points are spread between high and low Mach
numbers over a variety of angles of attack in the design space of interest. This shows the
robustness of the optimization approach and provides a range of optimization results to use
when analyzing the performance of the solver and API. While the four optimization starting
points result in different convergence paths with different solution costs and number of flow
evaluations, all four answers converge to the same optimum.
29
Table 6: Aerodynamic optimization final points
The results for the four different starting points are summarized in Tables 6. We show
the values for the objective as well as both design variables. The objective and Mach number
both match to the fifth decimal place for all optimizations, while the angle of attack varies
in the fourth decimal place. This shows that all four cases have converged to the same point.
Table 7 shows the variation in computational cost across the four optimizations. The
different starting points result in a range of ±20% in the average solution cost relative to
the overall average. The spread in the gradient cost is lower, at ±8% of the overall average.
The larger spread in the solution cost is largely due to the two failed solutions in run number
two. Depending on the mode of failure, these failed solutions can take significant amounts
of time to solve, driving up the overall average for that run.
Table 7: Convergence results for the four aerodynamic optimization starting points in TWU
To analyze the impact of our API and solver development recommendations on the above
costs, we use the timings from the fourth point to look at a more detailed breakdown of the
computational cost of each part of the solution process.
6.3.2 Initialization
The overall cost of the initialization in this example problem is 117.60 TWU, or 1.6% of
the average solution time, which is negligible. A detailed breakdown of the cost for this call
is shown in Table 8. The entries in this table reflect the fact that the initialization is only
called once, i.e., the mean, minimum and maximum are the same and the standard deviation
is zero. Since the initialization is only called once, that cost is amortized over the number
of solutions required for the optimization.
The two largest costs in the initialization are the partitioning and the preprocessing.
The partitioning includes the reading of the mesh file and splitting it to run in parallel. The
30
preprocessing time consists of the time required to set up the multi-grid structure, commu-
nication patterns, compute mesh metrics, and wall distances. Much of this computational
effort is dependent only on the mesh size and topology, and does not need to be updated
between flow solutions when using the library based solver approach. The exceptions to
this are the mesh metric and wall distance computations, which need to be updated when
the design geometry is changed for each optimization iteration. In the context of this fixed
geometry optimization, this cost is small, but as we will see in the aerostructural analysis
example, this cost can become prohibitive.
Table 8: Initialization cost breakdown (TWU)
6.3.3 Solution
Table 9 summarizes the variation of the flow solution computational cost over the course of a
nominal optimization. The mean flow solution is over 98% of the total solution cost. If this
were to hold for the entire optimization, the importance of the direct memory API would
be diminished, since the cost of reading and writing the solution would be a small portion
of the overall computational cost.
However, Figure 11 shows that there is a significant variation in solution time over the
course of the optimization. Specifically, the solution times decrease significantly towards the
end of the optimization. Looking at the minimum solution time case, the solution write time
accounts for 12% of the solution time, which is much more significant. Furthermore, if we
add in an additional 120 TWU for an initialization, a full 25% of the call time would be
consumed by non-solution tasks. In such a case, the direct memory access API becomes much
more significant, since 25% of the computational cost can be avoided by not re-initializing
the solver and writing out a solution for every function evaluation.
The full savings from the direct memory API can be assessed by comparing the cost of
re-initializing the solver to the cost of setting the AeroProblem. Setting the AeroProblem
updates the flow conditions for the upcoming flow solution, getting the solver ready to
analyze the new point without fully re-initializing the solver. Table 9 shows that this costs
about 0.4 TWU on average, which is far less expensive than a full initialization.
31
Table 9: Solution cost breakdown (TWU)
25000
20000
Solution time (TWU)
15000
10000
5000
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Solution number
32
6.3.5 Gradient computation
In ADflow, we use the adjoint method to compute the gradients of the flow solution. This
method requires the solution of a large linear system to compute the adjoint vector, and then
a matrix-vector product to compute the total derivative of the desired function with respect
to the design variables. In this case, we only have two design variables, but in a typical case
we would have hundreds of variables, making the adjoint approach an efficient method for
computing derivatives [11].
Table 11, lists the costs of computing the gradients. These costs are split between the
cost of computing the adjoint solution and the cost computing the total derivative for the
given adjoint vector. The adjoint solution is the dominant part of this cost, but with a
single output function and multiple design variables, it is the most efficient way to compute
gradients.
The total gradient computation cost is similar to that of the flow solution. The major
difference is that the standard deviation in computational cost is lower than for the flow
solution. This is because the adjoint system is only solved if the flow solution is successful;
therefore, the adjoint equations are always more likely to converge and there are fewer failed
adjoint solutions in a typical optimization, if any.
The other contribution to the smaller standard deviation is that restarting the adjoint
from a previous solution does not benefit the adjoint solution as much as for the flow solution.
In most cases, the adjoint is only evaluated after a change in state values, so it is likely that
the adjoint equations have changed between evaluations. However, since the flow solver is
accessible as a library through memory, the cost of starting with a previous adjoint solution
is negligible, so it is standard practice to do this.
Table 11: Evaluation costs for gradient of L/D with respect to cruise Mach and angle-of-
attack (TWU).
33
6.4.1 Initialization
The cost of initializing the aerostructural problem includes the cost of initializing the aero-
dynamic and structural solvers, as well as the cost of linking the two solvers with a load and
displacement transfer object. The costs of these initializations are listed in Table 12. The
cost of initializing the aerostructural class itself is insignificant, so it is not shown here. The
cost of initializing the CFD solver is the same as before–approximately 100 TWU, while the
structural initialization is faster—only 20 TWU. The single largest cost in the initialization
is the setup of the load and displacement transfer object, which takes almost 1000 TWU.
This is due to the search algorithm that finds the connections between the aerodynamic
surface and the structural mesh [5].
On its own, the cost of the initialization is not that significant. Given the approach
outlined in this paper, this costs is only incurred a single time and accounts for less that
5% of the total solution cost. However, as we discuss in Section 6.4.2, if the initialization
cost is incurred repeatedly for aerodynamic and structural solutions in the multidisciplinary
solution process, the overhead associated with it quickly becomes significant.
34
every aerostructural iteration. In that scenario, we are comparing the cost of those operations
to the cost of a single aerostructural iteration, rather than the entire aerostructural process.
If we count just the cost of the aerodynamic initialization (97 TWU from Table 12) and
writing the aerodynamic and structural solutions (145 TWU from Table 13, we would get
a cost of 242 TWU. This compares to 760 TWU for an average aerostructural iteration,
which is just over 30% of additional cost. In the more likely scenario of a simple file I/O
wrapper that treats the three components as independent executables, we would need to
re-do all three initializations, the structural matrix factorization, and the solution writing
for each aerostructural iteration. In that scenario, the average single iteration cost would
increase from 760 TWU to 2186 TWU—almost three times the current cost. This makes
it clear that it is imperative to develop solvers as libraries, have them loaded in memory,
and pass data directly, to avoid replicating unnecessary work and driving up the cost of the
multidisciplinary analysis and optimization.
35
The implementation of the coupled-Krylov algorithm for the coupled adjoint linear system
is only possible because we treat all disciplines in the multidisciplinary systems as libraries
that provide direct memory access for all components. This allows a fully-coupled linear
system to be setup using the gradient computation methods in each discipline, which can
only be done efficiently through direct memory access. This also simplifies the computation
of the coupled derivatives in the off-diagonal elements of the coupled Jacobian. Because
both solvers are available in memory, the coupled chain-rule accumulation of the derivatives
needed for the coupled adjoint is easier to set up. This accumulation would still be possible
using file I/O, but it would be much less efficient because the amount of data that would
need to be written to and read from disk would be high relative to the problem size.
However, the wing flexibility is now accounted for because the objective function evaluations
are based on aerostructural computations. This shifts the optimal result because the flexi-
bility of the wing alters the value and intercept of the lift curve slope for the aircraft. As
in the aerostructural analysis above, the coupling with the structural discipline adds several
more components in the timing analysis, which are summarized in Table 15.
The breakdown of the cost for the full optimization history is similar to the values break-
down for the single point analysis, but there are some minor differences. The average total
aerostructural solution cost is lower than for the single-point case. This is mostly because
as the optimization progress, the cost of individual solutions tends to decrease, reducing the
overall average. This is also the reason why the average number of iterations (flow solutions)
per aerostructural solution averages only 16 over the full set of optimizations, rather than
30 for the single point case. There are also flow solution failures in optimizations 2, 3, and
4, which reinforces the points made in Section 2 regarding the graceful handling of solution
failures.
36
Table 15: Breakdown for the cost (in TWU) for aerostructural (AS) optimizations starting
from four different points.
7 Conclusion
The requirements for a flow solver used in multidisciplinary analysis and optimization are
different than the requirements for a stand-alone flow solver. We introduce a series of require-
ments that are necessary for an efficient multidisciplinary solver, discuss the idea of treating
the flow solver as a library (rather than a stand-alone code), and introduce an API that
makes it possible to set up complex multidisciplinary analysis and optimization problems
using compact scripts written in a high-level language.
As a specific example of a flow solver following these guidelines, we introduce the open-
source CFD solver ADflow. 6 Using ADflow, we quantify the impact of these requirements on
the computational performance of aerodynamic optimization, aerostructural analyses, and
aerostructural optimization.
We show that for aerodynamic optimization with a direct memory access API saves
12% to 25% of the optimization time, while for an aerostructural optimization, the cost
can be reduced by up to a factor of three compared to a file I/O based approach. These
results conclusively demonstrate the benefits of having a direct memory access API for
multidisciplinary analysis codes.
ADflow has already been used extensively to investigate aerodynamic and aerostructural
design optimization problems. ADflow is part of a wider aerodynamic shape optimization
tool suite (MACH-Aero), which is also available under an open-source license. Several of
those investigations resulted in open benchmarks that can be built on by other researchers.
In addition, the ADflow API could be re-used for other flow solvers, which could then be
used interchangeably in the MACH-Aero framework.
6
[Link] accessed March 2020
37
8 Acknowledgments
Resources supporting this work were provided by the NASA High-End Computing (HEC)
Program through the NASA Advanced Supercomputing (NAS) Division at Ames Research
Center.
References
[1] Venkatamaran, S., and Haftka, R. T., “Structural optimization complexity: what has
Moore’s law done for us?” Structural and Multidisciplinary Optimization, Vol. 28, 2004,
pp. 375–387. doi:10.1007/s00158-004-0415-y.
[2] Parkinson, C., “Parkinson’s Law or the pursuit of progress.” The Economist, 1959.
[3] Thimbleby, H., “Viewpoint. Computerised Parkinson’s law,” Computing & Control En-
gineering Journal, Vol. 4, No. 5, 1993, pp. 197–198. doi:10.1049/cce:19930049.
38
[4] Vassberg, J. C., DeHaan, M. A., Rivers, M. S., and Wahls, R. A., “Retrospective on
the Common Research Model for Computational Fluid Dynamics Validation Studies,”
Journal of Aircraft, Vol. 55, No. 4, 2018, pp. 1325–1337. doi:10.2514/1.C034906.
[5] Kenway, G. K. W., Kennedy, G. J., and Martins, J. R. R. A., “Scalable Parallel Ap-
proach for High-Fidelity Steady-State Aeroelastic Analysis and Derivative Computa-
tions,” AIAA Journal, Vol. 52, No. 5, 2014, pp. 935–951. doi:10.2514/1.J052255.
[7] Yu, Y., Lyu, Z., Xu, Z., and Martins, J. R. R. A., “On the Influence of Optimization
Algorithm and Starting Design on Wing Aerodynamic Shape Optimization,” Aerospace
Science and Technology, Vol. 75, 2018, pp. 183–199. doi:10.1016/[Link].2018.01.016.
[8] Jameson, A., “Aerodynamic Design via Control Theory,” Journal of Scientific Comput-
ing, Vol. 3, No. 3, 1988, pp. 233–260. doi:10.1007/BF01061285.
[9] Giles, M. B., and Pierce, N. A., “An Introduction to the Adjoint Approach
to Design,” Flow, Turbulence and Combustion, Vol. 65, 2000, pp. 393–415.
doi:10.1023/A:1011430410075.
[10] Martins, J. R. R. A., and Hwang, J. T., “Review and Unification of Methods for Com-
puting Derivatives of Multidisciplinary Computational Models,” AIAA Journal, Vol. 51,
No. 11, 2013, pp. 2582–2599. doi:10.2514/1.J052184.
[11] Kenway, G. K. W., Mader, C. A., He, P., and Martins, J. R. R. A., “Effective Adjoint
Approaches for Computational Fluid Dynamics,” Progress in Aerospace Sciences, Vol.
110, 2019, p. 100542. doi:10.1016/[Link].2019.05.002.
[12] He, P., Mader, C. A., Martins, J. R. R. A., and Maki, K. J., “An Aerodynamic De-
sign Optimization Framework Using a Discrete Adjoint Approach with OpenFOAM,”
Computers & Fluids, Vol. 168, 2018, pp. 285–303. doi:10.1016/[Link].2018.04.012.
[13] Gazaix, M., Jollès, A., and Lazareff, M., “The elsA object-oriented computational tool
for industrial applications,” Proceeding of the ICAS 2002 Congress, ICAS, 2002.
[14] Cambier, L., Heib, S., and Plot, S., “The ONERA elsA CFD software: input from
research and feedback from industry,” Mechanics and Industry, Vol. 14, No. 3, 2013.
doi:I10.1051/meca/2013056.
[15] Weller, H. G., Tabor, G., Jasak, H., and Fureby, C., “A tensorial approach to computa-
tional continuum mechanics using object-oriented techniques,” Computers in Physics,
Vol. 12, No. 6, 1998, pp. 620–631. doi:10.1063/1.168744.
39
[16] Jasak, H., Jemcov, A., and Tuković, Z., “OpenFOAM: A C++ Library for Complex
Physics Simulations,” International Workshop on Coupled Methods in Numerical Dy-
namics, IUC, Citeseer, 2007.
[17] Kennedy, G. J., and Martins, J. R. R. A., “A parallel aerostructural optimization frame-
work for aircraft design studies,” Structural and Multidisciplinary Optimization, Vol. 50,
No. 6, 2014, pp. 1079–1101. doi:10.1007/s00158-014-1108-9.
[18] Drela, M., “XFOIL: An Analysis and Design System for Low Reynolds Number Air-
foils,” Low Reynolds Number Aerodynamics, edited by T. J. Mueller, Springer Berlin
Heidelberg, Berlin, Heidelberg, 1989, pp. 1–12. doi:10.1007/978-3-642-84010-4 1.
[19] Gray, J. S., Hwang, J. T., Martins, J. R. R. A., Moore, K. T., and Naylor, B. A.,
“OpenMDAO: An open-source framework for multidisciplinary design, analysis, and
optimization,” Structural and Multidisciplinary Optimization, Vol. 59, No. 4, 2019, pp.
1075–1104. doi:10.1007/s00158-019-02211-z.
[20] Hwang, J. T., and Martins, J. R. R. A., “A computational architecture for coupling het-
erogeneous numerical models and computing coupled derivatives,” ACM Transactions
on Mathematical Software, Vol. 44, No. 4, 2018, p. Article 37. doi:10.1145/3182393.
[21] Yildirim, A., Kenway, G. K. W., Mader, C. A., and Martins, J. R. R. A., “A Jacobian-
free approximate Newton–Krylov startup strategy for RANS simulations,” Journal of
Computational Physics, Vol. 397, 2019, p. 108741. doi:10.1016/[Link].2019.06.018.
[22] Kenway, G. K., Kennedy, G. J., and Martins, J. R. R. A., “A CAD-Free
Approach to High-Fidelity Aerostructural Optimization,” Proceedings of the 13th
AIAA/ISSMO Multidisciplinary Analysis Optimization Conference, Fort Worth, TX,
2010. doi:10.2514/6.2010-9231.
[23] Jameson, A., Schmidt, W., and Turkel, E., “Numerical Solution of the Euler Equations
by Finite Volume Methods Using Runge–Kutta Time Stepping Schemes,” 14th Fluid
and Plasma Dynamics Conference, 1981. doi:10.2514/6.1981-1259.
[24] Turkel, E., and Vatsa, V. N., “Effects of Artificial Viscosity on Three-Dimensional Flow
Solutions,” AIAA Journal, Vol. 32, 1994, pp. 39–45. doi:10.2514/3.11948.
[25] van Leer, B., “Towards the ultimate conservative difference scheme. V. A second-order
sequel to Godunov’s method,” Journal of Computational Physics, Vol. 32, 1979, pp.
101–136. doi:10.1016/0021-9991(79)90145-1.
[26] Roe, P. L., “Approximate Riemann Solvers, Parameter Vectors, and Differ-
ence Schemes,” Journal of Computational Physics, Vol. 43, 1981, pp. 357–372.
doi:10.1016/0021-9991(81)90128-5.
[27] Spalart, P., and Allmaras, S., “A One-Equation Turbulence Model for Aerodynamic
Flows,” La Recherche Aerospatiale, Vol. 1, 1994, pp. 5–21.
40
[28] Wilcox, D. C., Turbulence Modeling for CFD, 3rd ed., DCW Industries, Inc., La Cãnada,
CA, 2006.
[29] Menter, F. R., “Two-equation eddy-viscosity turbulence models for engineering appli-
cations,” AIAA Journal, Vol. 32, No. 8, 1994, pp. 1598–1605. doi:10.2514/3.12149.
[31] Klopfer, G., Hung, C., Van der Wijngaart, R., and Onufer, J., “A diagonalized diagonal
dominant alternating direction implicit (D3ADI) scheme and subiteration correction,”
29th AIAA, Fluid Dynamics Conference, Albuquerque, NM, 1998. doi:10.2514/6.1998-
2824.
[32] Balay, S., Gropp, W. D., McInnes, L. C., and Smith, B. F., “Efficient Management of
Parallelism in Object Oriented Numerical Software Libraries,” Modern Software Tools
for Scientific Computing, edited by E. Arge, A. M. Bruaset, and H. P. Langtangen,
Birkhäuser Press, 1997, pp. 163–202. doi:10.1007/978-1-4612-1986-6 8.
[33] Li, J., Bouhlel, M. A., and Martins, J. R. R. A., “Data-based Approach for Fast Air-
foil Analysis and Optimization,” AIAA Journal, Vol. 57, No. 2, 2019, pp. 581–596.
doi:10.2514/1.J057129.
[34] He, X., Li, J., Mader, C. A., Yildirim, A., and Martins, J. R. R. A., “Robust aerody-
namic shape optimization—from a circle to an airfoil,” Aerospace Science and Technol-
ogy, Vol. 87, 2019, pp. 48–61. doi:10.1016/[Link].2019.01.051.
[35] Lyu, Z., Kenway, G. K. W., and Martins, J. R. R. A., “Aerodynamic Shape Optimiza-
tion Investigations of the Common Research Model Wing Benchmark,” AIAA Journal,
Vol. 53, No. 4, 2015, pp. 968–985. doi:10.2514/1.J053318.
[36] Lyu, Z., and Martins, J. R. R. A., “Aerodynamic Shape Optimization of an Adaptive
Morphing Trailing Edge Wing,” Journal of Aircraft, Vol. 52, No. 6, 2015, pp. 1951–1970.
doi:10.2514/1.C033116.
[37] Kenway, G. K. W., and Martins, J. R. R. A., “Multipoint Aerodynamic Shape Opti-
mization Investigations of the Common Research Model Wing,” AIAA Journal, Vol. 54,
No. 1, 2016, pp. 113–128. doi:10.2514/1.J054154.
[38] Chen, S., Lyu, Z., Kenway, G. K. W., and Martins, J. R. R. A., “Aerodynamic Shape
Optimization of the Common Research Model Wing-Body-Tail Configuration,” Journal
of Aircraft, Vol. 53, No. 1, 2016, pp. 276–293. doi:10.2514/1.C033328.
41
[40] Lyu, Z., and Martins, J. R. R. A., “Aerodynamic Design Optimization Studies of a
Blended-Wing-Body Aircraft,” Journal of Aircraft, Vol. 51, No. 5, 2014, pp. 1604–1617.
doi:10.2514/1.C032491.
[41] Secco, N. R., and Martins, J. R. R. A., “RANS-based Aerodynamic Shape Optimization
of a Strut-braced Wing with Overset Meshes,” Journal of Aircraft, Vol. 56, No. 1, 2019,
pp. 217–227. doi:10.2514/1.C034934.
[42] Kenway, G. K. W., and Martins, J. R. R. A., “Buffet Onset Constraint Formulation for
Aerodynamic Shape Optimization,” AIAA Journal, Vol. 55, No. 6, 2017, pp. 1930–1947.
doi:10.2514/1.J055172.
[43] Mangano, M., and Martins, J. R. R. A., “Multipoint Aerodynamic Shape Optimization
for Subsonic and Supersonic Regimes,” 57th AIAA Aerospace Sciences Meeting, AIAA
SciTech Forum, 2019, San Diego, CA, 2019. doi:10.2514/6.2019-0696.
[44] Brelje, B. J., and Martins, J. R. R. A., “Coupled component sizing and aerodynamic
shape optimization via geometric constraints,” AIAA AVIATION Forum, American
Institute of Aeronautics and Astronautics, Dallas, TX, 2019. doi:10.2514/6.2019-3105.
[45] Brelje, B. J., Anibal, J., Yildirim, A., Mader, C. A., and Martins, J. R., “Flexible
Formulation of Spatial Integration Constraints in Aerodynamic Shape Optimization,”
AIAA Journal, 2020. (In press).
[46] Hwang, J. T., Jasa, J., and Martins, J. R. R. A., “High-fidelity design-allocation opti-
mization of a commercial aircraft maximizing airline profit,” Journal of Aircraft, Vol. 56,
No. 3, 2019, pp. 1165–1178. doi:10.2514/1.C035082.
[47] Kenway, G. K. W., and Martins, J. R. R. A., “Multipoint High-Fidelity Aerostructural
Optimization of a Transport Aircraft Configuration,” Journal of Aircraft, Vol. 51, No. 1,
2014, pp. 144–160. doi:10.2514/1.C032150.
[48] Liem, R. P., Kenway, G. K. W., and Martins, J. R. R. A., “Multimission Aircraft
Fuel Burn Minimization via Multipoint Aerostructural Optimization,” AIAA Journal,
Vol. 53, No. 1, 2015, pp. 104–122. doi:10.2514/1.J052940.
[49] Brooks, T. R., Kenway, G. K. W., and Martins, J. R. R. A., “Benchmark Aerostructural
Models for the Study of Transonic Aircraft Wings,” AIAA Journal, Vol. 56, No. 7, 2018,
pp. 2840–2855. doi:10.2514/1.J056603.
[50] Brooks, T. R., and Martins, J. R. R. A., “On Manufacturing Constraints for Tow-steered
Composite Design Optimization,” Composite Structures, Vol. 204, 2018, pp. 548–559.
doi:10.1016/[Link].2018.07.100.
[51] Brooks, T. R., Martins, J. R. R. A., and Kennedy, G. J., “High-fidelity Aerostruc-
tural Optimization of Tow-steered Composite Wings,” Journal of Fluids and Structures,
Vol. 88, 2019, pp. 122–147. doi:10.1016/[Link].2019.04.005.
42
[52] Burdette, D. A., and Martins, J. R. R. A., “Design of a Transonic Wing with an
Adaptive Morphing Trailing Edge via Aerostructural Optimization,” Aerospace Science
and Technology, Vol. 81, 2018, pp. 192–203. doi:10.1016/[Link].2018.08.004.
[53] Burdette, D. A., and Martins, J. R. R. A., “Impact of Morphing Trailing Edge on
Mission Performance for the Common Research Model,” Journal of Aircraft, Vol. 56,
No. 1, 2019, pp. 369–384. doi:10.2514/1.C034967.
[54] He, S., Jonsson, E., Mader, C. A., and Martins, J. R. R. A., “A Coupled Newton–Krylov
Time-Spectral Solver for Wing Flutter and LCO Prediction,” AIAA Aviation Forum,
Dallas, TX, 2019. doi:10.2514/6.2019-3549.
[55] He, S., Jonsson, E., Mader, C. A., and Martins, J. R. R. A., “Aerodynamic Shape Op-
timization with Time Spectral Flutter Adjoint,” 2019 AIAA/ASCE/AHS/ASC Struc-
tures, Structural Dynamics, and Materials Conference, American Institute of Aeronau-
tics and Astronautics, San Diego, CA, 2019. doi:10.2514/6.2019-0697.
[56] He, S., Jonsson, E., Mader, C. A., and Martins, J. R. R. A., “A Coupled Newton–Krylov
Time Spectral Solver for Flutter Prediction,” 2018 AIAA/ASCE/AHS/ASC Structures,
Structural Dynamics, and Materials Conference, American Institute of Aeronautics and
Astronautics, Kissimmee, FL, 2018. doi:10.2514/6.2018-2149.
[57] Gray, J. S., Mader, C. A., Kenway, G. K. W., and Martins, J. R. R. A., “Modeling
Boundary Layer Ingestion Using a Coupled Aeropropulsive Analysis,” Journal of Air-
craft, Vol. 55, No. 3, 2018, pp. 1191–1199. doi:10.2514/1.C034601.
[58] Yildirim, A., Gray, J. S., Mader, C. A., and Martins, J. R. R. A., “Aeropropulsive
Design Optimization of a Boundary Layer Ingestion System,” AIAA Aviation Forum,
Dallas, TX, 2019. doi:10.2514/6.2019-3455.
[59] Gray, J. S., and Martins, J. R. R. A., “Coupled Aeropropulsive Design Optimization of
a Boundary-Layer Ingestion Propulsor,” The Aeronautical Journal, Vol. 123, No. 1259,
2019, pp. 121–137. doi:10.1017/aer.2018.120.
[60] Gray, J. S., Kenway, G. K. W., Mader, C. A., and Martins, J. R. R. A., “Aero-propulsive
Design Optimization of a Turboelectric Boundary Layer Ingestion Propulsion System,”
2018 AIAA/ISSMO Multidisciplinary Analysis and Optimization Conference, Atlanta,
GA, 2018. doi:10.2514/6.2018-3976, AIAA 2018-3976.
[61] Kenway, G. K., and Kiris, C. C., “Aerodynamic Shape Optimization of the STARC-ABL
Concept for Minimal Inlet Distortion,” AIAA/ASCE/AHS/ASC Structures, Structural
Dynamics, and Materials Conference, American Institute of Aeronautics and Astronau-
tics, 2018. doi:10.2514/6.2018-1912.
[62] Madsen, M. H. A., Zahle, F., Sørensen, N. N., and Martins, J. R. R. A., “Multipoint
high-fidelity CFD-based aerodynamic shape optimization of a 10 MW wind turbine,”
Wind Energy Science, Vol. 4, 2019, pp. 163–192. doi:10.5194/wes-4-163-2019.
43
[63] Dhert, T., Ashuri, T., and Martins, J. R. R. A., “Aerodynamic Shape Optimization of
Wind Turbine Blades Using a Reynolds-Averaged Navier–Stokes Model and an Adjoint
Method,” Wind Energy, Vol. 20, No. 5, 2017, pp. 909–926. doi:10.1002/we.2070.
[64] Garg, N., Kenway, G. K. W., Lyu, Z., Martins, J. R. R. A., and Young, Y. L., “High-
fidelity Hydrodynamic Shape Optimization of a 3-D Hydrofoil,” Journal of Ship Re-
search, Vol. 59, No. 4, 2015, pp. 209–226. doi:10.5957/JOSR.59.4.150046.
[65] Garg, N., Pearce, B. W., Brandner, P. A., Phillips, A. W., Martins, J. R. R. A., and
Young, Y. L., “Experimental Investigation of a Hydrofoil Designed via Hydrostruc-
tural Optimization,” Journal of Fluids and Structures, Vol. 84, 2019, pp. 243–262.
doi:10.1016/[Link].2018.10.010.
[66] Garg, N., Kenway, G. K. W., Martins, J. R. R. A., and Young, Y. L., “High-fidelity
Multipoint Hydrostructural Optimization of a 3-D Hydrofoil,” Journal of Fluids and
Structures, Vol. 71, 2017, pp. 15–39. doi:10.1016/[Link].2017.02.001.
[67] Liao, Y., Garg, N., Martins, J. R. R. A., and Young, Y. L., “Viscous Fluid Structure
Interaction Response of Composite Hydrofoils,” Composite Structures, Vol. 212, 2019,
pp. 571–585. doi:10.1016/[Link].2019.01.043.
[68] Vassberg, J. C., DeHaan, M. A., Rivers, S. M., and Wahls, R. A., “Develop-
ment of a Common Research Model for Applied CFD Validation Studies,” 2008.
doi:10.2514/6.2008-6919.
[70] Mader, C. A., Kenway, G. K., Martins, J. R. R. A., and Uranga, A., “Aerostructural
Optimization of the D8 Wing with Varying Cruise Mach Numbers,” 18th AIAA/ISSMO
Multidisciplinary Analysis and Optimization Conference, American Institute of Aero-
nautics and Astronautics, 2017. doi:10.2514/6.2017-4436.
[71] Kenway, G. K. W., Secco, N., Martins, J. R. R. A., Mishra, A., and Duraisamy, K., “An
Efficient Parallel Overset Method for Aerodynamic Shape Optimization,” Proceedings
of the 58th AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials
Conference, AIAA SciTech Forum, Grapevine, TX, 2017. doi:10.2514/6.2017-0357.
[72] Secco, N. R., Jasa, J. P., Kenway, G. K. W., and Martins, J. R. R. A., “Component-
based Geometry Manipulation for Aerodynamic Shape Optimization with Overset
Meshes,” AIAA Journal, Vol. 56, No. 9, 2018, pp. 3667–3679. doi:10.2514/1.J056550.
44
[73] Gray, J. S., Chin, J., Hearn, T., Hendricks, E., Lavelle, T., and Martins, J. R.
R. A., “Chemical Equilibrium Analysis with Adjoint Derivatives for Propulsion Cy-
cle Analysis,” Journal of Propulsion and Power, Vol. 33, No. 5, 2017, pp. 1041–1052.
doi:10.2514/1.B36215.
[74] van der Weide, E., Kalitzin, G., Schluter, J., and Alonso, J. J., “Unsteady Turbo-
machinery Computations Using Massively Parallel Platforms,” Proceedings of the 44th
AIAA Aerospace Sciences Meeting and Exhibit, Reno, NV, 2006. doi:10.2514/6.2006-
421, AIAA 2006-0421.
[75] Mader, C. A., Martins, J. R. R. A., Alonso, J. J., and van der Weide, E., “ADjoint:
An Approach for the Rapid Development of Discrete Adjoint Solvers,” AIAA Journal,
Vol. 46, No. 4, 2008, pp. 863–873. doi:10.2514/1.29123.
[76] Mader, C. A., and Martins, J. R. R. A., “Derivatives for Time-Spectral Computational
Fluid Dynamics Using an Automatic Differentiation Adjoint,” AIAA Journal, Vol. 50,
No. 12, 2012, pp. 2809–2819. doi:10.2514/1.J051658.
[77] Lyu, Z., Kenway, G. K., Paige, C., and Martins, J. R. R. A., “Automatic Differenti-
ation Adjoint of the Reynolds-Averaged Navier–Stokes Equations with a Turbulence
Model,” 21st AIAA Computational Fluid Dynamics Conference, San Diego, CA, 2013.
doi:10.2514/6.2013-2581.
45