Skip to content

Commit

Permalink
Implement assignment of arrays to Jacobian vars, ticket:3266,4696
Browse files Browse the repository at this point in the history
Belonging to [master]:
  - OpenModelica/OMCompiler#2230
  • Loading branch information
rfranke authored and OpenModelica-Hudson committed Feb 26, 2018
1 parent b082e74 commit 2cb619a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 46 deletions.
43 changes: 5 additions & 38 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -10944,10 +10944,7 @@ template algloopcppfilenames2(SimEqSystem eq, Context context, Text &varDecls, S
>>
else
""
end algloopcppfilenames2;



end algloopcppfilenames2;


template equationArrayCallAssign(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs,
Expand All @@ -10960,56 +10957,26 @@ match eq
case eqn as SES_ARRAY_CALL_ASSIGN(lhs=lhs as CREF(__)) then
let &preExp = buffer "" /*BUFD*/
let expPart = daeExp(exp, context, &preExp /*BUF let &preExp = buffer "" /*BUFD*/
let &helpInits = buffer "" /*BUFD*/
let helpIf = (conditions |> (e, hidx) =>
let &helpInits = buffer "" /*BUFD*/
let helpIf = (conditions |> (e, hidx) =>
let helpInit = daeExp(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, useFlatArrayNotation)
let &helpInits += 'localData->helpVars[<%hidx%>] = <%helpInit%>;'
'localData->helpVars[<%hidx%>] && !localData->helpVars_saved[<%hidx%>] /* edge */'
;separator=" || ")C*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
match expTypeFromExpShort(eqn.exp)
case "boolean" then


<<
<%preExp%>
<%cref1(lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>=<%expPart%>;
>>
case "boolean"
case "int" then

<<
<%preExp%>

<%cref1(lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>=<%expPart%>;
>>
case "double" then
<<
<%preExp%>
<%assignDerArray(context,expPart,lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
<%assignDerArray(context, expPart, lhs, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
>>
end equationArrayCallAssign;

template assignDerArray(Context context, String arr, ComponentRef c,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
::=
cref2simvar(c, simCode ) |> var as SIMVAR(__) =>
match varKind
case STATE(__) then
let &varDeclsCref = buffer "" /*BUFD*/
<<
/*<%cref(c,useFlatArrayNotation)%>*/
memcpy(&<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>,<%arr%>.getData(),<%arr%>.getNumElems()*sizeof(double));
>>
case STATE_DER(__) then
let &varDeclsCref = buffer "" /*BUFD*/
<<
memcpy(&<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>,<%arr%>.getData(),<%arr%>.getNumElems()*sizeof(double));
>>
else
let &varDeclsCref = buffer "" /*BUFD*/
<<
<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>.assign(<%arr%>);
>>
end assignDerArray;

template equationWhen(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl,
Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
"Generates a when equation."
Expand Down
49 changes: 41 additions & 8 deletions Compiler/Template/CodegenCppCommon.tpl
Expand Up @@ -486,10 +486,11 @@ template daeExpCrefRhsArrayBox2(Text var,DAE.Type type, Context context, Text &p
//let size = (dims |> dim => dimension(dim) ;separator="+")
// let arrayassign = '<%arrayVar%>.assign(&<%var%>,&<%var%>+(<%size%>));<%\n%>'
let arrayassign = '<%arrayVar%>.assign(&<%var%>);<%\n%>'
let &preExp += '
//tmp array3
<%boostExtents%>
<%arrayassign%>'
let &preExp +=
<<
<%boostExtents%>
<%arrayassign%>
>>
arrayVar
else
var
Expand Down Expand Up @@ -2743,6 +2744,41 @@ template encloseInParantheses(String expStr)
if intEq(stringGet(expStr, 1), stringGet("(", 1)) then '<%expStr%>' else '(<%expStr%>)'
end encloseInParantheses;

template assignDerArray(Context context, String arr, Exp lhs_ecr, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
"Assign array considering special treatment of states and Jacobian vars"
::=
match lhs_ecr
case CREF(componentRef=c, ty=ty as DAE.T_ARRAY(ty=elty, dims=dims)) then
let &varDeclsCref = buffer "" /*BUFD*/
let lhsStr = cref1(c, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)
match cref2simvar(c, simCode)
case SIMVAR(varKind=varKind) then
match varKind
case STATE()
case STATE_DER() then
//STATE vars are flat vectors
<<
/*assign to <%cref(c,useFlatArrayNotation)%>*/
memcpy(&<%lhsStr%>, <%arr%>.getData(), <%arr%>.getNumElems()*sizeof(double));
>>
case JAC_VAR()
case JAC_DIFF_VAR()
case SEED_VAR() then
//JAC/DIFF/SEED vars are flat vectors with row major odering
let dimstr = listDimsFlat(dims, elty)
let arrayWrapper = 'tmp<%System.tmpTick()%>'
<<
/*assign through wrapper array*/
StatArrayDim<%nDimsFlat(dims, elty, 0)%><<%expTypeShort(elty)%>, <%dimstr%>, true> <%arrayWrapper%>(&<%lhsStr%>);
assignRowMajorData(<%arr%>.getData(), <%arrayWrapper%>);
>>
else
<<
/*default array assign*/
<%lhsStr%>.assign(<%arr%>);
>>
end assignDerArray;

template writeLhsCref(Exp exp, String rhsStr, Context context, Text &preExp, Text &varDecls, SimCode simCode,
Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName, Boolean useFlatArrayNotation)
"Generates code for writing a returnStructur to var."
Expand All @@ -2751,10 +2787,7 @@ match exp
case ecr as CREF(componentRef=WILD(__)) then
''
case ecr as CREF(ty= t as DAE.T_ARRAY(__)) then
let lhsStr = scalarLhsCref(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
<<
<%lhsStr%>.assign(<%rhsStr%>);
>>
'<%assignDerArray(context, rhsStr, exp, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>'
case UNARY(exp = e as CREF(ty= t as DAE.T_ARRAY(__))) then
let lhsStr = scalarLhsCref(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
match context
Expand Down

0 comments on commit 2cb619a

Please sign in to comment.