Skip to content

Commit

Permalink
[newSimulationRuntime]
Browse files Browse the repository at this point in the history
 - ported bug fix from r10562 
 - fixed some alias and results bugs
 - mosfile 30 of 155 failed


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10569 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Nov 24, 2011
1 parent 16f1702 commit 7d94895
Show file tree
Hide file tree
Showing 12 changed files with 119 additions and 56 deletions.
1 change: 1 addition & 0 deletions SimulationRuntime/c/math-support/initialization.c
Expand Up @@ -1204,6 +1204,7 @@ int copyStartValuestoInitValues(_X_DATA *data, int optiMethod)
storePreValues(data);
storeStartValuesParam(data);
overwriteOldSimulationData(data);
bound_parameters(data);

return retVal;
}
Expand Down
4 changes: 3 additions & 1 deletion SimulationRuntime/c/simulation/results/simulation_result.h
Expand Up @@ -62,7 +62,9 @@ class simulation_result {

simulation_result(const char* filename, long numpoints) : filename(filename), numpoints(numpoints) {};
virtual ~simulation_result() {};
virtual void emit(_X_DATA *data) =0;
virtual void emit(_X_DATA *data) = 0;
// write the parameter data after bound_parameters is called
virtual void writeParameterData(MODEL_DATA *modelData) = 0;
virtual const char* result_type() = 0;

};
Expand Down
Expand Up @@ -43,6 +43,7 @@ FILE* fout;
simulation_result_csv(const char* filename, long numpoints, MODEL_DATA *modelData);
virtual ~simulation_result_csv();
virtual void emit(_X_DATA *data);
void writeParameterData(MODEL_DATA *modelData) { /* do nothing */ };
virtual const char* result_type() {return "csv";};
};

Expand Down
Expand Up @@ -39,6 +39,7 @@ class simulation_result_empty : public simulation_result {

simulation_result_empty(const char* filename, long numpoints) : simulation_result(filename,numpoints) {};
void emit(_X_DATA *data) {;};
void writeParameterData(MODEL_DATA *modelData) { /* do nothing */ };
virtual const char* result_type() {return "no result file";};

};
Expand Down
65 changes: 46 additions & 19 deletions SimulationRuntime/c/simulation/results/simulation_result_mat.cpp
Expand Up @@ -110,9 +110,32 @@ const VAR_INFO** simulation_result_mat::calcDataNames(int dataSize, MODEL_DATA *
return names;
}

/* write the parameter data after bound_parameters is called */
void simulation_result_mat::writeParameterData(MODEL_DATA *modelData)
{
int rows, cols;
double *doubleMatrix = NULL;
try{
std::ofstream::pos_type remember = fp.tellp();
fp.seekp(data1HdrPos);
/* generate `data_1' matrix (with parameter data) */
generateData_1(doubleMatrix, rows, cols, modelData, startTime, stopTime);
/* write `data_1' matrix */
writeMatVer4Matrix("data_1", cols, rows, doubleMatrix, sizeof(double));
delete[] doubleMatrix; doubleMatrix = NULL;
fp.seekp(remember);
} catch(...) {
fp.close();
delete[] doubleMatrix;
throw;
}
};



