Skip to content

Commit

Permalink
- fix collectInitialVars
Browse files Browse the repository at this point in the history
- edit compiler-warnings using +d=pedantic


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13884 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Nov 13, 2012
1 parent a4f5f0f commit a802fd2
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 45 deletions.
100 changes: 69 additions & 31 deletions Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -9237,6 +9237,7 @@ algorithm
BackendDAE.Equation eqn;
DAE.Exp e, crExp, startExp;
DAE.Type tp;
String crStr;

case (BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=orderedEqs), _, _) equation
nVars = arrayLength(inMT);
Expand All @@ -9256,15 +9257,34 @@ algorithm
true = Flags.isSet(Flags.PEDANTIC);

var = BackendVariable.getVarAt(vars, inI);
BackendDump.dumpBackendDAEVarList({var}, "Error: following variable does not appear in the initialization problem: ");
cr = BackendVariable.varCref(var);
crStr = ComponentReference.crefStr(cr);

system = analyzeInitialSystem1(inSystem, inMT, inI+1);
true = intEq(0, System.strncmp(crStr, DAE.preNamePrefix, stringLength(DAE.preNamePrefix)));

Error.addCompilerWarning("Following pre-variable does not appear in any of the equations of the initialization system. It will be removed: " +& crStr);

(vars, var) = BackendVariable.removeVar(inI, vars);
system = BackendDAE.EQSYSTEM(vars, orderedEqs, NONE(), NONE(), BackendDAE.NO_MATCHING());
system = analyzeInitialSystem1(system, inMT, inI+1);
then system;

case (BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=orderedEqs), _, _) equation
true = Flags.isSet(Flags.PEDANTIC);

var = BackendVariable.getVarAt(vars, inI);
cr = BackendVariable.varCref(var);
crStr = ComponentReference.crefStr(cr);

false = intEq(0, System.strncmp(crStr, DAE.preNamePrefix, stringLength(DAE.preNamePrefix)));

Error.addCompilerWarning("Following variable does not appear in any of the equations of the initialization system: " +& crStr);
then fail();

case (BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=orderedEqs), _, _) equation
false = Flags.isSet(Flags.PEDANTIC);
(vars, var) = BackendVariable.removeVar(inI, vars);

(vars, var) = BackendVariable.removeVar(inI, vars);
system = BackendDAE.EQSYSTEM(vars, orderedEqs, NONE(), NONE(), BackendDAE.NO_MATCHING());
system = analyzeInitialSystem1(system, inMT, inI+1);
then system;
Expand Down Expand Up @@ -9306,7 +9326,7 @@ algorithm
// collect vars for initial system
vars = emptyVars();
fixvars = emptyVars();
((vars, fixvars, _)) = BackendVariable.traverseBackendDAEVars(knvars, collectInitialVars, (vars, fixvars, true));
((vars, fixvars)) = BackendVariable.traverseBackendDAEVars(knvars, collectInitialVars, (vars, fixvars));

// collect eqns for initial system
((eqns, reeqns)) = BackendEquation.traverseBackendDAEEqns(inieqns, collectInitialEqns, (listEquation({}), listEquation({})));
Expand Down Expand Up @@ -9367,7 +9387,7 @@ algorithm
case(_, _, _) equation
true = intGt(nEqns, nVars);
Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "overconstrained initial system\n");
Debug.fcall(Flags.PEDANTIC, print, "Warning: overconstrained initial system\n");
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, "over-determined initial system\n");
then fail();

// equal
Expand All @@ -9389,8 +9409,9 @@ algorithm
// underconstrained system
case(_, _, _) equation
true = intLt(nEqns, nVars);

Debug.fcall(Flags.DUMP_INITIAL_SYSTEM, print, "underconstrained initial system\n");
Debug.fcall(Flags.PEDANTIC, print, "Warning: underconstrained initial system\n");
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, "under-determined initial system");
//BackendDump.dump(inDAE);
then fail();
end matchcontinue;
Expand All @@ -9408,7 +9429,7 @@ algorithm
BackendDAE.EquationArray eqns, ieqns, reqns;
case (BackendDAE.EQSYSTEM(orderedVars=vars, orderedEqs=eqns), (ivars, fixvars, ieqns, reqns)) equation
// collect vars for initial system
((ivars, fixvars, _)) = BackendVariable.traverseBackendDAEVars(vars, collectInitialVars, (ivars, fixvars, false));
((ivars, fixvars)) = BackendVariable.traverseBackendDAEVars(vars, collectInitialVars, (ivars, fixvars));

