feat: remove greedy sim, acceleration based on continuity, and composition

This commit is contained in:
Henri Saudubray 2025-06-04 16:26:37 +02:00
parent 1a4f950324
commit 65918ab59b
Signed by: hms
GPG key ID: 7065F57ED8856128
5 changed files with 195 additions and 177 deletions

View file

@ -7,7 +7,7 @@ open Types
let sample = ref 10
let stop = ref 30.0
let greedy = ref false
let accel = ref false
let inplace = ref false
let sundials = ref false
let steps = ref 1
@ -26,8 +26,8 @@ let opts = [
"-sample", Arg.Int (gt0i sample), "n \tSample count (default=10)";
"-stop", Arg.Float (gt0f stop), "n \tStop time (default=10.0)";
"-debug", Arg.Set Debug.debug, "\tPrint debug information";
"-greedy", Arg.Set greedy, "\tUse greedy simulation";
"-sundials", Arg.Set sundials, "\tUse sundials (not compatible with greedy)";
"-accelerate", Arg.Set accel, "\tConcatenate continuous functions";
"-sundials", Arg.Set sundials, "\tUse sundials (does not support acceleration)";
"-inplace", Arg.Set inplace, "\tUse imperative solvers";
"-steps", Arg.Int (gt0i steps), "n \tSplit into [n] steps (default=1)";
]
@ -53,19 +53,18 @@ let st = if !inplace then (module State.InPlaceSimState : State.SimState)
let sim =
if !sundials then
if !greedy then
(Format.eprintf "Sundials does not support greedy simulation\n"; exit 2)
else
let open StatefulSundials in
let c = if !inplace then InPlace.csolve else Functional.csolve in
let s = Solver.solver c (d_of_dc z) in
let open Sim.LazySim(val st) in run_until_n m s
let open StatefulSundials in
let c = if !inplace then InPlace.csolve else Functional.csolve in
let s = Solver.solver c (d_of_dc z) in
let open Sim.Sim(val st) in
run_until_n (Output.print !sample (run m s))
else
let open StatefulRK45 in
let c = if !inplace then InPlace.csolve else Functional.csolve in
let s = Solver.solver_c c z in
if !greedy then let open Sim.GreedySim(val st) in run_until_n m s
else let open Sim.LazySim(val st) in run_until_n m (d_of_dc s)
let open Sim.Sim(val st) in
let n = if !accel then accelerate m s else run m (d_of_dc s) in
run_until_n (Output.print !sample n)
let () = sim !stop !steps (Output.print !sample)
let () = sim !stop !steps ignore