Skip to content

Commit

Permalink
fix nominal values for daeMode
Browse files Browse the repository at this point in the history
  • Loading branch information
Willi Braun committed Jun 4, 2016
1 parent d08a251 commit 2dbc14b
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 10 deletions.
18 changes: 18 additions & 0 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -3852,7 +3852,24 @@ template algebraicDAEVar(list<SimVar> algVars, String modelNamePrefix)
'algebraic[<%i%>] = <%cref(name)%>;'
end match)
;separator="\n")
let nominalVars = (algVars |> var hasindex i fromindex 0 =>
(match var
case SIMVAR(__) then
'algebraicNominal[<%i%>] = <%crefAttributes(name)%>.nominal;
infoStreamPrint(LOG_SOLVER, 0, "%s -> %g", <%crefVarInfo(name)%>.name, algebraicNominal[<%i%>]);'
end match)
;separator="\n")
<<
/* algebraic nominal values */
int <%symbolName(modelNamePrefix,"getAlgebraicDAEVarNominals")%>(DATA *data, threadData_t *threadData, double* algebraicNominal)
{
TRACE_PUSH
<%nominalVars%>
TRACE_POP
return 0;
}
/* forward algebraic variables */
int <%symbolName(modelNamePrefix,"setAlgebraicDAEVars")%>(DATA *data, threadData_t *threadData, double* algebraic)
{
Expand Down Expand Up @@ -3901,6 +3918,7 @@ template initializeDAEmodeData(Integer nResVars, Integer nAlgVars, list<tuple<In
daeModeData->evaluateDAEResiduals = <%symbolName(modelNamePrefix,"evaluateDAEResiduals")%>;
daeModeData->setAlgebraicDAEVars = <%symbolName(modelNamePrefix,"setAlgebraicDAEVars")%>;
daeModeData->getAlgebraicDAEVars = <%symbolName(modelNamePrefix,"getAlgebraicDAEVars")%>;
daeModeData->getAlgebraicDAEVarNominals = <%symbolName(modelNamePrefix,"getAlgebraicDAEVarNominals")%>;
/* intialize sparse pattern */
daeModeData->sparsePattern = (SPARSE_PATTERN*) malloc(sizeof(SPARSE_PATTERN));
Expand Down
18 changes: 8 additions & 10 deletions SimulationRuntime/c/simulation/solver/ida_solver.c
Expand Up @@ -210,17 +210,15 @@ ida_solver_initial(DATA* data, threadData_t *threadData, SOLVER_INFO* solverInfo
/* set nominal values of the states for absolute tolerances */
infoStreamPrint(LOG_SOLVER, 1, "The relative tolerance is %g. Following absolute tolerances are used for the states: ", data->simulationInfo->tolerance);

for(i=0; i<idaData->N; ++i)
for(i=0; i < data->modelData->nStates; ++i)
{
if (i < data->modelData->nStates)
{
tmp[i] = data->simulationInfo->tolerance * fmax(fabs(data->modelData->realVarsData[i].attribute.nominal), 1e-32);
}
else
{
tmp[i] = data->simulationInfo->tolerance;
}
infoStreamPrint(LOG_SOLVER, 0, "%ld. %s -> %g", i+1, data->modelData->realVarsData[i].info.name, tmp[i]);
tmp[i] = data->simulationInfo->tolerance * fmax(fabs(data->modelData->realVarsData[i].attribute.nominal), 1e-32);
infoStreamPrint(LOG_SOLVER, 0, "%ld. %s -> %g", i+1, data->modelData->realVarsData[i].info.name, tmp[i]);
}
/* daeMode: set nominal values for algebraic variables */
if (idaData->daeMode)
{
data->simulationInfo->daeModeData->getAlgebraicDAEVarNominals(data, threadData, tmp + data->modelData->nStates);
}
messageClose(LOG_SOLVER);
flag = IDASVtolerances(idaData->ida_mem,
Expand Down
4 changes: 4 additions & 0 deletions SimulationRuntime/c/simulation_data.h
Expand Up @@ -406,6 +406,10 @@ typedef struct DAEMODE_DATA

/* function to get algebraic DAE Variable form solver*/
int (*getAlgebraicDAEVars)(struct DATA*, threadData_t*, double*);

/* function to get algebraic DAE nominal values*/
int (*getAlgebraicDAEVarNominals)(struct DATA*, threadData_t*, double*);

} DAEMODE_DATA;


Expand Down

0 comments on commit 2dbc14b

Please sign in to comment.