@@ -46,6 +46,7 @@ import BackendDAE;
4646protected
4747
4848import Absyn ;
49+ import Array ;
4950import BackendDAEOptimize ;
5051import BackendDAEUtil ;
5152import BackendDAEFunc ;
@@ -67,6 +68,7 @@ import Flags;
6768import Global ;
6869import Initialization ;
6970import List ;
71+ import Matching ;
7072import StackOverflow ;
7173import Util ;
7274
@@ -196,6 +198,7 @@ uniontype TraverseEqnAryFold
196198 BackendDAE . Variables systemVars;
197199 DAE . FunctionTree functionTree;
198200 Boolean recursiveStrongComponentRun;
201+ BackendDAE . Shared shared ;
199202 end TRAVERSER_CREATE_DAE ;
200203end TraverseEqnAryFold ;
201204
@@ -221,7 +224,7 @@ algorithm
221224 systemSize := BackendDAEUtil . systemSize(syst);
222225 newDAEVars := BackendVariable . emptyVars();
223226 newDAEEquations := BackendEquation . emptyEqnsSized(systemSize);
224- travArgs := TRAVERSER_CREATE_DAE (globalDAEData, newDAEVars, newDAEEquations, syst. orderedVars, shared . functionTree, false );
227+ travArgs := TRAVERSER_CREATE_DAE (globalDAEData, newDAEVars, newDAEEquations, syst. orderedVars, shared . functionTree, false , shared );
225228 if debug then BackendDump . printEqSystem(syst); end if ;
226229 // for every equation create corresponding residiual variable(s)
227230 travArgs := BackendDAEUtil . traverseEqSystemStrongComponents(syst, traverserStrongComponents, travArgs);
@@ -269,8 +272,11 @@ algorithm
269272 (traverserArgs) :=
270273 matchcontinue(inEqns, traverserArgs. recursiveStrongComponentRun, isStateVarInvoled)
271274 local
275+ BackendDAE . EqSystem syst;
276+ BackendDAE . IncidenceMatrix adjMatrix;
277+
272278 list< BackendDAE . Equation > newResEqns;
273- list< BackendDAE . Var > newResVars, newAuxVars;
279+ list< BackendDAE . Var > newResVars, newAuxVars, discVars, contVars ;
274280 BackendDAE . Var var ;
275281 BackendDAE . Variables systemVars;
276282 BackendDAE . Var dummyVar;
@@ -282,6 +288,8 @@ algorithm
282288 DAE . FunctionTree funcsTree;
283289 list< DAE . ComponentRef > crlst;
284290 Boolean b1, b2;
291+ list< BackendDAE . Equation > discEqns;
292+ list< BackendDAE . Equation > contEqns;
285293
286294 DAE . Algorithm alg;
287295 DAE . ElementSource source;
@@ -482,14 +490,26 @@ algorithm
482490
483491 case (_, false , _)
484492 algorithm
485- vars := inVars;
486- for e in inEqns loop
493+
494+ (discVars, contVars) := List . splitOnTrue(inVars, BackendVariable . isVarDiscrete);
495+ (discEqns, contEqns) := getDiscAndContEqns(inVars, inEqns, discVars, contVars, traverserArgs. shared . functionTree);
496+
497+ // create discrete
498+ for e in discEqns loop
499+ size := BackendEquation . equationSize(e);
500+ newAuxVars := List . firstN(discVars, size);
501+ traverserArgs := traverserStrongComponents({e}, newAuxVars, {}, {}, traverserArgs);
502+ discVars := List . stripN(discVars, size);
503+ end for ;
504+
505+ // create continuous
506+ for e in contEqns loop
487507 size := BackendEquation . equationSize(e);
488- newAuxVars := List . firstN(vars , size);
508+ newAuxVars := List . firstN(contVars , size);
489509 traverserArgs. recursiveStrongComponentRun := true ;
490510 traverserArgs := traverserStrongComponents({e}, newAuxVars, {}, {}, traverserArgs);
491511 traverserArgs. recursiveStrongComponentRun := false ;
492- vars := List . stripN(vars , size);
512+ contVars := List . stripN(contVars , size);
493513 end for ;
494514 then
495515 (traverserArgs);
@@ -504,6 +524,54 @@ algorithm
504524 end matchcontinue;
505525end traverserStrongComponents;
506526
527+ function getDiscAndContEqns
528+ input list< BackendDAE . Var > inAllVars;
529+ input list< BackendDAE . Equation > inAllEqns;
530+ input list< BackendDAE . Var > inDiscVars;
531+ input list< BackendDAE . Var > inContVars;
532+ input DAE . FunctionTree functionTree;
533+ output list< BackendDAE . Equation > discEqns;
534+ output list< BackendDAE . Equation > contEqns;
535+ protected
536+ BackendDAE . EqSystem syst;
537+ BackendDAE . IncidenceMatrix adjMatrix;
538+
539+ list< Integer > varsIndex, eqnIndex;
540+ array< Integer > assignVarEqn "eqn := assignVarEqn[var]" ;
541+ array< Integer > assignEqnVar "var := assignEqnVar[eqn]" ;
542+
543+ array< Integer > mapEqnScalarArray;
544+ constant Boolean debug = false ;
545+ algorithm
546+ try
547+ // create syst for a matching
548+ syst := BackendDAEUtil . createEqSystem(BackendVariable . listVar1(inAllVars), BackendEquation . listEquation(inAllEqns) );
549+ if debug then BackendDump . printEqSystem(syst); end if ;
550+ (adjMatrix, _, _, mapEqnScalarArray) := BackendDAEUtil . incidenceMatrixScalar(syst, BackendDAE . NORMAL (), SOME (functionTree));
551+ if debug then BackendDump . dumpIncidenceMatrix(adjMatrix); end if ;
552+ (assignVarEqn, assignEqnVar, true ) := Matching . RegularMatching (adjMatrix, BackendDAEUtil . systemSize(syst), BackendDAEUtil . systemSize(syst));
553+ if debug then BackendDump . dumpMatching(assignVarEqn); end if ;
554+
555+ // get discrete vars indexes and then the equations
556+ varsIndex := BackendVariable . getVarIndexFromVars(inDiscVars, syst. orderedVars);
557+ if debug then print("discVarsIndex: " ); BackendDump . dumpIncidenceRow(varsIndex); end if ;
558+ eqnIndex := List . map1(varsIndex, Array . getIndexFirst, assignVarEqn);
559+ if debug then print("discEqnIndex: " ); BackendDump . dumpIncidenceRow(eqnIndex); end if ;
560+ eqnIndex := List . unique(list(mapEqnScalarArray[i] for i in eqnIndex));
561+ discEqns := BackendEquation . getList(eqnIndex, syst. orderedEqs);
562+ if debug then BackendDump . equationListString(discEqns, "Discrete Equations" ); end if ;
563+
564+ // get continuous equations
565+ varsIndex := BackendVariable . getVarIndexFromVars(inContVars, syst. orderedVars);
566+ eqnIndex := List . map1(varsIndex, Array . getIndexFirst, assignVarEqn);
567+ eqnIndex := List . unique(list(mapEqnScalarArray[i] for i in eqnIndex));
568+ if debug then print("contEqnIndex: " ); BackendDump . dumpIncidenceRow(eqnIndex); end if ;
569+ contEqns := BackendEquation . getList(eqnIndex, syst. orderedEqs);
570+ if debug then BackendDump . equationListString(contEqns, "Continuous Equations" ); end if ;
571+ else
572+ fail();
573+ end try ;
574+ end getDiscAndContEqns;
507575
508576function addVarsGlobalData
509577 input output BackendDAE . BackendDAEModeData globalDAEData;
@@ -513,8 +581,6 @@ protected
513581algorithm
514582 // prepare algebraic states
515583 vars := List . filterOnTrue(inVars, BackendVariable . isNonStateVar);
516- // check for discrete vars
517- {} := List . filterOnTrue(vars, BackendVariable . isVarDiscrete);
518584 vars := list(BackendVariable . setVarKind(v, BackendDAE . ALG_STATE ()) for v in vars);
519585 // print("Alg vars: " + BackendDump.varListString(vars, "") + "\n");
520586 globalDAEData. algStateVars := listAppend(vars, globalDAEData. algStateVars);
0 commit comments