Skip to content

Commit 0346723

Browse files
author
Jens Frenkel
committed
- bugfix nonlinear system
- expected results - move pivoting before initialization, check after initilization if pivoting change and report error message git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14741 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 34eb99c commit 0346723

File tree

7 files changed

+79
-23
lines changed

7 files changed

+79
-23
lines changed

Compiler/BackEnd/IndexReduction.mo

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,8 +2190,8 @@ algorithm
21902190
Integer rang,nStates,nStateCandidates,nUnassignedEquations,setIndex;
21912191
BackendDAE.Variables vars;
21922192

2193-
DAE.Exp expcrA,mulAstates,mulAdstates,expset,expderset;
2194-
list<DAE.Exp> expcrstates,expcrdstates,expcrset,expcrdset;
2193+
DAE.Exp expcrA,mulAstates,mulAdstates,expset,expderset,expsetstart;
2194+
list<DAE.Exp> expcrstates,expcrdstates,expcrset,expcrdset,expcrstatesstart;
21952195
DAE.Operator op;
21962196
BackendDAE.Equation eqn,deqn;
21972197
BackendDAE.EquationArray eqns;
@@ -2204,13 +2204,12 @@ algorithm
22042204
rang = nStateCandidates - nUnassignedEquations;
22052205
// generate Set Vars
22062206
(set,crset,setVars,crA,aVars,tp,crJ,varJ) = getSetVars(iSetIndex,rang,nStateCandidates,nUnassignedEquations);
2207-
// add set states
2208-
vars = BackendVariable.addVars(setVars,iVars);
22092207
// add Equations
22102208
// set.x = set.A*set.statecandidates
22112209
// der(set.x) = set.A*der(set.candidates)
22122210
crstates = List.map(stateCandidates,BackendVariable.varCref);
22132211
expcrstates = List.map(crstates,Expression.crefExp);
2212+
expcrstatesstart = List.map(expcrstates,makeStartExp);
22142213
expcrdstates = List.map(expcrstates,makeder);
22152214
expcrset = List.map(crset,Expression.crefExp);
22162215
expcrdset = List.map(expcrset,makeder);
@@ -2230,6 +2229,12 @@ algorithm
22302229
// der(set.x) = set.A*der(set.candidates)
22312230
deqn = Util.if_(intGt(rang,1),BackendDAE.ARRAY_EQUATION({rang},expderset,mulAdstates,DAE.emptyElementSource,false),
22322231
BackendDAE.EQUATION(expderset,mulAdstates,DAE.emptyElementSource,false));
2232+
// start values for the set
2233+
expsetstart = DAE.BINARY(expcrA,op,DAE.ARRAY(DAE.T_ARRAY(DAE.T_REAL_DEFAULT,{DAE.DIM_INTEGER(nStateCandidates)},DAE.emptyTypeSource),true,expcrstatesstart));
2234+
((expsetstart,(_,_))) = BackendDAEUtil.extendArrExp((expsetstart,(NONE(),false)));
2235+
(setVars,_) = List.map2Fold(setVars,setStartExp,expsetstart,rang,1);
2236+
// add set states
2237+
vars = BackendVariable.addVars(setVars,iVars);
22332238
// add equations
22342239
eqns = BackendEquation.equationAdd(eqn, iEqns);
22352240
eqns = BackendEquation.equationAdd(deqn, eqns);
@@ -2243,6 +2248,33 @@ algorithm
22432248
end match;
22442249
end generateStateSets;
22452250

2251+
protected function makeStartExp
2252+
"function makeStartExp
2253+
generate the expression: $_start(inExp)"
2254+
input DAE.Exp inExp;
2255+
output DAE.Exp outExp;
2256+
algorithm
2257+
outExp := Expression.makeBuiltinCall("$_start", {inExp}, Expression.typeof(inExp));
2258+
end makeStartExp;
2259+
2260+
protected function setStartExp
2261+
"function makeStartExp
2262+
generate the expression: $_start(inExp)"
2263+
input BackendDAE.Var inVar;
2264+
input DAE.Exp startExp;
2265+
input Integer size;
2266+
input Integer iIndex;
2267+
output BackendDAE.Var outVar;
2268+
output Integer oIndex;
2269+
protected
2270+
DAE.Exp e;
2271+
algorithm
2272+
e := Debug.bcallret2(intGt(size,1),Expression.makeASUB,startExp, {DAE.ICONST(iIndex)}, startExp);
2273+
(e,_) := ExpressionSimplify.simplify(e);
2274+
outVar := BackendVariable.setVarStartValue(inVar,e);
2275+
oIndex := iIndex + 1;
2276+
end setStartExp;
2277+
22462278
protected function selectStates
22472279
"function: selectStates
22482280
author: Frenkel TUD 2013-01

