diff --git a/Compiler/BackEnd/BackendQSS.mo b/Compiler/BackEnd/BackendQSS.mo index 78e0cf02caa..46437e1ae11 100644 --- a/Compiler/BackEnd/BackendQSS.mo +++ b/Compiler/BackEnd/BackendQSS.mo @@ -997,7 +997,7 @@ algorithm list equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations; + list initialEquations, removedInitialEquations; list constraints; list classAttributes; list zeroCrossings,relations; @@ -1017,7 +1017,7 @@ algorithm Option hpOmMemoryMap; case (SimCode.SIMCODE(modelInfo,literals,recordDecls,externalFunctionIncludes,allEquations,odeEquations, - algebraicEquations,residualEquations,useSymbolicInitialization,useHomotopy,initialEquations,startValueEquations,nominalValueEquations,minValueEquations,maxValueEquations, + algebraicEquations,residualEquations,useSymbolicInitialization,useHomotopy,initialEquations,removedInitialEquations,startValueEquations,nominalValueEquations,minValueEquations,maxValueEquations, parameterEquations,removedEquations,algorithmAndEquationAsserts,equationsForZeroCrossings,jacobianEquations,stateSets,constraints,classAttributes,zeroCrossings,relations, timeEvents,whenClauses,discreteModelVars,extObjInfo,makefileParams, delayedExps,jacobianMatrixes,simulationSettingsOpt,fileNamePrefix,hpcOmSchedule,hpOmMemoryMap,crefToSimVarHT,backendMapping),_) @@ -1026,7 +1026,7 @@ algorithm eqs = List.map1(eqs,replaceZC,zc_exps); then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, {eqs}, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, - initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, + initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpOmMemoryMap, crefToSimVarHT,backendMapping); diff --git a/Compiler/BackEnd/HpcOmSimCodeMain.mo b/Compiler/BackEnd/HpcOmSimCodeMain.mo index 4f58ca3abb8..bdc438c4ed6 100644 --- a/Compiler/BackEnd/HpcOmSimCodeMain.mo +++ b/Compiler/BackEnd/HpcOmSimCodeMain.mo @@ -95,6 +95,7 @@ algorithm Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false Boolean useHomotopy; // true if homotopy(...) is used during initialization list initialEquations; // --> initial_equations + list removedInitialEquations; // --> functionRemovedInitialEquations list startValueEquations; // --> updateBoundStartValues list nominalValueEquations; // --> updateBoundNominalValues list minValueEquations; // --> updateBoundMinValues @@ -170,7 +171,8 @@ algorithm //Initial System //-------------- - (initDAE, _) = Initialization.solveInitialSystem(inBackendDAE); + (initDAE, _, _) = Initialization.solveInitialSystem(inBackendDAE); + removedInitialEquations = {}; handleInitialSystem(initDAE, filenamePrefix); //Setup @@ -266,7 +268,7 @@ algorithm //HpcOmScheduler.printSchedule(schedule); Debug.execStat("hpcom dump schedule TaskGraph", GlobalScript.RT_CLOCK_EXECSTAT_HPCOM_MODULES); - SimCode.SIMCODE(modelInfo, simCodeLiterals, simCodeRecordDecls, simCodeExternalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, simCodeLiterals, simCodeRecordDecls, simCodeExternalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, zeroCrossingsEquations, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, _, _, crefToSimVarHT, backendMapping) = simCode; @@ -275,7 +277,7 @@ algorithm optTmpMemoryMap = HpcOmMemory.createMemoryMap(modelInfo, taskGraphSimplified, taskGraphDataSimplified, eqs, filenamePrefix, schedulerInfo, schedule, sccSimEqMapping, criticalPaths, criticalPathsWoC, criticalPathInfo, allComps); - simCode = SimCode.SIMCODE(modelInfo, simCodeLiterals, simCodeRecordDecls, simCodeExternalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + simCode = SimCode.SIMCODE(modelInfo, simCodeLiterals, simCodeRecordDecls, simCodeExternalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, zeroCrossingsEquations, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, SOME(schedule), optTmpMemoryMap, crefToSimVarHT, backendMapping); diff --git a/Compiler/BackEnd/Initialization.mo b/Compiler/BackEnd/Initialization.mo index 76cb998a69d..9edc95f0129 100644 --- a/Compiler/BackEnd/Initialization.mo +++ b/Compiler/BackEnd/Initialization.mo @@ -80,8 +80,9 @@ public function solveInitialSystem "author: lochel input BackendDAE.BackendDAE inDAE; output Option outInitDAE; output Boolean outUseHomotopy; + output list outRemovedInitialEquations; algorithm - (outInitDAE, outUseHomotopy) := matchcontinue(inDAE) + (outInitDAE, outUseHomotopy, outRemovedInitialEquations) := matchcontinue(inDAE) local BackendDAE.BackendDAE dae; BackendDAE.Variables initVars; @@ -105,6 +106,7 @@ algorithm Boolean useHomotopy; list dumpVars, dumpVars2; BackendDAE.ExtraInfo ei; + list removedEqns; case(_) equation // inline all when equations, if active with body else with lhs=pre(lhs) @@ -171,7 +173,7 @@ algorithm // initdae = BackendDAE.DAE({initsyst}, shared); // fix over- and under-constrained subsystems - (initdae, dumpVars2) = analyzeInitialSystem(initdae, dae, initVars); + (initdae, dumpVars2, removedEqns) = analyzeInitialSystem(initdae, dae, initVars); dumpVars = listAppend(dumpVars, dumpVars2); // some debug prints @@ -206,9 +208,9 @@ algorithm Debug.bcall2(b, BackendDump.dumpEqnsSolved, initdae, "initial system: eqns in order"); Debug.fcall(Flags.ITERATION_VARS, BackendDAEOptimize.listAllIterationVariables, initdae); - then (SOME(initdae), useHomotopy); + then (SOME(initdae), useHomotopy, removedEqns); - else (NONE(), false); + else (NONE(), false, {}); end matchcontinue; end solveInitialSystem; @@ -1063,8 +1065,9 @@ protected function analyzeInitialSystem "author: lochel input BackendDAE.Variables inInitVars; output BackendDAE.BackendDAE outDAE; output list outDumpVars; + output list outRemovedEqns; algorithm - (outDAE, (_, _, outDumpVars)) := BackendDAEUtil.mapEqSystemAndFold(initDAE, analyzeInitialSystem2, (inDAE, inInitVars, {})); + (outDAE, (_, _, outDumpVars, outRemovedEqns)) := BackendDAEUtil.mapEqSystemAndFold(initDAE, analyzeInitialSystem2, (inDAE, inInitVars, {}, {})); end analyzeInitialSystem; protected function getConsistentEquations "author: mwenzler" @@ -1078,8 +1081,9 @@ protected function getConsistentEquations "author: mwenzler" input Integer counter; output list outUnassignedEqns; output Boolean outConsistent; + output list outRemovedEqns; algorithm - (outUnassignedEqns, outConsistent) := matchcontinue(inUnassignedEqns, inEqns, inEqnsOrig, inM,vecVarToEqs, vars, shared, counter) + (outUnassignedEqns, outConsistent, outRemovedEqns) := matchcontinue(inUnassignedEqns, inEqns, inEqnsOrig, inM,vecVarToEqs, vars, shared, counter) local Integer currEqID, currVarID, currID, nVars, nEqns; list unassignedEqns, unassignedEqns2, listVar; @@ -1098,10 +1102,10 @@ algorithm BackendDAE.IncidenceMatrix m; BackendDAE.EqSystem system; DAE.FunctionTree funcs; - list list_inEqns; + list list_inEqns, removedEqns; case ({}, _, _, _, _, _, _, _) - then ({}, true); + then ({}, true, {}); case (currID::unassignedEqns, _, _, _, _, _, _, _) equation nVars = BackendVariable.varsSize(vars); @@ -1118,8 +1122,8 @@ algorithm eqn = BackendEquation.equationNth1(inEqnsOrig, currID); Error.addCompilerNotification("The following equation is consistent and got removed from the initialization problem: " +& BackendDump.equationString(eqn)); - (unassignedEqns2, consistent) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter+1); - then (currID::unassignedEqns2, consistent); + (unassignedEqns2, consistent, removedEqns) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter+1); + then (currID::unassignedEqns2, consistent, removedEqns); case (currID::unassignedEqns, _, _, _, _, _, _, _) equation true=emptyListOfIncidenceMatrix({currID},inM,vecVarToEqs, false); @@ -1135,8 +1139,9 @@ algorithm eqn2 = BackendEquation.equationNth1(inEqnsOrig, currID); Error.addCompilerError("The initialization problem is inconsistent due to the following equation: " +& BackendDump.equationString(eqn2) +& " (" +& BackendDump.equationString(eqn) +& ")"); - (unassignedEqns2, consistent) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter); - then ({}, false); + // just to get all errors + (_, _, _) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter); + then ({}, false, {}); case (currID::unassignedEqns, _, _, _, _, _, _, _) equation true=emptyListOfIncidenceMatrix({currID},inM,vecVarToEqs, false); @@ -1161,8 +1166,8 @@ algorithm eqn2 = BackendEquation.equationNth1(inEqnsOrig, currID); Error.addCompilerNotification("It was not possible to analyze the given system symbolically, because the relevant equations are part of an algebraic loop. This is not supported yet."); - (unassignedEqns2, consistent) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter); - then ({}, false); + (_, _, _) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter); + then ({}, false, {}); case (currID::unassignedEqns, _, _, _, _, _, _, _) equation //true = intEq(listLength(inM[currID]), 0); @@ -1177,14 +1182,15 @@ algorithm true=intGt(listLength(listParameter),0); eqn2 = BackendEquation.equationNth1(inEqnsOrig, currID); - Error.addCompilerError("It was not possible to determine if the initialization problem is consistent, because of not evaluable parameters during compile time: " +& BackendDump.equationString(eqn2) +& " (" +& BackendDump.equationString(eqn) +& ")"); + Error.addCompilerWarning("It was not possible to determine if the initialization problem is consistent, because of not evaluable parameters during compile time: " +& BackendDump.equationString(eqn2) +& " (" +& BackendDump.equationString(eqn) +& ")"); - then ({}, false); + (unassignedEqns2, consistent, removedEqns) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs, vars, shared, counter+1); + then (currID::unassignedEqns2, consistent, eqn::removedEqns); case (currID::unassignedEqns, _, _, _, _ , _, _, _) equation false=emptyListOfIncidenceMatrix({currID},inM,vecVarToEqs, true); - (unassignedEqns2, consistent) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs,vars, shared, counter); - then (unassignedEqns2, consistent); + (unassignedEqns2, consistent, removedEqns) = getConsistentEquations(unassignedEqns, inEqns, inEqnsOrig, inM, vecVarToEqs,vars, shared, counter); + then (unassignedEqns2, consistent, removedEqns); end matchcontinue; end getConsistentEquations; @@ -1632,16 +1638,18 @@ protected function fixOverDeterminedInitialSystem "author: mwenzler" input array> mapEqnIncRow; input array mapIncRowEqn; input BackendDAE.Shared shared; + input list inRemovedEqns; output BackendDAE.EquationArray outEqns; + output list outRemovedEqns; algorithm - outEqns := matchcontinue(vars, eqns, inOrigEqns, inNUnassignedEqns, inMOrig, inM, inMt, me, meT, mapEqnIncRow, mapIncRowEqn, shared) + (outEqns, outRemovedEqns) := matchcontinue(vars, eqns, inOrigEqns, inNUnassignedEqns, inMOrig, inM, inMt, me, meT, mapEqnIncRow, mapIncRowEqn, shared, inRemovedEqns) local Integer nVars, nEqns, nUnassignedEqns; array vec1, vec2, marker; list vec1Lst, vec2Lst, flatComps, outMarkerComps, outMarkerEq, markerEq; list unassignedEqns, outUnassignedEqns, resiUnassignedEqns, marker_list; list> comps; - BackendDAE.EquationArray substEqns, origEqns; + BackendDAE.EquationArray substEqns, origEqns, eqns2; BackendVarTransform.VariableReplacements repl, outRepl; list eqns_list, eqns_1; Boolean boolUnassignedEqns, divideByZero; @@ -1649,14 +1657,15 @@ algorithm DAE.Ident ident; BackendDAE.IncidenceMatrix mCopy, m2; BackendDAE.IncidenceMatrixT mtCopy, mt2; + list removedEqns; - case (_, _, _, _, _, _, _, _, _, _, _, _) equation + case (_, _, _, _, _, _, _, _, _, _, _, _, _) equation nVars = BackendVariable.varsSize(vars); nEqns = BackendDAEUtil.equationSize(eqns); true = intEq(nVars, nEqns); - then eqns; + then (eqns, inRemovedEqns); - case (_, _, _, _, _, _, _, _, _, _, _, _) equation + case (_, _, _, _, _, _, _, _, _, _, _, _, _) equation nVars = BackendVariable.varsSize(vars); nEqns = BackendDAEUtil.equationSize(eqns); true = intLt(nVars, nEqns); @@ -1696,13 +1705,15 @@ algorithm unassignedEqns=adaptUnassignedEqns(unassignedEqns, {}, mapIncRowEqn); eqns_1=removeEqswork(unassignedEqns,eqns_list,vars,outRepl); substEqns = BackendEquation.listEquation(eqns_1); - (outUnassignedEqns, true) = getConsistentEquations(unassignedEqns, substEqns, eqns, m2, vec1,vars, shared, 1); + (outUnassignedEqns, true, removedEqns) = getConsistentEquations(unassignedEqns, substEqns, eqns, m2, vec1,vars, shared, 1); // remove all unassigned equations substEqns = BackendEquation.equationDelete(substEqns, outUnassignedEqns); origEqns = BackendEquation.equationDelete(inOrigEqns, outUnassignedEqns); + removedEqns = listAppend(removedEqns, inRemovedEqns); - then fixOverDeterminedInitialSystem(vars, substEqns, inOrigEqns, nUnassignedEqns, inMOrig, m2, mt2, me, meT, mapEqnIncRow, mapIncRowEqn, shared); + (eqns2, removedEqns) = fixOverDeterminedInitialSystem(vars, substEqns, inOrigEqns, nUnassignedEqns, inMOrig, m2, mt2, me, meT, mapEqnIncRow, mapIncRowEqn, shared, removedEqns); + then (eqns2, removedEqns); else // equation // Error.addInternalError("./Compiler/BackEnd/Initialization.mo: function fixOverDeterminedInitialSystem failed"); @@ -1812,9 +1823,9 @@ end manipulatedAdjacencyMatrix2; protected function analyzeInitialSystem2 "author: lochel" input BackendDAE.EqSystem isyst; - input tuple>> sharedOptimized; + input tuple, list>> sharedOptimized; output BackendDAE.EqSystem osyst; - output tuple>> osharedOptimized; + output tuple, list>> osharedOptimized; algorithm (osyst, osharedOptimized) := matchcontinue(isyst, sharedOptimized) local @@ -1832,9 +1843,10 @@ algorithm BackendDAE.AdjacencyMatrixTEnhanced meT; array> mapEqnIncRow; array mapIncRowEqn; + list removedEqns; // over-determined system [experimental support] - case(sys as BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), (shared, (inDAE, initVars, dumpVars))) equation + case(sys as BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), (shared, (inDAE, initVars, dumpVars, removedEqns))) equation nVars = BackendVariable.varsSize(vars); nEqns = BackendDAEUtil.equationSize(eqns); true = intGt(nEqns, nVars); @@ -1853,12 +1865,12 @@ algorithm SOME(m1)=BackendDAEUtil.copyIncidenceMatrix(SOME(m)); SOME(mt1)=BackendDAEUtil.copyIncidenceMatrix(SOME(mt)); - origEqns=fixOverDeterminedInitialSystem(vars, eqns, eqns, nEqns, mOrig, m1, mt1, me, meT, mapEqnIncRow, mapIncRowEqn, shared); + (origEqns, removedEqns) = fixOverDeterminedInitialSystem(vars, eqns, eqns, nEqns, mOrig, m1, mt1, me, meT, mapEqnIncRow, mapIncRowEqn, shared, removedEqns); system = BackendDAE.EQSYSTEM(vars, origEqns, NONE(), NONE(), BackendDAE.NO_MATCHING(), {}); - then (system, (shared, (inDAE, initVars, dumpVars))); + then (system, (shared, (inDAE, initVars, dumpVars, removedEqns))); // under-determined system - case(BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), (shared, (inDAE, initVars, dumpVars))) equation + case(BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), (shared, (inDAE, initVars, dumpVars, removedEqns))) equation nVars = BackendVariable.varsSize(vars); nEqns = BackendDAEUtil.equationSize(eqns); true = intLt(nEqns, nVars); @@ -1866,7 +1878,7 @@ algorithm (eqns, dumpVars2) = fixUnderDeterminedInitialSystem(inDAE, vars, eqns, initVars, shared); dumpVars = listAppend(dumpVars, dumpVars2); system = BackendDAE.EQSYSTEM(vars, eqns, NONE(), NONE(), BackendDAE.NO_MATCHING(), {}); - then (system, (shared, (inDAE, initVars, dumpVars))); + then (system, (shared, (inDAE, initVars, dumpVars, removedEqns))); else (isyst, sharedOptimized); end matchcontinue; diff --git a/Compiler/BackEnd/SimCode.mo b/Compiler/BackEnd/SimCode.mo index 8b0a3659f44..007c64fbbe0 100644 --- a/Compiler/BackEnd/SimCode.mo +++ b/Compiler/BackEnd/SimCode.mo @@ -88,6 +88,7 @@ uniontype SimCode Boolean useSymbolicInitialization "true if a system to solve the initial problem symbolically is generated, otherwise false"; Boolean useHomotopy "true if homotopy(...) is used during initialization"; list initialEquations; + list removedInitialEquations; list startValueEquations; list nominalValueEquations; list minValueEquations; diff --git a/Compiler/BackEnd/SimCodeUtil.mo b/Compiler/BackEnd/SimCodeUtil.mo index 6551c236786..329ffae6331 100644 --- a/Compiler/BackEnd/SimCodeUtil.mo +++ b/Compiler/BackEnd/SimCodeUtil.mo @@ -1449,6 +1449,7 @@ algorithm Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false Boolean useHomotopy; // true if homotopy(...) is used during initialization list initialEquations; // --> initial_equations + list removedInitialEquations; // --> list startValueEquations; // --> updateBoundStartValues list nominalValueEquations; // --> updateBoundNominalValues list minValueEquations; // --> updateBoundMinValues @@ -1474,6 +1475,7 @@ algorithm BackendDAE.EqSystems systs; BackendDAE.Shared shared; BackendDAE.EquationArray removedEqs; + list removedInitialEquationLst; list lits; list tempvars, jacobianSimvars; @@ -1497,7 +1499,7 @@ algorithm _ = Absyn.pathStringNoQual(class_); // generate initDAE before replacing pre(alias)! - (initDAE, useHomotopy) = Initialization.solveInitialSystem(dlow); + (initDAE, useHomotopy, removedInitialEquationLst) = Initialization.solveInitialSystem(dlow); Debug.fcall(Flags.ITERATION_VARS, BackendDAEOptimize.listAllIterationVariables, dlow); @@ -1508,7 +1510,7 @@ algorithm dlow = BackendDAEUtil.addDummyStateIfNeeded(dlow); // initialization stuff - (residuals, initialEquations, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, useSymbolicInitialization) = createInitialResiduals(dlow, initDAE, uniqueEqIndex, {}); + (residuals, initialEquations, removedInitialEquations, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, useSymbolicInitialization) = createInitialResiduals(dlow, initDAE, removedInitialEquationLst, uniqueEqIndex, {}); (jacG, uniqueEqIndex) = createInitialMatrices(dlow, uniqueEqIndex); // addInitialStmtsToAlgorithms @@ -1615,6 +1617,7 @@ algorithm parameterEquations = List.map(parameterEquations, addDivExpErrorMsgtoSimEqSystem); removedEquations = List.map(removedEquations, addDivExpErrorMsgtoSimEqSystem); initialEquations = List.map(initialEquations, addDivExpErrorMsgtoSimEqSystem); + removedInitialEquations = List.map(removedInitialEquations, addDivExpErrorMsgtoSimEqSystem); odeEquations = makeEqualLengthLists(odeEquations, Config.noProc()); algebraicEquations = makeEqualLengthLists(algebraicEquations, Config.noProc()); @@ -1641,6 +1644,7 @@ algorithm useSymbolicInitialization, useHomotopy, initialEquations, + removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, @@ -6356,18 +6360,20 @@ protected function createInitialResiduals "author: lochel This function generates all initial_residuals." input BackendDAE.BackendDAE inDAE; input Option inInitDAE; + input List inRemovedEqnLst; input Integer iuniqueEqIndex; input list itempvars; output list outResiduals; output list outInitialEqns; + output list outRemovedInitialEqns; output Integer outNumberOfInitialEquations; output Integer outNumberOfInitialAlgorithms; output Integer ouniqueEqIndex; output list otempvars; output Boolean useSymbolicInitialization; algorithm - (outResiduals, outInitialEqns, outNumberOfInitialEquations, outNumberOfInitialAlgorithms, ouniqueEqIndex, otempvars, useSymbolicInitialization) := - matchcontinue(inDAE, inInitDAE, iuniqueEqIndex, itempvars) + (outResiduals, outInitialEqns, outRemovedInitialEqns, outNumberOfInitialEquations, outNumberOfInitialAlgorithms, ouniqueEqIndex, otempvars, useSymbolicInitialization) := + matchcontinue(inDAE, inInitDAE, inRemovedEqnLst, iuniqueEqIndex, itempvars) local BackendDAE.EquationArray removedEqs; list tempvars; @@ -6376,7 +6382,7 @@ algorithm list initialEqs_lst; Integer numberOfInitialEquations, numberOfInitialAlgorithms; - list residual_equations, allEquations, removedEquations, knvarseqns, aliasEquations; + list residual_equations, allEquations, removedEquations, knvarseqns, aliasEquations, removedInitialEquations; BackendDAE.EqSystems systs; BackendDAE.Shared shared; BackendDAE.Variables knvars, aliasVars; @@ -6385,7 +6391,7 @@ algorithm case (_, SOME(BackendDAE.DAE(systs, shared as BackendDAE.SHARED(knownVars=knvars, aliasVars=aliasVars, - removedEqs=removedEqs))), _, _) equation + removedEqs=removedEqs))), _, _, _) equation // generate equations from the solved systems (uniqueEqIndex, _, _, allEquations, _, tempvars, _, _, _) = createEquationsForSystems(systs, shared, iuniqueEqIndex, {}, {}, {}, {}, {}, itempvars, 0, {}, {}, SimCode.NO_MAPPING()); // generate equations from the removed equations @@ -6397,17 +6403,20 @@ algorithm // generate equations from the alias variables ((uniqueEqIndex, aliasEquations)) = BackendVariable.traverseBackendDAEVars(aliasVars, traverseAliasVarsToSimEqSystem, (uniqueEqIndex, {})); allEquations = listAppend(allEquations, aliasEquations); + + // generate equations from removed initial equations + (removedInitialEquations, uniqueEqIndex, tempvars) = createNonlinearResidualEquations(inRemovedEqnLst, uniqueEqIndex, tempvars); // also generate all the stuff for the numerical initialization (initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms) = BackendDAEOptimize.collectInitialEquations(inDAE); (residual_equations, uniqueEqIndex, tempvars) = createNonlinearResidualEquations(initialEqs_lst, uniqueEqIndex, tempvars); - then (residual_equations, allEquations, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, true); + then (residual_equations, allEquations, removedInitialEquations, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, true); - case (_, _, _, _) equation + case (_, _, _, _, _) equation (initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms) = BackendDAEOptimize.collectInitialEquations(inDAE); (residual_equations, uniqueEqIndex, tempvars) = createNonlinearResidualEquations(initialEqs_lst, iuniqueEqIndex, itempvars); Error.addCompilerWarning("No system for the symbolic initialization was generated. A method using numerical algorithms will be used instead."); - then (residual_equations, {}, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, false); + then (residual_equations, {}, {}, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, false); else equation Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/SimCodeUtil.mo: createInitialResiduals failed"}); @@ -11367,7 +11376,7 @@ algorithm list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations; + list initialEquations, removedInitialEquations; list constraints; list classAttributes; list zeroCrossings, relations; @@ -11396,7 +11405,7 @@ algorithm true = Config.acceptMetaModelicaGrammar(); then inSimCode; - case SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping) equation @@ -11413,7 +11422,7 @@ algorithm files = List.sort(files, greaterFileInfo); modelInfo = SimCode.MODELINFO(name, description, directory, varInfo, vars, functions, labels); then - SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); @@ -11678,7 +11687,7 @@ algorithm list> algebraicEquations; list residualEquations; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations; + list initialEquations, removedInitialEquations; list startValueEquations; list nominalValueEquations; list minValueEquations; @@ -11710,7 +11719,7 @@ algorithm case (SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, - useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, @@ -11723,6 +11732,7 @@ algorithm (algebraicEquations, a) = traverseExpsEqSystemsList(algebraicEquations, func, a, {}); (residualEquations, a) = traverseExpsEqSystems(residualEquations, func, a, {}); (initialEquations, a) = traverseExpsEqSystems(initialEquations, func, a, {}); + (removedInitialEquations, a) = traverseExpsEqSystems(removedInitialEquations, func, a, {}); (startValueEquations, a) = traverseExpsEqSystems(startValueEquations, func, a, {}); (nominalValueEquations, a) = traverseExpsEqSystems(nominalValueEquations, func, a, {}); (minValueEquations, a) = traverseExpsEqSystems(minValueEquations, func, a, {}); @@ -11738,7 +11748,7 @@ algorithm /* TODO:delayedExps */ then (SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, - useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, @@ -11891,7 +11901,7 @@ algorithm list> algebraicEquations; list residualEquations; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations; + list initialEquations, removedInitialEquations; list startValueEquations; list nominalValueEquations; list minValueEquations; @@ -11922,14 +11932,14 @@ algorithm case (SimCode.SIMCODE(modelInfo, _, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, - useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping), _) then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, - useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts,equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, @@ -13001,7 +13011,7 @@ protected list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations; + list initialEquations, removedInitialEquations; list constraints; list classAttributes; list zeroCrossings, relations; @@ -13028,7 +13038,7 @@ protected list stateVars,derivativeVars,algVars,discreteAlgVars,intAlgVars,boolAlgVars,inputVars,outputVars,aliasVars,intAliasVars,boolAliasVars,paramVars,intParamVars,boolParamVars,stringAlgVars,stringParamVars,stringAliasVars,extObjVars,constVars,intConstVars,boolConstVars,stringConstVars,jacobianVars,realOptimizeConstraintsVars; algorithm simCodeOut := match(simVar,simCodeIn) - case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping)) equation @@ -13040,7 +13050,7 @@ algorithm stringParamVars,stringAliasVars,extObjVars,constVars,intConstVars,boolConstVars,stringConstVars,jacobianVars,realOptimizeConstraintsVars); modelInfo = SimCode.MODELINFO(name, description, directory, varInfo, vars, functions, labels); then - SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); end match; @@ -13061,7 +13071,7 @@ protected list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations, odes; + list initialEquations, removedInitialEquations, odes; list constraints; list classAttributes; list zeroCrossings, relations; @@ -13087,7 +13097,7 @@ protected Option hpcOmMemory; algorithm simCodeOut := match(simEqSys,sysIdx,simCodeIn) - case (_,_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case (_,_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping)) equation @@ -13096,7 +13106,7 @@ algorithm odeEquations = List.set(odeEquations,sysIdx,odes); allEquations = listAppend({simEqSys},allEquations); then - SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); end match; @@ -13116,7 +13126,7 @@ protected list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations, odes; + list initialEquations, removedInitialEquations, odes; list constraints; list classAttributes; list zeroCrossings, relations; @@ -13142,13 +13152,13 @@ protected Option hpcOmMemory; algorithm simCodeOut := match(simEqSys,simCodeIn) - case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping)) equation initialEquations = listAppend(initialEquations,{simEqSys}); then - SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); end match; @@ -13169,7 +13179,7 @@ protected list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations, odes; + list initialEquations, removedInitialEquations, odes; list constraints; list classAttributes; list zeroCrossings, relations; @@ -13195,11 +13205,11 @@ protected Option hpcOmMemory; algorithm simCodeOut := match(allEqs,odeEqs,simCodeIn) - case (_,_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case (_,_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping)) then - SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEqs, odeEqs, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEqs, odeEqs, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); end match; @@ -13222,7 +13232,7 @@ algorithm list allEquations, residualEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, jacobianEquations, equationsForZeroCrossings; list stateSets; Boolean useSymbolicInitialization, useHomotopy; - list initialEquations, odes; + list initialEquations, removedInitialEquations, odes; list constraints; list classAttributes; list zeroCrossings, relations; @@ -13246,11 +13256,11 @@ algorithm Option hpcOmSchedule; Option backendMapping; Option hpcOmMemory; - case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + case (_,SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT, backendMapping)) then - SimCode.SIMCODE(modelInfoIn, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, + SimCode.SIMCODE(modelInfoIn, literals, recordDecls, externalFunctionIncludes, allEquations, odeEquations, algebraicEquations, residualEquations, useSymbolicInitialization, useHomotopy, initialEquations, removedInitialEquations, startValueEquations, nominalValueEquations, minValueEquations, maxValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, equationsForZeroCrossings, jacobianEquations, stateSets, constraints, classAttributes, zeroCrossings, relations, timeEvents, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, hpcOmSchedule, hpcOmMemory, crefToSimVarHT,backendMapping); end match; diff --git a/Compiler/Template/CodegenC.tpl b/Compiler/Template/CodegenC.tpl index d92f266507a..00a69519720 100644 --- a/Compiler/Template/CodegenC.tpl +++ b/Compiler/Template/CodegenC.tpl @@ -319,6 +319,7 @@ template simulationFile_inz(SimCode simCode, String guid) <%functionInitialResidual(residualEquations, modelNamePrefix(simCode))%> <%functionInitialEquations(useSymbolicInitialization, initialEquations, modelNamePrefix(simCode))%> + <%functionRemovedInitialEquations(useSymbolicInitialization, removedInitialEquations, modelNamePrefix(simCode))%> <%functionInitialMixedSystems(initialEquations, parameterEquations, allEquations, jacobianEquations, modelNamePrefix(simCode))%> @@ -628,6 +629,7 @@ template simulationFile(SimCode simCode, String guid) extern const char* <%symbolName(modelNamePrefixStr,"initialResidualDescription")%>(int); extern int <%symbolName(modelNamePrefixStr,"initial_residual")%>(DATA *data, double* initialResiduals); extern int <%symbolName(modelNamePrefixStr,"functionInitialEquations")%>(DATA *data); + extern int <%symbolName(modelNamePrefixStr,"functionRemovedInitialEquations")%>(DATA *data); extern int <%symbolName(modelNamePrefixStr,"updateBoundParameters")%>(DATA *data); extern int <%symbolName(modelNamePrefixStr,"checkForAsserts")%>(DATA *data); extern int <%symbolName(modelNamePrefixStr,"function_ZeroCrossingsEquations")%>(DATA *data); @@ -673,6 +675,7 @@ template simulationFile(SimCode simCode, String guid) <%if useSymbolicInitialization then '1' else '0'%> /* useSymbolicInitialization */, <%if useHomotopy then '1' else '0'%> /* useHomotopy */, <%symbolName(modelNamePrefixStr,"functionInitialEquations")%>, + <%symbolName(modelNamePrefixStr,"functionRemovedInitialEquations")%>, <%symbolName(modelNamePrefixStr,"updateBoundParameters")%>, <%symbolName(modelNamePrefixStr,"checkForAsserts")%>, <%symbolName(modelNamePrefixStr,"function_ZeroCrossingsEquations")%>, @@ -1762,6 +1765,7 @@ end functionInitialStateSets; // - int updateBoundVariableAttributes(DATA *data) // - int initial_residual(DATA *data, double *initialResiduals) // - int functionInitialEquations(DATA *data) +// - int functionRemovedInitialEquations(DATA *data) // ============================================================================= template functionUpdateBoundVariableAttributes(list startValueEquations, list nominalValueEquations, list minValueEquations, list maxValueEquations, String modelNamePrefix) @@ -1985,6 +1989,58 @@ template functionInitialEquations(Boolean useSymbolicInitialization, list> end functionInitialEquations; +template functionRemovedInitialEquationsBody(SimEqSystem eq, Text &varDecls /*BUFP*/, Text &eqs, String modelNamePrefix) + "Generates an equation." +::= + match eq + case e as SES_RESIDUAL(__) then + match exp + case DAE.SCONST(__) then + 'res = 0;' + else + let &preExp = buffer "" /*BUFD*/ + let expPart = daeExp(exp, contextOther, &preExp /*BUFC*/, &varDecls /*BUFD*/) + << + <% if profileAll() then 'SIM_PROF_TICK_EQ(<%e.index%>);' %> + <%preExp%>res = <%expPart%>; + <% if profileAll() then 'SIM_PROF_ACC_EQ(<%e.index%>);' %> + if(fabs(res) > 1e-5) + { + errorStreamPrint(LOG_INIT, 0, "The initialization problem is inconsistent due to the following equation: 0 != %g = <%ExpressionDump.printExpStr(exp)%>", res); + return 1; + } + >> + end match + else + equation_(eq, contextSimulationDiscrete, &varDecls /*BUFD*/, &eqs, modelNamePrefix) + end match +end functionRemovedInitialEquationsBody; + +template functionRemovedInitialEquations(Boolean useSymbolicInitialization, list removedInitalEquations, String modelNamePrefix) + "Generates function in simulation file." +::= + let &varDecls = buffer "" /*BUFD*/ + let &tmp = buffer "" + + let body = (removedInitalEquations |> eq2 => + functionRemovedInitialEquationsBody(eq2, &varDecls /*BUFD*/, &tmp, modelNamePrefix) + ;separator="\n") + + << + <%tmp%> + int <%symbolName(modelNamePrefix,"functionRemovedInitialEquations")%>(DATA *data) + { + const int *equationIndexes = NULL; + double res = 0.0; + <%varDecls%> + + <%body%> + + return 0; + } + >> +end functionRemovedInitialEquations; + template functionStoreDelayed(DelayedExpression delayed, String modelNamePrefix) "Generates function in simulation file." ::= diff --git a/Compiler/Template/SimCodeDump.tpl b/Compiler/Template/SimCodeDump.tpl index dd22447a237..e67911ee256 100644 --- a/Compiler/Template/SimCodeDump.tpl +++ b/Compiler/Template/SimCodeDump.tpl @@ -57,6 +57,9 @@ template dumpSimCodeBase(SimCode code, Boolean withOperations) <%dumpEqs(SimCodeUtil.sortEqSystems(initialEquations),0,withOperations)%> + + <%dumpEqs(SimCodeUtil.sortEqSystems(removedInitialEquations),0,withOperations)%> + <%dumpEqs(SimCodeUtil.sortEqSystems(residualEquations),0,withOperations)%> diff --git a/Compiler/Template/SimCodeTV.mo b/Compiler/Template/SimCodeTV.mo index 0590b87a1e4..2922b5d5d20 100644 --- a/Compiler/Template/SimCodeTV.mo +++ b/Compiler/Template/SimCodeTV.mo @@ -166,6 +166,7 @@ package SimCode Boolean useSymbolicInitialization; // true if a system to solve the initial problem symbolically is generated, otherwise false Boolean useHomotopy; // true if homotopy(...) is used during initialization list initialEquations; + list removedInitialEquations; list startValueEquations; list nominalValueEquations; list minValueEquations; diff --git a/SimulationRuntime/c/openmodelica_func.h b/SimulationRuntime/c/openmodelica_func.h index 5b7634cb893..bc0af5672d2 100644 --- a/SimulationRuntime/c/openmodelica_func.h +++ b/SimulationRuntime/c/openmodelica_func.h @@ -157,6 +157,16 @@ const int useHomotopy; */ int (*functionInitialEquations)(DATA *data); +/*! \fn functionRemovedInitialEquations + * + * This function contains removed equations from the initialization problem, + * which need to be checked to verify the consistency of the initialization + * problem. + * + * \param [ref] [data] + */ +int (*functionRemovedInitialEquations)(DATA *data); + /*! \fn updateBoundParameters * * This function calculates bound parameters that depend on other parameters, diff --git a/SimulationRuntime/c/simulation/solver/initialization/initialization.c b/SimulationRuntime/c/simulation/solver/initialization/initialization.c index 2cdf410d425..415e89e44da 100644 --- a/SimulationRuntime/c/simulation/solver/initialization/initialization.c +++ b/SimulationRuntime/c/simulation/solver/initialization/initialization.c @@ -759,8 +759,9 @@ static int symbolic_initialization(DATA *data, long numLambdaSteps) if(stateSelection(data, 1, 1) == 1) warningStreamPrint(LOG_STDOUT, 0, "Cannot initialize the dynamic state selection in an unique way. Use -lv LOG_DSS to see the switching state set."); } - - return 0; + + /* check for over-determined systems */ + return data->callback->functionRemovedInitialEquations(data); } /*! \fn static char *mapToDymolaVars(const char *varname)