Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 2cb619a

Browse files
rfrankeOpenModelica-Hudson
authored andcommitted
Implement assignment of arrays to Jacobian vars, ticket:3266,4696
Belonging to [master]: - #2230
1 parent b082e74 commit 2cb619a

File tree

2 files changed

+46
-46
lines changed

2 files changed

+46
-46
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10944,10 +10944,7 @@ template algloopcppfilenames2(SimEqSystem eq, Context context, Text &varDecls, S
1094410944
>>
1094510945
else
1094610946
""
10947-
end algloopcppfilenames2;
10948-
10949-
10950-
10947+
end algloopcppfilenames2;
1095110948

1095210949

1095310950
template equationArrayCallAssign(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs,
@@ -10960,56 +10957,26 @@ match eq
1096010957
case eqn as SES_ARRAY_CALL_ASSIGN(lhs=lhs as CREF(__)) then
1096110958
let &preExp = buffer "" /*BUFD*/
1096210959
let expPart = daeExp(exp, context, &preExp /*BUF let &preExp = buffer "" /*BUFD*/
10963-
let &helpInits = buffer "" /*BUFD*/
10964-
let helpIf = (conditions |> (e, hidx) =>
10960+
let &helpInits = buffer "" /*BUFD*/
10961+
let helpIf = (conditions |> (e, hidx) =>
1096510962
let helpInit = daeExp(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, useFlatArrayNotation)
1096610963
let &helpInits += 'localData->helpVars[<%hidx%>] = <%helpInit%>;'
1096710964
'localData->helpVars[<%hidx%>] && !localData->helpVars_saved[<%hidx%>] /* edge */'
1096810965
;separator=" || ")C*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
1096910966
match expTypeFromExpShort(eqn.exp)
10970-
case "boolean" then
10971-
10972-
10973-
<<
10974-
<%preExp%>
10975-
<%cref1(lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>=<%expPart%>;
10976-
>>
10967+
case "boolean"
1097710968
case "int" then
10978-
1097910969
<<
1098010970
<%preExp%>
10981-
1098210971
<%cref1(lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>=<%expPart%>;
1098310972
>>
1098410973
case "double" then
1098510974
<<
1098610975
<%preExp%>
10987-
<%assignDerArray(context,expPart,lhs.componentRef,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
10976+
<%assignDerArray(context, expPart, lhs, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
1098810977
>>
1098910978
end equationArrayCallAssign;
1099010979

10991-
template assignDerArray(Context context, String arr, ComponentRef c,SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
10992-
::=
10993-
cref2simvar(c, simCode ) |> var as SIMVAR(__) =>
10994-
match varKind
10995-
case STATE(__) then
10996-
let &varDeclsCref = buffer "" /*BUFD*/
10997-
<<
10998-
/*<%cref(c,useFlatArrayNotation)%>*/
10999-
memcpy(&<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>,<%arr%>.getData(),<%arr%>.getNumElems()*sizeof(double));
11000-
>>
11001-
case STATE_DER(__) then
11002-
let &varDeclsCref = buffer "" /*BUFD*/
11003-
<<
11004-
memcpy(&<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>,<%arr%>.getData(),<%arr%>.getNumElems()*sizeof(double));
11005-
>>
11006-
else
11007-
let &varDeclsCref = buffer "" /*BUFD*/
11008-
<<
11009-
<%cref1(c,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)%>.assign(<%arr%>);
11010-
>>
11011-
end assignDerArray;
11012-
1101310980
template equationWhen(SimEqSystem eq, Context context, Text &varDecls, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl,
1101410981
Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
1101510982
"Generates a when equation."

Compiler/Template/CodegenCppCommon.tpl

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -486,10 +486,11 @@ template daeExpCrefRhsArrayBox2(Text var,DAE.Type type, Context context, Text &p
486486
//let size = (dims |> dim => dimension(dim) ;separator="+")
487487
// let arrayassign = '<%arrayVar%>.assign(&<%var%>,&<%var%>+(<%size%>));<%\n%>'
488488
let arrayassign = '<%arrayVar%>.assign(&<%var%>);<%\n%>'
489-
let &preExp += '
490-
//tmp array3
491-
<%boostExtents%>
492-
<%arrayassign%>'
489+
let &preExp +=
490+
<<
491+
<%boostExtents%>
492+
<%arrayassign%>
493+
>>
493494
arrayVar
494495
else
495496
var
@@ -2743,6 +2744,41 @@ template encloseInParantheses(String expStr)
27432744
if intEq(stringGet(expStr, 1), stringGet("(", 1)) then '<%expStr%>' else '(<%expStr%>)'
27442745
end encloseInParantheses;
27452746

2747+
template assignDerArray(Context context, String arr, Exp lhs_ecr, SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
2748+
"Assign array considering special treatment of states and Jacobian vars"
2749+
::=
2750+
match lhs_ecr
2751+
case CREF(componentRef=c, ty=ty as DAE.T_ARRAY(ty=elty, dims=dims)) then
2752+
let &varDeclsCref = buffer "" /*BUFD*/
2753+
let lhsStr = cref1(c, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, context, varDeclsCref, stateDerVectorName, useFlatArrayNotation)
2754+
match cref2simvar(c, simCode)
2755+
case SIMVAR(varKind=varKind) then
2756+
match varKind
2757+
case STATE()
2758+
case STATE_DER() then
2759+
//STATE vars are flat vectors
2760+
<<
2761+
/*assign to <%cref(c,useFlatArrayNotation)%>*/
2762+
memcpy(&<%lhsStr%>, <%arr%>.getData(), <%arr%>.getNumElems()*sizeof(double));
2763+
>>
2764+
case JAC_VAR()
2765+
case JAC_DIFF_VAR()
2766+
case SEED_VAR() then
2767+
//JAC/DIFF/SEED vars are flat vectors with row major odering
2768+
let dimstr = listDimsFlat(dims, elty)
2769+
let arrayWrapper = 'tmp<%System.tmpTick()%>'
2770+
<<
2771+
/*assign through wrapper array*/
2772+
StatArrayDim<%nDimsFlat(dims, elty, 0)%><<%expTypeShort(elty)%>, <%dimstr%>, true> <%arrayWrapper%>(&<%lhsStr%>);
2773+
assignRowMajorData(<%arr%>.getData(), <%arrayWrapper%>);
2774+
>>
2775+
else
2776+
<<
2777+
/*default array assign*/
2778+
<%lhsStr%>.assign(<%arr%>);
2779+
>>
2780+
end assignDerArray;
2781+
27462782
template writeLhsCref(Exp exp, String rhsStr, Context context, Text &preExp, Text &varDecls, SimCode simCode,
27472783
Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName, Boolean useFlatArrayNotation)
27482784
"Generates code for writing a returnStructur to var."
@@ -2751,10 +2787,7 @@ match exp
27512787
case ecr as CREF(componentRef=WILD(__)) then
27522788
''
27532789
case ecr as CREF(ty= t as DAE.T_ARRAY(__)) then
2754-
let lhsStr = scalarLhsCref(exp, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
2755-
<<
2756-
<%lhsStr%>.assign(<%rhsStr%>);
2757-
>>
2790+
'<%assignDerArray(context, rhsStr, exp, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>'
27582791
case UNARY(exp = e as CREF(ty= t as DAE.T_ARRAY(__))) then
27592792
let lhsStr = scalarLhsCref(e, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
27602793
match context

0 commit comments

Comments
 (0)