Skip to content

Commit

Permalink
- order external vars correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
vwaurich committed Aug 19, 2015
1 parent 9c088a9 commit 108a845
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 6 deletions.
56 changes: 53 additions & 3 deletions Compiler/SimCode/SimCodeUtil.mo
Expand Up @@ -66,6 +66,7 @@ import BackendDAETransform;
import BackendDAEUtil;
import BackendDump;
import BackendEquation;
import BackendDAEEXT;
import BackendVariable;
import BackendVarTransform;
import BaseHashTable;
Expand All @@ -92,10 +93,12 @@ import HpcOmSimCode;
import Initialization;
import Inline;
import List;
import Matching;
import PriorityQueue;
import SimCodeDump;
import SimCodeFunctionUtil;
import SimCodeFunctionUtil.{execStat,varName};
import Sorting;
import SymbolicJacobian;
import System;
import Util;
Expand Down Expand Up @@ -4209,11 +4212,43 @@ protected
algorithm
BackendDAE.SHARED(externalObjects=evars) := shared;
evarLst := BackendVariable.varList(evars);
evarLst := listReverse(evarLst);
evarLst := orderExtVars(evarLst);
//evarLst := listReverse(evarLst);
(simvars, aliases) := extractExtObjInfo2(evarLst, evars, {}, {});
extObjInfo := SimCode.EXTOBJINFO(simvars, aliases);
end createExtObjInfo;

protected function orderExtVars"External Variables have to be ordered.
It might occure that their binding expressions are dependent on other external variables and therefore, these vars and their binding exps have to be causalized."
input list<BackendDAE.Var> varLstIn;
output list<BackendDAE.Var> varLstOut;
protected
Integer nVars,nEqs;
list<Integer> order;
array<Integer> ass1,ass2;
BackendDAE.IncidenceMatrix m, mT;
list<list<Integer>> comps;
list<BackendDAE.Var> varsWithBind, varsWithoutBind;
list<DAE.Exp> bindExps;
list<BackendDAE.Equation> eqs;
algorithm
(varsWithBind,varsWithoutBind) := List.separateOnTrue(varLstIn,BackendVariable.varHasBindExp);
bindExps := List.map(varsWithBind,BackendVariable.varBindExp);
eqs := List.threadMap2(List.map(varsWithBind,BackendVariable.varExp), bindExps, BackendEquation.generateEquation, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC);
(m, mT) := BackendDAEUtil.incidenceMatrixDispatch(BackendVariable.listVar1(varsWithBind), BackendEquation.listEquation(eqs), BackendDAE.ABSOLUTE(), NONE());
nVars := listLength(varsWithBind);
nEqs := listLength(eqs);
ass1 := arrayCreate(listLength(varsWithBind), -1);
ass2 := arrayCreate(listLength(eqs), -1);
Matching.matchingExternalsetIncidenceMatrix(nVars, nEqs, m);
BackendDAEEXT.matching(nVars, nEqs, 5, -1, 0.0, 1);
BackendDAEEXT.getAssignment(ass2, ass1);
comps := Sorting.TarjanTransposed(mT, ass2);
order := List.map1(List.flatten(comps),Array.getIndexFirst,ass1);
varsWithBind := List.map1(order,List.getIndexFirst,varsWithBind);
varLstOut := listAppend(varsWithoutBind,varsWithBind);
end orderExtVars;

protected function extractExtObjInfo2
input list<BackendDAE.Var> varLst;
input BackendDAE.Variables evars;
Expand Down Expand Up @@ -6341,13 +6376,15 @@ protected
list<SimCodeVar.SimVar> intAliasVars;
list<SimCodeVar.SimVar> paramVars;
list<SimCodeVar.SimVar> intParamVars;
list<SimCodeVar.SimVar> extObjVars;
list<SimCodeVar.SimVar> constVars;
list<SimCodeVar.SimVar> intConstVars;
list<SimCodeVar.SimVar> stringConstVars;
list<SimCode.Function> functions;
algorithm
SimCode.MODELINFO(vars=simVars, varInfo=varInfo, functions=functions) := modelInfo;
SimCodeVar.SIMVARS(stateVars=stateVars,derivativeVars=derivativeVars,algVars=algVars,intAlgVars=intAlgVars,discreteAlgVars=discreteAlgVars,aliasVars=aliasVars,intAliasVars=intAliasVars,paramVars=paramVars,intParamVars=intParamVars, constVars=constVars,intConstVars=intConstVars,stringConstVars=stringConstVars) := simVars;
SimCodeVar.SIMVARS(stateVars=stateVars,derivativeVars=derivativeVars,algVars=algVars,intAlgVars=intAlgVars,discreteAlgVars=discreteAlgVars,aliasVars=aliasVars,intAliasVars=intAliasVars,
paramVars=paramVars,intParamVars=intParamVars,extObjVars=extObjVars,constVars=constVars,intConstVars=intConstVars,stringConstVars=stringConstVars) := simVars;
SimCode.VARINFO(numStateVars=nsv,numAlgVars=nalgv) := varInfo;
dumpVarLst(stateVars,"stateVars ("+intString(nsv)+")");
dumpVarLst(derivativeVars,"derivativeVars");
Expand All @@ -6358,6 +6395,7 @@ algorithm
dumpVarLst(intAliasVars,"intAliasVars");
dumpVarLst(paramVars,"paramVars");
dumpVarLst(intParamVars,"intParamVars");
dumpVarLst(extObjVars,"extObjVars");
dumpVarLst(constVars,"constVars");
dumpVarLst(intConstVars,"intConstVars");
dumpVarLst(stringConstVars,"stringConstVars");
Expand Down Expand Up @@ -6624,12 +6662,23 @@ algorithm
end match;
end dumpJacobianMatrix;

