Skip to content

Commit

Permalink
- add description-strings for initial residuals for improved dumps
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13600 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Oct 24, 2012
1 parent f8dc980 commit 01bffef
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 34 deletions.
21 changes: 18 additions & 3 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -829,26 +829,41 @@ template functionInitialResidual(list<SimEqSystem> residualEquations)
"Generates function in simulation file."
::=
let &varDecls = buffer "" /*BUFD*/
let resDesc = (residualEquations |> SES_RESIDUAL(__) =>
match exp
case DAE.SCONST(__) then
'"0", '
else
'"<%ExpressionDump.printExpStr(exp)%>", '
;separator="\n")

let body = (residualEquations |> SES_RESIDUAL(__) =>
match exp
case DAE.SCONST(__) then
'initialResiduals[i++] = 0;'
else
let &preExp = buffer "" /*BUFD*/
let expPart = daeExp(exp, contextOther, &preExp /*BUFC*/, &varDecls /*BUFD*/)
'<%preExp%>initialResiduals[i++] = <%expPart%>;
DEBUG_INFO_AL2(LOG_RES_INIT, " residual[%d] : <%ExpressionDump.printExpStr(exp)%> = %f", i, initialResiduals[i-1]);'
<<
<%preExp%>initialResiduals[i++] = <%expPart%>;
DEBUG_INFO_AL3(LOG_RES_INIT, "| [%d]: %s = %g", i, initialResidualDescription[i-1], initialResiduals[i-1]);
>>
;separator="\n")

<<
const char *initialResidualDescription[] =
{
<%resDesc%>
};

int initial_residual(DATA *data, double* initialResiduals)
{
int i = 0;
state mem_state;
<%varDecls%>
mem_state = get_memory_state();
DEBUG_INFO(LOG_RES_INIT, "updating initial_residuals:");
DEBUG_INFO(LOG_RES_INIT, "updating initial residuals:");
<%body%>
restore_memory_state(mem_state);
Expand Down
6 changes: 6 additions & 0 deletions SimulationRuntime/c/openmodelica_func.h
Expand Up @@ -123,6 +123,12 @@ extern int functionODE_inline(DATA *data, double stepsize);
*/
extern int updateBoundStartValues(DATA *data);

/*! \var initialResidualDescription
*
* This variable contains a description string for each initial residual.
*/
extern const char *initialResidualDescription[];

/*! \fn initial_residual
*
* function for calculate residual values for the initial equations and initial algorithms
Expand Down
Expand Up @@ -197,6 +197,47 @@ double leastSquareWithLambda(INIT_DATA *initData, double lambda)
return funcValue;
}

/*! \fn void dumpInitialization(INIT_DATA *initData)
*
* \param [in] [initData]
*
* \author lochel
*/
void dumpInitialization(INIT_DATA *initData)
{
long i;
double fValueScaled = leastSquareWithLambda(initData, 1.0);
double fValue = 0.0;

for(i=0; i<initData->nInitResiduals; ++i)
fValue += initData->initialResiduals[i] * initData->initialResiduals[i];

DEBUG_INFO(LOG_INIT, "initialization status");
if(initData->residualScalingCoefficients)
DEBUG_INFO_AL2(LOG_INIT, "| least square value: %g [scaled: %g]", fValue, fValueScaled);
else
DEBUG_INFO_AL1(LOG_INIT, "| least square value: %g", fValue);

DEBUG_INFO_AL(LOG_INIT, "| unfixed variables");
for(i=0; i<initData->nStates; ++i)
if(initData->nominal)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] %15g = %s [scaling coefficient: %g]", i+1, initData->vars[i], initData->name[i], initData->nominal[i]);
else
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] %15g = %s", i+1, initData->vars[i], initData->name[i]);
for(; i<initData->nVars; ++i)
if(initData->nominal)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] %15g = %s (parameter) [scaling coefficient: %g]", i+1, initData->vars[i], initData->name[i], initData->nominal[i]);
else
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] %15g = %s (parameter)", i+1, initData->vars[i], initData->name[i]);

DEBUG_INFO_AL(LOG_INIT, "| initial residuals");
for(i=0; i<initData->nInitResiduals; ++i)
if(initData->residualScalingCoefficients)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] %15g = %s [scaling coefficient: %g]", i+1, initData->initialResiduals[i], initialResidualDescription[i], initData->residualScalingCoefficients[i]);
else
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] %15g = %s", i+1, initData->initialResiduals[i], initialResidualDescription[i]);
}

