Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 # define MAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
00026 # define MIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
00027
00028
00029
00030 int dsplint( double *xa, double *ya, double *y2a,
00031 int n, double x, double *y )
00032 {
00033
00034
00035 static int nsave = 0, khi, klo;
00036
00037 int i__1, i__2, k;
00038 double a, b, h__;
00039
00040
00041
00042
00043 --y2a;
00044 --ya;
00045 --xa;
00046
00047
00048 if ( n != nsave )
00049 {
00050
00051 nsave = n;
00052 klo = 1;
00053 khi = n;
00054 if ( xa[klo] > x )
00055 {
00056 return 1;
00057 }
00058 if ( xa[khi] < x )
00059 {
00060 return 2;
00061 }
00062 }
00063 else
00064 {
00065
00066
00067 if ( xa[klo] > x )
00068 {
00069
00070 khi = MAX( 2, klo );
00071 klo = khi - 1;
00072
00073 if ( xa[klo] > x )
00074 {
00075 klo = 1;
00076 }
00077 if ( xa[klo] > x )
00078 {
00079 return 1;
00080 }
00081 }
00082 else if ( xa[khi] <= x )
00083 {
00084
00085
00086 i__1 = khi, i__2 = n - 1;
00087 klo = MIN( i__1, i__2 );
00088 khi = klo + 1;
00089
00090 if ( xa[khi] <= x )
00091 {
00092 khi = n;
00093 }
00094 if ( xa[khi] < x )
00095 {
00096 return 2;
00097 }
00098 }
00099 }
00100 while ( khi - klo > 1 )
00101 {
00102 k = ( khi + klo ) / 2;
00103 if ( xa[k] > x )
00104 {
00105 khi = k;
00106 }
00107 else
00108 {
00109 klo = k;
00110 }
00111 }
00112 h__ = xa[khi] - xa[klo];
00113 if ( h__ <= 0. )
00114 {
00115 return 3;
00116 }
00117 a = ( xa[khi] - x ) / h__;
00118 b = ( x - xa[klo] ) / h__;
00119 *y = a * ya[klo] + b * ya[khi] + ( a * ( a * a - 1. ) * y2a[klo] + b * ( b *
00120 b - 1. ) * y2a[khi] ) * ( h__ * h__ ) / 6.;
00121
00122
00123
00124 return 0;
00125 }
00126