14 Cmpnts *Ub,
double nx,
double ny,
double nz)
16 double u_c = Uc.
x - Ua.
x, v_c = Uc.
y - Ua.
y, w_c = Uc.
z - Ua.
z;
17 double un = u_c * nx + v_c * ny + w_c * nz;
18 double ut = u_c - un * nx, vt = v_c - un * ny, wt = w_c - un * nz;
19 double ut_mag = sqrt( ut*ut + vt*vt + wt*wt );
21 (*Ub).x = sb/sc * u_c;
22 (*Ub).y = sb/sc * v_c;
23 (*Ub).z = sb/sc * w_c;
31 Cmpnts *Ub,
double nx,
double ny,
double nz)
34 double Uan = Ua.
x * nx + Ua.
y * ny + Ua.
z * nz;
35 double Ucn = Uc.
x * nx + Uc.
y * ny + Uc.
z * nz;
36 double Ubn = Uan + (Ucn - Uan) * sb/sc;
38 double ut = Uc.
x - Ucn * nx, vt = Uc.
y - Ucn * ny, wt = Uc.
z - Ucn * nz;
50double E_coeff (
double utau,
double ks,
double nu)
52 double kplus=utau*ks/nu, dB;
53 if(kplus<=2.25) dB = 0.0;
54 else if(kplus>2.25 && kplus<90.) dB = (
LOGLAW_B-8.5+1./
KAPPA*log(kplus))*sin(0.4258*(log(kplus)-0.811));
61 double y0plus=11.53, y1plus=300,f;
62 double yplus = utau*y/nu;
64 if(yplus<=y0plus){f= utau * yplus;}
65 else if (yplus<=y1plus) {f= utau/
KAPPA*log(
E_coeff(utau,ks,nu)*yplus);}
70double f_hydset(
double nu,
double u,
double y,
double utau0,
double ks)
72double y0plus=11.53, f;
73double yplus=utau0*y/nu;
74 if (yplus<=y0plus) {f= utau0*yplus-u;}
75 else {f= utau0*(1./
KAPPA*log(
E_coeff(utau0,ks,nu)*yplus))-u;}
79double df_hydset (
double nu,
double u,
double y,
double utau0,
double ks)
82return (
f_hydset(nu, u, y, utau0 + eps, ks) -
f_hydset(nu, u, y, utau0 - eps, ks))/(2.*eps);
88 double utau,utau0 = utau_guess;
92 if (fabs(utau-utau0)<1.e-7)
break;
105 return KAPPA * yplus * pow ( 1. - exp( - yplus / 19. ) , 2.0 );
111 double nut,f=0.0,yplus;
115 yplus=(i*dy)*utau/nu;
118 F[i]=1.0/(1.0+nut)/nu;
121 F[i]=dy*i/(1.0+nut)/nu;
124 for (i=1;i<ny-1;i++){
125 f+=(F[i-1]+2*F[i]+F[i+1])*0.25*dy;
127 f+=.1667*dy*(2*F[0]+F[1]+2*F[ny-1]+F[ny-2]);
130double taw(
double nu,
double utau,
double y,
double u,
double dpdt)
132 double yplus = y*utau/nu;
136 return 1/f1*(u-dpdt*f2);
138double u_Cabot(
double nu,
double y,
double utau,
double dpdt,
double taw)
142 return taw*f1+dpdt*f2;
147 double yplus = utau * y / nu;
148 double A=8.3, B=1./7.;
150 if(yplus<=11.81)
return yplus*utau;
151 else return A * pow(yplus, B) * utau;
154double f_Werner(
double nu,
double u,
double y,
double utau)
156 double ym=11.81*nu/utau;
157 double A=8.3, B=1./7.;
159 if( fabs(u) <= nu/(2*ym) * pow(A, 2./(1.-B) ) )
return utau*utau - u/y*nu;
160 else return utau*utau - u/fabs(u) * pow( 0.5*(1-B) * pow(A, (1+B)/(1-B)) * pow(nu/y, 1+B) + (1+B)/A * pow(nu/y, B) * fabs(u), 2/(1+B) );
163double df_Werner(
double nu,
double u,
double y,
double utau)
166 return (
f_Werner(nu, u, y, utau+eps) -
f_Werner(nu, u, y, utau-eps) ) / ( 2*eps ) ;
169double f_Cabot(
double nu,
double u,
double y,
double utau,
double dpdt,
double dpdtn)
171 return utau - sqrt(fabs(
taw( nu, utau, y, u, dpdt )));
174double df_Cabot(
double nu,
double u,
double y,
double utau,
double dpdt,
double dpdtn)
177 return (
f_Cabot(nu, u, y, utau+eps, dpdt,dpdtn) -
f_Cabot(nu, u, y, utau-eps, dpdt, dpdtn)) / ( 2*eps ) ;
191void find_utau_Cabot(
double nu,
double u,
double y,
double guess,
double dpdt,
double dpdtn,
double *utau,
double *taw1,
double *taw2)
197 for(i=0; i<30; i++) {
198 x =fabs (x0 -
f_Cabot(nu, u, y, x0, dpdt, dpdtn)/
df_Cabot(nu, u, y, x0, dpdt, dpdtn));
199 if( fabs(x0 - x) < 1.e-10)
break;
203 if( fabs(x0 - x) > 1.e-5 && i>=29 ) printf(
"\n!!!!!!!! Iteration Failed !!!!!!!!\n");
205 *taw1=
taw( nu, x, y, u, dpdt );
206 *taw2=
taw( nu, x, y, 0.0, dpdtn );
216 for(i=0; i<20; i++) {
218 if( fabs(x0 - x) < 1.e-7 )
break;
222 if( fabs(x0 - x) > 1.e-5 && i>=19 ) printf(
"\n!!!!!!!! Iteration Failed !!!!!!!!\n");
230 else if(a<0)
return -1;
235double u_loglaw(
double y,
double utau,
double roughness)
237 return utau * 1./
KAPPA * log( (roughness+y) / roughness ) ;
242 return KAPPA * u / log( (y+roughness) / roughness);
247 double nx,
double ny,
double nz)
250 double u_c = Uc.
x - Ua.
x, v_c = Uc.
y - Ua.
y, w_c = Uc.
z - Ua.
z;
251 double un = u_c * nx + v_c * ny + w_c * nz;
252 double ut = u_c - un * nx, vt = v_c - un * ny, wt = w_c - un * nz;
253 double ut_mag = sqrt( ut*ut + vt*vt + wt*wt );
256 double ut_mag_modeled =
u_Werner(1./simCtx->
ren, sb, utau);
260 ut *= ut_mag_modeled/ut_mag;
261 vt *= ut_mag_modeled/ut_mag;
262 wt *= ut_mag_modeled/ut_mag;
267 (*Ub).x = ut + sb/sc * un * nx;
268 (*Ub).y = vt + sb/sc * un * ny;
269 (*Ub).z = wt + sb/sc * un * nz;
278 double nx,
double ny,
double nz)
281 double u_c = Uc.
x - Ua.
x, v_c = Uc.
y - Ua.
y, w_c = Uc.
z - Ua.
z;
283 double un = u_c * nx + v_c * ny + w_c * nz;
284 double ut = u_c - un * nx, vt = v_c - un * ny, wt = w_c - un * nz;
285 double ut_mag = sqrt( ut*ut + vt*vt + wt*wt );
291 if (ut_mag_modeled<0.) {
293 ut_mag_modeled=ut_mag;
302 ut *= ut_mag_modeled/ut_mag;
303 vt *= ut_mag_modeled/ut_mag;
304 wt *= ut_mag_modeled/ut_mag;
309 (*Ub).x = ut + (sb/sc * un ) * nx;
310 (*Ub).y = vt + (sb/sc * un ) * ny;
311 (*Ub).z = wt + (sb/sc * un ) * nz;
321 double nx,
double ny,
double nz,
double dpdx,
double dpdy,
double dpdz,
int count)
324 double u_c = Uc.
x - Ua.
x, v_c = Uc.
y - Ua.
y, w_c = Uc.
z - Ua.
z;
326 double un = u_c * nx + v_c * ny + w_c * nz;
327 double ut = u_c - un * nx, vt = v_c - un * ny, wt = w_c - un * nz;
328 double ut_mag = sqrt( ut*ut + vt*vt + wt*wt );
329 double dpdt = dpdx*ut/ut_mag + dpdy*vt/ut_mag + dpdz*wt/ut_mag;
330 double dpdtn = sqrt(dpdx*dpdx+dpdy*dpdy+dpdz*dpdz-pow(dpdx*ut/ut_mag,2.0) - pow(dpdx*nx,2.0) -
331 pow(dpdy*vt/ut_mag,2.0) - pow(dpdy*ny,2.0) - pow(dpdz*nz,2.0)-pow(dpdz*wt/ut_mag,2.0));
332 double utau,taw1,taw2;
334 if (count ==0 ||count > 4){
338 double ut_mag_modeled =
u_Cabot(1./simCtx->
ren, sb, *ustar, dpdt, taw1);
341 ut *= ut_mag_modeled/ut_mag;
342 vt *= ut_mag_modeled/ut_mag;
343 wt *= ut_mag_modeled/ut_mag;
348 (*Ub).x = ut + (sb/sc * un ) * nx;
349 (*Ub).y = vt + (sb/sc * un ) * ny;
350 (*Ub).z = wt + (sb/sc * un ) * nz;
#define LOCAL
Logging scope definitions for controlling message output.
#define LOG_ALLOW(scope, level, fmt,...)
Logging macro that checks both the log level and whether the calling function is in the allowed-funct...
@ LOG_DEBUG
Detailed debugging information.
SimCtx * simCtx
Back-pointer to the master simulation context.
A 3D point or vector with PetscScalar components.
The master context for the entire simulation.
User-defined context containing data specific to a single computational grid level.
double u_hydset_roughness(double nu, double y, double utau, double ks)
double df_hydset(double nu, double u, double y, double utau0, double ks)
double df_Cabot(double nu, double u, double y, double utau, double dpdt, double dpdtn)
double E_coeff(double utau, double ks, double nu)
double f_Cabot(double nu, double u, double y, double utau, double dpdt, double dpdtn)
double df_Werner(double nu, double u, double y, double utau)
void wall_function_Cabot(UserCtx *user, double ks, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, PetscReal *ustar, double nx, double ny, double nz, double dpdx, double dpdy, double dpdz, int count)
void wall_function(UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, PetscReal *ustar, double nx, double ny, double nz)
double u_Werner(double nu, double y, double utau)
void noslip(UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, double nx, double ny, double nz)
void find_utau_Cabot(double nu, double u, double y, double guess, double dpdt, double dpdtn, double *utau, double *taw1, double *taw2)
double find_utau_Werner(double nu, double u, double y, double guess)
double find_utau_hydset(double nu, double u, double y, double utau_guess, double ks)
double f_Werner(double nu, double u, double y, double utau)
double taw(double nu, double utau, double y, double u, double dpdt)
double u_Cabot(double nu, double y, double utau, double dpdt, double taw)
void wall_function_loglaw(UserCtx *user, double ks, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, PetscReal *ustar, double nx, double ny, double nz)
double integrate_1(double nu, double y, double utau, int m)
double find_utau_loglaw(double u, double y, double roughness)
double f_hydset(double nu, double u, double y, double utau0, double ks)
void freeslip(UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, double nx, double ny, double nz)
double u_loglaw(double y, double utau, double roughness)
double nu_t(double yplus)