Skip to content

Commit af1ba77

Browse files
author
Willi Braun
committed
changed interface for solving nonlinear systems in the c runtime
- get rid of macros for solving - easier itegeration of further solver - added scaling of error function - added x scaling git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@12965 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 34f8bde commit af1ba77

20 files changed

+1238
-274
lines changed

Compiler/BackEnd/SimCode.mo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ uniontype VarInfo
185185
Integer numStringParamVars;
186186
Integer numStringAliasVars;
187187
Integer numJacobianVars;
188+
Integer numNonLinearResFunctions;
188189
Option <Integer> dimODE1stOrder;
189190
Option <Integer> dimODE2ndOrder;
190191
end VARINFO;
@@ -414,6 +415,7 @@ uniontype SimEqSystem
414415
Integer index;
415416
list<SimEqSystem> eqs;
416417
list<DAE.ComponentRef> crefs;
418+
Integer indexNonLinear;
417419
end SES_NONLINEAR;
418420
record SES_MIXED
419421
Integer index;

Compiler/BackEnd/SimCodeUtil.mo

Lines changed: 92 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,7 +1800,7 @@ algorithm
18001800
matchcontinue (inBackendDAE,inClassName,filenamePrefix,inString11,functions,externalFunctionIncludes,includeDirs,libs,simSettingsOpt,recordDecls,literals,args)
18011801
local
18021802
String cname, fileDir;
1803-
Integer n_h,maxDelayedExpIndex,uniqueEqIndex;
1803+
Integer n_h,maxDelayedExpIndex,uniqueEqIndex,nonLinearCount;
18041804
Integer numberOfInitialEquations, numberOfInitialAlgorithms;
18051805
list<SimCode.HelpVarInfo> helpVarInfo;
18061806
BackendDAE.BackendDAE dlow,dlow2;
@@ -1878,6 +1878,10 @@ algorithm
18781878
(uniqueEqIndex,odeEquations,algebraicEquations,allEquations,tempvars) = createEquationsForSystems(systs,shared,helpVarInfo,uniqueEqIndex,{},{},{},{});
18791879

18801880
modelInfo = addTempVars(tempvars,modelInfo);
1881+
1882+
// update indexNonLinear in SES_NONLINEAR and count
1883+
(allEquations,nonLinearCount) = updateNonLinearSys(allEquations, 0);
1884+
modelInfo = addnonLinearCount(nonLinearCount,modelInfo);
18811885

18821886
odeEquations = makeEqualLengthLists(odeEquations,Config.noProc());
18831887

@@ -1988,12 +1992,13 @@ algorithm
19881992
Integer numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars;
19891993
Integer numStringParamVars,numStringAliasVars,numJacobianVars;
19901994
Option<Integer> dimODE1stOrder,dimODE2ndOrder;
1995+
Integer numNonLinearResFunctions;
19911996
case({},_) then modelInfo;
19921997
case(_,SimCode.MODELINFO(name,directory,varInfo,vars,functions,labels))
19931998
equation
19941999
SimCode.VARINFO(numHelpVars,numZeroCrossings,numTimeEvents,numStateVars,numAlgVars,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,numBoolAliasVars,numParams,
19952000
numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,
1996-
numStringParamVars,numStringAliasVars,numJacobianVars,dimODE1stOrder,dimODE2ndOrder) = varInfo;
2001+
numStringParamVars,numStringAliasVars,numJacobianVars,numNonLinearResFunctions,dimODE1stOrder,dimODE2ndOrder) = varInfo;
19972002
SimCode.SIMVARS(stateVars,derivativeVars,algVars,intAlgVars,boolAlgVars,inputVars,outputVars,aliasVars,intAliasVars,boolAliasVars,paramVars,intParamVars,boolParamVars,
19982003
stringAlgVars,stringParamVars,stringAliasVars,extObjVars,jacobianVars,constVars,intConstVars,boolConstVars,stringConstVars) = vars;
19992004

@@ -2007,7 +2012,7 @@ algorithm
20072012

