9 const bool l_do_implicit_theta = solverChoice.implicit_thermal_diffusion;
10 const bool l_do_implicit_mom = solverChoice.implicit_momentum_diffusion;
19 MultiFab* Tau13corr = (l_do_implicit_mom) ? Tau_corr[level][0].
get() :
nullptr;
20 MultiFab* Tau23corr = (l_do_implicit_mom) ? Tau_corr[level][1].
get() :
nullptr;
23 const BCRec* bc_ptr_h = domain_bcs_type.data();
24 GpuArray<Real, AMREX_SPACEDIM*2> l_bc_neumann_vals_d;
25 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
26 l_bc_neumann_vals_d[ori] = m_bc_neumann_vals[
RhoTheta_comp][ori];
28 const bool l_use_SurfLayer = (m_SurfaceLayer[Orientation(Direction::z, Orientation::low)] !=
nullptr);
30 const bool l_use_turb = solverChoice.turbChoice[level].use_kturb;
32 const bool l_use_stretched_dz = (solverChoice.mesh_type == MeshType::StretchedDz);
36 Box bx = mfi.tilebox();
37 Box tbx = mfi.nodaltilebox(0);
38 Box tby = mfi.nodaltilebox(1);
40 const Array4< Real>& cell_data = scratch.array(mfi);
42 const Array4< Real>& rho_u = (l_do_implicit_mom) ? scratch_xmom.array(mfi) : Array4<Real>{};
43 const Array4< Real>& rho_v = (l_do_implicit_mom) ? scratch_ymom.array(mfi) : Array4<Real>{};
44 const Array4<const Real>& tau13_corr = (l_do_implicit_mom) ? Tau13corr->array(mfi) : Array4<Real>{};
45 const Array4<const Real>& tau23_corr = (l_do_implicit_mom) ? Tau23corr->array(mfi) : Array4<Real>{};
48 const Array4<const Real>& z_nd_arr = z_phys_nd[level]->const_array(mfi);
49 const Array4<const Real>& detJ_arr = detJ_cc[level]->const_array(mfi);
53 const bool l_implicit_metric = solverChoice.implicit_terrain_metric &&
54 l_use_terrain_fitted_coords;
55 const Array4<const Real> mf_mx = mapfac[level][
MapFacType::m_x]->const_array(mfi);
56 const Array4<const Real> mf_my = mapfac[level][
MapFacType::m_y]->const_array(mfi);
57 const Array4<const Real> mf_ux = mapfac[level][
MapFacType::u_x]->const_array(mfi);
58 const Array4<const Real> mf_uy = mapfac[level][
MapFacType::u_y]->const_array(mfi);
59 const Array4<const Real> mf_vx = mapfac[level][
MapFacType::v_x]->const_array(mfi);
60 const Array4<const Real> mf_vy = mapfac[level][
MapFacType::v_y]->const_array(mfi);
62 const Array4<const Real>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) : Array4<const Real>{};
66 const Array4<const int>& col_kext = column_kextent[level]->const_array(mfi);
71 const Array4<const Real>& hfx_z = Hfx3->const_array(mfi);
72 const bool l_use_mrf_cg = solverChoice.turbChoice[level].enable_mrf_countergradient
73 && (solverChoice.turbChoice[level].pbl_type == PBLType::MRF);
78 const bool l_use_ysu_mom_cg = solverChoice.turbChoice[level].enable_ysu_countergradient
79 && (solverChoice.turbChoice[level].pbl_type == PBLType::YSUNew);
80 if (l_use_stretched_dz) {
81 if (l_do_implicit_theta) {
84 stage_dt, l_bc_neumann_vals_d, cell_data,
85 stretched_dz_d[level], hfx_z,
86 mu_turb, solverChoice,
90 if (l_do_implicit_mom) {
91 ImplicitDiffForMomLU_S<0>(tbx, fine_geom.Domain(), level, stage_dt,
93 cell_data, rho_u,
tau13, tau13_corr,
94 stretched_dz_d[level],
95 mu_turb, solverChoice,
99 ImplicitDiffForMomLU_S<1>(tby, fine_geom.Domain(), level, stage_dt,
101 cell_data, rho_v,
tau23, tau23_corr,
102 stretched_dz_d[level],
103 mu_turb, solverChoice,
107 }
else if (l_use_terrain_fitted_coords) {
108 if (l_do_implicit_theta) {
110 stage_dt, l_bc_neumann_vals_d, cell_data,
111 z_nd_arr, detJ_arr,
dxInv, hfx_z,
112 mu_turb, solverChoice,
115 mf_mx, mf_my, l_implicit_metric);
117 if (l_do_implicit_mom) {
118 ImplicitDiffForMomLU_T<0>(tbx, fine_geom.Domain(), level, stage_dt,
120 cell_data, rho_u,
tau13, tau13_corr,
121 z_nd_arr, detJ_arr,
dxInv,
122 mu_turb, solverChoice,
125 mf_ux, mf_uy, l_implicit_metric);
127 ImplicitDiffForMomLU_T<1>(tby, fine_geom.Domain(), level, stage_dt,
129 cell_data, rho_v,
tau23, tau23_corr,
130 z_nd_arr, detJ_arr,
dxInv,
131 mu_turb, solverChoice,
134 mf_vx, mf_vy, l_implicit_metric);
137 if (l_do_implicit_theta) {
139 stage_dt, l_bc_neumann_vals_d, cell_data,
140 dxInv, hfx_z, mu_turb, solverChoice,
143 (ib_wall_face33[level]) ? ib_wall_face33[level]->const_array(mfi)
144 : Array4<const Real>{});
146 if (l_do_implicit_mom) {
148 const Array4<const Real> wall13 = (ib_wall_face13[level])
149 ? ib_wall_face13[level]->const_array(mfi) : Array4<const Real>{};
150 const Array4<const Real> wall23 = (ib_wall_face23[level])
151 ? ib_wall_face23[level]->const_array(mfi) : Array4<const Real>{};
152 ImplicitDiffForMomLU_N<0>(tbx, fine_geom.Domain(), level, stage_dt,
154 cell_data, rho_u,
tau13, tau13_corr,
156 mu_turb, solverChoice,
158 l_use_ysu_mom_cg, wall13);
160 ImplicitDiffForMomLU_N<1>(tby, fine_geom.Domain(), level, stage_dt,
162 cell_data, rho_v,
tau23, tau23_corr,
164 mu_turb, solverChoice,
166 l_use_ysu_mom_cg, wall23);
@ tau23
Definition: ERF_DataStruct.H:49
@ tau33
Definition: ERF_DataStruct.H:49
@ tau13
Definition: ERF_DataStruct.H:49
@ v_x
Definition: ERF_DataStruct.H:38
@ u_y
Definition: ERF_DataStruct.H:39
@ v_y
Definition: ERF_DataStruct.H:39
@ m_y
Definition: ERF_DataStruct.H:39
@ u_x
Definition: ERF_DataStruct.H:38
@ m_x
Definition: ERF_DataStruct.H:38
void ImplicitDiffForStateLU_N(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false, const amrex::Array4< const amrex::Real > &wall_face=amrex::Array4< const amrex::Real >{}, const amrex::Array4< const amrex::Real > &wall_pin=amrex::Array4< const amrex::Real >{})
Apply implicit vertical state diffusion on a uniform grid without terrain.
void ImplicitDiffForStateLU_T(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false, const amrex::Array4< const amrex::Real > &mf_mx={}, const amrex::Array4< const amrex::Real > &mf_my={}, const bool implicit_metric=false)
Apply implicit vertical state diffusion on terrain-following coordinates.
void ImplicitDiffForStateLU_S(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const double dt, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > &bc_neumann_vals, const amrex::Array4< amrex::Real > &cell_data, const amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const amrex::Array4< const amrex::Real > &hfx_z, const amrex::Array4< const amrex::Real > &mu_turb, const SolverChoice &solverChoice, const amrex::BCRec *bc_ptr, const bool use_SurfLayer, const amrex::Real implicit_fac, const bool use_mrf_countergradient=false)
Apply implicit vertical state diffusion on a vertically stretched grid.
const Real l_vert_implicit_fac
Definition: ERF_ImplicitPost.H:6
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:54
pp_for_pert_vels get("prob_type", prob_type)
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ cons
Definition: ERF_IndexDefines.H:272