Ejemplo n.º 1
0
int main(int argc, char **argv)
{
  POLYNOMIAL *poly;
  long nPoly, iPoly, row, rows, iInput;
  int iArg;
  char *input, *output;
  unsigned long pipeFlags;
  SCANNED_ARG *scanned;
  SDDS_DATASET SDDSin, SDDSout;
  double *outputData ;
  
  SDDS_RegisterProgramName(argv[0]);
  argc = scanargs(&scanned, argc, argv); 
  if (argc<3)
    bomb(NULL, USAGE);

  outputData = NULL;
  input = output = NULL;
  pipeFlags = 0;
  poly = NULL;
  nPoly = 0;

  for (iArg=1; iArg<argc; iArg++) {
    if (scanned[iArg].arg_type==OPTION) {
      /* process options here */
      switch (match_string(scanned[iArg].list[0], option, CLO_OPTIONS, 0)) {
      case CLO_EVALUATE:
        if (!(poly = SDDS_Realloc(poly, sizeof(*poly)*(nPoly+1))) ||
            !(poly[nPoly].inputColumn 
              =SDDS_Malloc(sizeof(*(poly[nPoly].inputColumn))*5)) ||
            !(poly[nPoly].powerColumn 
              =SDDS_Malloc(sizeof(*(poly[nPoly].powerColumn))*5)))
          SDDS_Bomb("memory allocation failure");
        scanned[iArg].n_items -= 1;
        if (!scanItemList(&poly[nPoly].flags, scanned[iArg].list+1, &scanned[iArg].n_items, 0,
                          "filename", SDDS_STRING, &(poly[nPoly].filename), 1, POLY_FILE_SEEN,
                          "output", SDDS_STRING, &(poly[nPoly].outputColumn), 1, POLY_OUTPUT_SEEN,
                          "coefficients", SDDS_STRING, &(poly[nPoly].coefColumn), 1, POLY_COEF_SEEN,
                          "input0", SDDS_STRING, poly[nPoly].inputColumn+0, 1, POLY_IN0_SEEN,
                          "power0", SDDS_STRING, poly[nPoly].powerColumn+0, 1, POLY_OUT0_SEEN,
                          "input1", SDDS_STRING, poly[nPoly].inputColumn+1, 1, POLY_IN1_SEEN,
                          "power1", SDDS_STRING, poly[nPoly].powerColumn+1, 1, POLY_OUT1_SEEN,
                          "input2", SDDS_STRING, poly[nPoly].inputColumn+2, 1, POLY_IN2_SEEN,
                          "power2", SDDS_STRING, poly[nPoly].powerColumn+2, 1, POLY_OUT2_SEEN,
                          "input3", SDDS_STRING, poly[nPoly].inputColumn+3, 1, POLY_IN3_SEEN,
                          "power3", SDDS_STRING, poly[nPoly].powerColumn+3, 1, POLY_OUT3_SEEN,
                          "input4", SDDS_STRING, poly[nPoly].inputColumn+4, 1, POLY_IN4_SEEN,
                          "power4", SDDS_STRING, poly[nPoly].powerColumn+4, 1, POLY_OUT4_SEEN,
                          NULL) ||
            !(poly[nPoly].flags&POLY_FILE_SEEN) || !(poly[nPoly].flags&POLY_OUTPUT_SEEN) ||
            !(poly[nPoly].flags&POLY_COEF_SEEN) || !(poly[nPoly].flags&POLY_IN0_SEEN) ||
            !(poly[nPoly].flags&POLY_OUT0_SEEN))
          SDDS_Bomb("invalid -evaluate syntax");
        nPoly++;
        break;
      case CLO_PIPE:
        if (!processPipeOption(scanned[iArg].list+1, scanned[iArg].n_items-1, &pipeFlags))
          SDDS_Bomb("invalid -pipe syntax");
        break;
      default:
        fprintf(stderr, "error: unknown/ambiguous option: %s\n", 
                scanned[iArg].list[0]);
        exit(1);
        break;
      }
    }
    else {
      if (!input)
        input = scanned[iArg].list[0];
      else if (!output)
        output = scanned[iArg].list[0];
      else
        SDDS_Bomb("too many filenames seen");
    }
  }

  processFilenames("sddspoly", &input, &output, pipeFlags, 0, NULL);

  if (nPoly==0)
    SDDS_Bomb("give at least one -evaluate option");

  if (!SDDS_InitializeInput(&SDDSin, input))
    SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);

  if (!SDDS_InitializeCopy(&SDDSout, &SDDSin, output, "w"))
    SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
  for (iPoly=0; iPoly<nPoly; iPoly++) 
    initializePolynomial(&poly[iPoly], &SDDSin, &SDDSout);
  if (!SDDS_WriteLayout(&SDDSout))
    SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
  
  while (SDDS_ReadPage(&SDDSin)>0) {
    rows = SDDS_CountRowsOfInterest(&SDDSin);
    if (!SDDS_CopyPage(&SDDSout, &SDDSin))
      SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
    if (!(outputData = SDDS_Realloc(outputData, sizeof(*outputData)*rows)))
      SDDS_Bomb("memory allocation failure");
    for (iPoly=0; iPoly<nPoly; iPoly++) {
      for (iInput=0; iInput<poly[iPoly].nInputs; iInput++) {
        if (!(poly[iPoly].inputData[iInput]=
              SDDS_GetColumnInDoubles(&SDDSin, poly[iPoly].inputColumn[iInput])))
          SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
      }
      for (row=0; row<rows; row++) {
        for (iInput=0; iInput<poly[iPoly].nInputs; iInput++)
          poly[iPoly].input[iInput] = poly[iPoly].inputData[iInput][row];
        outputData[row] = evaluatePoly(poly[iPoly].coef, poly[iPoly].power, 
                                       poly[iPoly].nTerms,
                                       poly[iPoly].input, poly[iPoly].nInputs);
      }
      if (!SDDS_SetColumn(&SDDSout, SDDS_SET_BY_NAME,
                          outputData, rows, poly[iPoly].outputColumn))
        SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
    }
    if (!SDDS_WritePage(&SDDSout))
      SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors);
  }
  free(outputData);

  if (!SDDS_Terminate(&SDDSin)) {
    SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors);
    exit(1);
  }
  if (!SDDS_Terminate(&SDDSout)) {
    SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors);
    exit(1);
  }
  free_scanargs(&scanned,argc);
  FreePolynormialMemory(poly,nPoly);
  free(poly);
  
  return 0;
}
Ejemplo n.º 2
0
void
QSS_SEQ_initialize (SIM_simulator simulate)
{
  QSS_simulator simulator = (QSS_simulator) simulate->state->sim;
  getTime (simulator->iTime);
  int i, j, k, s, forUL;
  double e, zc[4];
  simulator->frw = FRW_Framework (simulator->data);
  double t = simulator->time->time;
  char logFile[128];
  strcpy (logFile, simulator->output->name);
  simulator->simulationLog = SD_SimulationLog (logFile);
  // Local mappings.
  QSS_data qssData = simulator->data;
  QSS_time qssTime = simulator->time;
  FRW_framework frw = simulator->frw;
  double *q = qssData->q;
  double *x = qssData->x;
  const int order = qssData->order;
  const int coeffs = order + 1;
#ifdef DEBUG
  SD_simulationSettings settings = simulator->settings;
  SD_simulationLog simulationLog = simulator->simulationLog;
#endif
  QSS_model qssModel = simulator->model;
  QA_quantizer quantizer;
  SD_output output = simulator->output;
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "Initialize simulation\n");
    }
