- New simpler API for specifying the derivatives of your components. You can find out more in this tutorial (http://openmdao.org/docs/tutorials/optimization/derivatives.html)
- Full support for differentiation of systems with array and array slice connections. You can specify component derivatives of arrays with respect to arrays.
- 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.
- 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.)
- Gradient calculation is now a function of a driver's workflow. All of the Differentiatiors have been removed and are no longer needed.
- Support for derivatives is native in Driver and Component, so DriverUsesDerivatives and ComponentWithDerivatives have been deprecated.
- You can now add an array as a parameter.
- 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.

- 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 (https://github.com/OpenMDAO-Plugins/CADRE)
- 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.
- 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 (https://github.com/OpenMDAO-Plugins/SU2_wrapper )

In summary:

# this works in versions before 0.9

top.connect('asm1.y', 'asm2.comp1.x')

# this works in 0.9 and later

top.asm2.create_passthrough('comp1.x')

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.asm.create_passthrough('comp1.x')

top.add_constraint('asm.x = 0')

- Support for array parameters: just add any array to solver or optimizer and it will automatically add each element of the array as a separate parameter to your driver
- New geometry tutorial: We've put together a simple free form deformation geometry example that you can run and shown you how to execute a DOE on it.
- Connection Expressions: You can now have connections where the source term is an expression of one or more values. e.g. connect("A.x + B.x", "C.y")
- File Variables can be initialized with strings: Setting up file variables used to be a little tricky, but you can now initialize them with a string representing the path to the file of interest.