Skip to content

Commit a997a7e

Browse files
committed
Updates to paper regarding motivation/background
1 parent 90de8bf commit a997a7e

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

joss/paper.md

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,22 @@ affiliations:
1616
- name: Georgia Institute of Technology, United States
1717
index: 1
1818
ror: 01zkghx44
19-
date: 24 October 2025
19+
date: 17 December 2025
2020
bibliography: paper.bib
2121
---
2222

2323
# Summary
2424

25-
In an effort to solve a variety of multidisciplinary optimization (MDO) problems with gradient-based techniques, we have developed a tool to facilitate the system-level construction and execution for both the forward and reverse analyses.
25+
Engineering design problems often involve a sequence of coupled analyses that distribute information between one another.
26+
Derivative-based optimization methods can be used to numerically solve these design problems in a computationally efficient manner.
27+
The adjoint method enables the calculation of the derivatives required for gradient-based optimization and scales well with many design variables.
28+
To more effectively organize and solve these design problems, we have developed a framework to facilitate the system-level construction and execution for both the forward and reverse analyses.
2629
This framework, entitled _Flume_, is designed around systems that can be described by directed acyclic graphs (DAG).
27-
While this specific architecture prevents systems that have coupled relationships, it is applicable for a wide variety of problems, including topology and trajectory optimization.
28-
Following the DAG structure, each node represents an individual analysis that needs to be performed for the MDO problem, and the edges represent connections between analyses and denote the flow of information.
29-
To ensure that the framework is extensible, lightweight, and minimalist, three base classes have been implemented in Python to capture the necessary functionality: _State_, _Analysis_, and _System_.
30+
While this specific architecture excludes systems that have implicitly coupled relationships, it is applicable for a wide variety of problems, including topology and trajectory optimization.
31+
Following the DAG structure, each node represents an individual analysis that needs to be performed for the optimization problem, and the edges represent connections between analyses and denote the flow of information.
32+
By describing a design problem in this manner, the DAG structure can be constructed programmatically, motivating the development of a framework to address this task.
33+
34+
To ensure that the framework is extensible, lightweight, and minimalistic, three base classes have been implemented in Python to capture the necessary functionality: _State_, _Analysis_, and _System_.
3035
The first class, _State_, simply provides an object that stores numerical data along with some additional metadata, including type, shape, and object source information.
3136
_Analysis_ is the foundation of Flume, and its primary task is to execute the forward and adjoint procedures to obtain the outputs and derivatives needed for optimization.
3237
Finally, _System_ provides a set of methods to declare the objective function, constraints, and design variables that will be used within the optimization problem, as well as a means to visualize the DAG.
@@ -44,25 +49,25 @@ Thus, the arrows that extend beyond the _System_ boundary are _States_ that defi
4449
# Statement of Need
4550

4651
Numerical optimization is a field with a diverse range of applications, and, in engineering, is often used as a means of formulating problems in a formal, mathematical manner to identify optimal designs.
47-
The development of frameworks for organizing and solving these problems, which are often multidisciplinary in nature, is a topic that has been addressed by others in the past.
48-
Investigations of these frameworks has exposed a set of requirements for MDO frameworks, including modularity, intuitive user interfaces, object-oriented principles, and minimal overhead [@salas1998framework, @padula2006multidisciplinary].
49-
These attributes, among others, are critical components to ensuring that an MDO framework is extensible to a multitude of disciplines and accessible by a variety of individuals.
50-
While there are many MDO frameworks that have been developed since the late 20th century, a few are listed below to highlight the current state of the art.
52+
The development of frameworks for organizing and solving these problems is a topic that has been addressed by others in the past.
53+
Investigations of these frameworks has exposed a set of requirements for optimization frameworks, including modularity, intuitive user interfaces, object-oriented principles, and minimal overhead [@salas1998framework, @padula2006multidisciplinary].
54+
These attributes, among others, are critical components to ensuring that an optimization framework is extensible to a multitude of disciplines and accessible by a variety of individuals.
55+
While there are many design optimization frameworks that have been developed since the late 20th century, a few are listed below to highlight the current state of the art.
5156