20082013
varInfo = SimCode.VARINFO(numHelpVars,numZeroCrossings,numTimeEvents,numStateVars,numAlgVars,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,numBoolAliasVars,numParams,
20092014
numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,
2010-
numStringParamVars,numStringAliasVars,numJacobianVars,dimODE1stOrder,dimODE2ndOrder);
2015+
numStringParamVars,numStringAliasVars,numJacobianVars,numNonLinearResFunctions,dimODE1stOrder,dimODE2ndOrder);
20112016
vars = SimCode.SIMVARS(stateVars,derivativeVars,algVars,intAlgVars,boolAlgVars,inputVars,outputVars,aliasVars,intAliasVars,boolAliasVars,paramVars,intParamVars,boolParamVars,
20122017
stringAlgVars,stringParamVars,stringAliasVars,extObjVars,jacobianVars,constVars,intConstVars,boolConstVars,stringConstVars);
20132018
then
@@ -2094,6 +2099,37 @@ algorithm
20942099
end match;
20952100
end addTempVars1;
20962101

2102+
protected function addnonLinearCount
2103+
input Integer nonLinearCount;
2104+
input SimCode.ModelInfo modelInfo;
2105+
output SimCode.ModelInfo omodelInfo;
2106+
algorithm
2107+
omodelInfo := match(nonLinearCount,modelInfo)
2108+
local
2109+
Absyn.Path name;
2110+
String directory;
2111+
SimCode.VarInfo varInfo;
2112+
SimCode.SimVars vars;
2113+
list<SimCode.Function> functions;
2114+
list<String> labels;
2115+
Integer numHelpVars,numZeroCrossings,numTimeEvents,numStateVars,numAlgVars,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,numBoolAliasVars,numParams;
2116+
Integer numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars;
2117+
Integer numStringParamVars,numStringAliasVars,numJacobianVars;
2118+
Option<Integer> dimODE1stOrder,dimODE2ndOrder;
2119+
Integer numNonLinearResFunctions;
2120+
case(_,SimCode.MODELINFO(name,directory,varInfo,vars,functions,labels))
2121+
equation
2122+
SimCode.VARINFO(numHelpVars,numZeroCrossings,numTimeEvents,numStateVars,numAlgVars,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,numBoolAliasVars,numParams,
2123+
numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,
2124+
numStringParamVars,numStringAliasVars,numJacobianVars,numNonLinearResFunctions,dimODE1stOrder,dimODE2ndOrder) = varInfo;
2125+
varInfo = SimCode.VARINFO(numHelpVars,numZeroCrossings,numTimeEvents,numStateVars,numAlgVars,numIntAlgVars,numBoolAlgVars,numAlgAliasVars,numIntAliasVars,numBoolAliasVars,numParams,
2126+
numIntParams,numBoolParams,numOutVars,numInVars,numInitialEquations,numInitialAlgorithms,numInitialResiduals,numExternalObjects,numStringAlgVars,
2127+
numStringParamVars,numStringAliasVars,numJacobianVars,nonLinearCount,dimODE1stOrder,dimODE2ndOrder);
2128+
then
2129+
SimCode.MODELINFO(name,directory,varInfo,vars,functions,labels);
2130+
end match;
2131+
end addnonLinearCount;
2132+
20972133
protected function createEquationsForSystems
20982134
input BackendDAE.EqSystems inSysts;
20992135
input BackendDAE.Shared shared;
@@ -2422,6 +2458,45 @@ algorithm
24222458
end matchcontinue;
24232459
end addLinearizationMatrixes;
24242460

2461+
2462+
protected function updateNonLinearSys
2463+
"count and updte all nonlinear system"
2464+
input list<SimCode.SimEqSystem> inEqns;
2465+
input Integer inIndex;
2466+
output list<SimCode.SimEqSystem> outEqns;
2467+
output Integer outIndex;
2468+
algorithm
2469+
(outEqns,outIndex) := matchcontinue(inEqns, inIndex)
2470+
local
2471+
Integer index, indx;
2472+
list<SimCode.SimEqSystem> eqs, rest, res;
2473+
list<DAE.ComponentRef> crefs;
2474+
SimCode.SimEqSystem eq,cont;
2475+
list<SimCode.SimVar> discVars;
2476+
list<SimCode.SimEqSystem> discEqs;
2477+
list<Integer> values;
2478+
list<Integer> value_dims;
2479+
case ({},_)
2480+
then ({},inIndex);
2481+
case(SimCode.SES_NONLINEAR(index, eqs, crefs, _)::rest,_)
2482+
equation
2483+
(res,indx) = updateNonLinearSys(rest,inIndex+1);
2484+
res = listAppend({SimCode.SES_NONLINEAR(index, eqs, crefs, inIndex)},res);
2485+
then (res,indx);
2486+
case(SimCode.SES_MIXED(index, cont, discVars, discEqs, values, value_dims)::rest,_)
2487+
equation
2488+
({cont},indx) = updateNonLinearSys({cont},inIndex);
2489+
(res,indx) = updateNonLinearSys(rest,indx);
2490+
res = listAppend({SimCode.SES_MIXED(index, cont, discVars, discEqs, values, value_dims)},res);
2491+
then (res,indx);
2492+
case(eq::rest,_)
2493+
equation
2494+
(res,indx) = updateNonLinearSys(rest,inIndex);
2495+
res = listAppend({eq},res);
2496+
then (res,indx);
2497+
end matchcontinue;
2498+
end updateNonLinearSys;
2499+
24252500
protected function collectDelayExpressions
24262501
"Put expression into a list if it is a call to delay().
24272502
Useable as a function parameter for Expression.traverseExpression."
@@ -3609,7 +3684,7 @@ algorithm
36093684
//index = System.tmpTick();
36103685
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations({eqn},iuniqueEqIndex,itempvars);
36113686
then
3612-
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, {cr})},uniqueEqIndex+1,tempvars);
3687+
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, {cr},0)},uniqueEqIndex+1,tempvars);
36133688

