Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit b610cb9

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Do not store time in the data_1 matrix
Also changed the number of rows in the data_1 matrix to 1 instead of 2. Previously, startTime/stopTtime was stored in the data_1 matrix, but this is not really necessary. Belonging to [master]: - #1920 - OpenModelica/OpenModelica-testsuite#749
1 parent 2f8fe8e commit b610cb9

File tree

4 files changed

+102
-64
lines changed

4 files changed

+102
-64
lines changed

SimulationRuntime/c/simulation/results/simulation_result_mat.cpp

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,10 @@ void mat4_writeParameterData(simulation_result *self,DATA *data, threadData_t *t
256256
generateData_1(data, threadData, doubleMatrix, rows, cols, matData->startTime, matData->stopTime);
257257
/* write `data_1' matrix */
258258
mat_writeMatVer4Matrix(self,data, threadData,"data_1", cols, rows, doubleMatrix, MAT4_DOUBLE_PRECISION_FULL_MATRIX);
259-
free(doubleMatrix); doubleMatrix = NULL;
259+
if (doubleMatrix) {
260+
free(doubleMatrix);
261+
doubleMatrix = NULL;
262+
}
260263
matData->fp.seekp(remember);
261264
} catch(...) {
262265
matData->fp.close();
@@ -333,17 +336,22 @@ void mat4_init(simulation_result *self,DATA *data, threadData_t *threadData)
333336
matData->r_indx_map.size() + matData->i_indx_map.size() + matData->b_indx_map.size() + matData->negatedboolaliases + 1 /* add one more for timeValue*/ + self->cpuTime + /* add one more for solverSteps*/ + omc_flag[FLAG_SOLVER_STEPS] + nSensitivities, 0,
334337
omc_flag[FLAG_SINGLE_PRECISION] ? MAT4_SINGLE_PRECISION_FULL_MATRIX : MAT4_DOUBLE_PRECISION_FULL_MATRIX);
335338

336-
free(doubleMatrix);
339+
if (doubleMatrix) {
340+
free(doubleMatrix);
341+
doubleMatrix = NULL;
342+
}
337343
free(intMatrix);
338-
doubleMatrix = NULL;
339344
intMatrix = NULL;
340345
matData->fp.flush();
341346

