OpenMDAO Logo

An open-source framework for efficient multidisciplinary optimization.

What is OpenMDAO?

OpenMDAO is an open-source high-performance computing platform for efficient optimization, written in Python. It helps you perform design optimization at least 10 times faster, via the use of state-of-the-art techniques and efficient parallelization.

Why Use OpenMDAO?

The OpenMDAO project is focused on supporting gradient-based optimization with analytic derivatives. This allows you to explore design spaces with hundreds or thousands of design variables very fast. The framework also has a number of parallel computing features that can work with gradient-free optimization, mixed-integer nonlinear programming, and traditional design space exploration.

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.

    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

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) 


# set initial values 
prob.set_val('paraboloid.x', 3.0) 
prob.set_val('paraboloid.y', -4.0)

# run the optimization

# minimum value 

# location of the minimum 

Then, to run the file, simply type:

>> python

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