36143689
// state nonlinear
36153690
case (eqNum, varNum,
@@ -3624,7 +3699,7 @@ algorithm
36243699
//index = System.tmpTick();
36253700
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations({eqn},iuniqueEqIndex,itempvars);
36263701
then
3627-
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, {cr_1})},uniqueEqIndex+1,tempvars);
3702+
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, {cr_1},0)},uniqueEqIndex+1,tempvars);
36283703

36293704
// Algorithm for single variable.
36303705
case (eqNum, varNum, BackendDAE.EQSYSTEM(orderedVars=vars,orderedEqs=eqns),_, helpVarInfo, false, true,_,_)
@@ -4493,7 +4568,7 @@ algorithm
44934568
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations(reqns,uniqueEqIndex,tempvars);
44944569
simequations = listAppend(simequations,resEqs);
44954570
then
4496-
({SimCode.SES_NONLINEAR(uniqueEqIndex, simequations, tcrs)},uniqueEqIndex+1,tempvars);
4571+
({SimCode.SES_NONLINEAR(uniqueEqIndex, simequations, tcrs,0)},uniqueEqIndex+1,tempvars);
44974572
end matchcontinue;
44984573
end createTornSystem;
44994574

@@ -4644,7 +4719,7 @@ algorithm
46444719
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations(reqns,uniqueEqIndex,tempvars);
46454720
simeqnsystem1 = listAppend(simeqnsystem,resEqs);
46464721
then
4647-
(SimCode.SES_NONLINEAR(uniqueEqIndex, simeqnsystem1, tcrs),uniqueEqIndex+1,tempvars);
4722+
(SimCode.SES_NONLINEAR(uniqueEqIndex, simeqnsystem1, tcrs,0),uniqueEqIndex+1,tempvars);
46484723
else
46494724
equation
46504725
Debug.fprint(Flags.FAILTRACE, "-generateTearingSystem failed \n");
@@ -4847,7 +4922,7 @@ algorithm
48474922
crefs = BackendVariable.getAllCrefFromVariables(v);
48484923
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations(eqn_lst,iuniqueEqIndex,itempvars);
48494924
then
4850-
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs)},uniqueEqIndex+1,tempvars);
4925+
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs,0)},uniqueEqIndex+1,tempvars);
48514926

48524927
// No analytic jacobian available. Generate non-linear system.
48534928
case (mixedEvent,skipDiscInAlgorithm,v,kv,eqn,constrs,clsAttrs,NONE(),BackendDAE.JAC_NO_ANALYTIC(),helpVarInfo,_,_,_)
@@ -4857,7 +4932,7 @@ algorithm
48574932
crefs = BackendVariable.getAllCrefFromVariables(v);
48584933
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations(eqn_lst,iuniqueEqIndex,itempvars);
48594934
then
4860-
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs)},uniqueEqIndex+1,tempvars);
4935+
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs,0)},uniqueEqIndex+1,tempvars);
48614936

