OpenMDAO v0.9.0 Release Notes

New Features:

This release incorporates a brand new capability for calculating the gradient of your models based on the work of John Hwang and Joaquim Martins at the University of Michigan. This change is a complete replacement of the former system, so it will require some retooling of your old components if you specified derivatives.
  1. New simpler API for specifying the derivatives of your components. You can find out more in this tutorial (
  2. Full support for differentiation of systems with array and array slice connections. You can specify component derivatives of arrays with respect to arrays.
  3. The coupled derivative system is now solved numerically with scipy's GMRES. The full-model Jacobian is realized as a linear operator so that it is never stored entirely in memory.
  4. OpenMDAO automatically determines what needs to be finite differenced (components without derivatives, or component-pairs with non-differentiable connections) and groups them appropriately. (Note: the stepsize is currently fixed at 1.0e-6. User specification of stepsizes for individual variables is forthcoming.)
  5. Gradient calculation is now a function of a driver's workflow. All of the Differentiatiors have been removed and are no longer needed.
  6. Support for derivatives is native in Driver and Component, so DriverUsesDerivatives and ComponentWithDerivatives have been deprecated.
  7. You can now add an array as a parameter.
  8. OpenMDAO's underlying dependency graph has been rewritten to support this and future work. The dependency graph assures that the derivative system only contains the connections that are relevant to the problem.
There are also a few advanced features of the new derivatives capability that aren't encapsulated in tutorials yet.
  1. Alternative interface for specifying the matrix-vector product of your component's Jacobian (useful for cases where your component's Jacobian is too large to store). This repo contains an example (
  2. Workflows contain a check_gradient method that can be called to compare the component's analytic derivatives with finite difference. Some more improvements are on the way to make this easier to use.
  3. It is now possible to specify the derivative of a non-differentiable output or input such as a mesh or file. This repo contains an example ( )

Backwards-incompatible Change

In older versions of OpenMDAO it was possible to make connections between components located in different assemblies. For example, if you had two assemblies, asm1 and asm2, the old version of OpenMDAO would allow you to do things like 'top.connect('asm1.y', 'asm2.comp1.x'). In the current version of OpenMDAO, only variables within the scope of the same assembly can be connected. This means that comp1.x has to be made visible as a variable of asm2, typically by calling asm2.create_passthrough('comp1.x'), which creates a variable 'x' in asm2 and connects it to comp1.x. Once that is done, top.connect('asm1.y','asm2.x') will connect asm1.y to asm2.x, which is connected inside of asm2 to comp1.x.

In summary:
# this works in versions before 0.9
top.connect('asm1.y', 'asm2.comp1.x')

# this works in 0.9 and later
top.connect('asm1.y', 'asm2.x')

This same restriction also applies to parameters, objectives and constraints defined in a driver. They may only reference variables found in the same scope that contains the driver.

For example:

# this works in versions before 0.9
top.driver.add_constraint('asm.comp1.x = 0')

# this works in 0.9 and later
top.add_constraint('asm.x = 0')

Other Changes

In addition to the above major changes, the following are also new in 0.9.0: