IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 34522


Ignore:
Timestamp:
Oct 7, 2012, 2:36:26 PM (14 years ago)
Author:
eugene
Message:

rename spline functions to specify type, add dbl version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/lib.data/spline.c

    r16119 r34522  
    22
    33/* construct the natural spline for x, y in y2 */
    4 void spline_construct (float *x, float *y, int N, float *y2) {
     4void spline_construct_flt (float *x, float *y, int N, float *y2) {
    55
    66  int i;
     
    2727
    2828/* evaluate spline for x, y, y2 at X */
    29 float spline_apply (float *x, float *y, float *y2, int N, float X) {
     29float spline_apply_flt (float *x, float *y, float *y2, int N, float X) {
    3030
    3131  int i, lo, hi;
     
    5858
    5959}
     60
     61/* construct the natural spline for x, y in y2 */
     62void 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 */
     87opihi_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.