Skip to content

Commit

Permalink
- Switch to new SimulationRuntime as default SimulationRuntime.
Browse files Browse the repository at this point in the history
   - all simulation tests work as before.
 - This will break interactive and qss stuff.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10888 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Jan 12, 2012
1 parent dd05372 commit 1e6d786
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 94 deletions.
4 changes: 2 additions & 2 deletions Compiler/BackEnd/SimCode.mo
Expand Up @@ -1128,11 +1128,11 @@ algorithm
qssInfo = BackendQSS.generateStructureCodeQSS(outIndexedBackendDAE, equationIndices, variableIndices, incidenceMatrix, incidenceMatrixT, strongComponents);
Tpl.tplNoret2(SimCodeQSS.translateModel, simCode, qssInfo);
then ();
case (simCode,_,"C")
case (simCode,_,"c")
equation
Tpl.tplNoret(SimCodeC.translateModel, simCode);
then ();
case (simCode,_,"c")
case (simCode,_,"C")
equation
Tpl.tplNoret(CodegenC.translateModel, simCode);
then ();
Expand Down
11 changes: 7 additions & 4 deletions Compiler/susan_codegen/SimCode/CodegenC.tpl
Expand Up @@ -69,7 +69,9 @@ case SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then
else
"" //the else is automatically empty, too

let()= textFile(simulationHeaderFile(simCode,guid), '<%fileNamePrefix%>.h')
// workaround for <%fileNamePrefix%>.h with an underscore, because we have
// for example a ModelicaUtilities.h in the runtime
let()= textFile(simulationHeaderFile(simCode,guid), '_<%fileNamePrefix%>.h')
// adpro: write the main .c file last! Make on windows doesn't seem to realize that
// the .c file is newer than the .o file if we have succesive simulate commands
// for the same model (i.e. see testsuite/linearize/simextfunction.mos).
Expand Down Expand Up @@ -119,7 +121,7 @@ case simCode as SIMCODE(__) then
<<
<%simulationFileHeader(simCode)%>
<%externalFunctionIncludes(externalFunctionIncludes)%>
#include "<%fileNamePrefix%>.h"
#include "_<%fileNamePrefix%>.h"
#include "<%fileNamePrefix%>_functions.c"
#define _OMC_SEED_HACK char* _omc_hack
#define _OMC_SEED_HACK_2 NULL
Expand Down Expand Up @@ -697,7 +699,8 @@ template functionInitial(list<SimEqSystem> initialEquations)
<%eqPart%>
<%initialEquations |> SES_SIMPLE_ASSIGN(__) =>
'if (DEBUG_FLAG(LOG_INIT)) { printf("Setting variable start value: %s(start=%f)\n", "<%cref(cref)%>", (<%crefType(cref)%>) <%cref(cref)%>); }'
'if (DEBUG_FLAG(LOG_INIT)) { printf("Setting variable start value: %s(start=%f)\n", "<%cref(cref)%>", (<%crefType(cref)%>) <%cref(cref)%>); }
$P$START<%cref(cref)%> = <%cref(cref)%>;'
;separator="\n"%>
return 0;
Expand Down Expand Up @@ -2050,7 +2053,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
CFLAGS_BASED_ON_INIT_FILE=<%extraCflags%>
CFLAGS=$(CFLAGS_BASED_ON_INIT_FILE) <%makefileParams.cflags%> <%match sopt case SOME(s as SIMULATION_SETTINGS(__)) then s.cflags /* From the simulate() command */%>
CPPFLAGS=-I"<%makefileParams.omhome%>/include/omc2" -I. <%dirExtra%> <%makefileParams.includes ; separator=" "%>
LDFLAGS=-L"<%makefileParams.omhome%>/lib/omc2" -lSimulationRuntimeC -lModelicaExternalC <%makefileParams.ldflags%>
LDFLAGS=-L"<%makefileParams.omhome%>/lib/omc2" -lModelicaExternalC -lSimulationRuntimeC <%makefileParams.ldflags%>
SENDDATALIBS=<%makefileParams.senddatalibs%>
PERL=perl
MAINFILE=<%fileNamePrefix%><% if acceptMetaModelicaGrammar() then ".conv"%>.c
Expand Down
8 changes: 4 additions & 4 deletions SimulationRuntime/c/math-support/initialization.c
Expand Up @@ -659,18 +659,18 @@ static int state_initialization(_X_DATA *data, int optiMethod)

