Hi all,
I am writing a domain-specific simulator built on top of DifferentialEquations.jl; I am solving a mathematically simple, but large / expensive system of ODEs (>10,000), and wish to minimise memory usage by setting save_everystep=false and periodically exporting some data to disk.
With no exporting to disk and using the SciML integrator interface, a simulation can finish in 27 function evaluations (as shown by integrator.stats); however, adding the periodic saving increases that to 603 function evaluations, both using DiffEqCallbacks or explicitly step!(integrator, next_export_time, true). I also set u_modified!(integrator, false) to avoid unnecessary saves as there are no discontinuities added.
Would it make sense to do each step!(integrator) - i.e. take the maximal successful time step - then use change_t_via_interpolation! to “go back” to each data-exporting timepoint between integrator.tprev and integrator.t? Do the ODE higher-order interpolants apply when save_everystep=false, but just between t and tprev?
I implemented this “maximal stepping, then back-interpolating” (though it’s quite a bit of code; I’m hoping this post is enough to spot any problems with the general approach, but if an MWE is needed please let me know) - however, the calls to change_t_via_interpolation! seem to destroy the integration accuracy in future timesteps. In other words, incrementally interpolating between tprev and t using change_t_via_interpolation! does not return the integrator to t. Is that expected, and is there a smarter way to let the integrator take maximal steps (and minimise function evaluations) while interpolating intra-step to export some data? I know interpolating can take some time, but I expect it to be much less than running more function evaluations.
Thanks,
Leonard