PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
Loading...
Searching...
No Matches
wallfunction.c File Reference
#include "wallfunction.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
Include dependency graph for wallfunction.c:

Go to the source code of this file.

Macros

#define KAPPA   0.41
 
#define LOGLAW_B   5.5
 

Functions

void noslip (UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, double nx, double ny, double nz)
 
void freeslip (UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, double nx, double ny, double nz)
 
double E_coeff (double utau, double ks, double nu)
 
double u_hydset_roughness (double nu, double y, double utau, double ks)
 
double f_hydset (double nu, double u, double y, double utau0, double ks)
 
double df_hydset (double nu, double u, double y, double utau0, double ks)
 
double find_utau_hydset (double nu, double u, double y, double utau_guess, double ks)
 
double nu_t (double yplus)
 
double integrate_1 (double nu, double y, double utau, int m)
 
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)
 
double u_Werner (double nu, double y, double utau)
 
double f_Werner (double nu, double u, double y, double utau)
 
double df_Werner (double nu, double u, double y, double utau)
 
double f_Cabot (double nu, double u, double y, double utau, double dpdt, double dpdtn)
 
double df_Cabot (double nu, double u, double y, double utau, double dpdt, double dpdtn)
 
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 sign (double a)
 
double u_loglaw (double y, double utau, double roughness)
 
double find_utau_loglaw (double u, double y, double roughness)
 
void wall_function (UserCtx *user, double sc, double sb, Cmpnts Ua, Cmpnts Uc, Cmpnts *Ub, PetscReal *ustar, double nx, double ny, double nz)
 
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)
 
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)
 

Macro Definition Documentation

◆ KAPPA

#define KAPPA   0.41

Definition at line 10 of file wallfunction.c.

◆ LOGLAW_B

#define LOGLAW_B   5.5

Definition at line 11 of file wallfunction.c.

Function Documentation

◆ noslip()

void noslip ( UserCtx user,
double  sc,
double  sb,
Cmpnts  Ua,
Cmpnts  Uc,
Cmpnts Ub,
double  nx,
double  ny,
double  nz 
)

Definition at line 13 of file wallfunction.c.

15{
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 );
20
21 (*Ub).x = sb/sc * u_c;
22 (*Ub).y = sb/sc * v_c;
23 (*Ub).z = sb/sc * w_c;
24
25 (*Ub).x += Ua.x;
26 (*Ub).y += Ua.y;
27 (*Ub).z += Ua.z;
28}
PetscScalar x
Definition variables.h:100
PetscScalar z
Definition variables.h:100
PetscScalar y
Definition variables.h:100
Here is the caller graph for this function:

◆ freeslip()

void freeslip ( UserCtx user,
double  sc,
double  sb,
Cmpnts  Ua,
Cmpnts  Uc,
Cmpnts Ub,
double  nx,
double  ny,
double  nz 
)

Definition at line 30 of file wallfunction.c.

32{
33 // in the Normal direction interpolation
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;
37 // in the Tangential direction Ub_t = Uc_t
38 double ut = Uc.x - Ucn * nx, vt = Uc.y - Ucn * ny, wt = Uc.z - Ucn * nz;
39
40 (*Ub).x = ut;
41 (*Ub).y = vt;
42 (*Ub).z = wt;
43
44 (*Ub).x += Ubn*nx;
45 (*Ub).y += Ubn*ny;
46 (*Ub).z += Ubn*nz;
47}

◆ E_coeff()

double E_coeff ( double  utau,
double  ks,
double  nu 
)

Definition at line 50 of file wallfunction.c.

51{
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));
55 else if(kplus>=90.) dB = LOGLAW_B-8.5+1./KAPPA*log(kplus);
56 return exp(KAPPA*(LOGLAW_B-dB));
57}
#define LOGLAW_B
#define KAPPA
Here is the caller graph for this function:

◆ u_hydset_roughness()

double u_hydset_roughness ( double  nu,
double  y,
double  utau,
double  ks 
)

Definition at line 59 of file wallfunction.c.

60{
61 double y0plus=11.53, y1plus=300,f;
62 double yplus = utau*y/nu;
63
64 if(yplus<=y0plus){f= utau * yplus;}
65 else if (yplus<=y1plus) {f= utau/KAPPA*log(E_coeff(utau,ks,nu)*yplus);}
66 else {f=-1.;}
67 return f;
68}
double E_coeff(double utau, double ks, double nu)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ f_hydset()

double f_hydset ( double  nu,
double  u,
double  y,
double  utau0,
double  ks 
)

