Main Page   Data Structures   File List   Data Fields   Globals  

extra.h File Reference

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

Included by dependency graph

Go to the source code of this file.

Defines

#define INTERPLATE_FULL   1
#define INTERPLATE_INTER   2

Functions

void extra_velocity_normals (real x, real y, real n1, real n2, real xn, real yn, real2D u, real2D v, real2D ap, real *eu, real *ev, real *a11, real *a22, real *a12, real *a21, int nx, int ny)
void extra_velocity_normals2 (real x, real y, real n1, real n2, real xn, real yn, real2D u, real2D v, real2D ap, real *eu, real *ev, real *dudx, real *dudy, real *dvdx, real *dvdy, int nx, int ny)
void extra_velocity (real x, real y, real2D u, real2D v, real2D ap, interface in, real *eu, real *ev, int nx, int ny)
real kappa_normals (polynom3 px, polynom3 py, real t, real *nx, real *ny)
real avg_kappa_normals (polynom3 px, polynom3 py, real t1, real t2, real *nx, real *ny)
int closest_normal (real x, real y, interface in, real *xmin, real *ymin, real *pmin, real *tmin, real *xn, real *yn)


Define Documentation

#define INTERPLATE_FULL   1
 

Definition at line 1 of file extra.h.

Referenced by bc_vector().

#define INTERPLATE_INTER   2
 

Definition at line 2 of file extra.h.


Function Documentation

real avg_kappa_normals (  polynom3    px,
polynom3    py,
real    t1,
real    t2,
real *    nx,
real *    ny
) 
 

Definition at line 725 of file extra.c.

References real, splint, splint1, splint2, and sq.

00727 {
00728   static real coef[7] = {1., 3., 3., 2., 3., 3., 1.}; 
00729   int i;
00730   real xp, yp, y, h = (t2 - t1)/6., t, kappasum = 0.0, lsum = 0.0, dl2;
00731 
00732   for (i = 0; i < 7; i++) {
00733     t = t1 + h*i;
00734     xp = splint1(px, t);
00735     yp = splint1(py, t);
00736     dl2 = sq(xp) + sq(yp);
00737     kappasum += coef[i]*((xp*splint2(py, t) - yp*splint2(px, t))/dl2);
00738     /* axisymmetric term */
00739     y = splint(py, t) - 2.0;
00740     if (fabs(y) < 1e-2) /* second order approximation near the axis */
00741       kappasum -= coef[i]*splint2(px, t)/splint1(py, t);
00742     else
00743       kappasum -= coef[i]*xp/y;
00744     lsum += coef[i]*sqrt(dl2);
00745   }
00746   *nx = 8.*(splint(py, t2) - splint(py, t1))/(3.*h*lsum);
00747   *ny = - 8.*(splint(px, t2) - splint(px, t1))/(3.*h*lsum);
00748   return kappasum/lsum;
00749 }

int closest_normal (  real    x,
real    y,
interface    in,
real *    xmin,
real *    ymin,
real *    pmin,
real *    tmin,
real *    xn,
real *    yn
) 
 

Definition at line 51 of file extra.c.

References distmin(), interface_write_splines(), interface::n, PREC, real, splint, splint1, interface::spx, interface::spy, sq, interface::t, interface::x, and interface::y.

Referenced by extra_poly(), and extra_velocity().

