1 #ifndef ERF_PBLMODELS_H_
2 #define ERF_PBLMODELS_H_
30 const amrex::MultiFab&
xvel,
31 const amrex::MultiFab&
yvel,
32 amrex::MultiFab& cons_in,
33 amrex::MultiFab& eddyViscosity,
34 const amrex::Geometry& geom,
36 std::unique_ptr<SurfaceLayer>& SurfLayer,
37 bool use_terrain_fitted_coords,
40 const amrex::BCRec* bc_ptr,
42 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
43 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
66 const amrex::MultiFab&
yvel,
67 const amrex::MultiFab& cons_in,
68 amrex::MultiFab& eddyViscosity,
69 const amrex::Geometry& geom,
71 std::unique_ptr<SurfaceLayer>& SurfLayer,
72 bool use_terrain_fitted_coords,
75 const amrex::BCRec* bc_ptr,
77 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
78 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
101 const amrex::MultiFab&
yvel,
102 const amrex::MultiFab& cons_in,
103 amrex::MultiFab& eddyViscosity,
104 const amrex::Geometry& geom,
106 std::unique_ptr<SurfaceLayer>& SurfLayer,
107 bool use_terrain_fitted_coords,
110 const amrex::BCRec* bc_ptr,
112 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
113 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
136 const amrex::MultiFab&
yvel,
137 const amrex::MultiFab& cons_in,
138 amrex::MultiFab& eddyViscosity,
139 const amrex::Geometry& geom,
141 std::unique_ptr<SurfaceLayer>& SurfLayer,
142 bool use_terrain_fitted_coords,
145 const amrex::BCRec* bc_ptr,
147 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
148 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
173 const amrex::MultiFab&
yvel,
174 const amrex::MultiFab& cons_in,
175 amrex::MultiFab& eddyViscosity,
176 const amrex::Geometry& geom,
178 std::unique_ptr<SurfaceLayer>& SurfLayer,
179 bool use_terrain_fitted_coords,
182 const amrex::BCRec* bc_ptr,
184 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
185 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
219 const amrex::MultiFab&
yvel,
220 const amrex::MultiFab& cons_in,
221 amrex::MultiFab& eddyViscosity,
222 const amrex::Geometry& geom,
224 std::unique_ptr<SurfaceLayer>& SurfLayer,
225 bool use_terrain_fitted_coords,
228 const amrex::BCRec* bc_ptr,
230 const std::unique_ptr<amrex::MultiFab>& z_phys_nd,
231 const std::unique_ptr<amrex::MultiFab>& z_phys_cc,
233 const amrex::MultiFab* qheating_rates =
nullptr);
278 const amrex::Array4<const amrex::Real>& uvel,
279 const amrex::Array4<const amrex::Real>& vvel,
280 const amrex::Array4<const amrex::Real>& cell_data,
284 const bool c_ext_dir_on_zlo,
285 const bool c_ext_dir_on_zhi,
286 const bool u_ext_dir_on_zlo,
287 const bool u_ext_dir_on_zhi,
288 const bool v_ext_dir_on_zlo,
289 const bool v_ext_dir_on_zhi,
299 if ( k==izmax && c_ext_dir_on_zhi ) {
300 dthetadz = (
GetThetav(i,j,k+1,cell_data,moisture_indices)
302 }
else if ( k==izmin && c_ext_dir_on_zlo ) {
303 dthetadz = (
GetThetav(i,j,k ,cell_data,moisture_indices)
306 dthetadz = (
GetThetav(i,j,k+1,cell_data,moisture_indices)
310 if ( k==izmax && u_ext_dir_on_zhi ) {
311 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k)
313 }
else if ( k==izmin && u_ext_dir_on_zlo ) {
314 dudz =
myhalf*( uvel(i ,j,k) - uvel(i ,j,k-1)
317 dudz =
myhalf*( uvel(i ,j,k+1) - uvel(i ,j,k-1)
318 +uvel(i+1,j,k+1) - uvel(i+1,j,k-1) )*dz_inv.
interior;
321 if ( k==izmax && v_ext_dir_on_zhi ) {
322 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k)
324 }
else if ( k==izmin && v_ext_dir_on_zlo ) {
325 dvdz =
myhalf*( vvel(i,j ,k) - vvel(i,j ,k-1)
328 dvdz =
myhalf*( vvel(i,j ,k+1) - vvel(i,j ,k-1)
329 +vvel(i,j+1,k+1) - vvel(i,j+1,k-1) )*dz_inv.
interior;
350 const amrex::Array4<const amrex::Real>& uvel,
351 const amrex::Array4<const amrex::Real>& vvel,
352 const amrex::Array4<const amrex::Real>& cell_data,
353 const amrex::Array4<const amrex::Real>& cell_prim,
354 const amrex::Array4<const amrex::Real>& K_turb,
355 const amrex::Box& domain,
360 bool c_ext_dir_on_zlo,
361 bool c_ext_dir_on_zhi,
362 bool u_ext_dir_on_zlo,
363 bool u_ext_dir_on_zhi,
364 bool v_ext_dir_on_zlo,
365 bool v_ext_dir_on_zhi)
371 int izmin = domain.smallEnd(2);
372 int izmax = domain.bigEnd(2);
375 uvel, vvel, cell_data, izmin, izmax, dz_inv,
376 c_ext_dir_on_zlo, c_ext_dir_on_zhi,
377 u_ext_dir_on_zlo, u_ext_dir_on_zhi,
378 v_ext_dir_on_zlo, v_ext_dir_on_zhi,
379 dthetadz, dudz, dvdz,
394 source_term += K_turb(i,j,k,
EddyDiff::Mom_v) * (dudz*dudz + dvdz*dvdz);
401 if (std::abs(qke) >
zero) {
420 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
441 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
447 return {
two / (dz_lo +
two*
dz[k] + dz_hi),
458 amrex::Array4<const amrex::Real>
z_cc;
467 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
constexpr amrex::Real two
Definition: ERF_Constants.H:10
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
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:64
#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_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:72
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:277
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 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)
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:349
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)
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)
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:195
Functor for inverse vertical spacings with constant grid spacing.
Definition: ERF_PBLModels.H:413
amrex::Real value
Definition: ERF_PBLModels.H:414
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int) const noexcept
Definition: ERF_PBLModels.H:421
Functor for inverse vertical spacings for stretched grids using a spacing array.
Definition: ERF_PBLModels.H:431
const amrex::Real * dz
Definition: ERF_PBLModels.H:432
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int, int, int k) const noexcept
Definition: ERF_PBLModels.H:442
int klo
Definition: ERF_PBLModels.H:433
int khi
Definition: ERF_PBLModels.H:434
Functor for inverse vertical spacings for terrain-following grids using cell-center heights.
Definition: ERF_PBLModels.H:457
amrex::Array4< const amrex::Real > z_cc
Definition: ERF_PBLModels.H:458
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE PBLDerivativeDzInv operator()(int i, int j, int k) const noexcept
Definition: ERF_PBLModels.H:468
Definition: ERF_PBLModels.H:243
amrex::Real dirichlet_hi
Definition: ERF_PBLModels.H:248
amrex::Real interior
Definition: ERF_PBLModels.H:246
amrex::Real dirichlet_lo
Definition: ERF_PBLModels.H:247
Definition: ERF_TurbStruct.H:114