Main Page   Data Structures   File List   Data Fields   Globals  

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

void advect (interface in, real2D u, real2D v, real2D ap, int nx, int ny, real *puaxis)
void repulse (interface in, real cutoff, real coef, real lredis)


Function Documentation

void advect (  interface    in,
real2D    u,
real2D    v,
real2D    ap,
int    nx,
int    ny,
real *    puaxis
) 
 

Definition at line 81 of file advect.c.

References bilinu(), bilinv(), extra_velocity_normals(), interface::n, real, real2D, splint1, interface::spx, interface::spy, sq, interface::t, UNDEFINED, interface::x, and interface::y.

Referenced by timestep().

00083 {
00084   int l;
00085   real x, y, dx, dy, n1, n2;
00086   real a11, a22, a12, a21;
00087 //  FILE *fptr = fopen("markspeed", "at"); 
00088 
00089   for (l = 0; l < in.n; l++) {
00090     x = in.x[l]; y = in.y[l];
00091     if ((dx = bilinu(u, x, y)) == UNDEFINED ||
00092         (dy = bilinv(v, x, y)) == UNDEFINED) {
00093       printf("advect(): extrapolating point %g,%g ... ", x, y);
00094       if (l == in.n - 1) {
00095         n1 = - splint1(in.spy[l-1], in.t[l]);
00096         n2 = splint1(in.spx[l-1], in.t[l]);
00097       } 
00098       else {
00099         n1 = - splint1(in.spy[l], in.t[l]);
00100         n2 = splint1(in.spx[l], in.t[l]);
00101       }
00102       a11 = sqrt(sq(n1) + sq(n2));
00103       n1 /= a11; n2 /= a11;
00104       printf("normal(%g,%g) ... ", n1, n2);
00105       extra_velocity_normals(x, y, n1, n2, x, y,
00106                              u, v, ap, &dx, &dy,
00107                              &a11, &a22, &a12, &a21, nx, ny);
00108       printf("Ok\n");
00109     }
00110 #ifdef CORRECTOR
00111     x = in.x[l] + dx; y = in.y[l] + dy;
00112     if ((dx = bilinu(u, x, y)) == UNDEFINED ||
00113         (dy = bilinv(v, x, y)) == UNDEFINED) {
00114       printf("advect(): extrapolating point %g,%g ... ", x, y);
00115       if (l == in.n - 1) {
00116         n1 = - splint1(in.spy[l-1], in.t[l]);
00117         n2 = splint1(in.spx[l-1], in.t[l]);
00118       } 
00119       else {
00120         n1 = - splint1(in.spy[l], in.t[l]);
00121         n2 = splint1(in.spx[l], in.t[l]);
00122       }
00123       a11 = sqrt(sq(n1) + sq(n2));
00124       n1 /= a11; n2 /= a11;
00125       printf("normal(%g,%g) ... ", n1, n2);
00126       extra_velocity_normals(x, y, n1, n2, x, y,
00127                              u, v, ap, &dx, &dy,
00128                              &a11, &a22, &a12, &a21, nx, ny);
00129       printf("Ok\n");
00130     }
00131 #endif
00132     in.x[l] += dx;
00133     in.y[l] += dy;
00134 //    printf("%d %g %g\n", l, dx, dy);
00135 
00136 /*cld*/
00137 //    if (l == 0)
00138 //          *puaxis = dx;
00139 /*cld*/
00140 //        fprintf(fptr, "%g %g\n", in.t[l]/in.t[in.n-1], sqrt(sq(dx) + sq(dy))); 
00141 //        fprintf(fptr, "%g %g %g\n", in.t[l]/in.t[in.n-1], dx, dy); 
00142   }  
00143   
00144 //  fprintf(fptr, "&\n");
00145 //  fclose(fptr);
00146   
00147 }

void repulse (  interface    in,
real    cutoff,
real    coef,
real    lredis
) 
 

Definition at line 187 of file advect.c.

References AXINATURAL, AXITRUE, interface::bc, interface::n, real, sq, interface::x, xi, interface::y, and yi.