Compiler/BackEnd/Initialization.mo

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ algorithm
607607
BackendDAE.EQSYSTEM(orderedVars=vars, stateSets=stateSets) := inEqSystem;
608608
outVars := BackendVariable.traverseBackendDAEVars(vars, selectInitializationVariables2, inVars);
609609
// ignore not the states of the statesets
610-
outVars := List.fold(stateSets, selectInitialStateSetVars, outVars);
610+
//outVars := List.fold(stateSets, selectInitialStateSetVars, outVars);
611611
end selectInitializationVariables1;
612612

613613
protected function selectInitialStateSetVars
@@ -649,7 +649,7 @@ algorithm
649649
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(_)), vars)) equation
650650
false = BackendVariable.varFixed(var);
651651
// ignore stateset variables
652-
false = isStateSetVar(cr);
652+
// false = isStateSetVar(cr);
653653
vars = BackendVariable.addVar(var, vars);
654654
then ((var, vars));
655655

@@ -1600,7 +1600,7 @@ algorithm
16001600

16011601
((vars, fixvars, hs)) := BackendVariable.traverseBackendDAEVars(orderedVars, collectInitialVars, (vars, fixvars, hs));
16021602
((eqns, reqns)) := BackendEquation.traverseBackendDAEEqns(orderedEqs, collectInitialEqns, (eqns, reqns));
1603-
((fixvars, eqns)) := List.fold(stateSets, collectInitialStateSetVars, (fixvars, eqns));
1603+
//((fixvars, eqns)) := List.fold(stateSets, collectInitialStateSetVars, (fixvars, eqns));
16041604

16051605
oTpl := (vars, fixvars, eqns, reqns, hs);
16061606
end collectInitialVarsEqnsSystem;

Compiler/Template/CodegenC.tpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2434,14 +2434,14 @@ case SES_NONLINEAR(__) then
24342434
<%crefs |> name hasindex i0 =>
24352435
let namestr = cref(name)
24362436
<<
2437-
data->simulationInfo.nonlinearSystemData[<%nonlinindx%>].nlsx[<%i0%>] = <%namestr%>;
2438-
data->simulationInfo.nonlinearSystemData[<%nonlinindx%>].nlsxOld[<%i0%>] = _<%namestr%>(1) /*old*/;
2439-
data->simulationInfo.nonlinearSystemData[<%nonlinindx%>].nlsxExtrapolation[<%i0%>] = extraPolate(<%namestr%>, _<%namestr%>(1) /*old*/, _<%namestr%>(2) /*old2*/);
2437+
data->simulationInfo.nonlinearSystemData[SIM_PROF_EQ_<%index%>].nlsx[<%i0%>] = <%namestr%>;
2438+
data->simulationInfo.nonlinearSystemData[SIM_PROF_EQ_<%index%>].nlsxOld[<%i0%>] = _<%namestr%>(1) /*old*/;
2439+
data->simulationInfo.nonlinearSystemData[SIM_PROF_EQ_<%index%>].nlsxExtrapolation[<%i0%>] = extraPolate(<%namestr%>, _<%namestr%>(1) /*old*/, _<%namestr%>(2) /*old2*/);
24402440
>>
24412441
;separator="\n"%>
2442-
solve_nonlinear_system(data, <%indexNonLinear%>);
2442+
solve_nonlinear_system(data, SIM_PROF_EQ_<%index%>);
24432443
/* write solution */
2444-
<%crefs |> name hasindex i0 => '<%cref(name)%> = data->simulationInfo.nonlinearSystemData[<%nonlinindx%>].nlsx[<%i0%>];' ;separator="\n"%>
2444+
<%crefs |> name hasindex i0 => '<%cref(name)%> = data->simulationInfo.nonlinearSystemData[SIM_PROF_EQ_<%index%>].nlsx[<%i0%>];' ;separator="\n"%>
24452445
<%inlineCrefs(context,crefs)%>
24462446
<%eqncalls%>
24472447
#ifdef _OMC_MEASURE_TIME

SimulationRuntime/c/simulation/solver/initialization/initialization.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,12 +914,15 @@ int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod,
914914

915915

916916
if(initMethod == IIM_SYMBOLIC) {
917+
/* do pivoting for dynamic state selection */
918+
stateSelection(data);
917919
retVal = symbolic_initialization(data);
918920
}
919921
updateDiscreteSystem(data);
920922

