OpenMDAO Logo

An open-source framework for efficient multidisciplinary optimization.

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 

J. S. Gray, J. T. Hwang, J. R. R. A. Martins, K. T. Moore, and B. A. Naylor, “OpenMDAO: An Open-Source Framework for Multidisciplinary Design, Analysis, and Optimization,” Structural and Multidisciplinary Optimization, 2019.

@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]
Fork me on GitHub