00188 {
00189   int i, j, imin, imax, imin1, imax1, index;
00190   real xm, ym, xi, yi, t, r2;
00191   real *fx = (real *)calloc(in.n, sizeof(real));
00192   real *fy = (real *)calloc(in.n, sizeof(real));
00193   real *abx = (real *)malloc((in.n - 1)*sizeof(real));
00194   real *aby = (real *)malloc((in.n - 1)*sizeof(real));
00195   real *abn = (real *)malloc((in.n - 1)*sizeof(real));
00196 #if 1
00197   int *isx = (int *)malloc(in.n*sizeof(int));
00198   int *isy = (int *)malloc(in.n*sizeof(int));
00199   int *is;
00200 FILE *fptr = fopen("repulse", "wt");
00201 
00202   cutoff *= cutoff;
00203   for (i = 0; i < in.n - 1; i++) {
00204     abx[i] = in.x[i+1] - in.x[i]; 
00205     aby[i] = in.y[i+1] - in.y[i];
00206     abn[i] = sqrt(sq(abx[i]) + sq(aby[i]));
00207   }
00208 
00209   /* sort the markers by ascending coordinates */
00210   for (i = 0; i < in.n; i++)
00211     isx[i] = isy[i] = i;
00212   coord = in.x;
00213   qsort(isx, in.n, sizeof(int), cmp);
00214   coord = in.y;
00215   qsort(isy, in.n, sizeof(int), cmp);
00216 
00217   for (i = 0; i < in.n; i++) {
00218     xm = in.x[i]; ym = in.y[i];
00219     /* find the points with an x-coordinate in [xm-lredis,xm+lredis] */
00220     imax = find_smaller(in.x, isx, in.n, xm + lredis);
00221     imin = find_larger(in.x, isx, in.n, xm - lredis);
00222     /* find the points with an y-coordinate in [ym-lredis,ym+lredis] */
00223     imax1 = find_smaller(in.y, isy, in.n, ym + lredis);
00224     imin1 = find_larger(in.y, isy, in.n, ym - lredis);
00225     if (imax - imin > imax1 - imin1) { imax = imax1; imin = imin1; is = isy; }
00226     else { is = isx; }
00227     /* for each point in the smallest interval */
00228     for (j = imin; j <= imax; j++) {
00229       index = is[j];
00230       if (index != i && index+1 != i) {
00231         if (index < in.n - 1) {
00232           t = ((xm - in.x[index])*abx[index] +
00233                (ym - in.y[index])*aby[index])/abn[index];
00234           if (t <= 1.0) {
00235             if (t <= 0.0) { xi = in.x[index]; yi = in.y[index]; }
00236             else {
00237               xi = in.x[index] + t*abx[index];
00238               yi = in.y[index] + t*aby[index];
00239             }
00240             r2 = sq(xm - xi) + sq(ym - yi);
00241             if (r2 < cutoff) {
00242               r2 = coef*1./sq(r2);
00243               fx[i] -= r2*(xi - xm);
00244               fy[i] -= r2*(yi - ym);
00245               fprintf(fptr, "%g %g\n%g %g\n&\n\n", xi, yi, xm, ym);
00246             }
00247           }
00248         }
00249       }
00250     }
00251   }
00252   in.x[0] += fx[0]; in.x[in.n-1] += fx[in.n-1];
00253   if (in.bc != AXITRUE && in.bc != AXINATURAL) {
00254     in.y[0] += fy[0]; in.y[in.n-1] += fy[in.n-1];
00255   }
00256   for (i = 1; i < in.n - 1; i++) {
00257     in.x[i] += fx[i]; in.y[i] += fy[i];
00258   }
00259   free(fx); free(fy); 
00260   free(abx); free(aby); free(abn);
00261   free(isx); free(isy);
00262   fclose(fptr);
00263 #else
00264 FILE *fptr = fopen("repulse", "wt");
00265 
00266   cutoff *= cutoff;
00267   for (i = 0; i < in.n - 1; i++) {
00268     abx[i] = in.x[i+1] - in.x[i]; 
00269     aby[i] = in.y[i+1] - in.y[i];
00270     abn[i] = sqrt(sq(abx[i]) + sq(aby[i]));
00271   }
00272   for (i = 0; i < in.n; i++) {
00273     xm = in.x[i]; ym = in.y[i];
00274     for (j = 0; j < in.n - 1; j++) 
00275       if (j != i && j+1 != i) {
00276         t = ((xm - in.x[j])*abx[j] + (ym - in.y[j])*aby[j])/abn[j];
00277         if (t <= 1.0) {
00278           if (t < 0.0) {
00279             xi = in.x[j]; yi = in.y[j];
00280           }
00281           else {
00282             xi = in.x[j] + t*abx[j];
00283             yi = in.y[j] + t*aby[j];
00284           }
00285           r2 = sq(xm - xi) + sq(ym - yi);
00286           if (r2 < cutoff) {
00287             r2 = coef*1./sq(r2);
00288             fx[i] -= r2*(xi - xm);
00289             fy[i] -= r2*(yi - ym);
00290 fprintf(fptr, "%g %g\n%g %g\n&\n\n", xi, yi, xm, ym);
00291           }
00292         }
00293       }
00294   }
00295   fclose(fptr);
00296 
00297   in.x[0] += fx[0]; in.x[in.n-1] += fx[in.n-1];
00298   if (in.bc != AXITRUE && in.bc != AXINATURAL) {
00299     in.y[0] += fy[0]; in.y[in.n-1] += fy[in.n-1];
00300   }
00301   for (i = 1; i < in.n - 1; i++) {
00302     in.x[i] += fx[i]; in.y[i] += fy[i];
00303   }
00304   free(fx); free(fy); 
00305   free(abx); free(aby); free(abn);
00306 #endif
00307 }


Generated on Wed Feb 19 22:26:57 2003 for Markers by doxygen1.2.18