00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <math.h>
00012
00013
00014 double get_index(int sinlat, int n, double *x, double x0)
00015 {
00016 int i, i0, i1;
00017 double ind;
00018
00019 if (x0 <= x[0]) {
00020 i0 = 0; i1 = 1;
00021 } else if (x0 > x[n - 1]) {
00022 i0 = n - 2; i1 = n - 1;
00023 } else {
00024 for (int i = 0; i < n - 1; i++) {
00025 if (x0 > x[i] && x0 <= x[i + 1]) {
00026 i0 = i; i1 = i + 1;
00027 break;
00028 }
00029 }
00030 }
00031
00032 if (sinlat) {
00033 ind = i0 + (sin(x0) - sin(x[i0])) / (sin(x[i1]) - sin(x[i0]));
00034 } else {
00035 ind = i0 + (x0 - x[i0]) / (x[i1] - x[i0]);
00036 }
00037 return ind;
00038 }
00039
00040
00041
00042
00043 double linintd(double *f, int nx, int ny, double x, double y)
00044 {
00045 double p0, p1, q0, q1;
00046 int ilow, jlow;
00047 double *fptr;
00048 double u;
00049
00050 ilow = (int)floor(x);
00051 jlow = (int)floor(y);
00052 if (ilow < 0) ilow = 0;
00053 if (ilow + 1 >= nx) ilow -= 1;
00054 if (jlow < 0) jlow = 0;
00055 if (jlow + 1 >= ny) jlow -= 1;
00056 p1 = x - ilow;
00057 p0 = 1.0 - p1;
00058 q1 = y - jlow;
00059 q0 = 1.0 - q1;
00060
00061
00062 u = 0.0;
00063 fptr = f + jlow * nx + ilow;
00064 u += p0 * q0 * (*fptr++);
00065 u += p1 * q0 * (*fptr);
00066 fptr += nx - 1;
00067 u += p0 * q1 * (*fptr++);
00068 u += p1 * q1 * (*fptr);
00069 return u;
00070 }