diff --git a/exm/zelus/ballz/ballz.zls b/exm/zelus/ballz/ballz.zls index 0ba5e13..5ca7269 100644 --- a/exm/zelus/ballz/ballz.zls +++ b/exm/zelus/ballz/ballz.zls @@ -1,6 +1,6 @@ let g = 9.81 -let y0 = 50.0 -let y'0 = 0.0 +let y0 = 0.0 +let y'0 = 10.0 let hybrid ball (y0, y'0) = (y, y', z) where rec der y = y' init y0 @@ -15,7 +15,7 @@ let hybrid main () = print_float t; print_string "\t"; print_float y; - print_string "\t"; - print_float y'; +(* print_string "\t"; + print_float y'; *) print_newline () ); () diff --git a/exm/zelus/sincos/dune b/exm/zelus/sincos/dune index ef360bb..8143ecd 100644 --- a/exm/zelus/sincos/dune +++ b/exm/zelus/sincos/dune @@ -1,6 +1,6 @@ (rule - (targets sincosz.ml sincosz.zci) + (targets sincosz_main.ml sincosz.ml sincosz.zci) (deps (:zl sincosz.zls)) (action - (run zeluc %{zl}))) + (run zeluc -s f -o sincosz_main %{zl}))) diff --git a/src/bin/main.ml b/src/bin/main.ml index b981bdb..ea400a5 100644 --- a/src/bin/main.ml +++ b/src/bin/main.ml @@ -64,10 +64,11 @@ let m = try if !zelus then match !model with - | None -> Format.eprintf "Missing model\n"; exit 2 - | Some "ballz" -> wrap_zelus (lift Ballz.main) - | Some "ballzm" -> wrap_zelus (lift_hsim Ballz_main.main) - | Some "sincosz" -> wrap_zelus (lift Sincosz.f) + | None -> Format.eprintf "Missing model\n"; exit 2 + | Some "ballz" -> wrap_zelus (lift Ballz.main) + | Some "ballzm" -> wrap_zelus (lift_hsim Ballz_main.main) + | Some "sincosz" -> wrap_zelus (lift Sincosz.f) + | Some "sincoszm" -> wrap_zelus (lift_hsim Sincosz_main.main) (* | Some "count" -> wrap_zelus (lift Count.count) *) | Some s -> Format.eprintf "Unknown model: %s\n" s; exit 2 else @@ -86,7 +87,7 @@ let st = if !inplace then (module State.InPlaceSimState : State.SimState) else (module State.FunctionalSimState : State.SimState) let output = - if !no_print then Hsim.Utils.ignore + if !no_print || !zelus then Hsim.Utils.ignore else if !speed then Output.print_h else Output.print (* Output.ignore *) diff --git a/src/lib/hsim/sim.ml b/src/lib/hsim/sim.ml index 6903da1..79d8dfb 100644 --- a/src/lib/hsim/sim.ml +++ b/src/lib/hsim/sim.ml @@ -7,8 +7,9 @@ module Sim (S : SimState) = struct include S - let step_discrete s step hor fder fzer cget zset csize zsize jump reset = - let ms, ss, zin = get_mstate s, get_sstate s, get_zin s in + let step_discrete + s step hor fder fzer cget zset csize zsize jump reset reinit + = let ms, ss, zin = get_mstate s, get_sstate s, get_zin s in let ms = match zin with Some z -> zset ms z | None -> ms in let i, now, stop = get_input s, get_now s, get_stop s in let o, ms = step ms now (i.u now) in @@ -16,7 +17,7 @@ module Sim (S : SimState) = let h = hor ms in if h <= 0.0 then set_mstate ms s else if now >= stop then set_idle s - else if jump ms then begin + else if jump ms || reinit then begin let init = cget ms and stop = stop -. now in let fder t = fder ms t (Utils.offset i.u now t) in let fzer t = fzer ms t (Utils.offset i.u now t) in @@ -54,9 +55,9 @@ module Sim (S : SimState) = (DNode s : ('y, 'yder, 'zin, 'zout) solver) : ('p * (('y, 'yder) ivp * ('y, 'zout) zc), 'a, 'b) sim = let state = get_init m.state s.state in - let step_discrete st = + let step_discrete ?(reinit=false) st = let o, s = step_discrete st m.step m.horizon m.fder m.fzer m.cget m.zset - m.csize m.zsize m.jump s.reset in + m.csize m.zsize m.jump s.reset reinit in Some o, s in let step_continuous st = let o, s, _ = step_continuous st s.step m.cset m.fout m.horizon in @@ -65,7 +66,8 @@ module Sim (S : SimState) = let step st = function | Some i -> let mode, now, stop = Discrete, 0.0, i.h in - step_discrete (set_running ~mode ~input:i ~now ~stop st) + let reinit = i.c = Discontinuous in + step_discrete ~reinit (set_running ~mode ~input:i ~now ~stop st) | None -> if is_running st then match get_mode st with | Discrete -> step_discrete st @@ -88,11 +90,11 @@ module Sim (S : SimState) = let al = List.map (fun a -> run_assert a get_s) m.assertions in let state = get_init m.body.state s.state, al in - let step_discrete (st, al) = + let step_discrete ?(reinit=false) (st, al) = let m=m.body in let o, st = step_discrete st m.step m.horizon m.fder m.fzer m.cget m.zset m.csize - m.zsize m.jump s.reset in + m.zsize m.jump s.reset reinit in let al = List.map (fun (DNode a) -> let _, state = a.step a.state @@ Some (Utils.dot @@ get_mstate st) in DNode { a with state }) al in @@ -134,9 +136,9 @@ module Sim (S : SimState) = (DNodeC s : ('y, 'yder, 'zin, 'zout) solver_c) : ('p * (('y, 'yder) ivp * ('y, 'zout) zc), 'a, 'b) sim = let state = get_init m.state s.state in - let step_discrete st = + let step_discrete ?(reinit=false) st = let o, st = step_discrete st m.step m.horizon m.fder m.fzer m.cget - m.zset m.csize m.zsize m.jump s.reset in + m.zset m.csize m.zsize m.jump s.reset reinit in Some o, st in let step_continuous st = let o, st, _ = step_continuous st s.step m.cset m.fout m.horizon in