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 
60  // Set C API functions
61  void load_functions() override;
62 
63  // Variables used for initialization, by type
64  std::vector<fmi3ValueReference> vr_real_, vr_integer_, vr_boolean_, vr_string_;
65  std::vector<fmi3Float64> init_real_;
66  std::vector<fmi3Int32> init_integer_;
67  std::vector<fmi3Boolean> init_boolean_;
68  std::vector<std::string> init_string_;
69 
70  // Auxilliary variables, by type
71  std::vector<std::string> vn_aux_real_, vn_aux_integer_, vn_aux_boolean_, vn_aux_string_;
72  std::vector<fmi3ValueReference> vr_aux_real_, vr_aux_integer_, vr_aux_boolean_, vr_aux_string_;
73 
74  // Following members set in finalize
75 
76  // FMU C API function prototypes. Cf. FMI specification 2.0.2
77  fmi3InstantiateModelExchangeTYPE* instantiate_model_exchange_;
78  fmi3FreeInstanceTYPE* free_instance_;
79  fmi3ResetTYPE* reset_;
80  fmi3EnterInitializationModeTYPE* enter_initialization_mode_;
81  fmi3ExitInitializationModeTYPE* exit_initialization_mode_;
82  fmi3EnterContinuousTimeModeTYPE* enter_continuous_time_mode_;
83  fmi3SetTimeTYPE* set_time_;
84  fmi3GetFloat64TYPE* get_float64_;
85  fmi3SetFloat64TYPE* set_float64_;
86  fmi3GetBooleanTYPE* get_boolean_;
87  fmi3SetBooleanTYPE* set_boolean_;
88  fmi3GetInt32TYPE* get_int32_;
89  fmi3SetInt32TYPE* set_int32_;
90  fmi3GetStringTYPE* get_string_;
91  fmi3SetStringTYPE* set_string_;
92  fmi3GetDirectionalDerivativeTYPE* get_directional_derivative_;
93  fmi3GetAdjointDerivativeTYPE* get_adjoint_derivative_;
94  fmi3UpdateDiscreteStatesTYPE* update_discrete_states_;
95 
96  // Collection of variable values, all types
97  struct Value {
98  std::vector<fmi3Float64> v_real;
99  std::vector<fmi3Int32> v_integer;
100  std::vector<fmi3Boolean> v_boolean;
101  std::vector<std::string> v_string;
102  };
103 
105 
106  // Name of system, per the FMI specification
107  std::string system_infix() const override;
108 
109  // New memory object
110  void* instantiate() const override;
111 
112  // Free FMU instance
113  void free_instance(void* instance) const override;
114 
115  // Reset solver
116  int reset(void* instance);
117 
118  // Enter initialization mode
119  int enter_initialization_mode(void* instance) const override;
120 
121  // Exit initialization mode
122  int exit_initialization_mode(void* instance) const override;
123 
124  // Enter continuous-time mode
125  int enter_continuous_time_mode(void* instance) const override;
126 
127  // Update discrete states
128  int update_discrete_states(void* instance, EventMemory* eventmem) const override;
129 
130  // Set real values
131  int set_real(void* instance, const unsigned int* vr, size_t n_vr,
132  const double* values, size_t n_values) const override;
133 
134  // Get/evaluate real values
135  int get_real(void* instance, const unsigned int* vr, size_t n_vr,
136  double* values, size_t n_values) const override;
137 
138  // Forward mode AD
139  int get_directional_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
140  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
141  double* sensitivity, size_t n_sensitivity) const override;
142 
143  // Reverse mode AD
144  int get_adjoint_derivative(void* instance, const unsigned int* vr_out, size_t n_out,
145  const unsigned int* vr_in, size_t n_in, const double* seed, size_t n_seed,
146  double* sensitivity, size_t n_sensitivity) const override;
147 
148  // Copy values set in DaeBuilder to FMU
149  int set_values(void* instance) const override;
150 
151  // Retrieve auxilliary variables from FMU
152  int get_aux(void* instance) override;
153 
157  void get_stats(FmuMemory* m, Dict* stats,
158  const std::vector<std::string>& name_in, const InputStruct* in) const override;
159 
160  // Process message
161  static void log_message_callback(fmi3InstanceEnvironment instanceEnvironment,
162  fmi3Status status, fmi3String category, fmi3String message);
163 };
164 
165 } // namespace casadi
166 
168 
169 #endif // CASADI_FMU3_HPP
Interface to a binary FMU, adhering to FMI version 2.0.
Definition: fmu3.hpp:42
fmi3InstantiateModelExchangeTYPE * instantiate_model_exchange_
Definition: fmu3.hpp:77
Value aux_value_
Definition: fmu3.hpp:104
fmi3ExitInitializationModeTYPE * exit_initialization_mode_
Definition: fmu3.hpp:81
std::vector< std::string > vn_aux_boolean_
Definition: fmu3.hpp:71
std::vector< fmi3ValueReference > vr_boolean_
Definition: fmu3.hpp:64
fmi3GetStringTYPE * get_string_
Definition: fmu3.hpp:90
fmi3SetFloat64TYPE * set_float64_
Definition: fmu3.hpp:85
std::vector< fmi3Boolean > init_boolean_
Definition: fmu3.hpp:67
fmi3SetInt32TYPE * set_int32_
Definition: fmu3.hpp:89
std::vector< fmi3Int32 > init_integer_
Definition: fmu3.hpp:66
fmi3EnterContinuousTimeModeTYPE * enter_continuous_time_mode_
Definition: fmu3.hpp:82
std::vector< std::string > init_string_
Definition: fmu3.hpp:68
fmi3GetInt32TYPE * get_int32_
Definition: fmu3.hpp:88
fmi3SetStringTYPE * set_string_
Definition: fmu3.hpp:91
fmi3SetTimeTYPE * set_time_
Definition: fmu3.hpp:83
fmi3GetFloat64TYPE * get_float64_
Definition: fmu3.hpp:84
fmi3SetBooleanTYPE * set_boolean_
Definition: fmu3.hpp:87
std::vector< fmi3ValueReference > vr_aux_boolean_
Definition: fmu3.hpp:72
fmi3GetDirectionalDerivativeTYPE * get_directional_derivative_
Definition: fmu3.hpp:92
fmi3GetBooleanTYPE * get_boolean_
Definition: fmu3.hpp:86
std::vector< fmi3Float64 > init_real_
Definition: fmu3.hpp:65
fmi3ResetTYPE * reset_
Definition: fmu3.hpp:79
fmi3GetAdjointDerivativeTYPE * get_adjoint_derivative_
Definition: fmu3.hpp:93
fmi3UpdateDiscreteStatesTYPE * update_discrete_states_
Definition: fmu3.hpp:94
std::string class_name() const override
Get type name.
Definition: fmu3.hpp:55
fmi3FreeInstanceTYPE * free_instance_
Definition: fmu3.hpp:78
fmi3EnterInitializationModeTYPE * enter_initialization_mode_
Definition: fmu3.hpp:80
Interface to binary FMU.
Definition: fmu_impl.hpp:60
The casadi namespace.
Definition: archiver.cpp:28
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
std::vector< fmi3Float64 > v_real
Definition: fmu3.hpp:98
std::vector< std::string > v_string
Definition: fmu3.hpp:101
std::vector< fmi3Boolean > v_boolean
Definition: fmu3.hpp:100
std::vector< fmi3Int32 > v_integer
Definition: fmu3.hpp:99