Skip to content

Commit

Permalink
- improved Backend compile time for big models with many parameters a…
Browse files Browse the repository at this point in the history
… lot.

  +BackendDAEUtil.mo
    - shifted evaluation of depending parameters to 
      runtime as it's much faster than at compile time.
  +SimCode.mo
     - actually nothing.
  +BackendVariables.mo
    - removed a sorting function for translateDAE instead
      sort by merge sort from List module. It scales much better.
      
- expand reading initial values from file with Integer and Boolean variables.
  +SimulationRuntime/c/math-support/initialization.c



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@11850 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed May 4, 2012
1 parent 736d0de commit bb6a96c
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 137 deletions.
15 changes: 12 additions & 3 deletions Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -1207,11 +1207,20 @@ algorithm
varType = ty, bindExp = SOME(e), arryDim = dims, index = idx, source = src,
values = va, comment = c, flowPrefix = fp, streamPrefix = sp), cache, env, _)
equation
((e2, _)) = Expression.traverseExp(e, replaceCrefsWithValues, (vars, cr));
(_, v, _) = Ceval.ceval(cache, env, e2, false,NONE(), Ceval.NO_MSG());
// wbraun: Evaluate parameter expressions only if they are
// constant at compile time otherwise we solve them
// much faster at runtime.
//((e, _)) = Expression.traverseExp(e, replaceCrefsWithValues, (vars, cr_orign));
true = Expression.isConst(e);
(_, v, _) = Ceval.ceval(cache, env, e, false, NONE(), Ceval.NO_MSG());
then
BackendDAE.VAR(cr, vk, vd, prl, ty, SOME(e), SOME(v), dims, idx, src, va, c, fp, sp);
else inVar;
case (BackendDAE.VAR(varName = cr, varKind = vk, varDirection = vd, varParallelism = prl,
varType = ty, bindExp = SOME(e), arryDim = dims, index = idx, source = src,
values = va, comment = c, flowPrefix = fp, streamPrefix = sp), _, _, _)
then
BackendDAE.VAR(cr, vk, vd, prl, ty, SOME(e), NONE(), dims, idx, src, va, c, fp, sp);
//else inVar;
end matchcontinue;
end calculateValue;

Expand Down
162 changes: 36 additions & 126 deletions Compiler/BackEnd/BackendVariable.mo
Expand Up @@ -2050,6 +2050,7 @@ algorithm
BackendDAE.Value x,xd,y,p,dummy,ext,x_strType,xd_strType,y_strType,p_strType,dummy_strType;
case (varsLst,knvars,extvars)
equation
Debug.execStat("translateDAE calculateIndexes 1",BackendDAE.RT_CLOCK_EXECSTAT_BACKEND_MODULES);
// store vars,knvars,extvars in the list
vars_map = fillListListConst(varsLst,0,{});
knvars_map = fillListConst(knvars,-1,0,{});
Expand All @@ -2059,9 +2060,8 @@ algorithm
all_map1 = listAppend(all_map,extvars_map);
// seperate scalars and non scalars
(noScalar_map,scalar_map) = getNoScalarVars(all_map1);

noScalar_map1 = getAllElements(noScalar_map);
sort_map = sortNoScalarList(noScalar_map1);
sort_map = List.sort(noScalar_map1,comparingNonScalarsTuple);
//print("\nsort_map:\n");
//dumpSortMap(sort_map);
// connect scalars and sortet non scalars
Expand Down Expand Up @@ -2356,32 +2356,6 @@ algorithm
end match;
end getAllElements1;

protected function sortNoScalarList
"function: sortNoScalarList
author: Frenkel TUD
Takes a list of unsortet noScalarVars
and returns a sorted list"
input list<tuple<BackendDAE.Var,Integer,Integer> > inlist;
output list<tuple<BackendDAE.Var,Integer,Integer> > outlist;
algorithm
outlist:=
match (inlist)
local
list<tuple<BackendDAE.Var,Integer,Integer>> rest,var_lst,var_lst1,out_lst;
BackendDAE.Var var;
Boolean ins;
Integer typ,place;
case {} then {};
case ((var,typ,place) :: rest)
equation
var_lst = sortNoScalarList(rest);
(var_lst1,ins) = sortNoScalarList1((var,typ,place),var_lst);
out_lst = listAppendTyp(boolNot(ins),(var,typ,place),var_lst1);
then
out_lst;
end match;
end sortNoScalarList;

