39 #include "adevs_hybrid.h" 40 #include "fmi2Functions.h" 41 #include "fmi2FunctionTypes.h" 42 #include "fmi2TypesPlatform.h" 47 #define OPEN_LIB(name) LoadLibrary(name) 48 #define GET_FUNC(hndl,name) GetProcAddress(hndl,name) 49 #define CLOSE_LIB(hndl) FreeLibrary(hndl) 52 #define OPEN_LIB(name) dlopen(name,RTLD_LAZY) 53 #define GET_FUNC(hndl,name) dlsym(hndl,name) 54 #define CLOSE_LIB(hndl) dlclose(hndl) 71 template <
typename X>
class FMI:
81 FMI(
const char* modelname,
83 int num_state_variables,
84 int num_event_indicators,
85 const char* shared_lib_name,
86 const double tolerance = 1E-8,
87 int num_extra_event_indicators = 0,
88 double start_time = 0.0);
90 virtual void init(
double* q);
92 virtual void der_func(
const double* q,
double* dq);
111 const bool* state_event);
128 virtual void output_func(
const double *q,
const bool* state_event,
138 double get_time()
const {
return t_now; }
140 double get_real(
int k);
142 void set_real(
int k,
double val);
146 void set_int(
int k,
int val);
148 bool get_bool(
int k);
150 void set_bool(
int k,
bool val);
152 std::string get_string(
int k);
154 void set_string(
int k, std::string& val);
159 fmi2Component (*_fmi2Instantiate)(fmi2String, fmi2Type,
160 fmi2String, fmi2String,
const fmi2CallbackFunctions*,
161 fmi2Boolean, fmi2Boolean);
162 void (*_fmi2FreeInstance)(fmi2Component);
163 fmi2Status (*_fmi2SetupExperiment)(fmi2Component, fmi2Boolean,
164 fmi2Real, fmi2Real, fmi2Boolean, fmi2Real);
165 fmi2Status (*_fmi2EnterInitializationMode)(fmi2Component);
166 fmi2Status (*_fmi2ExitInitializationMode)(fmi2Component);
167 fmi2Status (*_fmi2GetReal)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Real*);
168 fmi2Status (*_fmi2GetInteger)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Integer*);
169 fmi2Status (*_fmi2GetBoolean)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Boolean*);
170 fmi2Status (*_fmi2GetString)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2String*);
171 fmi2Status (*_fmi2SetReal)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Real*);
172 fmi2Status (*_fmi2SetInteger)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Integer*);
173 fmi2Status (*_fmi2SetBoolean)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Boolean*);
174 fmi2Status (*_fmi2SetString)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2String*);
175 fmi2Status (*_fmi2EnterEventMode)(fmi2Component);
176 fmi2Status (*_fmi2NewDiscreteStates)(fmi2Component,fmi2EventInfo*);
177 fmi2Status (*_fmi2EnterContinuousTimeMode)(fmi2Component);
178 fmi2Status (*_fmi2CompletedIntegratorStep)(fmi2Component, fmi2Boolean, fmi2Boolean*, fmi2Boolean*);
179 fmi2Status (*_fmi2SetTime)(fmi2Component, fmi2Real);
180 fmi2Status (*_fmi2SetContinuousStates)(fmi2Component,
const fmi2Real*, size_t);
181 fmi2Status (*_fmi2GetDerivatives)(fmi2Component, fmi2Real*, size_t);
182 fmi2Status (*_fmi2GetEventIndicators)(fmi2Component, fmi2Real*, size_t);
183 fmi2Status (*_fmi2GetContinuousStates)(fmi2Component, fmi2Real*, size_t);
186 double next_time_event;
198 int num_extra_event_indicators;
202 static void fmilogger(
203 fmi2ComponentEnvironment componentEnvironment,
204 fmi2String instanceName,
207 fmi2String message,...)
209 if (message != NULL){
211 fprintf(stderr, message,
"\n");
215 fmi2CallbackFunctions* callbackFuncs;
217 void iterate_events();
220 template <
typename X>
223 int num_state_variables,
224 int num_event_indicators,
225 const char* so_file_name,
226 const double tolerance,
227 int num_extra_event_indicators,
230 ode_system<X>(num_state_variables+1,num_event_indicators+num_extra_event_indicators),
231 next_time_event(adevs_inf<double>()),
234 cont_time_mode(false),
235 num_extra_event_indicators(num_extra_event_indicators)
238 callbackFuncs =
new fmi2CallbackFunctions(tmp);
239 so_hndl = OPEN_LIB(so_file_name);
245 _fmi2Instantiate = (fmi2Component (*)(fmi2String, fmi2Type,
246 fmi2String, fmi2String,
const fmi2CallbackFunctions*,
247 fmi2Boolean, fmi2Boolean))GET_FUNC(so_hndl,
"fmi2Instantiate");
248 assert(_fmi2Instantiate != NULL);
249 _fmi2FreeInstance = (void (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2FreeInstance");
250 assert(_fmi2FreeInstance != NULL);
251 _fmi2SetupExperiment = (fmi2Status (*)(fmi2Component, fmi2Boolean,
252 fmi2Real, fmi2Real, fmi2Boolean, fmi2Real))GET_FUNC(so_hndl,
"fmi2SetupExperiment");
253 assert(_fmi2SetupExperiment != NULL);
254 _fmi2EnterInitializationMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterInitializationMode");
255 assert(_fmi2EnterInitializationMode != NULL);
256 _fmi2ExitInitializationMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2ExitInitializationMode");
257 assert(_fmi2ExitInitializationMode != NULL);
258 _fmi2GetReal = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Real*))
259 GET_FUNC(so_hndl,
"fmi2GetReal");
260 assert(_fmi2GetReal != NULL);
261 _fmi2GetInteger = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Integer*))
262 GET_FUNC(so_hndl,
"fmi2GetInteger");
263 assert(_fmi2GetInteger != NULL);
264 _fmi2GetBoolean = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Boolean*))
265 GET_FUNC(so_hndl,
"fmi2GetBoolean");
266 assert(_fmi2GetBoolean != NULL);
267 _fmi2GetString = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2String*))
268 GET_FUNC(so_hndl,
"fmi2GetString");
269 assert(_fmi2GetString != NULL);
270 _fmi2SetReal = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Real*))
271 GET_FUNC(so_hndl,
"fmi2SetReal");
272 assert(_fmi2SetReal != NULL);
273 _fmi2SetInteger = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Integer*))
274 GET_FUNC(so_hndl,
"fmi2SetInteger");
275 assert(_fmi2SetInteger != NULL);
276 _fmi2SetBoolean = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Boolean*))
277 GET_FUNC(so_hndl,
"fmi2SetBoolean");
278 assert(_fmi2SetBoolean != NULL);
279 _fmi2SetString = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2String*))
280 GET_FUNC(so_hndl,
"fmi2SetString");
281 assert(_fmi2SetString != NULL);
282 _fmi2EnterEventMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterEventMode");
283 assert(_fmi2EnterEventMode != NULL);
284 _fmi2NewDiscreteStates = (fmi2Status (*)(fmi2Component,fmi2EventInfo*))GET_FUNC(so_hndl,
"fmi2NewDiscreteStates");
285 assert(_fmi2NewDiscreteStates != NULL);
286 _fmi2EnterContinuousTimeMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterContinuousTimeMode");
287 assert(_fmi2EnterContinuousTimeMode != NULL);
288 _fmi2CompletedIntegratorStep = (fmi2Status (*)(fmi2Component, fmi2Boolean, fmi2Boolean*, fmi2Boolean*))
289 GET_FUNC(so_hndl,
"fmi2CompletedIntegratorStep");
290 assert(_fmi2CompletedIntegratorStep != NULL);
291 _fmi2SetTime = (fmi2Status (*)(fmi2Component, fmi2Real))GET_FUNC(so_hndl,
"fmi2SetTime");
292 assert(_fmi2SetTime != NULL);
293 _fmi2SetContinuousStates = (fmi2Status (*)(fmi2Component,
const fmi2Real*, size_t))
294 GET_FUNC(so_hndl,
"fmi2SetContinuousStates");
295 assert(_fmi2SetContinuousStates != NULL);
296 _fmi2GetDerivatives = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetDerivatives");
297 assert(_fmi2GetDerivatives != NULL);
298 _fmi2GetEventIndicators = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetEventIndicators");
299 assert(_fmi2GetEventIndicators != NULL);
300 _fmi2GetContinuousStates = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetContinuousStates");
301 assert(_fmi2GetContinuousStates != NULL);
303 c = _fmi2Instantiate(modelname,fmi2ModelExchange,guid,
"",callbackFuncs,fmi2False,fmi2False);
305 _fmi2SetupExperiment(c,fmi2True,tolerance,-1.0,fmi2False,-1.0);
308 template <
typename X>
313 fmi2EventInfo eventInfo;
316 status = _fmi2NewDiscreteStates(c,&eventInfo);
317 assert(status == fmi2OK);
319 while (eventInfo.newDiscreteStatesNeeded == fmi2True);
320 if (eventInfo.nextEventTimeDefined == fmi2True)
321 next_time_event = eventInfo.nextEventTime;
322 assert(status == fmi2OK);
325 template <
typename X>
330 status = _fmi2SetTime(c,t_now);
331 assert(status == fmi2OK);
333 status = _fmi2EnterInitializationMode(c);
334 assert(status == fmi2OK);
336 status = _fmi2ExitInitializationMode(c);
337 assert(status == fmi2OK);
341 status = _fmi2EnterContinuousTimeMode(c);
342 assert(status == fmi2OK);
343 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
344 assert(status == fmi2OK);
346 cont_time_mode =
true;
349 template <
typename X>
355 status = _fmi2EnterContinuousTimeMode(c);
356 assert(status == fmi2OK);
357 cont_time_mode =
true;
359 status =_fmi2SetTime(c,q[this->
numVars()-1]);
360 assert(status == fmi2OK);
361 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
362 assert(status == fmi2OK);
363 status = _fmi2GetDerivatives(c,dq,this->
numVars()-1);
364 assert(status == fmi2OK);
368 template <
typename X>
374 status = _fmi2EnterContinuousTimeMode(c);
375 assert(status == fmi2OK);
376 cont_time_mode =
true;
378 status = _fmi2SetTime(c,q[this->
numVars()-1]);
379 assert(status == fmi2OK);
380 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
381 assert(status == fmi2OK);
382 status = _fmi2GetEventIndicators(c,z,this->
numEvents()-num_extra_event_indicators);
383 assert(status == fmi2OK);
386 template <
typename X>
389 return next_time_event-q[this->
numVars()-1];
392 template <
typename X>
395 assert(cont_time_mode);
398 if (q[this->
numVars()-1] <= t_now)
402 fmi2Boolean enterEventMode;
403 fmi2Boolean terminateSimulation;
405 status = _fmi2SetTime(c,t_now);
406 assert(status == fmi2OK);
407 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
408 assert(status == fmi2OK);
409 status = _fmi2CompletedIntegratorStep(c,fmi2True,&enterEventMode,&terminateSimulation);
410 assert(status == fmi2OK);
412 if (enterEventMode == fmi2True)
413 next_time_event = t_now;
416 template <
typename X>
419 assert(cont_time_mode);
422 status = _fmi2SetTime(c,q[this->
numVars()]-1);
423 assert(status == fmi2OK);
424 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
425 assert(status == fmi2OK);
428 template <
typename X>
436 status = _fmi2EnterEventMode(c);
437 assert(status == fmi2OK);
438 cont_time_mode =
false;
443 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
444 assert(status == fmi2OK);
447 template <
typename X>
454 status = _fmi2EnterEventMode(c);
455 assert(status == fmi2OK);
456 cont_time_mode =
false;
460 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
461 assert(status == fmi2OK);
464 template <
typename X>
472 status = _fmi2EnterEventMode(c);
473 assert(status == fmi2OK);
474 cont_time_mode =
false;
477 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
478 assert(status == fmi2OK);
481 template <
typename X>
486 template <
typename X>
491 template <
typename X>
494 _fmi2FreeInstance(c);
495 delete callbackFuncs;
499 template <
typename X>
502 const fmi2ValueReference ref = k;
504 fmi2Status status = _fmi2GetReal(c,&ref,1,&val);
505 assert(status == fmi2OK);
509 template <
typename X>
512 const fmi2ValueReference ref = k;
513 fmi2Real fmi_val = val;
514 fmi2Status status = _fmi2SetReal(c,&ref,1,&fmi_val);
515 assert(status == fmi2OK);
518 template <
typename X>
521 const fmi2ValueReference ref = k;
523 fmi2Status status = _fmi2GetInteger(c,&ref,1,&val);
524 assert(status == fmi2OK);
528 template <
typename X>
531 const fmi2ValueReference ref = k;
532 fmi2Integer fmi_val = val;
533 fmi2Status status = _fmi2SetInteger(c,&ref,1,&fmi_val);
534 assert(status == fmi2OK);
537 template <
typename X>
540 const fmi2ValueReference ref = k;
542 fmi2Status status = _fmi2GetBoolean(c,&ref,1,&val);
543 assert(status == fmi2OK);
544 return (val == fmi2True);
547 template <
typename X>
550 const fmi2ValueReference ref = k;
551 fmi2Boolean fmi_val = fmi2False;
552 if (val) fmi_val = fmi2True;
553 fmi2Status status = _fmi2SetBoolean(c,&ref,1,&fmi_val);
554 assert(status == fmi2OK);
557 template <
typename X>
560 const fmi2ValueReference ref = k;
562 fmi2Status status = _fmi2GetString(c,&ref,1,&val);
563 assert(status == fmi2OK);
567 template <
typename X>
570 const fmi2ValueReference ref = k;
571 fmi2String fmi_val = fmi2False;
572 fmi2Status status = _fmi2SetString(c,&ref,1,&fmi_val);
573 assert(status == fmi2OK);
virtual void confluent_event(double *q, const bool *state_event, const Bag< X > &xb)
Definition: adevs_fmi.h:465
int numEvents() const
Get the number of state events.
Definition: adevs_hybrid.h:54
virtual void internal_event(double *q, const bool *state_event)
Definition: adevs_fmi.h:429
virtual void state_event_func(const double *q, double *z)
Compute the state event functions for state q and put them in z.
Definition: adevs_fmi.h:369
virtual void gc_output(Bag< X > &gb)
Definition: adevs_fmi.h:487
virtual double time_event_func(const double *q)
Compute the time event function using state q.
Definition: adevs_fmi.h:387
virtual void init(double *q)
Copy the initial state of the model to q.
Definition: adevs_fmi.h:326
Definition: adevs_exception.h:43
Definition: adevs_fmi.h:71
int numVars() const
Get the number of state variables.
Definition: adevs_hybrid.h:52
virtual void postStep(double *q)
Definition: adevs_fmi.h:393
Definition: adevs_fmi.h:57
virtual void postTrialStep(double *q)
Definition: adevs_fmi.h:417
virtual void external_event(double *q, double e, const Bag< X > &xb)
Definition: adevs_fmi.h:448
virtual void der_func(const double *q, double *dq)
Compute the derivative for state q and put it in dq.
Definition: adevs_fmi.h:350
FMI(const char *modelname, const char *guid, int num_state_variables, int num_event_indicators, const char *shared_lib_name, const double tolerance=1E-8, int num_extra_event_indicators=0, double start_time=0.0)
Definition: adevs_fmi.h:221
virtual void output_func(const double *q, const bool *state_event, Bag< X > &yb)
Definition: adevs_fmi.h:482
virtual ~FMI()
Destructor.
Definition: adevs_fmi.h:492
Definition: adevs_hybrid.h:45