48624937
// failure
48634938
else
@@ -5400,7 +5475,7 @@ algorithm
54005475
crefs = List.map(inVars,BackendVariable.varCref);
54015476
(resEqs,uniqueEqIndex,tempvars) = createNonlinearResidualEquations({inEquation},iuniqueEqIndex,itempvars);
54025477
then
5403-
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs)},uniqueEqIndex+1,tempvars);
5478+
({SimCode.SES_NONLINEAR(uniqueEqIndex, resEqs, crefs,0)},uniqueEqIndex+1,tempvars);
54045479
// failure
54055480
else
54065481
equation
@@ -6739,7 +6814,7 @@ algorithm
67396814
numInitialResiduals = numInitialEquations+numInitialAlgorithms;
67406815
then
67416816
SimCode.VARINFO(numHelpVars, ng_1, ng_sam_1, nx, ny, ny_int, ny_bool, na, na_int, na_bool, np, np_int, np_bool, numOutVars, numInVars,
6742-
numInitialEquations, numInitialAlgorithms, numInitialResiduals, next, ny_string, np_string, na_string, 0,SOME(dim_1),SOME(dim_2));
6817+
numInitialEquations, numInitialAlgorithms, numInitialResiduals, next, ny_string, np_string, na_string, 0, 0,SOME(dim_1),SOME(dim_2));
67436818
case (_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_)
67446819
equation
67456820
Error.addMessage(Error.INTERNAL_ERROR, {"createVarInfoCPP failed"});
@@ -9724,7 +9799,7 @@ algorithm
97249799
list<SimCode.SimVar> vars;
97259800
list<DAE.Exp> elst,elst1;
97269801
list<tuple<Integer, Integer, SimCode.SimEqSystem>> simJac,simJac1;
9727-
Integer index;
9802+
Integer index, indexNonLinear;
97289803
list<DAE.ComponentRef> crefs;
97299804
SimCode.SimEqSystem cont,cont1,elseWhenEq,elseWhen;
97309805
list<SimCode.SimEqSystem> discEqs,discEqs1;
@@ -9768,11 +9843,11 @@ algorithm
97689843
divtplLst2 = listAppend(divtplLst,divtplLst1);
97699844
then
97709845
(SimCode.SES_LINEAR(index,partOfMixed,vars,elst1,simJac1),divtplLst2);
9771-
case (SimCode.SES_NONLINEAR(index = index,eqs = discEqs, crefs = crefs),inDlowMode)
9846+
case (SimCode.SES_NONLINEAR(index = index,eqs = discEqs, crefs = crefs, indexNonLinear = indexNonLinear),inDlowMode)
97729847
equation
97739848
(discEqs,divtplLst) = listMap1_2(discEqs,addDivExpErrorMsgtoSimEqSystem,inDlowMode);
97749849
then
9775-
(SimCode.SES_NONLINEAR(index,discEqs,crefs),divtplLst);
9850+
(SimCode.SES_NONLINEAR(index,discEqs,crefs,indexNonLinear),divtplLst);
97769851
case (SimCode.SES_MIXED(index,cont,vars,discEqs,values,value_dims),inDlowMode)
97779852
equation
97789853
(cont1,divtplLst) = addDivExpErrorMsgtoSimEqSystem(cont,inDlowMode);
@@ -12517,7 +12592,7 @@ algorithm
1251712592
list<DAE.Statement> stmts;
1251812593
SimCode.SimEqSystem cont;
1251912594
list<SimCode.SimEqSystem> discEqs,eqs;
12520-
Integer index;
12595+
Integer index,indexNonLinear;
1252112596
Boolean partOfMixed;
1252212597
list<SimCode.SimVar> vars,discVars;
1252312598
list<DAE.Exp> beqs;
@@ -12547,10 +12622,10 @@ algorithm
1254712622
equation
1254812623
/* TODO: Me */
1254912624
then (SimCode.SES_LINEAR(index,partOfMixed,vars,beqs,simJac),a);
12550-
case (SimCode.SES_NONLINEAR(index,eqs,crefs),func,a)
12625+
case (SimCode.SES_NONLINEAR(index,eqs,crefs,indexNonLinear),func,a)
1255112626
equation
1255212627
/* TODO: Me */
12553-
then (SimCode.SES_NONLINEAR(index,eqs,crefs),a);
12628+
then (SimCode.SES_NONLINEAR(index,eqs,crefs,indexNonLinear),a);
1255412629
case (SimCode.SES_MIXED(index,cont,discVars,discEqs,values,values_dims),func,a)
1255512630
equation
1255612631
/* TODO: Me */

0 commit comments

Comments
 (0)