#endif
  forUL = qssData->states;
  for (i = 0; i < forUL; i++)
    {
      qssData->lqu[i] = qssData->dQRel[i] * fabs (x[i * coeffs]);
      if (qssData->lqu[i] < qssData->dQMin[i])
	{
	  qssData->lqu[i] = qssData->dQMin[i];
	}
#ifdef DEBUG
      if (settings->debug & SD_DBG_InitValues)
	{
	  SD_print (simulationLog, "Initial value: x[%d][0] = %g", i, x[i * coeffs]);
	}
#endif
    }
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "Initialize solver...");
    }
#endif
  simulator->quantizer = QA_Quantizer (qssData, qssTime);
  quantizer = simulator->quantizer;
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize state derivatives...");
    }
#endif
  forUL = qssData->states;
  for (i = 0; i < forUL; i++)
    {
      FRW_recomputeDerivative (frw, qssModel, qssData, qssTime, i);
			QA_nextTime (quantizer,i,t,qssTime->nextStateTime,x,qssData->lqu);
#ifdef DEBUG
      if (settings->debug & SD_DBG_InitValues)
	{
	  SD_print (simulationLog, "Initial derivative: x[%d][1] = %g", i,
	      x[i * coeffs + 1]);
	}
#endif
    }
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize input...");
    }
