void plt_init(simulation_result *self,DATA *data, threadData_t *threadData) { plt_data *pltData = (plt_data*) malloc(sizeof(plt_data)); rt_tick(SIM_TIMER_OUTPUT); /* * Re-Initialization is important because the variables are global and used in every solving step */ pltData->simulationResultData = 0; pltData->currentPos = 0; pltData->actualPoints = 0; /* the number of actual points saved */ pltData->dataSize = 0; pltData->maxPoints = self->numpoints; assertStreamPrint(threadData, self->numpoints >= 0, "Automatic output steps not supported in OpenModelica yet. Set numpoints >= 0."); pltData->num_vars = calcDataSize(self,data->modelData); pltData->dataSize = calcDataSize(self,data->modelData); pltData->simulationResultData = (double*)malloc(self->numpoints * pltData->dataSize * sizeof(double)); if(!pltData->simulationResultData) { throwStreamPrint(threadData, "Error allocating simulation result data of size %ld failed",self->numpoints * pltData->dataSize); } pltData->currentPos = 0; self->storage = pltData; rt_accumulate(SIM_TIMER_OUTPUT); }
void mat4_init(simulation_result *self,DATA *data) { mat_data *matData = new mat_data(); self->storage = matData; const MODEL_DATA *mData = &(data->modelData); const char Aclass[] = "A1 bt. ir1 na Tj re ac nt so r y "; const struct VAR_INFO** names = NULL; const int nParams = mData->nParametersReal + mData->nParametersInteger + mData->nParametersBoolean; char *stringMatrix = NULL; int rows, cols; int32_t *intMatrix = NULL; double *doubleMatrix = NULL; assert(sizeof(char) == 1); rt_tick(SIM_TIMER_OUTPUT); matData->numVars = calcDataSize(self,data); names = calcDataNames(self,data,matData->numVars+nParams); matData->data1HdrPos = -1; matData->data2HdrPos = -1; matData->ntimepoints = 0; matData->startTime = data->simulationInfo.startTime; matData->stopTime = data->simulationInfo.stopTime; try { /* open file */ matData->fp.open(self->filename, std::ofstream::binary|std::ofstream::trunc); if(!matData->fp) { throwStreamPrint(data->threadData, "Cannot open File %s for writing",self->filename); } /* write `AClass' matrix */ writeMatVer4Matrix(self,data,"Aclass", 4, 11, Aclass, sizeof(int8_t)); /* flatten variables' names */ flattenStrBuf(matData->numVars+nParams, names, stringMatrix, rows, cols, false /* We cannot plot derivatives if we fix the names ... */, false); /* write `name' matrix */ writeMatVer4Matrix(self,data,"name", rows, cols, stringMatrix, sizeof(int8_t)); free(stringMatrix); stringMatrix = NULL; /* flatten variables' comments */ flattenStrBuf(matData->numVars+nParams, names, stringMatrix, rows, cols, false, true); /* write `description' matrix */ writeMatVer4Matrix(self,data,"description", rows, cols, stringMatrix, sizeof(int8_t)); free(stringMatrix); stringMatrix = NULL; /* generate dataInfo table */ generateDataInfo(self, data, intMatrix, rows, cols, matData->numVars, nParams); /* write `dataInfo' matrix */ writeMatVer4Matrix(self, data, "dataInfo", cols, rows, intMatrix, sizeof(int32_t)); /* remember data1HdrPos */ matData->data1HdrPos = matData->fp.tellp(); /* adrpo: i cannot use writeParameterData here as it would return back to dataHdr1Pos */ /* generate `data_1' matrix (with parameter data) */ generateData_1(data, doubleMatrix, rows, cols, matData->startTime, matData->stopTime); /* write `data_1' matrix */ writeMatVer4Matrix(self,data,"data_1", cols, rows, doubleMatrix, sizeof(double)); /* remember data2HdrPos */ matData->data2HdrPos = matData->fp.tellp(); /* write `data_2' header */ writeMatVer4MatrixHeader(self,data,"data_2", 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, 0, sizeof(double)); free(doubleMatrix); free(intMatrix); doubleMatrix = NULL; intMatrix = NULL; matData->fp.flush(); } catch(...) { matData->fp.close(); free(names); names=NULL; free(stringMatrix); free(doubleMatrix); free(intMatrix); rt_accumulate(SIM_TIMER_OUTPUT); throwStreamPrint(data->threadData, "Error while writing mat file %s",self->filename); } free(names); names=NULL; rt_accumulate(SIM_TIMER_OUTPUT); }