27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
43 #elif defined(__APPLE__)
45 return sizeof(
void*) == 4 ?
"darwin32" :
"darwin64";
48 return sizeof(
void*) == 4 ?
"linux32" :
"linux64";
67 casadi_assert(v.
numel == 1,
"Vector variable support not implemented");
107 for (
auto&& s :
aux_) {
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");
152 "fmi2EnterInitializationMode");
154 "fmi2ExitInitializationMode");
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");
180 fmi2String instanceName,
183 fmi2String message, ...) {
186 va_start(args, message);
189 size_t buf_sz =
sizeof(buf);
190 char* buf_dyn =
nullptr;
192 int n = vsnprintf(buf, buf_sz, message, args);
196 buf_dyn =
new char[buf_sz];
197 n = vsnprintf(buf_dyn, buf_sz, message, args);
201 uout() <<
"[" << instanceName <<
":" << category <<
"] "
202 << (buf_dyn ? buf_dyn : buf) << std::endl;
208 casadi_assert(n>=0,
"Print failure while processing '" + std::string(message) +
"'");
214 fmi2Type fmuType = fmi2ModelExchange;
217 fmi2Boolean visible = fmi2False;
218 fmi2Component c =
instantiate_(instanceName, fmuType, fmuGUID, fmuResourceLocation,
220 if (c == 0) casadi_error(
"fmi2Instantiate failed");
224 casadi_assert(status == fmi2OK,
"fmi2SetupExperiment failed");
231 auto c =
static_cast<fmi2Component
>(instance);
234 casadi_warning(
"No free_instance function pointer available");
239 auto c =
static_cast<fmi2Component
>(instance);
240 fmi2Status status =
reset_(c);
241 if (status != fmi2OK) {
242 casadi_warning(
"fmi2Reset failed");
249 auto c =
static_cast<fmi2Component
>(instance);
251 if (status != fmi2OK) {
252 casadi_warning(
"fmi2EnterInitializationMode failed: " +
str(status));
259 auto c =
static_cast<fmi2Component
>(instance);
261 if (status != fmi2OK) {
262 casadi_warning(
"fmi2ExitInitializationMode failed");
269 auto c =
static_cast<fmi2Component
>(instance);
271 if (status != fmi2OK) {
272 casadi_warning(
"fmi2EnterContinuousTimeMode failed");
279 auto c =
static_cast<fmi2Component
>(instance);
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;
297 return status != fmi2OK;
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;
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;
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");
321 return status != fmi2OK;
325 auto c =
static_cast<fmi2Component
>(instance);
329 if (status != fmi2OK) {
330 casadi_warning(
"fmi2SetReal failed");
338 if (status != fmi2OK) {
339 casadi_warning(
"fmi2SetInteger failed");
347 if (status != fmi2OK) {
348 casadi_warning(
"fmi2SetBoolean failed");
353 for (
size_t k = 0; k <
vr_string_.size(); ++k) {
356 fmi2Status status =
set_string_(c, &vr, 1, &value);
357 if (status != fmi2OK) {
358 casadi_error(
"fmi2SetString failed for value reference " +
str(vr));
366 auto c =
static_cast<fmi2Component
>(instance);
371 if (status != fmi2OK) {
372 casadi_warning(
"fmi2GetReal failed");
380 if (status != fmi2OK) {
381 casadi_warning(
"fmi2GetInteger failed");
389 if (status != fmi2OK) {
390 casadi_warning(
"fmi2GetBoolean failed");
398 fmi2Status status =
set_string_(c, &vr, 1, &value);
399 if (status != fmi2OK) {
400 casadi_error(
"fmi2GetString failed for value reference " +
str(vr));
408 const std::vector<std::string>& name_in,
const InputStruct* in)
const {
432 (*stats)[
"aux"] = aux;
434 for (
size_t k = 0; k < name_in.size(); ++k) {
438 const std::vector<size_t>& iind =
ired_.at(in[k].ind);
440 std::vector<double> v(iind.size());
441 for (
size_t i = 0; i < v.size(); ++i) v[i] =
value_in_.at(iind[i]);
443 (*stats)[name_in[k]] = v;
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) {
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.
void free_instance(void *instance) const override
std::vector< fmi2ValueReference > vr_string_
void init(const DaeBuilderInternal *dae) override
fmi2ExitInitializationModeTYPE * exit_initialization_mode_
std::vector< fmi2Real > init_real_
std::vector< fmi2ValueReference > vr_boolean_
int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values) const override
std::vector< fmi2Boolean > init_boolean_
std::vector< std::string > vn_aux_integer_
void load_functions() override
~Fmu2() override
Destructor.
fmi2CallbackFunctions functions_
std::vector< std::string > vn_aux_string_
fmi2SetupExperimentTYPE * setup_experiment_
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)
std::vector< fmi2Integer > init_integer_
int set_real(void *instance, const unsigned int *vr, size_t n_vr, const double *values, size_t n_values) const override
fmi2EnterInitializationModeTYPE * enter_initialization_mode_
fmi2InstantiateTYPE * instantiate_
fmi2GetIntegerTYPE * get_integer_
fmi2GetBooleanTYPE * get_boolean_
void serialize_body(SerializingStream &s) const override
int get_aux(void *instance) override
std::string system_infix() const override
fmi2SetBooleanTYPE * set_boolean_
std::vector< std::string > vn_aux_real_
static Fmu2 * deserialize(DeserializingStream &s)
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
int exit_initialization_mode(void *instance) const override
fmi2SetStringTYPE * set_string_
fmi2SetIntegerTYPE * set_integer_
std::vector< fmi2ValueReference > vr_integer_
fmi2SetRealTYPE * set_real_
std::vector< std::string > vn_aux_boolean_
fmi2GetDirectionalDerivativeTYPE * get_directional_derivative_
int enter_initialization_mode(void *instance) const override
void * instantiate() const override
std::vector< fmi2ValueReference > vr_aux_string_
std::vector< fmi2ValueReference > vr_aux_integer_
std::vector< fmi2ValueReference > vr_real_
fmi2FreeInstanceTYPE * free_instance_
fmi2EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
fmi2NewDiscreteStatesTYPE * new_discrete_states_
int reset(void *instance)
int update_discrete_states(void *instance, EventMemory *eventmem) const override
int enter_continuous_time_mode(void *instance) const override
fmi2GetRealTYPE * get_real_
std::vector< fmi2ValueReference > vr_aux_real_
static void logger(fmi2ComponentEnvironment componentEnvironment, fmi2String instanceName, fmi2Status status, fmi2String category, fmi2String message,...)
int set_values(void *instance) const override
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
fmi2GetStringTYPE * get_string_
std::vector< std::string > init_string_
std::vector< fmi2ValueReference > vr_aux_boolean_
std::string instantiation_token_
std::vector< std::vector< size_t > > ired_
std::vector< std::string > aux_
virtual void serialize_body(SerializingStream &s) const
size_t n_in() const
Get the number of scheme inputs.
std::string resource_loc_
std::vector< double > value_in_
virtual void init(const DaeBuilderInternal *dae)
size_t n_out() const
Get the number of scheme outputs.
std::string instance_name_
bool provides_directional_derivatives_
Helper class for Serialization.
void version(const std::string &name, int v)
void pack(const Sparsity &e)
Serializes an object to the output stream.
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.
bool discrete_states_need_update
bool terminate_simulation
bool next_event_time_defined
bool nominals_of_continuous_states_changed
bool values_of_continuous_states_changed
std::vector< fmi2Boolean > v_boolean
std::vector< fmi2Real > v_real
std::vector< std::string > v_string
std::vector< fmi2Integer > v_integer
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.
unsigned int value_reference