/*! \fn static int initialize(DATA *data, int optiMethod)
*
* This is a helper function for initialize.
Expand Down Expand Up @@ -259,27 +300,22 @@ static int initialize2(INIT_DATA *initData, int optiMethod)

funcValue = leastSquareWithLambda(initData, 1.0);

DEBUG_INFO1(LOG_INIT, "ending with funcValue = %g", funcValue);
DEBUG_INFO_AL1(LOG_INIT, "| lambda: %g", lambda);
DEBUG_INFO_AL(LOG_INIT, "| unfixed variables");
for(i=0; i<initData->nVars; i++)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] %s = %g [scaled: %g]", i+1, initData->name[i], initData->vars[i], initData->nominal ? initData->vars[i]/initData->nominal[i] : initData->vars[i]);
DEBUG_INFO_AL(LOG_INIT, "| residuals (> 0.001)");
for(i=0; i<data->modelData.nInitResiduals; i++)
if(fabs(initData->initialResiduals[i]) > 1e-3)
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] %g [scaled: %g]", i+1, initData->initialResiduals[i], initData->residualScalingCoefficients ? initData->initialResiduals[i]/initData->residualScalingCoefficients[i] : initData->initialResiduals[i]);

if(retVal >= 0 && funcValue < bestFuncValue)
{
bestFuncValue = funcValue;
for(i=0; i<initData->nVars; i++)
bestZ[i] = initData->vars[i];
DEBUG_INFO(LOG_INIT, "updating bestZ");
dumpInitialization(initData);
}
else if(retVal >= 0 && funcValue == bestFuncValue)
{
/*WARNING("local minimum");*/
DEBUG_INFO(LOG_INIT, "not updating bestZ");
break;
}
else
DEBUG_INFO(LOG_INIT, "not updating bestZ");
}

setZ(initData, bestZ);
Expand Down Expand Up @@ -417,17 +453,7 @@ static int initialize(DATA *data, int optiMethod)
computeInitialResidualScalingCoefficients(initData);
initialize2(initData, optiMethod);

/* dump interim solution */
DEBUG_INFO(LOG_INIT, "interim initial solution");
DEBUG_INFO_AL(LOG_INIT, "| unfixed variables");
for(i=0; i<initData->nStates; ++i)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] Real %s = %g [scaled: %g]", i+1, initData->name[i], initData->vars[i], initData->vars[i]/initData->nominal[i]);
for(; i<initData->nVars; ++i)
DEBUG_INFO_AL4(LOG_INIT, "| | [%ld] parameter Real %s = %g [scaled: %g]", i+1, initData->name[i], initData->vars[i], initData->vars[i]/initData->nominal[i]);

DEBUG_INFO_AL(LOG_INIT, "| initial residuals");
for(i=0; i<initData->nInitResiduals; ++i)
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] %g [scaling coefficient: %g]", i+1, initData->initialResiduals[i], initData->residualScalingCoefficients[i]);
dumpInitialization(initData);

for(i=0; i<initData->nVars; ++i)
initData->start[i] = initData->vars[i];
Expand Down Expand Up @@ -458,16 +484,7 @@ static int initialize(DATA *data, int optiMethod)
initialize2(initData, optiMethod);

/* dump final solution */
DEBUG_INFO(LOG_INIT, "final initial solution");
DEBUG_INFO_AL(LOG_INIT, "| unfixed variables");
for(i=0; i<initData->nStates; ++i)
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] Real %s = %g", i+1, initData->name[i], initData->vars[i]);
for(; i<initData->nVars; ++i)
DEBUG_INFO_AL3(LOG_INIT, "| | [%ld] parameter Real %s = %g", i+1, initData->name[i], initData->vars[i]);

DEBUG_INFO_AL(LOG_INIT, "| initial residuals");
for(i=0; i<initData->nInitResiduals; ++i)
DEBUG_INFO_AL2(LOG_INIT, "| | [%ld] %g", i+1, initData->initialResiduals[i]);
dumpInitialization(initData);

funcValue = leastSquareWithLambda(initData, 1.0);
}
Expand Down
Expand Up @@ -44,6 +44,7 @@ extern "C"
{
#endif

extern void dumpInitialization(INIT_DATA *initData);
extern int reportResidualValue(INIT_DATA *initData);
extern double leastSquareWithLambda(INIT_DATA *initData, double lambda);
extern int initialization(DATA *data, const char* pInitMethod, const char* pOptiMethod, const char* pInitFile, double initTime);
Expand Down

0 comments on commit 01bffef

Please sign in to comment.