#endif
  forUL = qssData->inputs;
  for (i = 0; i < forUL; i++)
    {
      j = qssData->TD[i];
      FRW_nextInputTime (frw, qssModel, qssData, qssTime, 0, j, i);
    }
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize events...");
    }
#endif
  forUL = qssData->events;
  for (i = 0; i < forUL; i++)
    {
      if (qssData->nZS[i])
	{
	  int nZS = qssData->nZS[i];
	  e = INF;
	  for (j = 0; j < nZS; j++)
	    {
	      k = qssData->ZS[i][j];
	      if (qssData->dQMin[k] < e)
		{
		  e = qssData->dQMin[k];
		}
	    }
	}
      else
	{
	  e = qssData->ft * qssData->params->zcHyst;
	}
      qssModel->events->zeroCrossing (i, q, qssData->d, qssData->alg,
				      qssTime->time, zc);
      s = sign (zc[0]);
      qssData->event[i].zcSign = s;
      qssData->event[i].zcHyst = e / 10.0;
      if (qssData->event[i].direction == 0 || qssData->event[i].direction == s
	  || zc[0] == 0)
	{
	  if (zc[0] == 0 && qssData->event[i].relation == 3)
	    {
	      qssModel->events->handlerPos (i, q, qssData->d, qssData->alg, t);
	    }
	  else if (zc[0] == 0 && qssData->event[i].relation == 1)
	    {
	      qssModel->events->handlerNeg (i, q, qssData->d, qssData->alg, t);
	    }
	  else if (s >= 0)
	    {
	      qssModel->events->handlerPos (i, q, qssData->d, qssData->alg, t);
	    }
	  else
	    {
	      qssModel->events->handlerNeg (i, q, qssData->d, qssData->alg, t);
	    }
	  qssModel->events->zeroCrossing (i, q, qssData->d, qssData->alg, t,
					  zc);
	  qssData->event[i].zcSign = sign (zc[0]);
	  int nHZ = qssData->nHZ[i];
	  for (k = 0; k < nHZ; k++)
	    {
	      j = qssData->HZ[i][k];
	      FRW_nextEventTime (frw, qssModel, qssData, qssTime, j);
	    }
	  int nHD = qssData->nHD[i];
	  for (k = 0; k < nHD; k++)
	    {
	      j = qssData->HD[i][k];
	      e = t - qssTime->tx[j];
	      if (e > 0)
		{
		  int cf0 = j * coeffs;
		  x[cf0] = evaluatePoly (cf0, e, x, order);
		}
	      qssTime->tx[j] = t;
	      FRW_recomputeDerivative (frw, qssModel, qssData, qssTime, j);
	    }
	  if (nHD)
	    {
	      QA_recomputeNextTimes (quantizer, nHD, qssData->HD[i], t,
				     qssTime->nextStateTime, x, qssData->lqu,
				     q);
	    }
	}
      FRW_nextEventTime (frw, qssModel, qssData, qssTime, i);
    }
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize state variables time...");
    }
#endif
  forUL = qssData->states;
  for (i = 0; i < forUL; i++)
    {
      QA_recomputeNextTime (quantizer, i, qssTime->time, qssTime->nextStateTime,
			    x, qssData->lqu, q);
    }
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize output...");
    }
#endif
  simulator->log = OUT_Output (qssData, qssTime, output);
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
      SD_print (simulationLog, "Initialize time...");
    }
#endif
  simulator->scheduler = SC_Scheduler (qssData, qssTime);
#ifdef DEBUG
  if (settings->debug & SD_DBG_InitValues)
    {
      SD_print (simulationLog, "done.");
    }
  if (settings->debug & SD_DBG_VarChanges)
    {
      SD_setSimulationLogVariables(simulationLog, qssData->states, qssData->events);
    }
#endif
  QSS_SEQ_logMemory (simulator);
  getTime (simulator->sTime);
  subTime (simulator->sTime, simulator->iTime);
  simulator->initTime += getTimeValue (simulator->sTime);
}