1 #ifndef ERF_PBLMODELS_H_
2 #define ERF_PBLMODELS_H_
4 #include <AMReX_Periodicity.H>
33 const amrex::MultiFab&
xvel,
34 const amrex::MultiFab&
yvel,
35 amrex::MultiFab& cons_in,
36 amrex::MultiFab& eddyViscosity,
37 const amrex::Geometry& geom,
39 std::unique_ptr<SurfaceLayer>& SurfLayer,
40 bool use_terrain_fitted_coords,
43 const amrex::BCRec* bc_ptr,
45 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
46 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
69 const amrex::MultiFab&
yvel,
70 const amrex::MultiFab& cons_in,
71 amrex::MultiFab& eddyViscosity,
72 const amrex::Geometry& geom,
74 std::unique_ptr<SurfaceLayer>& SurfLayer,
75 bool use_terrain_fitted_coords,
78 const amrex::BCRec* bc_ptr,
80 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
81 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
104 const amrex::MultiFab&
yvel,
105 const amrex::MultiFab& cons_in,
106 amrex::MultiFab& eddyViscosity,
107 const amrex::Geometry& geom,
109 std::unique_ptr<SurfaceLayer>& SurfLayer,
110 bool use_terrain_fitted_coords,
113 const amrex::BCRec* bc_ptr,
115 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
116 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
139 const amrex::MultiFab&
yvel,
140 const amrex::MultiFab& cons_in,
141 amrex::MultiFab& eddyViscosity,
142 const amrex::Geometry& geom,
144 std::unique_ptr<SurfaceLayer>& SurfLayer,
145 bool use_terrain_fitted_coords,
148 const amrex::BCRec* bc_ptr,
150 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
151 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
176 const amrex::MultiFab&
yvel,
177 const amrex::MultiFab& cons_in,
178 amrex::MultiFab& eddyViscosity,
179 const amrex::Geometry& geom,
181 std::unique_ptr<SurfaceLayer>& SurfLayer,
182 bool use_terrain_fitted_coords,
185 const amrex::BCRec* bc_ptr,
187 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
188 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
190 const amrex::MultiFab* terrain_blank =
nullptr);
223 const amrex::MultiFab&
yvel,
224 const amrex::MultiFab& cons_in,
225 amrex::MultiFab& eddyViscosity,
226 const amrex::Geometry& geom,
228 std::unique_ptr<SurfaceLayer>& SurfLayer,
229 bool use_terrain_fitted_coords,
232 const amrex::BCRec* bc_ptr,
234 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
235 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
237 const amrex::MultiFab* qheating_rates =
nullptr,
238 const amrex::MultiFab* terrain_blank =
nullptr);
289 const StratType strat,
290 const amrex::Array4<const amrex::Real>& cell_data,
295 }
else if (strat == StratType::thetal) {
296 return GetThetal(i,j,k,cell_data,moisture_indices);
298 return GetThetav(i,j,k,cell_data,moisture_indices);
305 const amrex::Array4<const amrex::Real>& uvel,
306 const amrex::Array4<const amrex::Real>& vvel,
307 const amrex::Array4<const amrex::Real>& cell_data,
311 const bool c_ext_dir_on_zlo,
312 const bool c_ext_dir_on_zhi,
313 const bool u_ext_dir_on_zlo,
314 const bool u_ext_dir_on_zhi,
315 const bool v_ext_dir_on_zlo,
316 const bool v_ext_dir_on_zhi,
321 const StratType strat = StratType::thetav)
327 if ( k==izmax && c_ext_dir_on_zhi ) {
328 dthetadz = (
GetPBLStratVar(i,j,k+1,strat,cell_data,moisture_indices)
330 }
else if ( k==izmin && c_ext_dir_on_zlo ) {
331 dthetadz = (
GetPBLStratVar(i,j,k ,strat,cell_data,moisture_indices)
334 dthetadz = (
GetPBLStratVar(i,j,k+1,strat,cell_data,moisture_indices)
338 if ( k==izmax && u_ext_dir_on_zhi ) {
339 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k)
341 }
else if ( k==izmin && u_ext_dir_on_zlo ) {
342 dudz =
myhalf*( uvel(i ,j,k) - uvel(i ,j,k-1)
345 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k-1)
346 +uvel(i+1,j,k+1) - uvel(i+1,j,k-1) )*dz_inv.
interior;
349 if ( k==izmax && v_ext_dir_on_zhi ) {
350 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k)
352 }
else if ( k==izmin && v_ext_dir_on_zlo ) {
353 dvdz =
myhalf*( vvel(i,j ,k) - vvel(i,j ,k-1)
356 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k-1)
357 +vvel(i,j+1,k+1) - vvel(i,j+1,k-1) )*dz_inv.
interior;
430 dudz = sl.
u_star * sfuns.calc_phi_m(sl.
zeta) * inv_kappa_z;
432 dthetadz = sl.
tstar_v * sfuns.calc_phi_h(sl.
zeta) * inv_kappa_z;
458 const amrex::Array4<const amrex::Real>& uvel,
459 const amrex::Array4<const amrex::Real>& vvel,
460 const amrex::Array4<const amrex::Real>& cell_data,
461 const amrex::Array4<const amrex::Real>& cell_prim,
462 const amrex::Array4<const amrex::Real>& K_turb,
463 const amrex::Box& domain,
468 bool c_ext_dir_on_zlo,
469 bool c_ext_dir_on_zhi,
470 bool u_ext_dir_on_zlo,
471 bool u_ext_dir_on_zhi,
472 bool v_ext_dir_on_zlo,
473 bool v_ext_dir_on_zhi,
474 const amrex::Array4<const amrex::Real>&
tau13,
475 const amrex::Array4<const amrex::Real>&
tau23,
476 const amrex::Array4<const amrex::Real>& hfx_z,
477 const amrex::Array4<const amrex::Real>& qfx1_z,
478 bool surface_layer_on_zlo)
482 int izmin = domain.smallEnd(2);
483 int izmax = domain.bigEnd(2);
494 const bool use_surface_fluxes = ( surface_layer_on_zlo && (k == izmin) &&
497 if (use_surface_fluxes)
518 cell_data(i,j,k,moisture_indices.
qv) /
rho :
zero;
525 const amrex::Real tau_s = std::sqrt(t13_s*t13_s + t23_s*t23_s);
531 if (qfx1_z) { hfxv_s +=
epsv *
theta * qfx1_z(i,j,k); }
544 if (std::abs(hfxv_s) > eps &&
ustar > eps) {
547 zeta = z1 / l_obukhov;
575 const amrex::Real tau_proj = (t13_c*t13_s + t23_c*t23_s) / tau_s;
580 source_term += (
CONST_GRAV/theta_mean) * hfxv_c;
587 uvel, vvel, cell_data, izmin, izmax, dz_inv,
588 c_ext_dir_on_zlo, c_ext_dir_on_zhi,
589 u_ext_dir_on_zlo, u_ext_dir_on_zhi,
590 v_ext_dir_on_zlo, v_ext_dir_on_zhi,
591 dthetadz, dudz, dvdz,
599 source_term += K_turb(i,j,k,
EddyDiff::Mom_v) * (dudz*dudz + dvdz*dvdz);
607 if (std::abs(qke) >
zero) {
626 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
647 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
653 return {
two / (dz_lo +
two*
dz[k] + dz_hi),
664 amrex::Array4<const amrex::Real>
z_cc;
673 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
718 const amrex::Box& xybx_valid,
721 const amrex::Box& domain,
722 const amrex::Periodicity& periodicity)
724 if (passes <= 0) {
return; }
728 pblh_fab.box().contains(amrex::grow(xybx_valid, amrex::IntVect(passes,passes,0))),
729 "ApplyPBLHSmoothing: the PBLH work array needs `passes` columns of halo "
730 "around the region being smoothed");
733 amrex::FArrayBox pblh_temp(pblh_fab.box(), 1, amrex::The_Async_Arena());
734 auto pblh = pblh_fab.array();
735 auto pblh_tmp = pblh_temp.array();
737 const auto& dom_lo = amrex::lbound(domain);
738 const auto& dom_hi = amrex::ubound(domain);
740 const bool per_x = periodicity.isPeriodic(0);
741 const bool per_y = periodicity.isPeriodic(1);
746 for (
int pass = 0; pass < passes; ++pass) {
747 const int halo = passes - 1 - pass;
748 const amrex::Box bx = amrex::grow(xybx_valid, amrex::IntVect(halo,halo,0));
755 const int i_xlo = (per_x || i > dom_lo.x) ? (i - 1) : i;
756 const int i_xhi = (per_x || i < dom_hi.x) ? (i + 1) : i;
757 const int j_ylo = (per_y || j > dom_lo.y) ? (j - 1) : j;
758 const int j_yhi = (per_y || j < dom_hi.y) ? (j + 1) : j;
761 pblh_tmp(i, j, 0) = weight * pblh(i, j, 0)
762 + wt_side * (pblh(i_xlo, j, 0) + pblh(i_xhi, j, 0) +
763 pblh(i, j_ylo, 0) + pblh(i, j_yhi, 0));
768 pblh_fab.copy<amrex::RunOn::Device>(pblh_temp, bx, 0, bx, 0, 1);
constexpr amrex::Real epsv
Definition: ERF_Constants.H:52
constexpr amrex::Real KAPPA
Definition: ERF_Constants.H:67
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:68
@ tau23
Definition: ERF_DataStruct.H:48
@ tau13
Definition: ERF_DataStruct.H:48
#define Rho_comp
Definition: ERF_IndexDefines.H:42
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:43
#define PrimKE_comp
Definition: ERF_IndexDefines.H:62
const bool use_moisture
Definition: ERF_InitCustomPert_ABL.H:71
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real GetThetav(const int &i, const int &j, const int &k, const amrex::Array4< amrex::Real const > &cell_data, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:74
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real GetThetal(const int &i, const int &j, const int &k, const amrex::Array4< amrex::Real const > &cell_data, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:130
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real four
Definition: ERF_NumericalConstants.H:40
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:42
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real GetPBLStratVar(int i, int j, int k, const StratType strat, const amrex::Array4< const amrex::Real > &cell_data, const MoistureComponentIndices &moisture_indices)
Definition: ERF_PBLModels.H:288
void ComputeDiffusivityYSU(const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices)
void ComputeDiffusivityMYNNEDMF(const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void ComputeVerticalDerivativesPBL(int i, int j, int k, const amrex::Array4< const amrex::Real > &uvel, const amrex::Array4< const amrex::Real > &vvel, const amrex::Array4< const amrex::Real > &cell_data, const int izmin, const int izmax, const PBLDerivativeDzInv &dz_inv, const bool c_ext_dir_on_zlo, const bool c_ext_dir_on_zhi, const bool u_ext_dir_on_zlo, const bool u_ext_dir_on_zhi, const bool v_ext_dir_on_zlo, const bool v_ext_dir_on_zhi, amrex::Real &dthetadz, amrex::Real &dudz, amrex::Real &dvdz, const MoistureComponentIndices &moisture_indices, const StratType strat=StratType::thetav)
Definition: ERF_PBLModels.H:304
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeQKESourceTerms(int i, int j, int k, const amrex::Array4< const amrex::Real > &uvel, const amrex::Array4< const amrex::Real > &vvel, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &cell_prim, const amrex::Array4< const amrex::Real > &K_turb, const amrex::Box &domain, const PBLDerivativeDzInv dz_inv, amrex::Real pbl_mynn_B1_l, const amrex::Real theta_mean, const MoistureComponentIndices &moisture_indices, bool c_ext_dir_on_zlo, bool c_ext_dir_on_zhi, bool u_ext_dir_on_zlo, bool u_ext_dir_on_zhi, bool v_ext_dir_on_zlo, bool v_ext_dir_on_zhi, const amrex::Array4< const amrex::Real > &tau13, const amrex::Array4< const amrex::Real > &tau23, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &qfx1_z, bool surface_layer_on_zlo)
Definition: ERF_PBLModels.H:457
void ComputeDiffusivityMRF(const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices, const amrex::MultiFab *terrain_blank=nullptr)
void ComputeDiffusivityMYNN25(const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices)
void ApplyPBLHSmoothing(amrex::FArrayBox &pblh_fab, const amrex::Box &xybx_valid, const amrex::Real weight, const int passes, const amrex::Box &domain, const amrex::Periodicity &periodicity)
Apply spatial smoothing to PBLH field using 5-point stencil.
Definition: ERF_PBLModels.H:717
void ComputeDiffusivityYSUNew(const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices, const amrex::MultiFab *qheating_rates=nullptr, const amrex::MultiFab *terrain_blank=nullptr)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void ApplySurfaceLayerGradientsPBL(const PBLSurfaceLayerGradient &sl, amrex::Real &dthetadz, amrex::Real &dudz, amrex::Real &dvdz)
Definition: ERF_PBLModels.H:423
void ComputeDiffusivityMYJ(double dt, const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, amrex::MultiFab &cons_in, amrex::MultiFab &eddyViscosity, const amrex::Geometry &geom, const TurbChoice &turbChoice, std::unique_ptr< SurfaceLayer > &SurfLayer, bool use_terrain_fitted_coords, bool use_moisture, int level, const amrex::BCRec *bc_ptr, bool, const std::unique_ptr< amrex::MultiFab > &z_phys_nd, const std::unique_ptr< amrex::MultiFab > &z_phys_cc, const MoistureComponentIndices &moisture_indices)
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeVirtualTStarPBL(amrex::Real t_star, amrex::Real q_star, amrex::Real theta, amrex::Real qv, bool use_moisture)
Definition: ERF_PBLModels.H:386
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ Theta_v
Definition: ERF_IndexDefines.H:253
@ Turb_lengthscale
Definition: ERF_IndexDefines.H:257
@ Mom_v
Definition: ERF_IndexDefines.H:252
@ ustar
Definition: ERF_SLM.H:28
@ rho
Definition: ERF_Kessler.H:25
@ theta
Definition: ERF_Kessler.H:26
@ qv
Definition: ERF_Kessler.H:31
@ xvel
Definition: ERF_IndexDefines.H:218
@ yvel
Definition: ERF_IndexDefines.H:219
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
The moisture data carried by the active microphysics scheme.
Definition: ERF_DataStruct.H:238
int qv
water vapor
Definition: ERF_DataStruct.H:249
Functor for inverse vertical spacings with constant grid spacing.
Definition: ERF_PBLModels.H:619
amrex::Real value
Definition: ERF_PBLModels.H:620
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int) const noexcept
Definition: ERF_PBLModels.H:627
Functor for inverse vertical spacings for stretched grids using a spacing array.
Definition: ERF_PBLModels.H:637
const amrex::Real * dz
Definition: ERF_PBLModels.H:638
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int k) const noexcept
Definition: ERF_PBLModels.H:648
int klo
Definition: ERF_PBLModels.H:639
int khi
Definition: ERF_PBLModels.H:640
Functor for inverse vertical spacings for terrain-following grids using cell-center heights.
Definition: ERF_PBLModels.H:663
amrex::Array4< const amrex::Real > z_cc
Definition: ERF_PBLModels.H:664
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int i, int j, int k) const noexcept
Definition: ERF_PBLModels.H:674
Definition: ERF_PBLModels.H:248
amrex::Real dirichlet_hi
Definition: ERF_PBLModels.H:253
amrex::Real interior
Definition: ERF_PBLModels.H:251
amrex::Real dirichlet_lo
Definition: ERF_PBLModels.H:252
Definition: ERF_PBLModels.H:366
amrex::Real tstar_v
virtual temperature scale
Definition: ERF_PBLModels.H:368
amrex::Real zeta
stability coordinate z/L
Definition: ERF_PBLModels.H:370
amrex::Real u_star
friction velocity
Definition: ERF_PBLModels.H:367
amrex::Real zval
height of the cell center above the surface
Definition: ERF_PBLModels.H:369
Definition: ERF_TurbStruct.H:115
Definition: ERF_MOSTUtils.H:37