Skip to content

Commit

Permalink
- flow control.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13817 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Nov 7, 2012
1 parent 015894c commit cb2f485
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 247 deletions.
114 changes: 57 additions & 57 deletions Compiler/Template/CodegenFMU.tpl
Expand Up @@ -1141,9 +1141,48 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
fmiImportContext context = fmiImportContext(fmiLogLevel);
fmiEventInfo eventInfo;
Boolean callEventUpdate = false;
Real flowControlTime;
Real flowInit;
Real flowControlStatesInputs;
Real flowControlStates;
Real flowControlTime;
equation
(fmi_status, flowInit, eventInfo) = fmiFunctions.fmiInitialize(fmi, "<%fmiInfo.fmiModelIdentifier%>", debugLogging, time, eventInfo);
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
<<
fmi_x = fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowInit, fmi_x_dummy);
>>
%>
der(fmi_x) = fmiFunctions.fmiGetDerivatives(fmi, numberOfContinuousStates, flowControlStatesInputs);
flowControlTime = fmiFunctions.fmiSetTime(fmi, time, 1);
flowControlStatesInputs = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x, flowControlTime);
fmi_z = fmiFunctions.fmiGetEventIndicators(fmi, numberOfEventIndicators, flowControlEvent);
for i in 1:size(fmi_z,1) loop
fmi_z_positive[i] = if not terminal() then fmi_z[i] > 0 else pre(fmi_z_positive[i]);
end for;
algorithm
<%if intGt(listLength(fmiInfo.fmiNumberOfEventIndicators), 0) then
<<
when (<%fmiInfo.fmiNumberOfEventIndicators |> eventIndicator => "change(fmi_z_positive["+eventIndicator+"])" ;separator=" or "%>) and not initial() then
>>
else
<<
when not initial() then
>>
%>
fmiFunctions.fmiEventUpdate(fmi, callEventUpdate, eventInfo);
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
<<
fmi_x_new := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowControlEvent, fmi_x_dummy);
<%fmiInfo.fmiNumberOfContinuousStates |> continuousStates => "reinit(fmi_x["+continuousStates+"], fmi_x_new["+continuousStates+"]);" ;separator="\n"%>
>>
%>
end when;
equation
flowControlEvent = fmiFunctions.fmiCompletedIntegratorStep(fmi, callEventUpdate, flowControlStatesInputs);
<%if not stringEq(realVariables, "0") then "{"+dumpRealVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetReal(fmi, {"+dumpRealVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(integerVariables, "0") then "{"+dumpIntegerVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetInteger(fmi, {"+dumpIntegerVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(booleanVariables, "0") then "{"+dumpBooleanVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetBoolean(fmi, {"+dumpBooleanVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(stringVariables, "0") then "{"+dumpStringVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetString(fmi, {"+dumpStringVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
annotation(experiment(StartTime=<%fmiExperimentAnnotation.fmiExperimentStartTime%>, StopTime=<%fmiExperimentAnnotation.fmiExperimentStopTime%>, Tolerance=<%fmiExperimentAnnotation.fmiExperimentTolerance%>));
protected
<%dumpFMICommonObjects(platform)%>

Expand All @@ -1163,45 +1202,45 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
input fmiImportInstance fmi;
input String instanceName;
input Boolean debugLogging;
input Real in_time;
input fmiEventInfo in_eventInfo;
input Real in_Time;
input fmiEventInfo in_EventInfo;
output Integer status;
output Real out_Flow;
output Real out_Flow_Init;
output fmiEventInfo out_eventInfo;
external "C" out_eventInfo = fmiInitialize_OMC(fmi, instanceName, debugLogging, in_time, in_eventInfo, status, out_Flow) annotation(Library = {"omcruntime", "fmilib", "shlwapi"});
external "C" out_eventInfo = fmiInitialize_OMC(fmi, instanceName, debugLogging, in_Time, in_EventInfo, status, out_Flow_Init) annotation(Library = {"omcruntime", "fmilib", "shlwapi"});
end fmiInitialize;

function fmiSetTime
input fmiImportInstance fmi;
input Real in_time;
input Real in_Time;
input Real in_Flow;
output Real status;
external "C" status = fmiSetTime_OMC(fmi, in_time, in_Flow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
external "C" status = fmiSetTime_OMC(fmi, in_Time, in_Flow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
end fmiSetTime;

function fmiGetContinuousStates
input fmiImportInstance fmi;
input Integer numberOfContinuousStates;
input Real in_Flow;
input Real dummy_fmi_x[:];
input Real in_Flow_Init;
input Real in_fmi_x[:];
output Real fmi_x[numberOfContinuousStates];
external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, fmi_x, in_Flow, dummy_fmi_x) annotation(Library = {"omcruntime", "fmilib", "shlwapi"});
external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, fmi_x, in_Flow_Init, in_fmi_x) annotation(Library = {"omcruntime", "fmilib", "shlwapi"});
end fmiGetContinuousStates;

function fmiSetContinuousStates
input fmiImportInstance fmi;
input Real fmi_x[:];
input Real in_Flow;
input Real in_Flow_Time;
output Real status;
external "C" status = fmiSetContinuousStates_OMC(fmi, size(fmi_x, 1), fmi_x, in_Flow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
external "C" status = fmiSetContinuousStates_OMC(fmi, size(fmi_x, 1), fmi_x, in_Flow_Time) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
end fmiSetContinuousStates;

function fmiGetEventIndicators
input fmiImportInstance fmi;
input Integer numberOfEventIndicators;
input Real in_Flow;
input Real in_Flow_Event;
output Real fmi_z[numberOfEventIndicators];
external "C" fmiGetEventIndicators_OMC(fmi, numberOfEventIndicators, fmi_z, in_Flow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
external "C" fmiGetEventIndicators_OMC(fmi, numberOfEventIndicators, fmi_z, in_Flow_Event) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
end fmiGetEventIndicators;

function fmiGetDerivatives
Expand All @@ -1225,9 +1264,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
function fmiCompletedIntegratorStep
input fmiImportInstance fmi;
input Boolean in_callEventUpdate;
input Real in_Flow;
output Real out_Flow;
external "C" out_Flow = fmiCompletedIntegratorStep_OMC(fmi, in_callEventUpdate, in_Flow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
input Real in_Flow_States;
output Real out_Flow_Event;
external "C" out_Flow_Event = fmiCompletedIntegratorStep_OMC(fmi, in_callEventUpdate, in_Flow_States) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
end fmiCompletedIntegratorStep;

function fmiTerminate
Expand All @@ -1245,45 +1284,6 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
constant Integer fmiFatal=4;
constant Integer fmiPending=5;
end fmiStatus;
equation
(fmi_status, flowControlStates, eventInfo) = fmiFunctions.fmiInitialize(fmi, "<%fmiInfo.fmiModelIdentifier%>", debugLogging, time, eventInfo);
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
<<
fmi_x = fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowControlStates, fmi_x_dummy);
>>
%>
der(fmi_x) = fmiFunctions.fmiGetDerivatives(fmi, numberOfContinuousStates, flowControlStates);
flowControlTime = fmiFunctions.fmiSetTime(fmi, time, 1);
flowControlStatesInputs = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x, flowControlTime);
fmi_z = fmiFunctions.fmiGetEventIndicators(fmi, numberOfEventIndicators, flowControlEvent);
for i in 1:size(fmi_z,1) loop
fmi_z_positive[i] = if not terminal() then fmi_z[i] > 0 else pre(fmi_z_positive[i]);
end for;
algorithm
<%if intGt(listLength(fmiInfo.fmiNumberOfEventIndicators), 0) then
<<
when (<%fmiInfo.fmiNumberOfEventIndicators |> eventIndicator => "change(fmi_z_positive["+eventIndicator+"])" ;separator=" or "%>) and not initial() then
>>
else
<<
when not initial() then
>>
%>
fmiFunctions.fmiEventUpdate(fmi, callEventUpdate, eventInfo);
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
<<
fmi_x_new := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowControlEvent, fmi_x_dummy);
<%fmiInfo.fmiNumberOfContinuousStates |> continuousStates => "reinit(fmi_x["+continuousStates+"], fmi_x_new["+continuousStates+"]);" ;separator="\n"%>
>>
%>
end when;
equation
flowControlEvent = fmiFunctions.fmiCompletedIntegratorStep(fmi, callEventUpdate, flowControlStatesInputs);
<%if not stringEq(realVariables, "0") then "{"+dumpRealVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetReal(fmi, {"+dumpRealVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(integerVariables, "0") then "{"+dumpIntegerVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetInteger(fmi, {"+dumpIntegerVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(booleanVariables, "0") then "{"+dumpBooleanVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetBoolean(fmi, {"+dumpBooleanVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
<%if not stringEq(stringVariables, "0") then "{"+dumpStringVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetString(fmi, {"+dumpStringVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
annotation(experiment(StartTime=<%fmiExperimentAnnotation.fmiExperimentStartTime%>, StopTime=<%fmiExperimentAnnotation.fmiExperimentStopTime%>, Tolerance=<%fmiExperimentAnnotation.fmiExperimentTolerance%>));
end <%fmiInfo.fmiModelIdentifier%>_<%getFMIType(fmiInfo)%>_FMU;
>>
end importFMUModelExchange;
Expand Down

0 comments on commit cb2f485

Please sign in to comment.