Skip to content

Commit

Permalink
- solve the inital system symbolical in case of equal var and equatio…
Browse files Browse the repository at this point in the history
…n size

- skip external objects from algorithm outputs
- fix test Modelica.Electrical.QuasiStationary.SinglePhase.Examples.Rectifier

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13702 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Oct 29, 2012
1 parent 0721299 commit faef3b1
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 55 deletions.
46 changes: 27 additions & 19 deletions Compiler/BackEnd/BackendDAEUtil.mo
Original file line number Diff line number Diff line change
Expand Up @@ -8468,6 +8468,12 @@ algorithm
(syst,shared,arg) = matchingAlgorithmfunc(syst,ishared, match_opts, sssHandler, arg);
Debug.execStat("transformDAE -> matchingAlgorithm " +& mAmethodstr +& " index Reduction Method " +& str1,BackendDAE.RT_CLOCK_EXECSTAT_BACKEND_MODULES);
then (syst,shared,SOME(arg));
case (BackendDAE.EQSYSTEM(matching=BackendDAE.NO_MATCHING()),_,_,(matchingAlgorithmfunc,mAmethodstr),(sssHandler,str1,_,_))
equation
str = "Transformation Module " +& mAmethodstr +& " index Reduction Method " +& str1 +& " failed!";
Error.addMessage(Error.INTERNAL_ERROR, {str});
then
fail();
else
equation
str = "Transformation Module failed!";
Expand Down Expand Up @@ -9258,13 +9264,13 @@ public function solveInitialSystem
autor Frenkel TUD 2012-10"
input BackendDAE.BackendDAE inDAE;
output BackendDAE.BackendDAE outDAE;
output list<BackendDAE.Equation> outInitEqns;
output BackendDAE.BackendDAE outInitDAE;
algorithm
(outDAE,outInitEqns) := match (inDAE)
(outDAE,outInitDAE) := match (inDAE)
local
BackendDAE.EqSystems systs;
BackendDAE.Variables knvars,vars,fixvars,evars;
BackendDAE.EquationArray inieqns,eqns,emptyeqns;
BackendDAE.Variables knvars,vars,fixvars,evars,eavars;
BackendDAE.EquationArray inieqns,eqns,emptyeqns,emptyreeqns;
BackendDAE.EqSystem initsyst;
BackendDAE.BackendDAE initdae;
Integer nvars,neqns;
Expand All @@ -9286,15 +9292,18 @@ algorithm
// generate initial system
initsyst = BackendDAE.EQSYSTEM(vars,eqns,NONE(),NONE(),BackendDAE.NO_MATCHING());
evars = emptyVars();
eavars = emptyVars();
emptyeqns = listEquation({});
emptyreeqns = listEquation({});
initdae = BackendDAE.DAE({initsyst},
BackendDAE.SHARED(fixvars,evars,evars,emptyeqns,emptyeqns,constraints,classAttrs,cache,env,functionTree,BackendDAE.EVENT_INFO({},{},{},{},0),{},BackendDAE.INITIALSYSTEM(),{}));
// BackendDump.dumpEqSystem(initsyst);
BackendDAE.SHARED(fixvars,evars,eavars,emptyeqns,emptyreeqns,constraints,classAttrs,cache,env,functionTree,BackendDAE.EVENT_INFO({},{},{},{},0),{},BackendDAE.INITIALSYSTEM(),{}));
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "Initial System:\n");
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, BackendDump.dump, initdae);
nvars = BackendVariable.varsSize(vars);
neqns = equationSize(eqns);
eqnslst = solveInitialSystem1(nvars,neqns,initdae);
initdae = solveInitialSystem1(nvars,neqns,initdae);
then
(inDAE,{});
(inDAE,initdae);
end match;
end solveInitialSystem;