protected function listAppendTyp
"function: listAppendTyp
author: Frenkel TUD
Expand All @@ -2408,101 +2382,6 @@ algorithm
end match;
end listAppendTyp;

protected function sortNoScalarList1
"function: sortNoScalarList1
author: Frenkel TUD
Helper function for sortNoScalarList"
input tuple<BackendDAE.Var,Integer,Integer> invar;
input list<tuple<BackendDAE.Var,Integer,Integer> > inlist;
output list<tuple<BackendDAE.Var,Integer,Integer> > outlist;
output Boolean insert;
algorithm
(outlist,insert) := match (invar,inlist)
local
list<tuple<BackendDAE.Var,Integer,Integer>> rest,var_lst,var_lst1;
BackendDAE.Var var,var1;
Boolean ins,ins1;
Integer typ,typ1,place,place1;

case (_,{}) then ({},false);

case ((var,typ,place),(var1,typ1,place1)::rest)
equation
(var_lst,ins) = sortNoScalarList1((var,typ,place),rest);
(var_lst1,ins1) = sortNoScalarList2(ins,(var,typ,place),(var1,typ1,place1),var_lst);
then
(var_lst1,ins1);
end match;
end sortNoScalarList1;

protected function sortNoScalarList2
"function: sortNoScalarList2
author: Frenkel TUD
Helper function for sortNoScalarList
Takes a list of unsortet noScalarVars
and returns a sorte list"
input Boolean ininsert;
input tuple<BackendDAE.Var,Integer,Integer> invar;
input tuple<BackendDAE.Var,Integer,Integer> invar1;
input list< tuple<BackendDAE.Var,Integer,Integer> > inlist;
output list< tuple<BackendDAE.Var,Integer,Integer> > outlist;
output Boolean outinsert;
algorithm
(outlist,outinsert):=
match (ininsert,invar,invar1,inlist)
local
list< tuple<BackendDAE.Var,Integer,Integer> > var_lst,var_lst1,var_lst2;
BackendDAE.Var var,var1;
Integer typ,typ1,place,place1;
Boolean ins;
case (false,(var,typ,place),(var1,typ1,place1),var_lst)
equation
ins = comparingNonScalars(var,var1);
var_lst1 = Util.if_(ins,{(var1,typ1,place1),(var,typ,place)},{(var1,typ1,place1)});
var_lst2 = listAppend(var_lst1,var_lst);
then
(var_lst2,ins);
case (true,(var,typ,place),(var1,typ1,place1),var_lst)
equation
var_lst1 = listAppend({(var1,typ1,place1)},var_lst);
then
(var_lst1,true);
end match;
end sortNoScalarList2;

protected function comparingNonScalars
"function: comparingNonScalars
author: Frenkel TUD
Helper function for sortNoScalarList2
Takes two NonScalars an returns
it in right order
Example1: A[2,2],A[1,1] -> {A[1,1],A[2,2]}
Example2: A[2,2],B[1,1] -> {A[2,2],B[1,1]}"
input BackendDAE.Var invar1;
input BackendDAE.Var invar2;
output Boolean outval;
algorithm
outval:=
matchcontinue (invar1,invar2)
local
DAE.ComponentRef varName1, varName2,c1,c2;
list<DAE.Subscript> arryDim, arryDim1;
list<DAE.Subscript> subscriptLst, subscriptLst1;
Boolean out_val;
case (BackendDAE.VAR(varName = varName1,arryDim = arryDim),BackendDAE.VAR(varName = varName2,arryDim = arryDim1))
equation
c1 = ComponentReference.crefStripLastSubs(varName1);
c2 = ComponentReference.crefStripLastSubs(varName2);
true = ComponentReference.crefEqualNoStringCompare(c1, c2);
subscriptLst = ComponentReference.crefLastSubs(varName1);
subscriptLst1 = ComponentReference.crefLastSubs(varName2);
out_val = comparingNonScalars1(subscriptLst,subscriptLst1,arryDim,arryDim1);
then
out_val;
case (_,_) then false;
end matchcontinue;
end comparingNonScalars;

protected function comparingNonScalars1
"function: comparingNonScalars1
author: Frenkel TUD
Expand Down Expand Up @@ -2534,13 +2413,44 @@ algorithm
dim_lst1_1 = List.stripFirst(dim_lst1);
val1 = calcPlace(index,dim_lst_1);
val2 = calcPlace(index1,dim_lst1_1);
(val1 > val2) = true;
(val1 > val2) = false;
then
true;
case (_,_,_,_) then false;
false;
case (_,_,_,_) then true;
end matchcontinue;
end comparingNonScalars1;