simulation_result_mat::simulation_result_mat(const char* filename,
double tstart, double tstop, MODEL_DATA *modelData)
: simulation_result(filename,numpoints),fp(),data2HdrPos(-1),ntimepoints(0)
: simulation_result(filename,numpoints),fp(),data1HdrPos(-1),data2HdrPos(-1),ntimepoints(0),startTime(tstart),stopTime(tstop)
{
const char Aclass[] = "A1 bt. ir1 na Tj re ac nt so r y ";

Expand Down Expand Up @@ -150,21 +173,25 @@ simulation_result_mat::simulation_result_mat(const char* filename,

/* generate dataInfo table */
generateDataInfo(intMatrix, rows, cols, modelData, numVars, nParams);
// write `dataInfo' matrix
/* write `dataInfo' matrix */
writeMatVer4Matrix("dataInfo", cols, rows, intMatrix, sizeof(int32_t));
delete[] doubleMatrix; doubleMatrix = NULL;

// generate `data_1' matrix (with parameter data)
/* remember data1HdrPos */
data1HdrPos = fp.tellp();

/* adrpo: i cannot use writeParameterData here as it would return back to dataHdr1Pos */
/* generate `data_1' matrix (with parameter data) */
generateData_1(doubleMatrix, rows, cols, modelData, tstart, tstop);
// write `data_1' matrix
/* write `data_1' matrix */
writeMatVer4Matrix("data_1", cols, rows, doubleMatrix, sizeof(double));
free(doubleMatrix);
doubleMatrix = NULL;

/* remember data2HdrPos */
data2HdrPos = fp.tellp();
/* write `data_2' header */
writeMatVer4MatrixHeader("data_2", r_indx_map.size() + i_indx_map.size() + b_indx_map.size() + 1 /* add one more for timeValue*/, 0, sizeof(double));

free(doubleMatrix);
doubleMatrix = NULL;
fp.flush();

} catch(...) {
Expand Down Expand Up @@ -361,16 +388,16 @@ void simulation_result_mat::generateDataInfo(int32_t* &dataInfo,
{
it = r_indx_map.find(mdl_data->realAlias[i].nameID);
if (it != r_indx_map.end())
table = 1;
table = 2;
}
else if (mdl_data->realAlias[i].aliasType == 1) /* parameter */
{
it = r_indx_parammap.find(mdl_data->realAlias[i].nameID);
if (it != r_indx_map.end())
table = 2;
table = 1;
} else if (mdl_data->realAlias[i].aliasType == 2) /* time */
{
table = 1;
table = 2;
}
if(table)
{
Expand All @@ -397,13 +424,13 @@ void simulation_result_mat::generateDataInfo(int32_t* &dataInfo,
{
it = i_indx_map.find(mdl_data->integerAlias[i].nameID);
if (it != i_indx_map.end())
table = 1;
table = 2;
}
else if (mdl_data->integerAlias[i].aliasType == 1) /* parameter */
{
it = i_indx_parammap.find(mdl_data->integerAlias[i].nameID);
if (it != i_indx_map.end())
table = 2;
table = 1;
}
if(table)
{
Expand All @@ -430,13 +457,13 @@ void simulation_result_mat::generateDataInfo(int32_t* &dataInfo,
{
it = b_indx_map.find(mdl_data->booleanAlias[i].nameID);
if (it != b_indx_map.end())
table = 1;
table = 2;
}
else if (mdl_data->booleanAlias[i].aliasType == 1) /* parameter */
{
it = b_indx_parammap.find(mdl_data->booleanAlias[i].nameID);
if (it != b_indx_map.end())
table = 2;
table = 1;
}
if(table)
{
Expand Down Expand Up @@ -490,19 +517,19 @@ void simulation_result_mat::generateData_1(double* &data_1,
/* double variables */
for(i = 0; i < mdl_data->nParametersReal; ++i) {
data_1[offset+i] = mdl_data->realParameter[i].attribute.initial;
data_1[offset+i+cols] = mdl_data->realParameter[i].attribute.initial;
data_1[offset+i+cols] = mdl_data->realParameter[i].attribute.initial;
}
offset += mdl_data->nParametersReal;
/* integer variables */
for(i = 0; i < mdl_data->nParametersInteger; ++i) {
data_1[offset+i] = (double)mdl_data->integerParameter[i].attribute.initial;
data_1[offset+i+cols] = (double)mdl_data->integerParameter[i].attribute.initial;
data_1[offset+i] = (double)mdl_data->integerParameter[i].attribute.initial;
data_1[offset+i+cols] = (double)mdl_data->integerParameter[i].attribute.initial;
}
offset += mdl_data->nParametersInteger;
/* bool variables */
for(i = 0; i < mdl_data->nParametersBoolean; ++i) {
data_1[offset+i] = (double)mdl_data->booleanParameter[i].attribute.initial;
data_1[offset+i+cols] = (double)mdl_data->booleanParameter[i].attribute.initial;
data_1[offset+i] = (double)mdl_data->booleanParameter[i].attribute.initial;
data_1[offset+i+cols] = (double)mdl_data->booleanParameter[i].attribute.initial;
}

}
Expand Up @@ -54,6 +54,7 @@ class simulation_result_mat : public simulation_result {
simulation_result_mat(const char* filename, double tstart, double tstop, MODEL_DATA *modelData);
virtual ~simulation_result_mat();
virtual void emit(_X_DATA *data);
void writeParameterData(MODEL_DATA *modelData);
virtual const char* result_type() {
/* return "Dymosim's compatible MAT-file"; */
return "mat";
Expand All @@ -63,8 +64,11 @@ class simulation_result_mat : public simulation_result {

private:
std::ofstream fp;
std::ofstream::pos_type data1HdrPos; // position of data_1 matrix's header in a file
std::ofstream::pos_type data2HdrPos; /* position of data_2 matrix's header in a file */
unsigned long ntimepoints; /* count of how many time emits() was called */
double startTime; // the start time
double stopTime; // the stop time

typedef map<int,int> INTMAP;

Expand Down
Expand Up @@ -54,6 +54,7 @@ void printPltLine(FILE* f, double time, double val);
simulation_result_plt(const char* filename, long numpoints, MODEL_DATA *modeldata);
virtual ~simulation_result_plt();
virtual void emit(_X_DATA *data);
void writeParameterData(MODEL_DATA *modelData) { /* do nothing */ };
virtual const char* result_type() {return "plt";};

};
Expand Down
50 changes: 31 additions & 19 deletions SimulationRuntime/c/simulation/simulation_input_xml.cpp
Expand Up @@ -719,12 +719,12 @@ void read_input_xml(int argc, char **argv,

string aliasTmp;
read_value(mi.rAli[i]["alias"], &aliasTmp);
if (aliasTmp.compare("alias") == 1){
modelData->realAlias[i].negate = 0;
}else{
if (aliasTmp.compare("negatedAlias") == 0){
modelData->realAlias[i].negate = 1;
}else{
modelData->realAlias[i].negate = 0;
}
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file",modelData->realAlias[i].info.name,modelData->realAlias[i].negate);
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file", modelData->realAlias[i].info.name, modelData->realAlias[i].negate);

read_value(mi.rAli[i]["aliasVariable"], &aliasTmp);

Expand All @@ -742,7 +742,10 @@ void read_input_xml(int argc, char **argv,
}else{
THROW("Alias variable not found.");
}
DEBUG_INFO2(LOG_DEBUG," read for %s aliasID %d from init file",modelData->realAlias[i].info.name,modelData->realAlias[i].nameID);
DEBUG_INFO3(LOG_DEBUG," read for %s aliasID %d from %s from init file",
modelData->realAlias[i].info.name,
modelData->realAlias[i].nameID,
modelData->realAlias[i].aliasType?((modelData->realAlias[i].aliasType==2)?"time":"real parameters"):"real variables");

}

Expand Down Expand Up @@ -774,10 +777,10 @@ void read_input_xml(int argc, char **argv,

string aliasTmp;
read_value(mi.iAli[i]["alias"], &aliasTmp);
if (aliasTmp.compare("alias") == 1){
modelData->integerAlias[i].negate = 0;
}else{
if (aliasTmp.compare("negatedAlias") == 0){
modelData->integerAlias[i].negate = 1;
}else{
modelData->integerAlias[i].negate = 0;
}
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file",modelData->integerAlias[i].info.name,modelData->integerAlias[i].negate);

Expand All @@ -795,7 +798,10 @@ void read_input_xml(int argc, char **argv,
}else{
THROW("Alias variable not found.");
}
DEBUG_INFO2(LOG_DEBUG," read for %s aliasID %d from init file",modelData->integerAlias[i].info.name,modelData->integerAlias[i].nameID);
DEBUG_INFO3(LOG_DEBUG," read for %s aliasID %d from %s from init file",
modelData->integerAlias[i].info.name,
modelData->integerAlias[i].nameID,
modelData->integerAlias[i].aliasType?"integer parameters":"integer variables");

}

Expand Down Expand Up @@ -827,12 +833,12 @@ void read_input_xml(int argc, char **argv,

string aliasTmp;
read_value(mi.bAli[i]["alias"], &aliasTmp);
if (aliasTmp.compare("alias") == 1){
modelData->booleanAlias[i].negate = 0;
}else{
if (aliasTmp.compare("negatedAlias") == 0){
modelData->booleanAlias[i].negate = 1;
}else{
modelData->booleanAlias[i].negate = 0;
}
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file",modelData->booleanAlias[i].info.name,modelData->booleanAlias[i].negate);
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file", modelData->booleanAlias[i].info.name, modelData->booleanAlias[i].negate);

read_value(mi.bAli[i]["aliasVariable"], &aliasTmp);

Expand All @@ -848,7 +854,10 @@ void read_input_xml(int argc, char **argv,
}else{
THROW("Alias variable not found.");
}
DEBUG_INFO2(LOG_DEBUG," read for %s aliasID %d from init file",modelData->booleanAlias[i].info.name,modelData->booleanAlias[i].nameID);
DEBUG_INFO3(LOG_DEBUG, " read for %s aliasID %d from %s from init file",
modelData->booleanAlias[i].info.name,
modelData->booleanAlias[i].nameID,
modelData->booleanAlias[i].aliasType?"boolean parameters":"boolean variables");

}

Expand Down Expand Up @@ -881,12 +890,12 @@ void read_input_xml(int argc, char **argv,

string aliasTmp;
read_value(mi.sAli[i]["alias"], &aliasTmp);
if (aliasTmp.compare("alias") == 1){
modelData->stringAlias[i].negate = 0;
}else{
if (aliasTmp.compare("negatedAlias") == 0){
modelData->stringAlias[i].negate = 1;
}else{
modelData->stringAlias[i].negate = 0;
}
DEBUG_INFO2(LOG_DEBUG," read for %s negated %d from init file",modelData->stringAlias[i].info.name,modelData->stringAlias[i].negate);
DEBUG_INFO2(LOG_DEBUG, " read for %s negated %d from init file", modelData->stringAlias[i].info.name, modelData->stringAlias[i].negate);

read_value(mi.sAli[i]["aliasVariable"], &aliasTmp);

Expand All @@ -902,7 +911,10 @@ void read_input_xml(int argc, char **argv,
}else{
THROW("Alias variable not found.");
}
DEBUG_INFO2(LOG_DEBUG," read for %s aliasID %d from init file",modelData->stringAlias[i].info.name,modelData->stringAlias[i].nameID);
DEBUG_INFO3(LOG_DEBUG," read for %s aliasID %d from %s from init file",
modelData->stringAlias[i].info.name,
modelData->stringAlias[i].nameID,
modelData->stringAlias[i].aliasType?"string parameters":"string variables");

}

Expand Down
10 changes: 8 additions & 2 deletions SimulationRuntime/c/simulation/simulation_runtime.cpp
Expand Up @@ -262,7 +262,7 @@ storeExtrapolationDataEvent()
void overwriteOldSimulationData(_X_DATA *data)
{
long i;

for(i=1; i<ringBufferLength(data->simulationData); ++i){
data->localData[i]->timeValue = data->localData[i-1]->timeValue;
memcpy(data->localData[i]->realVars, data->localData[i-1]->realVars, sizeof(modelica_real)*data->modelData.nVariablesReal);
Expand Down Expand Up @@ -565,7 +565,7 @@ callSolver(_X_DATA* simData, string method, string outputFormat,
} else if (0 == strcmp("csv", outputFormat.c_str())) {
sim_result = new simulation_result_csv(result_file_cstr.c_str(), maxSteps,&(simData->modelData));
} else if (0 == strcmp("mat", outputFormat.c_str())) {
sim_result = new simulation_result_mat(result_file_cstr.c_str(), start, stop,&(simData->modelData));
sim_result = new simulation_result_mat(result_file_cstr.c_str(), simData->simulationInfo.startTime, simData->simulationInfo.stopTime,&(simData->modelData));
} else if (0 == strcmp("plt", outputFormat.c_str())) {
sim_result = new simulation_result_plt(result_file_cstr.c_str(), maxSteps,&(simData->modelData));
} else {
Expand Down Expand Up @@ -800,3 +800,9 @@ void sim_result_emit(_X_DATA *data)
{
if (sim_result) sim_result->emit(data);
}

/* C-Interface for sim_result->writeParameterData(); */
void sim_result_writeParameterData(MODEL_DATA *modelData)
{
if (sim_result) sim_result->writeParameterData(modelData);
}
1 change: 1 addition & 0 deletions SimulationRuntime/c/simulation/simulation_runtime.h
Expand Up @@ -97,6 +97,7 @@ extern Socket sim_communication_port;
extern "C" {
#endif /* cplusplus */
void sim_result_emit(_X_DATA *data);
void sim_result_writeParameterData(MODEL_DATA *modelData);
#ifdef __cplusplus
}
#endif /* cplusplus */
Expand Down

0 comments on commit 7d94895

Please sign in to comment.