00001 #include "utilf.h"
00002 #include "markers.h"
00003 #include "fluxes.h"
00004 #include "inout.h"
00005
00006
00007 void interface_fluxes(interface in, real2D cc,
00008 real2D s1, real2D s2, real2D s3, real2D s4,
00009 int nx, int ny)
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
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
00033 listi[0].t = t1; listi[0].type = MARK_TYPE;
00034 nin = 1;
00035
00036
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
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
00060 listi[nin].t = t2; listi[nin++].type = MARK_TYPE;
00061
00062
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
00082 if (listi[k].type == VER_TYPE) {
00083
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
00097 if (listi[k].type == HOR_TYPE) {
00098
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
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
00168
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 }
00176
00177
00178 void interface_hfrac(interface in, real2D fx, real2D c,
00179 real xo, real yo,
00180 int nx, int ny)
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
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
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 }
00226
00227
00228 void interface_vfrac(interface in, real2D fy, real2D c,
00229 real xo, real yo, int nx, int ny)
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
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
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 }
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288