Skip to content

Commit 6f06ccd

Browse files
committed
- Implemented fmiSetContinuousStates, fmiGetDerivatives, fmiGetEventIndicators, fmiGetContinuousStates & fmiGetNominalsOfContinuousStates functions for FMI 2.0 export.
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21023 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 2b5e60a commit 6f06ccd

File tree

1 file changed

+74
-5
lines changed

1 file changed

+74
-5
lines changed

SimulationRuntime/fmi/export/fmi2/fmu2_model_interface.c

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -646,27 +646,96 @@ fmiStatus fmiSetTime(fmiComponent c, fmiReal time) {
646646
}
647647

648648
fmiStatus fmiSetContinuousStates(fmiComponent c, const fmiReal x[], size_t nx) {
649-
// TODO Write code here
649+
ModelInstance *comp = (ModelInstance *)c;
650+
int i;
651+
if (invalidState(comp, "fmiSetContinuousStates", modelStepping))
652+
return fmiError;
653+
if (invalidNumber(comp, "fmiSetContinuousStates", "nx", nx, NUMBER_OF_STATES))
654+
return fmiError;
655+
if (nullPointer(comp, "fmiSetContinuousStates", "x[]", x))
656+
return fmiError;
657+
#if NUMBER_OF_REALS>0
658+
for (i = 0; i < nx; i++) {
659+
fmiValueReference vr = vrStates[i];
660+
FILTERED_LOG(comp, fmiOK, LOG_FMI_CALL, "fmiSetContinuousStates: #r%d#=%.16g", vr, x[i])
661+
assert(vr >= 0 && vr < NUMBER_OF_REALS);
662+
if (setReal(comp, vr, x[i]) != fmiOK) // to be implemented by the includer of this file
663+
return fmiError;
664+
}
665+
#endif
650666
return fmiOK;
651667
}
652668

653669
fmiStatus fmiGetDerivatives(fmiComponent c, fmiReal derivatives[], size_t nx) {
654-
// TODO Write code here
670+
int i;
671+
ModelInstance* comp = (ModelInstance *)c;
672+
if (invalidState(comp, "fmiGetDerivatives", modelInitialized|modelStepping|modelTerminated))
673+
return fmiError;
674+
if (invalidNumber(comp, "fmiGetDerivatives", "nx", nx, NUMBER_OF_STATES))
675+
return fmiError;
676+
if (nullPointer(comp, "fmiGetDerivatives", "derivatives[]", derivatives))
677+
return fmiError;
678+
#if NUMBER_OF_STATES>0
679+
for (i = 0; i < nx; i++) {
680+
fmiValueReference vr = vrStates[i] + 1;
681+
derivatives[i] = getReal(comp, vr); // to be implemented by the includer of this file
682+
FILTERED_LOG(comp, fmiOK, LOG_FMI_CALL, "fmiGetDerivatives: #r%d# = %.16g", vr, derivatives[i])
683+
}
684+
#endif
655685
return fmiOK;
656686
}
657687

658688
fmiStatus fmiGetEventIndicators(fmiComponent c, fmiReal eventIndicators[], size_t nx) {
659-
// TODO Write code here
689+
int i;
690+
ModelInstance *comp = (ModelInstance *)c;
691+
if (invalidState(comp, "fmiGetEventIndicators", modelInitialized|modelStepping|modelTerminated))
692+
return fmiError;
693+
if (invalidNumber(comp, "fmiGetEventIndicators", "nx", nx, NUMBER_OF_EVENT_INDICATORS))
694+
return fmiError;
695+
#if NUMBER_OF_EVENT_INDICATORS>0
696+
/* eval needed equations*/
697+
comp->fmuData->callback->function_ZeroCrossingsEquations(comp->fmuData);
698+
comp->fmuData->callback->function_ZeroCrossings(comp->fmuData,comp->fmuData->simulationInfo.zeroCrossings);
699+
for (i = 0; i < ni; i++) {
700+
eventIndicators[i] = comp->fmuData->simulationInfo.zeroCrossings[i];
701+
FILTERED_LOG(comp, fmiOK, LOG_FMI_CALL, "fmiGetEventIndicators: z%d = %.16g", i, eventIndicators[i])
702+
}
703+
#endif
660704
return fmiOK;
661705
}
662706

663707
fmiStatus fmiGetContinuousStates(fmiComponent c, fmiReal x[], size_t nx) {
664-
// TODO Write code here
708+
int i;
709+
ModelInstance *comp = (ModelInstance *)c;
710+
if (invalidState(comp, "fmiGetContinuousStates", modelInitialized|modelStepping|modelTerminated))
711+
return fmiError;
712+
if (invalidNumber(comp, "fmiGetContinuousStates", "nx", nx, NUMBER_OF_STATES))
713+
return fmiError;
714+
if (nullPointer(comp, "fmiGetContinuousStates", "states[]", x))
715+
return fmiError;
716+
#if NUMBER_OF_REALS>0
717+
for (i = 0; i < nx; i++) {
718+
fmiValueReference vr = vrStates[i];
719+
x[i] = getReal(comp, vr); // to be implemented by the includer of this file
720+
FILTERED_LOG(comp, fmiOK, LOG_FMI_CALL, "fmiGetContinuousStates: #r%u# = %.16g", vr, x[i])
721+
}
722+
#endif
665723
return fmiOK;
666724
}
667725

668726
fmiStatus fmiGetNominalsOfContinuousStates(fmiComponent c, fmiReal x_nominal[], size_t nx) {
669-
// TODO Write code here
727+
int i;
728+
ModelInstance *comp = (ModelInstance *)c;
729+
if (invalidState(comp, "fmiGetNominalsOfContinuousStates", modelInstantiated|modelInitialized|modelStepping|modelTerminated))
730+
return fmiError;
731+
if (invalidNumber(comp, "fmiGetNominalsOfContinuousStates", "nx", nx, NUMBER_OF_STATES))
732+
return fmiError;
733+
if (nullPointer(comp, "fmiGetNominalsOfContinuousStates", "x_nominal[]", x_nominal))
734+
return fmiError;
735+
x_nominal[0] = 1;
736+
FILTERED_LOG(comp, fmiOK, LOG_FMI_CALL, "fmiGetNominalsOfContinuousStates: x_nominal[0..%d] = 1.0", nx-1)
737+
for (i = 0; i < nx; i++)
738+
x_nominal[i] = 1;
670739
return fmiOK;
671740
}
672741

0 commit comments

Comments
 (0)