Skip to content

Commit

Permalink
- Read matlab file with only 1 column for parameters (start and stop …
Browse files Browse the repository at this point in the history
…value are always the same; more compact format)

- Simulation results now look for the "time" or "Time" variable before it does lookup on it (avoids error-messages added if "Time" was used)


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14639 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Jan 3, 2013
1 parent 763925f commit f3e8ee3
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 19 deletions.
40 changes: 25 additions & 15 deletions Compiler/runtime/SimulationResultsCmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,19 +563,34 @@ int writeLogFile(const char *filename,DiffDataField *ddf,const char *f,const cha
return 0;
}

static const char* getTimeVarName(void *vars) {
const char *res = "time";
while (RML_NILHDR != RML_GETHDR(vars)) {
char *var = RML_STRINGDATA(RML_CAR(vars));
if (0==strcmp("time",var)) break;
if (0==strcmp("Time",var)) {
res="Time";
break;
}
vars = RML_CDR(vars);
}
return res;
}

void* SimulationResultsCmp_compareResults(const char *filename, const char *reffilename, const char *resultfilename, double reltol, double abstol, void *vars)
{
char **cmpvars=NULL;
char **cmpdiffvars=NULL;
unsigned int vardiffindx=0;
unsigned int ncmpvars = 0;
unsigned int ngetfailedvars = 0;
void *allvars,*res;
void *allvars,*allvarsref,*res;
unsigned int i,size,size_ref,len,oldlen,j,k;
char *var,*var1,*var2;
DataField time,timeref,data,dataref;
DiffDataField ddf;
const char *msg[2] = {"",""};
const char *timeVarName, *timeVarNameRef;
ddf.data=NULL;
ddf.n=0;
ddf.n_max=0;
Expand Down Expand Up @@ -610,9 +625,10 @@ void* SimulationResultsCmp_compareResults(const char *filename, const char *reff
/* get vars to compare */
cmpvars = getVars(vars,&ncmpvars);
/* if no var compare all vars */
allvars = SimulationResultsImpl__readVars(filename,&simresglob_ref);
allvarsref = SimulationResultsImpl__readVars(reffilename,&simresglob_ref);
if (ncmpvars==0){
allvars = SimulationResultsImpl__readVars(reffilename,&simresglob_ref);
cmpvars = getVars(allvars,&ncmpvars);
cmpvars = getVars(allvarsref,&ncmpvars);
if (ncmpvars==0) return mk_cons(mk_scon("Error Get Vars!"),mk_nil());
}
cmpdiffvars = (char**)malloc(sizeof(char*)*(ncmpvars));
Expand All @@ -623,24 +639,18 @@ void* SimulationResultsCmp_compareResults(const char *filename, const char *reff
#endif
/* get time */
/* fprintf(stderr, "get time\n"); */
time = getData("time",filename,size,&simresglob_c);
timeVarName = getTimeVarName(allvars);
timeVarNameRef = getTimeVarName(allvarsref);
time = getData(timeVarName,filename,size,&simresglob_c);
if (time.n==0)
{
time = getData("Time",filename,size,&simresglob_c);
if (time.n==0){
/* fprintf(stderr, "Cannot get var time\n"); */
return mk_cons(mk_scon("Error get time!"),mk_nil());
}
return mk_cons(mk_scon("Error get time!"),mk_nil());
}
/* fprintf(stderr, "get reftime\n"); */
timeref = getData("time",reffilename,size_ref,&simresglob_ref);
timeref = getData(timeVarNameRef,reffilename,size_ref,&simresglob_ref);
if (timeref.n==0)
{
timeref = getData("Time",reffilename,size_ref,&simresglob_ref);
if (timeref.n==0){
/* fprintf(stderr, "Cannot get var reftime\n"); */
return mk_cons(mk_scon("Error get ref time!"),mk_nil());
}
return mk_cons(mk_scon("Error get ref time!"),mk_nil());
}
/* check if reftime is larger or equal time */
res = mk_nil();
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/ar.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
ld -r -o "$@"
mv $1 $1.o
ar -ru $1 $1.o
rm $1.o
8 changes: 4 additions & 4 deletions SimulationRuntime/c/util/read_matlab4.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
if(binTrans==1) {
unsigned int k;
if(hdr.mrows == 0) return "data_1 matrix does not contain at least 1 variable";
if(hdr.ncols != 2) return "data_1 matrix does not have 2 rows";
if(hdr.ncols != 2 && hdr.ncols != 1) return "data_1 matrix does not have 1 or 2 cols";
reader->nparam = hdr.mrows;
if(reader->doublePrecision==1)
{
Expand All @@ -259,14 +259,14 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
/* fprintf(stderr, " startTime = %.6g\n", reader->params[0]);
* fprintf(stderr, " stopTime = %.6g\n", reader->params[1]); */
for(k=1; k<reader->nparam; k++) {
if(reader->params[k] != reader->params[k+reader->nparam]) return "data_1 matrix contained parameter that changed between start and stop-time";
if(hdr.ncols == 2 && reader->params[k] != reader->params[k+reader->nparam]) return "data_1 matrix contained parameter that changed between start and stop-time";
/* fprintf(stderr, " Parameter[%d] = %.6g\n", k, reader->params[k]); */
}
}
if(binTrans==0) {
unsigned int k,j;
if(hdr.ncols == 0) return "data_1 matrix does not contain at least 1 variable";
if(hdr.mrows != 2) return "data_1 matrix does not have 2 rows";
if(hdr.mrows != 2 && hdr.mrows != 1) return "data_1 matrix does not have 1 or 2 rows";
reader->nparam = hdr.ncols;
if(reader->doublePrecision==1)
{
Expand Down Expand Up @@ -295,7 +295,7 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
free(tmp);
}
for(k=1; k<reader->nparam; k++) {
if(reader->params[k] != reader->params[k+reader->nparam]) return "data_1 matrix contained parameter that changed between start and stop-time";
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";
}
}
break;
Expand Down

0 comments on commit f3e8ee3

Please sign in to comment.