@@ -781,17 +781,17 @@ protected function selectInitializationVariablesDAE "author: lochel
781781 output list< BackendDAE . Var > outAllPrimaryParameters = {};
782782 output BackendDAE . Variables outGlobalKnownVars = dae. shared . globalKnownVars;
783783protected
784- BackendDAE . Variables allParameters, otherVariables ;
785- BackendDAE . EquationArray allParameterEqns ;
786- BackendDAE . EqSystem paramSystem ;
784+ BackendDAE . Variables otherVariables, globalKnownVars = dae . shared . globalKnownVars ;
785+ BackendDAE . EquationArray globalKnownVarsEqns ;
786+ BackendDAE . EqSystem globalKnownVarsSystem ;
787787 BackendDAE . IncidenceMatrix m, mT;
788788 array< Integer > ass1 "eqn := ass1[var]" ;
789789 array< Integer > ass2 "var := ass2[eqn]" ;
790790 list< list< Integer >> comps;
791791 list< Integer > flatComps;
792- Integer nParam ;
792+ Integer nGlobalKnownVars ;
793793 array< Integer > secondary;
794- BackendDAE . Var p ;
794+ BackendDAE . Var v ;
795795 DAE . Exp bindExp;
796796 HashSet . HashSet hs;
797797 list< DAE . ComponentRef > crefs;
@@ -800,25 +800,20 @@ algorithm
800800 outInitVars := BackendVariable . traverseBackendDAEVars(dae. shared . globalKnownVars, selectInitializationVariables2, outInitVars);
801801 outInitVars := BackendVariable . traverseBackendDAEVars(dae. shared . aliasVars, selectInitializationVariables2, outInitVars);
802802
803- // select all parameters
804- allParameters := BackendVariable . emptyVarsSized(BackendVariable . varsSize(dae. shared . globalKnownVars) + BackendVariable . varsSize(dae. shared . externalObjects));
805- allParameterEqns := BackendEquation . emptyEqnsSized(BackendVariable . varsSize(dae. shared . globalKnownVars) + BackendVariable . varsSize(dae. shared . externalObjects));
806- otherVariables := BackendVariable . emptyVarsSized(BackendVariable . varsSize(dae. shared . globalKnownVars) + BackendVariable . varsSize(dae. shared . externalObjects));
807- (allParameters, allParameterEqns, otherVariables) := BackendVariable . traverseBackendDAEVars(dae. shared . globalKnownVars, selectParameter2, (allParameters, allParameterEqns, otherVariables));
808- (allParameters, allParameterEqns, otherVariables) := BackendVariable . traverseBackendDAEVars(dae. shared . externalObjects, selectParameter2, (allParameters, allParameterEqns, otherVariables));
809- nParam := BackendVariable . varsSize(allParameters);
803+ globalKnownVars := BackendVariable . traverseBackendDAEVars(dae. shared . externalObjects, addExtObjToGlobalKnownVars, globalKnownVars);
804+ nGlobalKnownVars := BackendVariable . varsSize(globalKnownVars);
805+ otherVariables := BackendVariable . emptyVarsSized(nGlobalKnownVars);
806+ globalKnownVarsEqns := BackendEquation . emptyEqnsSized(nGlobalKnownVars);
807+ globalKnownVarsEqns := BackendVariable . traverseBackendDAEVars(globalKnownVars, createGlobalKnownVarsEquations, globalKnownVarsEqns);
810808
811- if nParam > 0 then
812- // BackendDump.dumpVariables(allParameters, "all parameters");
813- // BackendDump.dumpEquationArray(allParameterEqns, "all parameter equations");
814-
815- paramSystem := BackendDAEUtil . createEqSystem(allParameters, allParameterEqns);
816- (m, mT) := BackendDAEUtil . incidenceMatrix(paramSystem, BackendDAE . NORMAL (), NONE ());
809+ if nGlobalKnownVars > 0 then
810+ globalKnownVarsSystem := BackendDAEUtil . createEqSystem(globalKnownVars, globalKnownVarsEqns);
811+ (m, mT) := BackendDAEUtil . incidenceMatrix(globalKnownVarsSystem, BackendDAE . NORMAL (), NONE ());
817812 // BackendDump.dumpIncidenceMatrix(m);
818813 // BackendDump.dumpIncidenceMatrixT(mT);
819814
820815 // match the system
821- // ass1 and ass2 should be {1, 2, ..., nParam }
816+ // ass1 and ass2 should be {1, 2, ..., nGlobalKnownVars }
822817 (ass1, ass2) := Matching . PerfectMatching (m);
823818 // BackendDump.dumpMatchingVars(ass1);
824819 // BackendDump.dumpMatchingEqns(ass2);
@@ -829,33 +824,68 @@ algorithm
829824 // BackendDump.dumpComponentsOLD(comps);
830825
831826 // flattern list and look for cyclic dependencies
832- flatComps := list(flattenParamComp(comp, allParameters ) for comp in comps);
827+ flatComps := list(flattenParamComp(comp, globalKnownVars ) for comp in comps);
833828 // BackendDump.dumpIncidenceRow(flatComps);
834829
835830 // select secondary parameters
836- secondary := arrayCreate(nParam, 0 );
837- secondary := selectSecondaryParameters(flatComps, allParameters, mT, secondary);
838- // BackendDump.dumpMatchingVars(secondary);
831+ secondary := arrayCreate(nGlobalKnownVars, 0 );
832+ secondary := selectSecondaryParameters(flatComps, globalKnownVars, mT, secondary);
839833
840- // get primary and secondary parameters
841- hs := HashSet . emptyHashSetSized(2 * nParam + 1 );
834+ // get primary and secondary parameters and variables
835+ hs := HashSet . emptyHashSetSized(2 * nGlobalKnownVars + 1 );
842836 for i in flatComps loop
843- p := BackendVariable . getVarAt(allParameters , i);
844- bindExp := BackendVariable . varBindExpStartValueNoFail(p );
837+ v := BackendVariable . getVarAt(globalKnownVars , i);
838+ bindExp := BackendVariable . varBindExpStartValueNoFail(v );
845839 crefs := Expression . getAllCrefs(bindExp);
846- if 1 == secondary[i] or not BaseHashSet . hasAll(crefs, hs) then
847- otherVariables := BackendVariable . addVar(p, otherVariables);
848- p := BackendVariable . setVarFixed(p, false );
849- outInitVars := BackendVariable . addVar(p, outInitVars);
850- outGlobalKnownVars := BackendVariable . addVar(p, outGlobalKnownVars);
851- else
852- outAllPrimaryParameters := p::outAllPrimaryParameters;
853- if BackendVariable . isExtObj(p) then
854- p := BackendVariable . setVarFixed(p, true );
855- outGlobalKnownVars := BackendVariable . addVar(p, outGlobalKnownVars);
856- end if ;
857- hs := BaseHashSet . add(BackendVariable . varCref(p), hs);
858- end if ;
840+
841+ _ := match(v)
842+ // primary parameter
843+ case (BackendDAE . VAR (varKind= BackendDAE . PARAM ())) guard 0 == secondary[i] and BaseHashSet . hasAll(crefs, hs)
844+ equation
845+ outAllPrimaryParameters = v::outAllPrimaryParameters;
846+ hs = BaseHashSet . add(BackendVariable . varCref(v), hs);
847+ then ();
848+
849+ // primary external object
850+ case (BackendDAE . VAR (varKind= BackendDAE . EXTOBJ (), bindExp= SOME (bindExp))) guard 0 == secondary[i] and BaseHashSet . hasAll(crefs, hs)
851+ equation
852+ outAllPrimaryParameters = v::outAllPrimaryParameters;
853+ v = BackendVariable . setVarFixed(v, true );
854+ outGlobalKnownVars = BackendVariable . addVar(v, outGlobalKnownVars);
855+ hs = BaseHashSet . add(BackendVariable . varCref(v), hs);
856+ then ();
857+
858+ // secondary parameter
859+ case (BackendDAE . VAR (varKind= BackendDAE . PARAM ()))
860+ equation
861+ otherVariables = BackendVariable . addVar(v, otherVariables);
862+ v = BackendVariable . setVarFixed(v, false );
863+ outInitVars = BackendVariable . addVar(v, outInitVars);
864+ outGlobalKnownVars = BackendVariable . addVar(v, outGlobalKnownVars);
865+ then ();
866+
867+ // primary variable
868+ case (_) guard BackendVariable . isVarAlg(v) and 0 == secondary[i] and BaseHashSet . hasAll(crefs, hs)
869+ equation
870+ otherVariables = BackendVariable . addVar(v, otherVariables);
871+ v = BackendVariable . setVarFixed(v, true );
872+ outGlobalKnownVars = BackendVariable . addVar(v, outGlobalKnownVars);
873+ hs = BaseHashSet . add(BackendVariable . varCref(v), hs);
874+ then ();
875+
876+ // secondary variable
877+ case (_) guard BackendVariable . isVarAlg(v)
878+ equation
879+ otherVariables = BackendVariable . addVar(v, otherVariables);
880+ v = BackendVariable . setVarFixed(v, false );
881+ outGlobalKnownVars = BackendVariable . addVar(v, outGlobalKnownVars);
882+ then ();
883+
884+ else
885+ equation
886+ otherVariables = BackendVariable . addVar(v, otherVariables);
887+ then ();
888+ end match;
859889 end for ;
860890
861891 GC . free(secondary);
@@ -867,6 +897,57 @@ algorithm
867897 end if ;
868898end selectInitializationVariablesDAE;
869899
900+ function addExtObjToGlobalKnownVars "
901+ Sets fixed=true for external objects with binding and adds them to globalKnownVars
902+ author: ptaeuber"
903+ input output BackendDAE . Var extObj;
904+ input output BackendDAE . Variables globalKnownVars;
905+ algorithm
906+ globalKnownVars := match(extObj)
907+ local
908+ BackendDAE . Var var ;
909+ // external object with binding
910+ case (BackendDAE . VAR (varKind= BackendDAE . EXTOBJ (), bindExp= SOME (_))) equation
911+ var = BackendVariable . setVarFixed(extObj, true );
912+ globalKnownVars = BackendVariable . addVar(var , globalKnownVars);
913+ then (globalKnownVars);
914+ end match;
915+ end addExtObjToGlobalKnownVars;
916+
917+ protected function createGlobalKnownVarsEquations
918+ "Creates BackendDAE.EQUATION()s from the globalKnownVars
919+ author: ptaeuber"
920+ input output BackendDAE . Var var ;
921+ input output BackendDAE . EquationArray parameterEqns;
922+ protected
923+ DAE . Exp lhs, rhs, startValue;
924+ BackendDAE . Equation eqn;
925+ BackendDAE . Var v;
926+ String s, str;
927+ SourceInfo info;
928+ algorithm
929+ lhs := BackendVariable . varExp(var );
930+
931+ if BackendVariable . isParam(var ) and not BackendVariable . varHasBindExp(var ) and BackendVariable . varFixed(var ) then
932+ s := ExpressionDump . printExpStr(lhs);
933+ startValue := BackendVariable . varStartValue(var );
934+ str := ExpressionDump . printExpStr(startValue);
935+ v := BackendVariable . setVarKind(var , BackendDAE . VARIABLE ());
936+ v := BackendVariable . setBindExp(v, SOME (startValue));
937+ v := BackendVariable . setVarFixed(v, true );
938+ info := ElementSource . getElementSourceFileInfo(BackendVariable . getVarSource(v));
939+ Error . addSourceMessage(Error . UNBOUND_PARAMETER_WITH_START_VALUE_WARNING , {s, str}, info);
940+ end if ;
941+
942+ try
943+ rhs := BackendVariable . varBindExpStartValue(var );
944+ else
945+ rhs := DAE . RCONST (0 . 0 );
946+ end try ;
947+ eqn := BackendDAE . EQUATION (lhs, rhs, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_BINDING );
948+ parameterEqns := BackendEquation . add(eqn, parameterEqns);
949+ end createGlobalKnownVarsEquations;
950+
870951protected function markIndex
871952 input Integer inIndex;
872953 input array< Integer > inArray;
@@ -895,9 +976,8 @@ algorithm
895976 // fixed=false
896977 case i::rest equation
897978 param = BackendVariable . getVarAt(inParameters, i);
898- secondaryParams = if (not BackendVariable . varFixed(param)) or 1 == inSecondaryParams[i]
899- then List . fold(inM[i], markIndex, inSecondaryParams)
900- else inSecondaryParams;
979+ secondaryParams = if (if BackendVariable . isVarAlg(param) then false else not BackendVariable . varFixed(param)) or 1 == inSecondaryParams[i]
980+ then List . fold(inM[i], markIndex, inSecondaryParams) else inSecondaryParams;
901981 secondaryParams = selectSecondaryParameters(rest, inParameters, inM, secondaryParams);
902982 then secondaryParams;
903983
@@ -944,72 +1024,6 @@ algorithm
9441024 outVars := BackendVariable . traverseBackendDAEVars(inEqSystem. orderedVars, selectInitializationVariables2, inVars);
9451025end selectInitializationVariables1;
9461026
947- protected function selectParameter2 "author: lochel"
948- input BackendDAE . Var inVar;
949- input tuple< BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . Variables > inTpl;
950- output BackendDAE . Var outVar = inVar;
951- output tuple< BackendDAE . Variables , BackendDAE . EquationArray , BackendDAE . Variables > outTpl;
952- algorithm
953- outTpl := match (inVar, inTpl)
954- local
955- BackendDAE . Var var ;
956- BackendDAE . Variables vars, otherVars;
957- BackendDAE . EquationArray eqns;
958- DAE . Exp bindExp, crefExp, startValue;
959- BackendDAE . Equation eqn;
960- DAE . ComponentRef cref;
961- String s, str;
962- SourceInfo info;
963-
964- // parameter without binding
965- case (BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= NONE ()), (vars, eqns, otherVars)) equation
966- vars = BackendVariable . addVar(inVar, vars);
967-
968- cref = BackendVariable . varCref(inVar);
969- crefExp = Expression . crefExp(cref);
970- startValue = BackendVariable . varStartValue(inVar);
971- eqn = BackendDAE . EQUATION (crefExp, startValue, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_INITIAL );
972- eqns = BackendEquation . add(eqn, eqns);
973-
974- if BackendVariable . varFixed(inVar) then
975- s = ComponentReference . printComponentRefStr(cref);
976- str = ExpressionDump . printExpStr(startValue);
977- var = BackendVariable . setVarKind(inVar, BackendDAE . VARIABLE ());
978- var = BackendVariable . setBindExp(var , SOME (startValue));
979- var = BackendVariable . setVarFixed(var , true );
980- info = ElementSource . getElementSourceFileInfo(BackendVariable . getVarSource(var ));
981- Error . addSourceMessage(Error . UNBOUND_PARAMETER_WITH_START_VALUE_WARNING , {s, str}, info);
982- end if ;
983- then ((vars, eqns, otherVars));
984-
985- // parameter with binding
986- case (BackendDAE . VAR (varKind= BackendDAE . PARAM (), bindExp= SOME (bindExp)), (vars, eqns, otherVars)) equation
987- vars = BackendVariable . addVar(inVar, vars);
988-
989- cref = BackendVariable . varCref(inVar);
990- crefExp = Expression . crefExp(cref);
991- eqn = BackendDAE . EQUATION (crefExp, bindExp, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_INITIAL );
992- eqns = BackendEquation . add(eqn, eqns);
993- then ((vars, eqns, otherVars));
994-
995- // external object with binding
996- case (BackendDAE . VAR (varKind= BackendDAE . EXTOBJ (), bindExp= SOME (bindExp)), (vars, eqns, otherVars)) equation
997- var = BackendVariable . setVarFixed(inVar, true );
998- vars = BackendVariable . addVar(var , vars);
999-
1000- cref = BackendVariable . varCref(inVar);
1001- crefExp = Expression . crefExp(cref);
1002- eqn = BackendDAE . EQUATION (crefExp, bindExp, DAE . emptyElementSource, BackendDAE . EQ_ATTR_DEFAULT_INITIAL );
1003- eqns = BackendEquation . add(eqn, eqns);
1004- then ((vars, eqns, otherVars));
1005-
1006- else equation
1007- (vars, eqns, otherVars) = inTpl;
1008- otherVars = BackendVariable . addVar(inVar, otherVars);
1009- then ((vars, eqns, otherVars));
1010- end match;
1011- end selectParameter2;
1012-
10131027protected function selectInitializationVariables2 "author: lochel"
10141028 input BackendDAE . Var inVar;
10151029 input BackendDAE . Variables inVars;
0 commit comments