fmu3.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_FMU3_HPP
26 #define CASADI_FMU3_HPP
27 
28 #include "fmu_impl.hpp"
29 
30 #include <fmi3Functions.h>
31 
33 
34 namespace casadi {
35 
42 class CASADI_EXPORT Fmu3 : public FmuInternal {
43  public:
44  // Constructor
45  Fmu3(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  ~Fmu3() override;
51 
55  std::string class_name() const override { return "Fmu3";}
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<fmi3ValueReference> vr_real_, vr_integer_, vr_boolean_, vr_string_;
83  std::vector<fmi3Float64> init_real_;
84  std::vector<fmi3Int32> init_integer_;
85  std::vector<fmi3Boolean> 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<fmi3ValueReference> vr_aux_real_, vr_aux_integer_, vr_aux_boolean_, vr_aux_string_;
91  std::vector<casadi_int> off_aux_real_, off_aux_integer_, off_aux_boolean_, off_aux_string_;
92 
93  // Following members set in finalize
94 
95  // FMU C API function prototypes. Cf. FMI specification 2.0.2
96  fmi3InstantiateModelExchangeTYPE* instantiate_model_exchange_;
97  fmi3FreeInstanceTYPE* free_instance_;
98  fmi3ResetTYPE* reset_;
99  fmi3EnterInitializationModeTYPE* enter_initialization_mode_;
100  fmi3ExitInitializationModeTYPE* exit_initialization_mode_;
101  fmi3EnterContinuousTimeModeTYPE* enter_continuous_time_mode_;
102  fmi3SetTimeTYPE* set_time_;
103  fmi3GetFloat64TYPE* get_float64_;
104  fmi3SetFloat64TYPE* set_float64_;
105  fmi3GetBooleanTYPE* get_boolean_;
106  fmi3SetBooleanTYPE* set_boolean_;
107  fmi3GetInt32TYPE* get_int32_;
108  fmi3SetInt32TYPE* set_int32_;
109  fmi3GetStringTYPE* get_string_;
110  fmi3SetStringTYPE* set_string_;
111  fmi3GetDirectionalDerivativeTYPE* get_directional_derivative_;
112  fmi3GetAdjointDerivativeTYPE* get_adjoint_derivative_;
113  fmi3UpdateDiscreteStatesTYPE* update_discrete_states_;
114 
115  // Collection of variable values, all types
116  struct Value {
117  std::vector<fmi3Float64> v_real;
118  std::vector<fmi3Int32> v_integer;
119  std::vector<fmi3Boolean> v_boolean;
120  std::vector<std::string> v_string;
121  };
122 
123  Value aux_value_;
124 
125  // Name of system, per the FMI specification
126  static std::string dll_infix();
127  std::string system_infix() const override { return dll_infix(); }
128 
129  // New memory object
130  void* instantiate() const override;
131 
132  // Free FMU instance
133  void free_instance(void* instance) const override;
134 
135  // Reset solver
136  int reset(void* instance);
137 
138  // Enter initialization mode
139  int enter_initialization_mode(void* instance) const override;
140 
141  // Exit initialization mode
142  int exit_initialization_mode(void* instance) const override;
143 
144  // Enter continuous-time mode
145  int enter_continuous_time_mode(void* instance) const override;
146 
147  // Update discrete states
148  int update_discrete_states(void* instance, EventMemory* eventmem) const override;
149 
150  int get_derivatives(void* instance, double* derivatives, size_t nx) const override;
151 
152  // Set current time
153  int set_time(void* instance, double t) const override;
154 
155  // Set real values
156  int set_real(void* instance, const unsigned int* vr, size_t n_vr,
157  const double* values, size_t n_values) const override;
158 
159  // Get/evaluate real values
160  int get_real(void* instance, const unsigned int* vr, size_t n_vr,
161  double* values, size_t n_values, FmuMemory* m = nullptr) const override;
162 
163  // Forward mode AD
164  int get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
165  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
166  double* sensitivity, size_t n_sensitivity) const override;
167 
168  // Reverse mode AD
169  int get_adjoint_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
170  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
171  double* sensitivity, size_t n_sensitivity) const override;
172 
173  // Copy values set in DaeBuilder to FMU
174  int set_values(void* instance) const override;
175 
176  // Retrieve auxilliary variables from FMU
177  int get_aux(void* instance) override;
178 
179  // Retrieve auxilliary variables from FMU, implementation
180  int get_aux_impl(void* instance, Value& aux_value) const;
181 
185  void get_stats(FmuMemory* m, Dict* stats,
186  const std::vector<std::string>& name_in, const InputStruct* in) const override;
187 
188  // Process message
189  static void log_message_callback(fmi3InstanceEnvironment instanceEnvironment,
190  fmi3Status status, fmi3String category, fmi3String message);
191 
192  void serialize_body(SerializingStream& s) const override;
193 
194  static Fmu3* deserialize(DeserializingStream& s);
195 
196  protected:
197  explicit Fmu3(DeserializingStream& s);
198 };
199 
200 } // namespace casadi
201 
203 
204 #endif // CASADI_FMU3_HPP
The casadi namespace.
Definition: archiver.hpp:32
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.