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
@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]