00054 {
00055   int i, span;
00056   real d, dmin, dl;
00057   int imin, found = 0, which;
00058 
00059   /* find the closest segment */
00060 #if 0
00061   dmin = normal_dist(in.x[0], in.y[0], in.x[1], in.y[1], x, y, &which);
00062   imin = 0;
00063   for (i = 1; i < in.n - 1; i++) {
00064     d = normal_dist(in.x[i], in.y[i], in.x[i+1], in.y[i+1], x, y, &which);
00065     if (d < dmin) { 
00066       dmin = d;
00067       if (which == 0 || which == 1) imin = i;
00068       else imin = i + 1;
00069     }
00070   }
00071 #else
00072   /* find the closest marker */
00073   dmin = sq(x - in.x[0]) + sq(y - in.y[0]); imin = 0;
00074   for (i = 1; i < in.n; i++) {
00075     d = sq(x - in.x[i]) + sq(y - in.y[i]);
00076     if (d < dmin) { dmin = d; imin = i; }
00077   }  
00078 #endif
00079 
00080   /* find the closest point on the interface */
00081   i = imin; span = 1;
00082   if (i < in.n - 1)
00083     found = distmin(in.spx[i], in.spy[i], x, y, tmin,
00084                     in.t[i], in.t[i+1], PREC);
00085   while (!found && (i + span < in.n - 1 || i - span >= 0)) {
00086     if (i + span < in.n - 1 &&
00087         (found = distmin(in.spx[i+span], in.spy[i+span], x, y, tmin,
00088                          in.t[i+span], in.t[i+span+1], PREC)))
00089       imin = i + span;
00090     else if (i - span >= 0 &&
00091              (found = distmin(in.spx[i-span], in.spy[i-span], x, y, tmin,
00092                               in.t[i-span], in.t[i-span+1], PREC)))
00093       imin = i - span;    
00094     span++;
00095   }
00096   if (!found) { 
00097     FILE *fptr = fopen("closest_splines", "wt");
00098     interface_write_splines(in, fptr, 1000);
00099     fclose(fptr);
00100     printf("&&&& %g %g %d %g\n", x, y, imin, dmin); 
00101       printf("%g %g\n%g %g\n%g %g\n", in.x[imin-1], in.y[imin-1],
00102              in.x[imin], in.y[imin],
00103              in.x[imin+1], in.y[imin+1]);
00104       return 0; 
00105   }
00106 
00107   *xn = - splint1(in.spy[imin], *tmin);
00108   *yn = splint1(in.spx[imin], *tmin);
00109 
00110   dl = sqrt(sq(*xn) + sq(*yn));
00111   *xn /= dl; *yn /= dl;
00112   *xmin = splint(in.spx[imin], *tmin);
00113   *ymin = splint(in.spy[imin], *tmin);
00114   *pmin = (*tmin - in.t[imin])/(in.t[imin+1] - in.t[imin])
00115     *(in.p[imin+1] - in.p[imin]) + in.p[imin];
00116 
00117   return 1;
00118 }

void extra_velocity (  real    x,
real    y,
real2D    u,
real2D    v,
real2D    ap,
interface    in,
real *    eu,
real *    ev,
int    nx,
int    ny
) 
 

Definition at line 678 of file extra.c.

References closest_normal(), extra_velocity_normals(), extra_velocity_normals2(), real, and real2D.

Referenced by bc_vector_div().

00683 {
00684   real n1, n2;
00685   real a11, a22, a12, a21;
00686   real xmin, ymin, pmin, tmin;
00687   if (!closest_normal(x, y, in, &xmin, &ymin, &pmin, &tmin, &n1, &n2)) {
00688     fprintf(stderr, "extra_velocity(%g, %g): no closest_normal\n", x, y);
00689     exit(1);
00690   }
00691 #ifdef EXTRA_LINEAR
00692   extra_velocity_normals(x, y, n1, n2, xmin, ymin,
00693                          u, v, ap, 
00694                          eu, ev, &a11, &a22, &a12, &a21,
00695                          nx, ny);
00696 #else
00697   extra_velocity_normals2(x, y, n1, n2, xmin, ymin,
00698                           u, v, ap, 
00699                           eu, ev, &a11, &a22, &a12, &a21,
00700                           nx, ny);
00701 #endif
00702 }

void extra_velocity_normals (  real    x,
real    y,
real    n1,
real    n2,
real    xn,
real    yn,
real2D    u,
real2D    v,
real2D    ap,
real *    eu,
real *    ev,
real *    a11,
real *    a22,
real *    a12,
real *    a21,
int    nx,
int    ny
) 
 

Definition at line 212 of file extra.c.

References closest_u(), closest_v(), INU, INV, real, real2D, sq, and SQCLOSEST.

Referenced by advect(), and extra_velocity().

