- Timestamp:
- Sep 17, 2020, 12:23:03 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.data/integrate.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/integrate.c
r20936 r41418 3 3 int integrate (int argc, char **argv) { 4 4 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; 10 6 11 VERBOSE = FALSE;7 int VERBOSE = FALSE; 12 8 if ((N = get_argument (argc, argv, "-v"))) { 13 9 VERBOSE = TRUE; … … 15 11 } 16 12 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 17 40 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"); 19 45 return (FALSE); 20 46 } 21 47 48 Vector *vecx = NULL, *vecy = NULL; 22 49 if ((vecx = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE); 23 50 if ((vecy = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE); 24 51 25 start = atof (argv[3]);26 end = atof (argv[4]);52 double start = atof (argv[3]); 53 double end = atof (argv[4]); 27 54 28 i sFloat = 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; 31 58 32 value = 0;33 range = 0;59 double value = 0; 60 double range = 0; 34 61 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 } 44 84 } 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 } 53 104 } 54 105
Note:
See TracChangeset
for help on using the changeset viewer.
