27 #include "fmu_function.hpp"
28 #include "dae_builder_internal.hpp"
38 #if defined(__arm64__) || defined(__aarch64__)
42 if (
sizeof(
void*) == 4) {
50 if (
sizeof(
void*) == 4) {
63 #elif defined(__APPLE__)
71 return arch +
"-" + sys;
89 casadi_assert(v.
numel == 1,
"Vector variable support not implemented");
129 for (
auto&& s :
aux_) {
170 "fmi3InstantiateModelExchange");
171 free_instance_ = load_function<fmi3FreeInstanceTYPE>(
"fmi3FreeInstance");
172 reset_ = load_function<fmi3ResetTYPE>(
"fmi3Reset");
174 "fmi3EnterInitializationMode");
176 "fmi3ExitInitializationMode");
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");
194 load_function<fmi3GetAdjointDerivativeTYPE>(
"fmi3GetAdjointDerivative");
197 load_function<fmi3UpdateDiscreteStatesTYPE>(
"fmi3UpdateDiscreteStates");
201 fmi3Status status, fmi3String category, fmi3String message) {
203 uout() <<
"[" << category <<
"] " << message << std::endl;
211 fmi3Boolean visible = fmi3False;
212 fmi3InstanceEnvironment instanceEnvironment = 0;
215 if (c == 0) casadi_error(
"fmi3Instantiate failed");
221 auto c =
static_cast<fmi3Instance
>(instance);
224 casadi_warning(
"No free_instance function pointer available");
229 auto c =
static_cast<fmi3Instance
>(instance);
230 fmi3Status status =
reset_(c);
231 if (status != fmi3OK) {
232 casadi_warning(
"fmi3Reset failed");
239 auto c =
static_cast<fmi3Instance
>(instance);
241 if (status != fmi3OK) {
242 casadi_warning(
"fmi3EnterInitializationMode failed: " +
str(status));
249 auto c =
static_cast<fmi3Instance
>(instance);
251 if (status != fmi3OK) {
252 casadi_warning(
"fmi3ExitInitializationMode failed");
259 auto c =
static_cast<fmi3Instance
>(instance);
261 if (status != fmi3OK) {
262 casadi_warning(
"fmi3EnterContinuousTimeMode failed");
269 auto c =
static_cast<fmi3Instance
>(instance);
271 fmi3Boolean discreteStatesNeedUpdate, terminateSimulation, nominalsOfContinuousStatesChanged,
272 valuesOfContinuousStatesChanged, nextEventTimeDefined;
273 fmi3Float64 nextEventTime;
276 &nominalsOfContinuousStatesChanged, &valuesOfContinuousStatesChanged, &nextEventTimeDefined,
285 return status != fmi3OK;
289 const double* values,
size_t n_values)
const {
293 fmi3Status status =
set_time_(instance, *values);
294 if (status != fmi3OK)
return 1;
302 fmi3Status status =
set_float64_(instance, vr, n_vr, values, n_values);
303 return status != fmi3OK;
307 double* values,
size_t n_values)
const {
308 fmi3Status status =
get_float64_(instance, vr, n_vr, values, n_values);
309 return status != fmi3OK;
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 {
316 seed, n_seed, sensitivity, n_sensitivity);
317 return status != fmi3OK;
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 {
324 seed, n_seed, sensitivity, n_sensitivity);
325 return status != fmi3OK;
329 auto c =
static_cast<fmi3Instance
>(instance);
334 if (status != fmi3OK) {
335 casadi_warning(
"fmi3SetFloat64 failed");
343 if (status != fmi3OK) {
344 casadi_warning(
"fmi3SetInt32 failed");
350 casadi_error(
"Broken");
354 if (status != fmi3OK) {
355 casadi_warning(
"fmi3SetBoolean failed");
360 for (
size_t k = 0; k <
vr_string_.size(); ++k) {
363 fmi3Status status =
set_string_(c, &vr, 1, &value, 1);
364 if (status != fmi3OK) {
365 casadi_error(
"fmi3SetString failed for value reference " +
str(vr));
373 auto c =
static_cast<fmi3Instance
>(instance);
378 if (status != fmi3OK) {
379 casadi_warning(
"fmi3GetFloat64 failed");
387 if (status != fmi3OK) {
388 casadi_warning(
"fmi3GetInt32 failed");
394 casadi_error(
"Broken");
398 if (status != fmi3OK) {
399 casadi_warning(
"fmi3GetBoolean failed");
407 fmi3Status status =
set_string_(c, &vr, 1, &value, 1);
408 if (status != fmi3OK) {
409 casadi_error(
"fmi3GetString failed for value reference " +
str(vr));
417 const std::vector<std::string>& name_in,
const InputStruct* in)
const {
441 (*stats)[
"aux"] = aux;
443 for (
size_t k = 0; k < name_in.size(); ++k) {
447 const std::vector<size_t>& iind =
ired_.at(in[k].ind);
449 std::vector<double> v(iind.size());
450 for (
size_t i = 0; i < v.size(); ++i) v[i] =
value_in_.at(iind[i]);
452 (*stats)[name_in[k]] = v;
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) {
size_t n_variables() const
Length of variables array.
Variable & variable(size_t ind)
void * instantiate() 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_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_
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_
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_
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
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
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_
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.
std::string instance_name_
bool provides_directional_derivatives_
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