OpenMDAO Logo

An open-source framework for efficient multidisciplinary optimization.

What is OpenMDAO?

OpenMDAO is an open-source high-performance computing platform for systems analysis and multidisciplinary optimization, written in Python. It enables you to decompose your models, making them easier to build and maintain, while still solving them in a tightly coupled manner with efficient parallel numerical methods.

Why Use OpenMDAO?

The OpenMDAO project is primarily focused on supporting gradient-based optimization with analytic derivatives to allow you to explore large design spaces with hundreds or thousands of design variables, but 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},
Title="{OpenMDAO: An Open-Source Framework for Multidisciplinary Design, Analysis, and Optimization}",
Journal="{Structural and Multidisciplinary Optimization}",
note= {In Press}

Getting Started with OpenMDAO

Installation Instructions:

From your python environment (we recommend Anaconda), just type:

>> pip install openmdao

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

from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp 

# build the model 
prob = Problem() 
indeps = prob.model.add_subsystem('indeps', IndepVarComp()) 
indeps.add_output('x', 3.0) 
indeps.add_output('y', -4.0) 

prob.model.add_subsystem('paraboloid', ExecComp('f = (x-3)**2 + x*y + (y+4)**2 - 3')) 

prob.model.connect('indeps.x', 'paraboloid.x') 
prob.model.connect('indeps.y', 'paraboloid.y') 

prob.driver = ScipyOptimizeDriver() 
prob.driver.options['optimizer'] = 'SLSQP' 

prob.model.add_design_var('indeps.x', lower=-50, upper=50) 
prob.model.add_design_var('indeps.y', lower=-50, upper=50) 


# 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