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 
33 }
34 
35 std::string Fmu3::system_infix() const {
36  // Architecture
37  std::string arch;
38 #if defined(__arm64__) || defined(__aarch64__)
39  // ARM 64-bit Architecture
40  arch = "aarch64";
41 #elif __arm__
42  if (sizeof(void*) == 4) {
43  // ARM 32-bit Architecture
44  arch = "aarch32";
45  } else {
46  // ARM 64-bit Architecture
47  arch = "aarch64";
48  }
49 #else
50  if (sizeof(void*) == 4) {
51  // Intel/AMD x86 32-bit
52  arch = "x86";
53  } else {
54  // Intel/AMD x86 64-bit
55  arch = "x86_64";
56  }
57 #endif
58  // Operating system
59  std::string sys;
60 #if defined(_WIN32)
61  // Microsoft Windows
62  sys = "windows";
63 #elif defined(__APPLE__)
64  // Darwin (macOS, iOS, watchOS, tvOS, audioOS)
65  sys = "darwin";
66 #else
67  // Linux
68  sys = "linux";
69 #endif
70  // Return platform tuple, according to Section 2.5.1.4.1. of the FMI 3 specification
71  return arch + "-" + sys;
72 }
73 
74 void Fmu3::init(const DaeBuilderInternal* dae) {
75  // Initialize base classes
76  FmuInternal::init(dae);
77 
78  // Collect input and parameter values
79  vr_real_.clear();
80  vr_integer_.clear();
81  vr_boolean_.clear();
82  vr_string_.clear();
83  init_real_.clear();
84  init_integer_.clear();
85  init_boolean_.clear();
86  init_string_.clear();
87  for (size_t i = 0; i < dae->n_variables(); ++i) {
88  const Variable& v = dae->variable(i);
89  casadi_assert(v.numel == 1, "Vector variable support not implemented");
90  // Skip if the wrong type
91  if (v.causality != Causality::PARAMETER && v.causality != Causality::INPUT) continue;
92  // Variable has not been set - keep default value
93  if (!v.is_set()) continue;
94  // Value reference
95  fmi3ValueReference vr = v.value_reference;
96  // Get value
97  switch (to_fmi2(v.type)) {
98  case TypeFmi2::REAL:
99  init_real_.push_back(static_cast<fmi3Float64>(v.value.front()));
100  vr_real_.push_back(vr);
101  break;
102  case TypeFmi2::INTEGER:
103  case TypeFmi2::ENUM:
104  init_integer_.push_back(static_cast<fmi3Int32>(v.value.front()));
105  vr_integer_.push_back(vr);
106  break;
107  case TypeFmi2::BOOLEAN:
108  init_boolean_.push_back(static_cast<fmi3Boolean>(v.value.front()));
109  vr_boolean_.push_back(vr);
110  break;
111  case TypeFmi2::STRING:
112  init_string_.push_back(v.stringvalue);
113  vr_string_.push_back(vr);
114  break;
115  default:
116  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
117  }
118  }
119 
120  // Collect auxilliary variables
121  vn_aux_real_.clear();
122  vn_aux_integer_.clear();
123  vn_aux_boolean_.clear();
124  vn_aux_string_.clear();
125  vr_aux_real_.clear();
126  vr_aux_integer_.clear();
127  vr_aux_boolean_.clear();
128  vr_aux_string_.clear();
129  for (auto&& s : aux_) {
130  const Variable& v = dae->variable(s);
131  // Convert to expected type
132  fmi3ValueReference vr = v.value_reference;
133  // Sort by type
134  switch (to_fmi2(v.type)) {
135  case TypeFmi2::REAL:
136  // Real
137  vn_aux_real_.push_back(v.name);
138  vr_aux_real_.push_back(vr);
139  break;
140  case TypeFmi2::INTEGER:
141  case TypeFmi2::ENUM:
142  // Integer or enum
143  vn_aux_integer_.push_back(v.name);
144  vr_aux_integer_.push_back(vr);
145  break;
146  case TypeFmi2::BOOLEAN:
147  // Boolean
148  vn_aux_boolean_.push_back(v.name);
149  vr_aux_boolean_.push_back(vr);
150  break;
151  case TypeFmi2::STRING:
152  // String
153  vn_aux_string_.push_back(v.name);
154  vr_aux_string_.push_back(vr);
155  break;
156  default:
157  casadi_warning("Ignoring " + v.name + ", type: " + to_string(v.type));
158  }
159  }
160 
162  aux_value_.v_real.resize(vn_aux_real_.size());
163  aux_value_.v_integer.resize(vn_aux_integer_.size());
164  aux_value_.v_boolean.resize(vn_aux_boolean_.size());
165  aux_value_.v_string.resize(vn_aux_string_.size());
166 }
167 
169  instantiate_model_exchange_ = load_function<fmi3InstantiateModelExchangeTYPE>(
170  "fmi3InstantiateModelExchange");
171  free_instance_ = load_function<fmi3FreeInstanceTYPE>("fmi3FreeInstance");
172  reset_ = load_function<fmi3ResetTYPE>("fmi3Reset");
173  enter_initialization_mode_ = load_function<fmi3EnterInitializationModeTYPE>(
174  "fmi3EnterInitializationMode");
175  exit_initialization_mode_ = load_function<fmi3ExitInitializationModeTYPE>(
176  "fmi3ExitInitializationMode");
177  enter_continuous_time_mode_ = load_function<fmi3EnterContinuousTimeModeTYPE>(
178  "fmi3EnterContinuousTimeMode");
179  set_time_ = load_function<fmi3SetTimeTYPE>("fmi3SetTime");
180  get_float64_ = load_function<fmi3GetFloat64TYPE>("fmi3GetFloat64");
181  set_float64_ = load_function<fmi3SetFloat64TYPE>("fmi3SetFloat64");
182  get_int32_ = load_function<fmi3GetInt32TYPE>("fmi3GetInt32");
183  set_int32_ = load_function<fmi3SetInt32TYPE>("fmi3SetInt32");
184  get_boolean_ = load_function<fmi3GetBooleanTYPE>("fmi3GetBoolean");
185  set_boolean_ = load_function<fmi3SetBooleanTYPE>("fmi3SetBoolean");
186  get_string_ = load_function<fmi3GetStringTYPE>("fmi3GetString");
187  set_string_ = load_function<fmi3SetStringTYPE>("fmi3SetString");
190  load_function<fmi3GetDirectionalDerivativeTYPE>("fmi3GetDirectionalDerivative");
191  }
194  load_function<fmi3GetAdjointDerivativeTYPE>("fmi3GetAdjointDerivative");
195  }
197  load_function<fmi3UpdateDiscreteStatesTYPE>("fmi3UpdateDiscreteStates");
198 }
199 
200 void Fmu3::log_message_callback(fmi3InstanceEnvironment instanceEnvironment,
201  fmi3Status status, fmi3String category, fmi3String message) {
202  // Print message content
203  uout() << "[" << category << "] " << message << std::endl;
204 }
205 
206 void* Fmu3::instantiate() const {
207  // Instantiate FMU
208  fmi3String instanceName = instance_name_.c_str();
209  fmi3String instantiationToken = instantiation_token_.c_str();
210  fmi3String resourcePath = resource_loc_.c_str();
211  fmi3Boolean visible = fmi3False;
212  fmi3InstanceEnvironment instanceEnvironment = 0;
213  fmi3Instance c = instantiate_model_exchange_(instanceName, instantiationToken, resourcePath,
214  visible, logging_on_, instanceEnvironment, log_message_callback);
215  if (c == 0) casadi_error("fmi3Instantiate failed");
216  return c;
217 }
218 
219 void Fmu3::free_instance(void* instance) const {
220  if (free_instance_) {
221  auto c = static_cast<fmi3Instance>(instance);
222  free_instance_(c);
223  } else {
224  casadi_warning("No free_instance function pointer available");
225  }
226 }
227 
228 int Fmu3::reset(void* instance) {
229  auto c = static_cast<fmi3Instance>(instance);
230  fmi3Status status = reset_(c);
231  if (status != fmi3OK) {
232  casadi_warning("fmi3Reset failed");
233  return 1;
234  }
235  return 0;
236 }
237 
238 int Fmu3::enter_initialization_mode(void* instance) const {
239  auto c = static_cast<fmi3Instance>(instance);
240  fmi3Status status = enter_initialization_mode_(c, fmutol_ > 0, fmutol_, 0., fmi3True, 1.);
241  if (status != fmi3OK) {
242  casadi_warning("fmi3EnterInitializationMode failed: " + str(status));
243  return 1;
244  }
245  return 0;
246 }
247 
248 int Fmu3::exit_initialization_mode(void* instance) const {
249  auto c = static_cast<fmi3Instance>(instance);
250  fmi3Status status = exit_initialization_mode_(c);
251  if (status != fmi3OK) {
252  casadi_warning("fmi3ExitInitializationMode failed");
253  return 1;
254  }
255  return 0;
256 }
257 
258 int Fmu3::enter_continuous_time_mode(void* instance) const {
259  auto c = static_cast<fmi3Instance>(instance);
260  fmi3Status status = enter_continuous_time_mode_(c);
261  if (status != fmi3OK) {
262  casadi_warning("fmi3EnterContinuousTimeMode failed");
263  return 1;
264  }
265  return 0;
266 }
267 
268 int Fmu3::update_discrete_states(void* instance, EventMemory* eventmem) const {
269  auto c = static_cast<fmi3Instance>(instance);
270  // Return arguments in FMI types
271  fmi3Boolean discreteStatesNeedUpdate, terminateSimulation, nominalsOfContinuousStatesChanged,
272  valuesOfContinuousStatesChanged, nextEventTimeDefined;
273  fmi3Float64 nextEventTime;
274  // Call FMU
275  fmi3Status status = update_discrete_states_(c, &discreteStatesNeedUpdate, &terminateSimulation,
276  &nominalsOfContinuousStatesChanged, &valuesOfContinuousStatesChanged, &nextEventTimeDefined,
277  &nextEventTime);
278  // Pass to event iteration memory
279  eventmem->discrete_states_need_update = discreteStatesNeedUpdate;
280  eventmem->terminate_simulation = terminateSimulation;
281  eventmem->nominals_of_continuous_states_changed = nominalsOfContinuousStatesChanged;
282  eventmem->values_of_continuous_states_changed = valuesOfContinuousStatesChanged;
283  eventmem->next_event_time_defined = nextEventTimeDefined;
284  eventmem->next_event_time = nextEventTime;
285  return status != fmi3OK;
286 }
287 
288 int Fmu3::set_real(void* instance, const unsigned int* vr, size_t n_vr,
289  const double* values, size_t n_values) const {
290  // Set time variable, if any
291  if (has_independent_ && n_vr > 0 && *vr == vr_in_[0]) {
292  // Update FMU time
293  fmi3Status status = set_time_(instance, *values);
294  if (status != fmi3OK) return 1;
295  // Skip when setting remaining variables
296  vr++;
297  n_vr--;
298  values++;
299  n_values--;
300  }
301  // Set remaining variables
302  fmi3Status status = set_float64_(instance, vr, n_vr, values, n_values);
303  return status != fmi3OK;
304 }
305 
306 int Fmu3::get_real(void* instance, const unsigned int* vr, size_t n_vr,
307  double* values, size_t n_values) const {
308  fmi3Status status = get_float64_(instance, vr, n_vr, values, n_values);
309  return status != fmi3OK;
310 }
311 
312 int Fmu3::get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
313  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
314  double* sensitivity, size_t n_sensitivity) const {
315  fmi3Status status = get_directional_derivative_(instance, vr_out, n_out, vr_in, n_in,
316  seed, n_seed, sensitivity, n_sensitivity);
317  return status != fmi3OK;
318 }
319 
320 int Fmu3::get_adjoint_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
321  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
322  double* sensitivity, size_t n_sensitivity) const {
323  fmi3Status status = get_adjoint_derivative_(instance, vr_out, n_out, vr_in, n_in,
324  seed, n_seed, sensitivity, n_sensitivity);
325  return status != fmi3OK;
326 }
327 
328 int Fmu3::set_values(void* instance) const {
329  auto c = static_cast<fmi3Instance>(instance);
330  // Pass real values before initialization
331  if (!vr_real_.empty()) {
332  fmi3Status status = set_float64_(c, get_ptr(vr_real_), vr_real_.size(),
333  get_ptr(init_real_), init_real_.size());
334  if (status != fmi3OK) {
335  casadi_warning("fmi3SetFloat64 failed");
336  return 1;
337  }
338  }
339  // Pass integer values before initialization (also enums)
340  if (!vr_integer_.empty()) {
341  fmi3Status status = set_int32_(c, get_ptr(vr_integer_), vr_integer_.size(),
343  if (status != fmi3OK) {
344  casadi_warning("fmi3SetInt32 failed");
345  return 1;
346  }
347  }
348  // Pass boolean values before initialization
349  if (!vr_boolean_.empty()) {
350  casadi_error("Broken");
351  // nullptr -> get_ptr(init_boolean_)
352  fmi3Status status = set_boolean_(c, get_ptr(vr_boolean_), vr_boolean_.size(),
353  nullptr, init_boolean_.size());
354  if (status != fmi3OK) {
355  casadi_warning("fmi3SetBoolean failed");
356  return 1;
357  }
358  }
359  // Pass string values before initialization
360  for (size_t k = 0; k < vr_string_.size(); ++k) {
361  fmi3ValueReference vr = vr_string_[k];
362  fmi3String value = init_string_[k].c_str();
363  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
364  if (status != fmi3OK) {
365  casadi_error("fmi3SetString failed for value reference " + str(vr));
366  }
367  }
368  // Successful return
369  return 0;
370 }
371 
372 int Fmu3::get_aux(void* instance) {
373  auto c = static_cast<fmi3Instance>(instance);
374  // Get real auxilliary variables
375  if (!vr_aux_real_.empty()) {
376  fmi3Status status = get_float64_(c, get_ptr(vr_aux_real_), vr_aux_real_.size(),
378  if (status != fmi3OK) {
379  casadi_warning("fmi3GetFloat64 failed");
380  return 1;
381  }
382  }
383  // Get integer/enum auxilliary variables
384  if (!vr_aux_integer_.empty()) {
385  fmi3Status status = get_int32_(c, get_ptr(vr_aux_integer_), vr_aux_integer_.size(),
387  if (status != fmi3OK) {
388  casadi_warning("fmi3GetInt32 failed");
389  return 1;
390  }
391  }
392  // Get boolean auxilliary variables
393  if (!vr_aux_boolean_.empty()) {
394  casadi_error("Broken");
395  // nullptr -> get_ptr(v->v_boolean)
396  fmi3Status status = get_boolean_(c, get_ptr(vr_aux_boolean_), vr_aux_boolean_.size(),
397  nullptr, vr_aux_boolean_.size());
398  if (status != fmi3OK) {
399  casadi_warning("fmi3GetBoolean failed");
400  return 1;
401  }
402  }
403  // Get string auxilliary variables
404  for (size_t k = 0; k < vr_aux_string_.size(); ++k) {
405  fmi3ValueReference vr = vr_aux_string_[k];
406  fmi3String value = aux_value_.v_string.at(k).c_str();
407  fmi3Status status = set_string_(c, &vr, 1, &value, 1);
408  if (status != fmi3OK) {
409  casadi_error("fmi3GetString failed for value reference " + str(vr));
410  }
411  }
412  // Successful return
413  return 0;
414 }
415 
417  const std::vector<std::string>& name_in, const InputStruct* in) const {
418  // To do: Use auxillary variables from last evaluation
419  (void)m; // unused
420  // Auxilliary values to be copied
421  const Value& v = aux_value_;
422  // Collect auxilliary variables
423  Dict aux;
424  // Real
425  for (size_t k = 0; k < vn_aux_real_.size(); ++k) {
426  aux[vn_aux_real_[k]] = static_cast<double>(v.v_real[k]);
427  }
428  // Integer
429  for (size_t k = 0; k < vn_aux_integer_.size(); ++k) {
430  aux[vn_aux_integer_[k]] = static_cast<casadi_int>(v.v_integer[k]);
431  }
432  // Boolean
433  for (size_t k = 0; k < vn_aux_boolean_.size(); ++k) {
434  aux[vn_aux_boolean_[k]] = static_cast<bool>(v.v_boolean[k]);
435  }
436  // String
437  for (size_t k = 0; k < vn_aux_string_.size(); ++k) {
438  aux[vn_aux_string_[k]] = v.v_string[k];
439  }
440  // Copy to stats
441  (*stats)["aux"] = aux;
442  // Loop over input variables
443  for (size_t k = 0; k < name_in.size(); ++k) {
444  // Only consider regular inputs
445  if (in[k].type == InputType::REG) {
446  // Get the indices
447  const std::vector<size_t>& iind = ired_.at(in[k].ind);
448  // Collect values
449  std::vector<double> v(iind.size());
450  for (size_t i = 0; i < v.size(); ++i) v[i] = value_in_.at(iind[i]);
451  // Save to stats
452  (*stats)[name_in[k]] = v;
453  }
454  }
455 }
456 
457 Fmu3::Fmu3(const std::string& name,
458  const std::vector<std::string>& scheme_in,
459  const std::vector<std::string>& scheme_out,
460  const std::map<std::string, std::vector<size_t>>& scheme,
461  const std::vector<std::string>& aux)
462  : FmuInternal(name, scheme_in, scheme_out, scheme, aux) {
464  free_instance_ = 0;
465  reset_ = 0;
469  set_time_ = 0;
470  set_float64_ = 0;
471  set_boolean_ = 0;
472  get_float64_ = 0;
476 }
477 
478 } // namespace casadi
size_t n_variables() const
Length of variables array.
Variable & variable(size_t ind)
void * instantiate() const override
Definition: fmu3.cpp:206
std::vector< fmi3ValueReference > vr_string_
Definition: fmu3.hpp:64
fmi3InstantiateModelExchangeTYPE * instantiate_model_exchange_
Definition: fmu3.hpp:77
int exit_initialization_mode(void *instance) const override
Definition: fmu3.cpp:248
void free_instance(void *instance) const override
Definition: fmu3.cpp:219
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:320
std::string system_infix() const override
Definition: fmu3.cpp:35
Value aux_value_
Definition: fmu3.hpp:104
fmi3ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu3.hpp:81
int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values) const override
Definition: fmu3.cpp:306
std::vector< fmi3ValueReference > vr_aux_real_
Definition: fmu3.hpp:72
std::vector< std::string > vn_aux_boolean_
Definition: fmu3.hpp:71
std::vector< fmi3ValueReference > vr_boolean_
Definition: fmu3.hpp:64
~Fmu3() override
Destructor.
Definition: fmu3.cpp:32
std::vector< fmi3ValueReference > vr_aux_string_
Definition: fmu3.hpp:72
fmi3GetStringTYPE * get_string_
Definition: fmu3.hpp:90
fmi3SetFloat64TYPE * set_float64_
Definition: fmu3.hpp:85
std::vector< fmi3Boolean > init_boolean_
Definition: fmu3.hpp:67
fmi3SetInt32TYPE * set_int32_
Definition: fmu3.hpp:89
void load_functions() override
Definition: fmu3.cpp:168
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:457
std::vector< fmi3Int32 > init_integer_
Definition: fmu3.hpp:66
std::vector< std::string > vn_aux_real_
Definition: fmu3.hpp:71
fmi3EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu3.hpp:82
std::vector< std::string > init_string_
Definition: fmu3.hpp:68
static void log_message_callback(fmi3InstanceEnvironment instanceEnvironment, fmi3Status status, fmi3String category, fmi3String message)
Definition: fmu3.cpp:200
fmi3GetInt32TYPE * get_int32_
Definition: fmu3.hpp:88
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:288
fmi3SetStringTYPE * set_string_
Definition: fmu3.hpp:91
std::vector< fmi3ValueReference > vr_integer_
Definition: fmu3.hpp:64
fmi3SetTimeTYPE * set_time_
Definition: fmu3.hpp:83
std::vector< std::string > vn_aux_integer_
Definition: fmu3.hpp:71
std::vector< fmi3ValueReference > vr_real_
Definition: fmu3.hpp:64
fmi3GetFloat64TYPE * get_float64_
Definition: fmu3.hpp:84
int reset(void *instance)
Definition: fmu3.cpp:228
fmi3SetBooleanTYPE * set_boolean_
Definition: fmu3.hpp:87
std::vector< fmi3ValueReference > vr_aux_boolean_
Definition: fmu3.hpp:72
std::vector< fmi3ValueReference > vr_aux_integer_
Definition: fmu3.hpp:72
fmi3GetDirectionalDerivativeTYPE * get_directional_derivative_
Definition: fmu3.hpp:92
fmi3GetBooleanTYPE * get_boolean_
Definition: fmu3.hpp:86
int set_values(void *instance) const override
Definition: fmu3.cpp:328
int update_discrete_states(void *instance, EventMemory *eventmem) const override
Definition: fmu3.cpp:268
int get_aux(void *instance) override
Definition: fmu3.cpp:372
std::vector< fmi3Float64 > init_real_
Definition: fmu3.hpp:65
fmi3ResetTYPE * reset_
Definition: fmu3.hpp:79
int enter_continuous_time_mode(void *instance) const override
Definition: fmu3.cpp:258
fmi3GetAdjointDerivativeTYPE * get_adjoint_derivative_
Definition: fmu3.hpp:93
std::vector< std::string > vn_aux_string_
Definition: fmu3.hpp:71
void init(const DaeBuilderInternal *dae) override
Definition: fmu3.cpp:74
fmi3UpdateDiscreteStatesTYPE * update_discrete_states_
Definition: fmu3.hpp:94
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:312
fmi3FreeInstanceTYPE * free_instance_
Definition: fmu3.hpp:78
fmi3EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu3.hpp:80
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
Definition: fmu3.cpp:416
int enter_initialization_mode(void *instance) const override
Definition: fmu3.cpp:238
Interface to binary FMU.
Definition: fmu_impl.hpp:60
std::string instantiation_token_
Definition: fmu_impl.hpp:293
bool provides_adjoint_derivatives_
Definition: fmu_impl.hpp:302
std::vector< std::vector< size_t > > ired_
Definition: fmu_impl.hpp:327
std::vector< std::string > aux_
Definition: fmu_impl.hpp:281
std::vector< unsigned int > vr_in_
Definition: fmu_impl.hpp:321
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
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:98
std::vector< std::string > v_string
Definition: fmu3.hpp:101
std::vector< fmi3Boolean > v_boolean
Definition: fmu3.hpp:100
std::vector< fmi3Int32 > v_integer
Definition: fmu3.hpp:99
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.