Skip to content

Commit

Permalink
- added fixes for initialization (Bug [# 1537])
Browse files Browse the repository at this point in the history
 - fixed builtin function semiLinear()



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@9119 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed May 25, 2011
1 parent 48aa63b commit b3db901
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 37 deletions.
2 changes: 1 addition & 1 deletion c_runtime/modelica.h
Expand Up @@ -146,7 +146,7 @@ typedef modelica_boolean terminal_rettype;
typedef modelica_boolean change_rettype;
typedef modelica_integer integer_rettype;
typedef modelica_integer sign_rettype;
#define semiLinear(x,positiveSlope,negativeSlope) (x>=0?positiveSlope:negativeSlope)
#define semiLinear(x,positiveSlope,negativeSlope) (x>=0?positiveSlope*x:negativeSlope*x)
typedef modelica_real semiLinear_rettype;

/* sign function */
Expand Down
29 changes: 18 additions & 11 deletions c_runtime/simulation_events.cpp
Expand Up @@ -50,8 +50,6 @@ using namespace std;

double* gout = 0;
double* gout_old = 0;
double* gout_backup = 0;
modelica_boolean* gout_res = 0;
modelica_boolean* backuprelations = 0;
long* zeroCrossingEnabled = 0;
long inUpdate = 0;
Expand Down Expand Up @@ -81,7 +79,6 @@ initializeEventData()

gout = 0;
gout_old = 0;
gout_backup = 0;
backuprelations = 0;
zeroCrossingEnabled = 0;
inUpdate = 0;
Expand All @@ -90,8 +87,6 @@ initializeEventData()
// load default initial values.
gout = new double[globalData->nZeroCrossing];
gout_old = new double[globalData->nZeroCrossing];
gout_backup = new double[globalData->nZeroCrossing];
gout_res = new modelica_boolean[globalData->nZeroCrossing];
backuprelations = new modelica_boolean[globalData->nZeroCrossing];
h_saved = new double[globalData->nHelpVars];
x_saved = new double[globalData->nStates];
Expand All @@ -101,8 +96,8 @@ initializeEventData()
bool_saved = new modelica_boolean[globalData->boolVariables.nAlgebraic];
str_saved = new const char*[globalData->stringVariables.nAlgebraic];
zeroCrossingEnabled = new long[globalData->nZeroCrossing];
if (!y_saved || !gout || !gout_old || !gout_backup || !backuprelations
|| !gout_res || !h_saved || !x_saved || !xd_saved || !int_saved
if (!y_saved || !gout || !gout_old || !backuprelations
|| !h_saved || !x_saved || !xd_saved || !int_saved
|| !bool_saved || !str_saved || !zeroCrossingEnabled)
{
cerr << "Could not allocate memory for global event data structures"
Expand All @@ -112,8 +107,6 @@ initializeEventData()
// adrpo 2006-11-30 -> init the damn structures!
memset(gout, 0, sizeof(double) * globalData->nZeroCrossing);
memset(gout_old, 0, sizeof(double) * globalData->nZeroCrossing);
memset(gout_backup, 0, sizeof(double) * globalData->nZeroCrossing);
memset(gout_res, 0, sizeof(modelica_boolean) * globalData->nZeroCrossing);
memset(backuprelations, 0, sizeof(modelica_boolean) * globalData->nZeroCrossing);
memset(h_saved, 0, sizeof(double) * globalData->nHelpVars);
memset(x_saved, 0, sizeof(double) * globalData->nStates);
Expand Down Expand Up @@ -142,8 +135,6 @@ deinitializeEventData()
delete[] bool_saved;
delete[] gout;
delete[] gout_old;
delete[] gout_backup;
delete[] gout_res;
delete[] backuprelations;
delete[] zeroCrossingEnabled;
delete[] str_saved;
Expand Down Expand Up @@ -427,6 +418,21 @@ saveall()
str_saved[i] = globalData->stringVariables.algebraics[i];
}
}
/** function restoreHelpVars
* author: wbraun
*
* workaround function to reset all helpvar that are used for when-equations.
*/
void
restoreHelpVars()
{
for (int i = 0; i < globalData->nHelpVars; i++)
{
globalData->helpVars[i] = 0;
}
}



void
checkTermination()
Expand Down Expand Up @@ -1123,6 +1129,7 @@ SaveZeroCrossings()
function_onlyZeroCrossings(gout, &globalData->timeValue);
}


void
initializeZeroCrossings()
{
Expand Down
2 changes: 2 additions & 0 deletions c_runtime/simulation_events.h
Expand Up @@ -63,6 +63,8 @@ deinitializeEventData();

void
saveall();
void
restoreHelpVars();

double
Sample(double t, double start, double interval);
Expand Down
33 changes: 14 additions & 19 deletions c_runtime/simulation_init.cpp
Expand Up @@ -285,30 +285,28 @@ main_initialize(const std::string* method)
init_method = *method;
}

saveall();
initial_function();
update_DAEsystem();
if (sim_verbose >= LOG_SOLVER)
{
sim_result->emit();
}
// do some initial stuff
globalData->init = 1;
/* call initialize function and save start values */
saveall();
initial_function();
if (sim_verbose >= LOG_SOLVER)
{
sim_result->emit();
}
//saveall();
//update_DAEsystem();

storeExtrapolationData();
storeExtrapolationData();
storeExtrapolationDataEvent();
saveall();

/* Initialize all relations that are ZeroCrossings */
update_DAEsystem();
/* And restore start values and helpvars*/
restoreExtrapolationDataOld();
restoreHelpVars();
saveall();
if (sim_verbose >= LOG_SOLVER)
{
sim_result->emit();
}
// start with the real initialization
globalData->init = 1;

//first try with the given method as default simplex and
//then try with the other one
Expand All @@ -333,10 +331,8 @@ main_initialize(const std::string* method)
retVal = 1;
}
}

