static int SimulationResultsImpl__readSimulationResultSize(const char *filename, SimulationResult_Globals* simresglob) { const char *msg[2] = {"",""}; int size; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,simresglob)) { return -1; } switch (simresglob->curFormat) { case MATLAB4: { return simresglob->matReader.nrows; } case PLT: { size = read_ptolemy_dataset_size(filename); msg[0] = filename; if (size == -1) c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to read readSimulationResultSize from file: %s\n"), msg, 1); return size; } case CSV: { size = simresglob->csvReader ? simresglob->csvReader->numsteps : -1; msg[0] = filename; if (size == -1) c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to read readSimulationResultSize from file: %s\n"), msg, 1); return size; } default: msg[0] = PlotFormatStr[simresglob->curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readSimulationResultSize() not implemented for plot format: %s\n"), msg, 1); return -1; } }
extern int Socket_waitforconnect(int port) { int ns; serversocket = make_socket(port); if (serversocket==0) { const char *tokens[1] = {strerror(errno)}; c_add_message(NULL,-1,ErrorType_scripting,ErrorLevel_error,"make_socket failed: %s",tokens,1); return -1; } if (listen(serversocket,5)==-1) { /* Listen, pending client list length = 1 */ const char *tokens[1] = {strerror(errno)}; c_add_message(NULL,-1,ErrorType_scripting,ErrorLevel_error,"listen failed: %s",tokens,1); return -1; } ns = accept(serversocket,(struct sockaddr *)&clientAddr,&fromlen); if (ns < 0) { const char *tokens[1] = {strerror(errno)}; c_add_message(NULL,-1,ErrorType_scripting,ErrorLevel_error,"accept failed: %s",tokens,1); return -1; } return ns; }
extern void BackendDAEEXT_getAssignment(modelica_metatype ass1, modelica_metatype ass2) { int i=0; long len1 = MMC_HDRSLOTS(MMC_GETHDR(ass1)); long len2 = MMC_HDRSLOTS(MMC_GETHDR(ass2)); if (n > len1 || m > len2) { char nstr[64],mstr[64],len1str[64],len2str[64]; const char *tokens[4] = {len2str,mstr,len1str,nstr}; snprintf(nstr,64,"%ld", (long) n); snprintf(mstr,64,"%ld", (long) m); snprintf(len1str,64,"%ld", (long) len1); snprintf(len2str,64,"%ld", (long) len2); c_add_message(NULL,-1,ErrorType_symbolic,ErrorLevel_internal,"BackendDAEEXT.getAssignment failed because n=%s>arrayLength(ass1)=%s or m=%s>arrayLength(ass2)=%s",tokens,4); MMC_THROW(); } if (match != NULL) { for(i=0; i<n; ++i) { if (match[i] >= 0) MMC_STRUCTDATA(ass1)[i] = mmc_mk_icon(match[i]+1); else MMC_STRUCTDATA(ass1)[i] = mmc_mk_icon(-1); } } if (row_match != NULL) { for(i=0; i<m; ++i) { if (row_match[i] >= 0) MMC_STRUCTDATA(ass2)[i] = mmc_mk_icon(row_match[i]+1); else MMC_STRUCTDATA(ass2)[i] = mmc_mk_icon(-1); } } }
static void importlogger(jm_callbacks* c, jm_string module, jm_log_level_enu_t log_level, jm_string message) { const char* tokens[3] = {module,jm_log_level_to_string(log_level),message}; switch (log_level) { case jm_log_level_fatal: case jm_log_level_error: c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("module = %s, log level = %s: %s"), tokens, 3); break; case jm_log_level_warning: c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("module = %s, log level = %s: %s"), tokens, 3); break; case jm_log_level_info: case jm_log_level_verbose: case jm_log_level_debug: c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_notification, gettext("module = %s, log level = %s: %s"), tokens, 3); break; default: printf("module = %s, log level = %d: %s\n", module, log_level, message);fflush(NULL); break; } }
static void* SimulationResultsImpl__readVars(const char *filename, int readParameters, int omcStyle, SimulationResult_Globals* simresglob) { const char *msg[2] = {"",""}; void *res; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,simresglob)) { return mmc_mk_nil(); } res = mmc_mk_nil(); switch (simresglob->curFormat) { case MATLAB4: { int i; for (i=simresglob->matReader.nall-1; i>=0; i--) { if (readParameters || !simresglob->matReader.allInfo[i].isParam) { res = mmc_mk_cons(makeOMCStyle(simresglob->matReader.allInfo[i].name, omcStyle),res); } } return res; } case PLT: { 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(makeOMCStyle(variables[i], omcStyle),res); } } } return res; } default: msg[0] = PlotFormatStr[simresglob->curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readSimulationResultSize() not implemented for plot format: %s"), msg, 1); return mmc_mk_nil(); } }
static PlotFormat SimulationResultsImpl__openFile(const char *filename, SimulationResult_Globals* simresglob) { PlotFormat format; int len = strlen(filename); const char *msg[] = {"",""}; #if !defined(__MINGW32__) && !defined(_MSC_VER) struct stat buf = {0} /* Zero this or valgrind complains */; #endif if (simresglob->curFileName && 0==strcmp(filename,simresglob->curFileName)) { #if defined(__MINGW32__) || defined(_MSC_VER) return simresglob->curFormat; // Super cache :) #else /* Also check that the file was not modified */ if (stat(filename, &buf)==0 && difftime(buf.st_mtime,simresglob->mtime)==0.0) { return simresglob->curFormat; // Super cache :) } #endif } // Start by closing the old file... SimulationResultsImpl__close(simresglob); if (len < 5) format = UNKNOWN_PLOT; else if (0 == strcmp(filename+len-4, ".mat")) format = MATLAB4; else if (0 == strcmp(filename+len-4, ".plt")) format = PLT; else if (0 == strcmp(filename+len-4, ".csv")) format = CSV; else { msg[0] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Unknown result-file suffix of file '%s'"), msg, 1); format = UNKNOWN_PLOT; } switch (format) { case MATLAB4: if (0!=(msg[0]=omc_new_matlab4_reader(filename,&simresglob->matReader))) { msg[1] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to open simulation result %s: %s"), msg, 2); return UNKNOWN_PLOT; } break; case PLT: simresglob->pltReader = fopen(filename, "r"); if (simresglob->pltReader==NULL) { msg[1] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to open simulation result %s: %s"), msg, 2); return UNKNOWN_PLOT; } break; case CSV: simresglob->csvReader = read_csv(filename); if (simresglob->csvReader==NULL) { msg[1] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to open simulation result %s: %s"), msg, 2); return UNKNOWN_PLOT; } break; default: msg[0] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to open simulation result %s"), msg, 1); return UNKNOWN_PLOT; } simresglob->curFormat = format; simresglob->curFileName = strdup(filename); #if !defined(__MINGW32__) && !defined(_MSC_VER) stat(filename, &buf); simresglob->mtime = buf.st_mtime; #endif // fprintf(stderr, "SimulationResultsImpl__openFile(%s) => %s\n", filename, PlotFormatStr[curFormat]); return simresglob->curFormat; }
int SimulationResults_filterSimulationResults(const char *inFile, const char *outFile, void *vars, int numberOfIntervals) { const char *msg[5] = {"","","","",""}; void *tmp; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(inFile, &simresglob)) { return 0; } vars = mmc_mk_cons(mmc_mk_scon("time"),vars); switch (simresglob.curFormat) { case MATLAB4: { int numToFilter = listLength(vars); int i, j; int numUnique = 0; int numUniqueParam = 1; int longestName = 0; int longestDesc = 0; ModelicaMatVariable_t **mat_var = omc_alloc_interface.malloc(numToFilter*sizeof(ModelicaMatVariable_t*)); int *indexes = (int*) omc_alloc_interface.malloc(simresglob.matReader.nvar*sizeof(int)); /* Need it to be zeros; note that the actual number of indexes is smaller */ int *parameter_indexes = (int*) omc_alloc_interface.malloc(simresglob.matReader.nparam*sizeof(int)); /* Need it to be zeros; note that the actual number of indexes is smaller */ int *indexesToOutput = NULL; int *parameter_indexesToOutput = NULL; FILE *fout = NULL; char *tmp; double start_stop[2] = {0}; double start = omc_matlab4_startTime(&simresglob.matReader); double stop = omc_matlab4_stopTime(&simresglob.matReader); parameter_indexes[0] = 1; /* time */ omc_matlab4_read_all_vals(&simresglob.matReader); if (endsWith(outFile,".csv")) { double **vals = omc_alloc_interface.malloc(sizeof(double*)*numToFilter); FILE *fout = NULL; for (i=0; i<numToFilter; i++) { const char *var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); mat_var[i] = omc_matlab4_find_var(&simresglob.matReader, var); if (mat_var[i] == NULL) { msg[0] = SystemImpl__basename(inFile); msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return 0; } if (mat_var[i]->isParam) { msg[0] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not filter parameter %s since the output format is CSV (only variables are allowed)."), msg, 1); return 0; } else { vals[i] = omc_matlab4_read_vals(&simresglob.matReader, mat_var[i]->index); } } fout = fopen(outFile, "w"); fprintf(fout, "time"); for (i=1; i<numToFilter; i++) { fprintf(fout, ",\"%s\"", mat_var[i]->name); } fprintf(fout, ",nrows=%d\n", simresglob.matReader.nrows); for (i=0; i<simresglob.matReader.nrows; i++) { fprintf(fout, "%.15g", vals[0][i]); for (j=1; j<numToFilter; j++) { fprintf(fout, ",%.15g", vals[j][i]); } fprintf(fout, "\n"); } fclose(fout); return 1; } /* Not CSV */ for (i=0; i<numToFilter; i++) { const char *var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); mat_var[i] = omc_matlab4_find_var(&simresglob.matReader,var); if (mat_var[i] == NULL) { msg[0] = SystemImpl__basename(inFile); msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return 0; } if (mat_var[i]->isParam) { /* Store the old index in the array */ if (0==parameter_indexes[abs(mat_var[i]->index)-1]++) { numUniqueParam++; } } else { /* Store the old index in the array */ if (0==indexes[abs(mat_var[i]->index)-1]++) { numUnique++; } } longestName = intMax(longestName, strlen(mat_var[i]->name)); longestDesc = intMax(longestDesc, strlen(mat_var[i]->descr)); } /* Create the list of variable indexes to output */ indexesToOutput = omc_alloc_interface.malloc_atomic(numUnique * sizeof(int)); parameter_indexesToOutput = omc_alloc_interface.malloc_atomic(numUniqueParam * sizeof(int)); j=0; for (i=0; i<simresglob.matReader.nvar; i++) { if (indexes[i]) { indexesToOutput[j++] = i+1; } /* indexes becomes the lookup table from old index to new index */ indexes[i] = j; } j=0; for (i=0; i<simresglob.matReader.nparam; i++) { if (parameter_indexes[i]) { parameter_indexesToOutput[j++] = i+1; } /* indexes becomes the lookup table from old index to new index */ parameter_indexes[i] = j; } fout = fopen(outFile, "wb"); if (fout == NULL) { return failedToWriteToFile(outFile); } /* Matrix list: "Aclass" "name" "description" "dataInfo" "data_1" "data_2" */ if (writeMatVer4AclassNormal(fout)) { return failedToWriteToFile(outFile); } if (writeMatVer4MatrixHeader(fout, "name", numToFilter, longestName, sizeof(int8_t))) { return failedToWriteToFile(outFile); } tmp = omc_alloc_interface.malloc(numToFilter*longestName); for (i=0; i<numToFilter; i++) { int len = strlen(mat_var[i]->name); for (j=0; j<len; j++) { tmp[numToFilter*j+i] = mat_var[i]->name[j]; } } if (1 != fwrite(tmp, numToFilter*longestName, 1, fout)) { return failedToWriteToFile(outFile); } GC_free(tmp); if (writeMatVer4MatrixHeader(fout, "description", numToFilter, longestDesc, sizeof(int8_t))) { return failedToWriteToFile(outFile); } tmp = omc_alloc_interface.malloc(numToFilter*longestDesc); for (i=0; i<numToFilter; i++) { int len = strlen(mat_var[i]->descr); for (j=0; j<len; j++) { tmp[numToFilter*j+i] = mat_var[i]->descr[j]; } } if (1 != fwrite(tmp, numToFilter*longestDesc, 1, fout)) { return failedToWriteToFile(outFile); } GC_free(tmp); if (writeMatVer4MatrixHeader(fout, "dataInfo", numToFilter, 4, sizeof(int32_t))) { return failedToWriteToFile(outFile); } for (i=0; i<numToFilter; i++) { int32_t x = mat_var[i]->isParam ? 1 : 2; /* data_1 or data_2 */ if (1 != fwrite(&x, sizeof(int32_t), 1, fout)) { return failedToWriteToFile(outFile); } } for (i=0; i<numToFilter; i++) { int32_t x = (mat_var[i]->index < 0 ? -1 : 1) * (mat_var[i]->isParam ? parameter_indexes[abs(mat_var[i]->index)-1] : indexes[abs(mat_var[i]->index)-1]); if (1 != fwrite(&x, sizeof(int32_t), 1, fout)) { return failedToWriteToFile(outFile); } } for (i=0; i<numToFilter; i++) { int32_t x = 0; /* linear interpolation */ if (1 != fwrite(&x, sizeof(int32_t), 1, fout)) { return failedToWriteToFile(outFile); } } for (i=0; i<numToFilter; i++) { int32_t x = -1; /* not defined outside the time interval */ if (1 != fwrite(&x, sizeof(int32_t), 1, fout)) { return failedToWriteToFile(outFile); } } if (writeMatVer4MatrixHeader(fout, "data_1", 2, numUniqueParam, sizeof(double))) { return failedToWriteToFile(outFile); } start = omc_matlab4_startTime(&simresglob.matReader); stop = omc_matlab4_stopTime(&simresglob.matReader); start_stop[0]=start; start_stop[1]=stop; if (1 != fwrite(start_stop, sizeof(double)*2, 1, fout)) { return failedToWriteToFile(outFile); } for (i=1; i<numUniqueParam; i++) { int paramIndex = parameter_indexesToOutput[i]; double d[2] = {simresglob.matReader.params[abs(paramIndex)-1],0}; d[1] = d[0]; if (1!=fwrite(d, sizeof(double)*2, 1, fout)) { return failedToWriteToFile(outFile); } } if (numberOfIntervals) { double *timevals = omc_matlab4_read_vals(&simresglob.matReader, 1); int last_found=0; int nevents=0, neventpoints=0; for (i=1; i<numberOfIntervals; i++) { double t = start + (stop-start)*((double)i)/numberOfIntervals; while (timevals[j]<=t) { if (timevals[j]==timevals[j+1]) { while (timevals[j]==timevals[j+1]) { j++; neventpoints++; } nevents++; } j++; } } msg[4] = inFile; GC_asprintf((char**)msg+3, "%d", simresglob.matReader.nrows); GC_asprintf((char**)msg+2, "%d", numberOfIntervals); GC_asprintf((char**)msg+1, "%d", nevents); GC_asprintf((char**)msg+0, "%d", neventpoints); c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_notification, gettext("Resampling %s from %s points to %s points, removing %s events stored in %s points.\n"), msg, 5); } if (writeMatVer4MatrixHeader(fout, "data_2", numberOfIntervals ? numberOfIntervals+1 : simresglob.matReader.nrows, numUnique, sizeof(double))) { return failedToWriteToFile(outFile); } for (i=0; i<numUnique; i++) { double *vals = NULL; int nrows; if (numberOfIntervals) { omc_matlab4_read_all_vals(&simresglob.matReader); nrows = numberOfIntervals+1; vals = omc_alloc_interface.malloc_atomic(sizeof(double)*nrows); for (j=0; j<=numberOfIntervals; j++) { double t = j==numberOfIntervals ? stop : start + (stop-start)*((double)j)/numberOfIntervals; ModelicaMatVariable_t var = {0}; var.name=""; var.descr=""; var.isParam=0; var.index=indexesToOutput[i]; if (omc_matlab4_val(vals+j, &simresglob.matReader, &var, t)) { msg[2] = inFile; GC_asprintf((char**)msg+1, "%d", indexesToOutput[i]); GC_asprintf((char**)msg+0, "%.15g", t); c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Resampling %s failed to get variable %s at time %s.\n"), msg, 3); return 0; } } } else { vals = omc_matlab4_read_vals(&simresglob.matReader, indexesToOutput[i]); nrows = simresglob.matReader.nrows; } if (1!=fwrite(vals, sizeof(double)*nrows, 1, fout)) { return failedToWriteToFile(outFile); } if (numberOfIntervals) { GC_free(vals); } } fclose(fout); return 1; } default: msg[0] = PlotFormatStr[simresglob.curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("filterSimulationResults not implemented for plot format: %s\n"), msg, 1); return 0; } }
static inline int failedToWriteToFile(const char *file) { c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Failed to write to file %s."), &file, 1); return 0; }
static void* SimulationResultsImpl__readDataset(const char *filename, void *vars, int dimsize, int suggestReadAllVars, SimulationResult_Globals* simresglob, int runningTestsuite) { const char *msg[2] = {"",""}; void *res,*col; char *var; double *vals; int i; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,simresglob)) { return NULL; } res = mmc_mk_nil(); switch (simresglob->curFormat) { case MATLAB4: { ModelicaMatVariable_t *mat_var; if (dimsize == 0) { dimsize = simresglob->matReader.nrows; } else if (simresglob->matReader.nrows != dimsize) { fprintf(stderr, "dimsize: %d, rows %d\n", dimsize, simresglob->matReader.nrows); c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readDataset(...): Expected and actual dimension sizes do not match."), NULL, 0); return NULL; } if (suggestReadAllVars) { omc_matlab4_read_all_vals(&simresglob->matReader); } while (MMC_NILHDR != MMC_GETHDR(vars)) { var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); mat_var = omc_matlab4_find_var(&simresglob->matReader,var); if (mat_var == NULL) { msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename; msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return NULL; } else if (mat_var->isParam) { col=mmc_mk_nil(); for (i=0;i<dimsize;i++) col=mmc_mk_cons(mmc_mk_rcon((mat_var->index<0)?-simresglob->matReader.params[abs(mat_var->index)-1]:simresglob->matReader.params[abs(mat_var->index)-1]),col); res = mmc_mk_cons(col,res); } else { vals = omc_matlab4_read_vals(&simresglob->matReader,mat_var->index); col=mmc_mk_nil(); for (i=0;i<dimsize;i++) col=mmc_mk_cons(mmc_mk_rcon(vals[i]),col); res = mmc_mk_cons(col,res); } } return res; } case PLT: { return read_ptolemy_dataset(filename,vars,dimsize); } case CSV: { while (MMC_NILHDR != MMC_GETHDR(vars)) { var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); vals = simresglob->csvReader ? read_csv_dataset(simresglob->csvReader,var) : NULL; if (vals == NULL) { msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename; msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return NULL; } else { col=mmc_mk_nil(); for (i=0;i<dimsize;i++) { col=mmc_mk_cons(mmc_mk_rcon(vals[i]),col); } res = mmc_mk_cons(col,res); } } return res; } default: msg[0] = PlotFormatStr[simresglob->curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readDataSet() not implemented for plot format: %s\n"), msg, 1); return NULL; } }
static double SimulationResultsImpl__val(const char *filename, const char *varname, double timeStamp, SimulationResult_Globals* simresglob) { double res; const char *msg[4] = {"","","",""}; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,simresglob)) { return NAN; } switch (simresglob->curFormat) { case MATLAB4: { ModelicaMatVariable_t *var; if (0 == (var=omc_matlab4_find_var(&simresglob->matReader,varname))) { msg[1] = varname; msg[0] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("%s not found in %s\n"), msg, 2); return NAN; } if (omc_matlab4_val(&res,&simresglob->matReader,var,timeStamp)) { char buf[64],buf2[64],buf3[64]; snprintf(buf,60,"%g",timeStamp); snprintf(buf2,60,"%g",omc_matlab4_startTime(&simresglob->matReader)); snprintf(buf3,60,"%g",omc_matlab4_stopTime(&simresglob->matReader)); msg[3] = varname; msg[2] = buf; msg[1] = buf2; msg[0] = buf3; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("%s not defined at time %s (startTime=%s, stopTime=%s)."), msg, 4); return NAN; } return res; } case PLT: { char *strToFind = (char*) malloc(strlen(varname)+30); char line[255]; double pt,t,pv,v,w1,w2; int nread=0; sprintf(strToFind,"DataSet: %s\n",varname); fseek(simresglob->pltReader,0,SEEK_SET); do { if (NULL==fgets(line,255,simresglob->pltReader)) { msg[1] = varname; msg[0] = filename; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("%s not found in %s\n"), msg, 2); return NAN; } } while (strcmp(strToFind,line)); free(strToFind); while (fscanf(simresglob->pltReader,"%lg, %lg\n",&t,&v) == 2) { nread++; if (t > timeStamp) break; pt = t; pv = v; }; if (nread == 0 || nread == 1 || t < timeStamp) { char buf[64]; snprintf(buf,60,"%g",timeStamp); msg[1] = varname; msg[0] = buf; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("%s not defined at time %s\n"), msg, 2); return NAN; } else { /* Linear interpolation */ if ((t-pt) == 0.0) return v; w1 = (timeStamp - pt) / (t-pt); w2 = 1.0 - w1; return pv*w2 + v*w1; } } default: msg[0] = PlotFormatStr[simresglob->curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("val() not implemented for plot format: %s\n"), msg, 1); return NAN; } }
static inline int failedToWriteToFileImpl(const char *file, const char *sourceFile, const char *line) { const char *msg[3] = {file,line,sourceFile}; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("%s:%s: Failed to write to file %s."), msg, 3); return 0; }
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; void *allvars,*cmpvar,*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] = {"",""}; ddf.data=NULL; ddf.n=0; oldlen = 0; len = 1; /* open files */ /* fprintf(stderr, "Open File %s\n", filename); */ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,&simresglob_c)) return mk_cons(mk_scon("Error Open File!"),mk_nil()); /* fprintf(stderr, "Open File %s\n", reffilename); */ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(reffilename,&simresglob_ref)) return mk_cons(mk_scon("Error Open RefFile!"),mk_nil()); size = SimulationResultsImpl__readSimulationResultSize(filename,&simresglob_c); /* fprintf(stderr, "Read size of File %s size= %d\n", filename,size); */ size_ref = SimulationResultsImpl__readSimulationResultSize(reffilename,&simresglob_ref); /* fprintf(stderr, "Read size of File %s size= %d\n", reffilename,size_ref); */ /* get vars to compare */ cmpvars = getVars(vars,&ncmpvars); /* if no var compare all vars */ if (ncmpvars==0){ allvars = SimulationResultsImpl__readVars(filename,&simresglob_c); cmpvars = getVars(vars,&ncmpvars); if (ncmpvars==0) return mk_cons(mk_scon("Error Get Vars!"),mk_nil()); } cmpdiffvars = (char**)malloc(sizeof(char*)*(ncmpvars)); /* fprintf(stderr, "Compare Vars:\n"); /* /* for(i=0;i<ncmpvars;i++) fprintf(stderr, "Var: %s\n", cmpvars[i]); */ /* get time */ /* fprintf(stderr, "get time\n"); */ time = getData("time",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()); } } /* fprintf(stderr, "get reftime\n"); */ timeref = getData("time",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()); } } var1=NULL; var2=NULL; /* compare vars */ /* fprintf(stderr, "compare vars\n"); */ for (i=0;i<ncmpvars;i++) { var = cmpvars[i]; len = strlen(var); if (oldlen < len) { if (var1) free(var1); var1 = (char*) malloc(len+1); oldlen = len; } memset(var1,0,len); k = 0; for (j=0;j<len;j++) { if (var[j] !='\"' ) { var1[k] = var[j]; k +=1; } } /* fprintf(stderr, "compare var: %s\n",var); */ /* check if in ref_file */ dataref = getData(var1,reffilename,size_ref,&simresglob_ref); if (dataref.n==0) { if (var2) free(var2); var2 = (char*) malloc(len+1); strncpy(var2,var1,len+1); fixDerInName(var2,len); fixCommaInName(&var2,len); dataref = getData(var2,reffilename,size_ref,&simresglob_ref); if (dataref.n==0) { fprintf(stderr, "Get Data of Var %s from file %s failed\n",var,reffilename); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Get Data of Var failed!\n", msg, 0); continue; } } /* check if in file */ data = getData(var1,filename,size,&simresglob_c); if (data.n==0) { fixDerInName(var1,len); fixCommaInName(&var1,len); data = getData(var1,filename,size,&simresglob_c); if (data.n==0) { if (data.data) free(data.data); fprintf(stderr, "Get Data of Var %s from file %s failed\n",var,filename); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Get Data of Var failed!\n", msg, 0); continue; } } /* compare */ vardiffindx = cmpData(var,&time,&timeref,&data,&dataref,reltol,abstol,&ddf,cmpdiffvars,vardiffindx); /* free */ if (dataref.data) free(dataref.data); if (data.data) free(data.data); } if (writeLogFile(resultfilename,&ddf,filename,reffilename,reltol,abstol)) { c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Cannot write result file!\n", msg, 0); } if (ddf.n > 0){ /* fprintf(stderr, "diff: %d\n",ddf.n); */ /* for (i=0;i<vardiffindx;i++) fprintf(stderr, "diffVar: %s\n",cmpdiffvars[i]); */ res = mk_nil(); for (i=0;i<vardiffindx;i++){ res = (void*)mk_cons(mk_scon(cmpdiffvars[i]),res); } res = mk_cons(mk_scon("Files not Equal!"),res); c_add_message(-1, ErrorType_scripting, ErrorLevel_warning, "Files not Equal\n", msg, 0); } else res = mk_cons(mk_scon("Files Equal!"),mk_nil()); if (var1) free(var1); if (var2) free(var2); if (ddf.data) free(ddf.data); if(cmpvars) free(cmpvars); if (time.data) free(time.data); if (timeref.data) free(timeref.data); if (cmpdiffvars) free(cmpdiffvars); /* close files */ SimulationResultsImpl__close(&simresglob_c); SimulationResultsImpl__close(&simresglob_ref); return res; }