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);
}
Ejemplo n.º 2
0
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);
}