Skip to content

Commit

Permalink
- start to use new simulatio_data struct in initialization
Browse files Browse the repository at this point in the history
- fixed log-messages

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10482 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
lochel committed Nov 13, 2011
1 parent 18af011 commit a28ccf9
Show file tree
Hide file tree
Showing 8 changed files with 323 additions and 207 deletions.
2 changes: 1 addition & 1 deletion SimulationRuntime/c/math-support/delay.c
Expand Up @@ -72,7 +72,7 @@ void initDelay(double startTime)
for(i=0; i<numDelayExpressionIndex; i++)
delayStructure[i] = allocRingBuffer(1024, sizeof(TIME_AND_VALUE));

DEBUG_INFO(LV_SOLVER, "initDelay called with startTime = %f\n", startTime);
DEBUG_INFO(LV_SOLVER, "initDelay called with startTime = %f", startTime);
}

void deinitDelay()
Expand Down
189 changes: 69 additions & 120 deletions SimulationRuntime/c/math-support/events.c

Large diffs are not rendered by default.

189 changes: 189 additions & 0 deletions SimulationRuntime/c/math-support/initialization.c
Expand Up @@ -839,3 +839,192 @@ int initialization(const char* pInitMethod, const char* pOptiMethod)
WARNING_AL("current options are: state or old");
return -1;
}


























/* use of new simulation_data struct _X_DATA */
#include "simulation_data.h"

int old_initializationX(_X_DATA *data, int optiMethod)
{
int retVal = 0;
/* call initialize function and save start values */
saveall(); /* if initial_function() uses pre-values */
initial_function(); /* set all start-Values */
storeExtrapolationDataEvent();
saveall(); /* to provide all valid pre-values */

/* Initialize all relations that are ZeroCrossings */
update_DAEsystem();
/* start with the real initialization */
globalData->init = 1;

/* And restore start values and helpvars */
restoreExtrapolationDataOld();
restoreHelpVars();
saveall();
/* start with the real initialization */
globalData->init = 1; /* to evaluate when-equations with initial()-conditions */

/* first try with the given method as default simplex and */
/* then try with the other one */
retVal = initialize(optiMethod);

if(retVal != 0)
{
if(optiMethod == IOM_SIMPLEX)
retVal = initialize(IOM_NEWUOA);
else if(optiMethod == IOM_NEWUOA)
retVal = initialize(IOM_SIMPLEX);

if(retVal != 0)
{
INFO("Initialization of the current initial set of equations and initial guesses fails!");
INFO_AL("Try with better Initial guesses for the states.");
}
}

saveall(); /* save pre-values */
storeExtrapolationDataEvent(); /* if there are non-linear equations */

update_DAEsystem(); /* evaluate discrete variables */

/* valid system for the first time! */

SaveZeroCrossings();
saveall();
storeExtrapolationDataEvent();

globalData->init = 0;

return retVal;
}

void storePreValues(_X_DATA *data)
{
SIMULATION_DATA *sData = (SIMULATION_DATA*)getRingData(data->simulationData, 0);
MODEL_DATA *mData = &(data->modelData);

memcpy(sData->realVarsPre, sData->realVars, sizeof(modelica_real)*mData->nVariablesReal);
memcpy(sData->integerVarsPre, sData->integerVars, sizeof(modelica_real)*mData->nVariablesInteger);
memcpy(sData->booleanVarsPre, sData->booleanVars, sizeof(modelica_real)*mData->nVariablesBoolean);
memcpy(sData->stringVarsPre, sData->stringVars, sizeof(modelica_real)*mData->nVariablesString);
}

