Skip to main content

fmi_sim/sim/fmi2/
me.rs

1use fmi::{
2    EventFlags,
3    fmi2::{import::Fmi2Import, instance::InstanceME},
4    traits::FmiInstance,
5};
6
7use crate::{
8    Error,
9    sim::{
10        InputState, RecorderState, SimState, SimStateTrait,
11        io::StartValues,
12        params::SimParams,
13        traits::{InstSetValues, SimApplyStartValues},
14    },
15};
16
17impl SimStateTrait<InstanceME, Fmi2Import> for SimState<InstanceME> {
18    fn new(
19        import: &Fmi2Import,
20        sim_params: SimParams,
21        input_state: InputState<InstanceME>,
22        recorder_state: RecorderState<InstanceME>,
23    ) -> Result<Self, Error> {
24        log::trace!("Instantiating ME Simulation: {sim_params:#?}");
25        let inst = import.instantiate_me("inst1", true, true)?;
26        Ok(Self {
27            sim_params,
28            input_state,
29            recorder_state,
30            inst,
31            event_flags: EventFlags::default(),
32        })
33    }
34}
35
36impl SimApplyStartValues<InstanceME> for SimState<InstanceME> {
37    fn apply_start_values(
38        &mut self,
39        start_values: &StartValues<<InstanceME as FmiInstance>::ValueRef>,
40    ) -> Result<(), Error> {
41        start_values.variables.iter().for_each(|(vr, ary)| {
42            self.inst.set_array(&[*vr], ary);
43        });
44        Ok(())
45    }
46}