Definition at line 70 of file wallfunction.c.

71{
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;}
76return f;
77}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ df_hydset()

double df_hydset ( double  nu,
double  u,
double  y,
double  utau0,
double  ks 
)

Definition at line 79 of file wallfunction.c.

80{
81double eps=1.e-7;
82return (f_hydset(nu, u, y, utau0 + eps, ks) - f_hydset(nu, u, y, utau0 - eps, ks))/(2.*eps);
83}
double f_hydset(double nu, double u, double y, double utau0, double ks)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_utau_hydset()

double find_utau_hydset ( double  nu,
double  u,
double  y,
double  utau_guess,
double  ks 
)

Definition at line 86 of file wallfunction.c.

87{
88 double utau,utau0 = utau_guess;
89 int ii;
90 for(ii=0;ii<30;ii++){
91 utau=utau0-f_hydset(nu,u,y,utau0,ks)/df_hydset(nu,u,y,utau0,ks);
92 if (fabs(utau-utau0)<1.e-7)break;
93 utau0=utau;
94 }
95 if (ii==30) LOG_ALLOW(LOCAL,LOG_DEBUG, "iter utau diff %d %le %le %le\n",ii,utau,utau0,fabs(utau-utau0));
96 //printf("iter utau diff %d %le %le %le\n",ii,utau,utau0,fabs(utau-utau0));
97return utau;
98};
#define LOCAL
Logging scope definitions for controlling message output.
Definition logging.h:44
#define LOG_ALLOW(scope, level, fmt,...)
Logging macro that checks both the log level and whether the calling function is in the allowed-funct...
Definition logging.h:207
@ LOG_DEBUG
Detailed debugging information.
Definition logging.h:33
double df_hydset(double nu, double u, double y, double utau0, double ks)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ nu_t()

double nu_t ( double  yplus)

Definition at line 103 of file wallfunction.c.

104{
105 return KAPPA * yplus * pow ( 1. - exp( - yplus / 19. ) , 2.0 );
106};
Here is the caller graph for this function:

◆ integrate_1()

double integrate_1 ( double  nu,
double  y,
double  utau,
int  m 
)

Definition at line 107 of file wallfunction.c.

108{
109 int ny=30; //number of integartion points
110 int i;
111 double nut,f=0.0,yplus;
112 double dy=y/(ny-1);
113 double F[ny];
114 for (i=0;i<ny;i++){
115 yplus=(i*dy)*utau/nu;
116 nut=nu_t(yplus);
117 if (m==0){
118 F[i]=1.0/(1.0+nut)/nu;
119 } else
120 {
121 F[i]=dy*i/(1.0+nut)/nu;
122 }
123 }
124 for (i=1;i<ny-1;i++){
125 f+=(F[i-1]+2*F[i]+F[i+1])*0.25*dy;
126 }
127 f+=.1667*dy*(2*F[0]+F[1]+2*F[ny-1]+F[ny-2]);
128 return f;
129}
double nu_t(double yplus)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ taw()

double taw ( double  nu,
double  utau,
double  y,
double  u,
double  dpdt 
)

Definition at line 130 of file wallfunction.c.

131{
132 double yplus = y*utau/nu;
133 double sum=0.0;
134 double f1 = integrate_1(nu,y,utau,0);
135 double f2 = integrate_1(nu,y,utau,1);
136 return 1/f1*(u-dpdt*f2);
137}
double integrate_1(double nu, double y, double utau, int m)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ u_Cabot()

double u_Cabot ( double  nu,
double  y,
double  utau,
double  dpdt,
double  taw 
)

Definition at line 138 of file wallfunction.c.

139{
140 double f1 = integrate_1(nu,y,utau,0);
141 double f2 = integrate_1(nu,y,utau,1);
142 return taw*f1+dpdt*f2;
143};
double taw(double nu, double utau, double y, double u, double dpdt)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ u_Werner()

double u_Werner ( double  nu,
double  y,
double  utau 
)

Definition at line 145 of file wallfunction.c.

146{
147 double yplus = utau * y / nu;
148 double A=8.3, B=1./7.;
149
150 if(yplus<=11.81) return yplus*utau;
151 else return A * pow(yplus, B) * utau;
152};
Here is the caller graph for this function:

◆ f_Werner()

double f_Werner ( double  nu,
double  u,
double  y,
double  utau 
)

Definition at line 154 of file wallfunction.c.

155{
156 double ym=11.81*nu/utau;
157 double A=8.3, B=1./7.;
158
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) );
161}
Here is the caller graph for this function:

◆ df_Werner()

