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

Go to the source code of this file.
Data Structures | |
| struct | interface_cut |
| struct | listinter |
Functions | |
| real | interface_inside (interface in, real x, real y) |
| void | cut_interface (interface in, interface_cut *cut, real xo, real yo) |
| void | interface_cut_write (interface in, interface_cut cut, char *file) |
| void | interface_surfaces (interface in, interface_cut cut, real2D sx, real2D sy, real2D a, real2D c, real2D wa, real2D wc, int nx, int ny) |
| void | sx_fill (real2D sx, real2D a, real xo, real yo, interface in, int nx, int ny) |
| void | sy_fill (real2D sy, real2D a, real xo, real yo, interface in, int nx, int ny) |
| void | sx_write (real2D sx, real xo, real yo, int nx, int ny, FILE *fptr) |
| void | sy_write (real2D sy, real xo, real yo, int nx, int ny, FILE *fptr) |
| void | interface_rzdr (interface in, interface_cut cut, real za, real2D rzdr, int nx, int ny) |
| void | interface_rrdz (interface in, interface_cut cut, real ra, real2D rrdz, int nx, int ny) |
|
||||||||||||||||||||
|
Definition at line 47 of file surfaces.poly.c. References polynom3::a, listinter::coord, HOR_TYPE, INTERPREC, listinter::ip, interface_cut::list, MARK_TYPE, interface::n, interface_cut::ncut, polyroots(), real, interface::spx, interface::spy, interface::t, listinter::t, listinter::type, VER_TYPE, interface::x, interface_cut::xo, interface::y, and interface_cut::yo. Referenced by initialize(), mgsolve(), and timestep().
00048 {
00049 int i, j, k, l;
00050 int n, nin;
00051 real ti[14], t1, t2;
00052 polynom3 px, py;
00053 listinter listi[14], xl;
00054
00055 if (cut->list == NULL) cut->list = (listinter *)malloc(sizeof(listinter));
00056 cut->ncut = 0;
00057 cut->xo = xo; cut->yo = yo;
00058
00059 /* For each segment */
00060 for (l = 0; l < in.n - 1; l++) {
00061 /* the positions are shifted (-xo, -yo) */
00062 i = (real)(in.x[l] - xo);
00063 j = (real)(in.y[l] - yo);
00064 t1 = in.t[l]; t2 = in.t[l+1];
00065 px = in.spx[l]; py = in.spy[l];
00066 px.a -= xo; py.a -= yo;
00067
00068 /* first point */
00069 listi[0].t = t1; listi[0].type = MARK_TYPE;
00070 nin = 1;
00071
00072 /* intersections with the horizontals */
00073 n = polyroots(py, t1, t2, ti, (real) j, INTERPREC);
00074 for (k = 0; k < n; k++) {
00075 listi[nin].t = ti[k]; listi[nin].type = HOR_TYPE;
00076 listi[nin++].coord = j;
00077 }
00078 n = polyroots(py, t1, t2, ti, (real) j + 1.0, INTERPREC);
00079 for (k = 0; k < n; k++) {
00080 listi[nin].t = ti[k]; listi[nin].type = HOR_TYPE;
00081 listi[nin++].coord = j + 1;
00082 }
00083 /* intersections with the verticals */
00084 n = polyroots(px, t1, t2, ti, (real) i, INTERPREC);
00085 for (k = 0; k < n; k++) {
00086 listi[nin].t = ti[k]; listi[nin].type = VER_TYPE;
00087 listi[nin++].coord = i;
00088 }
00089 n = polyroots(px, t1, t2, ti, (real) i + 1.0, INTERPREC);
00090 for (k = 0; k < n; k++) {
00091 listi[nin].t = ti[k]; listi[nin].type = VER_TYPE;
00092 listi[nin++].coord = i + 1;
00093 }
00094
00095 /* last point */
00096 listi[nin].t = t2; listi[nin++].type = MARK_TYPE;
00097
00098 /* sort the intersections in ascending order for t */
00099 for (k = 1; k < nin; k++) {
00100 xl = listi[k]; i = k - 1;
00101 while (i >= 0 && listi[i].t > xl.t) {
00102 listi[i + 1] = listi[i]; i--;
00103 }
00104 listi[i + 1] = xl;
00105 }
00106
00107 /* add the points to the list */
00108 cut->list = (listinter *)realloc(cut->list,
00109 (cut->ncut + nin)*sizeof(listinter));
00110 for (k = 0; k < nin; k++) {
00111 listi[k].ip = l;
00112 cut->list[cut->ncut++] = listi[k];
00113 }
00114 }
00115 }
|
|
||||||||||||||||
|
Definition at line 118 of file surfaces.poly.c. References HOR_TYPE, listinter::ip, interface_cut::list, MARK_TYPE, interface_cut::ncut, real, splint, interface::spx, interface::spy, listinter::t, listinter::type, and VER_TYPE.
00119 {
00120 int i, ip;
00121 polynom3 px, py;
00122 real t;
00123 FILE *fptr = fopen(file, "wt");
00124
00125 for (i = 0; i < cut.ncut; i++)
00126 if (cut.list[i].type == MARK_TYPE) {
00127 ip = cut.list[i].ip;
00128 px = in.spx[ip]; py = in.spy[ip];
00129 t = cut.list[i].t;
00130 fprintf(fptr, "%g %g\n", splint(px, t), splint(py, t));
00131 }
00132 fprintf(fptr, "&\n");
00133 for (i = 0; i < cut.ncut; i++)
00134 if (cut.list[i].type == HOR_TYPE) {
00135 ip = cut.list[i].ip;
00136 px = in.spx[ip]; py = in.spy[ip];
00137 t = cut.list[i].t;
00138 fprintf(fptr, "%g %g\n", splint(px, t), splint(py, t));
00139 }
00140 fprintf(fptr, "&\n");
00141 for (i = 0; i < cut.ncut; i++)
00142 if (cut.list[i].type == VER_TYPE) {
00143 ip = cut.list[i].ip;
00144 px = in.spx[ip]; py = in.spy[ip];
00145 t = cut.list[i].t;
00146 fprintf(fptr, "%g %g\n", splint(px, t), splint(py, t));
00147 }
00148 fclose(fptr);
00149 }
|
|
||||||||||||||||
|
Definition at line 9 of file surfaces.poly.c. References interface::n, real, sq, interface::x, and interface::y. Referenced by interface_fill(), sx_fill(), and sy_fill().
00010 {
00011 int i;
00012 real a, d, dmin = 1e30;
00013 for (i = 0; i < in.n - 1; i++) {
00014 d = sqrt(sq(x - 0.5*(in.x[i] + in.x[i+1])) +
00015 sq(y - 0.5*(in.y[i] + in.y[i+1])));
00016 a = (in.x[i+1] - in.x[i])*(y - in.y[i]) -
00017 (x - in.x[i])*(in.y[i+1] - in.y[i]);
00018 if (d < fabs(dmin)) dmin = a >= 0.0 ? d : -d;
00019 }
00020 if (dmin >= 0.0) return dmin;
00021 return 0.0;
00022 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 357 of file surfaces.poly.c. References polynom3::a, fill0(), listinter::ip, interface_cut::list, interface_cut::ncut, polyderiv(), polyeval(), polyint(), polymul(), real, real2D, splint, interface::spx, interface::spy, listinter::t, interface_cut::xo, and interface_cut::yo. Referenced by mgsolve(), momentum(), and timestep().
00360 {
00361 int i, j, l;
00362 real t, t1, t2;
00363 polynom3 px, py;
00364 real dz[3], rdz[6], rrdzp[9], irrdz[10];
00365
00366 fill0(rrdz, nx, ny);
00367
00368 /* For each intersection */
00369 for (l = 0; l < cut.ncut - 1; l++) {
00370 px = in.spx[cut.list[l].ip];
00371 py = in.spy[cut.list[l].ip];
00372 px.a -= cut.xo;
00373 py.a -= cut.yo;
00374
00375 t1 = cut.list[l].t; t2 = cut.list[l+1].t;
00376 t = 0.5*(t1 + t2);
00377 i = splint(px, t);
00378 j = splint(py, t);
00379
00380 py.a += cut.yo - 2.; px.a += cut.xo;
00381 polyderiv((real *)&px, 4, dz);
00382 polymul((real *)&py, 4, dz, 3, rdz);
00383 py.a -= cut.yo + (real)j - 1.5 + ra;
00384 polymul((real *)&py, 4, rdz, 6, rrdzp);
00385 polyint(rrdzp, 9, irrdz);
00386
00387 /* add the circulation along the polynomial segment */
00388 rrdz[i][j] += polyeval(irrdz, 10, t2) - polyeval(irrdz, 10, t1);
00389 }
00390 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 321 of file surfaces.poly.c. References polynom3::a, fill0(), listinter::ip, interface_cut::list, interface_cut::ncut, polyderiv(), polyeval(), polyint(), polymul(), real, real2D, splint, interface::spx, interface::spy, listinter::t, interface_cut::xo, and interface_cut::yo. Referenced by mgsolve(), momentum(), and timestep().
00324 {
00325 int i, j, l;
00326 real t, t1, t2;
00327 polynom3 px, py;
00328 real dr[3], rdr[6], rzdrp[9], irzdr[10];
00329
00330 fill0(rzdr, nx, ny);
00331
00332 /* For each intersection */
00333 for (l = 0; l < cut.ncut - 1; l++) {
00334 px = in.spx[cut.list[l].ip];
00335 py = in.spy[cut.list[l].ip];
00336 px.a -= cut.xo;
00337 py.a -= cut.yo;
00338
00339 t1 = cut.list[l].t; t2 = cut.list[l+1].t;
00340 t = 0.5*(t1 + t2);
00341 i = splint(px, t);
00342 j = splint(py, t);
00343
00344 py.a += cut.yo - 2.;
00345 polyderiv((real *)&py, 4, dr);
00346 polymul((real *)&py, 4, dr, 3, rdr);
00347 px.a -= (real)i + 0.5 + za;
00348 polymul((real *)&px, 4, rdr, 6, rzdrp);
00349 polyint(rzdrp, 9, irzdr);
00350
00351 /* add the circulation along the polynomial segment */
00352 rzdr[i][j] += polyeval(irzdr, 10, t2) - polyeval(irzdr, 10, t1);
00353 }
00354 }
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 152 of file surfaces.poly.c. References polynom3::a, listinter::coord, fill0(), HOR_TYPE, listinter::ip, interface_cut::list, MAXROUND, interface_cut::ncut, polyderiv(), polyeval(), polyint(), polymul(), real, real2D, splint, interface::spx, interface::spy, sq, listinter::t, listinter::type, VER_TYPE, interface_cut::xo, and interface_cut::yo. Referenced by initialize(), mgsolve(), and timestep().
00156 {
00157 int i, j, l;
00158 real t, t1, t2;
00159 real x, y, cmax;
00160 polynom3 px, py;
00161 real dy[3], xdy[6], ixdy[7], xydy[9], ixydy[10];
00162
00163 fill0(wa, nx, ny); fill0(wc, nx, ny);
00164 fill0(sx, nx, ny); fill0(sy, nx, ny);
00165
00166 /* For each intersection */
00167 for (l = 0; l < cut.ncut - 1; l++) {
00168 px = in.spx[cut.list[l].ip];
00169 py = in.spy[cut.list[l].ip];
00170 px.a -= cut.xo;
00171 py.a -= cut.yo;
00172
00173 t1 = cut.list[l].t; t2 = cut.list[l+1].t;
00174 t = 0.5*(t1 + t2);
00175 i = splint(px, t);
00176 j = splint(py, t);
00177
00178 x = splint(px, t1);
00179 y = splint(py, t1);
00180
00181 px.a -= (real)i;
00182 polyderiv((real *)&py, 4, dy);
00183 polymul((real *)&px, 4, dy, 3, xdy);
00184 polyint(xdy, 6, ixdy);
00185
00186 py.a += cut.yo - 2.;
00187 polymul((real *)&py, 4, xdy, 6, xydy);
00188 polyint(xydy, 9, ixydy);
00189
00190 /* Intersection with the verticals */
00191 if (cut.list[l].type == VER_TYPE) {
00192 /* deal with roundoff errors */
00193 if (y > (real)j + 1.0) y = (real)j + 1.0;
00194 else if (y < (real)j) y = (real)j;
00195 /* add the circulation of the vertical segment */
00196 if (cut.list[l].coord == i) {
00197 wa[i-1][j] += (real)j + 1.0 - y;
00198 t = 0.5*(sq((real)j + cut.yo - 1.) - sq(y + cut.yo - 2.));
00199 wc[i-1][j] += t;
00200 sy[i][j] += t;
00201 }
00202 else {
00203 wa[i][j] += y - (real)j;
00204 t = 0.5*(sq(y + cut.yo - 2.) - sq((real)j + cut.yo - 2.));
00205 wc[i][j] += t;
00206 sy[i+1][j] += t;
00207 }
00208 }
00209 /* Intersection with the horizontals */
00210 else if (cut.list[l].type == HOR_TYPE) {
00211 /* deal with roundoff errors */
00212 if (x > (real)i + 1.0) x = (real)i + 1.0;
00213 else if (x < (real)i) x = (real)i;
00214 /* add the circulation of the horizontal segment */
00215 if (cut.list[l].coord == j)
00216 sx[i][j] += (x - (real)i)*((real)j + cut.yo - 2.);
00217 else
00218 sx[i][j+1] += ((real)i + 1. - x)*((real)j + cut.yo - 1.);
00219 }
00220
00221 /* add the circulation along the polynomial segment */
00222 wa[i][j] += polyeval(ixdy, 7, t2) - polyeval(ixdy, 7, t1);
00223 wc[i][j] += polyeval(ixydy, 10, t2) - polyeval(ixydy, 10, t1);
00224 }
00225
00226 /* merdic formula */
00227 for (i = 1; i <= nx; i++)
00228 for (j = 2; j <= ny; j++) {
00229 t = wa[i][j] = modf(wa[i][j], &y);
00230 if (wa[i][j] >= a[i][j] + 0.5) wa[i][j] -= 1.0;
00231 if (wa[i][j] <= a[i][j] - 0.5) wa[i][j] += 1.0;
00232 if (wa[i][j] <= a[i][j] - 0.5) wa[i][j] += 1.0;
00233
00234 cmax = (real)j + cut.yo - 1.5;
00235 wc[i][j] = cmax == 0.0 ? 0.0 : cmax*modf(wc[i][j]/cmax, &y);
00236 if (wc[i][j] >= (a[i][j] + 0.5)*cmax) wc[i][j] -= cmax;
00237 if (wc[i][j] <= (a[i][j] - 0.5)*cmax) wc[i][j] += cmax;
00238 if (wc[i][j] <= (a[i][j] - 0.5)*cmax) wc[i][j] += cmax;
00239
00240 if ((cut.yo != -0.5 || j != 2) && (wa[i][j] < - MAXROUND
00241 || wa[i][j] > 1.0 + MAXROUND))
00242 printf("WARNING wa[%d][%d]: %g %g %g xo: %g yo: %g\n",
00243 i, j, wa[i][j], a[i][j], t, cut.xo, cut.yo);
00244 if ((cut.yo != -0.5 || j != 2) && (wc[i][j] < - MAXROUND*cmax
00245 || wc[i][j] > cmax*(1. + MAXROUND)))
00246 printf("WARNING wc[%d][%d]: %g c[%d][%d]:%g cmax: %g xo,yo: %g,%g\n", i, j, wc[i][j], i, j, c[i][j], cmax, cut.xo, cut.yo);
00247 c[i][j] = wc[i][j];
00248 a[i][j] = wa[i][j];
00249 }
00250 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 253 of file surfaces.poly.c. References interface_inside(), real, and real2D. Referenced by mgsolve(), and timestep().
00255 {
00256 int i, j;
00257 real sxmax;
00258
00259 for (i = 2; i <= nx; i++)
00260 for (j = 3; j <= ny; j++) {
00261 sxmax = (real)j + yo - 2.;
00262 if (sx[i][j] > sxmax) sx[i][j] -= sxmax;
00263 if (sx[i][j] == 0.0 && (a[i][j] > 0.0 || a[i][j-1] > 0.0))
00264 if (a[i][j] == 1.0 || a[i][j-1] == 1.0 ||
00265 interface_inside(in, (real)i + xo + 0.5, (real)j + yo))
00266 sx[i][j] = sxmax;
00267 if (sx[i][j] < 0.0 || sx[i][j] > sxmax)
00268 printf("WARNING sx[%d][%d]:%g sxmax: %g xo,yo: %g,%g\n",
00269 i, j, sx[i][j], sxmax, xo, yo);
00270 }
00271 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 295 of file surfaces.poly.c. Referenced by pressure().
00296 {
00297 int i, j;
00298 for (i = 1; i <= nx; i++)
00299 for (j = 3; j <= ny; j++)
00300 fprintf(fptr, "%g %g\n%g %g\n\n",
00301 (real)i + 0.5 + xo - 0.5*sx[i][j]/((real)j + yo - 1.5),
00302 (real)j + yo,
00303 (real)i + 0.5 + xo + 0.5*sx[i][j]/((real)j + yo - 1.5),
00304 (real)j + yo);
00305 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 274 of file surfaces.poly.c. References interface_inside(), real, and real2D. Referenced by mgsolve(), and timestep().
00276 {
00277 int i, j;
00278 real symax;
00279
00280 for (i = 2; i <= nx; i++)
00281 for (j = 2; j <= ny; j++) {
00282 symax = (real)j + yo - 1.5;
00283 if (sy[i][j] > symax) sy[i][j] -= symax;
00284 if (sy[i][j] == 0.0 && (a[i][j] > 0.0 || a[i-1][j] > 0.0))
00285 if (a[i][j] == 1.0 || a[i-1][j] == 1.0 ||
00286 interface_inside(in, (real)i + xo, (real)j + yo + 0.5))
00287 sy[i][j] = symax;
00288 if (symax > 0.0 && (sy[i][j] < 0.0 || sy[i][j] > symax))
00289 printf("WARNING sy[%d][%d]:%g symax: %g xo,yo: %g,%g\n",
00290 i, j, sy[i][j], symax, xo, yo);
00291 }
00292 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 308 of file surfaces.poly.c.
00309 {
00310 int i, j;
00311 for (i = 1; i <= nx; i++)
00312 for (j = 2; j <= ny; j++)
00313 fprintf(fptr, "%g %g\n%g %g\n\n",
00314 (real)i + xo,
00315 (real)j + 0.5 + yo - 0.5*sy[i][j]/((real)j + yo - 1.5),
00316 (real)i + xo,
00317 (real)j + 0.5 + yo + 0.5*sy[i][j]/((real)j + yo - 1.5));
00318 }
|
1.2.18