1 #ifndef ERF_EBMOSTStress_H
2 #define ERF_EBMOSTStress_H
27 const amrex::Array4<const amrex::Real>& zref_arr,
28 const amrex::Array4<const amrex::Real>& z0_arr,
29 const amrex::Array4<const amrex::Real>& umm_arr,
30 const amrex::Array4<const amrex::Real>& ,
31 const amrex::Array4<const amrex::Real>& ,
32 const amrex::Array4<const amrex::Real>& ,
33 const amrex::Array4<amrex::Real>& u_star_arr,
34 const amrex::Array4<amrex::Real>& ,
35 const amrex::Array4<amrex::Real>& t_star_arr,
36 const amrex::Array4<amrex::Real>& q_star_arr,
37 const amrex::Array4<amrex::Real>& ,
38 const amrex::Array4<amrex::Real>& ,
39 const amrex::Array4<amrex::Real>& olen_arr,
40 const amrex::Array4<amrex::Real>& ,
41 const amrex::Array4<amrex::Real>& ,
42 const amrex::Array4<amrex::Real>& ,
43 const amrex::Array4<amrex::Real>& )
const
46 u_star_arr(i,j,k) =
mdata.
kappa * umm_arr(i,j,0) / std::log(zref_arr(i,j,0) / z0_arr(i,j,k));
47 t_star_arr(i,j,k) =
zero;
48 q_star_arr(i,j,k) =
zero;
78 const amrex::Array4<const amrex::Real>& zref_arr,
79 const amrex::Array4<const amrex::Real>& z0_arr,
80 const amrex::Array4<const amrex::Real>& umm_arr,
81 const amrex::Array4<const amrex::Real>& tm_arr,
82 const amrex::Array4<const amrex::Real>& tvm_arr,
83 const amrex::Array4<const amrex::Real>& qvm_arr,
84 const amrex::Array4<amrex::Real>& u_star_arr,
85 const amrex::Array4<amrex::Real>& w_star_arr,
86 const amrex::Array4<amrex::Real>& t_star_arr,
87 const amrex::Array4<amrex::Real>& q_star_arr,
88 const amrex::Array4<amrex::Real>& t_surf_arr,
89 const amrex::Array4<amrex::Real>& q_surf_arr,
90 const amrex::Array4<amrex::Real>& olen_arr,
91 const amrex::Array4<amrex::Real>& pblh_arr,
92 const amrex::Array4<amrex::Real>& ,
93 const amrex::Array4<amrex::Real>& ,
94 const amrex::Array4<amrex::Real>& )
const
112 zeta = zref / olen_arr(i,j,k);
116 if (q_surf_arr(i,j,k) >
zero) {
117 qv_s = q_surf_arr(i,j,k);
121 qv_s = qvm_arr(i,j,0);
123 qv_a = qvm_arr(i,j,0);
133 -ustar *
mdata.
kappa * (qv_a - qv_s) / (C - psi_h);
135 w_star_arr(i,j,k) =
calc_wstar(tflux, pblh_arr(i,j,k), tvm_arr(i,j,0));
137 umm = std::sqrt(umm_arr(i,j,0)*umm_arr(i,j,0) + wstar*wstar);
138 umm = std::max(umm,
WSMIN);
145 ( (thv_a - thv_s) / (umm * umm) );
166 }
while ( (std::abs(zeta - zeta_old) >
tol) && (iter <= max_iters) );
167 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(iter < max_iters,
168 "Maximum number of MOST iterations reached.");
171 olen_arr(i,j,k) = zref / zeta;
172 u_star_arr(i,j,k) =
mdata.
kappa * umm / (C - psi_m);
173 t_star_arr(i,j,k) =
mdata.
kappa * (tm_arr(i,j,0) - t_surf_arr(i,j,k)) / (C - psi_h);
176 (u_star_arr(i,j,k) *
mdata.
kappa) + qvm_arr(i,j,0);
179 q_star_arr(i,j,k) =
mdata.
kappa * (qvm_arr(i,j,0) - q_surf_arr(i,j,k)) / (C - psi_h);
212 const int& max_iters,
213 const amrex::Array4<const amrex::Real>& zref_arr,
214 const amrex::Array4<const amrex::Real>& z0_arr,
215 const amrex::Array4<const amrex::Real>& umm_arr,
216 const amrex::Array4<const amrex::Real>& tm_arr,
217 const amrex::Array4<const amrex::Real>& tvm_arr,
218 const amrex::Array4<const amrex::Real>& qvm_arr,
219 const amrex::Array4<amrex::Real>& u_star_arr,
220 const amrex::Array4<amrex::Real>& w_star_arr,
221 const amrex::Array4<amrex::Real>& t_star_arr,
222 const amrex::Array4<amrex::Real>& q_star_arr,
223 const amrex::Array4<amrex::Real>& t_surf_arr,
224 const amrex::Array4<amrex::Real>& q_surf_arr,
225 const amrex::Array4<amrex::Real>& olen_arr,
226 const amrex::Array4<amrex::Real>& pblh_arr,
227 const amrex::Array4<amrex::Real>& ,
228 const amrex::Array4<amrex::Real>& ,
229 const amrex::Array4<amrex::Real>& )
const
243 u_star_arr(i,j,k) =
mdata.
kappa * umm / std::log(zref / z0_arr(i,j,k));
245 Olen = olen_arr(i,j,k);
251 ustar = u_star_arr(i,j,k);
253 -(qvm_arr(i,j,0) - q_surf_arr(i,j,k)) * ustar *
mdata.
kappa /
254 (std::log(zref / z0_arr(i,j,k)) - psi_h);
258 w_star_arr(i,j,k) =
calc_wstar(tflux, pblh_arr(i,j,k), tvm_arr(i,j,0));
260 umm = std::sqrt(umm_arr(i,j,0)*umm_arr(i,j,0) + wstar*wstar);
261 umm = std::max(umm,
WSMIN);
267 u_star_arr(i,j,k) =
mdata.
kappa * umm / (std::log(zref / z0_arr(i,j,k)) - psi_m);
269 }
while ((std::abs(u_star_arr(i,j,k) - ustar) >
tol) && iter <= max_iters);
270 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(iter < max_iters,
271 "Maximum number of MOST iterations reached.");
274 olen_arr(i,j,k) = Olen;
276 (u_star_arr(i,j,k) *
mdata.
kappa) + tm_arr(i,j,0);
280 (u_star_arr(i,j,k) *
mdata.
kappa) + qvm_arr(i,j,0);
283 q_star_arr(i,j,k) =
mdata.
kappa * (qvm_arr(i,j,0) - q_surf_arr(i,j,k)) /
284 (std::log(zref / z0_arr(i,j,k)) - psi_h);
309 const amrex::Array4<const amrex::Real>& cons_arr,
310 const amrex::Array4<const amrex::Real>& velx_arr,
311 const amrex::Array4<const amrex::Real>& vely_arr,
312 const amrex::Array4<const amrex::Real>& umm_arr,
313 const amrex::Array4<const amrex::Real>& qvm_arr,
314 const amrex::Array4<const amrex::Real>& u_star_arr,
315 const amrex::Array4<const amrex::Real>& q_star_arr,
316 const amrex::Array4<const amrex::Real>& q_surf_arr,
317 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
318 const amrex::Array4<const amrex::Real>& v_vfrac_arr)
const
324 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
326 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
327 / u_vfrac_sum :
zero;
330 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
332 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
333 / v_vfrac_sum :
zero;
340 wsp_mean = std::max(wsp_mean,
WSMIN);
348 -
rho*qstar*ustar*(num1+num2)/((qv_mean-qv_surf)*wsp_mean) :
zero;
359 const amrex::Array4<const amrex::Real>& cons_arr,
360 const amrex::Array4<const amrex::Real>& velx_arr,
361 const amrex::Array4<const amrex::Real>& vely_arr,
362 const amrex::Array4<const amrex::Real>& velz_arr,
363 const amrex::Array4<const amrex::Real>& umm_arr,
364 const amrex::Array4<const amrex::Real>& tm_arr,
365 const amrex::Array4<const amrex::Real>& u_star_arr,
366 const amrex::Array4<const amrex::Real>& t_star_arr,
367 const amrex::Array4<const amrex::Real>& t_surf_arr,
368 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
369 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
370 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
371 const amrex::Array4<const amrex::Real>& bnorm_arr)
const
377 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
379 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
380 / u_vfrac_sum :
zero;
383 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
385 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
386 / v_vfrac_sum :
zero;
389 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1);
391 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1))
392 / w_vfrac_sum :
zero;
409 wsp_mean = std::max(wsp_mean,
WSMIN);
412 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
418 -
rho*tstar*ustar*(num1+num2)/((theta_mean-theta_surf)*wsp_mean) :
zero;
429 const amrex::Array4<const amrex::Real>& cons_arr,
430 const amrex::Array4<const amrex::Real>& velx_arr,
431 const amrex::Array4<const amrex::Real>& vely_arr,
432 const amrex::Array4<const amrex::Real>& velz_arr,
433 const amrex::Array4<const amrex::Real>& umm_arr,
434 const amrex::Array4<const amrex::Real>& um_arr,
435 const amrex::Array4<const amrex::Real>& u_star_arr,
436 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
437 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
438 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
439 const amrex::Array4<const amrex::Real>& cc_vfrac_arr,
440 const amrex::Array4<const amrex::EBCellFlag>& cc_flag_arr,
441 const amrex::Array4<const amrex::Real>& bnorm_arr,
449 velx = velx_arr(i,j,k);
452 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k) +
453 v_vfrac_arr(i-1,j,k) + v_vfrac_arr(i-1,j+1,k);
454 vely = (v_vfrac_sum >
eps) ?
455 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k) +
456 vely_arr(i-1,j,k) * v_vfrac_arr(i-1,j,k) + vely_arr(i-1,j+1,k) * v_vfrac_arr(i-1,j+1,k))
457 / v_vfrac_sum :
zero;
460 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
461 w_vfrac_arr(i-1,j,k) + w_vfrac_arr(i-1,j,k+1);
463 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
464 velz_arr(i-1,j,k) * w_vfrac_arr(i-1,j,k) + velz_arr(i-1,j,k+1) * w_vfrac_arr(i-1,j,k+1))
465 / w_vfrac_sum :
zero;
474 velx_tangent = velx - v_dot_n * nx;
475 vely_tangent = vely - v_dot_n * ny;
478 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i-1,j,k) + cc_vfrac_arr(i,j,k);
479 rho = (cc_vfrac_sum >
eps) ?
480 (cons_arr(i-1,j,k,
Rho_comp) * cc_vfrac_arr(i-1,j,k) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
481 / cc_vfrac_sum :
zero;
484 bool low_valid = cc_flag_arr(i-1,j,k).isSingleValued();
485 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
487 if (low_valid && high_valid) {
488 ustar =
myhalf * (u_star_arr(i-1,j,k) + u_star_arr(i,j,k));
489 wsp_mean =
myhalf * (umm_arr(i-1,j,0) + umm_arr(i,j,0));
490 }
else if (low_valid) {
491 ustar = u_star_arr(i-1,j,k);
492 wsp_mean = umm_arr(i-1,j,0);
493 }
else if (high_valid) {
494 ustar = u_star_arr(i,j,k);
495 wsp_mean = umm_arr(i,j,0);
501 }
else if (idir == 1) {
503 vely = vely_arr(i,j,k);
506 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k) +
507 u_vfrac_arr(i,j-1,k) + u_vfrac_arr(i+1,j-1,k);
508 velx = (u_vfrac_sum >
eps) ?
509 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k) +
510 velx_arr(i,j-1,k) * u_vfrac_arr(i,j-1,k) + velx_arr(i+1,j-1,k) * u_vfrac_arr(i+1,j-1,k))
511 / u_vfrac_sum :
zero;
514 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
515 w_vfrac_arr(i,j-1,k) + w_vfrac_arr(i,j-1,k+1);
517 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
518 velz_arr(i,j-1,k) * w_vfrac_arr(i,j-1,k) + velz_arr(i,j-1,k+1) * w_vfrac_arr(i,j-1,k+1))
519 / w_vfrac_sum :
zero;
528 velx_tangent = velx - v_dot_n * nx;
529 vely_tangent = vely - v_dot_n * ny;
532 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j-1,k) + cc_vfrac_arr(i,j,k);
533 rho = (cc_vfrac_sum >
eps) ?
534 (cons_arr(i,j-1,k,
Rho_comp) * cc_vfrac_arr(i,j-1,k) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
535 / cc_vfrac_sum :
zero;
538 bool low_valid = cc_flag_arr(i,j-1,k).isSingleValued();
539 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
541 if (low_valid && high_valid) {
542 ustar =
myhalf * (u_star_arr(i,j-1,k) + u_star_arr(i,j,k));
543 wsp_mean =
myhalf * (umm_arr(i,j-1,0) + umm_arr(i,j,0));
544 }
else if (low_valid) {
545 ustar = u_star_arr(i,j-1,k);
546 wsp_mean = umm_arr(i,j-1,0);
547 }
else if (high_valid) {
548 ustar = u_star_arr(i,j,k);
549 wsp_mean = umm_arr(i,j,0);
558 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k-1) + u_vfrac_arr(i+1,j,k-1) +
559 u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
560 velx = (u_vfrac_sum >
eps) ?
561 (velx_arr(i,j,k-1) * u_vfrac_arr(i,j,k-1) + velx_arr(i+1,j,k-1) * u_vfrac_arr(i+1,j,k-1) +
562 velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
563 / u_vfrac_sum :
zero;
566 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k-1) + v_vfrac_arr(i,j+1,k-1) +
567 v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
568 vely = (v_vfrac_sum >
eps) ?
569 (vely_arr(i,j,k-1) * v_vfrac_arr(i,j,k-1) + vely_arr(i,j+1,k-1) * v_vfrac_arr(i,j+1,k-1) +
570 vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
571 / v_vfrac_sum :
zero;
583 velx_tangent = velx - v_dot_n * nx;
584 vely_tangent = vely - v_dot_n * ny;
587 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j,k-1) + cc_vfrac_arr(i,j,k);
588 rho = (cc_vfrac_sum >
eps) ?
589 (cons_arr(i,j,k-1,
Rho_comp) * cc_vfrac_arr(i,j,k-1) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
590 / cc_vfrac_sum :
zero;
593 bool low_valid = cc_flag_arr(i,j,k-1).isSingleValued();
594 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
596 if (low_valid && high_valid) {
597 ustar =
myhalf * (u_star_arr(i,j,k-1) + u_star_arr(i,j,k));
598 wsp_mean =
myhalf * (umm_arr(i,j,0) + umm_arr(i,j,0));
599 }
else if (low_valid) {
600 ustar = u_star_arr(i,j,k-1);
601 wsp_mean = umm_arr(i,j,0);
602 }
else if (high_valid) {
603 ustar = u_star_arr(i,j,k);
604 wsp_mean = umm_arr(i,j,0);
611 wsp_mean = std::max(wsp_mean,
WSMIN);
618 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
620 amrex::Real num2 = wsp_mean * (velx_tangent-umean);
623 amrex::Real stressx = -
rho*ustar*ustar * (num1+num2)/(wsp_mean*wsp_mean);
634 const amrex::Array4<const amrex::Real>& cons_arr,
635 const amrex::Array4<const amrex::Real>& velx_arr,
636 const amrex::Array4<const amrex::Real>& vely_arr,
637 const amrex::Array4<const amrex::Real>& velz_arr,
638 const amrex::Array4<const amrex::Real>& umm_arr,
639 const amrex::Array4<const amrex::Real>& vm_arr,
640 const amrex::Array4<const amrex::Real>& u_star_arr,
641 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
642 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
643 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
644 const amrex::Array4<const amrex::Real>& cc_vfrac_arr,
645 const amrex::Array4<const amrex::EBCellFlag>& cc_flag_arr,
646 const amrex::Array4<const amrex::Real>& bnorm_arr,
655 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k) +
656 v_vfrac_arr(i-1,j,k) + v_vfrac_arr(i-1,j+1,k);
657 vely = (v_vfrac_sum >
eps) ?
658 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k) +
659 vely_arr(i-1,j,k) * v_vfrac_arr(i-1,j,k) + vely_arr(i-1,j+1,k) * v_vfrac_arr(i-1,j+1,k))
660 / v_vfrac_sum :
zero;
662 velx = velx_arr(i,j,k);
665 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
666 w_vfrac_arr(i-1,j,k) + w_vfrac_arr(i-1,j,k+1);
668 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
669 velz_arr(i-1,j,k) * w_vfrac_arr(i-1,j,k) + velz_arr(i-1,j,k+1) * w_vfrac_arr(i-1,j,k+1))
670 / w_vfrac_sum :
zero;
679 velx_tangent = velx - v_dot_n * nx;
680 vely_tangent = vely - v_dot_n * ny;
683 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i-1,j,k) + cc_vfrac_arr(i,j,k);
684 rho = (cc_vfrac_sum >
eps) ?
685 (cons_arr(i-1,j,k,
Rho_comp) * cc_vfrac_arr(i-1,j,k) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
686 / cc_vfrac_sum :
zero;
689 bool low_valid = cc_flag_arr(i-1,j,k).isSingleValued();
690 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
692 if (low_valid && high_valid) {
693 ustar =
myhalf * (u_star_arr(i-1,j,k) + u_star_arr(i,j,k));
694 wsp_mean =
myhalf * (umm_arr(i-1,j,0) + umm_arr(i,j,0));
695 }
else if (low_valid) {
696 ustar = u_star_arr(i-1,j,k);
697 wsp_mean = umm_arr(i-1,j,0);
698 }
else if (high_valid) {
699 ustar = u_star_arr(i,j,k);
700 wsp_mean = umm_arr(i,j,0);
706 }
else if (idir == 1) {
709 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k) +
710 u_vfrac_arr(i,j-1,k) + u_vfrac_arr(i+1,j-1,k);
711 velx = (u_vfrac_sum >
eps) ?
712 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k) +
713 velx_arr(i,j-1,k) * u_vfrac_arr(i,j-1,k) + velx_arr(i+1,j-1,k) * u_vfrac_arr(i+1,j-1,k))
714 / u_vfrac_sum :
zero;
716 vely = vely_arr(i,j,k);
719 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
720 w_vfrac_arr(i,j-1,k) + w_vfrac_arr(i,j-1,k+1);
722 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
723 velz_arr(i,j-1,k) * w_vfrac_arr(i,j-1,k) + velz_arr(i,j-1,k+1) * w_vfrac_arr(i,j-1,k+1))
724 / w_vfrac_sum :
zero;
733 velx_tangent = velx - v_dot_n * nx;
734 vely_tangent = vely - v_dot_n * ny;
737 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j-1,k) + cc_vfrac_arr(i,j,k);
738 rho = (cc_vfrac_sum >
eps) ?
739 (cons_arr(i,j-1,k,
Rho_comp) * cc_vfrac_arr(i,j-1,k) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
740 / cc_vfrac_sum :
zero;
743 bool low_valid = cc_flag_arr(i,j-1,k).isSingleValued();
744 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
746 if (low_valid && high_valid) {
747 ustar =
myhalf * (u_star_arr(i,j-1,k) + u_star_arr(i,j,k));
748 wsp_mean =
myhalf * (umm_arr(i,j-1,0) + umm_arr(i,j,0));
749 }
else if (low_valid) {
750 ustar = u_star_arr(i,j-1,k);
751 wsp_mean = umm_arr(i,j-1,0);
752 }
else if (high_valid) {
753 ustar = u_star_arr(i,j,k);
754 wsp_mean = umm_arr(i,j,0);
763 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k-1) + u_vfrac_arr(i+1,j,k-1) +
764 u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
765 velx = (u_vfrac_sum >
eps) ?
766 (velx_arr(i,j,k-1) * u_vfrac_arr(i,j,k-1) + velx_arr(i+1,j,k-1) * u_vfrac_arr(i+1,j,k-1) +
767 velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
768 / u_vfrac_sum :
zero;
771 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k-1) + v_vfrac_arr(i,j+1,k-1) +
772 v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
773 vely = (v_vfrac_sum >
eps) ?
774 (vely_arr(i,j,k-1) * v_vfrac_arr(i,j,k-1) + vely_arr(i,j+1,k-1) * v_vfrac_arr(i,j+1,k-1) +
775 vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
776 / v_vfrac_sum :
zero;
788 velx_tangent = velx - v_dot_n * nx;
789 vely_tangent = vely - v_dot_n * ny;
792 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j,k-1) + cc_vfrac_arr(i,j,k);
793 rho = (cc_vfrac_sum >
eps) ?
794 (cons_arr(i,j,k-1,
Rho_comp) * cc_vfrac_arr(i,j,k-1) + cons_arr(i,j,k,
Rho_comp) * cc_vfrac_arr(i,j,k))
795 / cc_vfrac_sum :
zero;
798 bool low_valid = cc_flag_arr(i,j,k-1).isSingleValued();
799 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
801 if (low_valid && high_valid) {
802 ustar =
myhalf * (u_star_arr(i,j,k-1) + u_star_arr(i,j,k));
803 wsp_mean =
myhalf * (umm_arr(i,j,0) + umm_arr(i,j,0));
804 }
else if (low_valid) {
805 ustar = u_star_arr(i,j,k-1);
806 wsp_mean = umm_arr(i,j,0);
807 }
else if (high_valid) {
808 ustar = u_star_arr(i,j,k);
809 wsp_mean = umm_arr(i,j,0);
816 wsp_mean = std::max(wsp_mean,
WSMIN);
823 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
825 amrex::Real num2 = wsp_mean * (vely_tangent-vmean);
828 amrex::Real stressy = -
rho*ustar*ustar * (num1+num2)/(wsp_mean*wsp_mean);
834 #ifdef AMREX_USE_FLOAT
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:26
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
@ num
Definition: ERF_DataStruct.H:24
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:8
rho
Definition: ERF_InitCustomPert_Bubble.H:106
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_wstar(const amrex::Real &ust, const amrex::Real &tst, const amrex::Real &qst, const amrex::Real &pblh, const amrex::Real &th, const amrex::Real &thv, const amrex::Real &qv=amrex::Real(0))
Definition: ERF_Wstar.H:13
@ theta
Definition: ERF_MM5.H:20
@ qv
Definition: ERF_Kessler.H:29
@ den
Definition: ERF_AdvanceWSM6.cpp:109
Definition: ERF_EBMOSTStress.H:12
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void iterate_flux(const int &i, const int &j, const int &k, const int &, const amrex::Array4< const amrex::Real > &zref_arr, const amrex::Array4< const amrex::Real > &z0_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &, const amrex::Array4< const amrex::Real > &, const amrex::Array4< const amrex::Real > &, const amrex::Array4< amrex::Real > &u_star_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &t_star_arr, const amrex::Array4< amrex::Real > &q_star_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &olen_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &) const
Definition: ERF_EBMOSTStress.H:23
adiabatic_eb(amrex::Real Tflux, amrex::Real Qvflux)
Definition: ERF_EBMOSTStress.H:13
most_data mdata
Definition: ERF_EBMOSTStress.H:52
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:53
Definition: ERF_EBMOSTStress.H:300
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_u_flux(int i, int j, int k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &velz_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &um_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &u_vfrac_arr, const amrex::Array4< const amrex::Real > &v_vfrac_arr, const amrex::Array4< const amrex::Real > &w_vfrac_arr, const amrex::Array4< const amrex::Real > &cc_vfrac_arr, const amrex::Array4< const amrex::EBCellFlag > &cc_flag_arr, const amrex::Array4< const amrex::Real > &bnorm_arr, int idir=0) const
Definition: ERF_EBMOSTStress.H:426
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:839
moeng_flux_eb()
Definition: ERF_EBMOSTStress.H:301
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_t_flux(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &velz_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &tm_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &t_star_arr, const amrex::Array4< const amrex::Real > &t_surf_arr, const amrex::Array4< const amrex::Real > &u_vfrac_arr, const amrex::Array4< const amrex::Real > &v_vfrac_arr, const amrex::Array4< const amrex::Real > &w_vfrac_arr, const amrex::Array4< const amrex::Real > &bnorm_arr) const
Definition: ERF_EBMOSTStress.H:356
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_v_flux(int i, int j, int k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &velz_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &vm_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &u_vfrac_arr, const amrex::Array4< const amrex::Real > &v_vfrac_arr, const amrex::Array4< const amrex::Real > &w_vfrac_arr, const amrex::Array4< const amrex::Real > &cc_vfrac_arr, const amrex::Array4< const amrex::EBCellFlag > &cc_flag_arr, const amrex::Array4< const amrex::Real > &bnorm_arr, int idir=0) const
Definition: ERF_EBMOSTStress.H:631
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_q_flux(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &qvm_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &q_star_arr, const amrex::Array4< const amrex::Real > &q_surf_arr, const amrex::Array4< const amrex::Real > &u_vfrac_arr, const amrex::Array4< const amrex::Real > &v_vfrac_arr) const
Definition: ERF_EBMOSTStress.H:306
const amrex::Real eps
Definition: ERF_EBMOSTStress.H:837
Definition: ERF_MOSTStress.H:13
amrex::Real surf_moist_flux
Moisture flux.
Definition: ERF_MOSTStress.H:19
amrex::Real kappa
von Karman constant
Definition: ERF_MOSTStress.H:16
amrex::Real gravity
Acceleration due to gravity (m/s^2)
Definition: ERF_MOSTStress.H:17
const amrex::Real Bjr_beta
Definition: ERF_MOSTStress.H:32
amrex::Real surf_temp_flux
Heat flux TODO: decide whether this is <θ'w'> or <θv'w'> under moist conditions.
Definition: ERF_MOSTStress.H:18
Definition: ERF_MOSTStress.H:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_m(amrex::Real zeta) const
Definition: ERF_MOSTStress.H:90
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_h2(amrex::Real zeta) const
Definition: ERF_MOSTStress.H:67
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_h(amrex::Real zeta) const
Definition: ERF_MOSTStress.H:104
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_m2(amrex::Real zeta) const
Definition: ERF_MOSTStress.H:47
Definition: ERF_EBMOSTStress.H:196
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:293
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:291
const amrex::Real tol
Definition: ERF_EBMOSTStress.H:292
most_data mdata
Definition: ERF_EBMOSTStress.H:289
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void iterate_flux(const int &i, const int &j, const int &k, const int &max_iters, const amrex::Array4< const amrex::Real > &zref_arr, const amrex::Array4< const amrex::Real > &z0_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &tm_arr, const amrex::Array4< const amrex::Real > &tvm_arr, const amrex::Array4< const amrex::Real > &qvm_arr, const amrex::Array4< amrex::Real > &u_star_arr, const amrex::Array4< amrex::Real > &w_star_arr, const amrex::Array4< amrex::Real > &t_star_arr, const amrex::Array4< amrex::Real > &q_star_arr, const amrex::Array4< amrex::Real > &t_surf_arr, const amrex::Array4< amrex::Real > &q_surf_arr, const amrex::Array4< amrex::Real > &olen_arr, const amrex::Array4< amrex::Real > &pblh_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &) const
Definition: ERF_EBMOSTStress.H:209
bool spec_qflux
Definition: ERF_EBMOSTStress.H:290
surface_flux_eb(amrex::Real Tflux, amrex::Real Qvflux, bool cons_qflux)
Definition: ERF_EBMOSTStress.H:197
Definition: ERF_EBMOSTStress.H:61
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void iterate_flux(const int &i, const int &j, const int &k, const int &max_iters, const amrex::Array4< const amrex::Real > &zref_arr, const amrex::Array4< const amrex::Real > &z0_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &tm_arr, const amrex::Array4< const amrex::Real > &tvm_arr, const amrex::Array4< const amrex::Real > &qvm_arr, const amrex::Array4< amrex::Real > &u_star_arr, const amrex::Array4< amrex::Real > &w_star_arr, const amrex::Array4< amrex::Real > &t_star_arr, const amrex::Array4< amrex::Real > &q_star_arr, const amrex::Array4< amrex::Real > &t_surf_arr, const amrex::Array4< amrex::Real > &q_surf_arr, const amrex::Array4< amrex::Real > &olen_arr, const amrex::Array4< amrex::Real > &pblh_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &) const
Definition: ERF_EBMOSTStress.H:74
const amrex::Real tol
Definition: ERF_EBMOSTStress.H:187
const amrex::Real alpha
Definition: ERF_EBMOSTStress.H:188
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:189
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:186
surface_temp_eb(amrex::Real Tflux, amrex::Real Qvflux, bool cons_qflux)
Definition: ERF_EBMOSTStress.H:62
bool spec_qflux
Definition: ERF_EBMOSTStress.H:185
most_data mdata
Definition: ERF_EBMOSTStress.H:184