Closed gabrielgellner closed 8 years ago
I really don't want to have any support for the tableaus anymore. It is a really cool piece of code, but it defaults the pragmatic view I have for this package. I am going to get rid of the tableau logic and just use basic arrays. The only trick will be to make sure I support having either Float32
or Float64
.
Currently we closely follow the structure of the
ODE.jl
packages structure which is extremely generic, allowing for inputs of any Butcher tableau with a generic stepper, one for fixed step and one for adaptive. We have removed the fixed steppers as it is of very little utility outside of very specific use cases. In generally it increasingly feels like there is little practical benefit for this generality. From the treatise by Hairer and Wanner (1993) it is clear thatDopri5/Dop853
are a clear winners among the explicit Runge-Kutta solvers, crushingRKFehlberg45
codes. The only exception might be the more recentode23
like codes from Shampine (which look like they might be more efficient for coarse tolerance and mild stiffness). Whatever the case we will move towards only supporting these 2-3 solvers for the explicit Runge-Kutta family. To this end some nice simplifications can be made:Bool
field that is set at construction [Done]Once these changes are implemented the question comes on how to call the
Dopri
codes. Currently we have specific types for the specific type inDopri54
. No since we want to support bothDopri54
andDopri853
the question becomes whether it makes sense to use the current method or instead have a general typeDopri
that then has an argument for the orderDopri(func, order = 54)
. And then for the regular case we just default to the best default solver (Dopri853
I believe). The only issue with this is how to do dispatch in this case as the solver method might need the order information for things like the Hermite interpolation and how the step embedding works. The only solution for this would be to either have manual dispatch withif
statements. Or have the order be type instances that can be delegated on, likeDopri(func, order = dp54)
wheredp45 <: RKOrder
or some such.