double df_Werner ( double  nu,
double  u,
double  y,
double  utau 
)

Definition at line 163 of file wallfunction.c.

164{
165 double eps=1.e-7;
166 return ( f_Werner(nu, u, y, utau+eps) - f_Werner(nu, u, y, utau-eps) ) / ( 2*eps ) ;
167}
double f_Werner(double nu, double u, double y, double utau)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ f_Cabot()

double f_Cabot ( double  nu,
double  u,
double  y,
double  utau,
double  dpdt,
double  dpdtn 
)

Definition at line 169 of file wallfunction.c.

170{
171 return utau - sqrt(fabs(taw( nu, utau, y, u, dpdt )));
172}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ df_Cabot()

double df_Cabot ( double  nu,
double  u,
double  y,
double  utau,
double  dpdt,
double  dpdtn 
)

Definition at line 174 of file wallfunction.c.

175{
176 double eps=1.e-7;
177 return ( f_Cabot(nu, u, y, utau+eps, dpdt,dpdtn) - f_Cabot(nu, u, y, utau-eps, dpdt, dpdtn)) / ( 2*eps ) ;
178}
double f_Cabot(double nu, double u, double y, double utau, double dpdt, double dpdtn)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_utau_Cabot()

void find_utau_Cabot ( double  nu,
double  u,
double  y,
double  guess,
double  dpdt,
double  dpdtn,
double *  utau,
double *  taw1,
double *  taw2 
)

Definition at line 191 of file wallfunction.c.

192{
193 double x, x0=guess;
194
195 int i;
196
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;
200 x0 = x;
201 }
202
203 if( fabs(x0 - x) > 1.e-5 && i>=29 ) printf("\n!!!!!!!! Iteration Failed !!!!!!!!\n");
204 *utau=x;
205 *taw1=taw( nu, x, y, u, dpdt );
206 *taw2=taw( nu, x, y, 0.0, dpdtn );
207
208};
double df_Cabot(double nu, double u, double y, double utau, double dpdt, double dpdtn)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_utau_Werner()

double find_utau_Werner ( double  nu,
double  u,
double  y,
double  guess 
)

Definition at line 210 of file wallfunction.c.

211{
212 double x, x0=guess;
213
214 int i;
215
216 for(i=0; i<20; i++) {
217 x = x0 - f_Werner(nu, u, y, x0)/df_Werner(nu, u, y, x0);
218 if( fabs(x0 - x) < 1.e-7 ) break;
219 x0 = x;
220 }
221
222 if( fabs(x0 - x) > 1.e-5 && i>=19 ) printf("\n!!!!!!!! Iteration Failed !!!!!!!!\n");
223
224 return x;
225};
double df_Werner(double nu, double u, double y, double utau)
Here is the call graph for this function:

◆ sign()

double sign ( double  a)

Definition at line 227 of file wallfunction.c.

228{
229 if(a>0) return 1;
230 else if(a<0) return -1;
231 else return 0;
232}

◆ u_loglaw()

double u_loglaw ( double  y,
double  utau,
double  roughness 
)

Definition at line 235 of file wallfunction.c.

236{
237 return utau * 1./KAPPA * log( (roughness+y) / roughness ) ;
238}

◆ find_utau_loglaw()

double find_utau_loglaw ( double  u,
double  y,
double  roughness 
)

Definition at line 240 of file wallfunction.c.

241{
242 return KAPPA * u / log( (y+roughness) / roughness);
243};

◆ wall_function()

void wall_function ( UserCtx user,
double  sc,
double  sb,
Cmpnts  Ua,
Cmpnts  Uc,
Cmpnts Ub,
PetscReal *  ustar,
double  nx,
double  ny,
double  nz 
)

Definition at line 245 of file wallfunction.c.

248{
249 SimCtx *simCtx = user->simCtx;
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 );
254 //*ustar = find_utau_Cabot(1./simCtx->ren, ut_mag, sc, 0.01, 0);
255 double utau=0.05;
256 double ut_mag_modeled = u_Werner(1./simCtx->ren, sb, utau);
257 //double ut_mag_modeled = u_Cabot(1./simCtx->ren, sb, *ustar, 0);
258
259 if(ut_mag>1.e-10) {
260 ut *= ut_mag_modeled/ut_mag;
261 vt *= ut_mag_modeled/ut_mag;
262 wt *= ut_mag_modeled/ut_mag;
263 }
264 else ut=vt=wt=0;
265
266 // u = ut + (u.n)n
267 (*Ub).x = ut + sb/sc * un * nx;
268 (*Ub).y = vt + sb/sc * un * ny;
269 (*Ub).z = wt + sb/sc * un * nz;
270
271 (*Ub).x += Ua.x;
272 (*Ub).y += Ua.y;
273 (*Ub).z += Ua.z;
274}
SimCtx * simCtx
Back-pointer to the master simulation context.
Definition variables.h:633
PetscReal ren
Definition variables.h:549
The master context for the entire simulation.
Definition variables.h:513
double u_Werner(double nu, double y, double utau)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wall_function_loglaw()

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 
)