00218 {
00219   int i, j, k, l, l1, kmin, kmax, lmin, lmax;
00220   int nsx = 0, nsy = 0, dx, dy;
00221   real xSx = 0., xSxx = 0., xSxy = 0., xSy = 0., xSyy = 0.;
00222   real ySx = 0., ySxx = 0., ySxy = 0., ySy = 0., ySyy = 0.;
00223   real xSu = 0., xSxu = 0., xSyu = 0.;
00224   real ySv = 0., ySxv = 0., ySyv = 0.;
00225   real sys[7][7] = {{0.,0.,0.,0.,0.,0.,0.},
00226                     {0.,0.,0.,0.,0.,0.,0.},
00227                     {0.,0.,0.,0.,0.,0.,0.},
00228                     {0.,0.,0.,0.,0.,0.,0.},
00229                     {0.,0.,0.,0.,0.,0.,0.},
00230                     {0.,0.,0.,0.,0.,0.,0.},
00231                     {0.,0.,0.,0.,0.,0.,0.}};
00232   real rhs[7] = {0.,0.,0.,0.,0.,0.,0.}, sol[7], dummy;
00233 #ifdef DEBUG_EXTRA  
00234 FILE *fptr1 = fopen("extra_upoints", "at");
00235 FILE *fptr2 = fopen("extra_vpoints", "at");
00236 FILE *fptr3 = fopen("extra_points", "at");
00237 FILE *fptr4 = fopen("extra_normals", "at");
00238 #endif
00239 
00240 #if 0
00241   /* find the velocity points using a 5x5 or 4x4 stencil */
00242   i = x + 0.5; j = y;
00243   dx = dy = 1;
00244 
00245   do {
00246     nsx = 0;
00247     xSx = xSxx = xSxy = xSy = xSyy = 0.;
00248     xSu = xSxu = xSyu = 0.;
00249     
00250     if (modf(x + 0.5, &dummy) == 0.0) { kmin = i - dx; kmax = i + dx - 1; }
00251     else { kmin = i - dx; kmax = i + dx; }
00252 
00253     if (modf(y, &dummy) == 0.0) { lmin = j - dy; lmax = j + dy - 1; }
00254     else { lmin = j - dy; lmax = j + dy; }
00255 
00256     for (k = kmin; k <= kmax; k++)
00257       for (l = lmin; l <= lmax; l++) {
00258         l1 = l < 2 ? 3 - l : l;
00259         if (INU(k,l1)) {
00260           xSx += (real)k; xSxx += sq((real)k);
00261           xSxy += (0.5 + (real)l)*(real)k;
00262           xSy += 0.5 + (real)l; xSyy += sq(0.5 + (real)l);
00263           xSu += u[k][l1]; xSxu += u[k][l1]*(real)k;
00264           xSyu += u[k][l1]*(0.5 + (real)l);
00265 #ifdef DEBUG_EXTRA
00266           fprintf(fptr1, "%g %g %g\n", (real)k, 0.5 + (real)l, u[k][l1]);
00267 #endif
00268           nsx++;
00269         }
00270       }
00271     dx++; dy++;
00272   } while((nsx <=  kmax - kmin + 1 || nsx <= lmax - lmin + 1) && dx <= 3);
00273   
00274   i = x; j = y + 0.5;
00275   dx = dy = 1;
00276   do {
00277     nsy = 0;
00278     ySx = ySxx = ySxy = ySy = ySyy = 0.;
00279     ySv = ySxv = ySyv = 0.;
00280 
00281     if (modf(x, &dummy) == 0.0) { kmin = i - dx; kmax = i + dx - 1; }
00282     else { kmin = i - dx; kmax = i + dx; }
00283 
00284     if (modf(y + 0.5, &dummy) == 0.0) { lmin = j - dy; lmax = j + dy - 1; }
00285     else { lmin = j - dy; lmax = j + dy; }
00286 
00287     for (k = kmin; k <= kmax; k++)
00288       for (l = lmin; l <= lmax; l++) {
00289         l1 = l < 2 ? 4 - l : l;
00290         if (INV(k,l1)) {
00291           ySx += 0.5 + (real)k; ySxx += sq(0.5 + (real)k); 
00292           ySxy += (0.5 + (real)k)*(real)l;
00293           ySy += (real)l; ySyy += sq((real)l);
00294           dummy = l1 == l ? v[k][l1] : - v[k][l1];
00295           ySv += dummy; ySxv += dummy*(0.5 + (real)k);
00296           ySyv += dummy*(real)l;
00297 #ifdef DEBUG_EXTRA
00298           fprintf(fptr2, "%g %g %g\n", 0.5+(real)k, (real)l, dummy);
00299 #endif
00300           nsy++;
00301         }
00302       }
00303     dx++; dy++;
00304   } while((nsy <= kmax - kmin + 1 || nsy <= lmax - lmin + 1) && dx <= 3);
00305 #else
00306   real xu[SQCLOSEST], yu[SQCLOSEST], uu[SQCLOSEST];
00307   real xv[SQCLOSEST], yv[SQCLOSEST], vv[SQCLOSEST];
00308   real xmaxu, xminu, ymaxu, yminu;
00309   real xmaxv, xminv, ymaxv, yminv;
00310   int n;
00311 
00312   nsx = nsy = 5;
00313   if ((n = closest_u(xn, yn, n1, n2, u, ap, xu, yu, uu, 
00314                      &xmaxu, &xminu, &ymaxu, &yminu, nx, ny)) < nsx) {
00315     printf("extra_velocity_normals(%g,%g): not enough u's\n", x, y);
00316     printf("xn: %g yn: %g n1: %g n2: %g\n", xn, yn, n1, n2);
00317     for (i = 0; i < n; i++)
00318       printf("  %g %g\n", xu[i], yu[i]);
00319     exit(1);
00320   }
00321   if ((n = closest_v(xn, yn, n1, n2, v, ap, xv, yv, vv, 
00322                      &xmaxv, &xminv, &ymaxv, &yminv, nx, ny)) < nsy) {
00323     printf("extra_velocity_normals(%g,%g): not enough v's\n", x, y);
00324     printf("xn: %g yn: %g n1: %g n2: %g\n", xn, yn, n1, n2);
00325     for (i = 0; i < n; i++)
00326       printf("  %g %g\n", xv[i], yv[i]);
00327     exit(1);
00328   }
00329 
00330   xSx = xSxx = xSxy = xSy = xSyy = 0.;
00331   xSu = xSxu = xSyu = 0.;
00332   for (i = 0; i < nsx; i++) {
00333     xSx += xu[i]; xSxx += sq(xu[i]);
00334     xSxy += xu[i]*yu[i];
00335     xSy += yu[i]; xSyy += sq(yu[i]);
00336     xSu += uu[i]; xSxu += uu[i]*xu[i];
00337     xSyu += uu[i]*yu[i];
00338 #ifdef DEBUG_EXTRA
00339     fprintf(fptr1, "%g %g %g\n", xu[i], yu[i], uu[i]);
00340 #endif
00341   }
00342 
00343   ySx = ySxx = ySxy = ySy = ySyy = 0.;
00344   ySv = ySxv = ySyv = 0.;
00345   for (i = 0; i < nsy; i++) {
00346     ySx += xv[i]; ySxx += sq(xv[i]); 
00347     ySxy += xv[i]*yv[i];
00348     ySy += yv[i]; ySyy += sq(yv[i]);
00349     ySv += vv[i]; ySxv += vv[i]*xv[i];
00350     ySyv += yv[i]*vv[i];
00351 #ifdef DEBUG_EXTRA
00352     fprintf(fptr2, "%g %g %g\n", xv[i], yv[i], vv[i]);
00353 #endif
00354   }
00355 #endif
00356 
00357   /* build the system of equations
00358      sys[i][0]*u0+sys[i][1]*v0+sys[i][2]*A11+sys[i][3]*A22+
00359      sys[i][4]*A12+sys[i][5]*A21+sys[i][6]*lambda=rhs[i] */
00360   sys[0][2] = n1*n2; sys[0][3] = -n1*n2;
00361   sys[0][4] = (sq(n2) - sq(n1))/2.0; sys[0][5] = sys[0][4];
00362   sys[1][0] = nsx; sys[1][2] = xSx; sys[1][4] = xSy;
00363   rhs[1] = xSu;
00364   sys[2][1] = nsy; sys[2][3] = ySy; sys[2][5] = ySx;
00365   rhs[2] = ySv;
00366   sys[3][0] = xSx; sys[3][2] = xSxx; sys[3][4] = xSxy;
00367   sys[3][6] = n1*n2/2.;
00368   rhs[3] = xSxu;
00369   sys[4][1] = ySy; sys[4][3] = ySyy; sys[4][5] = ySxy;
00370   sys[4][6] = - n1*n2/2.;
00371   rhs[4] = ySyv;
00372   sys[5][0] = xSy; sys[5][2] = xSxy; sys[5][4] = xSyy;
00373   sys[5][6] = (sq(n2) - sq(n1))/4.0;
00374   rhs[5] = xSyu;
00375   sys[6][1] = ySx; sys[6][3] = ySxy; sys[6][5] = ySxx;
00376   sys[6][6] = (sq(n2) - sq(n1))/4.0;
00377   rhs[6] = ySxv;
00378 
00379 #ifdef DEBUG_EXTRA
00380   fprintf(fptr1, "&\n\n");
00381   fprintf(fptr2, "&\n\n");
00382   fprintf(fptr3, "%g %g\n&\n\n", x, y);
00383   fprintf(fptr4, "%g %g\n%g %g\n&\n\n", xn, yn, xn + n1, yn + n2);
00384   fclose(fptr1); fclose(fptr2); fclose(fptr3); fclose(fptr4);
00385 #endif
00386 
00387   if (gauss(sys, rhs, sol, 7)) {
00388     printf("Error: extra_velocity(%g, %g): no solution\n", x, y);
00389     printf("       nsx: %d nsy: %d\n", nsx, nsy);
00390     for (i = 0; i < nsx; i++)
00391       printf("%g %g %g\n", xu[i], yu[i], uu[i]);
00392     printf("\n");
00393     for (i = 0; i < nsy; i++)
00394       printf("%g %g %g\n", xv[i], yv[i], vv[i]);
00395     printf("\n");
00396     for (i = 0; i < 7; i++) {
00397       for (j = 0; j < 7; j++)
00398         printf("%10g ", sys[i][j]);
00399       printf("\n");
00400     }
00401     exit(1);
00402   }
00403 
00404   *dudx = sol[2]; *dvdy = sol[3]; *dudy = sol[4]; *dvdx = sol[5];
00405   *eu = sol[0] + sol[2]*x + sol[4]*y;
00406   *ev = sol[1] + sol[5]*x + sol[3]*y;
00407 
00408   if (*eu != *eu || *ev != *ev) {
00409     printf("Error: extra_velocity(%g, %g): NaN\n", x, y);
00410     printf("       eu: %g ev: %g\n", *eu, *ev);
00411     printf("       nsx: %d nsy: %d\n", nsx, nsy);
00412     for (i = 0; i < nsx; i++)
00413       printf("%g %g %g\n", xu[i], yu[i], uu[i]);
00414     printf("\n");
00415     for (i = 0; i < nsy; i++)
00416       printf("%g %g %g\n", xv[i], yv[i], vv[i]);
00417     printf("\n");
00418     for (i = 0; i < 7; i++) {
00419       for (j = 0; j < 7; j++)
00420         printf("%10g ", sys[i][j]);
00421       printf("\n");
00422     }
00423     exit(1);
00424   }
00425 }