// collect eqns for initial system
((ieqns, reqns)) = BackendEquation.traverseBackendDAEEqns(eqns, collectInitialEqns, (ieqns, reqns));
Expand All @@ -9418,69 +9439,86 @@ end collectInitialVarsEqnsSystem;

protected function collectInitialVars "protected function collectInitialVars
This function collects all the vars for the initial system."
input tuple<BackendDAE.Var, tuple<BackendDAE.Variables, BackendDAE.Variables, Boolean>> inTpl;
output tuple<BackendDAE.Var, tuple<BackendDAE.Variables, BackendDAE.Variables, Boolean>> outTpl;
input tuple<BackendDAE.Var, tuple<BackendDAE.Variables, BackendDAE.Variables>> inTpl;
output tuple<BackendDAE.Var, tuple<BackendDAE.Variables, BackendDAE.Variables>> outTpl;
algorithm
outTpl := match(inTpl)
local
BackendDAE.Var var, preVar;
BackendDAE.Var var, preVar, derVar;
BackendDAE.Variables vars, fixvars;
DAE.ComponentRef dummyder, cr, preCR;
DAE.ComponentRef cr, preCR, derCR;
Boolean isFixed;
DAE.Type ty;
DAE.InstDims arryDim;
Option<DAE.Exp> startValue;
Boolean defaultFixed;

// state
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), varType=ty, arryDim=arryDim), (vars, fixvars, defaultFixed))) equation
isFixed = (BackendVariable.varFixed(var) or defaultFixed);

var = BackendVariable.setVarFixed(var, isFixed);
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), bindExp=NONE(), varType=ty, arryDim=arryDim), (vars, fixvars))) equation
isFixed = BackendVariable.varFixed(var);
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());

dummyder = ComponentReference.crefPrefixDer(cr); // cr => $DER.cr
vars = BackendVariable.addVar(BackendDAE.VAR(dummyder, BackendDAE.VARIABLE(), DAE.BIDIR(), DAE.NON_PARALLEL(), ty, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR()), vars);
derCR = ComponentReference.crefPrefixDer(cr); // cr => $DER.cr
derVar = BackendDAE.VAR(derCR, BackendDAE.VARIABLE(), DAE.BIDIR(), DAE.NON_PARALLEL(), ty, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());

vars = BackendVariable.addVar(derVar, vars);
vars = Debug.bcallret2(not isFixed, BackendVariable.addVar, var, vars, vars);
fixvars = Debug.bcallret2(isFixed, BackendVariable.addVar, var, fixvars, fixvars);
then ((var, (vars, fixvars, defaultFixed)));
then ((var, (vars, fixvars)));

// state with binding
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.STATE(), bindExp=NONE(), varType=ty, arryDim=arryDim), (vars, fixvars))) equation
derCR = ComponentReference.crefPrefixDer(cr); // cr => $DER.cr
derVar = BackendDAE.VAR(derCR, BackendDAE.VARIABLE(), DAE.BIDIR(), DAE.NON_PARALLEL(), ty, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
vars = BackendVariable.addVar(derVar, vars);
then ((var, (vars, fixvars)));

// discrete
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), varType=ty, arryDim=arryDim), (vars, fixvars, defaultFixed))) equation
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), bindExp=NONE(), varType=ty, arryDim=arryDim), (vars, fixvars))) equation
isFixed = BackendVariable.varFixed(var);
startValue = BackendVariable.varStartValueOption(var);

var = BackendVariable.setVarFixed(var, defaultFixed);
var = BackendVariable.setVarFixed(var, false);

