Main Page   Data Structures   File List   Data Fields   Globals  

fluxes.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 interface_fluxes (interface in, real2D cc, real2D s1, real2D s2, real2D s3, real2D s4, int nx, int ny)
void interface_hfrac (interface in, real2D fx, real2D c, real xo, real yo, int nx, int ny)
void interface_vfrac (interface in, real2D fy, real2D c, real xo, real yo, int nx, int ny)


Function Documentation

void interface_fluxes interface    in,
real2D    cc,
real2D    s1,
real2D    s2,
real2D    s3,
real2D    s4,
int    nx,
int    ny
 

Definition at line 7 of file fluxes.c.

References listinter::coord, fill0(), HOR_TYPE, INP, INTERPREC, MARK_TYPE, interface::n, polyroots(), real, real2D, splint, interface::spx, interface::spy, sq, listinter::t, interface::t, listinter::type, VER_TYPE, interface::x, and interface::y.

00010 {
00011   int i, j, k, l;
00012   int n, nin;
00013   real ti[14], t, t1, t2;
00014   real x, y, x1, y1, yo;
00015   polynom3 px, py;
00016   typedef struct {
00017     real t;
00018     int type, coord;
00019   } listinter;
00020   listinter listi[14], xl;
00021 
00022   fill0(s1, nx, ny);  fill0(s3, nx, ny);  
00023   fill0(s2, nx, ny);  fill0(s4, nx, ny);
00024 #if 0
00025   /* For each segment */  
00026   for (l = 0; l < in.n - 1; l++) {
00027     i = (real)in.x[l]; 
00028     j = (real)in.y[l];
00029     t1 = in.t[l]; t2 = in.t[l+1];
00030     px = in.spx[l]; py = in.spy[l];
00031     
00032     /* first point */
00033     listi[0].t = t1; listi[0].type = MARK_TYPE;
00034     nin = 1;
00035     
00036     /* intersections with the horizontals */
00037     n = polyroots(py, t1, t2, ti, (real) j, INTERPREC);
00038     for (k = 0; k < n; k++) {
00039       listi[nin].t = ti[k]; listi[nin].type = HOR_TYPE; 
00040       listi[nin++].coord = j;
00041     }
00042     n = polyroots(py, t1, t2, ti, (real) j + 1.0, INTERPREC);
00043     for (k = 0; k < n; k++) {
00044       listi[nin].t = ti[k]; listi[nin].type = HOR_TYPE; 
00045       listi[nin++].coord = j + 1;
00046     }
00047     /* intersections with the verticals */
00048     n = polyroots(px, t1, t2, ti, (real) i, INTERPREC);
00049     for (k = 0; k < n; k++) {
00050       listi[nin].t = ti[k]; listi[nin].type = VER_TYPE; 
00051       listi[nin++].coord = i;
00052     }
00053     n = polyroots(px, t1, t2, ti, (real) i + 1.0, INTERPREC);
00054     for (k = 0; k < n; k++) {
00055       listi[nin].t = ti[k]; listi[nin].type = VER_TYPE; 
00056       listi[nin++].coord = i + 1;
00057     }
00058     
00059     /* last point */
00060     listi[nin].t = t2; listi[nin++].type = MARK_TYPE;
00061     
00062     /* sort the intersections in ascending order for t */
00063     for (k = 1; k < nin; k++) {
00064       xl = listi[k]; i = k - 1;
00065       while (i >= 0 && listi[i].t > xl.t) {
00066         listi[i + 1] = listi[i]; i--;
00067       }
00068       listi[i + 1] = xl;
00069     }
00070     
00071     for (k = 0; k < nin - 1; k++)  {
00072       t1 = listi[k].t; t2 = listi[k+1].t;
00073       t = 0.5*(t1 + t2);
00074       i = splint(px, t);
00075       j = splint(py, t);
00076       
00077       x = splint(px, t1); x1 = splint(px, t2); 
00078       y = splint(py, t1) - 2.; y1 = splint(py, t2) - 2.;
00079       yo = (real)j - 2.;
00080       
00081       /* Intersection with the verticals */
00082       if (listi[k].type == VER_TYPE) {
00083         /* add the circulation of the vertical segment */
00084         if (listi[k].coord == i) {
00085           t = (1. + yo - y)*(1. + yo + y)/2.;
00086           s3[i][j] -= t;
00087           s1[i-1][j] += t;
00088         } 
00089         else {
00090           t = (y - yo)*(y + yo)/2.;
00091           s1[i][j] += t;
00092           s3[i+1][j] -= t;
00093         }
00094       }
00095 
00096       /* Intersection with the horizontals */
00097       if (listi[k].type == HOR_TYPE) {
00098         /* add the circulation of the horizontal segment */
00099         if (listi[k].coord == j) {
00100           t = (x - i)*yo;
00101           s4[i][j] -= t;
00102           s2[i][j-1] += t;
00103         } 
00104         else {
00105           t = (1. + i - x)*(yo + 1.);
00106           s2[i][j] += t;
00107           s4[i][j+1] -= t;
00108         }
00109       }
00110 
00111       /* add the circulation along the segment */
00112       x -= i; x1 -= i;
00113       t = (y1 - y)*((x1*y1 + x*y)/3. + (x1*y + x*y1)/6.);
00114       s1[i][j] += t;
00115       s3[i][j] -= t - (y1 - y)*(y1 + y)/2.;
00116       t = (sq(y1) + y1*y + sq(y))/3.;
00117       s2[i][j] += (x1 - x)*(yo*(y1 + y)/2. - t);
00118       s4[i][j] -= (x1 - x)*((yo + 1.)*(y1 + y)/2. - t);
00119     }
00120   }
00121 #endif
00122   for (i = 2; i < nx; i++)
00123     for (j = 2; j < ny; j++)
00124       if (INP(i,j)) {
00125         yo = (real)j - 2.;
00126         if (s1[i][j] <= 0.1*yo) s1[i][j] += yo + 0.5;
00127         else if (s1[i][j] > yo + 0.5) s1[i][j] -= yo + 0.5;
00128         if (s3[i][j] >= - 0.1*yo) s3[i][j] -= yo + 0.5;
00129         else if (s3[i][j] < - yo - 0.5) s3[i][j] += yo + 0.5;
00130         if (s2[i][j] <= 0.1*yo) s2[i][j] += yo + 1.;
00131         else if (s2[i][j] > yo + 1.) s2[i][j] -= yo + 1.;
00132         if (s4[i][j] >= - 0.1*yo) s4[i][j] -= yo;
00133         else if (s4[i][j] < -yo) s4[i][j] += yo;
00134 
00135         if (s1[i][j] < 0.1*yo) { 
00136           s1[i][j] += yo + 0.5; 
00137           printf("s1[%d][%d]=%g <= 0.1\n", i, j, s1[i][j]);
00138         }
00139         else if (s1[i][j] > yo + 0.5) {
00140           s1[i][j] -= yo + 0.5;
00141           printf("s1[%d][%d]=%g >\n", i, j, s1[i][j]);
00142         }
00143         if (s3[i][j] > - 0.1*yo) { 
00144           s3[i][j] -= yo + 0.5;
00145           printf("s3[%d][%d]=%g >= - 0.1\n", i, j, s3[i][j]);
00146         }
00147         else if (s3[i][j] < - yo - 0.5) {
00148           s3[i][j] += yo + 0.5;
00149           printf("s3[%d][%d]=%g <= \n", i, j, s3[i][j]);
00150         }
00151         if (s2[i][j] < 0.1*yo) {
00152           s2[i][j] += yo + 1.;
00153           printf("s2[%d][%d]=%g <= 0.1\n", i, j, s2[i][j]);
00154         }
00155         else if (s2[i][j] > yo + 1.) {
00156           s2[i][j] -= yo + 1.;
00157           printf("s2[%d][%d]=%g >\n", i, j, s2[i][j]);
00158         }
00159         if (s4[i][j] > - 0.1*yo) {
00160           s4[i][j] -= yo;
00161           printf("s4[%d][%d]=%g >= - 0.1\n", i, j, s4[i][j]);
00162         }
00163         else if (s4[i][j] < -yo) {
00164           s4[i][j] += yo;
00165           printf("s4[%d][%d]=%g <\n", i, j, s4[i][j]);
00166         }
00167         /*      printf("%d,%d: s1: %g s2: %g s3: %g s4: %g\n", i, j, 
00168                 s1[i][j], s2[i][j], s3[i][j], s4[i][j]); */
00169         if (fabs(2.*(s1[i][j] + s3[i][j])/(s1[i][j] - s3[i][j])) > 1e-3) {
00170           fprintf(stderr, "interface_fluxes(): s1[%d][%d] = %g != - s3[%d][%d] = %g\n",
00171                   i, j, s1[i][j], i, j, - s3[i][j]);
00172           exit(1);
00173         }
00174       }
00175 }