Definition at line 276 of file wallfunction.c.

279{
280 SimCtx *simCtx = user->simCtx;
281 double u_c = Uc.x - Ua.x, v_c = Uc.y - Ua.y, w_c = Uc.z - Ua.z;
282 // double ua_n= Ua.x*nx + Ua.y* ny + Ua.z* nz;
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 );
286 //*ustar = find_utau_Cabot_roughness(1./simCtx->ren, ut_mag, sc, 0.01, 0, ks);
287 *ustar = find_utau_hydset(1./simCtx->ren, ut_mag, sc, 0.001, ks);
288 //double ut_mag_modeled = u_Cabot_roughness(1./simCtx->ren, sb, *ustar, 0, ks);
289 double ut_mag_modeled = u_hydset_roughness(1./simCtx->ren, sb, *ustar, ks);
290
291 if (ut_mag_modeled<0.) {
292 // freeslip(user, sc,sb,Ua, Uc,Ub,nx,ny,nz);
293 ut_mag_modeled=ut_mag;
294 //*ustar =0.;
295 // LOG_ALLOW(LOCAL,LOG_DEBUG, "Y+>300!!!!!!!!!!!!!!! %le ",*ustar);
296 }
297
298 //PetscReal yp=sc* (*ustar)*simCtx->ren;
299 //if (yp>300) LOG_ALLOW(LOCAL,LOG_DEBUG, " Y+>300!!!!!!!!!!!!!!! %le ",yp);
300
301 if(ut_mag>1.e-10) {
302 ut *= ut_mag_modeled/ut_mag;
303 vt *= ut_mag_modeled/ut_mag;
304 wt *= ut_mag_modeled/ut_mag;
305 }
306 else ut=vt=wt=0;
307
308 // u = ut + (u.n)n
309 (*Ub).x = ut + (sb/sc * un ) * nx;
310 (*Ub).y = vt + (sb/sc * un ) * ny;
311 (*Ub).z = wt + (sb/sc * un ) * nz;
312
313 (*Ub).x += Ua.x;
314 (*Ub).y += Ua.y;
315 (*Ub).z += Ua.z;
316
317}
double u_hydset_roughness(double nu, double y, double utau, double ks)
double find_utau_hydset(double nu, double u, double y, double utau_guess, double ks)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wall_function_Cabot()

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 
)

Definition at line 319 of file wallfunction.c.

322 {
323 SimCtx *simCtx = user->simCtx;
324 double u_c = Uc.x - Ua.x, v_c = Uc.y - Ua.y, w_c = Uc.z - Ua.z;
325 // double ua_n= Ua.x*nx + Ua.y* ny + Ua.z* nz;
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;
333 dpdtn=0.0; //dpdt=0.0;
334 if (count ==0 ||count > 4){
335 find_utau_Cabot(1./simCtx->ren, ut_mag, sc, 0.01, dpdt, dpdtn, &utau , &taw1, &taw2);
336 *ustar=utau;}
337 //*ustar=0.045;
338 double ut_mag_modeled = u_Cabot(1./simCtx->ren, sb, *ustar, dpdt, taw1);
339
340 if(ut_mag>1.e-10) {
341 ut *= ut_mag_modeled/ut_mag;
342 vt *= ut_mag_modeled/ut_mag;
343 wt *= ut_mag_modeled/ut_mag;
344 }
345 else ut=vt=wt=0;
346
347 // u = ut + (u.n)n
348 (*Ub).x = ut + (sb/sc * un ) * nx;
349 (*Ub).y = vt + (sb/sc * un ) * ny;
350 (*Ub).z = wt + (sb/sc * un ) * nz;
351
352 (*Ub).x += Ua.x;
353 (*Ub).y += Ua.y;
354 (*Ub).z += Ua.z;
355
356 }
void find_utau_Cabot(double nu, double u, double y, double guess, double dpdt, double dpdtn, double *utau, double *taw1, double *taw2)
double u_Cabot(double nu, double y, double utau, double dpdt, double taw)
Here is the call graph for this function: