# DifferentialEquations.jl 3.1: Jacobian Passing

The DifferentialEquations.jl 3.0 release had most of the big features and was featured in a separate blog post. Now in this release we had a few big incremental developments. We expanded the capabilities of our wrapped libraries and completed one of the most requested features: passing Jacobians into the IDA and DASKR DAE solvers. Let's just get started there:

## Jacobian interface for DAEs

First of all, we needed a common Jacobian interface for `DAEProblem` types. `DAEProblem`s are different than ODEs because the solver needs to know how to handle the `du` terms, since `G(t,u,du)=0` may have nonlinear usage of the derivatives. However, all of the nonlinear solvers use the form

``dG/du + gamma*dG/d(du)``

where `gamma` is dependent on `dt`, and so we can use that form for DAEs. This matches the definition used by older packages, so in a sec we'll mention that! Defines the interface.

## Improved bindings and jacobian passing for Sundials.jl and DASKR.jl

Now Sundials accepts the Jacobians into its `CVODE_Adams`, `CVODE_BDF`, and `IDA` algorithms. `daskr` also makes use of the jacobians. By passing these functions you can thus speed up the algorithms. In addition, the linear solver choices for `daskr` have been made available in the common interface. This gives us access to another banded and Krylov method for DAEs.

## New callbacks in the callback library

There are many new callbacks in the callback library. These include the `IterativeCallback` where you give it a method for how to choose the next timepoint for an event, and an effect to do at the event. This allows you to easily cause discontinuous changes at time series t1, t2, t3, ... where the next timepoints require knowing the previous. The `PeriodicCallback` makes it easy to have an event every `dt`. The `SavingCallback` makes it easy to save some function of the solution at each step, or via `saveat` and other similar controls.

## Complex support in stiff solvers

The stiff solvers all can now make use of DiffEqDiffTools by making `autodiff=false`. DiffEqDiffTools.jl is compatible with complex numbers, and thus all of these stiff solvers can solve problems where analytical Jacobians are not given via numerical differentiation.

## Non-diagonal additive noise and high order scalar noise SDE support

The high order SDE solvers used to only support diagonal noise. However, there are additional cases where they work as well, and this support has been added. The strong order 1.5 method for additive noise, `SRA1`, can now handle non-diagonal additive noise. Additionally, `SRA1`, `SRA`, `SRI`, and `SRIW1` all support scalar noise as well (i.e. single random variable for multiple SDEs).

## Integrator reinit interface

Many times you have to re-solve the same equation repeatedly. In these cases, you may want to re-use the same integration cache, and then modify parameters or just re-run with a new initial condition. We have now added a function `reinit` to the integrator interface that allows one to reset the integrator to a new initial condition, along with options for wiping the current state.

# In development

Note that some projects have been sectioned off as possible GSoC projects. These would also do well as new contributor projects if anyone's interested, and so these are not considered in the "in development" list as we are leaving these open for newcomers/students.

Putting those aside, this is the main current "in development" list:

• IMEX Methods