921923
/* and restore start values and helpvars */
922924
restoreExtrapolationDataOld(data);
925+
initializeStateSetPivoting(data); /* reset state selection */
923926
syncPreForHelpVars(data); /* resetAllHelpVars(data); */
924927
storeRelations(data);
925928
storePreValues(data);
@@ -930,9 +933,17 @@ int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod,
930933
else if(initMethod == IIM_NUMERIC)
931934
retVal = numeric_initialization(data, optiMethod);
932935
else if(initMethod == IIM_SYMBOLIC) {
933-
retVal = symbolic_initialization(data);
934936
/* do pivoting for dynamic state selection */
935937
stateSelection(data);
938+
retVal = symbolic_initialization(data);
939+
/* do pivoting for dynamic state selection if selection changed try again an */
940+
if (stateSelection(data) == 1) {
941+
retVal = symbolic_initialization(data);
942+
if (stateSelection(data) == 1) {
943+
/* report a warning about strange start values */
944+
THROW("Error, cannot initialize unique the dynamic state selection. Use -lv LOG_DSS to see the switching state set.");
945+
}
946+
}
936947
}
937948
else
938949
THROW("unsupported option -iim");

SimulationRuntime/c/simulation/solver/solver_main.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,6 @@ int solver_main(DATA* data, const char* init_initMethod,
201201
saveZeroCrossings(data);
202202
storePreValues(data);
203203

204-
/* do pivoting for dynamic state selection */
205-
stateSelection(data);
206-
207204
/* Activate sample and evaluate again */
208205
if(data->simulationInfo.curSampleTimeIx < data->simulationInfo.nSampleTimes)
209206
{

SimulationRuntime/c/simulation/solver/stateset.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,26 @@ void initializeStateSetJacobians(DATA *data)
4545
for (i=0;i<data->modelData.nStateSets;i++)
4646
{
4747
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
48-
unsigned int aid = set->A->id - data->modelData.integerVarsData[0].info.id;
49-
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
50-
memset(A,0,set->nCandidates*set->nStates*sizeof(modelica_integer));
5148
if(set->initialAnalyticalJacobian(data))
5249
{
5350
THROW("Error, can not initialze Jacobians for dynamic state selection");
5451
}
52+
initializeStateSetPivoting(data);
53+
}
54+
}
55+
56+
/* initialize pivoting data for state selection */
57+
void initializeStateSetPivoting(DATA *data)
58+
{
59+
long i=0;
60+
modelica_integer n=0;
61+
/* go troug all state sets*/
62+
for (i=0;i<data->modelData.nStateSets;i++)
63+
{
64+
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
65+
unsigned int aid = set->A->id - data->modelData.integerVarsData[0].info.id;
66+
modelica_integer *A = &(data->localData[0]->integerVars[aid]);
67+
memset(A,0,set->nCandidates*set->nStates*sizeof(modelica_integer));
5568
/* initialize row and col indizes */
5669
for (n=0;n<set->nDummyStates;n++)
5770
{
@@ -69,7 +82,6 @@ void initializeStateSetJacobians(DATA *data)
6982
}
7083
}
7184

72-
7385
/*! \fn getAnalyticalJacobian
7486
*
7587
* function calculates analytical jacobian
@@ -214,10 +226,11 @@ int stateSelection(DATA *data)
214226
{
215227
long i=0;
216228
long j=0;
217-
int res=0;
229+
int globalres=0;
218230
/* go troug all state sets*/
219231
for (i=0;i<data->modelData.nStateSets;i++)
220232
{
233+
int res=0;
221234
STATE_SET_DATA *set = &(data->simulationInfo.stateSetData[i]);
222235
modelica_integer* oldColPivot = (modelica_integer*) calloc(set->nCandidates,sizeof(modelica_integer));
223236
/* generate jacobian, stored in set->J */
@@ -245,9 +258,9 @@ int stateSelection(DATA *data)
245258
if (res)
246259
{
247260
INFO(LOG_DSS,"Select new States:");
248-
res = 1;
261+
globalres = 1;
249262
}
250263
free(oldColPivot);
251264
}
252-
return res;
265+
return globalres;
253266
}

SimulationRuntime/c/simulation/solver/stateset.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
/* initialize jacobians for state selection */
3838
void initializeStateSetJacobians(DATA *data);
3939

40+
/* initialize pivoting data for state selection */
41+
void initializeStateSetPivoting(DATA *data);
42+
4043
/* update the state selection */
4144
int stateSelection(DATA *data);
4245

0 commit comments

Comments
 (0)