static void SimulationResultsImpl__close(SimulationResult_Globals* simresglob) { switch (simresglob->curFormat) { case MATLAB4: omc_free_matlab4_reader(&simresglob->matReader); break; case PLT: fclose(simresglob->pltReader); break; case CSV: omc_free_csv_reader(simresglob->csvReader); simresglob->csvReader=NULL; break; default: break; } simresglob->curFormat = UNKNOWN_PLOT; if (simresglob->curFileName) free(simresglob->curFileName); simresglob->curFileName = NULL; }
/** * Uses OpenModelica functions to read from .mat files : faster than csv (both writing and reading) * @note : don't forget to free reader (omc_free_matlab4_reader()) in order to let files writable */ bool OpenModelica::getFinalVariablesFromMatFile(QString fileName, MOVector<Variable> * variables,QString _modelName) { ModelicaMatReader reader; ModelicaMatVariable_t *var; const char* msg; double value; bool varOk; int status ; Variable* newVar; //Read in mat file if(0 != (msg = omc_new_matlab4_reader(fileName.toStdString().c_str(), &reader))) { InfoSender::instance()->sendError("Unable to read .mat file: "+QString(msg)); #ifdef WIN32 // don't know why sigabrt on linux. Should look for. delete[] msg; #endif return false; } // delete[] msg; //Read in timevector double stopTime = omc_matlab4_stopTime(&reader); if (reader.nvar < 1) { InfoSender::instance()->sendError("Unable to read .mat file : no variable inside"); omc_free_matlab4_reader(&reader); return false; } // read in all values for (int i = 0; i < reader.nall; i++) { newVar = new Variable(); QString name(reader.allInfo[i].name); newVar->setName(name); newVar->setModel(_modelName); // read the variable final value var = omc_matlab4_find_var(&reader, reader.allInfo[i].name); if (!var->isParam) { status = omc_matlab4_val(&value,&reader,var,stopTime); } // if variable is a parameter then take at first step else { status = omc_matlab4_val(&value,&reader,var,0.0); } varOk = (status==0); if(!varOk && reader.nrows>0) { double *vals = omc_matlab4_read_vals(&reader,var->index); value = vals[reader.nrows-1]; varOk = true; } newVar->setValue(value); if(varOk) variables->addItem(newVar); else { InfoSender::instance()->debug("Couldn't find value of variable in .mat file :" + newVar->name()); delete newVar; } } omc_free_matlab4_reader(&reader); return true; }
/*! * \brief VisualizerMAT::~VisualizerMAT * Free the ModelicaMatReader */ VisualizerMAT::~VisualizerMAT() { if (_matReader.file) { omc_free_matlab4_reader(&_matReader); } }
/*! \fn int importStartValues(DATA *data, const char *pInitFile, const double initTime) * * \param [ref] [data] * \param [in] [pInitFile] * \param [in] [initTime] * * \author lochel */ int importStartValues(DATA *data, threadData_t *threadData, const char *pInitFile, const double initTime) { ModelicaMatReader reader; ModelicaMatVariable_t *pVar = NULL; double value; const char *pError = NULL; char* newVarname = NULL; MODEL_DATA *mData = data->modelData; long i; infoStreamPrint(LOG_INIT, 0, "import start values\nfile: %s\ntime: %g", pInitFile, initTime); if(!strcmp(data->modelData->resultFileName, pInitFile)) { errorStreamPrint(LOG_INIT, 0, "Cannot import a result file for initialization that is also the current output file <%s>.\nConsider redirecting the output result file (-r=<new_res.mat>) or renaming the result file that is used for initialization import.", pInitFile); return 1; } pError = omc_new_matlab4_reader(pInitFile, &reader); if(pError) { throwStreamPrint(threadData, "unable to read input-file <%s> [%s]", pInitFile, pError); return 1; } else { infoStreamPrint(LOG_INIT, 0, "import real variables"); for(i=0; i<mData->nVariablesReal; ++i) { pVar = omc_matlab4_find_var(&reader, mData->realVarsData[i].info.name); if(!pVar) { newVarname = mapToDymolaVars(mData->realVarsData[i].info.name); pVar = omc_matlab4_find_var(&reader, newVarname); free(newVarname); } if(pVar) { omc_matlab4_val(&(mData->realVarsData[i].attribute.start), &reader, pVar, initTime); infoStreamPrint(LOG_INIT, 0, "| %s(start=%g)", mData->realVarsData[i].info.name, mData->realVarsData[i].attribute.start); } else if((strlen(mData->realVarsData[i].info.name) > 0) && (mData->realVarsData[i].info.name[0] != '$') && (strncmp(mData->realVarsData[i].info.name, "der($", 5) != 0)) { /* skip warnings about self-generated variables */ warningStreamPrint(LOG_INIT, 0, "unable to import real variable %s from given file", mData->realVarsData[i].info.name); } } infoStreamPrint(LOG_INIT, 0, "import real parameters"); for(i=0; i<mData->nParametersReal; ++i) { pVar = omc_matlab4_find_var(&reader, mData->realParameterData[i].info.name); if(!pVar) { newVarname = mapToDymolaVars(mData->realParameterData[i].info.name); pVar = omc_matlab4_find_var(&reader, newVarname); free(newVarname); } if(pVar) { omc_matlab4_val(&(mData->realParameterData[i].attribute.start), &reader, pVar, initTime); data->simulationInfo->realParameter[i] = mData->realParameterData[i].attribute.start; infoStreamPrint(LOG_INIT, 0, "| %s(start=%g)", mData->realParameterData[i].info.name, mData->realParameterData[i].attribute.start); } else { warningStreamPrint(LOG_INIT, 0, "unable to import real parameter %s from given file", mData->realParameterData[i].info.name); } } infoStreamPrint(LOG_INIT, 0, "import real discrete"); for(i=mData->nVariablesReal-mData->nDiscreteReal; i<mData->nDiscreteReal; ++i) { pVar = omc_matlab4_find_var(&reader, mData->realParameterData[i].info.name); if(!pVar) { newVarname = mapToDymolaVars(mData->realParameterData[i].info.name); pVar = omc_matlab4_find_var(&reader, newVarname); free(newVarname); } if(pVar) { omc_matlab4_val(&(mData->realParameterData[i].attribute.start), &reader, pVar, initTime); infoStreamPrint(LOG_INIT, 0, "| %s(start=%g)", mData->realParameterData[i].info.name, mData->realParameterData[i].attribute.start); } else { warningStreamPrint(LOG_INIT, 0, "unable to import real parameter %s from given file", mData->realParameterData[i].info.name); } } infoStreamPrint(LOG_INIT, 0, "import integer parameters"); for(i=0; i<mData->nParametersInteger; ++i) { pVar = omc_matlab4_find_var(&reader, mData->integerParameterData[i].info.name); if (!pVar) { newVarname = mapToDymolaVars(mData->integerParameterData[i].info.name); pVar = omc_matlab4_find_var(&reader, newVarname); free(newVarname); } if (pVar) { omc_matlab4_val(&value, &reader, pVar, initTime); mData->integerParameterData[i].attribute.start = (modelica_integer)value; data->simulationInfo->integerParameter[i] = (modelica_integer)value; infoStreamPrint(LOG_INIT, 0, "| %s(start=%ld)", mData->integerParameterData[i].info.name, mData->integerParameterData[i].attribute.start); } else { warningStreamPrint(LOG_INIT, 0, "unable to import integer parameter %s from given file", mData->integerParameterData[i].info.name); } } infoStreamPrint(LOG_INIT, 0, "import boolean parameters"); for(i=0; i<mData->nParametersBoolean; ++i) { pVar = omc_matlab4_find_var(&reader, mData->booleanParameterData[i].info.name); if(!pVar) { newVarname = mapToDymolaVars(mData->booleanParameterData[i].info.name); pVar = omc_matlab4_find_var(&reader, newVarname); free(newVarname); } if(pVar) { omc_matlab4_val(&value, &reader, pVar, initTime); mData->booleanParameterData[i].attribute.start = (modelica_boolean)value; data->simulationInfo->booleanParameter[i] = (modelica_boolean)value; infoStreamPrint(LOG_INIT, 0, "| %s(start=%s)", mData->booleanParameterData[i].info.name, mData->booleanParameterData[i].attribute.start ? "true" : "false"); } else { warningStreamPrint(LOG_INIT, 0, "unable to import boolean parameter %s from given file", mData->booleanParameterData[i].info.name); } } omc_free_matlab4_reader(&reader); } return 0; }