protected function comparingNonScalarsTuple
"function: comparingNonScalars
author: Frenkel TUD
Comparing two NonScalars.
Example1: A[2,2],A[1,1] -> {A[1,1],A[2,2]}
Example2: A[2,2],B[1,1] -> {A[2,2],B[1,1]}"
input tuple<BackendDAE.Var,Integer,Integer> invar1;
input tuple<BackendDAE.Var,Integer,Integer> invar2;
output Boolean outval;
algorithm
outval:=
matchcontinue (invar1,invar2)
local
DAE.ComponentRef varName1, varName2,c1,c2;
list<DAE.Subscript> arryDim, arryDim1;
list<DAE.Subscript> subscriptLst, subscriptLst1;
Boolean out_val;
case ((BackendDAE.VAR(varName = varName1,arryDim = arryDim),_,_),(BackendDAE.VAR(varName = varName2,arryDim = arryDim1),_,_))
equation
c1 = ComponentReference.crefStripLastSubs(varName1);
c2 = ComponentReference.crefStripLastSubs(varName2);
true = ComponentReference.crefEqualNoStringCompare(c1, c2);
subscriptLst = ComponentReference.crefLastSubs(varName1);
subscriptLst1 = ComponentReference.crefLastSubs(varName2);
out_val = comparingNonScalars1(subscriptLst,subscriptLst1,arryDim,arryDim1);
then
out_val;
case (_,_) then true;
end matchcontinue;
end comparingNonScalarsTuple;

protected function calcPlace
"function: calcPlace
author: Frenkel TUD
Expand Down
27 changes: 19 additions & 8 deletions Compiler/BackEnd/SimCode.mo
Expand Up @@ -2426,7 +2426,7 @@ algorithm
(sampleConditions,helpVarInfo) = createSampleConditions(zeroCrossings,helpVarInfo);
sampleEquations = createSampleEquations(sampleEqns);
n_h = listLength(helpVarInfo);

// Add model info
modelInfo = createModelInfo(class_, dlow2, functions, {}, n_h, numberOfInitialEquations, numberOfInitialResiduals, fileDir,ifcpp);

Expand All @@ -2436,9 +2436,10 @@ algorithm
odeEquations = makeEqualLengthLists(odeEquations,Config.noProc());

// Assertions and crap
// create parameter equations
startValueEquations = BackendDAEUtil.foldEqSystem(dlow2,createStartValueEquations,{});
parameterEquations = BackendDAEUtil.foldEqSystem(dlow2,createVarNominalAssertFromVars,{});
parameterEquations = createParameterEquations(shared,parameterEquations);
parameterEquations = createParameterEquations(shared,parameterEquations);
((removedEquations,_)) = BackendEquation.traverseBackendDAEEqns(removedEqs,traversedlowEqToSimEqSystem,({},algs));

algorithmAndEquationAsserts = BackendDAEUtil.foldEqSystem(dlow2,createAlgorithmAndEquationAsserts,{});
Expand Down Expand Up @@ -6345,23 +6346,22 @@ algorithm
end createStartValueEquations;

protected function createParameterEquations
input BackendDAE.Shared shared;
input BackendDAE.Shared inShared;
input list<SimEqSystem> acc;
output list<SimEqSystem> parameterEquations;
algorithm
parameterEquations := matchcontinue (shared,acc)
parameterEquations := matchcontinue (inShared,acc)
local
list<BackendDAE.Equation> parameterEquationsTmp;
BackendDAE.Variables vars,knvars,extobj,v,kn;
array<Algorithm.Algorithm> algs;
array<DAE.Constraint> constrs;
BackendDAE.EquationArray ie,pe,emptyeqns;
BackendDAE.EquationArray ie,pe,emptyeqns,remeqns;
list<SimEqSystem> inalgs,simvarasserts;
list<DAE.Algorithm> ialgs,varasserts,varasserts1;
BackendDAE.BackendDAE paramdlow,paramdlow1;
array<BackendDAE.MultiDimEquation> arrayEqs;
array<BackendDAE.ComplexEquation> complEqs;
DAE.FunctionTree funcs;
BackendDAE.ExternalObjectClasses extObjClasses;
BackendDAE.AliasVariables alisvars;
BackendDAE.IncidenceMatrix m;
Expand All @@ -6374,8 +6374,19 @@ algorithm
BackendDAE.Shared shared;
BackendDAE.EqSystem syst;
BackendDAE.EqSystems systs;
BackendDAE.AliasVariables aliasVars;