preCR = ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preVar = BackendDAE.VAR(preCR, BackendDAE.DISCRETE(), DAE.BIDIR(), DAE.NON_PARALLEL(), ty, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
preVar = BackendVariable.setVarFixed(preVar, isFixed);
preVar = BackendVariable.setVarStartValueOption(preVar, startValue);

vars = Debug.bcallret2(not defaultFixed, BackendVariable.addVar, var, vars, vars);
fixvars = Debug.bcallret2(defaultFixed, BackendVariable.addVar, var, fixvars, fixvars);
vars = BackendVariable.addVar(var, vars);
vars = Debug.bcallret2(not isFixed, BackendVariable.addVar, preVar, vars, vars);
fixvars = Debug.bcallret2(isFixed, BackendVariable.addVar, preVar, fixvars, fixvars);
then ((var, (vars, fixvars, defaultFixed)));
then ((var, (vars, fixvars)));

// discrete with binding
case((var as BackendDAE.VAR(varName=cr, varKind=BackendDAE.DISCRETE(), bindExp=SOME(_), varType=ty, arryDim=arryDim), (vars, fixvars))) equation
isFixed = BackendVariable.varFixed(var);
startValue = BackendVariable.varStartValueOption(var);

preCR = ComponentReference.crefPrefixPre(cr); // cr => $PRE.cr
preVar = BackendDAE.VAR(preCR, BackendDAE.DISCRETE(), DAE.BIDIR(), DAE.NON_PARALLEL(), ty, NONE(), NONE(), arryDim, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
preVar = BackendVariable.setVarFixed(preVar, isFixed);
preVar = BackendVariable.setVarStartValueOption(preVar, startValue);

vars = Debug.bcallret2(not isFixed, BackendVariable.addVar, preVar, vars, vars);
fixvars = Debug.bcallret2(isFixed, BackendVariable.addVar, preVar, fixvars, fixvars);
then ((var, (vars, fixvars)));

// parameter
case((var as BackendDAE.VAR(varKind=BackendDAE.PARAM()), (vars, fixvars, defaultFixed))) equation
case((var as BackendDAE.VAR(varKind=BackendDAE.PARAM(), bindExp=NONE()), (vars, fixvars))) equation
isFixed = BackendVariable.varFixed(var);
var = BackendVariable.setVarKind(var, BackendDAE.VARIABLE());

vars = Debug.bcallret2(not isFixed, BackendVariable.addVar, var, vars, vars);
fixvars = Debug.bcallret2(isFixed, BackendVariable.addVar, var, fixvars, fixvars);
then ((var, (vars, fixvars, defaultFixed)));
then ((var, (vars, fixvars)));

case((var as BackendDAE.VAR(bindExp=NONE()), (vars, fixvars, defaultFixed))) equation
isFixed = (BackendVariable.varFixed(var) or defaultFixed);
var = BackendVariable.setVarFixed(var, isFixed);
case((var as BackendDAE.VAR(bindExp=NONE()), (vars, fixvars))) equation
isFixed = BackendVariable.varFixed(var);

vars = Debug.bcallret2(not isFixed, BackendVariable.addVar, var, vars, vars);
fixvars = Debug.bcallret2(isFixed, BackendVariable.addVar, var, fixvars, fixvars);
then ((var, (vars, fixvars, defaultFixed)));
then ((var, (vars, fixvars)));

else
then inTpl;
end match;
Expand Down
3 changes: 1 addition & 2 deletions Compiler/BackEnd/SimCodeUtil.mo
Expand Up @@ -6472,8 +6472,7 @@ algorithm
case (_, _, _, _) equation
(initialEqs_lst, numberOfInitialEquations, numberOfInitialAlgorithms) = BackendDAEOptimize.collectInitialEquations(inDAE);
(residual_equations, uniqueEqIndex, tempvars) = createNonlinearResidualEquations(initialEqs_lst, iuniqueEqIndex, itempvars);
Debug.fcall(Flags.PEDANTIC, print, "Warning: No system for the symbolic initialization was generated. A method using numerical algorithms will be used instead.\n");
//Error.addCompilerWarning("No system for the symbolic initialization was generated. A method using numerical algorithms will be used instead.");
Debug.fcall(Flags.PEDANTIC, Error.addCompilerWarning, "No system for the symbolic initialization was generated. A method using numerical algorithms will be used instead.\n");
then (residual_equations, {}, numberOfInitialEquations, numberOfInitialAlgorithms, uniqueEqIndex, tempvars, false);

else equation
Expand Down
Expand Up @@ -258,18 +258,17 @@ void dumpInitialization(INIT_DATA *initData)
void dumpInitialSolution(DATA *simData)
{
long i, j;

INFO(LOG_INIT, "initial solution");
INDENT(LOG_INIT);


/* i: all states; j: all unfixed vars */
INFO(LOG_SOTI, "unfixed states");
INDENT(LOG_SOTI);
for(i=0, j=0; i<simData->modelData.nStates; ++i)
{
if(simData->modelData.realVarsData[i].attribute.fixed == 0)
{
if(simData->modelData.realVarsData[i].attribute.useNominal)
{
INFO5(LOG_INIT, "[%ld] Real %s(start=%g, nominal=%g) = %g",
INFO5(LOG_SOTI, "[%ld] Real %s(start=%g, nominal=%g) = %g",
j+1,
simData->modelData.realVarsData[i].info.name,
simData->modelData.realVarsData[i].attribute.start,
Expand All @@ -278,7 +277,7 @@ void dumpInitialSolution(DATA *simData)
}
else
{
INFO4(LOG_INIT, "[%ld] Real %s(start=%g) = %g",
INFO4(LOG_SOTI, "[%ld] Real %s(start=%g) = %g",
j+1,
simData->modelData.realVarsData[i].info.name,
simData->modelData.realVarsData[i].attribute.start,
Expand All @@ -287,15 +286,18 @@ void dumpInitialSolution(DATA *simData)
j++;
}
}
RELEASE(LOG_SOTI);

/* i: all parameters; j: all unfixed vars */
INFO(LOG_SOTI, "unfixed parameters");
INDENT(LOG_SOTI);
for(i=0; i<simData->modelData.nParametersReal; ++i)
{
if(simData->modelData.realParameterData[i].attribute.fixed == 0)
{
if(simData->modelData.realVarsData[i].attribute.useNominal)
{
INFO5(LOG_INIT, "[%ld] parameter Real %s(start=%g, nominal=%g) = %g",
INFO5(LOG_SOTI, "[%ld] parameter Real %s(start=%g, nominal=%g) = %g",
j+1,
simData->modelData.realParameterData[i].info.name,
simData->modelData.realParameterData[i].attribute.start,
Expand All @@ -304,7 +306,7 @@ void dumpInitialSolution(DATA *simData)
}
else
{
INFO4(LOG_INIT, "[%ld] parameter Real %s(start=%g) = %g",
INFO4(LOG_SOTI, "[%ld] parameter Real %s(start=%g) = %g",
j+1,
simData->modelData.realParameterData[i].info.name,
simData->modelData.realParameterData[i].attribute.start,
Expand All @@ -313,7 +315,7 @@ void dumpInitialSolution(DATA *simData)
j++;
}
}
RELEASE(LOG_INIT);
RELEASE(LOG_SOTI);
}

/*! \fn static int initialize2(INIT_DATA *initData, int optiMethod, int useScaling)
Expand Down Expand Up @@ -1009,10 +1011,14 @@ int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod,

data->simulationInfo.initial = 0;

INFO(LOG_INIT, "### FINAL INITIALIZATION RESULTS ###");
INDENT(LOG_INIT);
/* dump LOG_SOTI if LOG_INIT is enabled */
if(useStream[LOG_INIT])
useStream[LOG_SOTI] = 1;

INFO(LOG_SOTI, "### SOLUTION OF THE INITIALIZATION ###");
INDENT(LOG_SOTI);
dumpInitialSolution(data);
RELEASE(LOG_INIT);
RELEASE(LOG_SOTI);
INFO(LOG_INIT, "### END INITIALIZATION ###");
return retVal;
}
2 changes: 2 additions & 0 deletions SimulationRuntime/c/util/omc_error.c
Expand Up @@ -45,6 +45,7 @@ const char *LOG_STREAM_NAME[LOG_MAX] = {
"LOG_SIMULATION",
"LOG_STATS",
"LOG_INIT",
"LOG_SOTI", /* LOG_INIT_SOLUTION */
"LOG_RES_INIT",
"LOG_SOLVER",
"LOG_JAC",
Expand All @@ -64,6 +65,7 @@ const char *LOG_STREAM_DESC[LOG_MAX] = {
"simulation",
"stats",
"init",
"init solution",
"res_init",
"solver",
"jac",
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/omc_error.h
Expand Up @@ -74,6 +74,7 @@ enum LOG_STREAM
LOG_SIMULATION,
LOG_STATS,
LOG_INIT,
LOG_SOTI, /* LOG_INIT_SOLUTION */
LOG_RES_INIT,
LOG_SOLVER,
LOG_JAC,
Expand Down

0 comments on commit a802fd2

Please sign in to comment.