27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
33 struct CASADI_EXPORT Fmu3Memory :
public FmuMemory {
34 Fmu3::Value aux_value;
36 explicit Fmu3Memory(
const FmuFunction&
self) : FmuMemory(self) {}
41 auto m =
static_cast<Fmu3Memory*
>(mem);
51 return new Fmu3Memory(f);
55 delete static_cast<Fmu3Memory*
>(mem);
64 #if defined(__arm64__) || defined(__aarch64__)
68 if (
sizeof(
void*) == 4) {
75 #elif defined(__ppc64__) || defined(__powerpc64__)
78 #elif defined(__ppc__) || defined(__powerpc__)
82 if (
sizeof(
void*) == 4) {
95 #elif defined(__APPLE__)
103 return arch +
"-" + sys;
121 casadi_assert(v.
numel == 1,
"Vector variable support not implemented");
125 if (!v.
is_set())
continue;
161 for (
auto&& s :
aux_) {
207 "fmi3InstantiateModelExchange");
208 free_instance_ = load_function<fmi3FreeInstanceTYPE>(
"fmi3FreeInstance");
209 reset_ = load_function<fmi3ResetTYPE>(
"fmi3Reset");
211 "fmi3EnterInitializationMode");
213 "fmi3ExitInitializationMode");
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");
231 load_function<fmi3GetAdjointDerivativeTYPE>(
"fmi3GetAdjointDerivative");
234 load_function<fmi3UpdateDiscreteStatesTYPE>(
"fmi3UpdateDiscreteStates");
238 fmi3Status status, fmi3String category, fmi3String message) {
240 uout() <<
"[" << category <<
"] " << message << std::endl;
248 fmi3Boolean visible = fmi3False;
249 fmi3InstanceEnvironment instanceEnvironment = 0;
252 if (c == 0) casadi_error(
"fmi3Instantiate failed");
258 auto c =
static_cast<fmi3Instance
>(instance);
261 casadi_warning(
"No free_instance function pointer available");
266 auto c =
static_cast<fmi3Instance
>(instance);
267 fmi3Status status =
reset_(c);
268 if (status != fmi3OK) {
269 casadi_warning(
"fmi3Reset failed");
276 auto c =
static_cast<fmi3Instance
>(instance);
278 if (status != fmi3OK) {
279 casadi_warning(
"fmi3EnterInitializationMode failed: " +
str(status));
286 auto c =
static_cast<fmi3Instance
>(instance);
288 if (status != fmi3OK) {
289 casadi_warning(
"fmi3ExitInitializationMode failed");
296 auto c =
static_cast<fmi3Instance
>(instance);
298 if (status != fmi3OK) {
299 casadi_warning(
"fmi3EnterContinuousTimeMode failed");
306 auto c =
static_cast<fmi3Instance
>(instance);
308 fmi3Boolean discreteStatesNeedUpdate, terminateSimulation, nominalsOfContinuousStatesChanged,
309 valuesOfContinuousStatesChanged, nextEventTimeDefined;
310 fmi3Float64 nextEventTime;
313 &nominalsOfContinuousStatesChanged, &valuesOfContinuousStatesChanged, &nextEventTimeDefined,
322 return status != fmi3OK;
330 const double* values,
size_t n_values)
const {
334 fmi3Status status =
set_time_(instance, *values);
335 if (status != fmi3OK)
return 1;
343 fmi3Status status =
set_float64_(instance, vr, n_vr, values, n_values);
344 return status != fmi3OK;
348 double* values,
size_t n_values)
const {
349 fmi3Status status =
get_float64_(instance, vr, n_vr, values, n_values);
350 return status != fmi3OK;
354 const unsigned int* vr_in,
size_t n_in,
const double* seed,
size_t n_seed,
355 double* sensitivity,
size_t n_sensitivity)
const {
357 seed, n_seed, sensitivity, n_sensitivity);
358 return status != fmi3OK;
362 const unsigned int* vr_in,
size_t n_in,
const double* seed,
size_t n_seed,
363 double* sensitivity,
size_t n_sensitivity)
const {
365 seed, n_seed, sensitivity, n_sensitivity);
366 return status != fmi3OK;
370 auto c =
static_cast<fmi3Instance
>(instance);
375 if (status != fmi3OK) {
376 casadi_warning(
"fmi3SetFloat64 failed");
384 if (status != fmi3OK) {
385 casadi_warning(
"fmi3SetInt32 failed");
391 casadi_error(
"Broken");
395 if (status != fmi3OK) {
396 casadi_warning(
"fmi3SetBoolean failed");
401 for (
size_t k = 0; k <
vr_string_.size(); ++k) {
404 fmi3Status status =
set_string_(c, &vr, 1, &value, 1);
405 if (status != fmi3OK) {
406 casadi_error(
"fmi3SetString failed for value reference " +
str(vr));
418 auto c =
static_cast<fmi3Instance
>(instance);
423 if (status != fmi3OK) {
424 casadi_warning(
"fmi3GetFloat64 failed");
432 if (status != fmi3OK) {
433 casadi_warning(
"fmi3GetInt32 failed");
439 casadi_error(
"Broken");
443 if (status != fmi3OK) {
444 casadi_warning(
"fmi3GetBoolean failed");
451 fmi3String value = aux_value.
v_string.at(k).c_str();
452 fmi3Status status =
set_string_(c, &vr, 1, &value, 1);
453 if (status != fmi3OK) {
454 casadi_error(
"fmi3GetString failed for value reference " +
str(vr));
462 const std::vector<std::string>& name_in,
const InputStruct* in)
const {
463 Value& v =
static_cast<Fmu3Memory*
>(m)->aux_value;
484 (*stats)[
"aux"] = aux;
486 for (
size_t k = 0; k < name_in.size(); ++k) {
490 const std::vector<size_t>& iind =
ired_.at(in[k].ind);
492 std::vector<double> v(iind.size());
493 for (
size_t i = 0; i < v.size(); ++i) v[i] =
value_in_.at(iind[i]);
495 (*stats)[name_in[k]] = v;
501 const std::vector<std::string>& scheme_in,
502 const std::vector<std::string>& scheme_out,
503 const std::map<std::string, std::vector<size_t>>& scheme,
504 const std::vector<std::string>& aux)
505 :
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 * instantiate() const override
void serialize_body(SerializingStream &s) const override
std::vector< fmi3ValueReference > vr_string_
fmi3InstantiateModelExchangeTYPE * instantiate_model_exchange_
int exit_initialization_mode(void *instance) const override
void free_instance(void *instance) const override
int get_aux_impl(void *instance, Value &aux_value) const
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
std::string system_infix() const override
fmi3ExitInitializationModeTYPE * exit_initialization_mode_
int get_real(void *instance, const unsigned int *vr, size_t n_vr, double *values, size_t n_values) const override
std::vector< fmi3ValueReference > vr_aux_real_
std::vector< std::string > vn_aux_boolean_
std::vector< fmi3ValueReference > vr_boolean_
~Fmu3() override
Destructor.
std::vector< fmi3ValueReference > vr_aux_string_
fmi3GetStringTYPE * get_string_
fmi3SetFloat64TYPE * set_float64_
std::vector< fmi3Boolean > init_boolean_
fmi3SetInt32TYPE * set_int32_
FmuMemory * alloc_mem(const FmuFunction &f) const override
Create memory block.
void load_functions() override
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)
std::vector< fmi3Int32 > init_integer_
std::vector< std::string > vn_aux_real_
static Fmu3 * deserialize(DeserializingStream &s)
fmi3EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
std::vector< std::string > init_string_
static void log_message_callback(fmi3InstanceEnvironment instanceEnvironment, fmi3Status status, fmi3String category, fmi3String message)
fmi3GetInt32TYPE * get_int32_
int set_real(void *instance, const unsigned int *vr, size_t n_vr, const double *values, size_t n_values) const override
fmi3SetStringTYPE * set_string_
std::vector< fmi3ValueReference > vr_integer_
fmi3SetTimeTYPE * set_time_
std::vector< std::string > vn_aux_integer_
std::vector< fmi3ValueReference > vr_real_
fmi3GetFloat64TYPE * get_float64_
int reset(void *instance)
fmi3SetBooleanTYPE * set_boolean_
std::vector< fmi3ValueReference > vr_aux_boolean_
std::vector< fmi3ValueReference > vr_aux_integer_
fmi3GetDirectionalDerivativeTYPE * get_directional_derivative_
void free_mem(void *mem) const override
Free memory block.
fmi3GetBooleanTYPE * get_boolean_
int set_values(void *instance) const override
int update_discrete_states(void *instance, EventMemory *eventmem) const override
int get_aux(void *instance) override
std::vector< fmi3Float64 > init_real_
int enter_continuous_time_mode(void *instance) const override
int init_mem(FmuMemory *m) const override
Initalize memory block.
fmi3GetAdjointDerivativeTYPE * get_adjoint_derivative_
std::vector< std::string > vn_aux_string_
void init(const DaeBuilderInternal *dae) override
fmi3UpdateDiscreteStatesTYPE * update_discrete_states_
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
int get_derivatives(void *instance, double *derivatives, size_t nx) const override
fmi3FreeInstanceTYPE * free_instance_
fmi3EnterInitializationModeTYPE * enter_initialization_mode_
void get_stats(FmuMemory *m, Dict *stats, const std::vector< std::string > &name_in, const InputStruct *in) const override
Get stats.
int enter_initialization_mode(void *instance) const override
std::string instantiation_token_
bool provides_adjoint_derivatives_
std::vector< std::vector< size_t > > ired_
std::vector< std::string > aux_
virtual void serialize_body(SerializingStream &s) const
std::vector< unsigned int > vr_in_
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.
virtual int init_mem(FmuMemory *m) const
Initalize memory block.
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< fmi3Float64 > v_real
std::vector< std::string > v_string
std::vector< fmi3Boolean > v_boolean
std::vector< fmi3Int32 > 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