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(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 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() {
62  // Architecture
63  std::string arch;
64 #if defined(__arm64__) || defined(__aarch64__)
65  // ARM 64-bit Architecture
66  arch = "aarch64";
67 #elif __arm__
68  if (sizeof(void*) == 4) {
69  // ARM 32-bit Architecture
70  arch = "aarch32";
71  } else {
72  // ARM 64-bit Architecture
73  arch = "aarch64";
74  }
75 #elif defined(__ppc64__) || defined(__powerpc64__)
76  // PowerPC 64-bit Architecture
77  arch = "ppc64";
78 #elif defined(__ppc__) || defined(__powerpc__)
79  // PowerPC 32-bit Architecture
80  arch = "ppc";
81 #else
82  if (sizeof(void*) == 4) {
83  // Intel/AMD x86 32-bit
84  arch = "x86";
85  } else {
86  // Intel/AMD x86 64-bit
87  arch = "x86_64";
88  }
89 #endif
90  // Operating system
91  std::string sys;
92 #if defined(_WIN32)
93  // Microsoft Windows
94  sys = "windows";
95 #elif defined(__APPLE__)
96  // Darwin (macOS, iOS, watchOS, tvOS, audioOS)
97  sys = "darwin";
98 #else
99  // Linux
100  sys = "linux";
101 #endif
102  // Return platform tuple, according to Section 2.5.1.4.1. of the FMI 3 specification
103  return arch + "-" + sys;
104 }
105 
106 void Fmu3::init(const DaeBuilderInternal* dae) {
107  // Initialize base classes
108  FmuInternal::init(dae);
109 
110  // Collect input and parameter values
111  vr_real_.clear();
112  vr_integer_.clear();
113  vr_boolean_.clear();
114  vr_string_.clear();
115  init_real_.clear();
116  init_integer_.clear();
117  init_boolean_.clear();
118  init_string_.clear();
119  for (size_t i = 0; i < dae->n_variables(); ++i) {
120  const Variable& v = dae->variable(i);
121  casadi_assert(v.numel == 1, "Vector variable support not implemented");
122  // Skip if the wrong type
123  if (v.causality != Causality::PARAMETER && v.causality != Causality::INPUT) continue;
124  // Variable has not been set - keep default value
125  if (!v.is_set()) continue;
126  // Value reference
127  fmi3ValueReference vr = v.value_reference;
128  // Get value
129  switch (to_fmi2(v.type)) {
130  case TypeFmi2::REAL:
131  init_real_.push_back(static_cast<fmi3Float64>(v.value.front()));
132  vr_real_.push_back(vr);
133  break;
134  case TypeFmi2::INTEGER:
135  case TypeFmi2::ENUM:
136  init_integer_.push_back(static_cast<fmi3Int32>(v.value.front()));
137  vr_integer_.push_back(vr);
138  break;
139  case TypeFmi2::BOOLEAN:
140  init_boolean_.push_back(static_cast<fmi3Boolean>(v.value.front()));
141  vr_boolean_.push_back(vr);
142  break;
143  case TypeFmi2::STRING:
144  init_string_.push_back(v.stringvalue);
145  vr_string_.push_back(vr);
146  break;
147  default:
148  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
149  }
150  }
151 
152  // Collect auxilliary variables
153  vn_aux_real_.clear();
154  vn_aux_integer_.clear();
155  vn_aux_boolean_.clear();
156  vn_aux_string_.clear();
157  vr_aux_real_.clear();
158  vr_aux_integer_.clear();
159  vr_aux_boolean_.clear();
160  vr_aux_string_.clear();
161  for (auto&& s : aux_) {
162  const Variable& v = dae->variable(s);
163  // Convert to expected type
164  fmi3ValueReference vr = v.value_reference;
165  // Sort by type
166  switch (to_fmi2(v.type)) {
167  case TypeFmi2::REAL:
168  // Real
169  vn_aux_real_.push_back(v.name);
170  vr_aux_real_.push_back(vr);
171  break;
172  case TypeFmi2::INTEGER:
173  case TypeFmi2::ENUM:
174  // Integer or enum
175  vn_aux_integer_.push_back(v.name);
176  vr_aux_integer_.push_back(vr);
177  break;
178  case TypeFmi2::BOOLEAN:
179  // Boolean
180  vn_aux_boolean_.push_back(v.name);
181  vr_aux_boolean_.push_back(vr);
182  break;
183  case TypeFmi2::STRING:
184  // String
185  vn_aux_string_.push_back(v.name);
186  vr_aux_string_.push_back(vr);
187  break;
188  default:
189  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
190  }
191  }
192 }
193 
196  aux_value_.v_real.resize(vn_aux_real_.size());
197  aux_value_.v_integer.resize(vn_aux_integer_.size());
198  aux_value_.v_boolean.resize(vn_aux_boolean_.size());
199  aux_value_.v_string.resize(vn_aux_string_.size());
200 
201  // Recursive call
203 }
204 
206  instantiate_model_exchange_ = load_function<fmi3InstantiateModelExchangeTYPE>(
207  "fmi3InstantiateModelExchange");
208  free_instance_ = load_function<fmi3FreeInstanceTYPE>("fmi3FreeInstance");
209  reset_ = load_function<fmi3ResetTYPE>("fmi3Reset");
210  enter_initialization_mode_ = load_function<fmi3EnterInitializationModeTYPE>(
211  "fmi3EnterInitializationMode");
212  exit_initialization_mode_ = load_function<fmi3ExitInitializationModeTYPE>(
213  "fmi3ExitInitializationMode");
214  enter_continuous_time_mode_ = load_function<fmi3EnterContinuousTimeModeTYPE>(
215  "fmi3EnterContinuousTimeMode");
216  set_time_ = load_function<fmi3SetTimeTYPE>("fmi3SetTime");
217  get_float64_ = load_function<fmi3GetFloat64TYPE>("fmi3GetFloat64");
218  set_float64_ = load_function<fmi3SetFloat64TYPE>("fmi3SetFloat64");
219  get_int32_ = load_function<fmi3GetInt32TYPE>("fmi3GetInt32");
220  set_int32_ = load_function<fmi3SetInt32TYPE>("fmi3SetInt32");
221  get_boolean_ = load_function<fmi3GetBooleanTYPE>("fmi3GetBoolean");
222  set_boolean_ = load_function<fmi3SetBooleanTYPE>("fmi3SetBoolean");
223  get_string_ = load_function<fmi3GetStringTYPE>("fmi3GetString");
224  set_string_ = load_function<fmi3SetStringTYPE>("fmi3SetString");
227  load_function<fmi3GetDirectionalDerivativeTYPE>("fmi3GetDirectionalDerivative");
228  }
231  load_function<fmi3GetAdjointDerivativeTYPE>("fmi3GetAdjointDerivative");
232  }
234  load_function<fmi3UpdateDiscreteStatesTYPE>("fmi3UpdateDiscreteStates");
235 }
236 
237 void Fmu3::log_message_callback(fmi3InstanceEnvironment instanceEnvironment,
238  fmi3Status status, fmi3String category, fmi3String message) {
239  // Print message content
240  uout() << "[" << category << "] " << message << std::endl;
241 }
242 
243 void* Fmu3::instantiate() const {
244  // Instantiate FMU
245  fmi3String instanceName = instance_name_.c_str();
246  fmi3String instantiationToken = instantiation_token_.c_str();
247  fmi3String resourcePath = resource_loc_.c_str();
248  fmi3Boolean visible = fmi3False;
249  fmi3InstanceEnvironment instanceEnvironment = nullptr;
250  fmi3Instance c = instantiate_model_exchange_(instanceName, instantiationToken, resourcePath,
251  visible, logging_on_, instanceEnvironment, log_message_callback);
252  if (c == nullptr) casadi_error("fmi3Instantiate failed");
253  return c;
254 }
255 
256 void Fmu3::free_instance(void* instance) const {
257  if (free_instance_) {
258  auto *c = static_cast<fmi3Instance>(instance);
259  free_instance_(c);
260  } else {
261  casadi_warning("No free_instance function pointer available");
262  }
263 }
264 
265 int Fmu3::reset(void* instance) {
266  auto *c = static_cast<fmi3Instance>(instance);
267  fmi3Status status = reset_(c);
268  if (status != fmi3OK) {
269  casadi_warning("fmi3Reset failed");
270  return 1;
271  }
272  return 0;
273 }
274 
275 int Fmu3::enter_initialization_mode(void* instance) const {
276  auto *c = static_cast<fmi3Instance>(instance);
277  fmi3Status status = enter_initialization_mode_(c, fmutol_ > 0, fmutol_, 0., fmi3True, 1.);
278  if (status != fmi3OK) {
279  casadi_warning("fmi3EnterInitializationMode failed: " + str(status));
280  return 1;
281  }
282  return 0;
283 }
284 
285 int Fmu3::exit_initialization_mode(void* instance) const {
286  auto *c = static_cast<fmi3Instance>(instance);
287  fmi3Status status = exit_initialization_mode_(c);
288  if (status != fmi3OK) {
289  casadi_warning("fmi3ExitInitializationMode failed");
290  return 1;
291  }
292  return 0;
293 }
294 
295 int Fmu3::enter_continuous_time_mode(void* instance) const {
296  auto *c = static_cast<fmi3Instance>(instance);
297  fmi3Status status = enter_continuous_time_mode_(c);
298  if (status != fmi3OK) {
299  casadi_warning("fmi3EnterContinuousTimeMode failed");
300  return 1;
301  }
302  return 0;
303 }
304 
305 int Fmu3::update_discrete_states(void* instance, EventMemory* eventmem) const {
306  auto *c = static_cast<fmi3Instance>(instance);
307  // Return arguments in FMI types
308  fmi3Boolean discreteStatesNeedUpdate, terminateSimulation, nominalsOfContinuousStatesChanged,
309  valuesOfContinuousStatesChanged, nextEventTimeDefined;
310  fmi3Float64 nextEventTime;
311  // Call FMU
312  fmi3Status status = update_discrete_states_(c, &discreteStatesNeedUpdate, &terminateSimulation,
313  &nominalsOfContinuousStatesChanged, &valuesOfContinuousStatesChanged, &nextEventTimeDefined,
314  &nextEventTime);
315  // Pass to event iteration memory
316  eventmem->discrete_states_need_update = discreteStatesNeedUpdate;
317  eventmem->terminate_simulation = terminateSimulation;
318  eventmem->nominals_of_continuous_states_changed = nominalsOfContinuousStatesChanged;
319  eventmem->values_of_continuous_states_changed = valuesOfContinuousStatesChanged;
320  eventmem->next_event_time_defined = nextEventTimeDefined;
321  eventmem->next_event_time = nextEventTime;
322  return status != fmi3OK;
323 }
324 
325 int Fmu3::get_derivatives(void* instance, double* derivatives, size_t nx) const {
326  return 0;
327 }
328 
329 int Fmu3::set_time(void* instance, double t) const {
330  fmi3Status status = set_time_(instance, t);
331  return status != fmi3OK;
332 }
333 
334 int Fmu3::set_real(void* instance, const unsigned int* vr, size_t n_vr,
335  const double* values, size_t n_values) const {
336  // Set time variable, if any
337  if (has_independent_ && n_vr > 0 && *vr == vr_in_[0]) {
338  // Update FMU time
339  fmi3Status status = set_time_(instance, *values);
340  if (status != fmi3OK) return 1;
341  // Skip when setting remaining variables
342  vr++;
343  n_vr--;
344  values++;
345  n_values--;
346  }
347  // Set remaining variables
348  fmi3Status status = set_float64_(instance, vr, n_vr, values, n_values);
349  return status != fmi3OK;
350 }
351 
352 int Fmu3::get_real(void* instance, const unsigned int* vr, size_t n_vr,
353  double* values, size_t n_values, FmuMemory* m) const {
354  (void)m; // unused
355  fmi3Status status = get_float64_(instance, vr, n_vr, values, n_values);
356  return status != fmi3OK;
357 }
358 
359 int Fmu3::get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
360  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
361  double* sensitivity, size_t n_sensitivity) const {
362  fmi3Status status = get_directional_derivative_(instance, vr_out, n_out, vr_in, n_in,
363  seed, n_seed, sensitivity, n_sensitivity);
364  return status != fmi3OK;
365 }
366 
367 int Fmu3::get_adjoint_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
368  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
369  double* sensitivity, size_t n_sensitivity) const {
370  fmi3Status status = get_adjoint_derivative_(instance, vr_out, n_out, vr_in, n_in,
371  seed, n_seed, sensitivity, n_sensitivity);
372  return status != fmi3OK;
373 }
374 
375 int Fmu3::set_values(void* instance) const {
376  auto *c = static_cast<fmi3Instance>(instance);
377  // Pass real values before initialization
378  casadi_assert(vr_real_.size() == init_real_.size(), "Vector valued variables not supported");
379  for (size_t k = 0; k < vr_real_.size(); ++k) {
380  fmi3Status status = set_float64_(c, &vr_real_[k], 1, &init_real_[k], 1);
381  if (status != fmi3OK) {
382  casadi_warning("fmi3SetFloat64 failed for value reference " + str(vr_real_[k]));
383  return 1;
384  }
385  }
386 
387  // Pass integer values before initialization (also enums)
388  if (!vr_integer_.empty()) {
389  fmi3Status status = set_int32_(c, get_ptr(vr_integer_), vr_integer_.size(),
391  if (status != fmi3OK) {
392  casadi_warning("fmi3SetInt32 failed");
393  return 1;
394  }
395  }
396  // Pass boolean values before initialization
397  if (!vr_boolean_.empty()) {
398  casadi_error("Broken");
399  // nullptr -> get_ptr(init_boolean_)
400  fmi3Status status = set_boolean_(c, get_ptr(vr_boolean_), vr_boolean_.size(),
401  nullptr, init_boolean_.size());
402  if (status != fmi3OK) {
403  casadi_warning("fmi3SetBoolean failed");
404  return 1;
405  }
406  }
407  // Pass string values before initialization
408  for (size_t k = 0; k < vr_string_.size(); ++k) {
409  fmi3ValueReference vr = vr_string_[k];
410  fmi3String value = init_string_[k].c_str();
411  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
412  if (status != fmi3OK) {
413  casadi_error("fmi3SetString failed for value reference " + str(vr));
414  }
415  }
416  // Successful return
417  return 0;
418 }
419 
420 int Fmu3::get_aux(void* instance) {
421  return get_aux_impl(instance, aux_value_);
422 }
423 
424 int Fmu3::get_aux_impl(void* instance, Value& aux_value) const {
425  auto *c = static_cast<fmi3Instance>(instance);
426  // Get real auxilliary variables
427  if (!vr_aux_real_.empty()) {
428  fmi3Status status = get_float64_(c, get_ptr(vr_aux_real_), vr_aux_real_.size(),
429  get_ptr(aux_value.v_real), aux_value.v_real.size());
430  if (status != fmi3OK) {
431  casadi_warning("fmi3GetFloat64 failed");
432  return 1;
433  }
434  }
435 
436  // Get integer/enum auxilliary variables
437  if (!vr_aux_integer_.empty()) {
438  fmi3Status status = get_int32_(c, get_ptr(vr_aux_integer_), vr_aux_integer_.size(),
439  get_ptr(aux_value.v_integer), aux_value.v_integer.size());
440  if (status != fmi3OK) {
441  casadi_warning("fmi3GetInt32 failed");
442  return 1;
443  }
444  }
445 
446  // Get boolean auxilliary variables
447  casadi_assert(vr_aux_boolean_.size() == aux_value.v_boolean.size(),
448  "Vector valued variables not supported");
449  for (size_t k = 0; k < vr_aux_boolean_.size(); ++k) {
450  fmi3Boolean value;
451  fmi3Status status = get_boolean_(c, &vr_aux_boolean_[k], 1, &value, 1);
452  if (status != fmi3OK) {
453  casadi_warning("fmi3GetBoolean failed for value reference " + str(vr_aux_boolean_[k]));
454  return 1;
455  }
456  aux_value.v_boolean[k] = value;
457  }
458 
459  // Get string auxilliary variables
460  for (size_t k = 0; k < vr_aux_string_.size(); ++k) {
461  fmi3ValueReference vr = vr_aux_string_[k];
462  fmi3String value = aux_value.v_string.at(k).c_str();
463  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
464  if (status != fmi3OK) {
465  casadi_error("fmi3GetString failed for value reference " + str(vr));
466  }
467  }
468  // Successful return
469  return 0;
470 }
471 
473  const std::vector<std::string>& name_in, const InputStruct* in) const {
474  Value& v = static_cast<Fmu3Memory*>(m)->aux_value;
475  get_aux_impl(m->instance, v);
476  // Collect auxilliary variables
477  Dict aux;
478  // Real
479  for (size_t k = 0; k < vn_aux_real_.size(); ++k) {
480  aux[vn_aux_real_[k]] = static_cast<double>(v.v_real[k]);
481  }
482  // Integer
483  for (size_t k = 0; k < vn_aux_integer_.size(); ++k) {
484  aux[vn_aux_integer_[k]] = static_cast<casadi_int>(v.v_integer[k]);
485  }
486  // Boolean
487  for (size_t k = 0; k < vn_aux_boolean_.size(); ++k) {
488  aux[vn_aux_boolean_[k]] = static_cast<bool>(v.v_boolean[k]);
489  }
490  // String
491  for (size_t k = 0; k < vn_aux_string_.size(); ++k) {
492  aux[vn_aux_string_[k]] = v.v_string[k];
493  }
494  // Copy to stats
495  (*stats)["aux"] = aux;
496  // Loop over input variables
497  for (size_t k = 0; k < name_in.size(); ++k) {
498  // Only consider regular inputs
499  if (in[k].type == InputType::REG) {
500  // Get the indices
501  const std::vector<size_t>& iind = ired_.at(in[k].ind);
502  // Collect values
503  std::vector<double> v(iind.size());
504  for (size_t i = 0; i < v.size(); ++i) v[i] = value_in_.at(iind[i]);
505  // Save to stats
506  (*stats)[name_in[k]] = v;
507  }
508  }
509 }
510 
511 Fmu3::Fmu3(const std::string& name,
512  const std::vector<std::string>& scheme_in,
513  const std::vector<std::string>& scheme_out,
514  const std::map<std::string, std::vector<size_t>>& scheme,
515  const std::vector<std::string>& aux)
516  : FmuInternal(name, scheme_in, scheme_out, scheme, aux) {
517  instantiate_model_exchange_ = nullptr;
518  free_instance_ = nullptr;
519  reset_ = nullptr;
520  enter_initialization_mode_ = nullptr;
521  exit_initialization_mode_ = nullptr;
522  enter_continuous_time_mode_ = nullptr;
523  set_time_ = nullptr;
524  set_float64_ = nullptr;
525  set_boolean_ = nullptr;
526  get_float64_ = nullptr;
527  get_directional_derivative_ = nullptr;
528  get_adjoint_derivative_ = nullptr;
529  update_discrete_states_ = nullptr;
530 }
531 
532 
534  Fmu3* ret = new Fmu3(s);
535  ret->finalize();
536  return ret;
537 }
538 
540  instantiate_model_exchange_ = nullptr;
541  free_instance_ = nullptr;
542  reset_ = nullptr;
543  enter_initialization_mode_ = nullptr;
544  exit_initialization_mode_ = nullptr;
545  enter_continuous_time_mode_ = nullptr;
546  set_time_ = nullptr;
547  set_float64_ = nullptr;
548  set_boolean_ = nullptr;
549  get_float64_ = nullptr;
550  get_directional_derivative_ = nullptr;
551  get_adjoint_derivative_ = nullptr;
552  update_discrete_states_ = nullptr;
553 
554  s.version("Fmu3", 1);
555  s.unpack("Fmu3::vr_real", vr_real_);
556  s.unpack("Fmu3::vr_integer", vr_integer_);
557  s.unpack("Fmu3::vr_boolean", vr_boolean_);
558  s.unpack("Fmu3::vr_string", vr_string_);
559  s.unpack("Fmu3::init_real", init_real_);
560  s.unpack("Fmu3::init_integer", init_integer_);
561  s.unpack("Fmu3::init_boolean", init_boolean_);
562  s.unpack("Fmu3::init_string", init_string_);
563 
564  s.unpack("Fmu3::vn_aux_real", vn_aux_real_);
565  s.unpack("Fmu3::vn_aux_integer", vn_aux_integer_);
566  s.unpack("Fmu3::vn_aux_boolean", vn_aux_boolean_);
567  s.unpack("Fmu3::vn_aux_string", vn_aux_string_);
568  s.unpack("Fmu3::vr_aux_real", vr_aux_real_);
569  s.unpack("Fmu3::vr_aux_integer", vr_aux_integer_);
570  s.unpack("Fmu3::vr_aux_boolean", vr_aux_boolean_);
571  s.unpack("Fmu3::vr_aux_string", vr_aux_string_);
572 }
573 
574 
577 
578  s.version("Fmu3", 1);
579  s.pack("Fmu3::vr_real", vr_real_);
580  s.pack("Fmu3::vr_integer", vr_integer_);
581  s.pack("Fmu3::vr_boolean", vr_boolean_);
582  s.pack("Fmu3::vr_string", vr_string_);
583  s.pack("Fmu3::init_real", init_real_);
584  s.pack("Fmu3::init_integer", init_integer_);
585  s.pack("Fmu3::init_boolean", init_boolean_);
586  s.pack("Fmu3::init_string", init_string_);
587 
588  s.pack("Fmu3::vn_aux_real", vn_aux_real_);
589  s.pack("Fmu3::vn_aux_integer", vn_aux_integer_);
590  s.pack("Fmu3::vn_aux_boolean", vn_aux_boolean_);
591  s.pack("Fmu3::vn_aux_string", vn_aux_string_);
592  s.pack("Fmu3::vr_aux_real", vr_aux_real_);
593  s.pack("Fmu3::vr_aux_integer", vr_aux_integer_);
594  s.pack("Fmu3::vr_aux_boolean", vr_aux_boolean_);
595  s.pack("Fmu3::vr_aux_string", vr_aux_string_);
596 }
597 
598 } // 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:352
void * instantiate() const override
Definition: fmu3.cpp:243
void serialize_body(SerializingStream &s) const override
Definition: fmu3.cpp:575
std::vector< fmi3ValueReference > vr_string_
Definition: fmu3.hpp:82
fmi3InstantiateModelExchangeTYPE * instantiate_model_exchange_
Definition: fmu3.hpp:95
int exit_initialization_mode(void *instance) const override
Definition: fmu3.cpp:285
void free_instance(void *instance) const override
Definition: fmu3.cpp:256
int get_aux_impl(void *instance, Value &aux_value) const
Definition: fmu3.cpp:424
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:367
int set_time(void *instance, double t) const override
Definition: fmu3.cpp:329
Value aux_value_
Definition: fmu3.hpp:122
fmi3ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu3.hpp:99
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:108
fmi3SetFloat64TYPE * set_float64_
Definition: fmu3.hpp:103
std::vector< fmi3Boolean > init_boolean_
Definition: fmu3.hpp:85
fmi3SetInt32TYPE * set_int32_
Definition: fmu3.hpp:107
FmuMemory * alloc_mem(const FmuFunction &f) const override
Create memory block.
Definition: fmu3.cpp:50
void load_functions() override
Definition: fmu3.cpp:205
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:511
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:533
fmi3EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu3.hpp:100
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:237
fmi3GetInt32TYPE * get_int32_
Definition: fmu3.hpp:106
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:334
static std::string dll_infix()
Definition: fmu3.cpp:61
void finalize() override
Definition: fmu3.cpp:194
fmi3SetStringTYPE * set_string_
Definition: fmu3.hpp:109
std::vector< fmi3ValueReference > vr_integer_
Definition: fmu3.hpp:82
fmi3SetTimeTYPE * set_time_
Definition: fmu3.hpp:101
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:102
int reset(void *instance)
Definition: fmu3.cpp:265
fmi3SetBooleanTYPE * set_boolean_
Definition: fmu3.hpp:105
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:110
void free_mem(void *mem) const override
Free memory block.
Definition: fmu3.cpp:54
fmi3GetBooleanTYPE * get_boolean_
Definition: fmu3.hpp:104
int set_values(void *instance) const override
Definition: fmu3.cpp:375
int update_discrete_states(void *instance, EventMemory *eventmem) const override
Definition: fmu3.cpp:305
int get_aux(void *instance) override
Definition: fmu3.cpp:420
std::vector< fmi3Float64 > init_real_
Definition: fmu3.hpp:83
fmi3ResetTYPE * reset_
Definition: fmu3.hpp:97
int enter_continuous_time_mode(void *instance) const override
Definition: fmu3.cpp:295
int init_mem(FmuMemory *m) const override
Initalize memory block.
Definition: fmu3.cpp:39
fmi3GetAdjointDerivativeTYPE * get_adjoint_derivative_
Definition: fmu3.hpp:111
std::vector< std::string > vn_aux_string_
Definition: fmu3.hpp:89
void init(const DaeBuilderInternal *dae) override
Definition: fmu3.cpp:106
fmi3UpdateDiscreteStatesTYPE * update_discrete_states_
Definition: fmu3.hpp:112
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:359
int get_derivatives(void *instance, double *derivatives, size_t nx) const override
Definition: fmu3.cpp:325
fmi3FreeInstanceTYPE * free_instance_
Definition: fmu3.hpp:96
fmi3EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu3.hpp:98
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
Definition: fmu3.cpp:472
int enter_initialization_mode(void *instance) const override
Definition: fmu3.cpp:275
Interface to binary FMU.
Definition: fmu_impl.hpp:61
std::string instantiation_token_
Definition: fmu_impl.hpp:324
bool provides_adjoint_derivatives_
Definition: fmu_impl.hpp:333
virtual void finalize()
Definition: fmu.cpp:593
std::vector< std::vector< size_t > > ired_
Definition: fmu_impl.hpp:364
std::vector< std::string > aux_
Definition: fmu_impl.hpp:312
virtual void serialize_body(SerializingStream &s) const
Definition: fmu.cpp:1506
std::vector< unsigned int > vr_in_
Definition: fmu_impl.hpp:358
size_t n_in() const
Get the number of scheme inputs.
Definition: fmu_impl.hpp:130
std::string resource_loc_
Definition: fmu_impl.hpp:315
std::vector< double > value_in_
Definition: fmu_impl.hpp:361
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:1247
std::string instance_name_
Definition: fmu_impl.hpp:321
bool provides_directional_derivatives_
Definition: fmu_impl.hpp:333
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< fmi3Float64 > v_real
Definition: fmu3.hpp:116
std::vector< std::string > v_string
Definition: fmu3.hpp:119
std::vector< fmi3Boolean > v_boolean
Definition: fmu3.hpp:118
std::vector< fmi3Int32 > v_integer
Definition: fmu3.hpp:117
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.