This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Data Structures | |
| struct | polynom3 |
Defines | |
| #define | POLYMAX 100 |
| #define | SP_NATURAL 1 |
| #define | SP_DERIVATIVE 2 |
| #define | SP_PERIODIC 3 |
| #define | splint(poly, x) (poly.a + (x)*(poly.b + (x)*(poly.c + (x)*poly.d))) |
| #define | splint1(poly, x) (poly.b + (x)*(2.*poly.c + (x)*3.*poly.d)) |
| #define | splint2(poly, x) (2.*poly.c + (x)*6.*poly.d) |
Functions | |
| real | polynomial (real *xp, real *yp, real *z, real x, real y) |
| void | CubicPolynom (real x0, real y0, real x1, real y1, real x2, real y2, real x3, real y3, real *ex, real *fx, real *gx, real *ey, real *fy, real *gy, real *rd2) |
| void | spline (real1D x, real1D y, int n, real yp1, real ypn, real1D d2y, polynom3 *poly, int flag) |
| void | tridag (real1D a, real1D b, real1D c, real1D r, real1D u, int n) |
| void | Pspline (real1D x, real1D y, real1D d2y, real lp, int n, polynom3 *poly) |
| real | splint_find (real1D xa, polynom3 *poly, int n, real x) |
| int | distmin (polynom3 px, polynom3 py, real xp, real yp, real *tmin, real t1, real t2, real prec) |
| int | polyroot (polynom3 poly, real x1, real x2, real *x, real prec) |
| int | polyroots (polynom3 poly, real x1, real x2, real *x, real y, real prec) |
| void | bcucof (real2D f, int i, int j, real *c, int nx, int ny) |
| real | bcuint (real t, real u, real *c) |
| real | polydistmin (polynom3 px1, polynom3 px2, polynom3 py1, polynom3 py2, real *t1, real *t2, real ftol) |
| real | trapzd (real(*func)(polynom3, polynom3, real), polynom3 px, polynom3 py, real a, real b, int n) |
| real | qtrap (real(*func)(polynom3, polynom3, real), polynom3 px, polynom3 py, real a, real b, real eps) |
|
|
Definition at line 2 of file interpolation.h. Referenced by distmin(), and polyroot(). |
|
|
Definition at line 4 of file interpolation.h. Referenced by interface_splines(), and spline(). |
|
|
Definition at line 3 of file interpolation.h. Referenced by interface_splines(), and spline(). |
|
|
Definition at line 5 of file interpolation.h. |
|
|
|
Definition at line 8 of file interpolation.h. Referenced by advect(), avg_kappa_normals(), closest_normal(), curvature_write(), extra_poly(), interfaces_xmoment(), interfaces_ymoment(), kappa_normals(), and polyroot(). |
|
|
Definition at line 9 of file interpolation.h. Referenced by avg_kappa_normals(), curvature_write(), and kappa_normals(). |
|
||||||||||||||||||||||||||||
|
Definition at line 376 of file interpolation.c.
00377 {
00378 static int wt[16][16]= {
00379 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
00380 {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
00381 {-3,0,0,3,0,0,0,0,-2,0,0,-1,0,0,0,0},
00382 {2,0,0,-2,0,0,0,0,1,0,0,1,0,0,0,0},
00383 {0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
00384 {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
00385 {0,0,0,0,-3,0,0,3,0,0,0,0,-2,0,0,-1},
00386 {0,0,0,0,2,0,0,-2,0,0,0,0,1,0,0,1},
00387 {-3,3,0,0,-2,-1,0,0,0,0,0,0,0,0,0,0},
00388 {0,0,0,0,0,0,0,0,-3,3,0,0,-2,-1,0,0},
00389 {9,-9,9,-9,6,3,-3,-6,6,-6,-3,3,4,2,1,2},
00390 {-6,6,-6,6,-4,-2,2,4,-3,3,3,-3,-2,-1,-1,-2},
00391 {2,-2,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
00392 {0,0,0,0,0,0,0,0,2,-2,0,0,1,1,0,0},
00393 {-6,6,-6,6,-3,-3,3,3,-4,4,2,-2,-2,-2,-1,-1},
00394 {4,-4,4,-4,2,2,-2,-2,2,-2,-2,2,1,1,1,1}
00395 };
00396 int k;
00397 real xx, x[16];
00398
00399 /* function */
00400 x[0] = f[i][j]; x[1] = f[i+1][j]; x[2] = f[i+1][j+1]; x[3] = f[i][j+1];
00401
00402 /* x component of the gradient */
00403 x[4] = 0.5*(f[i+1][j] - f[i-1][j]);
00404 if (i+2 <= nx) {
00405 x[5] = 0.5*(f[i+2][j] - f[i][j]);
00406 x[6] = 0.5*(f[i+2][j+1] - f[i][j+1]);
00407 }
00408 else { /* periodic boundary conditions */
00409 x[5] = 0.5*(f[i+2 - nx + 2][j] - f[i][j]);
00410 x[6] = 0.5*(f[i+2 - nx + 2][j+1] - f[i][j+1]);
00411 }
00412 x[7] = 0.5*(f[i+1][j+1] - f[i-1][j+1]);
00413
00414 /* y component of the gradient */
00415 x[8] = 0.5*(f[i][j+1] - f[i][j-1]);
00416 x[9] = 0.5*(f[i+1][j+1] - f[i+1][j-1]);
00417 if (j+2 <= ny) {
00418 x[10] = 0.5*(f[i+1][j+2] - f[i+1][j]);
00419 x[11] = 0.5*(f[i][j+2] - f[i][j]);
00420 }
00421 else /* zero gradient */
00422 x[10] = x[11] = 0.0;
00423
00424 /* cross derivatives */
00425 x[12] = 0.25*(f[i+1][j+1] - f[i+1][j-1] - f[i-1][j+1] + f[i-1][j-1]);
00426 if (i+2 <= nx) {
00427 x[13] = 0.25*(f[i+2][j+1] - f[i+2][j-1] - f[i][j+1] + f[i][j-1]);
00428 if (j+2 <= ny) {
00429 x[14] = 0.25*(f[i+2][j+2] - f[i+2][j] - f[i][j+2] + f[i][j]);
00430 x[15] = 0.25*(f[i+1][j+2] - f[i+1][j] - f[i-1][j+2] + f[i-1][j]);
00431 }
00432 else /* zero gradient */
00433 x[14] = x[15] = 0.0;
00434 }
00435 else { /* periodic boundary conditions */
00436 x[13] = 0.25*(f[i+2 - nx + 2][j+1] - f[i+2 - nx + 2][j-1]
00437 - f[i][j+1] + f[i][j-1]);
00438 if (j+2 <= ny) {
00439 x[14] = 0.25*(f[i+2-nx+2][j+2] - f[i+2-nx+2][j] - f[i][j+2] + f[i][j]);
00440 x[15] = 0.25*(f[i+1][j+2] - f[i+1][j] - f[i-1][j+2] + f[i-1][j]);
00441 }
00442 else /* zero gradient */
00443 x[14] = x[15] = 0.0;
00444 }
00445
00446 for (i = 0; i <= 15; i++) {
00447 xx = 0.0;
00448 for (k = 0; k <= 15; k++) xx += wt[i][k]*x[k];
00449 c[i] = xx;
00450 }
00451 }
|
|
||||||||||||||||
|
Definition at line 454 of file interpolation.c. References real.
00455 {
00456 int i;
00457 real ans = 0.0;
00458
00459 for (i = 3; i >= 0; i--)
00460 ans = t*(ans) + ((c[4*i + 3]*u + c[4*i + 2])*u + c[4*i + 1])*u + c[4*i];
00461 return ans;
00462 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 473 of file interpolation.c.
00478 {
00479 real d0, d1, d2, det;
00480 real a1, a2, a3;
00481
00482 d0 = sqrt(sq(x1 - x0) + sq(y1 - y0));
00483 d1 = d0 + sqrt(sq(x2 - x1) + sq(y2 - y1));
00484 d2 = d1 + sqrt(sq(x3 - x2) + sq(y3 - y2));
00485
00486 det = (d0*d1*(-d0 + d1)*d2*(-d0 + d2)*(-d1 + d2));
00487
00488 a1 = sq(d0)*(x0*(d1 - d2) + d2*x2 - d1*x3);
00489 a2 = sq(d1)*(x0*(d2 - d0) - d2*x1 + d0*x3);
00490 a3 = sq(d2)*(x0*(d0 - d1) + d1*x1 - d0*x2);
00491
00492 *ex = (a1 + a2 + a3) / det;
00493 *fx = - (d0*a1 + d1*a2 + d2*a3) / det;
00494 *gx = (sq(d0)*sq(d2)*(d2 - d0)*
00495 (d0*d0*d0*(x0 - x2) + d1*d1*d1*(x1 - x0)) +
00496 sq(d0)*sq(d1)*(d0 - d1)*
00497 (d0*d0*d0*(x0 - x3) + d2*d2*d2*(x1 - x0)))
00498 / (d0*d0*d0*det);
00499
00500 a1 = sq(d0)*(y0*(d1 - d2) + d2*y2 - d1*y3);
00501 a2 = sq(d1)*(y0*(d2 - d0) - d2*y1 + d0*y3);
00502 a3 = sq(d2)*(y0*(d0 - d1) + d1*y1 - d0*y2);
00503
00504 *ey = (a1 + a2 + a3) / det;
00505 *fy = - (d0*a1 + d1*a2 + d2*a3) / det;
00506 *gy = (sq(d0)*sq(d2)*(d2 - d0)*
00507 (d0*d0*d0*(y0 - y2) + d1*d1*d1*(y1 - y0)) +
00508 sq(d0)*sq(d1)*(d0 - d1)*
00509 (d0*d0*d0*(y0 - y3) + d2*d2*d2*(y1 - y0)))
00510 / (d0*d0*d0*det);
00511
00512 *rd2 = d2;
00513 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 194 of file interpolation.c. References polynom3::a, polynom3::b, polynom3::c, polynom3::d, POLYMAX, real, and sq. Referenced by closest_normal().
00196 {
00197 real a, b, c, d, e, f;
00198 real guess = 0.5*(t1 + t2), xh, xl, fl, fh, dxold, dx, f1, df, temp;
00199 int niter = 0;
00200
00201 a = px.a*px.b + py.a*py.b - px.b*xp - py.b*yp;
00202 b = sq(px.b) + sq(py.b) + 2.*(px.a*px.c + py.a*py.c - px.c*xp - py.c*yp);
00203 c = 3.*(px.b*px.c + py.b*py.c + px.a*px.d + py.a*py.d - px.d*xp - py.d*yp);
00204 d = 2.*(sq(px.c) + sq(py.c) + 2.*px.b*px.d + 2.*py.b*py.d);
00205 e = 5.*(px.c*px.d + py.c*py.d);
00206 f = 3.*(sq(px.d) + sq(py.d));
00207 #define dist(x) (a+(x)*(b+(x)*(c+(x)*(d+(x)*(e+(x)*f)))))
00208 #define dist1(x) (b+(x)*(2.*c+(x)*(3.*d+(x)*(4.*e+(x)*5.*f))))
00209
00210 fl = dist(t1);
00211 fh = dist(t2);
00212 if (fabs(fl) < prec) { *tmin = t1; return 1; }
00213 if (fabs(fh) < prec) { *tmin = t2; return 1; }
00214 if (fl < 0.0) {
00215 xl = t1;
00216 xh = t2;
00217 }
00218 else {
00219 xl = t2;
00220 xh = t1;
00221 }
00222 dxold = fabs(t2 - t1);
00223 dx = dxold;
00224 f1 = dist(guess);
00225 df = dist1(guess);
00226 while (niter++ < POLYMAX) {
00227 if ((((guess - xh)*df - f1)*((guess - xl)*df - f1) >= 0.0) ||
00228 (fabs(2.0*f1) > fabs(dxold*df))) {
00229 dxold = dx;
00230 dx = 0.5*(xh - xl);
00231 guess = xl + dx;
00232 }
00233 else {
00234 dxold = dx;
00235 dx = f1 / df;
00236 temp = guess;
00237 guess -= dx;
00238 }
00239 f1 = dist(guess);
00240 if (fabs(f1) < prec) { if (guess > t2 || guess < t1) return 0;
00241 *tmin = guess; return 1; }
00242 df = dist1(guess);
00243 if (f1 < 0.0)
00244 xl = guess;
00245 else
00246 xh = guess;
00247 }
00248 return 0;
00249
00250 #undef dist
00251 #undef dist1
00252 }
|
|
||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
Definition at line 524 of file interpolation.c.
00525 {
00526 int i, j, k, i1;
00527 real a[NPTS][NPTS], lambda[NPTS], max, temp, xp2, yp2;
00528
00529 for (i = 0; i < NPTS; i++) {
00530 xp2 = xp[i]*xp[i]; yp2 = yp[i]*yp[i];
00531 a[i][0] = 1.0;
00532 a[i][1] = yp[i];
00533 a[i][2] = yp2;
00534 a[i][3] = xp[i];
00535 a[i][4] = xp[i]*yp[i];
00536 a[i][5] = xp[i]*yp2;
00537 a[i][6] = xp2;
00538 a[i][7] = xp2*yp[i];
00539 a[i][8] = xp2*yp2;
00540 }
00541
00542 /* solve the system of equations using gauss pivoting */
00543 for (j = 0; j <= NPTS - 2; j++) {
00544 i1 = j;
00545 max = fabs(a[j][j]);
00546 for (i = j + 1; i < NPTS; i++) {
00547 if (fabs(a[i][j]) >= max) {
00548 i1 = i;
00549 max = fabs(a[i][j]);
00550 }
00551 }
00552 for (k = j; k < NPTS; k++) {
00553 max = a[j][k]; a[j][k] = a[i1][k]; a[i1][k] = max;
00554 }
00555 max = z[j]; z[j] = z[i1]; z[i1] = max;
00556 for (i = j + 1; i < NPTS; i++) {
00557 if (a[j][j] == 0.) {
00558 printf("polynomial(%g, %g): no solution\n", x, y);
00559 for (i = 0; i < NPTS; i++)
00560 printf("%g %g\n", xp[i], yp[i]);
00561 return 0.0;
00562 }
00563 else
00564 temp = a[i][j] / a[j][j];
00565 for (k = j; k < NPTS; k++)
00566 a[i][k] -= temp * a[j][k];
00567 z[i] -= temp * z[j];
00568 }
00569 }
00570 if (a[NPTS - 1][NPTS - 1] == 0.) {
00571 printf("polynomial(%g, %g): no solution\n", x, y);
00572 for (i = 0; i < NPTS; i++)
00573 printf("%g %g\n", xp[i], yp[i]);
00574 return 0.0;
00575 }
00576 else
00577 lambda[NPTS - 1] = z[NPTS - 1] / a[NPTS - 1][NPTS - 1];
00578 for (i = NPTS - 2; i >= 0; i--) {
00579 lambda[i] = z[i];
00580 for (k = i + 1; k < NPTS; k++)
00581 lambda[i] -= a[i][k] * lambda[k];
00582 lambda[i] /= a[i][i];
00583 }
00584
00585 /* compute the value for coordinate (x,y)
00586 using the approximating function */
00587 xp2 = x*x;
00588 yp2 = y*y;
00589 return lambda[0] + lambda[1]*y + lambda[2]*yp2 +
00590 x*(lambda[3] + lambda[4]*y + lambda[5]*yp2) +
00591 xp2*(lambda[6] + lambda[7]*y + lambda[8]*yp2);
00592 }
|
|
||||||||||||||||||||||||
|
Definition at line 255 of file interpolation.c. References POLYMAX, real, splint, and splint1. Referenced by polyroots().
00256 {
00257 real guess = 0.5*(x1 + x2), xh, xl, fl, fh, dxold, dx, f, df, temp;
00258 int niter = 0;
00259
00260 /* Solving for the polynomial root using a combination of
00261 bissection and Newton's solver */
00262 fl = splint(poly, x1);
00263 fh = splint(poly, x2);
00264 if (fl == 0.0) {
00265 *x = x1;
00266 return 0;
00267 }
00268 if (fh == 0.0) {
00269 *x = x2;
00270 return 0;
00271 }
00272 if (fl < 0.0) {
00273 xl = x1;
00274 xh = x2;
00275 }
00276 else {
00277 xl = x2;
00278 xh = x1;
00279 }
00280 dxold = fabs(x2 - x1);
00281 dx = dxold;
00282 f = splint(poly, guess);
00283 df = splint1(poly, guess);
00284 while (niter++ < POLYMAX)
00285 {
00286 if ((((guess - xh)*df - f)*((guess - xl)*df - f) >= 0.0) ||
00287 (fabs(2.0*f) > fabs(dxold*df))) {
00288 dxold = dx;
00289 dx = 0.5*(xh - xl);
00290 guess = xl + dx;
00291 }
00292 else {
00293 dxold = dx;
00294 dx = f / df;
00295 temp = guess;
00296 guess -= dx;
00297 }
00298 f = splint(poly, guess);
00299 if (fabs(f) < prec) {
00300 *x = guess;
00301 return niter;
00302 }
00303 df = splint1(poly, guess);
00304 if (f < 0.0)
00305 xl = guess;
00306 else
00307 xh = guess;
00308 }
00309 fprintf(stderr, "WARNING polyroot(): Can not find a root in [%g,%g]\n", x1, x2);
00310 return POLYMAX + 1;
00311 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 314 of file interpolation.c. References polynom3::a, polynom3::b, polynom3::c, polynom3::d, polyroot(), real, splint, and sq. Referenced by cut_interface(), interface_fluxes(), interface_hfrac(), and interface_vfrac().
00315 {
00316 real delta, a, b, c, t1, t2, y1, y2, yt1, yt2;
00317 int n = 0;
00318
00319 poly.a -= y;
00320
00321 if (x1 > x2) { a = x1; x1 = x2; x2 = a; }
00322 y1 = splint(poly, x1);
00323 y2 = splint(poly, x2);
00324 /* find the extrema contained in {x1, x2} (if any) */
00325 a = 3.*poly.d;
00326 b = 2.*poly.c;
00327 c = poly.b;
00328 delta = sq(b) - 4.*a*c;
00329 if (delta < 0.0) /* no extremum anywhere -> one root maximum */
00330 t1 = t2 = x2 + 1.;
00331 else if (delta == 0.0) { /* one extremum -> two roots maximum */
00332 t1 = -b / (2.*a);
00333 t2 = x2 + 1.;
00334 if (t1 > t2) {a = t1; t1 = t2; t2 = a; }
00335 }
00336 else { /* two extrema -> three roots maximum */
00337 delta = sqrt(delta);
00338 t1 = (-b + delta) / (2.*a);
00339 t2 = (-b - delta) / (2.*a);
00340 if (t1 > t2) {a = t1; t1 = t2; t2 = a; }
00341 }
00342
00343 /* no extremum in [x1,x2] -> one root maximum in [x1,x2] */
00344 if ((t1 < x1 && t2 > x2) || t1 > x2 || t2 < x1) {
00345 if (y1*y2 <= 0.0) {
00346 polyroot(poly, x1, x2, x, prec);
00347 return 1;
00348 }
00349 return 0;
00350 }
00351
00352 yt1 = splint(poly, t1);
00353 yt2 = splint(poly, t2);
00354
00355 /* one extremum near x1 */
00356 if (t1 >= x1 && y1*yt1 <= 0.0)
00357 polyroot(poly, x1, t1, &(x[n++]), prec);
00358 if (t1 < x1 && t2 <= x2 && y1*yt2 <= 0.0)
00359 polyroot(poly, x1, t2, &(x[n++]), prec);
00360
00361 /* one extremum near x2 */
00362 if (t2 <= x2 && y2*yt2 <= 0.0)
00363 polyroot(poly, t2, x2, &(x[n++]), prec);
00364 if (t2 > x2 && t1 <= x2 && y2*yt1 <= 0.0)
00365 polyroot(poly, t1, x2, &(x[n++]), prec);
00366
00367 /* two extrema in [x1,x2] */
00368 if (t1 >= x1 && t2 <= x2 && yt1*yt2 <= 0.0)
00369 polyroot(poly, t1, t2, &(x[n++]), prec);
00370
00371 return n;
00372 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 105 of file interpolation.c. References polynom3::a, polynom3::b, polynom3::c, polynom3::d, real, real1D, and tridag(). Referenced by interface_splines().
00106 {
00107 real1D a, b, c, r, z, u;
00108 real alpha, gamma, fact, x1, x2, y1, y2, z1, z2, h;
00109 int i;
00110
00111 a = (real1D) malloc(n*sizeof(real));
00112 b = (real1D) malloc(n*sizeof(real));
00113 c = (real1D) malloc(n*sizeof(real));
00114 r = (real1D) malloc(n*sizeof(real));
00115 z = (real1D) malloc(n*sizeof(real));
00116 u = (real1D) malloc(n*sizeof(real));
00117
00118 b[0] = x[1] - x[n-1] + lp;
00119 c[0] = 0.5*(x[1] - x[0]);
00120 r[0] = 3.0*((y[1] - y[0])/(x[1] - x[0]) -
00121 (y[0] - y[n-1])/(x[0] - x[n-1] + lp));
00122 for (i = 1; i < n - 1; i++) {
00123 a[i] = 0.5*(x[i] - x[i-1]);
00124 b[i] = x[i+1] - x[i-1];
00125 c[i] = 0.5*(x[i+1] - x[i]);
00126
00127 r[i] = 3.0*((y[i+1] - y[i])/(x[i+1] - x[i]) -
00128 (y[i] - y[i-1])/(x[i] - x[i-1]));
00129 }
00130 a[n-1] = 0.5*(x[n-1] - x[n-2]);
00131 b[n-1] = x[0] - x[n-2] + lp;
00132 r[n-1] = 3.0*((y[0] - y[n-1])/(x[0] - x[n-1] + lp) -
00133 (y[n-1] - y[n-2])/(x[n-1] - x[n-2]));
00134 alpha = 0.5*(x[0] - x[n-1] + lp);
00135
00136 gamma = -b[0];
00137 b[0] -= gamma;
00138 b[n-1] -= alpha*alpha/gamma;
00139 tridag(a, b, c, r, d2y, n);
00140
00141 u[0] = gamma;
00142 u[n-1] = alpha;
00143 for (i = 1; i < n - 1; i++)
00144 u[i] = 0.0;
00145 tridag(a, b, c, u, z, n);
00146
00147 fact = (d2y[0] + alpha*d2y[n-1]/gamma)/(1.0 + z[0] + alpha*z[n-1]/gamma);
00148 for (i = 0; i < n; i++)
00149 d2y[i] -= fact*z[i];
00150
00151 /* Fill the coefficients of the interpolating polynomial for each segment */
00152 for (i = 0; i < n - 1; i++)
00153 {
00154 x1 = x[i]; y1 = y[i]; z1 = d2y[i];
00155 x2 = x[i+1]; y2 = y[i+1]; z2 = d2y[i+1];
00156 h = x2 - x1;
00157 poly[i].a = (x2*y1 - x1*y2)/h + h*(x1*z2 - x2*z1)/6.
00158 + (x2*x2*x2*z1 - x1*x1*x1*z2)/(6.*h);
00159 poly[i].b = (y2 - y1)/h + h*(z1 - z2)/6.
00160 + (x1*x1*z2 - x2*x2*z1)/(2.*h);
00161 poly[i].c = (x2*z1 - x1*z2)/(2.*h);
00162 poly[i].d = (z2 - z1)/(6.*h);
00163 }
00164 x1 = x[n - 1]; y1 = y[n - 1]; z1 = d2y[n - 1];
00165 x2 = x[0] + lp; y2 = y[0]; z2 = d2y[0];
00166 h = x2 - x1;
00167 poly[n - 1].a = (x2*y1 - x1*y2)/h + h*(x1*z2 - x2*z1)/6.
00168 + (x2*x2*x2*z1 - x1*x1*x1*z2)/(6.*h);
00169 poly[n - 1].b = (y2 - y1)/h + h*(z1 - z2)/6.
00170 + (x1*x1*z2 - x2*x2*z1)/(2.*h);
00171 poly[n - 1].c = (x2*z1 - x1*z2)/(2.*h);
00172 poly[n - 1].d = (z2 - z1)/(6.*h);
00173
00174 free(a); free(b); free(c); free(r); free(z); free(u);
00175 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 618 of file interpolation.c. References real, and trapzd().
00621 {
00622 int j;
00623 real s,olds;
00624
00625 olds = -1.0e30;
00626 for (j = 1; j <= 20; j++) {
00627 s = trapzd(func,px,py,a,b,j);
00628 if (fabs(s - olds) < eps*fabs(olds)) {
00629 printf("niter: %d\n", j);
00630 return s;
00631 }
00632 olds = s;
00633 }
00634 fprintf(stderr, "WARNING qtrap(): too many steps\n");
00635 return s;
00636 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 26 of file interpolation.c. References polynom3::a, polynom3::b, polynom3::c, polynom3::d, real, real1D, SP_DERIVATIVE, and SP_NATURAL. Referenced by interface_splines().
00028 {
00029 int i, k;
00030 real p, qn, sig, un, *u;
00031 real x1, y1, z1, x2, y2, z2, h;
00032
00033 u = (real1D) malloc(sizeof(real) * (n - 1));
00034
00035 switch(flag) {
00036 case SP_NATURAL: d2y[0] = u[0] = 0.0; break;
00037 case SP_DERIVATIVE:
00038 d2y[0] = -0.5;
00039 u[0] = (3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp1);
00040 break;
00041 default:
00042 fprintf(stderr, "spline(): Bad flag parameter\n");
00043 exit(1);
00044 }
00045
00046 for (i = 1; i < n - 1; i++) {
00047 sig = (x[i] - x[i-1]) / (x[i+1] - x[i-1]);
00048 p = sig * d2y[i-1] + 2.0;
00049 d2y[i] = (sig - 1.0) / p;
00050 u[i] = (y[i+1] - y[i]) / (x[i+1] - x[i]) - (y[i] - y[i-1])
00051 / (x[i] - x[i-1]);
00052 u[i] = (6.0 * u[i] / (x[i+1] - x[i-1]) - sig * u[i-1]) / p;
00053 }
00054
00055 switch(flag) {
00056 case SP_NATURAL: d2y[n - 1] = 0.0;
00057 break;
00058 case SP_DERIVATIVE:
00059 qn = 0.5;
00060 un = (3.0 / (x[n-1] - x[n-2])) * (ypn - (y[n-1] - y[n-2])
00061 / (x[n-1] - x[n-2]));
00062 d2y[n - 1] = (un - qn * u[n-2]) / (qn * d2y[n-2] + 1.0);
00063 break;
00064 }
00065
00066 for (k = n - 2; k >= 0; k--)
00067 d2y[k] = d2y[k] * d2y[k+1] + u[k];
00068 free(u);
00069
00070 /* Fill the coefficients of the interpolating polynomial for each segment */
00071 for (i = 0; i < n - 1; i++)
00072 {
00073 x1 = x[i]; y1 = y[i]; z1 = d2y[i];
00074 x2 = x[i+1]; y2 = y[i+1]; z2 = d2y[i+1];
00075 h = x2 - x1;
00076 poly[i].a = (x2*y1 - x1*y2)/h + h*(x1*z2 - x2*z1)/6.
00077 + (x2*x2*x2*z1 - x1*x1*x1*z2)/(6.*h);
00078 poly[i].b = (y2 - y1)/h + h*(z1 - z2)/6.
00079 + (x1*x1*z2 - x2*x2*z1)/(2.*h);
00080 poly[i].c = (x2*z1 - x1*z2)/(2.*h);
00081 poly[i].d = (z2 - z1)/(6.*h);
00082 }
00083 }
|
|
||||||||||||||||||||
|
Definition at line 178 of file interpolation.c. References polynom3::a, polynom3::b, polynom3::c, polynom3::d, real, and real1D. Referenced by interface_write_splines().
00179 {
00180 int klo, khi, k;
00181
00182 /* then search for the nearest lower point */
00183 klo = 0;
00184 khi = n - 1;
00185 while (khi - klo > 1) {
00186 k = (khi + klo) >> 1;
00187 if (xa[k] > x) khi = k;
00188 else klo = k;
00189 }
00190 return poly[klo].a + x*(poly[klo].b + x*(poly[klo].c + x*poly[klo].d));
00191 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 596 of file interpolation.c. References real. Referenced by qtrap().
00599 {
00600 real x,tnm,sum,del;
00601 static real s;
00602 int it,j;
00603
00604 if (n == 1) {
00605 return (s=0.5*(b-a)*((*func)(px,py,a)+(*func)(px,py,b)));
00606 } else {
00607 for (it=1,j=1;j<n-1;j++) it <<= 1;
00608 tnm=it;
00609 del=(b-a)/tnm;
00610 x=a+0.5*del;
00611 for (sum=0.0,j=1;j<=it;j++,x+=del) sum += (*func)(px,py,x);
00612 s=0.5*(s+(b-a)*sum/tnm);
00613 return s;
00614 }
00615 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 86 of file interpolation.c. Referenced by Pspline().
00087 {
00088 int j;
00089 real bet, *gam;
00090
00091 gam = (real *)malloc(n*sizeof(real));
00092 bet = b[0];
00093 u[0] = r[0]/bet;
00094 for (j = 1; j < n; j++) {
00095 gam[j] = c[j-1]/bet;
00096 bet = b[j] - a[j]*gam[j];
00097 u[j] = (r[j] - a[j]*u[j-1])/bet;
00098 }
00099 for (j = n - 2; j >= 0; j--)
00100 u[j] -= gam[j+1]*u[j+1];
00101 free(gam);
00102 }
|
1.2.18