Main Page   Data Structures   File List   Data Fields   Globals  

tension.c

Go to the documentation of this file.
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 /* Compute r\Phi given two polynomials describing the interface and the
00015    parameter t */
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 /*cld  kappa = y*(yp*splint2(px, t) - xp*splint2(py, t))/(sq(dl)*dl) + xp/dl; cld*/
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 /* Compute \sum_{t1}^{t2} \Phi r dr */
00048 static real phi_r_dr(interface in, int j, real t1, real t2)
00049 {
00050   /* coefficients of Newton-Cotes formula */
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 /* Compute \sum_{t1}^{t2} \Phi r dz */
00068 static real phi_r_dz(interface in, int j, real t1, real t2)
00069 {
00070   /* coefficients of Newton-Cotes formula */
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   /* For each intersection */
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     /* Intersection with the verticals */
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   /* For each intersection */
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     /* Intersection with the horizontals */
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 

Generated on Wed Feb 19 22:26:51 2003 for Markers by doxygen1.2.18