52-
- _ASTROS_: one of the first examples of MDO frameworks, _ASTROS_ performs preliminary structural design using numerical optimization based on the finite-element method [@astros]
57+
- _ASTROS_: one of the first examples of an optimization framework, _ASTROS_ performs preliminary structural design using numerical optimization based on the finite-element method [@astros]
5358
- _DAKOTA_: developed by Sandia National Laboratories, _DAKOTA_ is a software suite written in C++ that provides methods for a variety of analyses, including gradient-based and gradient-free optimization [@dakota]
5459
- _Isight_: a commercial tool by Dassault Systèmes that utilizes an object-oriented approach to connect a variety of simulation-based models [@isight]
5560
- _pyOptSparse_: an object-oriented solution written in Python, designed for solving constrained nonlinear optimization problems with sparsity that also supports parallelism [@Wu2020pyoptsparse]
5661
- _OpenMDAO_: another open-source framework constructed within Python that utilizes gradient-based techniques for optimization of systems constructed with distinct components [@gray2019openmdao]
5762

5863
As evident from this list, users are presented with many viable options to perform numerical optimization for their system of interest.
59-
_Flume_ provides another resource for those solving MDO problems, but it was particularly architected to facilitate gradient-based design optimization with the adjoint method.
64+
_Flume_ provides another resource for those solving design optimization problems, but it was particularly architected to facilitate gradient-based design optimization with the adjoint method.
6065
For each _Analysis_ that a user wants to integrate into their model, they are responsible for providing the forward and adjoint analysis techniques that are specific to the computations they want to perform.
6166
The backend of _Flume_ will then orchestrate the assembly of total derivatives through the adjoint method by accumulating contributions from the objective function and any constraints for the system.
6267
Thus, each individual _Analysis_ must only consider its respective variable-output combinations, and the adjoint variables will propagate information through the model to compute the necessary total derivative information.
6368
This assists the user by allowing them to prioritize the development of the individual _Analysis_ objects, and the framework, paired with the proper _System_ construction, will address the data distribution for both computational directions.
6469
Since the core components of _Flume_ define the framework for the forward and adjoint analyses, it does not inherently perform the optimization.
65-
However, since numerical optimization is the ultimate objective, two interfaces are currently supported: SciPy [@2020-SciPy-NMeth] and ParOpt [@Chin2019paropt].
70+
However, since numerical optimization is the ultimate objective, two optimizer interfaces are currently supported with SciPy [@2020-SciPy-NMeth] and ParOpt [@Chin2019paropt].
6671
These interfaces provide the means of connecting a _System_ to an optimizer that will perform the numerical optimization.
6772

6873
# Applications of _Flume_
@@ -95,7 +100,7 @@ Within _Flume_, this is implemented by constructing three distinct _Analysis_ ob
95100
As a demonstration, the code for the objective function _Analysis_ class is included below.
96101
Here, it is worth discussing a few key features regarding the structure of the code.
97102

98-
- The `__init__` method is responsible for defining the default parameter and variable values for the class. This specifies the full set of inputs that are required to compute the outputs, where, generally, parameters are fixed inputs and variables will nominally change throughout the process of an optimization. The variables and parameters are dictionaries that are stored as attributes of the associated class, and the variable are wrapped within the _State_ class to contain value, derivative, and other metadata information.
103+
- The `__init__` method is responsible for defining the default parameter and variable values for the class. This specifies the full set of inputs that are required to compute the outputs, where, generally, parameters are fixed inputs and variables will nominally change throughout the process of an optimization. The variables and parameters are dictionaries that are stored as attributes of the associated class, and the variables are wrapped within the _State_ class to contain value, derivative, and other metadata information.
99104
- The `_analyze` method defines the forward analysis for evaluating the value of the Rosenbrock function. This utilizes the parameter and variable values stored within the class, and then the output value is assigned into an `outputs` dictionary. The line that sets `self.analyzed = True`, while small, is critically important for denoting the computations are concluded for the current _Analysis_ class.
100105
- The `_analyze_adjoint` method performs the adjoint analysis for the computations associated with the current class. Here, the variables are treated as independent, and the contributions from the adjoint variables associated with the output are accumulated into any previously computed derivatives for the variables. Similar to the `_analyze` method, it is necessary to have the line that performs the assignment for `self.adjoint_analyzed = True` to denote that the computations have concluded.
101106

0 commit comments

Comments
 (0)