void interface_hfrac interface    in,
real2D    fx,
real2D    c,
real    xo,
real    yo,
int    nx,
int    ny
 

Definition at line 178 of file fluxes.c.

References polynom3::a, fill0(), INTERPREC, interface::n, polyroots(), real, real2D, splint, interface::spx, interface::spy, interface::t, interface::x, and interface::y.

00181 {
00182   int i, j, k, l;
00183   int n;
00184   real ti[14], t, t1, t2;
00185   real x;
00186   polynom3 px, py;
00187 FILE *fptr = fopen("hfrac", "wt");
00188 
00189  fill0(fx, nx, ny);
00190 
00191   /* For each segment */  
00192   for (l = 0; l < in.n - 1; l++) {
00193     i = (real)in.x[l] - xo; 
00194     j = (real)in.y[l] - yo;
00195     t1 = in.t[l]; t2 = in.t[l+1];
00196     px = in.spx[l]; py = in.spy[l];
00197     px.a -= xo; py.a -= yo;
00198     
00199     /* intersections with the horizontals */
00200     n = polyroots(py, t1, t2, ti, (real) j, INTERPREC);
00201     for (k = 0; k < n; k++) {
00202       x = splint(px, ti[k]); i = x;
00203       fx[i][j] += (real)i + 1. - x;
00204     }
00205     n = polyroots(py, t1, t2, ti, (real) j + 1.0, INTERPREC);
00206     for (k = 0; k < n; k++) {
00207       x = splint(px, ti[k]); i = x;
00208       fx[i][j+1] += x - (real)i;
00209     }
00210   }
00211 
00212   for (i = 2; i < nx; i++)
00213     for (j = 2; j < ny; j++) {
00214       if (fx[i][j] > 1.0) fx[i][j] -= 1.0;
00215       if (fx[i][j] == 0.0 && c[i][j] + c[i][j-1] >= 1.0) fx[i][j] = 1.0;
00216       if (fx[i][j] > 1.0 || fx[i][j] < 0.0) {
00217         fprintf(stderr, "interface_hfrac(): fx[%d][%d]=%g\n", i, j, fx[i][j]);
00218         exit(1);
00219       }
00220       fprintf(fptr, "%g %g\n%g %g\n\n", 
00221               (real)i + xo + 0.5 + fx[i][j]/2., (real)j + yo,
00222               (real)i + yo + 0.5 - fx[i][j]/2., (real)j + yo);
00223     }
00224   fclose(fptr);
00225 }

