Function for computing the implicit contribution to the vertical diffusion of momentum, over terrain.
This function (explicitly instantiated below) handles staggering in x, y, or z through the template parameter, stagdir. NOTE: implicit diffusion of w has remains an experimental feature and has not been tested yet with terrain.
267 BL_PROFILE_VAR(
"ImplicitDiffForMom_T()",ImplicitDiffForMom_T);
278 constexpr
Real molec_fac = (stagdir == 2) ?
two :
one;
289 constexpr
int ioff = (stagdir == 0) ? 1 : 0;
290 constexpr
int joff = (stagdir == 1) ? 1 : 0;
293 int ilo = bx.smallEnd(0);
294 int ihi = bx.bigEnd(0);
295 int jlo = bx.smallEnd(1);
296 int jhi = bx.bigEnd(1);
297 int klo = bx.smallEnd(2);
298 int khi = bx.bigEnd(2);
299 amrex::ignore_unused(ilo, ihi, jlo, jhi);
303 amrex::FArrayBox RHS_fab, soln_fab, coeffG_fab;
304 RHS_fab.resize(bx,1, amrex::The_Async_Arena());
305 soln_fab.resize(bx,1, amrex::The_Async_Arena());
306 coeffG_fab.resize(bx,1, amrex::The_Async_Arena());
307 auto const& RHS_a = RHS_fab.array();
308 auto const& soln_a = soln_fab.array();
309 auto const& coeffG_a = coeffG_fab.array();
311 Real dz_inv = cellSizeInv[2];
320 amrex::ignore_unused(foextrap_on_zlo,foextrap_on_zhi);
323 "Unexpected lower BC for momentum used with implicit vertical diffusion");
325 "Unexpected upper BC for momentum used with implicit vertical diffusion");
327 Real Fact = implicit_fac * dt * dz_inv;
330 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
333 for (
int j(jlo); j<=jhi; ++j) {
334 for (
int i(ilo); i<=ihi; ++i) {
375 Real rhoface, rhoAlpha_lo, rhoAlpha_hi;
376 Real detJface, met_h_zeta_lo, met_h_zeta_hi;
377 Real a_tmp, b_tmp, c_tmp, inv_b2_tmp;
379 detJface =
myhalf * (detJ(i,j,klo) + detJ(i-ioff,j-joff,klo));
382 cell_data, mu_turb, mu_eff,
391 c_tmp = -Fact * gfac * rhoAlpha_hi * dz_inv / met_h_zeta_hi;
393 RHS_a(i,j,klo) = detJface * face_data(i,j,klo);
396 if (ext_dir_on_zlo) {
397 RHS_a(i,j,klo) += Fact * gfac * (tau_corr(i,j,klo+1) - tau_corr(i,j,klo));
400 RHS_a(i,j,klo) =
zero;
403 a_tmp = -
two * Fact * rhoAlpha_lo * dz_inv / met_h_zeta_lo;
405 + cell_data(i-ioff,j-joff,klo-1,
Rho_comp) );
406 const Real wall_velocity = face_data(i,j,klo-1) / rho_wall;
407 RHS_a(i,j,klo) -= a_tmp * wall_velocity;
409 }
else if (use_SurfLayer) {
411 RHS_a(i,j,klo) += Fact * gfac * (tau_corr(i,j,klo+1) - tau(i,j,klo));
412 RHS_a(i,j,klo) += Fact * tau(i,j,klo);
415 RHS_a(i,j,klo) += Fact * gfac * (tau_corr(i,j,klo+1) - tau_corr(i,j,klo));
419 if (use_ysu_mom_countergradient && stagdir < 2) {
421 const Real gam_hi =
myhalf * (mu_turb(i,j,klo,hgam_comp) + mu_turb(i,j,klo+1,hgam_comp));
422 RHS_a(i,j,klo) += Fact * gfac * rhoAlpha_hi * gam_hi / met_h_zeta_hi;
425 b_tmp = detJface * rhoface - a_tmp - c_tmp;
428 RHS_a(i,j,klo) /= b_tmp;
429 coeffG_a(i,j,klo) = c_tmp / b_tmp;
434 for (
int k(klo+1); k <
khi; k++) {
435 detJface =
myhalf * (detJ(i,j,k) + detJ(i-ioff,j-joff,k));
438 cell_data, mu_turb, mu_eff,
446 a_tmp = -Fact * rhoAlpha_lo * dz_inv / met_h_zeta_lo;
447 c_tmp = -Fact * rhoAlpha_hi * dz_inv / met_h_zeta_hi;
448 b_tmp = detJface * rhoface - a_tmp - c_tmp;
449 inv_b2_tmp =
one / (b_tmp - a_tmp * coeffG_a(i,j,k-1));
451 RHS_a(i,j,k) = detJface * face_data(i,j,k);
452 RHS_a(i,j,k) += Fact * gfac * (tau_corr(i,j,k+1) - tau_corr(i,j,k));
455 if (use_ysu_mom_countergradient && stagdir < 2) {
457 const Real gam_k = mu_turb(i, j, k, hgam_comp);
458 const Real gam_km1 = mu_turb(i, j, k-1, hgam_comp);
459 const Real gam_kp1 = mu_turb(i, j, k+1, hgam_comp);
460 const Real gam_hi =
myhalf * (gam_k + gam_kp1);
461 const Real gam_lo =
myhalf * (gam_k + gam_km1);
462 RHS_a(i,j,k) += Fact * gfac * (rhoAlpha_hi * gam_hi / met_h_zeta_hi - rhoAlpha_lo * gam_lo / met_h_zeta_lo);
465 RHS_a(i,j,k) = (RHS_a(i,j,k) - a_tmp * RHS_a(i,j,k-1)) * inv_b2_tmp;
466 coeffG_a(i,j,k) = c_tmp * inv_b2_tmp;
472 detJface =
myhalf * (detJ(i,j,
khi) + detJ(i-ioff,j-joff,
khi));
475 cell_data, mu_turb, mu_eff,
483 a_tmp = -Fact * gfac * rhoAlpha_lo * dz_inv / met_h_zeta_lo;
486 RHS_a(i,j,
khi) = detJface * face_data(i,j,
khi);
487 RHS_a(i,j,
khi) += Fact * gfac * (tau_corr(i,j,
khi+1) - tau_corr(i,j,
khi));
490 if (ext_dir_on_zhi) {
496 c_tmp = -
two * Fact * rhoAlpha_hi * dz_inv / met_h_zeta_hi;
499 const Real wall_velocity = face_data(i,j,
khi+1) / rho_wall;
500 RHS_a(i,j,
khi) -= c_tmp * wall_velocity;
504 b_tmp = detJface * rhoface - a_tmp - c_tmp;
505 inv_b2_tmp =
one / (b_tmp - a_tmp * coeffG_a(i,j,
khi-1));
508 soln_a(i,j,
khi) = (RHS_a(i,j,
khi) - a_tmp * RHS_a(i,j,
khi-1)) * inv_b2_tmp;
513 for (
int k(
khi-1); k>=klo; --k) {
514 soln_a(i,j,k) = RHS_a(i,j,k) - coeffG_a(i,j,k) * soln_a(i,j,k+1);
519 for (
int k(klo); k<=
khi; ++k) {
521 face_data(i,j,k) = rhoface * soln_a(i,j,k);
constexpr amrex::Real three
Definition: ERF_Constants.H:11
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void getRhoAlphaForFaces(int i, int j, int k, int ioff, int joff, amrex::Real &rhoAlpha_lo, amrex::Real &rhoAlpha_hi, const amrex::Array4< const amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &mu_turb, const amrex::Real mu_eff, bool l_consA, bool l_turb)
Definition: ERF_GetRhoAlphaForFaces.H:22
#define Rho_comp
Definition: ERF_IndexDefines.H:36
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
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);})
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:184
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
@ xvel_bc
Definition: ERF_IndexDefines.H:102
@ foextrap
Definition: ERF_IndexDefines.H:248
@ ext_dir
Definition: ERF_IndexDefines.H:249
@ ext_dir_prim
Definition: ERF_IndexDefines.H:252
@ HGAMU_v
Definition: ERF_IndexDefines.H:219
@ HGAMV_v
Definition: ERF_IndexDefines.H:220
Definition: ERF_DiffStruct.H:22
MolecDiffType molec_diff_type
Selected molecular transport model.
Definition: ERF_DiffStruct.H:94
amrex::Real dynamic_viscosity
Dynamic viscosity for momentum diffusion [kg/(m-s)].
Definition: ERF_DiffStruct.H:106
amrex::Real rho0_trans
Reference density used to compute dynamic diffusion coefficients [kg/m3].
Definition: ERF_DiffStruct.H:101
amrex::Vector< TurbChoice > turbChoice
Turbulence options for each AMR level.
Definition: ERF_DataStruct.H:1393
DiffChoice diffChoice
Diffusion-related options.
Definition: ERF_DataStruct.H:1390
Definition: ERF_TurbStruct.H:114
bool use_kturb
Whether any turbulence model is active.
Definition: ERF_TurbStruct.H:660