void extra_velocity_normals2 (  real    x,
real    y,
real    n1,
real    n2,
real    xn,
real    yn,
real2D    u,
real2D    v,
real2D    ap,
real *    eu,
real *    ev,
real *    dudx,
real *    dudy,
real *    dvdx,
real *    dvdy,
int    nx,
int    ny
) 
 

Definition at line 428 of file extra.c.

References closest_u(), closest_v(), gauss13(), real, real2D, sq, and SQCLOSEST.

Referenced by extra_velocity().

00435 {
00436   int i, j, k, l, kmin, kmax, lmin, lmax;
00437   int nsx = 0, nsy = 0, dx, dy;
00438   real x1, y1;
00439   real xSx, xSxx, xSxy, xSy, xSyy, xSxxy, xSxyy, xSyyy, xSxxx,
00440     xSxxxy, xSxxyy, xSxyyy, xSyyyy, xSxxxx, xSu, xSxu, xSyu,
00441     xSxxu, xSyyu, xSxyu;
00442   real ySx, ySxx, ySxy, ySy, ySyy, ySxxy, ySxyy, ySyyy, ySxxx,
00443     ySxxxy, ySxxyy, ySxyyy, ySyyyy, ySxxxx, ySv, ySxv, ySyv,
00444     ySxxv, ySyyv, ySxyv;
00445   real sys[13][13] = {{0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00446                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00447                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00448                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00449                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00450                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00451                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00452                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00453                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00454                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00455                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00456                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
00457                       {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}};
00458   real rhs[13] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}, sol[13], dummy;
00459   real n1n2 = n1*n2, sqn = (sq(n2) - sq(n1))/2.;
00460   real xu[SQCLOSEST], yu[SQCLOSEST], uu[SQCLOSEST];
00461   real xv[SQCLOSEST], yv[SQCLOSEST], vv[SQCLOSEST];
00462   real xmaxu, ymaxu, xminu, yminu, xmaxv, ymaxv, xminv, yminv, det;
00463   /* #define DEBUG_EXTRA */
00464 #ifdef DEBUG_EXTRA  
00465   static int cas;
00466   FILE *fptr1, *fptr2, *fptr3, *fptr4;
00467   char s[256];
00468 
00469   sprintf(s, "extra_upoints%d", cas);
00470   fptr1 = fopen(s, "wt");
00471   sprintf(s, "extra_vpoints%d", cas);
00472   fptr2 = fopen(s, "wt");
00473   sprintf(s, "extra_u%d", cas);
00474   fptr3 = fopen(s, "wt");
00475   sprintf(s, "extra_v%d", cas++);
00476   fptr4 = fopen(s, "wt");
00477 #endif
00478 
00479   nsx = nsy = 12;
00480   if (closest_u(xn, yn, n1, n2, u, ap, xu, yu, uu, 
00481                 &xmaxu, &xminu, &ymaxu, &yminu, nx, ny) < nsx) {
00482     fprintf(stderr, "extra_velocity_normals2(%g,%g): not enough u's\n", x, y);
00483     exit(1);
00484   }
00485   if (closest_v(xn, yn, n1, n2, v, ap, xv, yv, vv, 
00486                 &xmaxv, &xminv, &ymaxv, &yminv, nx, ny) < nsy) {
00487     fprintf(stderr, "extra_velocity_normals2(%g,%g): not enough v's\n", x, y);
00488     exit(1);
00489   }
00490 
00491   xSx = xSxx = xSxy = xSy = xSyy = xSxxy = xSxyy = xSyyy = xSxxx =
00492     xSxxxy = xSxxyy = xSxyyy = xSyyyy = xSxxxx = xSu = xSxu = xSyu =
00493     xSxxu = xSyyu = xSxyu = 0.0;
00494   for (i = 0; i < nsx; i++) {
00495     x1 = xu[i]; y1 = yu[i];
00496     
00497     xSx += x1; xSxx += sq(x1);
00498     xSxy += x1*y1;
00499     xSy += y1; xSyy += sq(y1);
00500     
00501     xSxxy += sq(x1)*y1;
00502     xSxyy += x1*sq(y1);
00503     xSyyy += sq(y1)*y1;
00504     xSxxx += sq(x1)*x1;
00505     
00506     xSxxxy += sq(x1)*x1*y1;
00507     xSxxyy += sq(x1)*sq(y1);
00508     xSxyyy += x1*sq(y1)*y1;
00509     
00510     xSyyyy += sq(y1)*sq(y1);
00511     
00512     xSxxxx += sq(x1)*sq(x1);
00513     
00514     xSu += uu[i]; 
00515     xSxu += x1*uu[i];
00516     xSyu += y1*uu[i];
00517     xSxxu += sq(x1)*uu[i];
00518     xSyyu += sq(y1)*uu[i];
00519     xSxyu += x1*y1*uu[i];
00520   }
00521 
00522   ySx = ySxx = ySxy = ySy = ySyy = ySxxy = ySxyy = ySyyy = ySxxx =
00523     ySxxxy = ySxxyy = ySxyyy = ySyyyy = ySxxxx = ySv = ySxv = ySyv =
00524     ySxxv = ySyyv = ySxyv = 0.0;
00525   for (i = 0; i < nsy; i++) {
00526     x1 = xv[i]; y1 = yv[i];
00527     
00528     ySx += x1; ySxx += sq(x1);
00529     ySxy += x1*y1;
00530     ySy += y1; ySyy += sq(y1);
00531     
00532     ySxxy += sq(x1)*y1;
00533     ySxyy += x1*sq(y1);
00534     ySyyy += sq(y1)*y1;
00535     ySxxx += sq(x1)*x1;
00536     
00537     ySxxxy += sq(x1)*x1*y1;
00538     ySxxyy += sq(x1)*sq(y1);
00539     ySxyyy += x1*sq(y1)*y1;
00540     
00541     ySyyyy += sq(y1)*sq(y1);
00542     
00543     ySxxxx += sq(x1)*sq(x1);
00544     
00545     ySv += vv[i]; 
00546     ySxv += x1*vv[i];
00547     ySyv += y1*vv[i];
00548     ySxxv += sq(x1)*vv[i];
00549     ySyyv += sq(y1)*vv[i];
00550     ySxyv += x1*y1*vv[i];
00551   }
00552 
00553   sys[0][0] = 2.*n1n2*xn; sys[0][1] = 2.*sqn*yn; 
00554   sys[0][2] = n1n2*yn + sqn*xn; sys[0][3] = n1n2; sys[0][4] = sqn;
00555   sys[0][6] = 2.*sqn*xn; sys[0][7] = - 2.*n1n2*yn;
00556   sys[0][8] = sqn*yn - n1n2*xn; sys[0][9] = sqn; sys[0][10] = - n1n2;  
00557 
00558   sys[1][0] = xSxx; sys[1][1] = xSyy; sys[1][2] = xSxy;
00559   sys[1][3] = xSx; sys[1][4] = xSy; sys[1][5] = nsx;  
00560   rhs[1] = xSu;
00561   
00562   sys[2][0] = xSxxy; sys[2][1] = xSyyy; sys[2][2] = xSxyy;
00563   sys[2][3] = xSxy; sys[2][4] = xSyy; sys[2][5] = xSy;
00564   sys[2][12] = sqn/2.;
00565   rhs[2] = xSyu;
00566 
00567   sys[3][0] = xSxxx; sys[3][1] = xSxyy; sys[3][2] = xSxxy;
00568   sys[3][3] = xSxx; sys[3][4] = xSxy; sys[3][5] = xSx;
00569   sys[3][12] = n1n2/2.;
00570   rhs[3] = xSxu;
00571   
00572   sys[4][0] = xSxxxy; sys[4][1] = xSxyyy; sys[4][2] = xSxxyy;
00573   sys[4][3] = xSxxy; sys[4][4] = xSxyy; sys[4][5] = xSxy;
00574   sys[4][12] = (n1n2*yn + sqn*xn)/2.;
00575   rhs[4] = xSxyu;
00576 
00577   sys[5][0] = xSxxyy; sys[5][1] = xSyyyy; sys[5][2] = xSxyyy;
00578   sys[5][3] = xSxyy; sys[5][4] = xSyyy; sys[5][5] = xSyy;
00579   sys[5][12] = sqn*yn;
00580   rhs[5] = xSyyu;
00581 
00582   sys[6][0] = xSxxxx; sys[6][1] = xSxxyy; sys[6][2] = xSxxxy;
00583   sys[6][3] = xSxxx; sys[6][4] = xSxxy; sys[6][5] = xSxx;
00584   sys[6][12] = n1n2*xn;
00585   rhs[6] = xSxxu;
00586 
00587 
00588   sys[7][6] = ySxx; sys[7][7] = ySyy; sys[7][8] = ySxy;
00589   sys[7][9] = ySx; sys[7][10] = ySy; sys[7][11] = nsy;  
00590   rhs[7] = ySv;
00591   
00592   sys[8][6] = ySxxy; sys[8][7] = ySyyy; sys[8][8] = ySxyy;
00593   sys[8][9] = ySxy; sys[8][10] = ySyy; sys[8][11] = ySy;
00594   sys[8][12] = - n1n2/2.;
00595   rhs[8] = ySyv;
00596 
00597   sys[9][6] = ySxxx; sys[9][7] = ySxyy; sys[9][8] = ySxxy;
00598   sys[9][9] = ySxx; sys[9][10] = ySxy; sys[9][11] = ySx;
00599   sys[9][12] = sqn/2.;
00600   rhs[9] = ySxv;
00601   
00602   sys[10][6] = ySxxxy; sys[10][7] = ySxyyy; sys[10][8] = ySxxyy;
00603   sys[10][9] = ySxxy; sys[10][10] = ySxyy; sys[10][11] = ySxy;
00604   sys[10][12] = (- n1n2*xn + sqn*yn)/2.;
00605   rhs[10] = ySxyv;
00606 
00607   sys[11][6] = ySxxyy; sys[11][7] = ySyyyy; sys[11][8] = ySxyyy;
00608   sys[11][9] = ySxyy; sys[11][10] = ySyyy; sys[11][11] = ySyy;
00609   sys[11][12] = - n1n2*yn;
00610   rhs[11] = ySyyv;
00611 
00612   sys[12][6] = ySxxxx; sys[12][7] = ySxxyy; sys[12][8] = ySxxxy;
00613   sys[12][9] = ySxxx; sys[12][10] = ySxxy; sys[12][11] = ySxx;
00614   sys[12][12] = sqn*xn;
00615   rhs[12] = ySxxv;
00616 
00617 #ifdef DEBUG_EXTRA
00618   for (i = 0; i < nsx; i++)
00619     fprintf(fptr1, "%g %g %f\n", xu[i], yu[i], uu[i]);
00620   for (i = 0; i < nsy; i++)
00621     fprintf(fptr2, "%g %g %f\n", xv[i], yv[i], vv[i]);
00622   fclose(fptr1); fclose(fptr2);
00623 #endif
00624 
00625   if (gauss13(sys, rhs, sol, &det, 13)) {
00626     printf("Error: extra_velocity2(%g, %g): no solution\n", x, y);
00627     printf("       nsx: %d nsy: %d\n", nsx, nsy);
00628     for (i = 0; i < 13; i++) {
00629       for (j = 0; j < 13; j++)
00630         printf("%5g ", sys[i][j]);
00631       printf("\n");
00632     }
00633     exit(1);
00634   }
00635 
00636 #ifdef DEBUG_EXTRA
00637   for (x1 = xminu; x1 <= xmaxu; x1 += 1.0) {
00638     for (y1 = yminu; y1 <= ymaxu; y1 += 1.0)
00639       fprintf(fptr3, "%g %g %g\n", x1, y1, 
00640               sol[0]*sq(x1) + sol[1]*sq(y1) + sol[2]*x1*y1 + 
00641               sol[3]*x1 + sol[4]*y1 + sol[5]);
00642     fprintf(fptr3, "\n");
00643   }
00644   fclose(fptr3);
00645   for (x1 = xminv; x1 <= xmaxv; x1 += 1.0) {
00646     for (y1 = yminv; y1 <= ymaxv; y1 += 1.0)
00647       fprintf(fptr4, "%g %g %g\n", x1, y1, 
00648               sol[6]*sq(x1) + sol[7]*sq(y1) + sol[8]*x1*y1 + 
00649               sol[9]*x1 + sol[10]*y1 + sol[11]);
00650     fprintf(fptr4, "\n");
00651   }
00652   fclose(fptr4);
00653   x1 = 0.0;
00654   for (i = 0; i < nsx; i++) {
00655     y1 = sol[0]*sq(xu[i]) + sol[1]*sq(yu[i]) + sol[2]*xu[i]*yu[i] + 
00656       sol[3]*xu[i] + sol[4]*yu[i] + sol[5];
00657     x1 += sq(y1 - uu[i]);
00658   }
00659   for (i = 0; i < nsy; i++) {
00660     y1 = sol[6]*sq(xv[i]) + sol[7]*sq(yv[i]) + sol[8]*xv[i]*yv[i] + 
00661       sol[9]*xv[i] + sol[10]*yv[i] + sol[11];
00662     x1 += sq(y1 - vv[i]);
00663   }
00664   printf("%g %g %g\n", x, y, x1);
00665 #endif
00666 
00667   *eu = sol[0]*sq(x) + sol[1]*sq(y) + sol[2]*x*y + 
00668     sol[3]*x + sol[4]*y + sol[5];
00669   *ev = sol[6]*sq(x) + sol[7]*sq(y) + sol[8]*x*y + 
00670     sol[9]*x + sol[10]*y + sol[11];
00671   *dudx = 2.*sol[0]*x + sol[2]*y + sol[3];
00672   *dudy = 2.*sol[1]*y + sol[2]*x + sol[4];
00673   *dvdx = 2.*sol[6]*x + sol[8]*y + sol[9];
00674   *dvdy = 2.*sol[7]*y + sol[8]*x + sol[10];
00675 }

real kappa_normals (  polynom3    px,
polynom3    py,
real    t,
real *    nx,
real *    ny
) 
 

Definition at line 705 of file extra.c.

References real, splint, splint1, splint2, and sq.

00706 {
00707   real xp, yp, y, dl, kappa;
00708 
00709   xp = splint1(px, t);
00710   yp = splint1(py, t);
00711   dl = sqrt(sq(xp) + sq(yp));
00712   kappa = (xp*splint2(py, t) - yp*splint2(px, t))/(sq(dl)*dl);
00713   /* axisymmetric term */
00714   y = splint(py, t) - 2.0;
00715   if (fabs(y) < 1e-2) /* second order approximation near the axis */
00716     kappa -= splint2(px, t)/splint1(py, t)/dl;
00717   else
00718     kappa -= xp/y/dl;
00719   *nx = - yp/dl;
00720   *ny = xp/dl;
00721   return kappa;
00722 }


Generated on Wed Feb 19 22:27:03 2003 for Markers by doxygen1.2.18