fmu2.hpp
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 #ifndef CASADI_FMU2_HPP
26 #define CASADI_FMU2_HPP
27 
28 #include "fmu_impl.hpp"
29 
30 #include <fmi2Functions.h>
31 
33 
34 namespace casadi {
35 
42 class CASADI_EXPORT Fmu2 : public FmuInternal {
43  public:
44  // Constructor
45  Fmu2(const std::string& name,
46  const std::vector<std::string>& scheme_in, const std::vector<std::string>& scheme_out,
47  const std::map<std::string, std::vector<size_t>>& scheme, const std::vector<std::string>& aux);
48 
50  ~Fmu2() override;
51 
55  std::string class_name() const override { return "Fmu2";}
56 
57  // Initialize
58  void init(const DaeBuilderInternal* dae) override;
59 
63  int init_mem(FmuMemory* m) const override;
64 
68  FmuMemory* alloc_mem(const FmuFunction& f) const override;
69 
73  void free_mem(void *mem) const override;
74 
75  // Finalize
76  void finalize() override;
77 
78  // Set C API functions
79  void load_functions() override;
80 
81  // Variables used for initialization, by type
82  std::vector<fmi2ValueReference> vr_real_, vr_integer_, vr_boolean_, vr_string_;
83  std::vector<fmi2Real> init_real_;
84  std::vector<fmi2Integer> init_integer_;
85  std::vector<fmi2Boolean> init_boolean_;
86  std::vector<std::string> init_string_;
87 
88  // Auxilliary variables, by type
89  std::vector<std::string> vn_aux_real_, vn_aux_integer_, vn_aux_boolean_, vn_aux_string_;
90  std::vector<fmi2ValueReference> vr_aux_real_, vr_aux_integer_, vr_aux_boolean_, vr_aux_string_;
91 
92  // Following members set in finalize
93 
94  // FMU C API function prototypes. Cf. FMI specification 2.0.2
95  fmi2InstantiateTYPE* instantiate_;
96  fmi2FreeInstanceTYPE* free_instance_;
97  fmi2ResetTYPE* reset_;
98  fmi2SetupExperimentTYPE* setup_experiment_;
99  fmi2EnterInitializationModeTYPE* enter_initialization_mode_;
100  fmi2ExitInitializationModeTYPE* exit_initialization_mode_;
101  fmi2EnterContinuousTimeModeTYPE* enter_continuous_time_mode_;
102  fmi2GetDerivativesTYPE* get_derivatives_;
103  fmi2SetTimeTYPE* set_time_;
104  fmi2GetRealTYPE* get_real_;
105  fmi2SetRealTYPE* set_real_;
106  fmi2GetBooleanTYPE* get_boolean_;
107  fmi2SetBooleanTYPE* set_boolean_;
108  fmi2GetIntegerTYPE* get_integer_;
109  fmi2SetIntegerTYPE* set_integer_;
110  fmi2GetStringTYPE* get_string_;
111  fmi2SetStringTYPE* set_string_;
112  fmi2GetDirectionalDerivativeTYPE* get_directional_derivative_;
113  fmi2NewDiscreteStatesTYPE* new_discrete_states_;
114 
115  // Callback functions
116  fmi2CallbackFunctions functions_;
117 
118  // Collection of variable values, all types
119  struct Value {
120  std::vector<fmi2Real> v_real;
121  std::vector<fmi2Integer> v_integer;
122  std::vector<fmi2Boolean> v_boolean;
123  std::vector<std::string> v_string;
124  };
125 
127 
128  // Name of system, per the FMI specification
129  std::string system_infix() const override;
130 
131  // New memory object
132  void* instantiate() const override;
133 
134  // Free FMU instance
135  void free_instance(void* instance) const override;
136 
137  // Reset solver
138  int reset(void* instance);
139 
140  // Enter initialization mode
141  int enter_initialization_mode(void* instance) const override;
142 
143  // Exit initialization mode
144  int exit_initialization_mode(void* instance) const override;
145 
146  // Enter continuous-time mode
147  int enter_continuous_time_mode(void* instance) const override;
148 
149  // Update discrete states
150  int update_discrete_states(void* instance, EventMemory* eventmem) const override;
151 
152  int get_derivatives(void* instance, double* derivatives, size_t nx) const override;
153 
154  // Set real values
155  int set_real(void* instance, const unsigned int* vr, size_t n_vr,
156  const double* values, size_t n_values) const override;
157 
158  // Get/evaluate real values
159  int get_real(void* instance, const unsigned int* vr, size_t n_vr,
160  double* values, size_t n_values) const override;
161 
162  // Forward mode AD
163  int get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
164  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
165  double* sensitivity, size_t n_sensitivity) const override;
166 
167  // Copy values set in DaeBuilder to FMU
168  int set_values(void* instance) const override;
169 
170  // Retrieve auxilliary variables from FMU
171  int get_aux(void* instance) override;
172 
173  // Retrieve auxilliary variables from FMU, implementation
174  int get_aux_impl(void* instance, Value& aux_value) const;
175 
179  void get_stats(FmuMemory* m, Dict* stats,
180  const std::vector<std::string>& name_in, const InputStruct* in) const override;
181 
182  // Process message
183  static void logger(fmi2ComponentEnvironment componentEnvironment,
184  fmi2String instanceName,
185  fmi2Status status,
186  fmi2String category,
187  fmi2String message, ...);
188 
189  void serialize_body(SerializingStream& s) const override;
190 
191  static Fmu2* deserialize(DeserializingStream& s);
192 
193  protected:
194  explicit Fmu2(DeserializingStream& s);
195 };
196 
197 } // namespace casadi
198 
200 
201 #endif // CASADI_FMU2_HPP
Helper class for Serialization.
Interface to a binary FMU, adhering to FMI version 2.0.
Definition: fmu2.hpp:42
fmi2ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu2.hpp:100
std::vector< fmi2Real > init_real_
Definition: fmu2.hpp:83
std::vector< fmi2ValueReference > vr_boolean_
Definition: fmu2.hpp:82
std::vector< fmi2Boolean > init_boolean_
Definition: fmu2.hpp:85
fmi2CallbackFunctions functions_
Definition: fmu2.hpp:116
fmi2SetupExperimentTYPE * setup_experiment_
Definition: fmu2.hpp:98
std::vector< fmi2Integer > init_integer_
Definition: fmu2.hpp:84
fmi2EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu2.hpp:99
fmi2InstantiateTYPE * instantiate_
Definition: fmu2.hpp:95
fmi2GetIntegerTYPE * get_integer_
Definition: fmu2.hpp:108
fmi2SetTimeTYPE * set_time_
Definition: fmu2.hpp:103
fmi2GetBooleanTYPE * get_boolean_
Definition: fmu2.hpp:106
fmi2ResetTYPE * reset_
Definition: fmu2.hpp:97
fmi2SetBooleanTYPE * set_boolean_
Definition: fmu2.hpp:107
fmi2SetStringTYPE * set_string_
Definition: fmu2.hpp:111
fmi2SetIntegerTYPE * set_integer_
Definition: fmu2.hpp:109
fmi2SetRealTYPE * set_real_
Definition: fmu2.hpp:105
std::vector< std::string > vn_aux_boolean_
Definition: fmu2.hpp:89
fmi2GetDirectionalDerivativeTYPE * get_directional_derivative_
Definition: fmu2.hpp:112
fmi2GetDerivativesTYPE * get_derivatives_
Definition: fmu2.hpp:102
fmi2FreeInstanceTYPE * free_instance_
Definition: fmu2.hpp:96
fmi2EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu2.hpp:101
Value aux_value_
Definition: fmu2.hpp:126
std::string class_name() const override
Get type name.
Definition: fmu2.hpp:55
fmi2NewDiscreteStatesTYPE * new_discrete_states_
Definition: fmu2.hpp:113
fmi2GetRealTYPE * get_real_
Definition: fmu2.hpp:104
fmi2GetStringTYPE * get_string_
Definition: fmu2.hpp:110
std::vector< std::string > init_string_
Definition: fmu2.hpp:86
std::vector< fmi2ValueReference > vr_aux_boolean_
Definition: fmu2.hpp:90
Interface to binary FMU.
Definition: fmu_impl.hpp:61
Helper class for Serialization.
The casadi namespace.
Definition: archiver.cpp:28
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::vector< fmi2Boolean > v_boolean
Definition: fmu2.hpp:122
std::vector< fmi2Real > v_real
Definition: fmu2.hpp:120
std::vector< std::string > v_string
Definition: fmu2.hpp:123
std::vector< fmi2Integer > v_integer
Definition: fmu2.hpp:121