/* call initialize function and save start values */
storeStartValues(data);
storePreValues(data); /* if initial_function() uses pre-values */
storeStartValuesParam(data);
initial_function(data); /* set all start-Values */
/* initialize all relations that are ZeroCrossings */
bound_parameters(data);

storePreValues(data); /* to provide all valid pre-values */
storePreValues(data);
overwriteOldSimulationData(data);

/* initialize all relations that are ZeroCrossings */
bound_parameters(data);
update_DAEsystem(data);

/* and restore start values and helpvars */
restoreExtrapolationDataOld(data);
resetAllHelpVars(data);
storePreValues(data);

Expand Down
24 changes: 24 additions & 0 deletions SimulationRuntime/c/math-support/model_help.c
Expand Up @@ -188,6 +188,30 @@ void overwriteOldSimulationData(_X_DATA *data)
}


/** function restoreExtrapolationDataOld
* author: wbraun
*
* Restores variables (states, derivatives and algebraic).
*
* This function overwrites all variable with old values.
* This function is called while the initialization to be able
* initialize all ZeroCrossing relations.
*/
void
restoreExtrapolationDataOld(_X_DATA *data)
{
long i;

for(i=1; i<ringBufferLength(data->simulationData); ++i){
data->localData[i-1]->timeValue = data->localData[i]->timeValue;
memcpy(data->localData[i-1]->realVars, data->localData[i]->realVars, sizeof(modelica_real)*data->modelData.nVariablesReal);
memcpy(data->localData[i-1]->integerVars, data->localData[i]->integerVars, sizeof(modelica_integer)*data->modelData.nVariablesInteger);
memcpy(data->localData[i-1]->booleanVars, data->localData[i]->booleanVars, sizeof(modelica_boolean)*data->modelData.nVariablesBoolean);
memcpy(data->localData[i-1]->stringVars, data->localData[i]->stringVars, sizeof(modelica_string)*data->modelData.nVariablesString);
}
}


