fmu2.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 "fmu2.hpp"
27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
29 
30 namespace casadi {
31 
32 // Memory object
33 struct Fmu2Memory : public FmuMemory {
34  Fmu2::Value aux_value;
35  // Constructor
36  explicit Fmu2Memory(const FmuFunction& self) : FmuMemory(self) {}
37 };
38 
39 int Fmu2::init_mem(FmuMemory* mem) const {
40  if (FmuInternal::init_mem(mem)) return 1;
41  auto m = static_cast<Fmu2Memory*>(mem);
43  m->aux_value.v_real.resize(vn_aux_real_.size());
44  m->aux_value.v_integer.resize(vn_aux_integer_.size());
45  m->aux_value.v_boolean.resize(vn_aux_boolean_.size());
46  m->aux_value.v_string.resize(vn_aux_string_.size());
47  return 0;
48 }
49 
51  return new Fmu2Memory(f);
52 }
53 
54 void Fmu2::free_mem(void *mem) const {
55  delete static_cast<Fmu2Memory*>(mem);
56 }
57 
59 }
60 
61 std::string Fmu2::system_infix() const {
62 #if defined(_WIN32)
63  // Windows system
64 #ifdef _WIN64
65  return "win64";
66 #else
67  return "win32";
68 #endif
69 #elif defined(__APPLE__)
70  // OSX
71  return sizeof(void*) == 4 ? "darwin32" : "darwin64";
72 #else
73  // Linux
74  return sizeof(void*) == 4 ? "linux32" : "linux64";
75 #endif
76 }
77 
78 void Fmu2::init(const DaeBuilderInternal* dae) {
79  // Initialize base classes
80  FmuInternal::init(dae);
81 
82  // Collect input and parameter values
83  vr_real_.clear();
84  vr_integer_.clear();
85  vr_boolean_.clear();
86  vr_string_.clear();
87  init_real_.clear();
88  init_integer_.clear();
89  init_boolean_.clear();
90  init_string_.clear();
91  for (size_t i = 0; i < dae->n_variables(); ++i) {
92  const Variable& v = dae->variable(i);
93  casadi_assert(v.numel == 1, "Vector variable support not implemented");
94  // Skip if the wrong type
95  if (v.causality != Causality::PARAMETER && v.causality != Causality::INPUT) continue;
96  // Variable has not been set - keep default value
97  if (!v.is_set()) continue;
98  // Value reference
99  fmi2ValueReference vr = v.value_reference;
100  // Get value
101  switch (to_fmi2(v.type)) {
102  case TypeFmi2::REAL:
103  init_real_.push_back(static_cast<fmi2Real>(v.value.front()));
104  vr_real_.push_back(vr);
105  break;
106  case TypeFmi2::INTEGER:
107  case TypeFmi2::ENUM:
108  init_integer_.push_back(static_cast<fmi2Integer>(v.value.front()));
109  vr_integer_.push_back(vr);
110  break;
111  case TypeFmi2::BOOLEAN:
112  init_boolean_.push_back(static_cast<fmi2Boolean>(v.value.front()));
113  vr_boolean_.push_back(vr);
114  break;
115  case TypeFmi2::STRING:
116  init_string_.push_back(v.stringvalue);
117  vr_string_.push_back(vr);
118  break;
119  default:
120  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
121  }
122  }
123 
124  // Collect auxilliary variables
125  vn_aux_real_.clear();
126  vn_aux_integer_.clear();
127  vn_aux_boolean_.clear();
128  vn_aux_string_.clear();
129  vr_aux_real_.clear();
130  vr_aux_integer_.clear();
131  vr_aux_boolean_.clear();
132  vr_aux_string_.clear();
133  for (auto&& s : aux_) {
134  const Variable& v = dae->variable(s);
135  // Convert to expected type
136  fmi2ValueReference vr = v.value_reference;
137  // Sort by type
138  switch (to_fmi2(v.type)) {
139  case TypeFmi2::REAL:
140  // Real
141  vn_aux_real_.push_back(v.name);
142  vr_aux_real_.push_back(vr);
143  break;
144  case TypeFmi2::INTEGER:
145  case TypeFmi2::ENUM:
146  // Integer or enum
147  vn_aux_integer_.push_back(v.name);
148  vr_aux_integer_.push_back(vr);
149  break;
150  case TypeFmi2::BOOLEAN:
151  // Boolean
152  vn_aux_boolean_.push_back(v.name);
153  vr_aux_boolean_.push_back(vr);
154  break;
155  case TypeFmi2::STRING:
156  // String
157  vn_aux_string_.push_back(v.name);
158  vr_aux_string_.push_back(vr);
159  break;
160  default:
161  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
162  }
163  }
164 }
165 
168  aux_value_.v_real.resize(vn_aux_real_.size());
169  aux_value_.v_integer.resize(vn_aux_integer_.size());
170  aux_value_.v_boolean.resize(vn_aux_boolean_.size());
171  aux_value_.v_string.resize(vn_aux_string_.size());
172 
173  // Recursive call
175 }
176 
178  instantiate_ = load_function<fmi2InstantiateTYPE>("fmi2Instantiate");
179  free_instance_ = load_function<fmi2FreeInstanceTYPE>("fmi2FreeInstance");
180  reset_ = load_function<fmi2ResetTYPE>("fmi2Reset");
181  setup_experiment_ = load_function<fmi2SetupExperimentTYPE>("fmi2SetupExperiment");
182  enter_initialization_mode_ = load_function<fmi2EnterInitializationModeTYPE>(
183  "fmi2EnterInitializationMode");
184  exit_initialization_mode_ = load_function<fmi2ExitInitializationModeTYPE>(
185  "fmi2ExitInitializationMode");
186  enter_continuous_time_mode_ = load_function<fmi2EnterContinuousTimeModeTYPE>(
187  "fmi2EnterContinuousTimeMode");
188  get_derivatives_ = load_function<fmi2GetDerivativesTYPE>("fmi2GetDerivatives");
189  set_time_ = load_function<fmi2SetTimeTYPE>("fmi2SetTime");
190  get_real_ = load_function<fmi2GetRealTYPE>("fmi2GetReal");
191  set_real_ = load_function<fmi2SetRealTYPE>("fmi2SetReal");
192  get_integer_ = load_function<fmi2GetIntegerTYPE>("fmi2GetInteger");
193  set_integer_ = load_function<fmi2SetIntegerTYPE>("fmi2SetInteger");
194  get_boolean_ = load_function<fmi2GetBooleanTYPE>("fmi2GetBoolean");
195  set_boolean_ = load_function<fmi2SetBooleanTYPE>("fmi2SetBoolean");
196  get_string_ = load_function<fmi2GetStringTYPE>("fmi2GetString");
197  set_string_ = load_function<fmi2SetStringTYPE>("fmi2SetString");
200  load_function<fmi2GetDirectionalDerivativeTYPE>("fmi2GetDirectionalDerivative");
201  }
202  new_discrete_states_ = load_function<fmi2NewDiscreteStatesTYPE>("fmi2NewDiscreteStates");
203 
204  // Callback functions
205  functions_.logger = logger;
206  functions_.allocateMemory = calloc;
207  functions_.freeMemory = free;
208  functions_.stepFinished = 0;
209  functions_.componentEnvironment = 0;
210 }
211 
212 void Fmu2::logger(fmi2ComponentEnvironment componentEnvironment,
213  fmi2String instanceName,
214  fmi2Status status,
215  fmi2String category,
216  fmi2String message, ...) {
217  // Variable number of arguments
218  va_list args;
219  va_start(args, message);
220  // Static & dynamic buffers
221  char buf[256];
222  size_t buf_sz = sizeof(buf);
223  char* buf_dyn = nullptr;
224  // Try to print with a small buffer
225  int n = vsnprintf(buf, buf_sz, message, args);
226  // Need a larger buffer?
227  if (n > buf_sz) {
228  buf_sz = n + 1;
229  buf_dyn = new char[buf_sz];
230  n = vsnprintf(buf_dyn, buf_sz, message, args);
231  }
232  // Print buffer content
233  if (n >= 0) {
234  uout() << "[" << instanceName << ":" << category << "] "
235  << (buf_dyn ? buf_dyn : buf) << std::endl;
236  }
237  // Cleanup
238  delete[] buf_dyn;
239  va_end(args);
240  // Throw error if failure
241  casadi_assert(n>=0, "Print failure while processing '" + std::string(message) + "'");
242 }
243 
244 void* Fmu2::instantiate() const {
245  // Instantiate FMU
246  fmi2String instanceName = instance_name_.c_str();
247  fmi2Type fmuType = fmi2ModelExchange;
248  fmi2String fmuGUID = instantiation_token_.c_str();
249  fmi2String fmuResourceLocation = resource_loc_.c_str();
250  fmi2Boolean visible = fmi2False;
251  fmi2Component c = instantiate_(instanceName, fmuType, fmuGUID, fmuResourceLocation,
252  &functions_, visible, logging_on_);
253  if (c == 0) casadi_error("fmi2Instantiate failed");
254 
255  // Call fmi2SetupExperiment
256  fmi2Status status = setup_experiment_(c, fmutol_ > 0, fmutol_, 0., fmi2True, 1.);
257  casadi_assert(status == fmi2OK, "fmi2SetupExperiment failed");
258 
259  return c;
260 }
261 
262 void Fmu2::free_instance(void* instance) const {
263  if (free_instance_) {
264  auto c = static_cast<fmi2Component>(instance);
265  free_instance_(c);
266  } else {
267  casadi_warning("No free_instance function pointer available");
268  }
269 }
270 
271 int Fmu2::reset(void* instance) {
272  auto c = static_cast<fmi2Component>(instance);
273  fmi2Status status = reset_(c);
274  if (status != fmi2OK) {
275  casadi_warning("fmi2Reset failed");
276  return 1;
277  }
278  return 0;
279 }
280 
281 int Fmu2::enter_initialization_mode(void* instance) const {
282  auto c = static_cast<fmi2Component>(instance);
283  fmi2Status status = enter_initialization_mode_(c);
284  if (status != fmi2OK) {
285  casadi_warning("fmi2EnterInitializationMode failed: " + str(status));
286  return 1;
287  }
288  return 0;
289 }
290 
291 int Fmu2::exit_initialization_mode(void* instance) const {
292  auto c = static_cast<fmi2Component>(instance);
293  fmi2Status status = exit_initialization_mode_(c);
294  if (status != fmi2OK) {
295  casadi_warning("fmi2ExitInitializationMode failed");
296  return 1;
297  }
298  return 0;
299 }
300 
301 int Fmu2::enter_continuous_time_mode(void* instance) const {
302  auto c = static_cast<fmi2Component>(instance);
303  fmi2Status status = enter_continuous_time_mode_(c);
304  if (status != fmi2OK) {
305  casadi_warning("fmi2EnterContinuousTimeMode failed");
306  return 1;
307  }
308  return 0;
309 }
310 
311 int Fmu2::get_derivatives(void* instance, double* derivatives, size_t nx) const {
312  auto c = static_cast<fmi2Component>(instance);
313  fmi2Status status = get_derivatives_(c, derivatives, nx);
314  if (status != fmi2OK) {
315  casadi_warning("fmi2GetDerivatives failed");
316  return 1;
317  }
318  return 0;
319 }
320 
321 int Fmu2::update_discrete_states(void* instance, EventMemory* eventmem) const {
322  auto c = static_cast<fmi2Component>(instance);
323  // Return arguments in FMI types
324  fmi2EventInfo eventInfo;
325  eventInfo.newDiscreteStatesNeeded = fmi2False;
326  eventInfo.terminateSimulation = fmi2False;
327  eventInfo.nominalsOfContinuousStatesChanged = fmi2False;
328  eventInfo.valuesOfContinuousStatesChanged = fmi2False;
329  eventInfo.nextEventTimeDefined = fmi2False;
330  eventInfo.nextEventTime = 0.0;
331  // Call FMU
332  fmi2Status status = new_discrete_states_(c, &eventInfo);
333  // Pass to event iteration memory
334  eventmem->discrete_states_need_update = eventInfo.newDiscreteStatesNeeded;
335  eventmem->terminate_simulation = eventInfo.terminateSimulation;
336  eventmem->nominals_of_continuous_states_changed = eventInfo.nominalsOfContinuousStatesChanged;
337  eventmem->values_of_continuous_states_changed = eventInfo.valuesOfContinuousStatesChanged;
338  eventmem->next_event_time_defined = eventInfo.nextEventTimeDefined;
339  eventmem->next_event_time = eventInfo.nextEventTime;
340  return status != fmi2OK;
341 }
342 
343 int Fmu2::set_real(void* instance, const unsigned int* vr, size_t n_vr,
344  const double* values, size_t n_values) const {
345  casadi_assert(n_vr == n_values, "Vector-valued variables not supported in FMI 2");
346 
347  // Set time variable, if any
348  if (has_independent_ && n_vr > 0 && *vr == vr_in_[0]) {
349  // Update FMU time
350  fmi2Status status = set_time_(instance, *values);
351  if (status != fmi2OK) return 1;
352  // Skip when setting remaining variables
353  vr++;
354  n_vr--;
355  values++;
356  n_values--;
357  }
358 
359  fmi2Status status = set_real_(instance, vr, n_vr, values);
360  return status != fmi2OK;
361 }
362 
363 int Fmu2::get_real(void* instance, const unsigned int* vr, size_t n_vr,
364  double* values, size_t n_values) const {
365  casadi_assert(n_vr == n_values, "Vector-valued variables not supported in FMI 2");
366  if (do_evaluation_dance_) {
367  // Dummy call to trigger rtOneStep
368  fmi2Status status = get_real_(instance, nullptr, 0, nullptr);
369  if (status != fmi2OK) return 1;
370  // Scratch space to write derivative to (not used)
371  static thread_local std::vector<double> derivate_dump;
372  if (derivate_dump.size() < nx_) derivate_dump.resize(nx_);
373  // Dummy call to trigger computation of derivatives, possibly read later via get_real
374  status = get_derivatives_(instance, get_ptr(derivate_dump), nx_);
375  if (status != fmi2OK) return 1;
376  }
377  fmi2Status status = get_real_(instance, vr, n_vr, values);
378  return status != fmi2OK;
379 }
380 
381 int Fmu2::get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
382  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
383  double* sensitivity, size_t n_sensitivity) const {
384  casadi_assert(n_in == n_seed, "Vector-valued variables not supported in FMI 2");
385  casadi_assert(n_out == n_sensitivity, "Vector-valued variables not supported in FMI 2");
386  fmi2Status status = get_directional_derivative_(instance, vr_out, n_out, vr_in, n_in,
387  seed, sensitivity);
388  return status != fmi2OK;
389 }
390 
391 int Fmu2::set_values(void* instance) const {
392  auto c = static_cast<fmi2Component>(instance);
393  // Pass real values before initialization
394  if (!vr_real_.empty()) {
395  fmi2Status status = set_real_(c, get_ptr(vr_real_), vr_real_.size(), get_ptr(init_real_));
396  if (status != fmi2OK) {
397  casadi_warning("fmi2SetReal failed");
398  return 1;
399  }
400  }
401  // Pass integer values before initialization (also enums)
402  if (!vr_integer_.empty()) {
403  fmi2Status status = set_integer_(c, get_ptr(vr_integer_), vr_integer_.size(),
405  if (status != fmi2OK) {
406  casadi_warning("fmi2SetInteger failed");
407  return 1;
408  }
409  }
410  // Pass boolean values before initialization
411  if (!vr_boolean_.empty()) {
412  fmi2Status status = set_boolean_(c, get_ptr(vr_boolean_), vr_boolean_.size(),
414  if (status != fmi2OK) {
415  casadi_warning("fmi2SetBoolean failed");
416  return 1;
417  }
418  }
419  // Pass string values before initialization
420  for (size_t k = 0; k < vr_string_.size(); ++k) {
421  fmi2ValueReference vr = vr_string_[k];
422  fmi2String value = init_string_[k].c_str();
423  fmi2Status status = set_string_(c, &vr, 1, &value);
424  if (status != fmi2OK) {
425  casadi_error("fmi2SetString failed for value reference " + str(vr));
426  }
427  }
428  // Successful return
429  return 0;
430 }
431 
432 int Fmu2::get_aux_impl(void* instance, Value& aux_value) const {
433  auto c = static_cast<fmi2Component>(instance);
434  // Get real auxilliary variables
435  if (!vr_aux_real_.empty()) {
436  fmi2Status status = get_real_(c, get_ptr(vr_aux_real_), vr_aux_real_.size(),
437  get_ptr(aux_value.v_real));
438  if (status != fmi2OK) {
439  casadi_warning("fmi2GetReal failed");
440  return 1;
441  }
442  }
443  // Get integer/enum auxilliary variables
444  if (!vr_aux_integer_.empty()) {
445  fmi2Status status = get_integer_(c, get_ptr(vr_aux_integer_), vr_aux_integer_.size(),
446  get_ptr(aux_value.v_integer));
447  if (status != fmi2OK) {
448  casadi_warning("fmi2GetInteger failed");
449  return 1;
450  }
451  }
452  // Get boolean auxilliary variables
453  if (!vr_aux_boolean_.empty()) {
454  fmi2Status status = get_boolean_(c, get_ptr(vr_aux_boolean_), vr_aux_boolean_.size(),
455  get_ptr(aux_value.v_boolean));
456  if (status != fmi2OK) {
457  casadi_warning("fmi2GetBoolean failed");
458  return 1;
459  }
460  }
461  // Get string auxilliary variables
462  for (size_t k = 0; k < vr_aux_string_.size(); ++k) {
463  fmi2ValueReference vr = vr_aux_string_[k];
464  fmi2String value = aux_value.v_string.at(k).c_str();
465  fmi2Status status = set_string_(c, &vr, 1, &value);
466  if (status != fmi2OK) {
467  casadi_error("fmi2GetString failed for value reference " + str(vr));
468  }
469  }
470  // Successful return
471  return 0;
472 }
473 
474 int Fmu2::get_aux(void* instance) {
475  return get_aux_impl(instance, aux_value_);
476 }
477 
479  const std::vector<std::string>& name_in, const InputStruct* in) const {
480  Value& v = static_cast<Fmu2Memory*>(m)->aux_value;
481  get_aux_impl(m->instance, v);
482  // Collect auxilliary variables
483  Dict aux;
484  // Real
485  for (size_t k = 0; k < vn_aux_real_.size(); ++k) {
486  aux[vn_aux_real_[k]] = static_cast<double>(v.v_real[k]);
487  }
488  // Integer
489  for (size_t k = 0; k < vn_aux_integer_.size(); ++k) {
490  aux[vn_aux_integer_[k]] = static_cast<casadi_int>(v.v_integer[k]);
491  }
492  // Boolean
493  for (size_t k = 0; k < vn_aux_boolean_.size(); ++k) {
494  aux[vn_aux_boolean_[k]] = static_cast<bool>(v.v_boolean[k]);
495  }
496  // String
497  for (size_t k = 0; k < vn_aux_string_.size(); ++k) {
498  aux[vn_aux_string_[k]] = v.v_string[k];
499  }
500  // Copy to stats
501  (*stats)["aux"] = aux;
502  // Loop over input variables
503  for (size_t k = 0; k < name_in.size(); ++k) {
504  // Only consider regular inputs
505  if (in[k].type == InputType::REG) {
506  // Get the indices
507  const std::vector<size_t>& iind = ired_.at(in[k].ind);
508  // Collect values
509  std::vector<double> v(iind.size());
510  for (size_t i = 0; i < v.size(); ++i) v[i] = value_in_.at(iind[i]);
511  // Save to stats
512  (*stats)[name_in[k]] = v;
513  }
514  }
515 }
516 
517 Fmu2::Fmu2(const std::string& name,
518  const std::vector<std::string>& scheme_in,
519  const std::vector<std::string>& scheme_out,
520  const std::map<std::string, std::vector<size_t>>& scheme,
521  const std::vector<std::string>& aux)
522  : FmuInternal(name, scheme_in, scheme_out, scheme, aux) {
523  instantiate_ = 0;
524  free_instance_ = 0;
525  reset_ = 0;
526  setup_experiment_ = 0;
530  set_time_ = 0;
531  set_real_ = 0;
532  set_boolean_ = 0;
533  get_real_ = 0;
536 }
537 
539  Fmu2* ret = new Fmu2(s);
540  ret->finalize();
541  return ret;
542 }
543 
545  instantiate_ = 0;
546  free_instance_ = 0;
547  reset_ = 0;
548  setup_experiment_ = 0;
552  set_real_ = 0;
553  set_boolean_ = 0;
554  get_real_ = 0;
557 
558  s.version("Fmu2", 2);
559  s.unpack("Fmu2::vr_real", vr_real_);
560  s.unpack("Fmu2::vr_integer", vr_integer_);
561  s.unpack("Fmu2::vr_boolean", vr_boolean_);
562  s.unpack("Fmu2::vr_string", vr_string_);
563  s.unpack("Fmu2::init_real", init_real_);
564  s.unpack("Fmu2::init_integer", init_integer_);
565  s.unpack("Fmu2::init_boolean", init_boolean_);
566  s.unpack("Fmu2::init_string", init_string_);
567 
568  s.unpack("Fmu2::vn_aux_real", vn_aux_real_);
569  s.unpack("Fmu2::vn_aux_integer", vn_aux_integer_);
570  s.unpack("Fmu2::vn_aux_boolean", vn_aux_boolean_);
571  s.unpack("Fmu2::vn_aux_string", vn_aux_string_);
572  s.unpack("Fmu2::vr_aux_real", vr_aux_real_);
573  s.unpack("Fmu2::vr_aux_integer", vr_aux_integer_);
574  s.unpack("Fmu2::vr_aux_boolean", vr_aux_boolean_);
575  s.unpack("Fmu2::vr_aux_string", vr_aux_string_);
576 }
577 
578 
581 
582  s.version("Fmu2", 2);
583  s.pack("Fmu2::vr_real", vr_real_);
584  s.pack("Fmu2::vr_integer", vr_integer_);
585  s.pack("Fmu2::vr_boolean", vr_boolean_);
586  s.pack("Fmu2::vr_string", vr_string_);
587  s.pack("Fmu2::init_real", init_real_);
588  s.pack("Fmu2::init_integer", init_integer_);
589  s.pack("Fmu2::init_boolean", init_boolean_);
590  s.pack("Fmu2::init_string", init_string_);
591 
592  s.pack("Fmu2::vn_aux_real", vn_aux_real_);
593  s.pack("Fmu2::vn_aux_integer", vn_aux_integer_);
594  s.pack("Fmu2::vn_aux_boolean", vn_aux_boolean_);
595  s.pack("Fmu2::vn_aux_string", vn_aux_string_);
596  s.pack("Fmu2::vr_aux_real", vr_aux_real_);
597  s.pack("Fmu2::vr_aux_integer", vr_aux_integer_);
598  s.pack("Fmu2::vr_aux_boolean", vr_aux_boolean_);
599  s.pack("Fmu2::vr_aux_string", vr_aux_string_);
600 }
601 
602 } // 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: fmu2.hpp:42
void free_instance(void *instance) const override
Definition: fmu2.cpp:262
std::vector< fmi2ValueReference > vr_string_
Definition: fmu2.hpp:82
void init(const DaeBuilderInternal *dae) override
Definition: fmu2.cpp:78
fmi2ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu2.hpp:100
std::vector< fmi2Real > init_real_
Definition: fmu2.hpp:83
std::vector< fmi2ValueReference > vr_boolean_
Definition: fmu2.hpp:82
int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values) const override
Definition: fmu2.cpp:363
std::vector< fmi2Boolean > init_boolean_
Definition: fmu2.hpp:85
std::vector< std::string > vn_aux_integer_
Definition: fmu2.hpp:89
void load_functions() override
Definition: fmu2.cpp:177
~Fmu2() override
Destructor.
Definition: fmu2.cpp:58
int init_mem(FmuMemory *m) const override
Initalize memory block.
Definition: fmu2.cpp:39
fmi2CallbackFunctions functions_
Definition: fmu2.hpp:116
std::vector< std::string > vn_aux_string_
Definition: fmu2.hpp:89
fmi2SetupExperimentTYPE * setup_experiment_
Definition: fmu2.hpp:98
Fmu2(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: fmu2.cpp:517
std::vector< fmi2Integer > init_integer_
Definition: fmu2.hpp:84
int set_real(void *instance, const unsigned int *vr, size_t n_vr, const double *values, size_t n_values) const override
Definition: fmu2.cpp:343
fmi2EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu2.hpp:99
fmi2InstantiateTYPE * instantiate_
Definition: fmu2.hpp:95
fmi2GetIntegerTYPE * get_integer_
Definition: fmu2.hpp:108
fmi2SetTimeTYPE * set_time_
Definition: fmu2.hpp:103
fmi2GetBooleanTYPE * get_boolean_
Definition: fmu2.hpp:106
void serialize_body(SerializingStream &s) const override
Definition: fmu2.cpp:579
fmi2ResetTYPE * reset_
Definition: fmu2.hpp:97
int get_aux(void *instance) override
Definition: fmu2.cpp:474
std::string system_infix() const override
Definition: fmu2.cpp:61
fmi2SetBooleanTYPE * set_boolean_
Definition: fmu2.hpp:107
std::vector< std::string > vn_aux_real_
Definition: fmu2.hpp:89
int get_aux_impl(void *instance, Value &aux_value) const
Definition: fmu2.cpp:432
static Fmu2 * deserialize(DeserializingStream &s)
Definition: fmu2.cpp:538
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
Definition: fmu2.cpp:478
int exit_initialization_mode(void *instance) const override
Definition: fmu2.cpp:291
fmi2SetStringTYPE * set_string_
Definition: fmu2.hpp:111
fmi2SetIntegerTYPE * set_integer_
Definition: fmu2.hpp:109
std::vector< fmi2ValueReference > vr_integer_
Definition: fmu2.hpp:82
fmi2SetRealTYPE * set_real_
Definition: fmu2.hpp:105
std::vector< std::string > vn_aux_boolean_
Definition: fmu2.hpp:89
fmi2GetDirectionalDerivativeTYPE * get_directional_derivative_
Definition: fmu2.hpp:112
fmi2GetDerivativesTYPE * get_derivatives_
Definition: fmu2.hpp:102
int enter_initialization_mode(void *instance) const override
Definition: fmu2.cpp:281
void * instantiate() const override
Definition: fmu2.cpp:244
std::vector< fmi2ValueReference > vr_aux_string_
Definition: fmu2.hpp:90
std::vector< fmi2ValueReference > vr_aux_integer_
Definition: fmu2.hpp:90
FmuMemory * alloc_mem(const FmuFunction &f) const override
Create memory block.
Definition: fmu2.cpp:50
std::vector< fmi2ValueReference > vr_real_
Definition: fmu2.hpp:82
fmi2FreeInstanceTYPE * free_instance_
Definition: fmu2.hpp:96
fmi2EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu2.hpp:101
Value aux_value_
Definition: fmu2.hpp:126
void finalize() override
Definition: fmu2.cpp:166
fmi2NewDiscreteStatesTYPE * new_discrete_states_
Definition: fmu2.hpp:113
int reset(void *instance)
Definition: fmu2.cpp:271
int update_discrete_states(void *instance, EventMemory *eventmem) const override
Definition: fmu2.cpp:321
int enter_continuous_time_mode(void *instance) const override
Definition: fmu2.cpp:301
fmi2GetRealTYPE * get_real_
Definition: fmu2.hpp:104
std::vector< fmi2ValueReference > vr_aux_real_
Definition: fmu2.hpp:90
static void logger(fmi2ComponentEnvironment componentEnvironment, fmi2String instanceName, fmi2Status status, fmi2String category, fmi2String message,...)
Definition: fmu2.cpp:212
void free_mem(void *mem) const override
Free memory block.
Definition: fmu2.cpp:54
int set_values(void *instance) const override
Definition: fmu2.cpp:391
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: fmu2.cpp:381
fmi2GetStringTYPE * get_string_
Definition: fmu2.hpp:110
std::vector< std::string > init_string_
Definition: fmu2.hpp:86
std::vector< fmi2ValueReference > vr_aux_boolean_
Definition: fmu2.hpp:90
int get_derivatives(void *instance, double *derivatives, size_t nx) const override
Definition: fmu2.cpp:311
Interface to binary FMU.
Definition: fmu_impl.hpp:61
std::string instantiation_token_
Definition: fmu_impl.hpp:306
virtual void finalize()
Definition: fmu.cpp:579
std::vector< std::vector< size_t > > ired_
Definition: fmu_impl.hpp:340
std::vector< std::string > aux_
Definition: fmu_impl.hpp:294
virtual void serialize_body(SerializingStream &s) const
Definition: fmu.cpp:1380
std::vector< unsigned int > vr_in_
Definition: fmu_impl.hpp:334
size_t n_in() const
Get the number of scheme inputs.
Definition: fmu_impl.hpp:127
std::string resource_loc_
Definition: fmu_impl.hpp:297
std::vector< double > value_in_
Definition: fmu_impl.hpp:337
virtual void init(const DaeBuilderInternal *dae)
Definition: fmu.cpp:451
size_t n_out() const
Get the number of scheme outputs.
Definition: fmu_impl.hpp:132
virtual int init_mem(FmuMemory *m) const
Initalize memory block.
Definition: fmu.cpp:1148
std::string instance_name_
Definition: fmu_impl.hpp:303
bool provides_directional_derivatives_
Definition: fmu_impl.hpp:315
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
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< fmi2Boolean > v_boolean
Definition: fmu2.hpp:122
std::vector< fmi2Real > v_real
Definition: fmu2.hpp:120
std::vector< std::string > v_string
Definition: fmu2.hpp:123
std::vector< fmi2Integer > v_integer
Definition: fmu2.hpp:121
const FmuFunction & self
FmuMemory(const FmuFunction &self)
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.