Expand All @@ -9304,9 +9313,9 @@ protected function solveInitialSystem1
input Integer nVars;
input Integer nEqns;
input BackendDAE.BackendDAE inDAE;
output list<BackendDAE.Equation> outInitEqns;
output BackendDAE.BackendDAE outDAE;
algorithm
outInitEqns := matchcontinue (nVars,nEqns,inDAE)
outDAE := matchcontinue (nVars,nEqns,inDAE)
local
BackendDAE.BackendDAE isyst;
list<tuple<pastoptimiseDAEModule,String,Boolean>> pastOptModules;
Expand All @@ -9316,34 +9325,33 @@ algorithm
case (_,_,_)
equation
true = intGt(nEqns,nVars);
print("OverConstrained Intial System\n");
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "OverConstrained Initial System\n");
then
{};
fail();
// equal
case (_,_,_)
equation
true = intEq(nEqns,nVars);
print("Intial System\n");
pastOptModules = getPastOptModules(SOME({"constantLinearSystem","removeSimpleEquations","tearingSystem"}));
matchingAlgorithm = getMatchingAlgorithm(NONE());
daeHandler = getIndexReductionMethod(NONE());
// solve system
isyst = transformBackendDAE(inDAE,SOME((BackendDAE.NO_INDEX_REDUCTION(),BackendDAE.EXACT())),NONE(),NONE());
// simplify system
(isyst,Util.SUCCESS()) = pastoptimiseDAE(isyst,pastOptModules,matchingAlgorithm,daeHandler);
BackendDump.dump(isyst);
BackendDump.dumpEqnsSolved(isyst);
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "Solved Initial System");
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, BackendDump.dump, isyst);
then
{};
isyst;
// underconstrained System
case (_,_,_)
equation
true = intLt(nEqns,nVars);
print("underconstrained Intial System\n");
BackendDump.dump(inDAE);
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "underconstrained Initial System\n");
//BackendDump.dump(inDAE);

then
{};
fail();
end matchcontinue;
end solveInitialSystem1;

Expand Down
5 changes: 3 additions & 2 deletions Compiler/BackEnd/BackendQSS.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1014,6 +1014,7 @@ algorithm
list<String> externalFunctionIncludes;
list<list<SimCode.SimEqSystem>> odeEquations;
list<SimCode.SimEqSystem> allEquations,algebraicEquations,residualEquations,startValueEquations,parameterEquations,removedEquations,sampleEquations,algorithmAndEquationAsserts;
list<SimCode.SimEqSystem> initialEquations;
list<DAE.Constraint> constraints;
list<BackendDAE.ZeroCrossing> zeroCrossings;
list<SimCode.SampleCondition> sampleConditions;
Expand All @@ -1029,14 +1030,14 @@ algorithm
list<SimCode.JacobianMatrix> jacobianMatrixes;
list<SimCode.SimEqSystem> eqs;
case (SimCode.SIMCODE(modelInfo,literals,recordDecls,externalFunctionIncludes,allEquations,odeEquations,
algebraicEquations,residualEquations,startValueEquations,
algebraicEquations,residualEquations,initialEquations,startValueEquations,
parameterEquations,removedEquations,algorithmAndEquationAsserts,constraints,zeroCrossings,
sampleConditions,sampleEquations,helpVarInfo,whenClauses,discreteModelVars,extObjInfo,makefileParams,
delayedExps,jacobianMatrixes,simulationSettingsOpt,fileNamePrefix,crefToSimVarHT),_)
equation
{eqs} = odeEquations;
eqs = List.map1(eqs,replaceZC,zc_exps);
then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, {eqs}, algebraicEquations, residualEquations, startValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, constraints, zeroCrossings, sampleConditions, sampleEquations, helpVarInfo, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, crefToSimVarHT);
then SimCode.SIMCODE(modelInfo, literals, recordDecls, externalFunctionIncludes, allEquations, {eqs}, algebraicEquations, residualEquations, initialEquations, startValueEquations, parameterEquations, removedEquations, algorithmAndEquationAsserts, constraints, zeroCrossings, sampleConditions, sampleEquations, helpVarInfo, whenClauses, discreteModelVars, extObjInfo, makefileParams, delayedExps, jacobianMatrixes, simulationSettingsOpt, fileNamePrefix, crefToSimVarHT);

end match;
end replaceDiscontsInOde;
Expand Down
1 change: 1 addition & 0 deletions Compiler/BackEnd/SimCode.mo
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ uniontype SimCode
list<list<SimEqSystem>> odeEquations;
list<SimEqSystem> algebraicEquations;
list<SimEqSystem> residualEquations;
list<SimEqSystem> initialEquations;
list<SimEqSystem> startValueEquations;
list<SimEqSystem> parameterEquations;
list<SimEqSystem> removedEquations;
Expand Down

0 comments on commit faef3b1

Please sign in to comment.