int state_initializationX(_X_DATA *data, int optiMethod)
{
int retVal = 0;
/* call initialize function and save start values */
saveall(); /* if initial_function() uses pre-values */
initial_function(); /* set all start-Values */
storeExtrapolationDataEvent();
saveall(); /* to provide all valid pre-values */

/* Initialize all relations that are ZeroCrossings */
update_DAEsystem();

/* And restore start values and helpvars */
restoreExtrapolationDataOld();
restoreHelpVars();
saveall();

/* start with the real initialization */
globalData->init = 1; /* to evaluate when-equations with initial()-conditions */

retVal = initialize(IOM_NELDER_MEAD_EX);

saveall(); /* save pre-values */
storeExtrapolationDataEvent(); /* if there are non-linear equations */

update_DAEsystem(); /* evaluate discrete variables */

/* valid system for the first time! */

SaveZeroCrossings();
saveall();
storeExtrapolationDataEvent();

globalData->init = 0;

/* fall-back case */
if(retVal)
{
DEBUG_INFO(LV_INIT, "state_initialization | init. failed! use old initialization method");
return old_initialization(optiMethod);
}

return retVal;
}

/* done */
int initializationX(_X_DATA *data, const char* pInitMethod, const char* pOptiMethod)
{
int initMethod = IIM_STATE; /* default method */
int optiMethod = IOM_SIMPLEX; /* default method */

/* if there are user-specified options, use them! */
if(pInitMethod)
{
if(!strcmp(pInitMethod, "state"))
initMethod = IIM_STATE;
else if(!strcmp(pInitMethod, "old"))
initMethod = IIM_OLD;
else
initMethod = IIM_UNKNOWN;
}

if(pOptiMethod)
{
if(!strcmp(pOptiMethod, "simplex"))
optiMethod = IOM_SIMPLEX;
else if(!strcmp(pOptiMethod, "nelder_mead_ex"))
optiMethod = IOM_NELDER_MEAD_EX;
else if(!strcmp(pOptiMethod, "newuoa"))
optiMethod = IOM_NEWUOA;
else
optiMethod = IOM_UNKNOWN;
}

DEBUG_INFO(LV_INIT, "initialization | initialization method: %s", initMethodStr[initMethod]);
DEBUG_INFO_AL(LV_INIT, " optimization method: %s", optiMethodStr[optiMethod]);

/* select the right initialization-method */
if(initMethod == IIM_OLD)
{
/* the 'old' initialization-method */
return old_initializationX(data, optiMethod);
}
else if(initMethod == IIM_STATE)
{
/* the 'new' initialization-method */
return state_initializationX(data, optiMethod);
}

/* unrecognized initialization-method */
WARNING("unrecognized option -iim %s", initMethodStr[initMethod]);
WARNING_AL("current options are: state or old");
return -1;
}
5 changes: 4 additions & 1 deletion SimulationRuntime/c/math-support/initialization.h
Expand Up @@ -35,13 +35,16 @@
#ifndef _INITIALIZATION_H_
#define _INITIALIZATION_H_

#include "simulation_data.h"

#ifdef __cplusplus
#include <cstdlib>
extern "C"
{
#endif

int initialization(const char* pInitMethod, const char* pOptiMethod);
int initialization(const char* pInitMethod, const char* pOptiMethod);
int initializationX(_X_DATA *data, const char* pInitMethod, const char* pOptiMethod);

#ifdef __cplusplus
}
Expand Down
5 changes: 5 additions & 0 deletions SimulationRuntime/c/math-support/ringbuffer.c
Expand Up @@ -27,6 +27,11 @@
* See the full OSMC Public License conditions for more details.
*
*/

/*
* this does not work
* we need to seperate RingBuffer and expandable queue
*/

#include "ringbuffer.h"
#include "error.h"
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/simulation/simulation_runtime.h
Expand Up @@ -259,8 +259,8 @@ void setTermMsg(const char*);
#define initial() localData->init
#define terminal() localData->terminal

//_X_DATA *allocXData(void);
//void freeXData(_X_DATA *data);
/* _X_DATA *allocXData(void); */
/* void freeXData(_X_DATA *data); */

/* the main function of the simulation runtime!
* simulation runtime no longer has main, is defined by the generated model code which calls this function.
Expand Down

0 comments on commit a28ccf9

Please sign in to comment.