Skip to content

Commit

Permalink
Handle mixed OMC and Dymola names better
Browse files Browse the repository at this point in the history
  • Loading branch information
sjoelund committed May 11, 2015
1 parent 7023616 commit 723695e
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 129 deletions.
7 changes: 6 additions & 1 deletion Compiler/FrontEnd/ModelicaBuiltin.mo
Expand Up @@ -2606,9 +2606,14 @@ end readSimulationResultSize;
function readSimulationResultVars "Returns the variables in the simulation file; you can use val() and plot() commands using these names."
input String fileName;
input Boolean readParameters = true;
input Boolean openmodelicaStyle = false;
output String[:] vars;
external "builtin";
annotation(preferredView="text");
annotation(Documentation(info="<html>
<p>Takes one simulation results file and returns the variables stored in it.</p>
<p>If readParameters is true, parameter names are returned.</p>
<p>If openmodelicaStyle is true, the stored variable names are converted to the canonical form used by OpenModelica variables (a.der(b) becomes der(a.b), and so on).</p>
</html>"),preferredView="text");
end readSimulationResultVars;

public function filterSimulationResults
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Script/CevalScript.mo
Expand Up @@ -2868,12 +2868,12 @@ algorithm
then
(cache,Values.INTEGER(i),st);

case (cache,_,"readSimulationResultVars",{Values.STRING(filename),Values.BOOL(b)},st,_)
case (cache,_,"readSimulationResultVars",{Values.STRING(filename),Values.BOOL(b1),Values.BOOL(b2)},st,_)
equation
pwd = System.pwd();
pd = System.pathDelimiter();
filename_1 = if System.strncmp("/",filename,1)==0 then filename else stringAppendList({pwd,pd,filename});
args = SimulationResults.readVariables(filename_1,b);
args = SimulationResults.readVariables(filename_1, b1, b2);
vals = List.map(args, ValuesUtil.makeString);
v = ValuesUtil.makeArray(vals);
then
Expand Down
5 changes: 3 additions & 2 deletions Compiler/Util/SimulationResults.mo
Expand Up @@ -50,10 +50,11 @@ end val;

public function readVariables
input String filename;
input Boolean readParameters;
input Boolean readParameters = true;
input Boolean openmodelicaStyle = false;
output list<String> vars;

external "C" vars=SimulationResults_readVariables(filename,readParameters) annotation(Library = "omcruntime");
external "C" vars=SimulationResults_readVariables(filename, readParameters, openmodelicaStyle) annotation(Library = "omcruntime");
end readVariables;

public function readDataset
Expand Down
25 changes: 20 additions & 5 deletions Compiler/runtime/SimulationResults.c
Expand Up @@ -231,7 +231,22 @@ static int SimulationResultsImpl__readSimulationResultSize(const char *filename,
}
}

static void* SimulationResultsImpl__readVars(const char *filename, int readParameters, SimulationResult_Globals* simresglob)
static void* makeOMCStyle(const char *var, int omcStyle)
{
char *res1 = NULL;
const char *res2 = NULL;
if (!omcStyle) {
return mmc_mk_scon(var);
}
res1 = openmodelicaStyleVariableName(var);
res2 = _replace(res1 ? res1 : var, " ", "");
if (res1 == NULL) {
free(res1);
}
return mmc_mk_scon(res2);
}

static void* SimulationResultsImpl__readVars(const char *filename, int readParameters, int omcStyle, SimulationResult_Globals* simresglob)
{
const char *msg[2] = {"",""};
void *res;
Expand All @@ -244,21 +259,21 @@ static void* SimulationResultsImpl__readVars(const char *filename, int readParam
int i;
for (i=simresglob->matReader.nall-1; i>=0; i--) {
if (readParameters || !simresglob->matReader.allInfo[i].isParam) {
res = mmc_mk_cons(mmc_mk_scon(simresglob->matReader.allInfo[i].name),res);
res = mmc_mk_cons(makeOMCStyle(simresglob->matReader.allInfo[i].name, omcStyle),res);
}
}
return res;
}
case PLT: {
return read_ptolemy_variables(filename);
return read_ptolemy_variables(filename /* Assume it is in OMC style */);
}
case CSV: {
if (simresglob->csvReader && simresglob->csvReader->variables) {
char **variables = simresglob->csvReader->variables;
int i;
for (i=simresglob->csvReader->numvars-1; i>=0; i--) {
if (variables[i][0] != '\0') {
res = mmc_mk_cons(mmc_mk_scon(variables[i]),res);
res = mmc_mk_cons(makeOMCStyle(variables[i], omcStyle),res);
}
}
}
Expand Down Expand Up @@ -297,7 +312,7 @@ static void* SimulationResultsImpl__readVarsFilterAliases(const char *filename,
free(vars);
return res;
}
default: return SimulationResultsImpl__readVars(filename, 0, simresglob);
default: return SimulationResultsImpl__readVars(filename, 0, 0, simresglob);
}
}

Expand Down
125 changes: 43 additions & 82 deletions Compiler/runtime/SimulationResultsCmp.c
Expand Up @@ -66,56 +66,6 @@ typedef struct {
static SimulationResult_Globals simresglob_c = {UNKNOWN_PLOT,0};
static SimulationResult_Globals simresglob_ref = {UNKNOWN_PLOT,0};

/* from an array of string creates flatten 'char*'-array suitable to be */
/* stored as MAT-file matrix */
static inline void fixDerInName(char *str, size_t len)
{
size_t i;
char* dot;
if (len < 6) return;

/* check if name start with "der(" and includes at least one dot */
while (strncmp(str,"der(",4) == 0 && (dot = strrchr(str,'.')) != NULL) {
size_t pos = (size_t)(dot-str)+1;
/* move prefix to the begining of string :"der(a.b.c.d)" -> "a.b.c.b.c.d)" */
for(i = 4; i < pos; ++i)
str[i-4] = str[i];
/* move "der(" to the end of prefix
"a.b.c.b.c.d)" -> "a.b.c.der(d)" */
strncpy(&str[pos-4],"der(",4);
}
}

static inline void fixCommaInName(char **str, size_t len)
{
size_t nc;
unsigned int j,k;
char* newvar;
if (len < 2) return;

nc = 0;
for (j=0;j<len;j++)
if ((*str)[j] ==',' )
nc +=1;

if (nc > 0) {

newvar = (char*) malloc(len+nc+10);
k = 0;
for (j=0;j<len;j++) {
newvar[k] = (*str)[j];
k +=1;
if ((*str)[j] ==',' ) {
newvar[k] = ' ';
k +=1;
}
}
newvar[k] = 0;
free(*str);
*str = newvar;
}
}

static char ** getVars(void *vars, unsigned int* nvars)
{
char **cmpvars = NULL;
Expand Down Expand Up @@ -602,20 +552,20 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
/* open files */
/* fprintf(stderr, "Open File %s\n", filename); */
if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,&simresglob_c)) {
char *str = (char*) malloc(25+strlen(filename));
char *str = (char*) GC_malloc(25+strlen(filename));
*str = 0;
strcat(strcat(str,"Error opening file: "), filename);
void *res = mmc_mk_scon(str);
free(str);
GC_free(str);
return mmc_mk_cons(res,mmc_mk_nil());
}
/* fprintf(stderr, "Open File %s\n", reffilename); */
if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(reffilename,&simresglob_ref)) {
char *str = (char*) malloc(35+strlen(reffilename));
char *str = (char*) GC_malloc(35+strlen(reffilename));
*str = 0;
strcat(strcat(str,"Error opening reference file: "), reffilename);
void *res = mmc_mk_scon(str);
free(str);
GC_free(str);
return mmc_mk_cons(res,mmc_mk_nil());
}

