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.

@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

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() 
indeps = prob.model.add_subsystem('indeps', om.IndepVarComp()) 
indeps.add_output('x', 3.0) 
indeps.add_output('y', -4.0) 

prob.model.add_subsystem('paraboloid', om.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 = om.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) 
prob.model.add_objective('paraboloid.f') 

prob.setup() 
prob.run_driver() 

# minimum value 
print(prob['paraboloid.f']) 
# location of the minimum 
print(prob['indeps.x']) 
print(prob['indeps.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