What is OpenMDAO?
OpenMDAO is an open-source optimization framework and a platform to building new analysis tools with analytic derivatives.
Why Use OpenMDAO?
- Faster, more stable design optimization.
- Rapid development of new analysis tools.
- Tight integration of high-fidelity analyses into system level models
Looking for more info?
Our online documentation is extensive, including tutorials to get started with and feature docs. We have our code repository on github, Including a 2021 development roadmap. Our publications are a great place to see how we use OpenMDAO ourselves. Great introductions to community uses can be seen in the 2019 OpenMDAO workshop YouTube, or 2020 OpenMDAO reverse hackathon github repo. External users often ask questions on stack-overflow. You might also check out two major libraries that we develop on top of openmdao: Dymos (transient modeling and optimal control) and pyCycle (turbine engine cycle analysis). Both provide engineering analyses with analytic derivatives.
Cite Us
@article{Gray2019a, Author = {Justin S. Gray and John T. Hwang and Joaquim R. R. A. Martins and Kenneth T. Moore and Bret A. Naylor}, Doi = {10.1007/s00158-019-02211-z}, Journal = {Structural and Multidisciplinary Optimization}, Month = {April}, Number = {4}, Pages = {1075--1104}, Title = {{OpenMDAO}: An open-source framework for multidisciplinary design, analysis, and optimization}, Volume = {59}, Year = {2019}}
Getting Started with OpenMDAO
Installation Instructions:
From your python environment (we recommend Anaconda), just type:
>> pip install 'openmdao[all]'
Sample Optimization File
Here is a simple example run file to get you started running your first optimization. Copy the following code into a file named paraboloid_min.py:
import openmdao.api as om # build the model prob = om.Problem() prob.model.add_subsystem('paraboloid', om.ExecComp('f = (x-3)**2 + x*y + (y+4)**2 - 3')) # setup the optimization prob.driver = om.ScipyOptimizeDriver() prob.driver.options['optimizer'] = 'SLSQP' prob.model.add_design_var('paraboloid.x', lower=-50, upper=50) prob.model.add_design_var('paraboloid.y', lower=-50, upper=50) prob.model.add_objective('paraboloid.f') prob.setup() # set initial values prob.set_val('paraboloid.x', 3.0) prob.set_val('paraboloid.y', -4.0) # run the optimization prob.run_driver() # minimum value print(prob.get_val('paraboloid.f')) # location of the minimum print(prob.get_val('paraboloid.x')) print(prob.get_val('paraboloid.y'))
Then, to run the file, simply type:
>> python paraboloid_min.py
If all works as planned, results should appear as such:
Optimization terminated successfully. (Exit mode 0)
Current function value: -27.333333333333336
Iterations: 5
Function evaluations: 6
Gradient evaluations: 5
Optimization Complete
-----------------------------------
[-27.33333333]
[ 6.66666667]
[-7.33333333]