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.

Join Our Mailing List

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