00001 #include "utilf.h"
00002 #include "markers.h"
00003 #include "surfaces.h"
00004 #include "tension.h"
00005 #include "extra.h"
00006 #include "inout.h"
00007
00008
00009 #define PHI_R_LINEAR(in, i, t1) \
00010 (((t1 - (in).t[i])*(in).p[i+1] + ((in).t[i+1] - t1)*(in).p[i])/ \
00011 ((in).t[i+1] - (in).t[i]))
00012
00013
00014
00015
00016 static real phi_r(polynom3 px, polynom3 py, real t, real sigma, real mu,
00017 real2D u, real2D v, real2D ap, int nx, int ny)
00018 {
00019 real n1, n2, xp, yp, dl, x, y, kappa;
00020 real dudx, dvdy, dudy, dvdx, eu, ev;
00021
00022 xp = splint1(px, t);
00023 yp = splint1(py, t);
00024 dl = sqrt(sq(xp) + sq(yp));
00025 n1 = - yp/dl; n2 = xp/dl;
00026 y = splint(py, t) - 2.0;
00027 kappa = y*(yp*splint2(px, t) - xp*splint2(py, t))/sq(dl) + xp/dl;
00028
00029
00030 x = splint(px, t); y = splint(py, t);
00031 #ifdef EXTRA_LINEAR
00032 extra_velocity_normals(x, y, n1, n2, x, y, u, v, ap,
00033 &eu, &ev,
00034 &dudx, &dvdy, &dudy, &dvdx, nx, ny);
00035 #else
00036 extra_velocity_normals2(x, y, n1, n2, x, y, u, v, ap,
00037 &eu, &ev,
00038 &dudx, &dvdy, &dudy, &dvdx, nx, ny);
00039 #endif
00040 y -= 2.;
00041
00042 return - sigma*kappa
00043 + 2.*y*mu*(dudx*sq(n1) + dvdy*sq(n2) + (dudy + dvdx)*n1*n2);
00044 }
00045
00046
00047
00048 static real phi_r_dr(interface in, int j, real t1, real t2)
00049 {
00050
00051 static real coef[7] = {1., 3., 3., 2., 3., 3., 1.};
00052 int i;
00053 real yp, h = (t2 - t1)/6., t, sum = 0.0;
00054 real a = (in.p[j+1] - in.p[j])/(in.t[j+1] - in.t[j]);
00055 real b = (in.t[j+1]*in.p[j] - in.t[j]*in.p[j+1])/(in.t[j+1] - in.t[j]);
00056 polynom3 spy = in.spy[j];
00057
00058 for (i = 0; i < 7; i++) {
00059 t = t1 + h*i;
00060 yp = splint1(spy, t);
00061 sum += coef[i]*yp*(a*t + b);
00062 }
00063 return 3.*h*sum/8.;
00064 }
00065
00066
00067
00068 static real phi_r_dz(interface in, int j, real t1, real t2)
00069 {
00070
00071 static real coef[7] = {1., 3., 3., 2., 3., 3., 1.};
00072 int i;
00073 real xp, h = (t2 - t1)/6., t, sum = 0.0;
00074 real a = (in.p[j+1] - in.p[j])/(in.t[j+1] - in.t[j]);
00075 real b = (in.t[j+1]*in.p[j] - in.t[j]*in.p[j+1])/(in.t[j+1] - in.t[j]);
00076 polynom3 spx = in.spx[j];
00077
00078 for (i = 0; i < 7; i++) {
00079 t = t1 + h*i;
00080 xp = splint1(spx, t);
00081 sum += coef[i]*xp*(a*t + b);
00082 }
00083 return 3.*h*sum/8.;
00084 }
00085
00086
00087 void interface_tensionu(interface in, interface_cut cut,
00088 real2D u, real2D v,
00089 real2D cu, real2D ap, real2D syu, real2D p,
00090 real2D pi, real2D ni,
00091 int nx, int ny)
00092 {
00093 int i, j, l;
00094 real t, t1, t2;
00095 polynom3 px, py;
00096
00097 fill0(pi, nx, ny);
00098 fill0(ni, nx, ny);
00099
00100
00101 for (l = 0; l < cut.ncut - 1; l++) {
00102 px = in.spx[cut.list[l].ip];
00103 py = in.spy[cut.list[l].ip];
00104
00105 t1 = cut.list[l].t; t2 = cut.list[l+1].t;
00106 t = 0.5*(t1 + t2);
00107 i = splint(px, t) - cut.xo;
00108 j = splint(py, t) - cut.yo;
00109
00110
00111 if (cut.list[l].type == VER_TYPE) {
00112 if (cut.list[l].coord == i) {
00113 if (!INP(i-1,j)) {
00114 pi[i-1][j] += PHI_R_LINEAR(in, cut.list[l].ip, t1)/
00115 (splint(py, t1) - 2.);
00116 ni[i-1][j] += 1.0;
00117 }
00118 }
00119 else if (!INP(i,j)) {
00120 pi[i][j] += PHI_R_LINEAR(in, cut.list[l].ip, t1)/
00121 (splint(py, t1) - 2.);
00122 ni[i][j] += 1.0;
00123 }
00124 }
00125
00126 if (INU(i,j)) u[i][j] -= phi_r_dr(in, cut.list[l].ip, t1, t2)/cu[i][j];
00127 }
00128 for (i = 2; i <= nx; i++)
00129 for (j = 2; j < ny; j++)
00130 if (INU(i,j)) {
00131 if (pi[i-1][j] != 0.0)
00132 u[i][j] += syu[i][j]*pi[i-1][j]/(cu[i][j]*ni[i-1][j]);
00133 if (pi[i][j] != 0.0)
00134 u[i][j] -= syu[i+1][j]*pi[i][j]/(cu[i][j]*ni[i][j]);
00135 }
00136 }
00137
00138
00139 void interface_tensionv(interface in, interface_cut cut,
00140 real2D u, real2D v, real2D cv, real2D ap, real2D sxv,
00141 real2D av, real2D p,
00142 real2D pi, real2D ni,
00143 int nx, int ny)
00144 {
00145 int i, j, l;
00146 real t, t1, t2;
00147 polynom3 px, py;
00148
00149 fill0(pi, nx, ny);
00150 fill0(ni, nx, ny);
00151
00152
00153 for (l = 0; l < cut.ncut - 1; l++) {
00154 px = in.spx[cut.list[l].ip];
00155 py = in.spy[cut.list[l].ip];
00156
00157 t1 = cut.list[l].t; t2 = cut.list[l+1].t;
00158 t = 0.5*(t1 + t2);
00159 i = splint(px, t) - cut.xo;
00160 j = splint(py, t) - cut.yo;
00161
00162
00163 if (cut.list[l].type == HOR_TYPE) {
00164 if (cut.list[l].coord == j) {
00165 if (!INP(i,j-1)) {
00166 pi[i][j-1] += PHI_R_LINEAR(in, cut.list[l].ip, t1)
00167 /(splint(py, t1) - 2.);
00168 ni[i][j-1] += 1.0;
00169 }
00170 }
00171 else if (!INP(i,j)) {
00172 pi[i][j] += PHI_R_LINEAR(in, cut.list[l].ip, t1)
00173 /(splint(py, t1) - 2.);
00174 ni[i][j] += 1.0;
00175 }
00176 }
00177
00178 if (INV(i,j)) v[i][j] += phi_r_dz(in, cut.list[l].ip, t1, t2)/cv[i][j];
00179 }
00180 for (i = 2; i < nx; i++)
00181 for (j = 3; j <= ny; j++)
00182 if (INV(i,j)) {
00183 if (pi[i][j-1] != 0.0)
00184 v[i][j] += (sxv[i][j] + av[i][j]/2.)*pi[i][j-1]
00185 /(cv[i][j]*ni[i][j-1]);
00186 else if (!INP(i,j-1))
00187 v[i][j] += av[i][j]/2.*p[i][j]/cv[i][j];
00188 if (pi[i][j] != 0.0)
00189 v[i][j] -= (sxv[i][j+1] - av[i][j]/2.)*pi[i][j]
00190 /(cv[i][j]*ni[i][j]);
00191 else if (!INP(i,j))
00192 v[i][j] += av[i][j]/2.*p[i][j-1]/cv[i][j];
00193 }
00194 }
00195
00196
00197 void interfacial_pressure(interface in, real2D u, real2D v, real2D ap,
00198 real sigma, real mu, real pg, real tau,
00199 int nx, int ny)
00200 {
00201 real h = 1.0/(nx - 2.);
00202 int i;
00203
00204 sigma *= sq(tau)/(h*h*h);
00205 mu *= tau/sq(h);
00206 pg *= sq(tau/h);
00207
00208 for (i = 0; i < in.n - 1; i++)
00209 in.p[i] = pg*(in.y[i] - 2.) +
00210 phi_r(in.spx[i], in.spy[i], in.t[i], sigma, mu,
00211 u, v, ap, nx, ny);
00212 in.p[in.n-1] = pg*(in.y[in.n-1] - 2.) +
00213 phi_r(in.spx[in.n-2], in.spy[in.n-2], in.t[in.n-1],
00214 sigma, mu, u, v, ap, nx, ny);
00215 }
00216
00217
00218
00219
00220
00221