Main Page   Data Structures   File List   Data Fields   Globals  

extra1.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.

Functions

int closest_u (real x, real y, real2D u, real2D cu, real *xu, real *yu, real *uu, int nx, int ny)
int closest_v (real x, real y, real2D v, real2D cv, real *xv, real *yv, real *vv, int nx, int ny)
void extra_poly (real x, real y, real2D u, real2D cu, real2D v, real2D cv, interface in, real *eu, real *ev, int nx, int ny)


Function Documentation

int closest_u real    x,
real    y,
real2D    u,
real2D    cu,
real   xu,
real   yu,
real   uu,
int    nx,
int    ny
 

Definition at line 39 of file extra1.c.

References INU, real, real2D, and sq.

Referenced by extra_poly(), extra_velocity_normals(), and extra_velocity_normals2().

00041 {
00042   int i, j, k, i1, j1, n = 0;
00043   real xl, yl, ul, dl;
00044 
00045   i = x; j = (int) ((real)y - 0.5);
00046   for (i1 = i - 2; i1 <= i + 2; i1++)
00047     for (j1 = j - 2; j1 <= j + 2; j1++)
00048       if (INU(i1,j1)) {
00049         xu[n] = i1; yu[n] = j1 + 0.5; uu[n++] = u[i1][j1];
00050       }
00051 
00052   /* sort the points */
00053   for (k = 1; k < n; k++) {
00054     xl = xu[k]; yl = yu[k]; ul = uu[k];
00055     i = k - 1;
00056     dl = sq(x - xl) + sq(y - yl);
00057     while (i >= 0 && sq(xu[i] - x) + sq(yu[i] - y) > dl) {
00058       xu[i+1] = xu[i]; yu[i+1] = yu[i]; uu[i+1] = uu[i]; 
00059       i--;
00060     }
00061     xu[i+1] = xl; yu[i+1] = yl; uu[i+1] = ul;
00062   }
00063   return n;
00064 }

int closest_v real    x,
real    y,
real2D    v,
real2D    cv,
real   xv,
real   yv,
real   vv,
int    nx,
int    ny
 

Definition at line 67 of file extra1.c.

References INV, real, real2D, and sq.

Referenced by extra_poly(), extra_velocity_normals(), and extra_velocity_normals2().

00069 {
00070   int i, j, k, i1, j1, n = 0;
00071   real xl, yl, vl, dl;
00072 
00073   i = (int)((real)x - 0.5); j = y;
00074   for (i1 = i - 2; i1 <= i + 2; i1++)
00075     for (j1 = j - 2; j1 <= j + 2; j1++)
00076       if (INV(i1,j1)) {
00077         xv[n] = i1 + 0.5; yv[n] = j1; vv[n++] = v[i1][j1];
00078       }
00079 
00080   /* sort the points */
00081   for (k = 1; k < n; k++) {
00082     xl = xv[k]; yl = yv[k]; vl = vv[k]; 
00083     i = k - 1;
00084     dl = sq(x - xl) + sq(y - yl);
00085     while (i >= 0 && sq(xv[i] - x) + sq(yv[i] - y) > dl) {
00086       xv[i+1] = xv[i]; yv[i+1] = yv[i]; vv[i+1] = vv[i]; 
00087       i--;
00088     }
00089     xv[i+1] = xl; yv[i+1] = yl; vv[i+1] = vl;
00090   }
00091   return n;
00092 }

void extra_poly real    x,
real    y,
real2D    u,
real2D    cu,
real2D    v,
real2D    cv,
interface    in,
real   eu,
real   ev,
int    nx,
int    ny
 

Definition at line 140 of file extra1.c.

References closest_normal(), closest_u(), closest_v(), four_aligned(), gauss3(), interface_arc(), interface::n, NI, NU, NV, real, real2D, splint, splint1, interface::spx, interface::spy, sq, interface::t, xi, and yi.

