feat: a lot of stuff
This commit is contained in:
parent
dd6152833f
commit
6cec3d6c5d
22 changed files with 476 additions and 276 deletions
69
src/lib/solvers/statefulRK45.ml
Normal file
69
src/lib/solvers/statefulRK45.ml
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
open Hsim.Types
|
||||
open Hsim.Solver
|
||||
open Zls
|
||||
|
||||
module Functional : Csolver.CsolverC =
|
||||
struct
|
||||
type ('state, 'vec) state = { state: 'state; vec: 'vec }
|
||||
type session = Odexx.Ode45.t
|
||||
type vec = carray
|
||||
|
||||
let csolve : ((session, vec) state, carray, carray) csolver_c =
|
||||
let open Odexx.Ode45 in
|
||||
|
||||
let init _ =
|
||||
let v = Zls.cmake 0 in
|
||||
let state = initialize (fun _ _ _ -> ()) (vec v) in
|
||||
set_stop_time state 1.0; { state; vec=v } in
|
||||
|
||||
let reset { fder; init; stop; _ } _ =
|
||||
let fder t cvec dvec = Zls.blit (fder t cvec) dvec in
|
||||
let state = initialize fder (vec init) in
|
||||
set_stop_time state stop;
|
||||
{ state; vec = init } in
|
||||
|
||||
let step ({ state ; vec=v } as s) h =
|
||||
let y_nv = vec v in
|
||||
let h = step state h y_nv in
|
||||
let state = copy state in
|
||||
let dky t = get_dky state y_nv t 0; unvec y_nv in
|
||||
(h, dky), s in
|
||||
|
||||
let copy { state; vec } = { state; vec } in
|
||||
|
||||
DNodeC { init; step; reset; copy }
|
||||
end
|
||||
|
||||
module InPlace : Csolver.CsolverC =
|
||||
struct
|
||||
type ('state, 'vec) state = { mutable state: 'state; mutable vec : 'vec }
|
||||
type session = Odexx.Ode45.t
|
||||
type vec = carray
|
||||
|
||||
let csolve : ((session, vec) state, carray, carray) csolver_c =
|
||||
let open Odexx.Ode45 in
|
||||
|
||||
let init _ =
|
||||
let v = Zls.cmake 0 in
|
||||
let state = initialize (fun _ _ _ -> ()) (vec v) in
|
||||
set_stop_time state 1.0;
|
||||
{ state; vec=v } in
|
||||
|
||||
let reset { fder; init; stop; _ } s =
|
||||
let fder t cvec dvec =
|
||||
let dvec' = fder t cvec in Zls.blit dvec' dvec in
|
||||
let state = initialize fder (vec init) in
|
||||
set_stop_time state stop; s.state <- state ; s.vec <- init; s in
|
||||
|
||||
let step ({ state; vec=v } as s) h =
|
||||
let y_nv = vec v in
|
||||
let h = step state h y_nv in
|
||||
let get_dky t = get_dky state y_nv t 0; unvec y_nv in
|
||||
(h, get_dky), s in
|
||||
|
||||
let copy { state; vec } =
|
||||
{ state = copy state; vec = Zls.copy vec } in
|
||||
|
||||
DNodeC { init; reset; step; copy }
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue