@@ -118,6 +118,8 @@ algorithm
118118 // BackendDump.dumpEqSystem(isyst);
119119 // BackendDump.dumpMatching(inAssignments1);
120120 // BackendDump.dumpMatching(inAssignments2);
121+ // syst = BackendDAEUtil.setEqSystemMatching(isyst,BackendDAE.MATCHING(inAssignments1,inAssignments2,{}));
122+ // dumpSystemGraphML(syst,ishared,NONE(),"ConstrainRevoluteJoint.graphml");
121123 // check by count vars of equations, if len(eqns) > len(vars) stop because of structural singular system
122124 (b,eqns_1,unassignedStates,unassignedEqns,discEqns) = minimalStructurallySingularSystem(eqns,isyst,inAssignments1,inAssignments2);
123125 size = BackendDAEUtil . systemSize(isyst);
@@ -274,7 +276,7 @@ algorithm
274276 // do not differentiate self generated equations $_DER.x = der(x)
275277 eqns1 = List . select1(eqns1,intLe,noofeqns);
276278 Debug . fcall(Flags . BLT_DUMP , print, "marked equations: " );
277- Debug . fcall(Flags . BLT_DUMP , BackendDump . debuglst, (eqns1 ,intString," " ," \n " ));
279+ Debug . fcall(Flags . BLT_DUMP , BackendDump . debuglst, (eqns ,intString," " ," \n " ));
278280 eqnstr = Debug . bcallret2(Flags . isSet(Flags . BLT_DUMP ),BackendDump . dumpMarkedEqns,isyst, eqns1,"" );
279281 Debug . fcall(Flags . BLT_DUMP , print, eqnstr);
280282 // diff Alias does not yet work proper
@@ -303,6 +305,7 @@ algorithm
303305 equation
304306 Debug . fcall(Flags . BLT_DUMP , print, "Reduce Index failed! System is structurally singulare and cannot handled because number of unassigned equations is larger than number of states. \n marked equations: \n " );
305307 // get from scalar eqns indexes the indexes in the equation array
308+ Debug . fcall(Flags . BLT_DUMP , BackendDump . debuglst, (eqns,intString," " ," \n " ));
306309 eqns1 = List . map1r(eqns,arrayGet,mapIncRowEqn);
307310 eqns1 = List . uniqueIntN(eqns1,arrayLength(mapIncRowEqn));
308311 Debug . fcall(Flags . BLT_DUMP , print, BackendDump . dumpMarkedEqns(isyst, eqns1));
@@ -427,6 +430,7 @@ algorithm
427430 case ({},_,_,_,_,_,_,_,_,_,_) then (true ,inEqnsLstAcc,inStateIndxsAcc,inUnassEqnsAcc,inDiscEqnsAcc);
428431 case (ilst::rest,_,_,_,_,_,_,_,_,_,_)
429432 equation
433+ // print("Eqns " +& stringDelimitList(List.map(ilst,intString),", ") +& "\n");
430434 ((unassignedEqns,eqnsLst,discEqns)) = List . fold2(ilst,unassignedContinuesEqns,vars,(inAssignments2,m),({},{},inDiscEqnsAcc));
431435 // print("unassignedEqns " +& stringDelimitList(List.map(unassignedEqns,intString),", ") +& "\n");
432436 stateIndxs = List . fold2(ilst,statesInEquations,(m,statemark,mark),inAssignments1,{});
@@ -761,7 +765,7 @@ algorithm
761765 then
762766 (syst,ishared,ass1,ass2,so,orgEqnsLst,mapEqnIncRow,mapIncRowEqn);
763767 // not all equations are differentiated
764- case (_::_,_,_,_,_,_,BackendDAE . EQSYSTEM (mT = SOME (mt)),_,_,_,_,_,_,_)
768+ case (_::_,_,_,_,_,_,BackendDAE . EQSYSTEM (orderedVars = v, mT = SOME (mt)),_,_,_,_,_,_,_)
765769 equation
766770 Debug . fcall(Flags . BLT_DUMP ,print,"notDiffedEquations: \n " );
767771 Debug . fcall(Flags . BLT_DUMP ,BackendDump . dumpEqns,notDiffedEquations);
@@ -774,6 +778,8 @@ algorithm
774778 Debug . fcall(Flags . BLT_DUMP ,print,"unassignedStates: \n " );
775779 Debug . fcall(Flags . BLT_DUMP ,BackendDump . debuglst,(unassignedStates,intString,", " ," \n " ));
776780 ilst = List . fold1(unassignedStates,statesWithUnusedDerivative,mt,{});
781+ // check also initial equations (this could be done alse once before
782+ ((ilst,_)) = BackendDAEUtil . traverseBackendDAEExpsEqns(BackendEquation . daeInitialEqns(ishared),searchDerivativesEqn,(ilst,v));
777783 Debug . fcall(Flags . BLT_DUMP ,print,"states without used derivative: \n " );
778784 Debug . fcall(Flags . BLT_DUMP ,BackendDump . debuglst,(ilst,intString,", " ," \n " ));
779785 (syst,shared ,ass1,ass2,so,orgEqnsLst,mapEqnIncRow,mapIncRowEqn) =
@@ -783,6 +789,39 @@ algorithm
783789 end matchcontinue;
784790end differentiateEqns;
785791
792+ protected function searchDerivativesEqn "function searchDerivativesEqn
793+ author: Frenkel TUD 2012-11"
794+ input tuple< DAE . Exp ,tuple< list< Integer > ,BackendDAE . Variables >> itpl;
795+ output tuple< DAE . Exp ,tuple< list< Integer > ,BackendDAE . Variables >> outTpl;
796+ protected
797+ DAE . Exp e;
798+ tuple< list< Integer > ,BackendDAE . Variables > tpl;
799+ algorithm
800+ (e,tpl) := itpl;
801+ outTpl := Expression . traverseExp(e,searchDerivativesExp,tpl);
802+ end searchDerivativesEqn;
803+
804+ protected function searchDerivativesExp "function searchDerivativesExp
805+ author: Frenkel TUD 2012-11"
806+ input tuple< DAE . Exp ,tuple< list< Integer > ,BackendDAE . Variables >> tpl;
807+ output tuple< DAE . Exp ,tuple< list< Integer > ,BackendDAE . Variables >> outTpl;
808+ algorithm
809+ outTpl := matchcontinue(tpl)
810+ local
811+ BackendDAE . Variables vars;
812+ list< Integer > ilst,i1lst;
813+ DAE . Exp e;
814+ DAE . ComponentRef cr;
815+ case ((e as DAE . CALL (path= Absyn . IDENT (name = "der" ),expLst= {DAE . CREF (componentRef= cr)}),(ilst,vars)))
816+ equation
817+ (_,i1lst) = BackendVariable . getVar(cr,vars);
818+ ilst = List . fold1(i1lst,List . removeOnTrue, intEq, ilst);
819+ then
820+ ((e,(ilst,vars)));
821+ case _ then tpl;
822+ end matchcontinue;
823+ end searchDerivativesExp;
824+
786825protected function differentiateEqnsLst
787826"function: differentiateEqnsLst
788827 author: Frenkel TUD 2012-11
@@ -947,14 +986,33 @@ algorithm
947986 array< Boolean > barray;
948987 list< BackendDAE . Var > varlst;
949988 BackendDAE . Var var ;
989+ // 1th try to replace final parameter
990+ case (_,_,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
991+ equation
992+ ((eqns,eqnslst as _::_,_)) = List . fold1(inEqns,replaceFinalVars,BackendVariable . daeKnVars(ishared),(eqns,{},BackendVarTransform . emptyReplacements()));
993+ // unassign changed equations and assigned vars
994+ eqnslst1 = List . flatten(List . map1r(eqnslst,arrayGet,imapEqnIncRow));
995+ ilst = List . map1r(eqnslst1,arrayGet,inAss2);
996+ ilst = List . select1(ilst,intGt,0 );
997+ ass2 = List . fold1r(eqnslst1,arrayUpdate,-1 ,inAss2);
998+ ass1 = List . fold1r(ilst,arrayUpdate,-1 ,inAss1);
999+ // update IncidenceMatrix
1000+ Debug . fcall(Flags . BLT_DUMP , print, "Replaced final Parameter in Eqns \n " );
1001+ syst = BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching);
1002+ Debug . fcall(Flags . BLT_DUMP , print, "Update Incidence Matrix: " );
1003+ Debug . fcall(Flags . BLT_DUMP , BackendDump . debuglst,(eqnslst,intString," " ," \n " ));
1004+ (syst,mapEqnIncRow,mapIncRowEqn) = BackendDAEUtil . updateIncidenceMatrixScalar(syst,BackendDAE . SOLVABLE (), eqnslst, imapEqnIncRow, imapIncRowEqn);
1005+ then
1006+ (syst,ishared,ass1,ass2,inStateOrd,inOrgEqnsLst,mapEqnIncRow,mapIncRowEqn);
1007+
9501008 // if size of unmatched eqns is equal to size of states without used derivative change all to algebraic
9511009 case (true ,_,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
9521010 equation
9531011 // change varKind
9541012 varlst = List . map1r(statesWithUnusedDer,BackendVariable . getVarAt,v);
9551013 Debug . fcall(Flags . BLT_DUMP , print, "Change varKind to algebraic for \n " );
9561014 Debug . fcall(Flags . BLT_DUMP , BackendDump . dumpVars, varlst);
957- varlst = BackendVariable . setVarsKind(varlst,BackendDAE . DUMMY_STATE ());
1015+ varlst = BackendVariable . setVarsKind(varlst,BackendDAE . VARIABLE ());
9581016 v1 = BackendVariable . addVars(varlst,v);
9591017 // update IncidenceMatrix
9601018 eqnslst1 = BackendDAETransform . collectVarEqns(statesWithUnusedDer,{},mt,arrayLength(mt));
@@ -978,36 +1036,21 @@ algorithm
9781036 then
9791037 fail();
9801038*/
981- // if all of these does not work try to replace final parameter
982- case (_,_,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
983- equation
984- ((eqns,eqnslst as _::_,_)) = List . fold1(inEqns,replaceFinalVars,BackendVariable . daeKnVars(ishared),(eqns,{},BackendVarTransform . emptyReplacements()));
985- // unassign changed equations and assigned vars
986- eqnslst1 = List . flatten(List . map1r(eqnslst,arrayGet,imapEqnIncRow));
987- ilst = List . map1r(eqnslst1,arrayGet,inAss2);
988- ilst = List . select1(ilst,intGt,0 );
989- ass2 = List . fold1r(eqnslst1,arrayUpdate,-1 ,inAss2);
990- ass1 = List . fold1r(ilst,arrayUpdate,-1 ,inAss1);
991- // update IncidenceMatrix
992- Debug . fcall(Flags . BLT_DUMP , print, "Replaced final Parameter in Eqns \n " );
993- syst = BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching);
994- Debug . fcall(Flags . BLT_DUMP , print, "Update Incidence Matrix: " );
995- Debug . fcall(Flags . BLT_DUMP , BackendDump . debuglst,(eqnslst,intString," " ," \n " ));
996- (syst,mapEqnIncRow,mapIncRowEqn) = BackendDAEUtil . updateIncidenceMatrixScalar(syst,BackendDAE . SOLVABLE (), eqnslst, imapEqnIncRow, imapIncRowEqn);
997- then
998- (syst,ishared,ass1,ass2,inStateOrd,inOrgEqnsLst,mapEqnIncRow,mapIncRowEqn);
9991039
10001040 // if size of unmatched eqns is not equal to size of states without used derivative change first to algebraic
10011041 // until I have a better sulution
1002- case (false ,i::_ ,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
1042+ case (false ,i::ilst ,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
10031043 equation
10041044 // change varKind
10051045 var = BackendVariable . getVarAt(v,i);
10061046 varlst = {var };
10071047 Debug . fcall(Flags . BLT_DUMP , print, "Change varKind to algebraic for \n " );
10081048 Debug . fcall(Flags . BLT_DUMP , BackendDump . dumpVars, varlst);
1009- varlst = BackendVariable . setVarsKind(varlst,BackendDAE . DUMMY_STATE ());
1049+ varlst = BackendVariable . setVarsKind(varlst,BackendDAE . VARIABLE ());
10101050 v1 = BackendVariable . addVars(varlst,v);
1051+ varlst = List . map1r(ilst,BackendVariable . getVarAt,v);
1052+ Debug . fcall(Flags . BLT_DUMP , print, "Other Candidates are \n " );
1053+ Debug . fcall(Flags . BLT_DUMP , BackendDump . dumpVars, varlst);
10111054 // update IncidenceMatrix
10121055 eqnslst1 = BackendDAETransform . collectVarEqns({i},{},mt,arrayLength(mt));
10131056 syst = BackendDAE . EQSYSTEM (v1,eqns,SOME (m),SOME (mt),matching);
@@ -1016,6 +1059,14 @@ algorithm
10161059 (syst,mapEqnIncRow,mapIncRowEqn) = BackendDAEUtil . updateIncidenceMatrixScalar(syst,BackendDAE . SOLVABLE (), eqnslst1, imapEqnIncRow, imapIncRowEqn);
10171060 then
10181061 (syst,ishared,inAss1,inAss2,inStateOrd,inOrgEqnsLst,mapEqnIncRow,mapIncRowEqn);
1062+
1063+ case (false ,_,_,_,_,_,_,_,BackendDAE . EQSYSTEM (v,eqns,SOME (m),SOME (mt),matching),_,_,_,_,_,_,_)
1064+ equation
1065+ varlst = List . map1r(unassignedStates,BackendVariable . getVarAt,v);
1066+ Debug . fcall(Flags . BLT_DUMP , print, "unassignedStates \n " );
1067+ Debug . fcall(Flags . BLT_DUMP , BackendDump . dumpVars, varlst);
1068+ then
1069+ fail();
10191070 end matchcontinue;
10201071end handleundifferntiableMSS;
10211072
@@ -5059,6 +5110,13 @@ algorithm
50595110 (outVars,outChangedVars) = changeDerVariablestoStates1(rest,ilst,vars,i::inChangedVars);
50605111 then
50615112 (outVars,outChangedVars);
5113+ case ((v as BackendDAE . VAR (varKind= BackendDAE . DUMMY_STATE ()))::rest,i::ilst,_,_)
5114+ equation
5115+ v = BackendVariable . setVarKind(v,BackendDAE . STATE ());
5116+ vars = BackendVariable . addVar(v,inVars);
5117+ (outVars,outChangedVars) = changeDerVariablestoStates1(rest,ilst,vars,i::inChangedVars);
5118+ then
5119+ (outVars,outChangedVars);
50625120 case ((v as BackendDAE . VAR (varKind= BackendDAE . DUMMY_DER ()))::rest,i::ilst,_,_)
50635121 equation
50645122 v = BackendVariable . setVarKind(v,BackendDAE . STATE ());
@@ -5155,12 +5213,12 @@ algorithm
51555213 vars = BackendVariable . daeVars(isyst);
51565214 eqns = BackendEquation . daeEqns(isyst);
51575215 // (_,m,mt) = BackendDAEUtil.getIncidenceMatrix(isyst,BackendDAE.NORMAL());
5158- mapIncRowEqn = listArray(List . intRange(arrayLength(m)));
5159- // (_,m,mt,_,mapIncRowEqn) = BackendDAEUtil.getIncidenceMatrixScalar(isyst,BackendDAE.NORMAL());
5216+ // mapIncRowEqn = listArray(List.intRange(arrayLength(m)));
5217+ (_,m,mt,_,mapIncRowEqn) = BackendDAEUtil . getIncidenceMatrixScalar(isyst,BackendDAE . NORMAL ());
51605218 graph = GraphML . getGraph("G" ,false );
51615219 ((_,graph)) = BackendVariable . traverseBackendDAEVars(vars,addVarGraph,(1 ,graph));
5162- neqns = BackendDAEUtil . equationArraySize(eqns);
5163- // neqns = BackendDAEUtil.equationSize(eqns);
5220+ // neqns = BackendDAEUtil.equationArraySize(eqns);
5221+ neqns = BackendDAEUtil . equationSize(eqns);
51645222 eqnsids = List . intRange(neqns);
51655223 graph = List . fold2(eqnsids,addEqnGraph,eqns,mapIncRowEqn,graph);
51665224 ((_,_,graph)) = List . fold(eqnsids,addEdgesGraph,(1 ,m,graph));
0 commit comments