case (BackendDAE.SHARED(knownVars=knvars,externalObjects=extobj,initialEqs=ie,algorithms=algs,constraints=constrs,arrayEqs=arrayEqs,complEqs=complEqs,extObjClasses=extObjClasses),acc)
DAE.FunctionTree funcs;
BackendDAE.EventInfo einfo;
BackendDAE.ExternalObjectClasses eoc;
BackendDAE.EqSystems eqs;
BackendDAE.BackendDAEType btp;
BackendDAE.SymbolicJacobians symjacs;

case (BackendDAE.SHARED(knownVars=knvars,externalObjects=extobj,aliasVars=aliasVars,
initialEqs=ie,removedEqs=remeqns,algorithms=algs,constraints=constrs,
arrayEqs=arrayEqs,complEqs=complEqs,extObjClasses=extObjClasses,
functionTree=funcs,eventInfo=einfo,backendDAEType=btp,symjacs=symjacs),acc)
equation
// kvars params
((parameterEquationsTmp,lv,lkn,lv1,lv2,_)) = BackendVariable.traverseBackendDAEVars(knvars,createInitialParamAssignments,({},{},{},{},{},1));
Expand Down Expand Up @@ -6403,7 +6414,7 @@ algorithm
(syst,comps) = BackendDAETransform.strongComponents(syst, shared);
paramdlow = BackendDAE.DAE({syst},shared);
Debug.fcall(Flags.PARAM_DLOW_DUMP, BackendDump.dumpComponents,comps);

(helpVarInfo, BackendDAE.DAE({syst},shared),_) = generateHelpVarInfo(paramdlow);
parameterEquations = createEquations(false, false, true, false, false, syst, shared, 0, comps, helpVarInfo);

Expand Down
46 changes: 46 additions & 0 deletions SimulationRuntime/c/math-support/initialization.c
Expand Up @@ -1197,6 +1197,7 @@ static int importStartValues(DATA *data, const char* pInitFile, double initTime)
ModelicaMatVariable_t *pVar = NULL;
const char *pError = NULL;
char* newVarname = NULL;
double readerValue;

MODEL_DATA *mData = &(data->modelData);
long i;
Expand Down Expand Up @@ -1254,9 +1255,54 @@ static int importStartValues(DATA *data, const char* pInitFile, double initTime)
else
WARNING2(" %s(start=%g)", mData->realParameterData[i].info.name, mData->realParameterData[i].attribute.start);
}

DEBUG_INFO(LOG_INIT, "import integer parameters");
for(i=0; i<mData->nParametersInteger; ++i)
{
pVar = omc_matlab4_find_var(&reader, mData->integerParameterData[i].info.name);

if(!pVar)
{
newVarname = mapToDymolaVars(mData->integerParameterData[i].info.name);
pVar = omc_matlab4_find_var(&reader, newVarname);
free(newVarname);
}

if(pVar)
{
omc_matlab4_val(&(readerValue), &reader, pVar, initTime);
mData->integerParameterData[i].attribute.start = (modelica_integer) readerValue;
DEBUG_INFO_AL2(LOG_INIT, " %s(start=%ld)", mData->integerParameterData[i].info.name, mData->integerParameterData[i].attribute.start);
}
else
WARNING2(" %s(start=%ld)", mData->integerParameterData[i].info.name, mData->integerParameterData[i].attribute.start);
}

DEBUG_INFO(LOG_INIT, "import boolean parameters");
for(i=0; i<mData->nParametersBoolean; ++i)
{
pVar = omc_matlab4_find_var(&reader, mData->booleanParameterData[i].info.name);

if(!pVar)
{
newVarname = mapToDymolaVars(mData->booleanParameterData[i].info.name);
pVar = omc_matlab4_find_var(&reader, newVarname);
free(newVarname);
}

if(pVar)
{
omc_matlab4_val(&(readerValue), &reader, pVar, initTime);
mData->booleanParameterData[i].attribute.start = (modelica_boolean) readerValue;
DEBUG_INFO_AL2(LOG_INIT, " %s(start=%d)", mData->booleanParameterData[i].info.name, mData->booleanParameterData[i].attribute.start);
}
else
WARNING2(" %s(start=%d)", mData->booleanParameterData[i].info.name, mData->booleanParameterData[i].attribute.start);
}
omc_free_matlab4_reader(&reader);
}


return 0;
}

Expand Down

0 comments on commit bb6a96c

Please sign in to comment.