Skip to content

Commit

Permalink
- split initialAnalyticJacobian into several functions one for each s…
Browse files Browse the repository at this point in the history
…parsity pattern (gets the compilation memory down for Spice examples)

- updated tests


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@17639 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adrpo committed Oct 10, 2013
1 parent 219f108 commit ddb1cb1
Showing 1 changed file with 33 additions and 7 deletions.
40 changes: 33 additions & 7 deletions Compiler/Template/CodegenC.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2389,6 +2389,31 @@ template functionAnalyticJacobians(list<JacobianMatrix> JacobianMatrixes) "templ
>>
end functionAnalyticJacobians;


template mkSparseFunction(String matrixname, String matrixIndex, DAE.ComponentRef cref, list<DAE.ComponentRef> indexes)
"generate "
::=
match matrixname
case _ then
let indexrows = ( indexes |> indexrow hasindex index0 =>
<<
i = data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex[<%cref(cref)%>$pDER<%matrixname%>$indexdiff] - <%listLength(indexes)%>;
data->simulationInfo.analyticJacobians[index].sparsePattern.index[i+<%index0%>] = <%cref(indexrow)%>$pDER<%matrixname%>$indexdiffed;
>>
;separator="\n")

<<
static void initialAnalyticJacobian<%matrixname%>_<%matrixIndex%>(DATA* data, int index)
{
int i;
/* write index for cref: <%cref(cref)%> */
<%indexrows%>
}
<%\n%>
>>
end match
end mkSparseFunction;

template initialAnalyticJacobians(list<JacobianColumn> jacobianColumn, list<SimVar> seedVars, String matrixname, list<tuple<DAE.ComponentRef,list<DAE.ComponentRef>>> sparsepattern, list<list<DAE.ComponentRef>> colorList, Integer maxColor)
"template initialAnalyticJacobians
This template generates source code for functions that initialize the sparse-pattern for a single jacobian.
Expand All @@ -2412,21 +2437,19 @@ case _ then
}
>>
case _ then
let &eachCrefParts = buffer ""
let sp_size_index = lengthListElements(splitTuple212List(sparsepattern))
let sizeleadindex = listLength(sparsepattern)
let leadindex = (sparsepattern |> (cref,indexes) hasindex index0 =>
<<
data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex[<%cref(cref)%>$pDER<%matrixname%>$indexdiff] = <%listLength(indexes)%>;
>>
;separator="\n")
let indexElems = ( sparsepattern |> (cref,indexes) =>
let indexrows = ( indexes |> indexrow hasindex index0 =>
let indexElems = ( sparsepattern |> (cref,indexes) hasindex index0 =>
let &eachCrefParts += mkSparseFunction(matrixname, index0, cref, indexes)
<<
i = data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex[<%cref(cref)%>$pDER<%matrixname%>$indexdiff] - <%listLength(indexes)%>;
data->simulationInfo.analyticJacobians[index].sparsePattern.index[i+<%index0%>] = <%cref(indexrow)%>$pDER<%matrixname%>$indexdiffed;
initialAnalyticJacobian<%matrixname%>_<%index0%>(data, index);
>>
;separator="\n")
'<%indexrows%>'
;separator="\n")
let colorArray = (colorList |> (indexes) hasindex index0 =>
let colorCol = ( indexes |> i_index =>
Expand All @@ -2438,6 +2461,9 @@ case _ then
let tmpvarsSize = (jacobianColumn |> (_,vars,_) => listLength(vars);separator="\n")
let index_ = listLength(seedVars)
<<

<%eachCrefParts%>

int initialAnalyticJacobian<%matrixname%>(void* inData)
{
DATA* data = ((DATA*)inData);
Expand All @@ -2462,7 +2488,7 @@ case _ then
data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex[i] += data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex[i-1];
/* write index */
/* call functions to write index for each cref */
<%indexElems%>
/* write color array */
Expand Down

0 comments on commit ddb1cb1

Please sign in to comment.