00144 {
00145   real xu[25], yu[25], uu[25];
00146   real xv[25], yv[25], vv[25];
00147   real xi[NI], yi[NI], xni[NI], yni[NI];
00148   real xmin, ymin, pmin, tmin, xn, yn, t, t1, dl;
00149   int i, j, n;
00150   real a[12][12], b[12], c[12], tt, tp, det;
00151 FILE *fptr;
00152 static int graph, graph1;
00153 
00154   if (!closest_normal(x, y, in, &xmin, &ymin, &pmin, &tmin, &xn, &yn)) {
00155     fprintf(stderr, "extra_poly(%g,%g): no closest normal\n", x, y);
00156     exit(1);
00157   }
00158   for (n = 0, t = tmin - 0.5; n < NI; n++, t += 1.0)
00159     if (t < 0.0 || t > in.t[in.n-1]) {
00160       t1 = t < 0.0 ? -t : 2.*in.t[in.n-1] - t;
00161       i = interface_arc(in, t1);
00162       xi[n] = splint(in.spx[i], t1);
00163       yi[n] = 4. - splint(in.spy[i], t1);
00164       xni[n] = - splint1(in.spy[i], t1);
00165       yni[n] = - splint1(in.spx[i], t1);
00166       dl = sqrt(sq(xni[n]) + sq(yni[n]));
00167       xni[n] /= dl; yni[n] /= dl;
00168     }
00169     else {
00170       i = interface_arc(in, t);
00171       xi[n] = splint(in.spx[i], t);
00172       yi[n] = splint(in.spy[i], t);
00173       xni[n] = - splint1(in.spy[i], t);
00174       yni[n] = splint1(in.spx[i], t);
00175       dl = sqrt(sq(xni[n]) + sq(yni[n]));
00176       xni[n] /= dl; yni[n] /= dl;
00177     }
00178 
00179   fptr = fopen("ipoints", "at");
00180   for (i = 0; i < NI; i++)
00181     fprintf(fptr, "%g %g\n%g %g\n%g %g\n\n", x, y, xi[i], yi[i],
00182             xi[i] + xni[i], yi[i] + yni[i]);
00183   fclose(fptr);
00184  
00185   if (closest_u(xmin, ymin, u, cu, xu, yu, uu, nx, ny) < NU) {
00186     fprintf(stderr, "extra_poly(%g,%g): not enough u's\n", x, y);
00187     exit(1);
00188   }
00189   if (closest_v(xmin, ymin, v, cv, xv, yv, vv, nx, ny) < NV) {
00190     fprintf(stderr, "extra_poly(%g,%g): not enough v's\n", x, y);
00191     exit(1);
00192   }
00193   
00194   fptr = fopen("upoints", "at");
00195   for (i = 0; i < NU; i++)
00196     fprintf(fptr, "%g %g\n%g %g\n\n", x, y, xu[i], yu[i]);
00197   fclose(fptr);
00198   fptr = fopen("vpoints", "at");
00199   for (i = 0; i < NV; i++)
00200     fprintf(fptr, "%g %g\n%g %g\n\n", x, y, xv[i], yv[i]);
00201   fclose(fptr);
00202 
00203   if (four_aligned(xu, yu, 4)) {
00204     xu[3] = xu[4]; yu[3] = yu[4]; uu[3] = uu[4];
00205     xu[4] = xu[5]; yu[4] = yu[5]; uu[4] = uu[5];
00206   }
00207   if (four_aligned(xu, yu, 5)) {
00208     xu[4] = xu[5]; yu[4] = yu[5]; uu[4] = uu[5];
00209   }
00210   if (four_aligned(xv, yv, 4)) {
00211     xv[3] = xv[4]; yv[3] = yv[4]; vv[3] = vv[4];
00212     xv[4] = xv[5]; yv[4] = yv[5]; vv[4] = vv[5];
00213   }
00214   if (four_aligned(xv, yv, 5)) {
00215     xv[4] = xv[5]; yv[4] = yv[5]; vv[4] = vv[5];
00216   }
00217   
00218   /* build the system of equations */
00219   for (i = 0; i < NU; i++) {
00220     a[i][0] = sq(xu[i]); a[i][1] = sq(yu[i]); a[i][2] = xu[i]*yu[i];
00221     a[i][3] = xu[i]; a[i][4] = yu[i]; a[i][5] = 1.0;
00222     a[i][6] = a[i][7] = a[i][8] = a[i][9] = a[i][10] = a[i][11] = 0.0;
00223     c[i] = uu[i];
00224   }
00225   for (i = 0; i < NV; i++) {
00226     a[i+NU][0] = a[i+NU][1] = a[i+NU][2] = 
00227       a[i+NU][3] = a[i+NU][4] = a[i+NU][5] = 0.0;
00228     a[i+NU][6] = sq(xv[i]); a[i+NU][7] = sq(yv[i]); a[i+NU][8] = xv[i]*yv[i];
00229     a[i+NU][9] = xv[i]; a[i+NU][10] = yv[i]; a[i+NU][11] = 1.0;
00230     c[i+NU] = vv[i];
00231   }
00232   for (i = 0; i < NI; i++) {
00233     tt = -xni[i]*yni[i]; tp = 0.5*(sq(yni[i]) - sq(xni[i]));
00234     a[i+NU+NV][0] = -2.*tt*xi[i]; a[i+NU+NV][1] = 2.*tp*yi[i];
00235     a[i+NU+NV][2] = tp*xi[i] - tt*yi[i];
00236     a[i+NU+NV][3] = -tt; a[i+NU+NV][4] = tp; a[i+NU+NV][5] = 0.0;
00237     a[i+NU+NV][6] = 2.*tp*xi[i]; a[i+NU+NV][7] = 2.*tt*yi[i];
00238     a[i+NU+NV][8] = tt*xi[i] + tp*yi[i];
00239     a[i+NU+NV][9] = tp; a[i+NU+NV][10] = tt; a[i+NU+NV][11] = 0.0;
00240     c[i+NU+NV] = 0.0;
00241   }
00242 
00243   /*
00244     for (i = 0; i < 12; i++) {
00245     for (j = 0; j < 12; j++)
00246     printf("%g\t", a[i][j]);
00247     printf("\n");
00248     }
00249     printf("\n");
00250   */
00251 
00252   if (gauss3(a, c, b, &det, 12)) {
00253     FILE *fptr;
00254     char s[256];
00255     sprintf(s, "nosolution.%d.xmgr", graph++);
00256     fptr = fopen(s, "wt");
00257     fprintf(stderr, "extra_poly(%g,%g): no solution det = %g\n", x, y, det);
00258     fprintf(fptr, "%g %g\n&\n", x, y);
00259     for (i = 0; i < NU; i++)
00260       fprintf(fptr, "%g %g\n", xu[i], yu[i]);
00261     fprintf(fptr, "&\n");
00262     for (i = 0; i < NV; i++)
00263       fprintf(fptr, "%g %g\n", xv[i], yv[i]);
00264     fprintf(fptr, "&\n");
00265     for (i = 0; i < NI; i++)
00266       fprintf(fptr, "%g %g\n", xi[i], yi[i]);
00267     fprintf(fptr, "&\n");
00268     fclose(fptr);
00269     /*    exit(1); */
00270   }
00271   /*
00272   for (i = 0; i < 12; i++)
00273     printf("%g\t", b[i]);
00274   printf("\n");
00275   */
00276   *eu = b[0]*sq(x) + b[1]*sq(y) + b[2]*x*y + b[3]*x + b[4]*y + b[5];
00277   *ev = b[6]*sq(x) + b[7]*sq(y) + b[8]*x*y + b[9]*x + b[10]*y + b[11];
00278 
00279   {
00280     real maxu = 0, minu = nx, x1, y1, maxv = 0, minv = ny;
00281     char s[256];
00282     static int truc;
00283     sprintf(s, "toto.%d", truc++);
00284     fptr = fopen(s, "wt");
00285 
00286     fprintf(fptr, "# %g %g\n# &\n", x, y);
00287     for (i = 0; i < NU; i++)
00288       fprintf(fptr, "# %g %g\n", xu[i], yu[i]);
00289     fprintf(fptr, "# &\n");
00290     for (i = 0; i < NV; i++)
00291       fprintf(fptr, "# %g %g\n", xv[i], yv[i]);
00292     fprintf(fptr, "# &\n");
00293     for (i = 0; i < NI; i++)
00294       fprintf(fptr, "# %g %g\n", xi[i], yi[i]);
00295     fprintf(fptr, "# &\n");
00296 
00297     for (i = 0; i < NU; i++) {
00298       maxu = xu[i] > maxu ? xu[i] : maxu;
00299       minu = xu[i] < minu ? xu[i] : minu;
00300       maxv = yu[i] > maxv ? yu[i] : maxv;
00301       minv = yu[i] < minv ? yu[i] : minv;
00302     }
00303     for (x1 = minu; x1 <= maxu; x1 += (maxu - minu)/10.) {
00304       for (y1 = minv; y1 <= maxv; y1 += (maxv - minv)/10.)
00305         fprintf(fptr, "%g %g %g\n", x1, y1,
00306                 b[0]*sq(x1) + b[1]*sq(y1) + b[2]*x1*y1 + b[3]*x1 + b[4]*y1 + b[5]);
00307       fprintf(fptr, "\n");
00308     }
00309     fclose(fptr);
00310   }
00311 }


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