saveall();
storeExtrapolationData();
storeExtrapolationData();
storeExtrapolationDataEvent();

if (sim_verbose >= LOG_SOLVER)
{
Expand All @@ -350,8 +346,7 @@ main_initialize(const std::string* method)
{
sim_result->emit();
}
storeExtrapolationData();
storeExtrapolationData();
storeExtrapolationDataEvent();
globalData->init = 0;
return retVal;
}
Expand Down
73 changes: 73 additions & 0 deletions c_runtime/simulation_runtime.cpp
Expand Up @@ -220,6 +220,79 @@ storeExtrapolationData()
globalData->oldTime = globalData->timeValue;
}

/** function storeExtrapolationDataEvent
* author: wbraun
*
* Stores variables (states, derivatives and algebraic) to be used
* by e.g. numerical solvers to extrapolate values as start values.
*
* This function overwrites all old value with the current.
* This function is called after events.
*/
void
storeExtrapolationDataEvent()
{
int i;
for (i = 0; i < globalData->nStates; i++)
{
globalData->states_old2[i] = globalData->states[i];
globalData->statesDerivatives_old2[i] = globalData->statesDerivatives[i];
globalData->states_old[i] = globalData->states[i];
globalData->statesDerivatives_old[i] = globalData->statesDerivatives[i];
}
for (i = 0; i < globalData->nAlgebraic; i++)
{
globalData->algebraics_old2[i] = globalData->algebraics[i];
globalData->algebraics_old[i] = globalData->algebraics[i];
}
for (i = 0; i < globalData->intVariables.nAlgebraic; i++)
{
globalData->intVariables.algebraics_old2[i] = globalData->intVariables.algebraics[i];
globalData->intVariables.algebraics_old[i] = globalData->intVariables.algebraics[i];
}
for (i = 0; i < globalData->boolVariables.nAlgebraic; i++)
{
globalData->boolVariables.algebraics_old2[i] = globalData->boolVariables.algebraics[i];
globalData->boolVariables.algebraics_old[i] = globalData->boolVariables.algebraics[i];
}
globalData->oldTime2 = globalData->timeValue;
globalData->oldTime = globalData->timeValue;
}

/** 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()
{
int i;
for (i = 0; i < globalData->nStates; i++)
{
globalData->states[i] = globalData->states_old[i];
globalData->statesDerivatives[i] = globalData->statesDerivatives_old[i];
}
for (i = 0; i < globalData->nAlgebraic; i++)
{
globalData->algebraics[i] = globalData->algebraics_old[i];
}
for (i = 0; i < globalData->intVariables.nAlgebraic; i++)
{
globalData->intVariables.algebraics[i] = globalData->intVariables.algebraics_old[i];
}
for (i = 0; i < globalData->boolVariables.nAlgebraic; i++)
{
globalData->boolVariables.algebraics[i] = globalData->boolVariables.algebraics_old[i];
}
globalData->timeValue = globalData->oldTime;
}


/* \brief determine verboselevel by investigating flag -lv=flags
*
* Flags are or'ed to a returnvalue.
Expand Down
2 changes: 2 additions & 0 deletions c_runtime/simulation_runtime.h
Expand Up @@ -330,6 +330,8 @@ const char* getNameBool(modelica_boolean* ptr);
const char* getNameString(const char** ptr);

void storeExtrapolationData();
void storeExtrapolationDataEvent();
void restoreExtrapolationDataOld();

/* function for calculating ouput values */
/*used in DDASRT fortran function*/
Expand Down
12 changes: 6 additions & 6 deletions c_runtime/solver_main.cpp
Expand Up @@ -245,10 +245,6 @@ void update_DAEsystem(){
int IterationNum = 0;

functionDAE(&needToIterate);
if (sim_verbose >= LOG_SOLVER)
{
sim_result->emit();
}
while (checkForDiscreteChanges() || needToIterate)
{
if (needToIterate)
Expand Down Expand Up @@ -396,8 +392,7 @@ solver_main(int argc, char** argv, double &start, double &stop, double &step,
}
saveall();
sim_result->emit();
storeExtrapolationData();
storeExtrapolationData();
storeExtrapolationDataEvent();
}
catch (TerminateSimulationException &e)
{
Expand Down Expand Up @@ -510,6 +505,9 @@ solver_main(int argc, char** argv, double &start, double &stop, double &step,
stateEvents++;
reset = true;
dideventstep = 1;

//due to an event overwrite old values
storeExtrapolationDataEvent();
}
else if (sampleEvent_actived)
{
Expand All @@ -518,6 +516,8 @@ solver_main(int argc, char** argv, double &start, double &stop, double &step,
reset = true;
dideventstep = 1;
sampleEvent_actived = 0;
//due to an event overwrite old values
storeExtrapolationDataEvent();
}
else
{
Expand Down

0 comments on commit b3db901

Please sign in to comment.