Skip to content

Commit

Permalink
[newSimulationruntimeC] - setup the solver_main to work on new data s…
Browse files Browse the repository at this point in the history
…tructure

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10531 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Nov 16, 2011
1 parent 97349d6 commit 0af1212
Show file tree
Hide file tree
Showing 12 changed files with 288 additions and 283 deletions.
93 changes: 26 additions & 67 deletions Compiler/susan_codegen/SimCode/CodegenC.tpl
Expand Up @@ -105,7 +105,6 @@ match simCode
case simCode as SIMCODE(modelInfo=MODELINFO(__)) then
<<
// Simulation code for <%dotPath(modelInfo.name)%> generated by the OpenModelica Compiler <%getVersionNr()%>.
#define OLD_DATA
<%variableDefinitions(modelInfo)%>
<%\n%>
>>
Expand All @@ -131,8 +130,6 @@ case simCode as SIMCODE(__) then
<%globalData(modelInfo,fileNamePrefix,guid)%>
<%equationInfo(appendLists(allEquations,appendAllequations(jacobianMatrixes)))%>
<%functionSetLocalData()%>
<%functionInitializeDataStruc(modelInfo, fileNamePrefix, guid)%>
Expand Down Expand Up @@ -263,8 +260,6 @@ let () = System.tmpTickReset(1000)
match modelInfo
case MODELINFO(varInfo=VARINFO(numStateVars=numStateVars), vars=SIMVARS(__)) then
<<

#ifndef OLD_DATA
#define time localData->time

/* States */
Expand Down Expand Up @@ -315,49 +310,6 @@ case MODELINFO(varInfo=VARINFO(numStateVars=numStateVars), vars=SIMVARS(__)) the
<%vars.jacobianVars |> var =>
globalDataVarDefine_X_(var, "jacobianVars",0)
;separator="\n"%>
#else
static DATA* localData = 0;
#define time localData->timeValue
#define $P$old$Ptime localData->oldTime
#define $P$current_step_size globalData->current_stepsize

<%vars.stateVars |> var =>
globalDataVarDefine(var, "states")
;separator="\n"%>
<%vars.derivativeVars |> var =>
globalDataVarDefine(var, "statesDerivatives")
;separator="\n"%>
<%vars.algVars |> var =>
globalDataVarDefine(var, "algebraics")
;separator="\n"%>
<%vars.paramVars |> var =>
globalDataVarDefine(var, "parameters")
;separator="\n"%>
<%vars.extObjVars |> var =>
globalDataVarDefine(var, "extObjs")
;separator="\n"%>
<%vars.intAlgVars |> var =>
globalDataVarDefine(var, "intVariables.algebraics")
;separator="\n"%>
<%vars.intParamVars |> var =>
globalDataVarDefine(var, "intVariables.parameters")
;separator="\n"%>
<%vars.boolAlgVars |> var =>
globalDataVarDefine(var, "boolVariables.algebraics")
;separator="\n"%>
<%vars.boolParamVars |> var =>
globalDataVarDefine(var, "boolVariables.parameters")
;separator="\n"%>
<%vars.stringAlgVars |> var =>
globalDataVarDefine(var, "stringVariables.algebraics")
;separator="\n"%>
<%vars.stringParamVars |> var =>
globalDataVarDefine(var, "stringVariables.parameters")
;separator="\n"%>
<%vars.jacobianVars |> var =>
globalDataVarDefine(var, "jacobianVars")
;separator="\n"%>
#endif
<%functions |> fn hasindex i0 => '#define <%functionName(fn,false)%>_index <%i0%>'; separator="\n"%>
>>
end variableDefinitions;
Expand Down Expand Up @@ -568,12 +520,12 @@ template globalDataParDefine_X_(SimVar simVar, String arrayName)
match simVar
case SIMVAR(arrayCref=SOME(c),aliasvar=NOALIAS()) then
<<
#define <%cref(c)%> data.modelData.<%arrayName%>[<%index%>].attribute.initial
#define <%cref(name)%> data.modelData.<%arrayName%>[<%index%>].attribute.initial
#define <%cref(c)%> data->modelData.<%arrayName%>[<%index%>].attribute.initial
#define <%cref(name)%> data->modelData.<%arrayName%>[<%index%>].attribute.initial
>>
case SIMVAR(aliasvar=NOALIAS()) then
<<
#define <%cref(name)%> data.modelData.<%arrayName%>[<%index%>].attribute.initial
#define <%cref(name)%> data->modelData.<%arrayName%>[<%index%>].attribute.initial
>>
end globalDataParDefine_X_;

