open Zls open Odexx.Ode45 type state = { state: t; vec: carray; now: Full.time } let make_full () : (carray, carray) Full.csolver = let state = let v = Zls.cmake 0 in let state = initialize (fun _ _ _ -> ()) (vec v) in set_stop_time state 1.0; { state; vec=v; now=0.0 } in let step ({ state ; vec=v; now } as s) h = let y_nv = vec v in let h = step state h y_nv in let state = copy state in let f t = get_dky state y_nv (now +. t) 0; unvec y_nv in { s with now=now +. h }, { Full.h=h -. now; f } in let reset _ Full.{ fder; y0; h } = let fder t cvec dvec = Zls.blit (fder t cvec) dvec in let state = initialize fder (vec y0) in set_stop_time state h; { state; vec = y0; now=0.0 } in Full.DNode { state; step; reset } let make () : (carray, carray) Fill.csolver = let state = let v = Zls.cmake 0 in let state = initialize (fun _ _ _ -> ()) (vec v) in set_stop_time state 1.0; { state; vec=v; now=0.0 } in let step ({ state ; vec=v; now } as s) h = let y_nv = vec v in let h = step state h y_nv in let state = copy state in let f t = get_dky state y_nv (now +. t) 0; unvec y_nv in { s with now=now +. h }, { Fill.h=h -. now; f } in let reset _ Fill.{ fder; y0; h } = let fder t cvec dvec = Zls.blit (fder t cvec) dvec in let state = initialize fder (vec y0) in set_stop_time state h; { state; vec = y0; now=0.0 } in Fill.DNode { state; step; reset }