38 #include "adevs_hybrid.h" 39 #include "fmi2Functions.h" 40 #include "fmi2FunctionTypes.h" 41 #include "fmi2TypesPlatform.h" 46 #define OPEN_LIB(name) LoadLibrary(name) 47 #define GET_FUNC(hndl,name) GetProcAddress(hndl,name) 48 #define CLOSE_LIB(hndl) FreeLibrary(hndl) 51 #define OPEN_LIB(name) dlopen(name,RTLD_LAZY) 52 #define GET_FUNC(hndl,name) dlsym(hndl,name) 53 #define CLOSE_LIB(hndl) dlclose(hndl) 70 template <
typename X>
class FMI:
80 FMI(
const char* modelname,
82 int num_state_variables,
83 int num_event_indicators,
84 const char* shared_lib_name,
85 const double tolerance = 1E-8,
86 int num_extra_event_indicators = 0,
87 double start_time = 0.0);
89 virtual void init(
double* q);
91 virtual void der_func(
const double* q,
double* dq);
110 const bool* state_event);
127 virtual void output_func(
const double *q,
const bool* state_event,
137 double get_time()
const {
return t_now; }
139 double get_real(
int k);
141 void set_real(
int k,
double val);
145 void set_int(
int k,
int val);
147 bool get_bool(
int k);
149 void set_bool(
int k,
bool val);
151 std::string get_string(
int k);
153 void set_string(
int k, std::string& val);
158 fmi2Component (*_fmi2Instantiate)(fmi2String, fmi2Type,
159 fmi2String, fmi2String,
const fmi2CallbackFunctions*,
160 fmi2Boolean, fmi2Boolean);
161 void (*_fmi2FreeInstance)(fmi2Component);
162 fmi2Status (*_fmi2SetupExperiment)(fmi2Component, fmi2Boolean,
163 fmi2Real, fmi2Real, fmi2Boolean, fmi2Real);
164 fmi2Status (*_fmi2EnterInitializationMode)(fmi2Component);
165 fmi2Status (*_fmi2ExitInitializationMode)(fmi2Component);
166 fmi2Status (*_fmi2GetReal)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Real*);
167 fmi2Status (*_fmi2GetInteger)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Integer*);
168 fmi2Status (*_fmi2GetBoolean)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Boolean*);
169 fmi2Status (*_fmi2GetString)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2String*);
170 fmi2Status (*_fmi2SetReal)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Real*);
171 fmi2Status (*_fmi2SetInteger)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Integer*);
172 fmi2Status (*_fmi2SetBoolean)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Boolean*);
173 fmi2Status (*_fmi2SetString)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2String*);
174 fmi2Status (*_fmi2EnterEventMode)(fmi2Component);
175 fmi2Status (*_fmi2NewDiscreteStates)(fmi2Component,fmi2EventInfo*);
176 fmi2Status (*_fmi2EnterContinuousTimeMode)(fmi2Component);
177 fmi2Status (*_fmi2CompletedIntegratorStep)(fmi2Component, fmi2Boolean, fmi2Boolean*, fmi2Boolean*);
178 fmi2Status (*_fmi2SetTime)(fmi2Component, fmi2Real);
179 fmi2Status (*_fmi2SetContinuousStates)(fmi2Component,
const fmi2Real*, size_t);
180 fmi2Status (*_fmi2GetDerivatives)(fmi2Component, fmi2Real*, size_t);
181 fmi2Status (*_fmi2GetEventIndicators)(fmi2Component, fmi2Real*, size_t);
182 fmi2Status (*_fmi2GetContinuousStates)(fmi2Component, fmi2Real*, size_t);
185 double next_time_event;
197 int num_extra_event_indicators;
201 static void fmilogger(
202 fmi2ComponentEnvironment componentEnvironment,
203 fmi2String instanceName,
206 fmi2String message,...)
208 if (message != NULL){
210 fprintf(stderr, message,
"\n");
214 fmi2CallbackFunctions* callbackFuncs;
216 void iterate_events();
219 template <
typename X>
222 int num_state_variables,
223 int num_event_indicators,
224 const char* so_file_name,
225 const double tolerance,
226 int num_extra_event_indicators,
229 ode_system<X>(num_state_variables+1,num_event_indicators+num_extra_event_indicators),
230 next_time_event(adevs_inf<double>()),
233 cont_time_mode(false),
234 num_extra_event_indicators(num_extra_event_indicators)
237 callbackFuncs =
new fmi2CallbackFunctions(tmp);
238 so_hndl = OPEN_LIB(so_file_name);
244 _fmi2Instantiate = (fmi2Component (*)(fmi2String, fmi2Type,
245 fmi2String, fmi2String,
const fmi2CallbackFunctions*,
246 fmi2Boolean, fmi2Boolean))GET_FUNC(so_hndl,
"fmi2Instantiate");
247 assert(_fmi2Instantiate != NULL);
248 _fmi2FreeInstance = (void (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2FreeInstance");
249 assert(_fmi2FreeInstance != NULL);
250 _fmi2SetupExperiment = (fmi2Status (*)(fmi2Component, fmi2Boolean,
251 fmi2Real, fmi2Real, fmi2Boolean, fmi2Real))GET_FUNC(so_hndl,
"fmi2SetupExperiment");
252 assert(_fmi2SetupExperiment != NULL);
253 _fmi2EnterInitializationMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterInitializationMode");
254 assert(_fmi2EnterInitializationMode != NULL);
255 _fmi2ExitInitializationMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2ExitInitializationMode");
256 assert(_fmi2ExitInitializationMode != NULL);
257 _fmi2GetReal = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Real*))
258 GET_FUNC(so_hndl,
"fmi2GetReal");
259 assert(_fmi2GetReal != NULL);
260 _fmi2GetInteger = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Integer*))
261 GET_FUNC(so_hndl,
"fmi2GetInteger");
262 assert(_fmi2GetInteger != NULL);
263 _fmi2GetBoolean = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2Boolean*))
264 GET_FUNC(so_hndl,
"fmi2GetBoolean");
265 assert(_fmi2GetBoolean != NULL);
266 _fmi2GetString = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t, fmi2String*))
267 GET_FUNC(so_hndl,
"fmi2GetString");
268 assert(_fmi2GetString != NULL);
269 _fmi2SetReal = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Real*))
270 GET_FUNC(so_hndl,
"fmi2SetReal");
271 assert(_fmi2SetReal != NULL);
272 _fmi2SetInteger = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Integer*))
273 GET_FUNC(so_hndl,
"fmi2SetInteger");
274 assert(_fmi2SetInteger != NULL);
275 _fmi2SetBoolean = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2Boolean*))
276 GET_FUNC(so_hndl,
"fmi2SetBoolean");
277 assert(_fmi2SetBoolean != NULL);
278 _fmi2SetString = (fmi2Status (*)(fmi2Component,
const fmi2ValueReference*, size_t,
const fmi2String*))
279 GET_FUNC(so_hndl,
"fmi2SetString");
280 assert(_fmi2SetString != NULL);
281 _fmi2EnterEventMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterEventMode");
282 assert(_fmi2EnterEventMode != NULL);
283 _fmi2NewDiscreteStates = (fmi2Status (*)(fmi2Component,fmi2EventInfo*))GET_FUNC(so_hndl,
"fmi2NewDiscreteStates");
284 assert(_fmi2NewDiscreteStates != NULL);
285 _fmi2EnterContinuousTimeMode = (fmi2Status (*)(fmi2Component))GET_FUNC(so_hndl,
"fmi2EnterContinuousTimeMode");
286 assert(_fmi2EnterContinuousTimeMode != NULL);
287 _fmi2CompletedIntegratorStep = (fmi2Status (*)(fmi2Component, fmi2Boolean, fmi2Boolean*, fmi2Boolean*))
288 GET_FUNC(so_hndl,
"fmi2CompletedIntegratorStep");
289 assert(_fmi2CompletedIntegratorStep != NULL);
290 _fmi2SetTime = (fmi2Status (*)(fmi2Component, fmi2Real))GET_FUNC(so_hndl,
"fmi2SetTime");
291 assert(_fmi2SetTime != NULL);
292 _fmi2SetContinuousStates = (fmi2Status (*)(fmi2Component,
const fmi2Real*, size_t))
293 GET_FUNC(so_hndl,
"fmi2SetContinuousStates");
294 assert(_fmi2SetContinuousStates != NULL);
295 _fmi2GetDerivatives = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetDerivatives");
296 assert(_fmi2GetDerivatives != NULL);
297 _fmi2GetEventIndicators = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetEventIndicators");
298 assert(_fmi2GetEventIndicators != NULL);
299 _fmi2GetContinuousStates = (fmi2Status (*)(fmi2Component, fmi2Real*, size_t))GET_FUNC(so_hndl,
"fmi2GetContinuousStates");
300 assert(_fmi2GetContinuousStates != NULL);
302 c = _fmi2Instantiate(modelname,fmi2ModelExchange,guid,
"",callbackFuncs,fmi2False,fmi2False);
304 _fmi2SetupExperiment(c,fmi2True,tolerance,-1.0,fmi2False,-1.0);
307 template <
typename X>
312 fmi2EventInfo eventInfo;
315 status = _fmi2NewDiscreteStates(c,&eventInfo);
316 assert(status == fmi2OK);
318 while (eventInfo.newDiscreteStatesNeeded == fmi2True);
319 if (eventInfo.nextEventTimeDefined == fmi2True)
320 next_time_event = eventInfo.nextEventTime;
321 assert(status == fmi2OK);
324 template <
typename X>
329 status = _fmi2SetTime(c,t_now);
330 assert(status == fmi2OK);
332 status = _fmi2EnterInitializationMode(c);
333 assert(status == fmi2OK);
335 status = _fmi2ExitInitializationMode(c);
336 assert(status == fmi2OK);
340 status = _fmi2EnterContinuousTimeMode(c);
341 assert(status == fmi2OK);
342 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
343 assert(status == fmi2OK);
345 cont_time_mode =
true;
348 template <
typename X>
354 status = _fmi2EnterContinuousTimeMode(c);
355 assert(status == fmi2OK);
356 cont_time_mode =
true;
358 status =_fmi2SetTime(c,q[this->
numVars()-1]);
359 assert(status == fmi2OK);
360 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
361 assert(status == fmi2OK);
362 status = _fmi2GetDerivatives(c,dq,this->
numVars()-1);
363 assert(status == fmi2OK);
367 template <
typename X>
373 status = _fmi2EnterContinuousTimeMode(c);
374 assert(status == fmi2OK);
375 cont_time_mode =
true;
377 status = _fmi2SetTime(c,q[this->
numVars()-1]);
378 assert(status == fmi2OK);
379 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
380 assert(status == fmi2OK);
381 status = _fmi2GetEventIndicators(c,z,this->
numEvents()-num_extra_event_indicators);
382 assert(status == fmi2OK);
385 template <
typename X>
388 return next_time_event-q[this->
numVars()-1];
391 template <
typename X>
394 assert(cont_time_mode);
397 if (q[this->
numVars()-1] <= t_now)
401 fmi2Boolean enterEventMode;
402 fmi2Boolean terminateSimulation;
404 status = _fmi2SetTime(c,t_now);
405 assert(status == fmi2OK);
406 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
407 assert(status == fmi2OK);
408 status = _fmi2CompletedIntegratorStep(c,fmi2True,&enterEventMode,&terminateSimulation);
409 assert(status == fmi2OK);
411 if (enterEventMode == fmi2True)
412 next_time_event = t_now;
415 template <
typename X>
418 assert(cont_time_mode);
421 status = _fmi2SetTime(c,q[this->
numVars()]-1);
422 assert(status == fmi2OK);
423 status = _fmi2SetContinuousStates(c,q,this->
numVars()-1);
424 assert(status == fmi2OK);
427 template <
typename X>
435 status = _fmi2EnterEventMode(c);
436 assert(status == fmi2OK);
437 cont_time_mode =
false;
442 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
443 assert(status == fmi2OK);
446 template <
typename X>
453 status = _fmi2EnterEventMode(c);
454 assert(status == fmi2OK);
455 cont_time_mode =
false;
459 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
460 assert(status == fmi2OK);
463 template <
typename X>
471 status = _fmi2EnterEventMode(c);
472 assert(status == fmi2OK);
473 cont_time_mode =
false;
476 status = _fmi2GetContinuousStates(c,q,this->
numVars()-1);
477 assert(status == fmi2OK);
480 template <
typename X>
485 template <
typename X>
490 template <
typename X>
493 _fmi2FreeInstance(c);
494 delete callbackFuncs;
498 template <
typename X>
501 const fmi2ValueReference ref = k;
503 fmi2Status status = _fmi2GetReal(c,&ref,1,&val);
504 assert(status == fmi2OK);
508 template <
typename X>
511 const fmi2ValueReference ref = k;
512 fmi2Real fmi_val = val;
513 fmi2Status status = _fmi2SetReal(c,&ref,1,&fmi_val);
514 assert(status == fmi2OK);
517 template <
typename X>
520 const fmi2ValueReference ref = k;
522 fmi2Status status = _fmi2GetInteger(c,&ref,1,&val);
523 assert(status == fmi2OK);
527 template <
typename X>
530 const fmi2ValueReference ref = k;
531 fmi2Integer fmi_val = val;
532 fmi2Status status = _fmi2SetInteger(c,&ref,1,&fmi_val);
533 assert(status == fmi2OK);
536 template <
typename X>
539 const fmi2ValueReference ref = k;
541 fmi2Status status = _fmi2GetBoolean(c,&ref,1,&val);
542 assert(status == fmi2OK);
543 return (val == fmi2True);
546 template <
typename X>
549 const fmi2ValueReference ref = k;
550 fmi2Boolean fmi_val = fmi2False;
551 if (val) fmi_val = fmi2True;
552 fmi2Status status = _fmi2SetBoolean(c,&ref,1,&fmi_val);
553 assert(status == fmi2OK);
556 template <
typename X>
559 const fmi2ValueReference ref = k;
561 fmi2Status status = _fmi2GetString(c,&ref,1,&val);
562 assert(status == fmi2OK);
566 template <
typename X>
569 const fmi2ValueReference ref = k;
570 fmi2String fmi_val = fmi2False;
571 fmi2Status status = _fmi2SetString(c,&ref,1,&fmi_val);
572 assert(status == fmi2OK);
virtual void confluent_event(double *q, const bool *state_event, const Bag< X > &xb)
Definition: adevs_fmi.h:464
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:428
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:368
virtual void gc_output(Bag< X > &gb)
Definition: adevs_fmi.h:486
virtual double time_event_func(const double *q)
Compute the time event function using state q.
Definition: adevs_fmi.h:386
virtual void init(double *q)
Copy the initial state of the model to q.
Definition: adevs_fmi.h:325
Definition: adevs_exception.h:43
Definition: adevs_fmi.h:70
int numVars() const
Get the number of state variables.
Definition: adevs_hybrid.h:52
virtual void postStep(double *q)
Definition: adevs_fmi.h:392
Definition: adevs_fmi.h:56
virtual void postTrialStep(double *q)
Definition: adevs_fmi.h:416
virtual void external_event(double *q, double e, const Bag< X > &xb)
Definition: adevs_fmi.h:447
virtual void der_func(const double *q, double *dq)
Compute the derivative for state q and put it in dq.
Definition: adevs_fmi.h:349
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:220
virtual void output_func(const double *q, const bool *state_event, Bag< X > &yb)
Definition: adevs_fmi.h:481
virtual ~FMI()
Destructor.
Definition: adevs_fmi.h:491
Definition: adevs_hybrid.h:45