This graph shows which files directly or indirectly include this file:
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) |
|
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 } |
|
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 } |