342347
} catch(...) {
343348
matData->fp.close();
344349
free(names); names=NULL;
345350
free(stringMatrix);
346-
free(doubleMatrix);
351+
if (doubleMatrix) {
352+
free(doubleMatrix);
353+
doubleMatrix = NULL;
354+
}
347355
free(intMatrix);
348356
rt_accumulate(SIM_TIMER_OUTPUT);
349357
throwStreamPrint(threadData, "Error while writing mat file %s",self->filename);
@@ -558,7 +566,6 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
558566
/* assign rows & cols */
559567
rows = nVars + nParams;
560568
cols = 4;
561-
562569
dataInfo = (int*) calloc(rows*cols,sizeof(int));
563570
assertStreamPrint(threadData, 0!=dataInfo,"Cannot alloc memory");
564571
/* continuous and discrete variables, including time */
@@ -593,7 +600,7 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
593600
if(it != matData->r_indx_parammap.end())
594601
{
595602
table = 1;
596-
aliascol = it->second+1;
603+
aliascol = it->second;
597604
}
598605
} else if(mdl_data->realAlias[i].aliasType == 2) /* time */
599606
{
@@ -612,7 +619,7 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
612619
/* row 3 - linear interpolation == 0 */
613620
dataInfo[ccol+2] = 0;
614621
/* row 4 - not defined outside of the defined time range == -1 */
615-
dataInfo[ccol+3] = -1;
622+
dataInfo[ccol+3] = mdl_data->realAlias[i].aliasType == 1 ? 0 : -1;
616623
ccol += 4;
617624
}
618625
}
@@ -624,24 +631,28 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
624631
if(mdl_data->integerAlias[i].aliasType == 0) /* variable */
625632
{
626633
it = matData->i_indx_map.find(mdl_data->integerAlias[i].nameID);
627-
if(it != matData->i_indx_map.end())
634+
if(it != matData->i_indx_map.end()) {
628635
table = 2;
636+
}
637+
aliascol = it->second+1;
629638
}
630639
else if(mdl_data->integerAlias[i].aliasType == 1) /* parameter */
631640
{
632641
it = matData->i_indx_parammap.find(mdl_data->integerAlias[i].nameID);
633-
if(it != matData->i_indx_parammap.end())
642+
if(it != matData->i_indx_parammap.end()) {
634643
table = 1;
644+
}
645+
aliascol = it->second;
635646
}
636647
if(table)
637648
{
638649
/* row 1 - which table */
639650
dataInfo[ccol] = table;
640651
/* row 2 - index of var in table */
641652
if(mdl_data->integerAlias[i].negate)
642-
dataInfo[ccol+1] = -(it->second+1);
653+
dataInfo[ccol+1] = -aliascol;
643654
else
644-
dataInfo[ccol+1] = it->second+1;
655+
dataInfo[ccol+1] = aliascol;
645656
/* row 3 - linear interpolation == 0 */
646657
dataInfo[ccol+2] = 0;
647658
/* row 4 - not defined outside of the defined time range == -1 */
@@ -662,28 +673,31 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
662673
if(mdl_data->booleanAlias[i].aliasType == 0) /* variable */
663674
{
664675
it = matData->b_indx_map.find(mdl_data->booleanAlias[i].nameID);
665-
if(it != matData->b_indx_map.end())
676+
if(it != matData->b_indx_map.end()) {
666677
table = 2;
678+
}
679+
aliascol = it->second+1;
667680
}
668681
else if(mdl_data->booleanAlias[i].aliasType == 1) /* parameter */
669682
{
670683
it = matData->b_indx_parammap.find(mdl_data->booleanAlias[i].nameID);
671-
if(it != matData->b_indx_parammap.end())
684+
if(it != matData->b_indx_parammap.end()) {
672685
table = 1;
686+
}
687+
aliascol = it->second;
673688
}
674689
}
675690
if(table)
676691
{
677692
/* row 1 - which table */
678693
dataInfo[ccol] = table;
679694
/* row 2 - index of var in table */
680-
if(mdl_data->booleanAlias[i].negate)
681-
{
695+
if(mdl_data->booleanAlias[i].negate) {
682696
dataInfo[ccol+1] = indx;
683697
indx++;
698+
} else {
699+
dataInfo[ccol+1] = aliascol;
684700
}
685-
else
686-
dataInfo[ccol+1] = it->second+1;
687701
/* row 3 - linear interpolation == 0 */
688702
dataInfo[ccol+2] = 0;
689703
/* row 4 - not defined outside of the defined time range == -1 */
@@ -696,13 +710,12 @@ static void generateDataInfo(simulation_result *self, DATA *data, threadData_t *
696710
for(size_t i = 0; i < (size_t)nParams; ++i) {
697711
/* col 1 - which table */
698712
dataInfo[ccol+4*i] = 1;
699-
/* col 2 - index of var in the table (first parameter has index 2) */
700-
dataInfo[ccol+4*i+1] = i+2;
713+
/* col 2 - index of var in the table (first parameter has index 1) */
714+
dataInfo[ccol+4*i+1] = i+1;
701715
/* col 3 (== 0 <- interpolation doesn't matter here) */
702716
dataInfo[ccol+4*i+2] = 0;
703717
/* col 4 - keep first/last value outside of time range */
704718
dataInfo[ccol+4*i+3] = 0;
705-
706719
}
707720
/* ccol += mdl_data->nParameters*4; */
708721
}
@@ -712,47 +725,47 @@ static void generateData_1(DATA *data, threadData_t *threadData, double* &data_1
712725
const SIMULATION_INFO *sInfo = data->simulationInfo;
713726
const MODEL_DATA *mData = data->modelData;
714727

715-
int offset = 1;
728+
int offset = 0;
716729
long i = 0;
717730

718731
/* calculate number of rows and columns */
719-
rows = 2;
720-
cols = 1 + mData->nParametersReal +
721-
mData->nParametersInteger +
722-
mData->nParametersBoolean;
732+
cols = mData->nParametersReal +
733+
mData->nParametersInteger +
734+
mData->nParametersBoolean;
735+
if (cols) {
736+
rows = 1;
737+
} else {
738+
rows = 0;
739+
}
723740

724741
/* allocate data buffer */
725-
data_1 = (double*)calloc(rows*cols, sizeof(double));
726-
assertStreamPrint(threadData, 0!=data_1, "Malloc failed");
727-
data_1[0] = tstart; /* start time */
728-
data_1[cols] = tstop; /* stop time */
742+
if (rows) {
743+
data_1 = (double*)calloc(rows*cols, sizeof(double));
744+
assertStreamPrint(threadData, 0!=data_1, "Malloc failed");
745+
} else {
746+
data_1 = NULL;
747+
}
729748

730749
/* double variables */
731-
for(i = 0; i < mData->nParametersReal; ++i)
732-
{
750+
for(i = 0; i < mData->nParametersReal; ++i) {
733751
if (!mData->realParameterData[i].filterOutput) {
734752
data_1[offset] = sInfo->realParameter[i];
735-
data_1[offset+cols] = sInfo->realParameter[i];
736753
offset ++;
737754
}
738755
}
739756

740757
/* integer variables */
741-
for(i = 0; i < mData->nParametersInteger; ++i)
742-
{
758+
for(i = 0; i < mData->nParametersInteger; ++i) {
743759
if (!mData->integerParameterData[i].filterOutput) {
744760
data_1[offset] = (double)sInfo->integerParameter[i];
745-
data_1[offset+cols] = (double)sInfo->integerParameter[i];
746761
offset ++;
747762
}
748763
}
749764

750765
/* bool variables */
751-
for(i = 0; i < mData->nParametersBoolean; ++i)
752-
{
766+
for(i = 0; i < mData->nParametersBoolean; ++i) {
753767
if (!mData->booleanParameterData[i].filterOutput) {
754768
data_1[offset] = (double)sInfo->booleanParameter[i];
755-
data_1[offset+cols] = (double)sInfo->booleanParameter[i];
756769
offset ++;
757770
}
758771
}

SimulationRuntime/c/simulation/solver/initialization/initialization.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -413,13 +413,10 @@ int importStartValues(DATA *data, threadData_t *threadData, const char *pInitFil
413413
}
414414

415415
pError = omc_new_matlab4_reader(pInitFile, &reader);
416-
if(pError)
417-
{
416+
if(pError) {
418417
throwStreamPrint(threadData, "unable to read input-file <%s> [%s]", pInitFile, pError);
419418
return 1;
420-
}
421-
else
422-
{
419+
} else {
423420
infoStreamPrint(LOG_INIT, 0, "import real variables");
424421
for(i=0; i<mData->nVariablesReal; ++i) {
425422
pVar = omc_matlab4_find_var(&reader, mData->realVarsData[i].info.name);
@@ -429,7 +426,6 @@ int importStartValues(DATA *data, threadData_t *threadData, const char *pInitFil
429426
pVar = omc_matlab4_find_var(&reader, newVarname);
430427
free(newVarname);
431428
}
432-
433429
if(pVar) {
434430
omc_matlab4_val(&(mData->realVarsData[i].attribute.start), &reader, pVar, initTime);
435431
infoStreamPrint(LOG_INIT, 0, "| %s(start=%g)", mData->realVarsData[i].info.name, mData->realVarsData[i].attribute.start);

SimulationRuntime/c/util/read_matlab4.c

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ static int read_int32(int type, size_t n, FILE *file, int32_t *val)
195195
static int read_double(int type, size_t n, FILE *file, double *val)
196196
{
197197
int p = (type%100)/10;
198+
if (n==0) {
199+
return 0;
200+
}
198201
if (p == 0) { /* Double */
199202
return fread(val,n*sizeof(double),1,file) != 1;
200203
} else if (p == 1) { /* float */
@@ -227,6 +230,7 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
227230
if(!reader->file) return strerror(errno);
228231
reader->fileName = strdup(filename);
229232
reader->readAll = 0;
233+
reader->stopTime = NAN;
230234
for(i=0; i<nMatrix;i++) {
231235
MHeader_t hdr;
232236
int nr = fread(&hdr,sizeof(MHeader_t),1,reader->file);
@@ -388,24 +392,24 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
388392
case 4: { /* "data_1" */
389393
unsigned int k;
390394
if(binTrans==1) {
391-
if(hdr.mrows == 0) return "data_1 matrix does not contain at least 1 variable";
392-
if(hdr.ncols != 2 && hdr.ncols != 1) return "data_1 matrix does not have 1 or 2 cols";
395+
if(hdr.mrows != 0 || hdr.ncols != 0) {
396+
if(hdr.ncols != 2 && hdr.ncols != 1) return "data_1 matrix does not have 1 or 2 cols (or 0 rows/columns)";
397+
}
393398
reader->nparam = hdr.mrows;
394-
reader->params = (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double));
399+
reader->params = reader->nparam > 0 ? (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double)) : NULL;
395400
if (read_double(hdr.type, hdr.mrows*hdr.ncols, reader->file, reader->params)) {
396401
return "Corrupt header: data_1 matrix";
397402
}
398-
/* fprintf(stderr, " startTime = %.6g\n", reader->params[0]);
399-
* fprintf(stderr, " stopTime = %.6g\n", reader->params[1]); */
400403
}
401404
if(binTrans==0) {
402405
unsigned int j;
403-
if(hdr.ncols == 0) return "data_1 matrix does not contain at least 1 variable";
404-
if(hdr.mrows != 2 && hdr.mrows != 1) return "data_1 matrix does not have 1 or 2 rows";
406+
if(hdr.mrows != 0 || hdr.ncols != 0) {
407+
if(hdr.mrows != 2 && hdr.mrows != 1) return "data_1 matrix does not have 1 or 2 rows (or 0 rows/columns)";
408+
}
405409
reader->nparam = hdr.ncols;
406410
double *tmp=NULL;
407-
tmp = (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double));
408-
reader->params = (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double));
411+
tmp = reader->nparam > 0 ? (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double)) : NULL;
412+
reader->params = reader->nparam > 0 ? (double*) malloc(hdr.mrows*hdr.ncols*sizeof(double)) : NULL;
409413
if (read_double(hdr.type, hdr.mrows*hdr.ncols, reader->file, tmp)) {
410414
return "Corrupt header: data_1 matrix";
411415
}
@@ -414,10 +418,9 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
414418
reader->params[k*hdr.ncols+j] = tmp[k +j*hdr.mrows];
415419
}
416420
}
417-
free(tmp);
418-
}
419-
for(k=1; k<reader->nparam; k++) {
420-
if(hdr.mrows == 2 && reader->params[k] != reader->params[k+reader->nparam]) return "data_1 matrix contained parameter that changed between start and stop-time";
421+
if (tmp) {
422+
free(tmp);
423+
}
421424
}
422425
break;
423426
}
@@ -769,14 +772,30 @@ void find_closest_points(double key, double *vec, int nelem, int *index1, double
769772
*weight2 = 1.0 - *weight1;
770773
}
771774

775+
static void read_start_stop_time(ModelicaMatReader *reader)
776+
{
777+
double *d = omc_matlab4_read_vals(reader, 1);
778+
if (d==NULL) {
779+
return;
780+
}
781+
reader->startTime = d[0];
782+
reader->stopTime = d[reader->nrows-1];
783+
}
784+
772785
double omc_matlab4_startTime(ModelicaMatReader *reader)
773786
{
774-
return reader->params[0];
787+
if (reader->startTime != reader->startTime /* NaN */) {
788+
read_start_stop_time(reader);
789+
}
790+
return reader->startTime;
775791
}
776792

777793
double omc_matlab4_stopTime(ModelicaMatReader *reader)
778794
{
779-
return reader->params[reader->nparam];
795+
if (reader->stopTime != reader->stopTime /* NaN */) {
796+
read_start_stop_time(reader);
797+
}
798+
return reader->stopTime;
780799
}
781800

782801
/* Returns 0 on success */
@@ -790,9 +809,18 @@ int omc_matlab4_val(double *res, ModelicaMatReader *reader, ModelicaMatVariable_
790809
} else {
791810
double w1,w2,y1,y2;
792811
int i1,i2;
793-
if(time > omc_matlab4_stopTime(reader)) return 1;
794-
if(time < omc_matlab4_startTime(reader)) return 1;
795-
if(!omc_matlab4_read_vals(reader,1)) return 1;
812+
if(time > omc_matlab4_stopTime(reader)) {
813+
*res = NAN;
814+
return 1;
815+
}
816+
if(time < omc_matlab4_startTime(reader)) {
817+
*res = NAN;
818+
return 1;
819+
}
820+
if(!omc_matlab4_read_vals(reader,1)) {
821+
*res = NAN;
822+
return 1;
823+
}
796824
find_closest_points(time, reader->vars[0], reader->nrows, &i1, &w1, &i2, &w2);
797825
if(i2 == -1) {
798826
return (int)omc_matlab4_read_single_val(res,reader,var->index,i1);

SimulationRuntime/c/util/read_matlab4.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ typedef struct {
4848
uint32_t nall;
4949
ModelicaMatVariable_t *allInfo; /* Sorted array of variables and their associated information */
5050
uint32_t nparam;
51-
double *params; /* This has size 2*nparam; the first parameter has row0=startTime,row1=stopTime. Other variables are stored as row0=row1 */
51+
double startTime, stopTime;
52+
double *params; /* This has size nparam */
5253
uint32_t nvar,nrows;
5354
size_t var_offset; /* This is the offset in the file */
5455
int readAll; /* Read all variables already */
@@ -88,8 +89,8 @@ int omc_matlab4_read_vars_val(double *res, ModelicaMatReader *reader, ModelicaMa
8889
void omc_matlab4_print_all_vars(FILE *stream, ModelicaMatReader *reader);
8990

9091
double omc_matlab4_startTime(ModelicaMatReader *reader);
91-
9292
double omc_matlab4_stopTime(ModelicaMatReader *reader);
93+
9394
void matrix_transpose(double *m, int w, int h);
9495
void matrix_transpose_uint32(uint32_t *m, int w, int h);
9596
int omc_matlab4_read_all_vals(ModelicaMatReader *reader);

0 commit comments

Comments
 (0)