25 #ifndef CASADI_FMU_IMPL_HPP
26 #define CASADI_FMU_IMPL_HPP
29 #include "importer.hpp"
30 #include "shared_object.hpp"
31 #include "resource.hpp"
39 bool discrete_states_need_update;
40 bool terminate_simulation;
41 bool nominals_of_continuous_states_changed;
42 bool values_of_continuous_states_changed;
43 bool next_event_time_defined;
44 double next_event_time;
48 class DaeBuilderInternal;
61 class CASADI_EXPORT FmuInternal :
public SharedObjectInternal {
65 FmuInternal(
const std::string& name,
66 const std::vector<std::string>& scheme_in,
const std::vector<std::string>& scheme_out,
67 const std::map<std::string, std::vector<size_t>>& scheme,
const std::vector<std::string>& aux);
70 ~FmuInternal()
override;
73 virtual void init(
const DaeBuilderInternal* dae);
76 virtual void load_functions() = 0;
79 virtual int enter_initialization_mode(
void* instance)
const = 0;
82 virtual int exit_initialization_mode(
void* instance)
const = 0;
85 virtual int enter_continuous_time_mode(
void* instance)
const = 0;
88 virtual int update_discrete_states(
void* instance, EventMemory* eventmem)
const = 0;
90 virtual int get_derivatives(
void* instance,
double* derivatives,
size_t nx)
const = 0;
93 virtual int set_time(
void* instance,
double t)
const = 0;
96 virtual int set_real(
void* instance,
const unsigned int* vr,
size_t n_vr,
97 const double* values,
size_t n_values)
const = 0;
100 virtual int get_real(
void* instance,
const unsigned int* vr,
size_t n_vr,
101 double* values,
size_t n_values, FmuMemory* m =
nullptr)
const = 0;
104 virtual int get_directional_derivative(
void* instance,
const unsigned int* vr_out,
size_t n_out,
105 const unsigned int* vr_in,
size_t n_in,
const double* seed,
size_t n_seed,
106 double* sensitivity,
size_t n_sensitivity)
const = 0;
109 virtual int get_adjoint_derivative(
void* instance,
const unsigned int* vr_out,
size_t n_out,
110 const unsigned int* vr_in,
size_t n_in,
const double* seed,
size_t n_seed,
111 double* sensitivity,
size_t n_sensitivity)
const;
114 virtual int set_values(
void* instance)
const = 0;
117 virtual int get_aux(
void* instance) = 0;
120 virtual void finalize();
125 void disp(std::ostream& stream,
bool more)
const override;
130 size_t n_in()
const {
return iind_.size();}
135 size_t n_out()
const {
return oind_.size();}
138 size_t index_in(
const std::string& n)
const;
141 size_t index_out(
const std::string& n)
const;
144 Sparsity jac_sparsity(
const std::vector<size_t>& osub,
const std::vector<size_t>& isub)
const;
147 Sparsity hess_sparsity(
const std::vector<size_t>& r,
const std::vector<size_t>& c)
const;
153 std::vector<double> all_nominal_in(
size_t i)
const;
154 std::vector<double> all_nominal_out(
size_t i)
const;
158 std::string desc_in(FmuMemory* m,
size_t id,
bool more =
true)
const;
161 virtual std::string system_infix()
const = 0;
164 static std::string dll_suffix();
169 static Dict compile_fmu(
const std::string& name,
const Dict& files,
const Dict& opts);
173 static std::string pack_fmu(
const Dict& files,
const std::string& path);
177 T* load_function(
const std::string& symname);
180 int discrete_states_iter(
void* instance)
const;
185 virtual int init_mem(FmuMemory* m)
const;
190 virtual FmuMemory* alloc_mem(
const FmuFunction& f)
const = 0;
195 virtual void free_mem(
void *mem)
const = 0;
198 virtual void* instantiate()
const = 0;
201 virtual void free_instance(
void* c)
const = 0;
204 void set(FmuMemory* m,
size_t ind,
const double* value)
const;
207 void request(FmuMemory* m,
size_t ind)
const;
210 int set_all(FmuMemory* m,
const double* values,
size_t n_values)
const;
213 int get_all(FmuMemory* m,
double* values,
size_t n_values)
const;
216 int eval(FmuMemory* m)
const;
219 void get(FmuMemory* m,
size_t id,
double* value)
const;
222 void set_fwd(FmuMemory* m, casadi_int nseed,
223 const casadi_int*
id,
const double* v)
const;
226 void set_fwd(FmuMemory* m,
size_t ind,
const double* v)
const;
229 void request_fwd(FmuMemory* m, casadi_int nsens,
const casadi_int*
id,
230 const casadi_int* wrt_id)
const;
233 void request_fwd(FmuMemory* m, casadi_int ind)
const;
236 int eval_fwd(FmuMemory* m,
bool independent_seeds)
const;
239 int eval_ad(FmuMemory* m)
const;
242 int eval_fd(FmuMemory* m,
bool independent_seeds)
const;
245 void get_fwd(FmuMemory* m, casadi_int nsens,
246 const casadi_int*
id,
double* v)
const;
249 void get_fwd(FmuMemory* m,
size_t ind,
double* v)
const;
252 void set_adj(FmuMemory* m, casadi_int nseed,
253 const casadi_int*
id,
const double* v)
const;
256 void set_adj(FmuMemory* m,
size_t ind,
const double* v)
const;
259 void request_adj(FmuMemory* m, casadi_int nsens,
const casadi_int*
id,
260 const casadi_int* wrt_id)
const;
263 void request_adj(FmuMemory* m, casadi_int ind)
const;
266 int eval_adj(FmuMemory* m)
const;
269 void get_adj(FmuMemory* m, casadi_int nsens,
270 const casadi_int*
id,
double* v)
const;
273 void get_adj(FmuMemory* m,
size_t ind,
double* v)
const;
276 void gather_fwd(FmuMemory* m)
const;
279 void gather_adj(FmuMemory* m)
const;
282 void gather_io(FmuMemory* m)
const;
287 virtual void get_stats(FmuMemory* m,
Dict* stats,
288 const std::vector<std::string>& name_in,
const InputStruct* in)
const = 0;
290 void serialize(SerializingStream& s)
const;
292 virtual void serialize_type(SerializingStream& s)
const;
293 virtual void serialize_body(SerializingStream& s)
const;
295 static FmuInternal* deserialize(DeserializingStream& s);
298 explicit FmuInternal(DeserializingStream& s);
308 std::vector<std::string> scheme_in_, scheme_out_;
309 std::map<std::string, std::vector<size_t>> scheme_;
312 std::vector<std::string> aux_;
315 std::string resource_loc_;
321 std::string instance_name_;
324 std::string instantiation_token_;
330 casadi_int number_of_event_indicators_;
333 bool provides_directional_derivatives_, provides_adjoint_derivatives_;
336 bool can_be_instantiated_only_once_per_process_;
345 std::vector<size_t> iind_, iind_map_, oind_, oind_map_;
348 bool has_independent_;
351 unsigned int independent_vr_;
354 std::vector<double> nominal_in_, nominal_out_;
355 std::vector<double> min_in_, min_out_;
356 std::vector<double> max_in_, max_out_;
357 std::vector<std::string> vn_in_, vn_out_;
358 std::vector<unsigned int> vr_in_, vr_out_;
361 std::vector<double> value_in_;
364 std::vector<std::vector<size_t>> ired_, ored_;
367 Sparsity jac_sp_, hess_sp_;
369 mutable bool warning_fired_discrete_states_need_update_;
370 mutable bool warning_fired_terminate_simulation_;
371 mutable bool warning_fired_nominals_of_continuous_states_changed_;
372 mutable bool warning_fired_values_of_continuous_states_changed_;
373 mutable bool warning_fired_next_event_time_defined_;
377 bool do_evaluation_dance_;
381 T* FmuInternal::load_function(
const std::string& symname) {
383 signal_t f = li_.get_function(symname);
385 casadi_assert(f !=
nullptr,
"Cannot retrieve '" + symname +
"'");
387 return reinterpret_cast<T*
>(f);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.