5 #ifndef ERF_EBMOSTStress_H
6 #define ERF_EBMOSTStress_H
35 const amrex::Array4<const amrex::Real>& zref_arr,
36 const amrex::Array4<const amrex::Real>& z0_arr,
37 const amrex::Array4<const amrex::Real>& umm_arr,
38 const amrex::Array4<const amrex::Real>& ,
39 const amrex::Array4<const amrex::Real>& ,
40 const amrex::Array4<const amrex::Real>& ,
41 const amrex::Array4<amrex::Real>& u_star_arr,
42 const amrex::Array4<amrex::Real>& ,
43 const amrex::Array4<amrex::Real>& t_star_arr,
44 const amrex::Array4<amrex::Real>& q_star_arr,
45 const amrex::Array4<amrex::Real>& ,
46 const amrex::Array4<amrex::Real>& ,
47 const amrex::Array4<amrex::Real>& olen_arr,
48 const amrex::Array4<amrex::Real>& ,
49 const amrex::Array4<amrex::Real>& ,
50 const amrex::Array4<amrex::Real>& ,
51 const amrex::Array4<amrex::Real>& )
const
54 u_star_arr(i,j,k) =
mdata.
kappa * umm_arr(i,j,0) /
56 t_star_arr(i,j,k) =
zero;
57 q_star_arr(i,j,k) =
zero;
92 const amrex::Array4<const amrex::Real>& zref_arr,
93 const amrex::Array4<const amrex::Real>& z0_arr,
94 const amrex::Array4<const amrex::Real>& umm_arr,
95 const amrex::Array4<const amrex::Real>& tm_arr,
96 const amrex::Array4<const amrex::Real>& tvm_arr,
97 const amrex::Array4<const amrex::Real>& qvm_arr,
98 const amrex::Array4<amrex::Real>& u_star_arr,
99 const amrex::Array4<amrex::Real>& w_star_arr,
100 const amrex::Array4<amrex::Real>& t_star_arr,
101 const amrex::Array4<amrex::Real>& q_star_arr,
102 const amrex::Array4<amrex::Real>& t_surf_arr,
103 const amrex::Array4<amrex::Real>& q_surf_arr,
104 const amrex::Array4<amrex::Real>& olen_arr,
105 const amrex::Array4<amrex::Real>& pblh_arr,
106 const amrex::Array4<amrex::Real>& ,
107 const amrex::Array4<amrex::Real>& ,
108 const amrex::Array4<amrex::Real>& )
const
126 zeta = zref / olen_arr(i,j,k);
130 if (q_surf_arr(i,j,k) >
zero) {
131 qv_s = q_surf_arr(i,j,k);
135 qv_s = qvm_arr(i,j,0);
137 qv_a = qvm_arr(i,j,0);
149 w_star_arr(i,j,k) =
calc_wstar(tflux, pblh_arr(i,j,k), tvm_arr(i,j,0));
151 umm = std::sqrt(umm_arr(i,j,0)*umm_arr(i,j,0) + wstar*wstar);
152 umm = std::max(umm,
WSMIN);
159 ( (thv_a - thv_s) / (umm * umm) );
178 zeta = (
one -
alpha) * zeta_old +
alpha * Rib * CmPsim * CmPsim / CmPsih;
181 }
while ( (std::abs(zeta - zeta_old) >
tol) && (iter <= max_iters) );
182 if (iter > max_iters ||
192 olen_arr(i,j,k) = zref / zeta;
193 u_star_arr(i,j,k) =
mdata.
kappa * umm / CmPsim;
194 t_star_arr(i,j,k) =
mdata.
kappa * (tm_arr(i,j,0) - t_surf_arr(i,j,k)) / CmPsih;
197 (u_star_arr(i,j,k) *
mdata.
kappa) + qvm_arr(i,j,0);
200 q_star_arr(i,j,k) =
mdata.
kappa * (qvm_arr(i,j,0) - q_surf_arr(i,j,k)) / CmPsih;
238 const int& max_iters,
239 const amrex::Array4<const amrex::Real>& zref_arr,
240 const amrex::Array4<const amrex::Real>& z0_arr,
241 const amrex::Array4<const amrex::Real>& umm_arr,
242 const amrex::Array4<const amrex::Real>& tm_arr,
243 const amrex::Array4<const amrex::Real>& tvm_arr,
244 const amrex::Array4<const amrex::Real>& qvm_arr,
245 const amrex::Array4<amrex::Real>& u_star_arr,
246 const amrex::Array4<amrex::Real>& w_star_arr,
247 const amrex::Array4<amrex::Real>& t_star_arr,
248 const amrex::Array4<amrex::Real>& q_star_arr,
249 const amrex::Array4<amrex::Real>& t_surf_arr,
250 const amrex::Array4<amrex::Real>& q_surf_arr,
251 const amrex::Array4<amrex::Real>& olen_arr,
252 const amrex::Array4<amrex::Real>& pblh_arr,
253 const amrex::Array4<amrex::Real>& ,
254 const amrex::Array4<amrex::Real>& ,
255 const amrex::Array4<amrex::Real>& )
const
269 bool at_fold =
false;
274 Olen = olen_arr(i,j,k);
281 ustar = u_star_arr(i,j,k);
288 w_star_arr(i,j,k) =
calc_wstar(tflux, pblh_arr(i,j,k), tvm_arr(i,j,0));
290 umm = std::sqrt(umm_arr(i,j,0)*umm_arr(i,j,0) + wstar*wstar);
291 umm = std::max(umm,
WSMIN);
303 u_star_arr(i,j,k) = accel.
update(u_star_arr(i,j,k), iter);
307 "Maximum number of MOST iterations reached.");
310 most_flux_outputs(
mdata,
spec_qflux, at_fold, zeta_fold, C, psi_h, u_star_arr(i,j,k), zref,
311 tm_arr(i,j,0), tvm_arr(i,j,0), qvm_arr(i,j,0), qflux, Olen,
312 t_surf_arr(i,j,k), t_star_arr(i,j,k), q_surf_arr(i,j,k), q_star_arr(i,j,k));
313 olen_arr(i,j,k) = Olen;
338 const amrex::Array4<const amrex::Real>& cons_arr,
339 const amrex::Array4<const amrex::Real>& velx_arr,
340 const amrex::Array4<const amrex::Real>& vely_arr,
341 const amrex::Array4<const amrex::Real>& umm_arr,
342 const amrex::Array4<const amrex::Real>& qvm_arr,
343 const amrex::Array4<const amrex::Real>& u_star_arr,
344 const amrex::Array4<const amrex::Real>& q_star_arr,
345 const amrex::Array4<const amrex::Real>& q_surf_arr,
346 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
347 const amrex::Array4<const amrex::Real>& v_vfrac_arr)
const
353 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
355 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
356 / u_vfrac_sum :
zero;
359 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
361 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
362 / v_vfrac_sum :
zero;
369 wsp_mean = std::max(wsp_mean,
WSMIN);
389 const amrex::Array4<const amrex::Real>& cons_arr,
390 const amrex::Array4<const amrex::Real>& velx_arr,
391 const amrex::Array4<const amrex::Real>& vely_arr,
392 const amrex::Array4<const amrex::Real>& velz_arr,
393 const amrex::Array4<const amrex::Real>& umm_arr,
394 const amrex::Array4<const amrex::Real>& tm_arr,
395 const amrex::Array4<const amrex::Real>& u_star_arr,
396 const amrex::Array4<const amrex::Real>& t_star_arr,
397 const amrex::Array4<const amrex::Real>& t_surf_arr,
398 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
399 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
400 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
401 const amrex::Array4<const amrex::Real>& bnorm_arr)
const
407 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
409 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
410 / u_vfrac_sum :
zero;
413 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
415 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
416 / v_vfrac_sum :
zero;
419 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1);
421 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1))
422 / w_vfrac_sum :
zero;
439 wsp_mean = std::max(wsp_mean,
WSMIN);
442 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
460 const amrex::Array4<const amrex::Real>& cons_arr,
461 const amrex::Array4<const amrex::Real>& velx_arr,
462 const amrex::Array4<const amrex::Real>& vely_arr,
463 const amrex::Array4<const amrex::Real>& velz_arr,
464 const amrex::Array4<const amrex::Real>& umm_arr,
465 const amrex::Array4<const amrex::Real>& um_arr,
466 const amrex::Array4<const amrex::Real>& u_star_arr,
467 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
468 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
469 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
470 const amrex::Array4<const amrex::Real>& cc_vfrac_arr,
471 const amrex::Array4<const amrex::EBCellFlag>& cc_flag_arr,
472 const amrex::Array4<const amrex::Real>& bnorm_arr,
480 velx = velx_arr(i,j,k);
483 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k) +
484 v_vfrac_arr(i-1,j,k) + v_vfrac_arr(i-1,j+1,k);
485 vely = (v_vfrac_sum >
eps) ?
486 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k) +
487 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))
488 / v_vfrac_sum :
zero;
491 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
492 w_vfrac_arr(i-1,j,k) + w_vfrac_arr(i-1,j,k+1);
494 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
495 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))
496 / w_vfrac_sum :
zero;
505 velx_tangent = velx - v_dot_n *
nx;
506 vely_tangent = vely - v_dot_n *
ny;
509 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i-1,j,k) + cc_vfrac_arr(i,j,k);
510 rho = (cc_vfrac_sum >
eps) ?
511 (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))
512 / cc_vfrac_sum :
zero;
515 bool low_valid = cc_flag_arr(i-1,j,k).isSingleValued();
516 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
518 if (low_valid && high_valid) {
519 ustar =
myhalf * (u_star_arr(i-1,j,k) + u_star_arr(i,j,k));
520 wsp_mean =
myhalf * (umm_arr(i-1,j,0) + umm_arr(i,j,0));
521 }
else if (low_valid) {
522 ustar = u_star_arr(i-1,j,k);
523 wsp_mean = umm_arr(i-1,j,0);
524 }
else if (high_valid) {
525 ustar = u_star_arr(i,j,k);
526 wsp_mean = umm_arr(i,j,0);
532 }
else if (idir == 1) {
534 vely = vely_arr(i,j,k);
537 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k) +
538 u_vfrac_arr(i,j-1,k) + u_vfrac_arr(i+1,j-1,k);
539 velx = (u_vfrac_sum >
eps) ?
540 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k) +
541 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))
542 / u_vfrac_sum :
zero;
545 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
546 w_vfrac_arr(i,j-1,k) + w_vfrac_arr(i,j-1,k+1);
548 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
549 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))
550 / w_vfrac_sum :
zero;
559 velx_tangent = velx - v_dot_n *
nx;
560 vely_tangent = vely - v_dot_n *
ny;
563 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j-1,k) + cc_vfrac_arr(i,j,k);
564 rho = (cc_vfrac_sum >
eps) ?
565 (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))
566 / cc_vfrac_sum :
zero;
569 bool low_valid = cc_flag_arr(i,j-1,k).isSingleValued();
570 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
572 if (low_valid && high_valid) {
573 ustar =
myhalf * (u_star_arr(i,j-1,k) + u_star_arr(i,j,k));
574 wsp_mean =
myhalf * (umm_arr(i,j-1,0) + umm_arr(i,j,0));
575 }
else if (low_valid) {
576 ustar = u_star_arr(i,j-1,k);
577 wsp_mean = umm_arr(i,j-1,0);
578 }
else if (high_valid) {
579 ustar = u_star_arr(i,j,k);
580 wsp_mean = umm_arr(i,j,0);
589 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k-1) + u_vfrac_arr(i+1,j,k-1) +
590 u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
591 velx = (u_vfrac_sum >
eps) ?
592 (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) +
593 velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
594 / u_vfrac_sum :
zero;
597 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k-1) + v_vfrac_arr(i,j+1,k-1) +
598 v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
599 vely = (v_vfrac_sum >
eps) ?
600 (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) +
601 vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
602 / v_vfrac_sum :
zero;
614 velx_tangent = velx - v_dot_n *
nx;
615 vely_tangent = vely - v_dot_n *
ny;
618 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j,k-1) + cc_vfrac_arr(i,j,k);
619 rho = (cc_vfrac_sum >
eps) ?
620 (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))
621 / cc_vfrac_sum :
zero;
624 bool low_valid = cc_flag_arr(i,j,k-1).isSingleValued();
625 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
627 if (low_valid && high_valid) {
628 ustar =
myhalf * (u_star_arr(i,j,k-1) + u_star_arr(i,j,k));
629 wsp_mean =
myhalf * (umm_arr(i,j,0) + umm_arr(i,j,0));
630 }
else if (low_valid) {
631 ustar = u_star_arr(i,j,k-1);
632 wsp_mean = umm_arr(i,j,0);
633 }
else if (high_valid) {
634 ustar = u_star_arr(i,j,k);
635 wsp_mean = umm_arr(i,j,0);
642 wsp_mean = std::max(wsp_mean,
WSMIN);
649 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
651 amrex::Real num2 = wsp_mean * (velx_tangent-umean);
666 const amrex::Array4<const amrex::Real>& cons_arr,
667 const amrex::Array4<const amrex::Real>& velx_arr,
668 const amrex::Array4<const amrex::Real>& vely_arr,
669 const amrex::Array4<const amrex::Real>& velz_arr,
670 const amrex::Array4<const amrex::Real>& umm_arr,
671 const amrex::Array4<const amrex::Real>& vm_arr,
672 const amrex::Array4<const amrex::Real>& u_star_arr,
673 const amrex::Array4<const amrex::Real>& u_vfrac_arr,
674 const amrex::Array4<const amrex::Real>& v_vfrac_arr,
675 const amrex::Array4<const amrex::Real>& w_vfrac_arr,
676 const amrex::Array4<const amrex::Real>& cc_vfrac_arr,
677 const amrex::Array4<const amrex::EBCellFlag>& cc_flag_arr,
678 const amrex::Array4<const amrex::Real>& bnorm_arr,
687 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k) +
688 v_vfrac_arr(i-1,j,k) + v_vfrac_arr(i-1,j+1,k);
689 vely = (v_vfrac_sum >
eps) ?
690 (vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k) +
691 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))
692 / v_vfrac_sum :
zero;
694 velx = velx_arr(i,j,k);
697 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
698 w_vfrac_arr(i-1,j,k) + w_vfrac_arr(i-1,j,k+1);
700 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
701 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))
702 / w_vfrac_sum :
zero;
711 velx_tangent = velx - v_dot_n *
nx;
712 vely_tangent = vely - v_dot_n *
ny;
715 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i-1,j,k) + cc_vfrac_arr(i,j,k);
716 rho = (cc_vfrac_sum >
eps) ?
717 (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))
718 / cc_vfrac_sum :
zero;
721 bool low_valid = cc_flag_arr(i-1,j,k).isSingleValued();
722 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
724 if (low_valid && high_valid) {
725 ustar =
myhalf * (u_star_arr(i-1,j,k) + u_star_arr(i,j,k));
726 wsp_mean =
myhalf * (umm_arr(i-1,j,0) + umm_arr(i,j,0));
727 }
else if (low_valid) {
728 ustar = u_star_arr(i-1,j,k);
729 wsp_mean = umm_arr(i-1,j,0);
730 }
else if (high_valid) {
731 ustar = u_star_arr(i,j,k);
732 wsp_mean = umm_arr(i,j,0);
738 }
else if (idir == 1) {
741 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k) +
742 u_vfrac_arr(i,j-1,k) + u_vfrac_arr(i+1,j-1,k);
743 velx = (u_vfrac_sum >
eps) ?
744 (velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k) +
745 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))
746 / u_vfrac_sum :
zero;
748 vely = vely_arr(i,j,k);
751 amrex::Real w_vfrac_sum = w_vfrac_arr(i,j,k) + w_vfrac_arr(i,j,k+1) +
752 w_vfrac_arr(i,j-1,k) + w_vfrac_arr(i,j-1,k+1);
754 (velz_arr(i,j,k) * w_vfrac_arr(i,j,k) + velz_arr(i,j,k+1) * w_vfrac_arr(i,j,k+1) +
755 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))
756 / w_vfrac_sum :
zero;
765 velx_tangent = velx - v_dot_n *
nx;
766 vely_tangent = vely - v_dot_n *
ny;
769 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j-1,k) + cc_vfrac_arr(i,j,k);
770 rho = (cc_vfrac_sum >
eps) ?
771 (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))
772 / cc_vfrac_sum :
zero;
775 bool low_valid = cc_flag_arr(i,j-1,k).isSingleValued();
776 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
778 if (low_valid && high_valid) {
779 ustar =
myhalf * (u_star_arr(i,j-1,k) + u_star_arr(i,j,k));
780 wsp_mean =
myhalf * (umm_arr(i,j-1,0) + umm_arr(i,j,0));
781 }
else if (low_valid) {
782 ustar = u_star_arr(i,j-1,k);
783 wsp_mean = umm_arr(i,j-1,0);
784 }
else if (high_valid) {
785 ustar = u_star_arr(i,j,k);
786 wsp_mean = umm_arr(i,j,0);
795 amrex::Real u_vfrac_sum = u_vfrac_arr(i,j,k-1) + u_vfrac_arr(i+1,j,k-1) +
796 u_vfrac_arr(i,j,k) + u_vfrac_arr(i+1,j,k);
797 velx = (u_vfrac_sum >
eps) ?
798 (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) +
799 velx_arr(i,j,k) * u_vfrac_arr(i,j,k) + velx_arr(i+1,j,k) * u_vfrac_arr(i+1,j,k))
800 / u_vfrac_sum :
zero;
803 amrex::Real v_vfrac_sum = v_vfrac_arr(i,j,k-1) + v_vfrac_arr(i,j+1,k-1) +
804 v_vfrac_arr(i,j,k) + v_vfrac_arr(i,j+1,k);
805 vely = (v_vfrac_sum >
eps) ?
806 (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) +
807 vely_arr(i,j,k) * v_vfrac_arr(i,j,k) + vely_arr(i,j+1,k) * v_vfrac_arr(i,j+1,k))
808 / v_vfrac_sum :
zero;
820 velx_tangent = velx - v_dot_n *
nx;
821 vely_tangent = vely - v_dot_n *
ny;
824 amrex::Real cc_vfrac_sum = cc_vfrac_arr(i,j,k-1) + cc_vfrac_arr(i,j,k);
825 rho = (cc_vfrac_sum >
eps) ?
826 (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))
827 / cc_vfrac_sum :
zero;
830 bool low_valid = cc_flag_arr(i,j,k-1).isSingleValued();
831 bool high_valid = cc_flag_arr(i,j,k).isSingleValued();
833 if (low_valid && high_valid) {
834 ustar =
myhalf * (u_star_arr(i,j,k-1) + u_star_arr(i,j,k));
835 wsp_mean =
myhalf * (umm_arr(i,j,0) + umm_arr(i,j,0));
836 }
else if (low_valid) {
837 ustar = u_star_arr(i,j,k-1);
838 wsp_mean = umm_arr(i,j,0);
839 }
else if (high_valid) {
840 ustar = u_star_arr(i,j,k);
841 wsp_mean = umm_arr(i,j,0);
848 wsp_mean = std::max(wsp_mean,
WSMIN);
855 amrex::Real wsp = std::sqrt(velx_tangent*velx_tangent+vely_tangent*vely_tangent);
857 amrex::Real num2 = wsp_mean * (vely_tangent-vmean);
866 #ifdef AMREX_USE_FLOAT
constexpr amrex::Real epsv
Definition: ERF_Constants.H:56
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:19
#define Rho_comp
Definition: ERF_IndexDefines.H:53
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:54
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:66
const int nx
Definition: ERF_InitCustomPertVels_CloudChamber.H:14
const int ny
Definition: ERF_InitCustomPertVels_CloudChamber.H:15
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:12
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real most_rib_zeta_bracketed(const similarity_funs &sfuns, amrex::Real C, amrex::Real Rib, amrex::Real zeta0, amrex::Real tol)
Definition: ERF_MOSTUtils.H:330
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real most_bracket(amrex::Real C, amrex::Real psi)
Definition: ERF_MOSTUtils.H:255
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void most_flux_outputs(const most_data &mdata, bool spec_qflux, bool at_fold, amrex::Real zeta_fold, amrex::Real C, amrex::Real psi_h, amrex::Real ustar, amrex::Real zref, amrex::Real tm, amrex::Real tvm, amrex::Real qvm, amrex::Real qflux, amrex::Real &olen, amrex::Real &t_surf, amrex::Real &t_star, amrex::Real &q_surf, amrex::Real &q_star)
Definition: ERF_MOSTUtils.H:492
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool most_rib_zeta_is_root(const similarity_funs &sfuns, amrex::Real C, amrex::Real Rib, amrex::Real zeta, amrex::Real delta)
Definition: ERF_MOSTUtils.H:300
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real most_clamp_zeta(amrex::Real zeta, amrex::Real zeta_fold, bool &at_fold)
Definition: ERF_MOSTUtils.H:396
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_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:27
@ ustar
Definition: ERF_SLM.H:28
@ qstar
Definition: ERF_SLM.H:30
@ tstar
Definition: ERF_SLM.H:29
@ rho
Definition: ERF_Kessler.H:25
@ theta
Definition: ERF_Kessler.H:26
@ qv
Definition: ERF_Kessler.H:31
EB surface-layer model for adiabatic constant-roughness fluxes.
Definition: ERF_EBMOSTStress.H:14
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
Populate neutral MOST flux scales for an adiabatic EB surface.
Definition: ERF_EBMOSTStress.H:31
adiabatic_eb(amrex::Real Tflux, amrex::Real Qvflux)
Construct an adiabatic EB flux functor.
Definition: ERF_EBMOSTStress.H:20
most_data mdata
Definition: ERF_EBMOSTStress.H:61
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:62
EB implementation of the Moeng surface-flux formulation.
Definition: ERF_EBMOSTStress.H:327
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
Compute the EB x-momentum stress on a staggered face.
Definition: ERF_EBMOSTStress.H:457
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:871
moeng_flux_eb()
Construct a Moeng EB flux functor.
Definition: ERF_EBMOSTStress.H:329
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
Compute the EB temperature flux at a cell-centered cut-cell surface.
Definition: ERF_EBMOSTStress.H:386
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
Compute the EB y-momentum stress on a staggered face.
Definition: ERF_EBMOSTStress.H:663
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
Compute the EB moisture flux at a cell-centered cut-cell surface.
Definition: ERF_EBMOSTStress.H:335
const amrex::Real eps
Definition: ERF_EBMOSTStress.H:869
Definition: ERF_MOSTUtils.H:530
bool extrapolated
whether the last update returned an extrapolated value
Definition: ERF_MOSTUtils.H:564
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real update(amrex::Real u_new, int iter)
Definition: ERF_MOSTUtils.H:540
Definition: ERF_MOSTUtils.H:13
amrex::Real surf_moist_flux
Moisture flux.
Definition: ERF_MOSTUtils.H:19
amrex::Real kappa
von Karman constant
Definition: ERF_MOSTUtils.H:16
amrex::Real gravity
Acceleration due to gravity (m/s^2)
Definition: ERF_MOSTUtils.H:17
const amrex::Real Bjr_beta
Definition: ERF_MOSTUtils.H:32
amrex::Real surf_temp_flux
Heat flux TODO: decide whether this is <θ'w'> or <θv'w'> under moist conditions.
Definition: ERF_MOSTUtils.H:18
Definition: ERF_MOSTUtils.H:67
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_m(amrex::Real zeta) const
Definition: ERF_MOSTUtils.H:132
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_h2(amrex::Real zeta) const
Definition: ERF_MOSTUtils.H:104
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_zeta_fold(amrex::Real C) const
Definition: ERF_MOSTUtils.H:227
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_h(amrex::Real zeta) const
Definition: ERF_MOSTUtils.H:151
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_psi_m2(amrex::Real zeta) const
Definition: ERF_MOSTUtils.H:79
EB surface-layer model with prescribed surface fluxes and constant roughness.
Definition: ERF_EBMOSTStress.H:215
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:322
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:319
const amrex::Real tol
Definition: ERF_EBMOSTStress.H:320
most_data mdata
Definition: ERF_EBMOSTStress.H:317
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
Iterate MOST stability functions and update implied surface values.
Definition: ERF_EBMOSTStress.H:235
const amrex::Real alpha
Definition: ERF_EBMOSTStress.H:321
bool spec_qflux
Definition: ERF_EBMOSTStress.H:318
surface_flux_eb(amrex::Real Tflux, amrex::Real Qvflux, bool cons_qflux)
Construct a prescribed-flux EB functor.
Definition: ERF_EBMOSTStress.H:222
EB surface-layer model with prescribed surface temperature and constant roughness.
Definition: ERF_EBMOSTStress.H:68
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
Iterate MOST stability functions and update surface flux scales.
Definition: ERF_EBMOSTStress.H:88
const amrex::Real tol
Definition: ERF_EBMOSTStress.H:208
const amrex::Real alpha
Definition: ERF_EBMOSTStress.H:209
const amrex::Real WSMIN
Definition: ERF_EBMOSTStress.H:210
similarity_funs sfuns
Definition: ERF_EBMOSTStress.H:207
surface_temp_eb(amrex::Real Tflux, amrex::Real Qvflux, bool cons_qflux)
Construct a prescribed-temperature EB flux functor.
Definition: ERF_EBMOSTStress.H:75
bool spec_qflux
Definition: ERF_EBMOSTStress.H:206
most_data mdata
Definition: ERF_EBMOSTStress.H:205