42 int triggerable[N_ZERO];
51 const double* arg[SZ_ARG];
62 for (i = 0; i < N_X; ++i) m->
x[i] = m->
v[x_vr[i]];
63 for (i = 0; i < N_P; ++i) m->
p[i] = m->
v[p_vr[i]];
64 for (i = 0; i < N_U; ++i) m->
u[i] = m->
v[u_vr[i]];
80 mem = MODELNAME_checkout();
81 flag = MODELNAME(m->
arg, m->
res, m->
iw, m->
w, mem);
82 MODELNAME_release(mem);
85 for (i = 0; i < N_X; ++i) m->
v[xdot_vr[i]] = m->
xdot[i];
86 for (i = 0; i < N_Y; ++i) m->
v[y_vr[i]] = m->
y[i];
87 for (i = 0; i < N_ZERO; ++i) m->
v[zero_vr[i]] = m->
zero[i];
97 for (i = 0; i < N_X; ++i) m->
dx[i] = m->
d[x_vr[i]];
98 for (i = 0; i < N_P; ++i) m->
dp[i] = m->
d[p_vr[i]];
99 for (i = 0; i < N_U; ++i) m->
du[i] = m->
d[u_vr[i]];
126 mem = fwd1_MODELNAME_checkout();
127 flag = fwd1_MODELNAME(m->
arg, m->
res, m->
iw, m->
w, mem);
128 fwd1_MODELNAME_release(mem);
131 for (i = 0; i < N_X; ++i) m->
d[xdot_vr[i]] = m->
dxdot[i];
132 for (i = 0; i < N_Y; ++i) m->
d[y_vr[i]] = m->
dy[i];
133 for (i = 0; i < N_ZERO; ++i) m->
d[zero_vr[i]] = m->
dzero[i];
144 for (i = 0; i < N_X; ++i) m->
dxdot[i] = m->
d[xdot_vr[i]];
145 for (i = 0; i < N_Y; ++i) m->
dy[i] = m->
d[y_vr[i]];
146 for (i = 0; i < N_ZERO; ++i) m->
dzero[i] = m->
d[zero_vr[i]];
149 for (i = 0; i < N_X; ++i) m->
dx[i] = 0;
150 for (i = 0; i < N_P; ++i) m->
dp[i] = 0;
151 for (i = 0; i < N_U; ++i) m->
du[i] = 0;
178 mem = adj1_MODELNAME_checkout();
179 flag = adj1_MODELNAME(m->
arg, m->
res, m->
iw, m->
w, mem);
180 adj1_MODELNAME_release(mem);
183 for (i = 0; i < N_X; ++i) m->
d[x_vr[i]] = m->
dx[i];
184 for (i = 0; i < N_P; ++i) m->
d[p_vr[i]] = m->
dp[i];
185 for (i = 0; i < N_U; ++i) m->
d[u_vr[i]] = m->
du[i];
203 for (i = 0; i < N_X; ++i) m->
x[i] = m->
v[x_vr[i]];
204 for (i = 0; i < N_P; ++i) m->
p[i] = m->
v[p_vr[i]];
205 for (i = 0; i < N_U; ++i) m->
u[i] = m->
v[u_vr[i]];
209 m->
arg[i++] = &zeroind;
222 mem = transition_MODELNAME_checkout();
223 flag = transition_MODELNAME(m->
arg, m->
res, m->
iw, m->
w, mem);
224 transition_MODELNAME_release(mem);
227 for (i = 0; i < N_X; ++i) m->
v[x_vr[i]] = m->
xdot[i];
233 FMI3_Export fmi3Status fmi3Reset(fmi3Instance instance) {
240 for (i = 0; i < SZ_MEM; ++i) m->
v[i] = start[i];
242 for (i = 0; i < SZ_MEM; ++i) m->
d[i] = 0;
249 for (i = 0; i < N_ZERO; ++i) m->
triggerable[i] = 0;
254 FMI3_Export fmi3Instance fmi3InstantiateModelExchange(
255 fmi3String instanceName,
256 fmi3String instantiationToken,
257 fmi3String resourcePath,
259 fmi3Boolean loggingOn,
260 fmi3InstanceEnvironment instanceEnvironment,
261 fmi3LogMessageCallback logMessage) {
268 (void)instanceEnvironment;
277 transition_MODELNAME_incref();
288 FMI3_Export fmi3Instance fmi3InstantiateCoSimulation(fmi3String instanceName,
289 fmi3String instantiationToken,
290 fmi3String resourcePath,
292 fmi3Boolean loggingOn,
293 fmi3Boolean eventModeUsed,
294 fmi3Boolean earlyReturnAllowed,
295 const fmi3ValueReference requiredIntermediateVariables[],
296 size_t nRequiredIntermediateVariables,
297 fmi3InstanceEnvironment instanceEnvironment,
298 fmi3LogMessageCallback logMessage,
299 fmi3IntermediateUpdateCallback intermediateUpdate) {
304 FMI3_Export fmi3Instance fmi3InstantiateScheduledExecution(fmi3String instanceName,
305 fmi3String instantiationToken,
306 fmi3String resourcePath,
308 fmi3Boolean loggingOn,
309 fmi3InstanceEnvironment instanceEnvironment,
310 fmi3LogMessageCallback logMessage,
311 fmi3ClockUpdateCallback clockUpdate,
312 fmi3LockPreemptionCallback lockPreemption,
313 fmi3UnlockPreemptionCallback unlockPreemption) {
318 FMI3_Export fmi3Status fmi3GetNumberOfVariableDependencies(fmi3Instance instance,
319 fmi3ValueReference valueReference,
320 size_t* nDependencies) {
325 FMI3_Export fmi3Status fmi3GetVariableDependencies(fmi3Instance instance,
326 fmi3ValueReference dependent,
327 size_t elementIndicesOfDependent[],
328 fmi3ValueReference independents[],
329 size_t elementIndicesOfIndependents[],
330 fmi3DependencyKind dependencyKinds[],
331 size_t nDependencies) {
336 FMI3_Export fmi3Status fmi3GetFMUState(fmi3Instance instance,
337 fmi3FMUState* FMUState) {
342 FMI3_Export fmi3Status fmi3SetFMUState(fmi3Instance instance,
343 fmi3FMUState FMUState) {
348 FMI3_Export fmi3Status fmi3FreeFMUState(fmi3Instance instance,
349 fmi3FMUState* FMUState) {
354 FMI3_Export fmi3Status fmi3SerializedFMUStateSize(fmi3Instance instance,
355 fmi3FMUState FMUState,
361 FMI3_Export fmi3Status fmi3SerializeFMUState(fmi3Instance instance,
362 fmi3FMUState FMUState,
363 fmi3Byte serializedState[],
369 FMI3_Export fmi3Status fmi3DeserializeFMUState(fmi3Instance instance,
370 const fmi3Byte serializedState[],
372 fmi3FMUState* FMUState) {
377 FMI3_Export
void fmi3FreeInstance(fmi3Instance instance) {
384 transition_MODELNAME_decref();
389 FMI3_Export fmi3Status fmi3SetFloat64(
390 fmi3Instance instance,
391 const fmi3ValueReference valueReferences[],
392 size_t nValueReferences,
393 const fmi3Float64 values[],
397 size_t i, j, var_off, var_sz, val_ind;
398 fmi3ValueReference vr;
406 for (i = 0; i < nValueReferences; ++i) {
408 vr = valueReferences[i];
410 var_off = var_offset[vr];
411 var_sz = var_offset[vr + 1] - var_off;
413 for (j = 0; j < var_sz; ++j) m->
v[var_off + j] = values[val_ind++];
416 if (val_ind != nValues)
return fmi3Fatal;
421 FMI3_Export fmi3Status fmi3GetFloat64(
422 fmi3Instance instance,
423 const fmi3ValueReference valueReferences[],
424 size_t nValueReferences,
425 fmi3Float64 values[],
429 size_t i, j, var_off, var_sz, val_ind;
430 fmi3ValueReference vr;
436 if (evaluate(m))
return fmi3Error;
443 for (i = 0; i < nValueReferences; ++i) {
445 vr = valueReferences[i];
447 var_off = var_offset[vr];
448 var_sz = var_offset[vr + 1] - var_off;
450 for (j = 0; j < var_sz; ++j) values[val_ind++] = m->
v[var_off + j];
453 if (val_ind != nValues)
return fmi3Fatal;
458 FMI3_Export fmi3Status fmi3EnterInitializationMode(
459 fmi3Instance instance,
460 fmi3Boolean toleranceDefined,
461 fmi3Float64 tolerance,
462 fmi3Float64 startTime,
463 fmi3Boolean stopTimeDefined,
464 fmi3Float64 stopTime) {
468 (void)toleranceDefined;
470 (void)stopTimeDefined;
480 FMI3_Export fmi3Status fmi3ExitInitializationMode(fmi3Instance instance) {
487 FMI3_Export fmi3Status fmi3EnterContinuousTimeMode(fmi3Instance instance) {
494 FMI3_Export fmi3Status fmi3SetTime(fmi3Instance instance, fmi3Float64 time) {
505 FMI3_Export fmi3Status fmi3SetContinuousStates(
506 fmi3Instance instance,
507 const fmi3Float64 continuousStates[],
508 size_t nContinuousStates) {
509 return fmi3SetFloat64(instance, x_vr, N_X, continuousStates, nContinuousStates);
512 FMI3_Export fmi3Status fmi3GetContinuousStates(
513 fmi3Instance instance,
514 fmi3Float64 continuousStates[],
515 size_t nContinuousStates) {
516 return fmi3GetFloat64(instance, x_vr, N_X, continuousStates, nContinuousStates);
519 fmi3Status fmi3GetDirectionalDerivative(
520 fmi3Instance instance,
521 const fmi3ValueReference unknowns[],
523 const fmi3ValueReference knowns[],
525 const fmi3Float64 seed[],
527 fmi3Float64 sensitivity[],
528 size_t nSensitivity) {
531 size_t i, j, var_off, var_sz, val_ind;
532 fmi3ValueReference vr;
539 if (evaluate(m))
return fmi3Error;
545 for (i = 0; i < nKnowns; ++i) {
549 var_off = var_offset[vr];
550 var_sz = var_offset[vr + 1] - var_off;
552 for (j = 0; j < var_sz; ++j) m->
d[var_off + j] = seed[val_ind++];
555 if (val_ind != nSeed)
return fmi3Fatal;
557 flag = evaluate_forward(m);
560 for (i = 0; i < nUnknowns; ++i) {
564 var_off = var_offset[vr];
565 var_sz = var_offset[vr + 1] - var_off;
567 for (j = 0; j < var_sz; ++j) {
568 sensitivity[val_ind++] = m->
d[var_off + j];
569 m->
d[var_off + j] = 0;
573 if (val_ind != nSensitivity)
return fmi3Fatal;
576 for (i = 0; i < nKnowns; ++i) {
580 var_off = var_offset[vr];
581 var_sz = var_offset[vr + 1] - var_off;
583 for (j = 0; j < var_sz; ++j) m->
d[var_off + j] = 0;
586 if (flag)
return fmi3Error;
591 fmi3Status fmi3GetAdjointDerivative(
592 fmi3Instance instance,
593 const fmi3ValueReference unknowns[],
595 const fmi3ValueReference knowns[],
597 const fmi3Float64 seed[],
599 fmi3Float64 sensitivity[],
600 size_t nSensitivity) {
603 size_t i, j, var_off, var_sz, val_ind;
604 fmi3ValueReference vr;
611 if (evaluate(m))
return fmi3Error;
617 for (i = 0; i < nUnknowns; ++i) {
621 var_off = var_offset[vr];
622 var_sz = var_offset[vr + 1] - var_off;
624 for (j = 0; j < var_sz; ++j) m->
d[var_off + j] = seed[val_ind++];
627 if (val_ind != nSeed)
return fmi3Fatal;
629 flag = evaluate_adjoint(m);
632 for (i = 0; i < nKnowns; ++i) {
636 var_off = var_offset[vr];
637 var_sz = var_offset[vr + 1] - var_off;
639 for (j = 0; j < var_sz; ++j) {
640 sensitivity[val_ind++] = m->
d[var_off + j];
641 m->
d[var_off + j] = 0;
645 if (val_ind != nSensitivity)
return fmi3Fatal;
648 for (i = 0; i < nUnknowns; ++i) {
652 var_off = var_offset[vr];
653 var_sz = var_offset[vr + 1] - var_off;
655 for (j = 0; j < var_sz; ++j) m->
d[var_off + j] = 0;
658 if (flag)
return fmi3Error;
663 FMI3_Export
const char* fmi3GetVersion(
void) {
667 FMI3_Export fmi3Status fmi3SetDebugLogging(
668 fmi3Instance instance,
669 fmi3Boolean loggingOn,
671 const fmi3String categories[]) {
676 FMI3_Export fmi3Status fmi3Terminate(fmi3Instance instance) {
681 FMI3_Export fmi3Status fmi3GetFloat32(
682 fmi3Instance instance,
683 const fmi3ValueReference valueReferences[],
684 size_t nValueReferences,
685 fmi3Float32 values[],
691 FMI3_Export fmi3Status fmi3GetInt8(
692 fmi3Instance instance,
693 const fmi3ValueReference valueReferences[],
694 size_t nValueReferences,
701 FMI3_Export fmi3Status fmi3GetUInt8(
702 fmi3Instance instance,
703 const fmi3ValueReference valueReferences[],
704 size_t nValueReferences,
711 FMI3_Export fmi3Status fmi3GetInt16(
712 fmi3Instance instance,
713 const fmi3ValueReference valueReferences[],
714 size_t nValueReferences,
721 FMI3_Export fmi3Status fmi3GetUInt16(
722 fmi3Instance instance,
723 const fmi3ValueReference valueReferences[],
724 size_t nValueReferences,
731 FMI3_Export fmi3Status fmi3GetInt32(
732 fmi3Instance instance,
733 const fmi3ValueReference valueReferences[],
734 size_t nValueReferences,
741 FMI3_Export fmi3Status fmi3GetUInt32(
742 fmi3Instance instance,
743 const fmi3ValueReference valueReferences[],
744 size_t nValueReferences,
751 FMI3_Export fmi3Status fmi3GetInt64(
752 fmi3Instance instance,
753 const fmi3ValueReference valueReferences[],
754 size_t nValueReferences,
761 FMI3_Export fmi3Status fmi3GetUInt64(
762 fmi3Instance instance,
763 const fmi3ValueReference valueReferences[],
764 size_t nValueReferences,
771 FMI3_Export fmi3Status fmi3GetBoolean(
772 fmi3Instance instance,
773 const fmi3ValueReference valueReferences[],
774 size_t nValueReferences,
775 fmi3Boolean values[],
781 FMI3_Export fmi3Status fmi3GetString(
782 fmi3Instance instance,
783 const fmi3ValueReference valueReferences[],
784 size_t nValueReferences,
791 FMI3_Export fmi3Status fmi3GetBinary(
792 fmi3Instance instance,
793 const fmi3ValueReference valueReferences[],
794 size_t nValueReferences,
802 FMI3_Export fmi3Status fmi3GetClock(
803 fmi3Instance instance,
804 const fmi3ValueReference valueReferences[],
805 size_t nValueReferences,
806 fmi3Clock values[]) {
811 FMI3_Export fmi3Status fmi3SetFloat32(fmi3Instance instance,
812 const fmi3ValueReference valueReferences[],
813 size_t nValueReferences,
814 const fmi3Float32 values[],
820 FMI3_Export fmi3Status fmi3SetInt8(fmi3Instance instance,
821 const fmi3ValueReference valueReferences[],
822 size_t nValueReferences,
823 const fmi3Int8 values[],
829 FMI3_Export fmi3Status fmi3SetUInt8(fmi3Instance instance,
830 const fmi3ValueReference valueReferences[],
831 size_t nValueReferences,
832 const fmi3UInt8 values[],
838 FMI3_Export fmi3Status fmi3SetInt16(fmi3Instance instance,
839 const fmi3ValueReference valueReferences[],
840 size_t nValueReferences,
841 const fmi3Int16 values[],
847 FMI3_Export fmi3Status fmi3SetUInt16(fmi3Instance instance,
848 const fmi3ValueReference valueReferences[],
849 size_t nValueReferences,
850 const fmi3UInt16 values[],
856 FMI3_Export fmi3Status fmi3SetInt32(fmi3Instance instance,
857 const fmi3ValueReference valueReferences[],
858 size_t nValueReferences,
859 const fmi3Int32 values[],
865 FMI3_Export fmi3Status fmi3SetUInt32(fmi3Instance instance,
866 const fmi3ValueReference valueReferences[],
867 size_t nValueReferences,
868 const fmi3UInt32 values[],
874 FMI3_Export fmi3Status fmi3SetInt64(fmi3Instance instance,
875 const fmi3ValueReference valueReferences[],
876 size_t nValueReferences,
877 const fmi3Int64 values[],
883 FMI3_Export fmi3Status fmi3SetUInt64(fmi3Instance instance,
884 const fmi3ValueReference valueReferences[],
885 size_t nValueReferences,
886 const fmi3UInt64 values[],
892 FMI3_Export fmi3Status fmi3SetBoolean(fmi3Instance instance,
893 const fmi3ValueReference valueReferences[],
894 size_t nValueReferences,
895 const fmi3Boolean values[],
901 FMI3_Export fmi3Status fmi3SetString(fmi3Instance instance,
902 const fmi3ValueReference valueReferences[],
903 size_t nValueReferences,
904 const fmi3String values[],
910 FMI3_Export fmi3Status fmi3SetBinary(fmi3Instance instance,
911 const fmi3ValueReference valueReferences[],
912 size_t nValueReferences,
913 const size_t valueSizes[],
914 const fmi3Binary values[],
920 FMI3_Export fmi3Status fmi3SetClock(fmi3Instance instance,
921 const fmi3ValueReference valueReferences[],
922 size_t nValueReferences,
923 const fmi3Clock values[]) {
928 FMI3_Export fmi3Status fmi3SetIntervalDecimal(fmi3Instance instance,
929 const fmi3ValueReference valueReferences[],
930 size_t nValueReferences,
931 const fmi3Float64 intervals[]) {
936 FMI3_Export fmi3Status fmi3GetIntervalDecimal(fmi3Instance instance,
937 const fmi3ValueReference valueReferences[],
938 size_t nValueReferences,
939 fmi3Float64 intervals[],
940 fmi3IntervalQualifier qualifiers[]) {
945 FMI3_Export fmi3Status fmi3GetShiftDecimal(fmi3Instance instance,
946 const fmi3ValueReference valueReferences[],
947 size_t nValueReferences,
948 fmi3Float64 shifts[]) {
953 FMI3_Export fmi3Status fmi3SetShiftDecimal(fmi3Instance instance,
954 const fmi3ValueReference valueReferences[],
955 size_t nValueReferences,
956 const fmi3Float64 shifts[]) {
961 FMI3_Export fmi3Status fmi3GetNumberOfContinuousStates(fmi3Instance instance,
962 size_t* nContinuousStates) {
963 if (nContinuousStates) *nContinuousStates = N_X;
967 FMI3_Export fmi3Status fmi3GetNumberOfEventIndicators(fmi3Instance instance,
968 size_t* nEventIndicators) {
969 if (nEventIndicators) *nEventIndicators = N_ZERO;
973 FMI3_Export fmi3Status fmi3GetContinuousStateDerivatives(fmi3Instance instance,
974 fmi3Float64 derivatives[],
size_t nContinuousStates) {
975 (void)nContinuousStates;
976 return fmi3GetFloat64(instance, xdot_vr, N_X, derivatives, N_X);
979 FMI3_Export fmi3Status fmi3GetNominalsOfContinuousStates(fmi3Instance instance,
980 fmi3Float64 nominals[],
size_t nContinuousStates) {
983 for (i = 0; i < nContinuousStates; ++i) nominals[i] = 1;
987 FMI3_Export fmi3Status fmi3GetEventIndicators(fmi3Instance instance,
988 fmi3Float64 eventIndicators[],
989 size_t nEventIndicators) {
995 fmi3Float64 most_negative;
997 (void)nEventIndicators;
1001 flag = fmi3GetFloat64(instance, zero_vr, N_ZERO, eventIndicators, N_ZERO);
1004 for (i = 0; i < N_ZERO; ++i) {
1007 if (eventIndicators[i] < most_negative) {
1008 most_negative = eventIndicators[i];
1011 }
else if (eventIndicators[i] > 1e-6) {
1024 FMI3_Export fmi3Status fmi3CompletedIntegratorStep(fmi3Instance instance,
1025 fmi3Boolean noSetFMUStatePriorToCurrentPoint,
1026 fmi3Boolean* enterEventMode,
1027 fmi3Boolean* terminateSimulation) {
1032 FMI3_Export fmi3Status fmi3EnterEventMode(fmi3Instance instance) {
1040 if (m->
zeroind < 0)
return fmi3OK;
1042 if (evaluate_transition(m))
return fmi3Error;
1049 for (i = 0; i < N_ZERO; ++i) m->
triggerable[i] = 0;
1055 FMI3_Export fmi3Status fmi3UpdateDiscreteStates(fmi3Instance instance,
1056 fmi3Boolean* discreteStatesNeedUpdate,
1057 fmi3Boolean* terminateSimulation,
1058 fmi3Boolean* nominalsOfContinuousStatesChanged,
1059 fmi3Boolean* valuesOfContinuousStatesChanged,
1060 fmi3Boolean* nextEventTimeDefined,
1061 fmi3Float64* nextEventTime) {
1067 *discreteStatesNeedUpdate = fmi3False;
1068 *terminateSimulation = fmi3False;
1069 *nominalsOfContinuousStatesChanged = fmi3False;
1071 *nextEventTimeDefined = fmi3False;
1078 FMI3_Export fmi3Status fmi3EnterConfigurationMode(fmi3Instance instance) {
1083 FMI3_Export fmi3Status fmi3ExitConfigurationMode(fmi3Instance instance) {
1088 FMI3_Export fmi3Status fmi3GetIntervalFraction(fmi3Instance instance,
1089 const fmi3ValueReference valueReferences[],
1090 size_t nValueReferences,
1091 fmi3UInt64 counters[],
1092 fmi3UInt64 resolutions[],
1093 fmi3IntervalQualifier qualifiers[]) {
1098 FMI3_Export fmi3Status fmi3GetShiftFraction(fmi3Instance instance,
1099 const fmi3ValueReference valueReferences[],
1100 size_t nValueReferences,
1101 fmi3UInt64 counters[],
1102 fmi3UInt64 resolutions[]) {
1107 FMI3_Export fmi3Status fmi3SetIntervalFraction(fmi3Instance instance,
1108 const fmi3ValueReference valueReferences[],
1109 size_t nValueReferences,
1110 const fmi3UInt64 counters[],
1111 const fmi3UInt64 resolutions[]) {
1116 FMI3_Export fmi3Status fmi3SetShiftFraction(fmi3Instance instance,
1117 const fmi3ValueReference valueReferences[],
1118 size_t nValueReferences,
1119 const fmi3UInt64 counters[],
1120 const fmi3UInt64 resolutions[]) {
1125 FMI3_Export fmi3Status fmi3EvaluateDiscreteStates(fmi3Instance instance) {
1130 FMI3_Export fmi3Status fmi3EnterStepMode(fmi3Instance instance) {
1135 FMI3_Export fmi3Status fmi3GetOutputDerivatives(fmi3Instance instance,
1136 const fmi3ValueReference valueReferences[],
1137 size_t nValueReferences,
1138 const fmi3Int32 orders[],
1139 fmi3Float64 values[],
1145 FMI3_Export fmi3Status fmi3DoStep(fmi3Instance instance,
1146 fmi3Float64 currentCommunicationPoint,
1147 fmi3Float64 communicationStepSize,
1148 fmi3Boolean noSetFMUStatePriorToCurrentPoint,
1149 fmi3Boolean* eventHandlingNeeded,
1150 fmi3Boolean* terminateSimulation,
1151 fmi3Boolean* earlyReturn,
1152 fmi3Float64* lastSuccessfulTime) {
1157 FMI3_Export fmi3Status fmi3ActivateModelPartition(fmi3Instance instance,
1158 fmi3ValueReference clockReference,
1159 fmi3Float64 activationTime) {
const char * instance_name
int continuous_states_changed
const double * arg[SZ_ARG]