IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 17, 2020, 12:23:03 PM (6 years ago)
Author:
eugene
Message:

add options for rectangular vs trapezoidal integration

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/integrate.c

    r20936 r41418  
    33int integrate (int argc, char **argv) {
    44 
    5   int i, N, VERBOSE, isFloat;
    6   opihi_flt *Yf;
    7   opihi_int *Yi;
    8   double start, end, value, range, dvalue;
    9   Vector *vecx, *vecy;
     5  int N;
    106
    11   VERBOSE = FALSE;
     7  int VERBOSE = FALSE;
    128  if ((N = get_argument (argc, argv, "-v"))) {
    139    VERBOSE = TRUE;
     
    1511  }
    1612
     13  int TRAPEZOID = TRUE;
     14  if ((N = get_argument (argc, argv, "-trapezoid"))) {
     15    TRAPEZOID = TRUE;
     16    remove_argument (N, &argc, argv);
     17  }
     18  if ((N = get_argument (argc, argv, "-trap"))) {
     19    TRAPEZOID = TRUE;
     20    remove_argument (N, &argc, argv);
     21  }
     22  if ((N = get_argument (argc, argv, "-t"))) {
     23    TRAPEZOID = TRUE;
     24    remove_argument (N, &argc, argv);
     25  }
     26
     27  if ((N = get_argument (argc, argv, "-rectangular"))) {
     28    TRAPEZOID = FALSE;
     29    remove_argument (N, &argc, argv);
     30  }
     31  if ((N = get_argument (argc, argv, "-rect"))) {
     32    TRAPEZOID = FALSE;
     33    remove_argument (N, &argc, argv);
     34  }
     35  if ((N = get_argument (argc, argv, "-r"))) {
     36    TRAPEZOID = FALSE;
     37    remove_argument (N, &argc, argv);
     38  }
     39
    1740  if (argc != 5) {
    18     gprint (GP_ERR, "USAGE: integrate <x> <y> start end\n");
     41    gprint (GP_ERR, "USAGE: integrate <x> <y> start end [-v] [-r] [-t]\n");
     42    gprint (GP_ERR, " -v : verbose mode - report $sum and $range\n");
     43    gprint (GP_ERR, " -r : use rectangular integration\n");
     44    gprint (GP_ERR, " -t : use trapezoidal integration (default)\n");
    1945    return (FALSE);
    2046  }
    2147
     48  Vector *vecx = NULL, *vecy = NULL;
    2249  if ((vecx = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
    2350  if ((vecy = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
    2451
    25   start = atof (argv[3]);
    26   end   = atof (argv[4]);
     52  double start = atof (argv[3]);
     53  double end   = atof (argv[4]);
    2754
    28   isFloat = vecy[0].type == OPIHI_FLT;
    29   Yf = vecy[0].elements.Flt;
    30   Yi = vecy[0].elements.Int;
     55  int isFloat = vecy[0].type == OPIHI_FLT;
     56  opihi_flt *Yf = vecy[0].elements.Flt;
     57  opihi_int *Yi = vecy[0].elements.Int;
    3158
    32   value = 0;
    33   range = 0;
     59  double value = 0;
     60  double range = 0;
    3461
    35   if (vecx[0].type == OPIHI_FLT) {
    36     opihi_flt *X = vecx[0].elements.Flt;
    37     for (i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
    38       if ((*X >= start) && (*X <= end)) {
    39         dvalue = (isFloat) ? *Yf : *Yi;
    40         value += dvalue * (X[1] - X[0]);
    41         range += (X[1] - X[0]);
    42       }
    43     }     
     62  if (TRAPEZOID) {
     63    if (vecx[0].type == OPIHI_FLT) {
     64      opihi_flt *X = vecx[0].elements.Flt;
     65      for (int i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
     66        if ((*X >= start) && (*X <= end)) {
     67          double V0 = (isFloat) ? Yf[0] : Yi[0];
     68          double V1 = (isFloat) ? Yf[1] : Yi[1];
     69          value += (V1 + V0) * (X[1] - X[0]) / 2;
     70          range += (X[1] - X[0]);
     71        }
     72      }     
     73    } else {
     74      opihi_int *X = vecx[0].elements.Int;
     75      for (int i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
     76        if ((*X >= start) && (*X <= end)) {
     77          double V0 = (isFloat) ? Yf[0] : Yi[0];
     78          double V1 = (isFloat) ? Yf[1] : Yi[1];
     79          value += (V1 + V0) * (X[1] - X[0]) / 2;
     80          range += (X[1] - X[0]);
     81        }
     82      }     
     83    }
    4484  } else {
    45     opihi_int *X = vecx[0].elements.Int;
    46     for (i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
    47       if ((*X >= start) && (*X <= end)) {
    48         dvalue = (isFloat) ? *Yf : *Yi;
    49         value += dvalue * (X[1] - X[0]);
    50         range += (X[1] - X[0]);
    51       }
    52     }     
     85    if (vecx[0].type == OPIHI_FLT) {
     86      opihi_flt *X = vecx[0].elements.Flt;
     87      for (int i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
     88        if ((*X >= start) && (*X <= end)) {
     89          double dvalue = (isFloat) ? *Yf : *Yi;
     90          value += dvalue * (X[1] - X[0]);
     91          range += (X[1] - X[0]);
     92        }
     93      }     
     94    } else {
     95      opihi_int *X = vecx[0].elements.Int;
     96      for (int i = 0; i < vecx[0].Nelements-1; i++, X++, Yi++, Yf++) {
     97        if ((*X >= start) && (*X <= end)) {
     98          double dvalue = (isFloat) ? *Yf : *Yi;
     99          value += dvalue * (X[1] - X[0]);
     100          range += (X[1] - X[0]);
     101        }
     102      }     
     103    }
    53104  }
    54105
Note: See TracChangeset for help on using the changeset viewer.