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