protected function extObjInfoString
input SimCode.ExtObjInfo info;
protected
list<SimCodeVar.SimVar> vars;
list<SimCode.ExtAlias> aliases;
algorithm
SimCode.EXTOBJINFO(vars=vars, aliases=aliases) := info;
dumpVarLst(vars,"external object info\n-----------------------\n");
end extObjInfoString;

public function dumpSimCode
input SimCode.SimCode simCode;
protected
Integer nls,nnls,nms,ne;
list<SimCode.SimEqSystem> allEquations,jacobianEquations,equationsForZeroCrossings,algorithmAndEquationAsserts,initialEquations,parameterEquations,
removedInitialEquations,startValueEquations,nominalValueEquations,minValueEquations,maxValueEquations;
SimCode.ExtObjInfo extObjInfo;
SimCode.ModelInfo modelInfo;
SimCode.VarInfo varInfo;
list<list<SimCode.SimEqSystem>> odeEquations, algebraicEquations;
Expand All @@ -6638,7 +6687,7 @@ protected
algorithm
SimCode.SIMCODE(modelInfo = modelInfo,allEquations = allEquations, odeEquations=odeEquations, algebraicEquations=algebraicEquations, initialEquations=initialEquations, removedInitialEquations=removedInitialEquations,
startValueEquations=startValueEquations,nominalValueEquations=nominalValueEquations, minValueEquations=minValueEquations, maxValueEquations=maxValueEquations, algorithmAndEquationAsserts=algorithmAndEquationAsserts, parameterEquations=parameterEquations,
equationsForZeroCrossings=equationsForZeroCrossings, jacobianEquations=jacobianEquations ,jacobianMatrixes=jacobianMatrixes) := simCode;
equationsForZeroCrossings=equationsForZeroCrossings,jacobianEquations=jacobianEquations,extObjInfo=extObjInfo,jacobianMatrixes=jacobianMatrixes) := simCode;
SimCode.MODELINFO(varInfo=varInfo) := modelInfo;
SimCode.VARINFO(numEquations=ne,numLinearSystems=nls,numNonLinearSystems=nnls,numMixedSystems=nms) := varInfo;
print("allEquations:("+intString(ne)+"),numLS:("+intString(nls)+"),numNLS:("+intString(nnls)+"),numMS:("+intString(nms)+") \n-----------------------\n");
Expand Down Expand Up @@ -6667,6 +6716,7 @@ algorithm
print(dumpSimEqSystemLst(equationsForZeroCrossings)+"\n");
print("jacobianEquations: \n-----------------------\n");
print(dumpSimEqSystemLst(jacobianEquations)+"\n");
extObjInfoString(extObjInfo);
print("jacobianMatrixes: \n-----------------------\n");
jacObs := List.map(jacobianMatrixes,Util.makeOption);
print(stringDelimitList(List.map(jacObs,dumpJacobianMatrix),"\n")+"\n");
Expand Down
26 changes: 23 additions & 3 deletions Compiler/Util/List.mo
Expand Up @@ -6352,11 +6352,31 @@ algorithm
outResult := true;
end all;

public function separateOnTrue<T, ArgT1>
"Takes a list of values and a filter function over the values and returns 2
sub lists of values for which the matching function returns true and false."
input list<T> inList;
input FilterFunc inFilterFunc;
output list<T> outListTrue = {};
output list<T> outListFalse = {};

partial function FilterFunc
input T inElement;
output Boolean outResult;
end FilterFunc;
algorithm
for e in inList loop
if inFilterFunc(e) then
outListTrue := e::outListTrue;
else
outListFalse := e::outListFalse;
end if;
end for;
end separateOnTrue;

public function separate1OnTrue<T, ArgT1>
"Takes a list of values and a filter function over the values and returns 2
sub lists of values for which the matching function returns true and false.
Example:
filter1OnTrue({1, 2, 3, 1, 5}, intEq, 1) => {1, 1},{2, 3, 5}"
sub lists of values for which the matching function returns true and false."
input list<T> inList;
input FilterFunc inFilterFunc;
input ArgT1 inArg1;
Expand Down

0 comments on commit 108a845

Please sign in to comment.