1 #ifndef ERF_PBLMODELS_H_
2 #define ERF_PBLMODELS_H_
4 #include <AMReX_Periodicity.H>
32 const amrex::MultiFab&
xvel,
33 const amrex::MultiFab&
yvel,
34 amrex::MultiFab& cons_in,
35 amrex::MultiFab& eddyViscosity,
36 const amrex::Geometry& geom,
38 std::unique_ptr<SurfaceLayer>& SurfLayer,
39 bool use_terrain_fitted_coords,
42 const amrex::BCRec* bc_ptr,
44 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
45 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
68 const amrex::MultiFab&
yvel,
69 const amrex::MultiFab& cons_in,
70 amrex::MultiFab& eddyViscosity,
71 const amrex::Geometry& geom,
73 std::unique_ptr<SurfaceLayer>& SurfLayer,
74 bool use_terrain_fitted_coords,
77 const amrex::BCRec* bc_ptr,
79 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
80 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
103 const amrex::MultiFab&
yvel,
104 const amrex::MultiFab& cons_in,
105 amrex::MultiFab& eddyViscosity,
106 const amrex::Geometry& geom,
108 std::unique_ptr<SurfaceLayer>& SurfLayer,
109 bool use_terrain_fitted_coords,
112 const amrex::BCRec* bc_ptr,
114 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
115 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
138 const amrex::MultiFab&
yvel,
139 const amrex::MultiFab& cons_in,
140 amrex::MultiFab& eddyViscosity,
141 const amrex::Geometry& geom,
143 std::unique_ptr<SurfaceLayer>& SurfLayer,
144 bool use_terrain_fitted_coords,
147 const amrex::BCRec* bc_ptr,
149 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
150 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
175 const amrex::MultiFab&
yvel,
176 const amrex::MultiFab& cons_in,
177 amrex::MultiFab& eddyViscosity,
178 const amrex::Geometry& geom,
180 std::unique_ptr<SurfaceLayer>& SurfLayer,
181 bool use_terrain_fitted_coords,
184 const amrex::BCRec* bc_ptr,
186 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
187 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
189 const amrex::MultiFab* terrain_blank =
nullptr);
222 const amrex::MultiFab&
yvel,
223 const amrex::MultiFab& cons_in,
224 amrex::MultiFab& eddyViscosity,
225 const amrex::Geometry& geom,
227 std::unique_ptr<SurfaceLayer>& SurfLayer,
228 bool use_terrain_fitted_coords,
231 const amrex::BCRec* bc_ptr,
233 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
234 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
236 const amrex::MultiFab* qheating_rates =
nullptr,
237 const amrex::MultiFab* terrain_blank =
nullptr);
282 const amrex::Array4<const amrex::Real>& uvel,
283 const amrex::Array4<const amrex::Real>& vvel,
284 const amrex::Array4<const amrex::Real>& cell_data,
288 const bool c_ext_dir_on_zlo,
289 const bool c_ext_dir_on_zhi,
290 const bool u_ext_dir_on_zlo,
291 const bool u_ext_dir_on_zhi,
292 const bool v_ext_dir_on_zlo,
293 const bool v_ext_dir_on_zhi,
303 if ( k==izmax && c_ext_dir_on_zhi ) {
304 dthetadz = (
GetThetav(i,j,k+1,cell_data,moisture_indices)
306 }
else if ( k==izmin && c_ext_dir_on_zlo ) {
307 dthetadz = (
GetThetav(i,j,k ,cell_data,moisture_indices)
310 dthetadz = (
GetThetav(i,j,k+1,cell_data,moisture_indices)
314 if ( k==izmax && u_ext_dir_on_zhi ) {
315 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k)
317 }
else if ( k==izmin && u_ext_dir_on_zlo ) {
318 dudz =
myhalf*( uvel(i ,j,k) - uvel(i ,j,k-1)
321 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k-1)
322 +uvel(i+1,j,k+1) - uvel(i+1,j,k-1) )*dz_inv.
interior;
325 if ( k==izmax && v_ext_dir_on_zhi ) {
326 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k)
328 }
else if ( k==izmin && v_ext_dir_on_zlo ) {
329 dvdz =
myhalf*( vvel(i,j ,k) - vvel(i,j ,k-1)
332 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k-1)
333 +vvel(i,j+1,k+1) - vvel(i,j+1,k-1) )*dz_inv.
interior;
354 const amrex::Array4<const amrex::Real>& uvel,
355 const amrex::Array4<const amrex::Real>& vvel,
356 const amrex::Array4<const amrex::Real>& cell_data,
357 const amrex::Array4<const amrex::Real>& cell_prim,
358 const amrex::Array4<const amrex::Real>& K_turb,
359 const amrex::Box& domain,
364 bool c_ext_dir_on_zlo,
365 bool c_ext_dir_on_zhi,
366 bool u_ext_dir_on_zlo,
367 bool u_ext_dir_on_zhi,
368 bool v_ext_dir_on_zlo,
369 bool v_ext_dir_on_zhi)
375 int izmin = domain.smallEnd(2);
376 int izmax = domain.bigEnd(2);
379 uvel, vvel, cell_data, izmin, izmax, dz_inv,
380 c_ext_dir_on_zlo, c_ext_dir_on_zhi,
381 u_ext_dir_on_zlo, u_ext_dir_on_zhi,
382 v_ext_dir_on_zlo, v_ext_dir_on_zhi,
383 dthetadz, dudz, dvdz,
398 source_term += K_turb(i,j,k,
EddyDiff::Mom_v) * (dudz*dudz + dvdz*dvdz);
405 if (std::abs(qke) >
zero) {
424 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
445 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
451 return {
two / (dz_lo +
two*
dz[k] + dz_hi),
462 amrex::Array4<const amrex::Real>
z_cc;
471 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
516 const amrex::Box& xybx_valid,
519 const amrex::Box& domain,
520 const amrex::Periodicity& periodicity)
522 if (passes <= 0) {
return; }
526 pblh_fab.box().contains(amrex::grow(xybx_valid, amrex::IntVect(passes,passes,0))),
527 "ApplyPBLHSmoothing: the PBLH work array needs `passes` columns of halo "
528 "around the region being smoothed");
531 amrex::FArrayBox pblh_temp(pblh_fab.box(), 1, amrex::The_Async_Arena());
532 auto pblh = pblh_fab.array();
533 auto pblh_tmp = pblh_temp.array();
535 const auto& dom_lo = amrex::lbound(domain);
536 const auto& dom_hi = amrex::ubound(domain);
538 const bool per_x = periodicity.isPeriodic(0);
539 const bool per_y = periodicity.isPeriodic(1);
544 for (
int pass = 0; pass < passes; ++pass) {
545 const int halo = passes - 1 - pass;
546 const amrex::Box bx = amrex::grow(xybx_valid, amrex::IntVect(halo,halo,0));
553 const int i_xlo = (per_x || i > dom_lo.x) ? (i - 1) : i;
554 const int i_xhi = (per_x || i < dom_hi.x) ? (i + 1) : i;
555 const int j_ylo = (per_y || j > dom_lo.y) ? (j - 1) : j;
556 const int j_yhi = (per_y || j < dom_hi.y) ? (j + 1) : j;
559 pblh_tmp(i, j, 0) = weight * pblh(i, j, 0)
560 + wt_side * (pblh(i_xlo, j, 0) + pblh(i_xhi, j, 0) +
561 pblh(i, j_ylo, 0) + pblh(i, j_yhi, 0));
566 pblh_fab.copy<amrex::RunOn::Device>(pblh_temp, bx, 0, bx, 0, 1);
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:56
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define PrimKE_comp
Definition: ERF_IndexDefines.H:59
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
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:33
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
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)
Definition: ERF_PBLModels.H:281
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:515
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)
Definition: ERF_PBLModels.H:353
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)
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::Real Real
Definition: ERF_ShocInterface.H:19
@ Theta_v
Definition: ERF_IndexDefines.H:250
@ Turb_lengthscale
Definition: ERF_IndexDefines.H:254
@ Mom_v
Definition: ERF_IndexDefines.H:249
@ xvel
Definition: ERF_IndexDefines.H:215
@ yvel
Definition: ERF_IndexDefines.H:216
The moisture data carried by the active microphysics scheme.
Definition: ERF_DataStruct.H:223
Functor for inverse vertical spacings with constant grid spacing.
Definition: ERF_PBLModels.H:417
amrex::Real value
Definition: ERF_PBLModels.H:418
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int) const noexcept
Definition: ERF_PBLModels.H:425
Functor for inverse vertical spacings for stretched grids using a spacing array.
Definition: ERF_PBLModels.H:435
const amrex::Real * dz
Definition: ERF_PBLModels.H:436
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int k) const noexcept
Definition: ERF_PBLModels.H:446
int klo
Definition: ERF_PBLModels.H:437
int khi
Definition: ERF_PBLModels.H:438
Functor for inverse vertical spacings for terrain-following grids using cell-center heights.
Definition: ERF_PBLModels.H:461
amrex::Array4< const amrex::Real > z_cc
Definition: ERF_PBLModels.H:462
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int i, int j, int k) const noexcept
Definition: ERF_PBLModels.H:472
Definition: ERF_PBLModels.H:247
amrex::Real dirichlet_hi
Definition: ERF_PBLModels.H:252
amrex::Real interior
Definition: ERF_PBLModels.H:250
amrex::Real dirichlet_lo
Definition: ERF_PBLModels.H:251
Definition: ERF_TurbStruct.H:115