Changeset 34522
- Timestamp:
- Oct 7, 2012, 2:36:26 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20120905/Ohana/src/opihi/lib.data/spline.c
r16119 r34522 2 2 3 3 /* construct the natural spline for x, y in y2 */ 4 void spline_construct (float *x, float *y, int N, float *y2) {4 void spline_construct_flt (float *x, float *y, int N, float *y2) { 5 5 6 6 int i; … … 27 27 28 28 /* evaluate spline for x, y, y2 at X */ 29 float spline_apply (float *x, float *y, float *y2, int N, float X) {29 float spline_apply_flt (float *x, float *y, float *y2, int N, float X) { 30 30 31 31 int i, lo, hi; … … 58 58 59 59 } 60 61 /* construct the natural spline for x, y in y2 */ 62 void spline_construct_dbl (opihi_flt *x, opihi_flt *y, int N, opihi_flt *y2) { 63 64 int i; 65 opihi_flt dy, dx, *tmp; 66 67 ALLOCATE (tmp, opihi_flt, N); 68 69 y2[0] = tmp[0] = 0.0; 70 71 for (i = 1; i < N-1; i++) { 72 dx = (x[i+0] - x[i-1]) / (x[i+1] - x[i-1]); 73 dy = dx * y2[i-1] + 2.0; 74 y2[i] = (dx - 1.0) / dy; 75 tmp[i] = (y[i+1] - y[i+0]) / (x[i+1] - x[i+0]) - (y[i+0] - y[i-1]) / (x[i+0] - x[i-1]); 76 tmp[i] = (6.0 * tmp[i] / (x[i+1] - x[i-1]) - dx*tmp[i-1]) / dy; 77 } 78 79 y2[N-1] = 0; 80 for (i = N-2; i >= 1; i--) 81 y2[i] = y2[i]*y2[i+1] + tmp[i]; 82 83 free (tmp); 84 } 85 86 /* evaluate spline for x, y, y2 at X */ 87 opihi_flt spline_apply_dbl (opihi_flt *x, opihi_flt *y, opihi_flt *y2, int N, opihi_flt X) { 88 89 int i, lo, hi; 90 opihi_flt dx, a, b, value; 91 92 /* find correct element in array (x must be sorted) */ 93 lo = 0; 94 hi = N-1; 95 while (hi - lo > 1) { 96 i = 0.5*(hi+lo); 97 if (x[i] > X) { 98 hi = i; 99 } else { 100 lo = i; 101 } 102 } 103 104 /* error condition: duplicate abssisca */ 105 dx = x[hi] - x[lo]; 106 if (dx == 0.0) { 107 return (HUGE_VAL); 108 } 109 110 /* evaluate spline */ 111 a = (x[hi] - X) / dx; 112 b = (X - x[lo]) / dx; 113 114 value = a*y[lo] + b*y[hi] + ((a*a*a - a)*y2[lo] + (b*b*b - b)*y2[hi])*(dx*dx) / 6.0; 115 return (value); 116 117 }
Note:
See TracChangeset
for help on using the changeset viewer.