/*! \fn void storeStartValues(_X_DATA *data)
*
* sets all values to their start-attribute
Expand Down
3 changes: 3 additions & 0 deletions SimulationRuntime/c/math-support/model_help.h
Expand Up @@ -70,6 +70,9 @@ void printAllVars(_X_DATA *data, int ringSegment);

void overwriteOldSimulationData(_X_DATA *data);

void
restoreExtrapolationDataOld(_X_DATA *data);

void storeStartValues(_X_DATA* data);

void storeStartValuesParam(_X_DATA *data);
Expand Down
18 changes: 9 additions & 9 deletions SimulationRuntime/c/simulation/simulation_input_xml.cpp
Expand Up @@ -383,9 +383,9 @@ void read_input_xml(int argc, char **argv,
read_value(mi.rSta[i]["nominal"], &(modelData->realVarsData[i].attribute.nominal));
DEBUG_INFO2(LOG_SOLVER, "read nominal-value for %s = %f from init file", modelData->realVarsData[i].info.name, modelData->realVarsData[i].attribute.nominal);
read_value(mi.rSta[i]["min"], &(modelData->realVarsData[i].attribute.min));
DEBUG_INFO2(LOG_SOLVER," read min-value for %s = %f from init file", modelData->realVarsData[i].info.name, modelData->realVarsData[i].attribute.min);
DEBUG_INFO2(LOG_SOLVER," read min-value for %s = %g from init file", modelData->realVarsData[i].info.name, modelData->realVarsData[i].attribute.min);
read_value(mi.rSta[i]["max"], &(modelData->realVarsData[i].attribute.max));
DEBUG_INFO2(LOG_SOLVER," read max-value for %s = %f from init file", modelData->realVarsData[i].info.name, modelData->realVarsData[i].attribute.max);
DEBUG_INFO2(LOG_SOLVER," read max-value for %s = %g from init file", modelData->realVarsData[i].info.name, modelData->realVarsData[i].attribute.max);

/* create a mapping for Alias variable to get the correct index */
mapAlias[(modelData->realVarsData[i].info.name)]=i;
Expand Down Expand Up @@ -423,9 +423,9 @@ void read_input_xml(int argc, char **argv,
read_value(mi.rDer[i]["nominal"], &(modelData->realVarsData[modelData->nStates+i].attribute.nominal));
DEBUG_INFO2(LOG_SOLVER, "read nominal-value for %s = %f from init file", modelData->realVarsData[modelData->nStates+i].info.name, modelData->realVarsData[modelData->nStates+i].attribute.nominal);
read_value(mi.rDer[i]["min"], &(modelData->realVarsData[modelData->nStates+i].attribute.min));
DEBUG_INFO2(LOG_SOLVER, "read min-value for %s = %f from init file", modelData->realVarsData[modelData->nStates+i].info.name, modelData->realVarsData[modelData->nStates+i].attribute.min);
DEBUG_INFO2(LOG_SOLVER, "read min-value for %s = %g from init file", modelData->realVarsData[modelData->nStates+i].info.name, modelData->realVarsData[modelData->nStates+i].attribute.min);
read_value(mi.rDer[i]["max"], &(modelData->realVarsData[modelData->nStates+i].attribute.max));
DEBUG_INFO2(LOG_SOLVER, "read max-value for %s = %f from init file", modelData->realVarsData[modelData->nStates+i].info.name, modelData->realVarsData[modelData->nStates+i].attribute.max);
DEBUG_INFO2(LOG_SOLVER, "read max-value for %s = %g from init file", modelData->realVarsData[modelData->nStates+i].info.name, modelData->realVarsData[modelData->nStates+i].attribute.max);

/* create a mapping for Alias variable to get the correct index */
mapAlias[(modelData->realVarsData[modelData->nStates+i].info.name)]= modelData->nStates+i;
Expand Down Expand Up @@ -464,9 +464,9 @@ void read_input_xml(int argc, char **argv,
read_value(mi.rAlg[i]["nominal"], &(modelData->realVarsData[j].attribute.nominal));
DEBUG_INFO2(LOG_SOLVER, "read nominal-value for %s = %f from init file", modelData->realVarsData[j].info.name, modelData->realVarsData[j].attribute.nominal);
read_value(mi.rAlg[i]["min"], &(modelData->realVarsData[j].attribute.min));
DEBUG_INFO2(LOG_SOLVER, "read min-value for %s = %f from init file", modelData->realVarsData[j].info.name, modelData->realVarsData[j].attribute.min);
DEBUG_INFO2(LOG_SOLVER, "read min-value for %s = %g from init file", modelData->realVarsData[j].info.name, modelData->realVarsData[j].attribute.min);
read_value(mi.rAlg[i]["max"], &(modelData->realVarsData[j].attribute.max));
DEBUG_INFO2(LOG_SOLVER, "read max-value for %s = %f from init file", modelData->realVarsData[j].info.name, modelData->realVarsData[j].attribute.max);
DEBUG_INFO2(LOG_SOLVER, "read max-value for %s = %g from init file", modelData->realVarsData[j].info.name, modelData->realVarsData[j].attribute.max);

/* create a mapping for Alias variable to get the correct index */
mapAlias[(modelData->realVarsData[j].info.name)]= j;
Expand Down Expand Up @@ -536,7 +536,7 @@ void read_input_xml(int argc, char **argv,

/* read var attribute */
read_value(mi.bAlg[i]["start"], (signed char*)&(modelData->booleanVarsData[i].attribute.start));
DEBUG_INFO2(LOG_SOLVER, "read start-value for %s = %s from init file", modelData->booleanVarsData[i].info.name, modelData->booleanVarsData[i].attribute.start?"true":"false");
DEBUG_INFO2(LOG_SOLVER, "read start-value for %s = %s from init file", modelData->booleanVarsData[i].info.name, modelData->booleanVarsData[i].attribute.start?"true":"false");
read_value(mi.bAlg[i]["fixed"],(signed char*)&(modelData->booleanVarsData[i].attribute.fixed));
DEBUG_INFO2(LOG_SOLVER, "read fixed-value for %s = %s from init file", modelData->booleanVarsData[i].info.name, modelData->booleanVarsData[i].attribute.fixed?"true":"false");

Expand Down Expand Up @@ -611,9 +611,9 @@ void read_input_xml(int argc, char **argv,
read_value(mi.rPar[i]["nominal"], &(modelData->realParameterData[i].attribute.nominal));
DEBUG_INFO2(LOG_SOLVER, "read nominal for %s = %f from init file", modelData->realParameterData[i].info.name, modelData->realParameterData[i].attribute.nominal);
read_value(mi.rPar[i]["min"], &(modelData->realParameterData[i].attribute.min));
DEBUG_INFO2(LOG_SOLVER," read min-value for %s = %f from init file", modelData->realParameterData[i].info.name, modelData->realParameterData[i].attribute.min);
DEBUG_INFO2(LOG_SOLVER," read min-value for %s = %g from init file", modelData->realParameterData[i].info.name, modelData->realParameterData[i].attribute.min);
read_value(mi.rPar[i]["max"], &(modelData->realParameterData[i].attribute.max));
DEBUG_INFO2(LOG_SOLVER," read max-value for %s = %f from init file", modelData->realParameterData[i].info.name, modelData->realParameterData[i].attribute.max);
DEBUG_INFO2(LOG_SOLVER," read max-value for %s = %g from init file", modelData->realParameterData[i].info.name, modelData->realParameterData[i].attribute.max);

/* create a mapping for Alias variable to get the correct index */
mapAliasParam[(modelData->realParameterData[i].info.name)]=i;
Expand Down
5 changes: 4 additions & 1 deletion SimulationRuntime/c/simulation/simulation_runtime.cpp
Expand Up @@ -341,7 +341,6 @@ startNonInteractiveSimulation(int argc, char**argv, _X_DATA* data)
rt_clear( SIM_TIMER_INIT );
}


if (create_linearmodel) {
if (lintime == NULL) {
data->simulationInfo.stopTime = data->simulationInfo.startTime;
Expand Down Expand Up @@ -576,6 +575,10 @@ initRuntimeAndSimulation(int argc, char**argv, _X_DATA *data)
void SimulationRuntime_printStatus(int sig) {
printf("<status>\n");
printf("<phase>UNKNOWN</phase>\n");
/*
* FIXME: Variables needed here are no longer global.
* and (int sig) is too small for pointer to data.
*/
/*
printf("<model>%s</model>\n", data->modelData.modelFilePrefix);
printf("<phase>UNKNOWN</phase>\n");
Expand Down
56 changes: 22 additions & 34 deletions SimulationRuntime/c/simulation/solver/dassl.c
Expand Up @@ -90,14 +90,6 @@ continue_DASRT(fortran_integer* idid, double* tolarence);
int
dasrt_initial(_X_DATA* simData, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData){

/* int i; */

/*will remove -> DASSL
for (i = 0; i < DASSLSTATS; i++) {
dasslStats[i] = 0;
dasslStatsTmp[i] = 0;
}
*/
/* work arrays for DASSL */
dasslData->liw = 20 + simData->modelData.nStates;
dasslData->lrw = 52 + (maxOrder + 4) * simData->modelData.nStates
Expand All @@ -114,6 +106,11 @@ dasrt_initial(_X_DATA* simData, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData){
dasslData->ipar[1] = LOG_JAC;
dasslData->ipar[2] = LOG_ENDJAC;
dasslData->info = (fortran_integer*) calloc(infoLength, sizeof(fortran_integer));
ASSERT(dasslData->info,"out of memory");
dasslData->dasslStatistics = (unsigned int*) calloc(noStatistics, sizeof(unsigned int));
ASSERT(dasslData->dasslStatistics,"out of memory");
dasslData->dasslStatisticsTmp = (unsigned int*) calloc(noStatistics, sizeof(unsigned int));
ASSERT(dasslData->dasslStatisticsTmp,"out of memory");

/*********************************************************************
*info[2] = 1; //intermediate-output mode
Expand Down Expand Up @@ -199,14 +196,6 @@ int dasrt_step(_X_DATA* simData, SOLVER_INFO* solverInfo)

DEBUG_INFO2(LOG_SOLVER, "**Calling DDASRT from %g to %g",
solverInfo->currentTime, tout);
/*
DDASRT(functionODE_residual, (fortran_integer*) &mData->nStates,
&solverInfo->currentTime, sData->realVars, stateDer, &tout,
dasslData->info, &simData->simulationInfo.tolerance, &simData->simulationInfo.tolerance,
&dasslData->idid, dasslData->rwork, &dasslData->lrw, dasslData->iwork,
&dasslData->liw,dasslData->rpar, dasslData->ipar, dummy_Jacobian,
dummy_zeroCrossing, &tmpZero, NULL);
*/

if (jac_flag)
{
Expand Down Expand Up @@ -238,27 +227,26 @@ int dasrt_step(_X_DATA* simData, SOLVER_INFO* solverInfo)
dasslData->rpar, dasslData->ipar, dummy_Jacobian, dummy_zeroCrossing,
&tmpZero, NULL);
}
/*
if(sim_verbose == LOG_SOLVER)
if (DEBUG_FLAG(LOG_SOLVER))
{
INFO("DASSL call | value of idid: %ld", idid);
INFO("DASSL call | current time value: %0.4g", globalData->timeValue);
INFO("DASSL call | current integration time value: %0.4g", rwork[3]);
INFO("DASSL call | step size H to be attempted on next step: %0.4g", rwork[2]);
INFO("DASSL call | step size used on last successful step: %0.4g", rwork[6]);
INFO("DASSL call | number of steps taken so far: %ld", iwork[10]);
INFO("DASSL call | number of calls of functionODE() : %ld", iwork[11]);
INFO("DASSL call | number of calculation of jacobian : %ld", iwork[12]);
INFO("DASSL call | total number of convergence test failures: %ld", iwork[13]);
INFO("DASSL call | total number of error test failures: %ld", iwork[14]);
INFO1("DASSL call | value of idid: %ld", dasslData->idid);
INFO1("DASSL call | current time value: %0.4g", solverInfo->currentTime);
INFO1("DASSL call | current integration time value: %0.4g", dasslData->rwork[3]);
INFO1("DASSL call | step size H to be attempted on next step: %0.4g", dasslData->rwork[2]);
INFO1("DASSL call | step size used on last successful step: %0.4g", dasslData->rwork[6]);
INFO1("DASSL call | number of steps taken so far: %ld", dasslData->iwork[10]);
INFO1("DASSL call | number of calls of functionODE() : %ld", dasslData->iwork[11]);
INFO1("DASSL call | number of calculation of jacobian : %ld", dasslData->iwork[12]);
INFO1("DASSL call | total number of convergence test failures: %ld", dasslData->iwork[13]);
INFO1("DASSL call | total number of error test failures: %ld", dasslData->iwork[14]);
}
*/
/* save dassl stats */
/* for (i = 0; i < DASSLSTATS; i++) {
assert(10 + i < liw);
tmpStats[i] = iwork[10 + i];
}
*/
for (i = 0; i < noStatistics; i++)
{
assert(10 + i < dasslData->liw);
dasslData->dasslStatisticsTmp[i] = dasslData->iwork[10 + i];
}

if (dasslData->idid == -1)
{
fflush(stderr);
Expand Down
1 change: 0 additions & 1 deletion SimulationRuntime/c/simulation/solver/dassl.h
Expand Up @@ -43,7 +43,6 @@ static const unsigned int infoLength = 15;
typedef struct DASSL_DATA{
unsigned int* dasslStatistics;
unsigned int* dasslStatisticsTmp;
modelica_boolean reset;

fortran_integer* info;

Expand Down
29 changes: 15 additions & 14 deletions SimulationRuntime/c/simulation/solver/events.c
Expand Up @@ -396,11 +396,10 @@ CheckForNewEvent(_X_DATA* simData, modelica_boolean* sampleactived, double* curr

FindRoot(simData, &EventTime, eventList);
/*Handle event as state event*/
simData->localData[0]->timeValue = EventTime;
EventHandle(simData, 0, eventList);

DEBUG_INFO1(LOG_EVENTS, "Event Handling at EventTime: %f done!", EventTime);
*currentTime = EventTime;
*currentTime = simData->localData[0]->timeValue;
freeList(eventList);
return 1;
}
Expand Down Expand Up @@ -519,7 +518,7 @@ void FindRoot(_X_DATA* simData, double *EventTime, LIST *eventList)
value = fabs(simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))]);
}
}
DEBUG_INFO1(LOG_ZEROCROSSINGS, "Minimum value: %g", value);
DEBUG_INFO1(LOG_ZEROCROSSINGS, "Minimum value: %f", value);
for (it=listFirstNode(eventList); it; it=listNextNode(it))
{
if (value == fabs(simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))]))
Expand All @@ -532,10 +531,12 @@ void FindRoot(_X_DATA* simData, double *EventTime, LIST *eventList)

listClear(eventList);

if (listLen(tmpEventList) > 0){
DEBUG_INFO_NEL(LOG_EVENTS, "Found events: ");
}else{
DEBUG_INFO_NEL(LOG_EVENTS, "Found event: ");
if (DEBUG_FLAG(LOG_EVENTS)){
if (listLen(tmpEventList) > 0){
DEBUG_INFO_NEL(LOG_EVENTS, "Found events: ");
}else{
DEBUG_INFO_NEL(LOG_EVENTS, "Found event: ");
}
}
while (listLen(tmpEventList) > 0){
event_id = *((long*)listFirstData(tmpEventList));
Expand All @@ -550,9 +551,9 @@ void FindRoot(_X_DATA* simData, double *EventTime, LIST *eventList)
}
DEBUG_INFO_NELA(LOG_EVENTS, "\n");

DEBUG_INFO1(LOG_EVENTS, "at time: %g", *EventTime);
DEBUG_INFO1(LOG_EVENTS, "Time at Point left: %g", time_left);
DEBUG_INFO1(LOG_EVENTS, "Time at Point right: %g", time_right);
DEBUG_INFO1(LOG_EVENTS, "at time: %f", *EventTime);
DEBUG_INFO1(LOG_EVENTS, "Time at Point left: %f", time_left);
DEBUG_INFO1(LOG_EVENTS, "Time at Point right: %f", time_right);

/*determined system at t_e - epsilon */
simData->localData[0]->timeValue = time_left;
Expand Down Expand Up @@ -664,10 +665,10 @@ CheckZeroCrossings(_X_DATA *simData, LIST *tmpEventList, LIST *eventList)
*((long*)listNodeData(it)), simData->simulationInfo.zeroCrossingsPre[*((long*)listNodeData(it))], simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))], simData->simulationInfo.zeroCrossingEnabled[*((long*)listNodeData(it))]); fflush(NULL);

/*Found event in left section*/
if ((simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] < 0
&& simData->simulationInfo.zeroCrossingsPre[*((long*)listNodeData(it))] >= 0)
|| (simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] > 0
&& simData->simulationInfo.zeroCrossingsPre[*((long*)listNodeData(it))] <= 0)
if ((simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] <= 0
&& simData->simulationInfo.zeroCrossingsPre[*((long*)listNodeData(it))] > 0)
|| (simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] >= 0
&& simData->simulationInfo.zeroCrossingsPre[*((long*)listNodeData(it))] < 0)
|| (simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] > 0
&& simData->simulationInfo.zeroCrossingEnabled[*((long*)listNodeData(it))] <= -1)
|| (simData->simulationInfo.zeroCrossings[*((long*)listNodeData(it))] < 0
Expand Down

0 comments on commit 1e6d786

Please sign in to comment.