Expand Down Expand Up @@ -718,18 +670,6 @@ template globalDataDiscAttrInt(Boolean isDiscrete)
case false then "0"
end globalDataDiscAttrInt;

template functionSetLocalData()
"Generates function in simulation file."
::=
<<
void setLocalData(DATA* data)
{
localData = data;
init_Alias(data);
}
>>
end functionSetLocalData;


template functionInitializeDataStruc(ModelInfo modelInfo, String fileNamePrefix, String guid)
"Generates function in simulation file."
Expand Down Expand Up @@ -870,9 +810,12 @@ case MODELINFO(vars=SIMVARS(__)) then
<<
int input_function(_X_DATA *data)
{
/*
SIMULATION_DATA *localData = data->localData[0];
<%vars.inputVars |> SIMVAR(__) hasindex i0 =>
'<%cref(name)%> = localData->inputVars[<%i0%>];'
;separator="\n"%>
*/
return 0;
}
>>
Expand All @@ -887,9 +830,12 @@ case MODELINFO(vars=SIMVARS(__)) then
<<
int output_function(_X_DATA *data)
{
/*
SIMULATION_DATA *localData = data->localData[0];
<%vars.outputVars |> SIMVAR(__) hasindex i0 =>
'localData->outputVars[<%i0%>] = <%cref(name)%>;'
;separator="\n"%>
*/
return 0;
}
>>
Expand Down Expand Up @@ -947,6 +893,8 @@ template functionInitial(list<SimEqSystem> initialEquations)
<%&tmp%>
int initial_function(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
<%varDecls%>
<%eqPart%>
Expand All @@ -968,17 +916,18 @@ template functionInitialResidual(list<SimEqSystem> residualEquations)
let body = (residualEquations |> SES_RESIDUAL(__) =>
match exp
case DAE.SCONST(__) then
'localData->initialResiduals[i++] = 0;'
'initialResiduals[i++] = 0;'
else
let &preExp = buffer "" /*BUFD*/
let expPart = daeExp(exp, contextOther, &preExp /*BUFC*/,
&varDecls /*BUFD*/)
'<%preExp%>localData->initialResiduals[i++] = <%expPart%>;
if (sim_verbose == LOG_RES_INIT) { printf(" Residual[%d] : <%ExpressionDump.printExpStr(exp)%> = %f\n",i,localData->initialResiduals[i-1]); }'
'<%preExp%>initialResiduals[i++] = <%expPart%>;
if (sim_verbose == LOG_RES_INIT) { printf(" Residual[%d] : <%ExpressionDump.printExpStr(exp)%> = %f\n",i,initialResiduals[i-1]); }'
;separator="\n")
<<
int initial_residual(_X_DATA *data, double $P$_lambda)
int initial_residual(_X_DATA *data, double $P$_lambda, double* initialResiduals)
{
SIMULATION_DATA *localData = data->localData[0];
int i = 0;
state mem_state;
<%varDecls%>
Expand Down Expand Up @@ -1050,6 +999,7 @@ template functionBoundParameters(list<SimEqSystem> parameterEquations)
<%&tmp%>
int bound_parameters(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
Expand Down Expand Up @@ -1080,6 +1030,7 @@ template functionStoreDelayed(DelayedExpression delayed)
int numDelayExpressionIndex = <%match delayed case DELAYED_EXPRESSIONS(__) then maxDelayedIndex%>;
int function_storeDelayed(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
Expand Down Expand Up @@ -1197,6 +1148,7 @@ template functionODE_system(list<SimEqSystem> derivativEquations, Integer n)
<%&tmp%>
static void functionODE_system<%n%>(_X_DATA *data,int omc_thread_number)
{
SIMULATION_DATA *localData = data->localData[0];
<%varDecls%>
<%odeEqs%>
}
Expand Down Expand Up @@ -1229,6 +1181,7 @@ template functionODE(list<list<SimEqSystem>> derivativEquations, Text method)

int functionODE(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
int id,th_id;
state mem_state; /* We need to have separate memory pools for separate systems... */
mem_state = get_memory_state();
Expand All @@ -1252,6 +1205,7 @@ template functionODE(list<list<SimEqSystem>> derivativEquations, Text method)
// from the simulation runtime.
int functionODE_inline()
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls2%>
Expand Down Expand Up @@ -1288,6 +1242,7 @@ template functionAlgebraic(list<SimEqSystem> algebraicEquations)
/* for continuous time variables */
int functionAlgebraics(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
Expand All @@ -1313,6 +1268,7 @@ template functionAliasEquation(list<SimEqSystem> removedEquations)
/* for continuous time variables */
int functionAliasEquations(_X_DATA *data)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
Expand Down Expand Up @@ -1347,6 +1303,7 @@ template functionDAE( list<SimEqSystem> allEquationsPlusWhen,
<%&tmp%>
int functionDAE(_X_DATA *data, int *needToIterate)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
*needToIterate = 0;
Expand All @@ -1373,6 +1330,7 @@ template functionOnlyZeroCrossing(list<ZeroCrossing> zeroCrossings)
<<
int function_onlyZeroCrossings(_X_DATA *data, double *gout,double *t)
{
SIMULATION_DATA *localData = data->localData[0];
state mem_state;
<%varDecls%>
Expand Down Expand Up @@ -1820,6 +1778,7 @@ template equation_(SimEqSystem eq, Context context, Text &varDecls /*BUFP*/, Tex
<<

void eqFunction_<%ix%>(_X_DATA *data, double *seed) {
SIMULATION_DATA *localData = data->localData[0];
<%&varD%>
<%x%>
}
Expand Down
45 changes: 36 additions & 9 deletions SimulationRuntime/c/math-support/events.c
@@ -1,7 +1,7 @@
/*
* This file is part of OpenModelica.
*
* Copyright (c) 1998-2010, Linköpings University,
* Copyright (c) 1998-2010, Linköpings University,
* Department of Computer and Information Science,
* SE-58183 Linköping, Sweden.
*
Expand All @@ -14,7 +14,7 @@
*
* The OpenModelica software and the Open Source Modelica
* Consortium (OSMC) Public License (OSMC-PL) are obtained
* from Linköpings University, either from the above address,
* from Linköpings University, either from the above address,
* from the URL: http://www.ida.liu.se/projects/OpenModelica
* and in the OpenModelica distribution.
*
Expand Down Expand Up @@ -344,16 +344,43 @@ void storeStartValues(_X_DATA *data)
SIMULATION_DATA *sData = (SIMULATION_DATA*)getRingData(data->simulationData, 0);
MODEL_DATA *mData = &(data->modelData);

for(i=0; i<mData->nVariablesReal; ++i)
for(i=0; i<mData->nVariablesReal; ++i){
sData->realVars[i] = mData->realData[i].attribute.start;
for(i=0; i<mData->nVariablesInteger; ++i)
}
for(i=0; i<mData->nVariablesInteger; ++i){
sData->integerVars[i] = mData->integerData[i].attribute.start;
for(i=0; i<mData->nVariablesBoolean; ++i)
}
for(i=0; i<mData->nVariablesBoolean; ++i){
sData->booleanVars[i] = mData->booleanData[i].attribute.start;
for(i=0; i<mData->nVariablesString; ++i)
{
free_modelica_string(sData->stringVars[i]);
sData->stringVars[i] = copy_modelica_string(mData->stringData[i].attribute.start);
}
for(i=0; i<mData->nVariablesString; ++i){
free_modelica_string((char**)sData->stringVars[i]);
sData->stringVars[i] = copy_modelica_string((modelica_string_const)mData->stringData[i].attribute.start);
}
}

/*! \fn void storeStartValuesParam(_X_DATA *data)
*
* sets all parameter initial values to their start-attribute
*
* author: wbraun
*/
void storeStartValuesParam(_X_DATA *data)
{
long i;
MODEL_DATA *mData = &(data->modelData);

for(i=0; i<mData->nParametersReal; ++i){
mData->realParameter[i].attribute.initial = mData->realParameter[i].attribute.start;
}
for(i=0; i<mData->nParametersInteger; ++i){
mData->integerParameter[i].attribute.initial = mData->integerParameter[i].attribute.start;
}
for(i=0; i<mData->nParametersBoolean; ++i){
mData->booleanParameter[i].attribute.initial = mData->booleanParameter[i].attribute.start;
}
for(i=0; i<mData->nParametersString; ++i){
mData->stringParameter[i].attribute.initial = copy_modelica_string((modelica_string_const)mData->stringParameter[i].attribute.start);
}
}

Expand Down
1 change: 0 additions & 1 deletion SimulationRuntime/c/math-support/events.h
Expand Up @@ -91,7 +91,6 @@ extern "C" {
}\
}

#define initial() localData->init

extern long* zeroCrossingEnabled;
int function_onlyZeroCrossings(_X_DATA *data, double* gout, double* t);
Expand Down

0 comments on commit 0af1212

Please sign in to comment.