fmu3.cpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 
26 #include "fmu3.hpp"
27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
29 
30 namespace casadi {
31 
32 // Memory object
33 struct CASADI_EXPORT Fmu3Memory : public FmuMemory {
34  Fmu3::Value aux_value;
35  // Constructor
36  explicit Fmu3Memory(const FmuFunction& self) : FmuMemory(self) {}
37 };
38 
39 int Fmu3::init_mem(FmuMemory* mem) const {
40  if (FmuInternal::init_mem(mem)) return 1;
41  auto *m = static_cast<Fmu3Memory*>(mem);
43  m->aux_value.v_real.resize(off_aux_real_.back());
44  m->aux_value.v_integer.resize(off_aux_integer_.back());
45  m->aux_value.v_boolean.resize(off_aux_boolean_.back());
46  m->aux_value.v_string.resize(off_aux_string_.back());
47  return 0;
48 }
49 
51  return new Fmu3Memory(f);
52 }
53 
54 void Fmu3::free_mem(void *mem) const {
55  delete static_cast<Fmu3Memory*>(mem);
56 }
57 
59 }
60 
61 std::string Fmu3::dll_infix() {
63 }
64 
65 void Fmu3::init(const DaeBuilderInternal* dae) {
66  // Initialize base classes
67  FmuInternal::init(dae);
68 
69  // Collect input and parameter values
70  vr_real_.clear();
71  vr_integer_.clear();
72  vr_boolean_.clear();
73  vr_string_.clear();
74  init_real_.clear();
75  init_integer_.clear();
76  init_boolean_.clear();
77  init_string_.clear();
78  for (size_t i = 0; i < dae->n_variables(); ++i) {
79  const Variable& v = dae->variable(i);
80  // Consitency check
81  casadi_assert(v.numel == v.value.size(), "Size mismatch for " + v.name);
82  // Skip if the wrong type
83  if (v.causality != Causality::PARAMETER && v.causality != Causality::INPUT) continue;
84  // Variable has not been set - keep default value
85  if (!v.is_set()) continue;
86  // Value reference
87  fmi3ValueReference vr = v.value_reference;
88  // Get value
89  switch (to_fmi2(v.type)) {
90  case TypeFmi2::REAL:
91  init_real_.insert(init_real_.end(), v.value.begin(), v.value.end());
92  vr_real_.push_back(vr);
93  break;
94  case TypeFmi2::INTEGER:
95  case TypeFmi2::ENUM:
96  init_integer_.insert(init_integer_.end(), v.value.begin(), v.value.end());
97  vr_integer_.push_back(vr);
98  break;
99  case TypeFmi2::BOOLEAN:
100  init_boolean_.insert(init_boolean_.end(), v.value.begin(), v.value.end());
101  vr_boolean_.push_back(vr);
102  break;
103  case TypeFmi2::STRING:
104  casadi_assert(v.numel == 1, "Vector variable support for strings not implemented");
105  init_string_.push_back(v.stringvalue);
106  vr_string_.push_back(vr);
107  break;
108  default:
109  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
110  }
111  }
112 
113  // Collect auxilliary variables
114  vn_aux_real_.clear();
115  vn_aux_integer_.clear();
116  vn_aux_boolean_.clear();
117  vn_aux_string_.clear();
118  vr_aux_real_.clear();
119  vr_aux_integer_.clear();
120  vr_aux_boolean_.clear();
121  vr_aux_string_.clear();
122  off_aux_real_ = {0};
123  off_aux_integer_ = {0};
124  off_aux_boolean_ = {0};
125  off_aux_string_ = {0};
126  for (auto&& s : aux_) {
127  const Variable& v = dae->variable(s);
128  // Convert to expected type
129  fmi3ValueReference vr = v.value_reference;
130  // Sort by type
131  switch (to_fmi2(v.type)) {
132  case TypeFmi2::REAL:
133  // Real
134  vn_aux_real_.push_back(v.name);
135  vr_aux_real_.push_back(vr);
136  off_aux_real_.push_back(off_aux_real_.back() + v.numel);
137  break;
138  case TypeFmi2::INTEGER:
139  case TypeFmi2::ENUM:
140  // Integer or enum
141  vn_aux_integer_.push_back(v.name);
142  vr_aux_integer_.push_back(vr);
143  off_aux_integer_.push_back(off_aux_integer_.back() + v.numel);
144  break;
145  case TypeFmi2::BOOLEAN:
146  // Boolean
147  vn_aux_boolean_.push_back(v.name);
148  vr_aux_boolean_.push_back(vr);
149  off_aux_boolean_.push_back(off_aux_boolean_.back() + v.numel);
150  break;
151  case TypeFmi2::STRING:
152  // String
153  vn_aux_string_.push_back(v.name);
154  vr_aux_string_.push_back(vr);
155  off_aux_string_.push_back(off_aux_string_.back() + v.numel);
156  break;
157  default:
158  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
159  }
160  }
161 }
162 
165  aux_value_.v_real.resize(off_aux_real_.back());
166  aux_value_.v_integer.resize(off_aux_integer_.back());
167  aux_value_.v_boolean.resize(off_aux_boolean_.back());
168  aux_value_.v_string.resize(off_aux_string_.back());
169 
170  // Recursive call
172 }
173 
175  instantiate_model_exchange_ = load_function<fmi3InstantiateModelExchangeTYPE>(
176  "fmi3InstantiateModelExchange");
177  free_instance_ = load_function<fmi3FreeInstanceTYPE>("fmi3FreeInstance");
178  reset_ = load_function<fmi3ResetTYPE>("fmi3Reset");
179  enter_initialization_mode_ = load_function<fmi3EnterInitializationModeTYPE>(
180  "fmi3EnterInitializationMode");
181  exit_initialization_mode_ = load_function<fmi3ExitInitializationModeTYPE>(
182  "fmi3ExitInitializationMode");
183  enter_continuous_time_mode_ = load_function<fmi3EnterContinuousTimeModeTYPE>(
184  "fmi3EnterContinuousTimeMode");
185  set_time_ = load_function<fmi3SetTimeTYPE>("fmi3SetTime");
186  get_float64_ = load_function<fmi3GetFloat64TYPE>("fmi3GetFloat64");
187  set_float64_ = load_function<fmi3SetFloat64TYPE>("fmi3SetFloat64");
188  get_int32_ = load_function<fmi3GetInt32TYPE>("fmi3GetInt32");
189  set_int32_ = load_function<fmi3SetInt32TYPE>("fmi3SetInt32");
190  get_boolean_ = load_function<fmi3GetBooleanTYPE>("fmi3GetBoolean");
191  set_boolean_ = load_function<fmi3SetBooleanTYPE>("fmi3SetBoolean");
192  get_string_ = load_function<fmi3GetStringTYPE>("fmi3GetString");
193  set_string_ = load_function<fmi3SetStringTYPE>("fmi3SetString");
196  load_function<fmi3GetDirectionalDerivativeTYPE>("fmi3GetDirectionalDerivative");
197  }
200  load_function<fmi3GetAdjointDerivativeTYPE>("fmi3GetAdjointDerivative");
201  }
203  load_function<fmi3UpdateDiscreteStatesTYPE>("fmi3UpdateDiscreteStates");
204 }
205 
206 void Fmu3::log_message_callback(fmi3InstanceEnvironment instanceEnvironment,
207  fmi3Status status, fmi3String category, fmi3String message) {
208  // Print message content
209  uout() << "[" << category << "] " << message << std::endl;
210 }
211 
212 void* Fmu3::instantiate() const {
213  // Instantiate FMU
214  fmi3String instanceName = instance_name_.c_str();
215  fmi3String instantiationToken = instantiation_token_.c_str();
216  fmi3String resourcePath = resource_loc_.c_str();
217  fmi3Boolean visible = fmi3False;
218  fmi3InstanceEnvironment instanceEnvironment = nullptr;
219  fmi3Instance c = instantiate_model_exchange_(instanceName, instantiationToken, resourcePath,
220  visible, logging_on_, instanceEnvironment, log_message_callback);
221  if (c == nullptr) casadi_error("fmi3Instantiate failed");
222  return c;
223 }
224 
225 void Fmu3::free_instance(void* instance) const {
226  if (free_instance_) {
227  auto *c = static_cast<fmi3Instance>(instance);
228  free_instance_(c);
229  } else {
230  casadi_warning("No free_instance function pointer available");
231  }
232 }
233 
234 int Fmu3::reset(void* instance) {
235  auto *c = static_cast<fmi3Instance>(instance);
236  fmi3Status status = reset_(c);
237  if (status != fmi3OK) {
238  casadi_warning("fmi3Reset failed");
239  return 1;
240  }
241  return 0;
242 }
243 
244 int Fmu3::enter_initialization_mode(void* instance) const {
245  auto *c = static_cast<fmi3Instance>(instance);
246  fmi3Status status = enter_initialization_mode_(c, fmutol_ > 0, fmutol_, 0., fmi3True, 1.);
247  if (status != fmi3OK) {
248  casadi_warning("fmi3EnterInitializationMode failed: " + str(status));
249  return 1;
250  }
251  return 0;
252 }
253 
254 int Fmu3::exit_initialization_mode(void* instance) const {
255  auto *c = static_cast<fmi3Instance>(instance);
256  fmi3Status status = exit_initialization_mode_(c);
257  if (status != fmi3OK) {
258  casadi_warning("fmi3ExitInitializationMode failed");
259  return 1;
260  }
261  return 0;
262 }
263 
264 int Fmu3::enter_continuous_time_mode(void* instance) const {
265  auto *c = static_cast<fmi3Instance>(instance);
266  fmi3Status status = enter_continuous_time_mode_(c);
267  if (status != fmi3OK) {
268  casadi_warning("fmi3EnterContinuousTimeMode failed");
269  return 1;
270  }
271  return 0;
272 }
273 
274 int Fmu3::update_discrete_states(void* instance, EventMemory* eventmem) const {
275  auto *c = static_cast<fmi3Instance>(instance);
276  // Return arguments in FMI types
277  fmi3Boolean discreteStatesNeedUpdate, terminateSimulation, nominalsOfContinuousStatesChanged,
278  valuesOfContinuousStatesChanged, nextEventTimeDefined;
279  fmi3Float64 nextEventTime;
280  // Call FMU
281  fmi3Status status = update_discrete_states_(c, &discreteStatesNeedUpdate, &terminateSimulation,
282  &nominalsOfContinuousStatesChanged, &valuesOfContinuousStatesChanged, &nextEventTimeDefined,
283  &nextEventTime);
284  // Pass to event iteration memory
285  eventmem->discrete_states_need_update = discreteStatesNeedUpdate;
286  eventmem->terminate_simulation = terminateSimulation;
287  eventmem->nominals_of_continuous_states_changed = nominalsOfContinuousStatesChanged;
288  eventmem->values_of_continuous_states_changed = valuesOfContinuousStatesChanged;
289  eventmem->next_event_time_defined = nextEventTimeDefined;
290  eventmem->next_event_time = nextEventTime;
291  return status != fmi3OK;
292 }
293 
294 int Fmu3::get_derivatives(void* instance, double* derivatives, size_t nx) const {
295  return 0;
296 }
297 
298 int Fmu3::set_time(void* instance, double t) const {
299  fmi3Status status = set_time_(instance, t);
300  return status != fmi3OK;
301 }
302 
303 int Fmu3::set_real(void* instance, const unsigned int* vr, size_t n_vr,
304  const double* values, size_t n_values) const {
305  // Set time variable, if any
306  if (has_independent_ && n_vr > 0 && *vr == vr_in_[0]) {
307  // Update FMU time
308  fmi3Status status = set_time_(instance, *values);
309  if (status != fmi3OK) return 1;
310  // Skip when setting remaining variables
311  vr++;
312  n_vr--;
313  values++;
314  n_values--;
315  }
316  // Set remaining variables
317  fmi3Status status = set_float64_(instance, vr, n_vr, values, n_values);
318  return status != fmi3OK;
319 }
320 
321 int Fmu3::get_real(void* instance, const unsigned int* vr, size_t n_vr,
322  double* values, size_t n_values, FmuMemory* m) const {
323  (void)m; // unused
324  fmi3Status status = get_float64_(instance, vr, n_vr, values, n_values);
325  return status != fmi3OK;
326 }
327 
328 int Fmu3::get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
329  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
330  double* sensitivity, size_t n_sensitivity) const {
331  fmi3Status status = get_directional_derivative_(instance, vr_out, n_out, vr_in, n_in,
332  seed, n_seed, sensitivity, n_sensitivity);
333  return status != fmi3OK;
334 }
335 
336 int Fmu3::get_adjoint_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
337  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
338  double* sensitivity, size_t n_sensitivity) const {
339  fmi3Status status = get_adjoint_derivative_(instance, vr_out, n_out, vr_in, n_in,
340  seed, n_seed, sensitivity, n_sensitivity);
341  return status != fmi3OK;
342 }
343 
344 int Fmu3::set_values(void* instance) const {
345  auto *c = static_cast<fmi3Instance>(instance);
346  // Pass real values before initialization
347  if (!vr_real_.empty()) {
348  fmi3Status status = set_float64_(c, get_ptr(vr_real_), vr_real_.size(),
349  get_ptr(init_real_), init_real_.size());
350  if (status != fmi3OK) {
351  casadi_warning("fmi3SetFloat64 failed");
352  return 1;
353  }
354  }
355 
356  // Pass integer values before initialization (also enums)
357  if (!vr_integer_.empty()) {
358  fmi3Status status = set_int32_(c, get_ptr(vr_integer_), vr_integer_.size(),
360  if (status != fmi3OK) {
361  casadi_warning("fmi3SetInt32 failed");
362  return 1;
363  }
364  }
365  // Pass boolean values before initialization
366  if (!vr_boolean_.empty()) {
367  casadi_error("Broken");
368  // nullptr -> get_ptr(init_boolean_)
369  fmi3Status status = set_boolean_(c, get_ptr(vr_boolean_), vr_boolean_.size(),
370  nullptr, init_boolean_.size());
371  if (status != fmi3OK) {
372  casadi_warning("fmi3SetBoolean failed");
373  return 1;
374  }
375  }
376  // Pass string values before initialization
377  for (size_t k = 0; k < vr_string_.size(); ++k) {
378  fmi3ValueReference vr = vr_string_[k];
379  fmi3String value = init_string_[k].c_str();
380  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
381  if (status != fmi3OK) {
382  casadi_error("fmi3SetString failed for value reference " + str(vr));
383  }
384  }
385  // Successful return
386  return 0;
387 }
388 
389 int Fmu3::get_aux(void* instance) {
390  return get_aux_impl(instance, aux_value_);
391 }
392 
393 int Fmu3::get_aux_impl(void* instance, Value& aux_value) const {
394  auto *c = static_cast<fmi3Instance>(instance);
395  // Get real auxilliary variables
396  if (!vr_aux_real_.empty()) {
397  fmi3Status status = get_float64_(c, get_ptr(vr_aux_real_), vr_aux_real_.size(),
398  get_ptr(aux_value.v_real), off_aux_real_.back());
399  if (status != fmi3OK) {
400  casadi_warning("fmi3GetFloat64 failed");
401  return 1;
402  }
403  }
404 
405  // Get integer/enum auxilliary variables
406  if (!vr_aux_integer_.empty()) {
407  fmi3Status status = get_int32_(c, get_ptr(vr_aux_integer_), vr_aux_integer_.size(),
408  get_ptr(aux_value.v_integer), off_aux_integer_.back());
409  if (status != fmi3OK) {
410  casadi_warning("fmi3GetInt32 failed");
411  return 1;
412  }
413  }
414 
415  // Get boolean auxilliary variables
416  casadi_assert(vr_aux_boolean_.size() == aux_value.v_boolean.size(),
417  "Vector valued variables not supported");
418  for (size_t k = 0; k < vr_aux_boolean_.size(); ++k) {
419  fmi3Boolean value;
420  fmi3Status status = get_boolean_(c, &vr_aux_boolean_[k], 1, &value, 1);
421  if (status != fmi3OK) {
422  casadi_warning("fmi3GetBoolean failed for value reference " + str(vr_aux_boolean_[k]));
423  return 1;
424  }
425  aux_value.v_boolean[k] = value;
426  }
427 
428  // Get string auxilliary variables
429  for (size_t k = 0; k < vr_aux_string_.size(); ++k) {
430  fmi3ValueReference vr = vr_aux_string_[k];
431  fmi3String value = aux_value.v_string.at(k).c_str();
432  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
433  if (status != fmi3OK) {
434  casadi_error("fmi3GetString failed for value reference " + str(vr));
435  }
436  }
437  // Successful return
438  return 0;
439 }
440 
442  const std::vector<std::string>& name_in, const InputStruct* in) const {
443  Value& v = static_cast<Fmu3Memory*>(m)->aux_value;
444  get_aux_impl(m->instance, v);
445  // Collect auxilliary variables
446  Dict aux;
447  // Real
448  for (size_t k = 0; k < vn_aux_real_.size(); ++k) {
449  auto& n = vn_aux_real_[k];
450  casadi_int begin = off_aux_real_[k], end = off_aux_real_[k + 1];
451  if (end == begin + 1) {
452  aux[n] = static_cast<double>(v.v_real[begin]);
453  } else {
454  aux[n] = std::vector<double>(v.v_real.begin() + begin, v.v_real.begin() + end);
455  }
456  }
457  // Integer
458  for (size_t k = 0; k < vn_aux_integer_.size(); ++k) {
459  auto& n = vn_aux_integer_[k];
460  casadi_int begin = off_aux_integer_[k], end = off_aux_integer_[k + 1];
461  if (end == begin + 1) {
462  aux[n] = static_cast<casadi_int>(v.v_integer[begin]);
463  } else {
464  aux[n] = std::vector<casadi_int>(v.v_integer.begin() + begin, v.v_integer.begin() + end);
465  }
466  }
467  // Boolean
468  for (size_t k = 0; k < vn_aux_boolean_.size(); ++k) {
469  aux[vn_aux_boolean_[k]] = static_cast<bool>(v.v_boolean[k]);
470  }
471  // String
472  for (size_t k = 0; k < vn_aux_string_.size(); ++k) {
473  aux[vn_aux_string_[k]] = v.v_string[k];
474  }
475  // Copy to stats
476  (*stats)["aux"] = aux;
477  // Loop over input variables
478  for (size_t k = 0; k < name_in.size(); ++k) {
479  // Only consider regular inputs
480  if (in[k].type == InputType::REG) {
481  // Get the indices
482  const std::vector<size_t>& iind = ired_.at(in[k].ind);
483  // Collect values
484  std::vector<double> v(iind.size());
485  for (size_t i = 0; i < v.size(); ++i) v[i] = value_in_.at(iind[i]);
486  // Save to stats
487  (*stats)[name_in[k]] = v;
488  }
489  }
490 }
491 
492 Fmu3::Fmu3(const std::string& name,
493  const std::vector<std::string>& scheme_in,
494  const std::vector<std::string>& scheme_out,
495  const std::map<std::string, std::vector<size_t>>& scheme,
496  const std::vector<std::string>& aux)
497  : FmuInternal(name, scheme_in, scheme_out, scheme, aux) {
498  instantiate_model_exchange_ = nullptr;
499  free_instance_ = nullptr;
500  reset_ = nullptr;
501  enter_initialization_mode_ = nullptr;
502  exit_initialization_mode_ = nullptr;
503  enter_continuous_time_mode_ = nullptr;
504  set_time_ = nullptr;
505  set_float64_ = nullptr;
506  set_boolean_ = nullptr;
507  get_float64_ = nullptr;
508  get_directional_derivative_ = nullptr;
509  get_adjoint_derivative_ = nullptr;
510  update_discrete_states_ = nullptr;
511 }
512 
513 
515  Fmu3* ret = new Fmu3(s);
516  ret->finalize();
517  return ret;
518 }
519 
521  instantiate_model_exchange_ = nullptr;
522  free_instance_ = nullptr;
523  reset_ = nullptr;
524  enter_initialization_mode_ = nullptr;
525  exit_initialization_mode_ = nullptr;
526  enter_continuous_time_mode_ = nullptr;
527  set_time_ = nullptr;
528  set_float64_ = nullptr;
529  set_boolean_ = nullptr;
530  get_float64_ = nullptr;
531  get_directional_derivative_ = nullptr;
532  get_adjoint_derivative_ = nullptr;
533  update_discrete_states_ = nullptr;
534 
535  int version = s.version("Fmu3", 1, 2);
536  s.unpack("Fmu3::vr_real", vr_real_);
537  s.unpack("Fmu3::vr_integer", vr_integer_);
538  s.unpack("Fmu3::vr_boolean", vr_boolean_);
539  s.unpack("Fmu3::vr_string", vr_string_);
540  s.unpack("Fmu3::init_real", init_real_);
541  s.unpack("Fmu3::init_integer", init_integer_);
542  s.unpack("Fmu3::init_boolean", init_boolean_);
543  s.unpack("Fmu3::init_string", init_string_);
544 
545  s.unpack("Fmu3::vn_aux_real", vn_aux_real_);
546  s.unpack("Fmu3::vn_aux_integer", vn_aux_integer_);
547  s.unpack("Fmu3::vn_aux_boolean", vn_aux_boolean_);
548  s.unpack("Fmu3::vn_aux_string", vn_aux_string_);
549  s.unpack("Fmu3::vr_aux_real", vr_aux_real_);
550  s.unpack("Fmu3::vr_aux_integer", vr_aux_integer_);
551  s.unpack("Fmu3::vr_aux_boolean", vr_aux_boolean_);
552  s.unpack("Fmu3::vr_aux_string", vr_aux_string_);
553  if (version >= 2) {
554  s.unpack("Fmu3::off_aux_real", off_aux_real_);
555  s.unpack("Fmu3::off_aux_integer", off_aux_integer_);
556  s.unpack("Fmu3::off_aux_boolean", off_aux_boolean_);
557  s.unpack("Fmu3::off_aux_string", off_aux_string_);
558  } else {
559  // Version 1 only had scalar auxilliary variables
560  off_aux_real_ = range(vr_aux_real_.size() + 1);
561  off_aux_integer_ = range(vr_aux_integer_.size() + 1);
562  off_aux_boolean_ = range(vr_aux_boolean_.size() + 1);
563  off_aux_string_ = range(vr_aux_string_.size() + 1);
564  }
565 }
566 
567 
570 
571  s.version("Fmu3", 2);
572  s.pack("Fmu3::vr_real", vr_real_);
573  s.pack("Fmu3::vr_integer", vr_integer_);
574  s.pack("Fmu3::vr_boolean", vr_boolean_);
575  s.pack("Fmu3::vr_string", vr_string_);
576  s.pack("Fmu3::init_real", init_real_);
577  s.pack("Fmu3::init_integer", init_integer_);
578  s.pack("Fmu3::init_boolean", init_boolean_);
579  s.pack("Fmu3::init_string", init_string_);
580 
581  s.pack("Fmu3::vn_aux_real", vn_aux_real_);
582  s.pack("Fmu3::vn_aux_integer", vn_aux_integer_);
583  s.pack("Fmu3::vn_aux_boolean", vn_aux_boolean_);
584  s.pack("Fmu3::vn_aux_string", vn_aux_string_);
585  s.pack("Fmu3::vr_aux_real", vr_aux_real_);
586  s.pack("Fmu3::vr_aux_integer", vr_aux_integer_);
587  s.pack("Fmu3::vr_aux_boolean", vr_aux_boolean_);
588  s.pack("Fmu3::vr_aux_string", vr_aux_string_);
589  s.pack("Fmu3::off_aux_real", off_aux_real_);
590  s.pack("Fmu3::off_aux_integer", off_aux_integer_);
591  s.pack("Fmu3::off_aux_boolean", off_aux_boolean_);
592  s.pack("Fmu3::off_aux_string", off_aux_string_);
593 }
594 
595 } // namespace casadi
size_t n_variables() const
Length of variables array.
Variable & variable(size_t ind)
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
void version(const std::string &name, int v)
Interface to a binary FMU, adhering to FMI version 2.0.
Definition: fmu3.hpp:42
int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values, FmuMemory *m=nullptr) const override
Definition: fmu3.cpp:321
void * instantiate() const override
Definition: fmu3.cpp:212
void serialize_body(SerializingStream &s) const override
Definition: fmu3.cpp:568
std::vector< fmi3ValueReference > vr_string_
Definition: fmu3.hpp:82
fmi3InstantiateModelExchangeTYPE * instantiate_model_exchange_
Definition: fmu3.hpp:96
int exit_initialization_mode(void *instance) const override
Definition: fmu3.cpp:254
std::vector< casadi_int > off_aux_real_
Definition: fmu3.hpp:91
void free_instance(void *instance) const override
Definition: fmu3.cpp:225
int get_aux_impl(void *instance, Value &aux_value) const
Definition: fmu3.cpp:393
std::vector< casadi_int > off_aux_string_
Definition: fmu3.hpp:91
int get_adjoint_derivative(void *instance, const unsigned int *vr_out, size_t n_out, const unsigned int *vr_in, size_t n_in, const double *seed, size_t n_seed, double *sensitivity, size_t n_sensitivity) const override
Definition: fmu3.cpp:336
int set_time(void *instance, double t) const override
Definition: fmu3.cpp:298
Value aux_value_
Definition: fmu3.hpp:123
fmi3ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu3.hpp:100
std::vector< fmi3ValueReference > vr_aux_real_
Definition: fmu3.hpp:90
std::vector< std::string > vn_aux_boolean_
Definition: fmu3.hpp:89
std::vector< fmi3ValueReference > vr_boolean_
Definition: fmu3.hpp:82
~Fmu3() override
Destructor.
Definition: fmu3.cpp:58
std::vector< fmi3ValueReference > vr_aux_string_
Definition: fmu3.hpp:90
fmi3GetStringTYPE * get_string_
Definition: fmu3.hpp:109
fmi3SetFloat64TYPE * set_float64_
Definition: fmu3.hpp:104
std::vector< fmi3Boolean > init_boolean_
Definition: fmu3.hpp:85
fmi3SetInt32TYPE * set_int32_
Definition: fmu3.hpp:108
FmuMemory * alloc_mem(const FmuFunction &f) const override
Create memory block.
Definition: fmu3.cpp:50
void load_functions() override
Definition: fmu3.cpp:174
std::vector< casadi_int > off_aux_boolean_
Definition: fmu3.hpp:91
Fmu3(const std::string &name, const std::vector< std::string > &scheme_in, const std::vector< std::string > &scheme_out, const std::map< std::string, std::vector< size_t >> &scheme, const std::vector< std::string > &aux)
Definition: fmu3.cpp:492
std::vector< fmi3Int32 > init_integer_
Definition: fmu3.hpp:84
std::vector< std::string > vn_aux_real_
Definition: fmu3.hpp:89
static Fmu3 * deserialize(DeserializingStream &s)
Definition: fmu3.cpp:514
fmi3EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu3.hpp:101
std::vector< std::string > init_string_
Definition: fmu3.hpp:86
static void log_message_callback(fmi3InstanceEnvironment instanceEnvironment, fmi3Status status, fmi3String category, fmi3String message)
Definition: fmu3.cpp:206
fmi3GetInt32TYPE * get_int32_
Definition: fmu3.hpp:107
int set_real(void *instance, const unsigned int *vr, size_t n_vr, const double *values, size_t n_values) const override
Definition: fmu3.cpp:303
static std::string dll_infix()
Definition: fmu3.cpp:61
void finalize() override
Definition: fmu3.cpp:163
fmi3SetStringTYPE * set_string_
Definition: fmu3.hpp:110
std::vector< fmi3ValueReference > vr_integer_
Definition: fmu3.hpp:82
fmi3SetTimeTYPE * set_time_
Definition: fmu3.hpp:102
std::vector< std::string > vn_aux_integer_
Definition: fmu3.hpp:89
std::vector< fmi3ValueReference > vr_real_
Definition: fmu3.hpp:82
fmi3GetFloat64TYPE * get_float64_
Definition: fmu3.hpp:103
int reset(void *instance)
Definition: fmu3.cpp:234
fmi3SetBooleanTYPE * set_boolean_
Definition: fmu3.hpp:106
std::vector< fmi3ValueReference > vr_aux_boolean_
Definition: fmu3.hpp:90
std::vector< fmi3ValueReference > vr_aux_integer_
Definition: fmu3.hpp:90
fmi3GetDirectionalDerivativeTYPE * get_directional_derivative_
Definition: fmu3.hpp:111
void free_mem(void *mem) const override
Free memory block.
Definition: fmu3.cpp:54
fmi3GetBooleanTYPE * get_boolean_
Definition: fmu3.hpp:105
int set_values(void *instance) const override
Definition: fmu3.cpp:344
int update_discrete_states(void *instance, EventMemory *eventmem) const override
Definition: fmu3.cpp:274
int get_aux(void *instance) override
Definition: fmu3.cpp:389
std::vector< fmi3Float64 > init_real_
Definition: fmu3.hpp:83
fmi3ResetTYPE * reset_
Definition: fmu3.hpp:98
int enter_continuous_time_mode(void *instance) const override
Definition: fmu3.cpp:264
int init_mem(FmuMemory *m) const override
Initalize memory block.
Definition: fmu3.cpp:39
fmi3GetAdjointDerivativeTYPE * get_adjoint_derivative_
Definition: fmu3.hpp:112
std::vector< std::string > vn_aux_string_
Definition: fmu3.hpp:89
void init(const DaeBuilderInternal *dae) override
Definition: fmu3.cpp:65
fmi3UpdateDiscreteStatesTYPE * update_discrete_states_
Definition: fmu3.hpp:113
int get_directional_derivative(void *instance, const unsigned int *vr_out, size_t n_out, const unsigned int *vr_in, size_t n_in, const double *seed, size_t n_seed, double *sensitivity, size_t n_sensitivity) const override
Definition: fmu3.cpp:328
std::vector< casadi_int > off_aux_integer_
Definition: fmu3.hpp:91
int get_derivatives(void *instance, double *derivatives, size_t nx) const override
Definition: fmu3.cpp:294
fmi3FreeInstanceTYPE * free_instance_
Definition: fmu3.hpp:97
fmi3EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu3.hpp:99
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
Definition: fmu3.cpp:441
int enter_initialization_mode(void *instance) const override
Definition: fmu3.cpp:244
Interface to binary FMU.
Definition: fmu_impl.hpp:61
std::string instantiation_token_
Definition: fmu_impl.hpp:329
bool provides_adjoint_derivatives_
Definition: fmu_impl.hpp:338
virtual void finalize()
Definition: fmu.cpp:593
std::vector< std::vector< size_t > > ired_
Definition: fmu_impl.hpp:369
std::vector< std::string > aux_
Definition: fmu_impl.hpp:317
virtual void serialize_body(SerializingStream &s) const
Definition: fmu.cpp:1559
std::vector< unsigned int > vr_in_
Definition: fmu_impl.hpp:363
size_t n_in() const
Get the number of scheme inputs.
Definition: fmu_impl.hpp:130
static std::string fmi3_dll_infix()
Definition: fmu.cpp:736
std::string resource_loc_
Definition: fmu_impl.hpp:320
std::vector< double > value_in_
Definition: fmu_impl.hpp:366
virtual void init(const DaeBuilderInternal *dae)
Definition: fmu.cpp:453
size_t n_out() const
Get the number of scheme outputs.
Definition: fmu_impl.hpp:135
virtual int init_mem(FmuMemory *m) const
Initalize memory block.
Definition: fmu.cpp:1298
std::string instance_name_
Definition: fmu_impl.hpp:326
bool provides_directional_derivatives_
Definition: fmu_impl.hpp:338
Helper class for Serialization.
void version(const std::string &name, int v)
void pack(const Sparsity &e)
Serializes an object to the output stream.
The casadi namespace.
Definition: archiver.cpp:28
std::vector< casadi_int > range(casadi_int start, casadi_int stop, casadi_int step, casadi_int len)
Range function.
TypeFmi2 to_fmi2(Type v)
std::string str(const T &v)
String representation, any type.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::string to_string(TypeFmi2 v)
T * get_ptr(std::vector< T > &v)
Get a pointer to the data contained in the vector.
std::ostream & uout()
bool discrete_states_need_update
Definition: fmu_impl.hpp:39
bool next_event_time_defined
Definition: fmu_impl.hpp:43
double next_event_time
Definition: fmu_impl.hpp:44
bool nominals_of_continuous_states_changed
Definition: fmu_impl.hpp:41
bool values_of_continuous_states_changed
Definition: fmu_impl.hpp:42
std::vector< fmi3Float64 > v_real
Definition: fmu3.hpp:117
std::vector< std::string > v_string
Definition: fmu3.hpp:120
std::vector< fmi3Boolean > v_boolean
Definition: fmu3.hpp:119
std::vector< fmi3Int32 > v_integer
Definition: fmu3.hpp:118
Holds expressions and meta-data corresponding to a physical quantity evolving in time.
std::vector< double > value
Numerical value (also for booleans, integers, enums)
std::string stringvalue
String value (if string-valued)
casadi_int numel
Number of elements - product of all dimensions.
std::string name
Name of the variable.