void interface_vfrac interface    in,
real2D    fy,
real2D    c,
real    xo,
real    yo,
int    nx,
int    ny
 

Definition at line 228 of file fluxes.c.

References polynom3::a, fill0(), INTERPREC, interface::n, polyroots(), real, real2D, splint, interface::spx, interface::spy, sq, interface::t, interface::x, and interface::y.

00230 {
00231   int i, j, k, l;
00232   int n;
00233   real ti[14], t, t1, t2;
00234   real y;
00235   polynom3 px, py;
00236 FILE *fptr = fopen("vfrac", "wt");
00237 
00238  fill0(fy, nx, ny);
00239 
00240   /* For each segment */  
00241   for (l = 0; l < in.n - 1; l++) {
00242     i = (real)in.x[l] - xo; 
00243     j = (real)in.y[l] - yo;
00244     t1 = in.t[l]; t2 = in.t[l+1];
00245     px = in.spx[l]; py = in.spy[l];
00246     px.a -= xo; py.a -= yo;
00247     
00248     /* intersections with the verticals */
00249     n = polyroots(px, t1, t2, ti, (real) i, INTERPREC);
00250     for (k = 0; k < n; k++) {
00251       y = splint(py, ti[k]); j = y;
00252       fy[i][j] += 0.5*(sq(y + yo - 2.) - sq((real)j + yo - 2.))/
00253         ((real)j + yo - 1.5);
00254     }
00255     n = polyroots(px, t1, t2, ti, (real) i + 1.0, INTERPREC);
00256     for (k = 0; k < n; k++) {
00257       y = splint(py, ti[k]); j = y;
00258       fy[i+1][j] += 0.5*(sq((real)j + yo - 1.) - sq(y + yo - 2.))/
00259         ((real)j + yo - 1.5);
00260     }
00261   }
00262 
00263   for (i = 2; i < nx; i++)
00264     for (j = 2; j < ny; j++) {
00265       if (fy[i][j] > 1.0) fy[i][j] -= 1.0;
00266       if (fy[i][j] == 0.0 && c[i][j] + c[i-1][j] >= 1.0) fy[i][j] = 1.0;
00267       if (fy[i][j] > 1.0 || fy[i][j] < 0.0) {
00268         fprintf(stderr, "interface_vfrac(): fy[%d][%d]=%g\n", i, j, fy[i][j]);
00269         exit(1);
00270       }
00271       fprintf(fptr, "%g %g\n%g %g\n\n", 
00272               (real)i + xo, (real)j + yo + 0.5 + fy[i][j]/2.,
00273               (real)i + yo, (real)j + yo + 0.5 - fy[i][j]/2.);
00274     }
00275   fclose(fptr);
00276 }


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