Skip to content

Commit

Permalink
- Write derivatives dependecies.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21127 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Jun 16, 2014
1 parent f0a3a19 commit 23c7673
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 45 deletions.
54 changes: 41 additions & 13 deletions Compiler/BackEnd/SimCodeUtil.mo
Expand Up @@ -13529,8 +13529,8 @@ algorithm
stringAlgVars, stringParamVars, stringAliasVars, extObjVars, constVars, intConstVars, boolConstVars, stringConstVars,jacobianVars,realOptimizeConstraintsVars))
equation
fmiModelStructure = SimCode.FMIMODELSTRUCTURE(SimCode.FMIOUTPUTS({}), SimCode.FMIDERIVATIVES({}));
fmiModelStructure = getFMIModelStructureHelper(stateVars, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(derivativeVars, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(inVars, stateVars, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(inVars, derivativeVars, fmiModelStructure);
/*(algVars, index_) = setVariableIndexHelper(algVars, index_);
(discreteAlgVars, index_) = setVariableIndexHelper(discreteAlgVars, index_);
(intAlgVars, index_) = setVariableIndexHelper(intAlgVars, index_);
Expand Down Expand Up @@ -13558,52 +13558,80 @@ algorithm
end getFMIModelStructure;

protected function getFMIModelStructureHelper
input SimCode.SimVars inAllVars;
input list<SimCode.SimVar> inVars;
input SimCode.FmiModelStructure inFmiModelStructure;
output SimCode.FmiModelStructure outFmiModelStructure;
algorithm
outFmiModelStructure := matchcontinue (inVars, inFmiModelStructure)
outFmiModelStructure := matchcontinue (inAllVars, inVars, inFmiModelStructure)
local
list<SimCode.SimVar> stateVars_;
list<SimCode.SimVar> xs;
Integer index_;
Integer index_, variableIndex, variableIndexOfStateVar;
SimCode.FmiModelStructure fmiModelStructure;
SimCode.FmiOutputs fmiOutputs_;
SimCode.FmiDerivatives fmiDerivatives_;
list<SimCode.FmiUnknown> fmiUnknownsList_;
SimCode.FmiUnknown fmiUnknown;

case ((SimCode.SIMVAR(causality = SimCode.OUTPUT(), variable_index = SOME(index_)) :: xs),
case (inAllVars, (SimCode.SIMVAR(causality = SimCode.OUTPUT(), variable_index = SOME(variableIndex)) :: xs),
(fmiModelStructure as SimCode.FMIMODELSTRUCTURE(fmiOutputs = SimCode.FMIOUTPUTS(fmiUnknownsList = fmiUnknownsList_),
fmiDerivatives = fmiDerivatives_)))
equation
fmiUnknown = SimCode.FMIUNKNOWN(index_, {}, {});
fmiUnknown = SimCode.FMIUNKNOWN(variableIndex, {}, {}); /* empty dependencies & dependenciesKind list for outputs. */
fmiUnknownsList_ = listAppend(fmiUnknownsList_, {fmiUnknown});
fmiOutputs_ = SimCode.FMIOUTPUTS(fmiUnknownsList_);
fmiModelStructure = SimCode.FMIMODELSTRUCTURE(fmiOutputs_, fmiDerivatives_);
fmiModelStructure = getFMIModelStructureHelper(xs, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(inAllVars, xs, fmiModelStructure);
then
fmiModelStructure;

case ((SimCode.SIMVAR(varKind=BackendDAE.STATE_DER(), variable_index = SOME(index_)) :: xs),
case (SimCode.SIMVARS(stateVars = stateVars_), (SimCode.SIMVAR(varKind=BackendDAE.STATE_DER(), index = index_, variable_index = SOME(variableIndex)) :: xs),
(fmiModelStructure as SimCode.FMIMODELSTRUCTURE(fmiOutputs = fmiOutputs_,
fmiDerivatives = SimCode.FMIDERIVATIVES(fmiUnknownsList = fmiUnknownsList_))))
equation
fmiUnknown = SimCode.FMIUNKNOWN(index_, {}, {});
variableIndexOfStateVar = getStateSimVarIndexFromIndex(stateVars_, index_);
/* FIXME! For now using fixed as default dependenciesKind. */
fmiUnknown = SimCode.FMIUNKNOWN(variableIndex, {variableIndexOfStateVar}, {"fixed"});
fmiUnknownsList_ = listAppend(fmiUnknownsList_, {fmiUnknown});
fmiDerivatives_ = SimCode.FMIDERIVATIVES(fmiUnknownsList_);
fmiModelStructure = SimCode.FMIMODELSTRUCTURE(fmiOutputs_, fmiDerivatives_);
fmiModelStructure = getFMIModelStructureHelper(xs, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(inAllVars, xs, fmiModelStructure);
then
fmiModelStructure;

case ((_ :: xs), fmiModelStructure)
case (inAllVars, (_ :: xs), fmiModelStructure)
equation
fmiModelStructure = getFMIModelStructureHelper(xs, fmiModelStructure);
fmiModelStructure = getFMIModelStructureHelper(inAllVars, xs, fmiModelStructure);
then
fmiModelStructure;

case ({}, fmiModelStructure) then fmiModelStructure;
case (_, {}, fmiModelStructure) then fmiModelStructure;
end matchcontinue;
end getFMIModelStructureHelper;

public function getStateSimVarIndexFromIndex
input list<SimCode.SimVar> inStateVars;
input Integer inIndex;
output Integer outVariableIndex;
protected
SimCode.SimVar stateVar;
algorithm
stateVar := listGet(inStateVars, inIndex + 1 /* SimVar indexes start from zero */);
outVariableIndex := getVariableIndex(stateVar);
end getStateSimVarIndexFromIndex;

public function getVariableIndex
input SimCode.SimVar inVar;
output Integer outVariableIndex;
algorithm
outVariableIndex := match (inVar)
local
Integer variableIndex;
case (SimCode.SIMVAR(variable_index = SOME(variableIndex)))
then variableIndex;
else 0;
end match;
end getVariableIndex;

end SimCodeUtil;
72 changes: 40 additions & 32 deletions Compiler/Template/CodegenFMU.tpl
Expand Up @@ -207,13 +207,13 @@ match varKind
else "calculated"
end hasStartValue;

template ScalarVariableType2(DAE.Type type_, String unit, String displayUnit, Option<DAE.Exp> initialValue, VarKind varKind, Integer index)
template ScalarVariableType2(list<SimVar> stateVars, DAE.Type type_, String unit, String displayUnit, Option<DAE.Exp> initialValue, VarKind varKind, Integer index)
"Generates code for ScalarVariable Type file for FMU 2.0 target."
::=
match type_
case T_INTEGER(__) then '<Integer<%ScalarVariableTypeCommonAttribute2(initialValue)%>/>'
/* Don't generate the units for now since it is wrong. If you generate a unit attribute here then we must add the UnitDefinitions tag section also. */
case T_REAL(__) then '<Real<%RealVariableTypeCommonAttribute2(initialValue, varKind, index)%>/>'
case T_REAL(__) then '<Real<%RealVariableTypeCommonAttribute2(stateVars, initialValue, varKind, index)%>/>'
case T_BOOL(__) then '<Boolean<%ScalarVariableTypeCommonAttribute2(initialValue)%>/>'
case T_STRING(__) then '<String<%StringVariableTypeCommonAttribute2(initialValue)%>/>'
case T_ENUMERATION(__) then '<Enumeration declaredType="<%Absyn.pathString2NoLeadingDot(path, ".")%>"<%ScalarVariableTypeCommonAttribute2(initialValue)%>/>'
Expand All @@ -238,11 +238,11 @@ match initialValue
case SOME(exp) then '<%StartString2(exp)%>'
end ScalarVariableTypeCommonAttribute2;

template RealVariableTypeCommonAttribute2(Option<DAE.Exp> initialValue, VarKind varKind, Integer index)
template RealVariableTypeCommonAttribute2(list<SimVar> stateVars, Option<DAE.Exp> initialValue, VarKind varKind, Integer index)
"Generates code for ScalarVariable Type file for FMU 2.0 target."
::=
match varKind
case STATE_DER(__) then ' derivative="<%index%>"'
case STATE_DER(__) then ' derivative="<%getStateSimVarIndexFromIndex(stateVars, index)%>"'
else
match initialValue
case SOME(exp) then ' start="<%initValXml(exp)%>"'
Expand Down Expand Up @@ -406,65 +406,65 @@ template ModelVariables(ModelInfo modelInfo, String FMUVersion)
"Generates code for ModelVariables file for FMU target."
::=
match modelInfo
case MODELINFO(vars=SIMVARS(__)) then
case MODELINFO(vars=SIMVARS(stateVars=stateVars)) then
<<
<ModelVariables>
<%System.tmpTickReset(0)%>
<%vars.stateVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.derivativeVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.algVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.discreteAlgVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.paramVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.aliasVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%System.tmpTickReset(0)%>
<%vars.intAlgVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.intParamVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.intAliasVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%System.tmpTickReset(0)%>
<%vars.boolAlgVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.boolParamVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.boolAliasVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%System.tmpTickReset(0)%>
<%vars.stringAlgVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.stringParamVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%vars.stringAliasVars |> var =>
ScalarVariable(var, FMUVersion)
ScalarVariable(stateVars, var, FMUVersion)
;separator="\n"%>
<%System.tmpTickReset(0)%>
<%externalFunctions(modelInfo)%>
</ModelVariables>
>>
end ModelVariables;

template ScalarVariable(SimVar simVar, String FMUVersion)
template ScalarVariable(list<SimVar> stateVars, SimVar simVar, String FMUVersion)
"Generates code for ScalarVariable file for FMU target."
::=
match simVar
Expand All @@ -475,10 +475,10 @@ case SIMVAR(__) then
<<>>
else if stringEq(FMUVersion, "2.0") then
<<
<!-- Index of variable = <%getVariableIndex(variable_index)%> -->
<!-- Index of variable = "<%getVariableIndex(simVar)%>" -->
<ScalarVariable
<%ScalarVariableAttribute2(simVar)%>>
<%ScalarVariableType2(type_,unit,displayUnit,initialValue,varKind,index)%>
<%ScalarVariableType2(stateVars, type_,unit,displayUnit,initialValue,varKind,index)%>
</ScalarVariable>
>>
else
Expand All @@ -490,14 +490,6 @@ case SIMVAR(__) then
>>
end ScalarVariable;

template getVariableIndex(Option<Integer> variable_index)
"Returns the variable index of SimVar"
::=
match variable_index
case SOME(index) then index
else ""
end getVariableIndex;

template ScalarVariableAttribute(SimVar simVar)
"Generates code for ScalarVariable Attribute file for FMU target."
::=
Expand Down Expand Up @@ -684,10 +676,26 @@ template FmiUnknownAttributes(FmiUnknown fmiUnknown)
match fmiUnknown
case FMIUNKNOWN(__) then
<<
<Unknown index="<%index%>" />
<Unknown index="<%index%>"<%FmiUnknownDependencies(dependencies)%><%FmiUnknownDependenciesKind(dependenciesKind)%> />
>>
end FmiUnknownAttributes;

template FmiUnknownDependencies(list<Integer> dependencies)
::=
if intGt(listLength(dependencies), 0) then
<<
dependencies="<%dependencies |> dependency => dependency ;separator=" "%>"
>>
end FmiUnknownDependencies;

template FmiUnknownDependenciesKind(list<String> dependenciesKind)
::=
if intGt(listLength(dependenciesKind), 0) then
<<
dependenciesKind="<%dependenciesKind |> dependencyKind => dependencyKind ;separator=" "%>"
>>
end FmiUnknownDependenciesKind;

template fmumodel_identifierFile(SimCode simCode, String guid, String FMUVersion)
"Generates code for ModelDescription file for FMU target."
::=
Expand Down
11 changes: 11 additions & 0 deletions Compiler/Template/SimCodeTV.mo
Expand Up @@ -795,6 +795,17 @@ package SimCodeUtil
input SimCode.SimVars inVars;
output SimCode.FmiModelStructure outFmiModelStructure;
end getFMIModelStructure;

function getStateSimVarIndexFromIndex
input list<SimCode.SimVar> inStateVars;
input Integer inIndex;
output Integer outVariableIndex;
end getStateSimVarIndexFromIndex;

function getVariableIndex
input SimCode.SimVar inVar;
output Integer outVariableIndex;
end getVariableIndex;

end SimCodeUtil;

Expand Down

0 comments on commit 23c7673

Please sign in to comment.