Expand Down Expand Up @@ -652,7 +602,7 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
if (timeref.n==0) {
return mmc_mk_cons(mmc_mk_scon("Error get ref time!"),mmc_mk_nil());
}
cmpdiffvars = (char**)malloc(sizeof(char*)*(ncmpvars));
cmpdiffvars = (char**)GC_malloc(sizeof(char*)*(ncmpvars));
/* check if time is larger or less reftime */
res = mmc_mk_nil();
if (fabs(time.data[time.n-1]-timeref.data[timeref.n-1]) > reltol*fabs(timeref.data[timeref.n-1])) {
Expand All @@ -672,8 +622,11 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
for (i=0;i<ncmpvars;i++) {
var = cmpvars[i];
len = strlen(var);
if (var1) free(var1);
var1 = (char*) malloc(len+10);
if (var1) {
free(var1);
var1 = NULL;
}
var1 = (char*) GC_malloc(len+10);
k = 0;
for (j=0;j<len;j++) {
if (var[j] !='\"' ) {
Expand All @@ -686,34 +639,34 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
/* check if in ref_file */
dataref = getData(var1,reffilename,size_ref,suggestReadAll,&simresglob_ref,runningTestsuite);
if (dataref.n==0) {
if (var2) free(var2);
var2 = (char*) malloc(len+10);
strncpy(var2,var1,len+1);
fixDerInName(var2,len);
fixCommaInName(&var2,len);
dataref = getData(var2,reffilename,size_ref,suggestReadAll,&simresglob_ref,runningTestsuite);
if (dataref.n==0) {
msg[0] = runningTestsuite ? SystemImpl__basename(reffilename) : reffilename;
msg[1] = var;
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("Get data of variable %s from file %s failed!\n"), msg, 2);
ngetfailedvars++;
continue;
if (dataref.data) {
free(dataref.data);
}
if (var1) {
GC_free(var1);
var1 = NULL;
}
msg[0] = runningTestsuite ? SystemImpl__basename(reffilename) : reffilename;
msg[1] = var;
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("Get data of variable %s from file %s failed!\n"), msg, 2);
ngetfailedvars++;
continue;
}
/* check if in file */
data = getData(var1,filename,size,suggestReadAll,&simresglob_c,runningTestsuite);
if (data.n==0) {
fixDerInName(var1,len);
fixCommaInName(&var1,len);
data = getData(var1,filename,size,suggestReadAll,&simresglob_c,runningTestsuite);
if (data.n==0) {
if (data.data) free(data.data);
msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename;
msg[1] = var;
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("Get data of variable %s from file %s failed!\n"), msg, 2);
ngetfailedvars++;
continue;
if (data.data) {
free(data.data);
}
if (var1) {
GC_free(var1);
var1 = NULL;
}
msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename;
msg[1] = var;
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("Get data of variable %s from file %s failed!\n"), msg, 2);
ngetfailedvars++;
continue;
}
/* compare */
if (isHtml) {
Expand All @@ -724,8 +677,16 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
vardiffindx = cmpDataTubes(isResultCmp,var,&time,&timeref,&data,&dataref,reltol,rangeDelta,reltolDiffMaxMin,&ddf,cmpdiffvars,vardiffindx,keepEqualResults,&res,resultfilename,0,0);
}
/* free */
if (dataref.data) free(dataref.data);
if (data.data) free(data.data);
if (dataref.data) {
free(dataref.data);
}
if (data.data) {
free(data.data);
}
if (var1) {
GC_free(var1);
var1 = NULL;
}
}

if (isResultCmp) {
Expand Down Expand Up @@ -757,7 +718,7 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
if (cmpvars) GC_free(cmpvars);
if (time.data) free(time.data);
if (timeref.data) free(timeref.data);
if (cmpdiffvars) free(cmpdiffvars);
if (cmpdiffvars) GC_free(cmpdiffvars);
/* close files */
SimulationResultsImpl__close(&simresglob_c);
SimulationResultsImpl__close(&simresglob_ref);
Expand Down
4 changes: 2 additions & 2 deletions Compiler/runtime/SimulationResults_omc.c
Expand Up @@ -39,9 +39,9 @@
#include "SimulationResults.c"
#include "SimulationResultsCmp.c"

void* SimulationResults_readVariables(const char *filename, int readParameters)
void* SimulationResults_readVariables(const char *filename, int readParameters, int omcStyle)
{
return SimulationResultsImpl__readVars(filename,readParameters,&simresglob);
return SimulationResultsImpl__readVars(filename, readParameters, omcStyle, &simresglob);
}

extern void* _ValuesUtil_reverseMatrix(void*);
Expand Down
15 changes: 12 additions & 3 deletions Examples/BuildModelRecursive.mos
Expand Up @@ -178,10 +178,13 @@ if regularFileExists(compareVarsFile) then
vars := compareVars;
variableFilter := sum(stringReplace(stringReplace(s,\"[\",\".\"),\"]\",\".\") + \"|\" for s in vars) + \"time\";
numCompared := size(vars,1);
emit_protected := \" -emit_protected\";
elseif referenceExists then
vars := readSimulationResultVars(reference,readParameters=false);
variableFilter := sum(stringReplace(stringReplace(s,\"[\",\".\"),\"]\",\".\") + \"|\" for s in vars);
vars := readSimulationResultVars(reference, readParameters=true, openmodelicaStyle=true);
variableFilter := sum(stringReplace(stringReplace(stringReplace(stringReplace(s,\"[\",\".\"),\"]\",\".\"),\"(\",\".\"),\")\",\".\") + \"|\" for s in vars);
numCompared := size(vars,1);
emit_protected := \" -emit_protected\";
print(variableFilter + \"\n\");
else
variableFilter := \"\";
outputFormat := \"empty\";
Expand Down Expand Up @@ -223,7 +226,7 @@ timeDiff := -1.0;

OpenModelica.Scripting.Internal.Time.timerTick(OpenModelica.Scripting.Internal.Time.RT_CLOCK_USER_RESERVED);
buildRes := res[1] <> \"\";
simRes := if not buildRes then false else 0 == system(\"./"+s+" \"+simFlags+\" > \"+simFile+\" 2>&1\");
simRes := if not buildRes then false else 0 == system(\"./"+s+" \"+simFlags+emit_protected+\" > \"+simFile+\" 2>&1\");
if buildRes and javascript then
system(\"cp " + s + ".js " + s + "_info.xml " + s + "_init.xml " + s + ".md files/\");
end if;
Expand Down Expand Up @@ -270,7 +273,13 @@ if simRes then
prefix := \"files/"+s+".diff\";
if referenceExists then
OpenModelica.Scripting.Internal.Time.timerTick(OpenModelica.Scripting.Internal.Time.RT_CLOCK_USER_RESERVED);
getErrorString();
(referenceOK,diffVars) := diffSimulationResults(resFile,reference,prefix,relTol=reference_reltol,relTolDiffMinMax=reference_reltolDiffMinMax,rangeDelta=reference_rangeDelta);
errVerify := getErrorString();
if errVerify <> \"\" then
writeFile(errFile, \"\\nVariables in the reference:\"+sum(var+\",\" for var in OpenModelica.Scripting.readSimulationResultVars(reference, openmodelicaStyle=true)), append=true);
writeFile(errFile, \"\\nVariables in the result:\"+sum(var+\",\" for var in OpenModelica.Scripting.readSimulationResultVars(resFile))+\"\\n\" + errVerify, append=true);
end if;
if referenceOK then
system(\"touch "+s+".verifysuccess\");
end if;
Expand Down

0 comments on commit 723695e

Please sign in to comment.