ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ImplicitPost.H
Go to the documentation of this file.
1  // *****************************************************************************
2  // Do semi-implicit solve for diffusion: q1
3  // *****************************************************************************
4  const bool l_do_implicit_ke = solverChoice.implicit_ke_diffusion;
5  const bool l_do_implicit_moist = solverChoice.implicit_moisture_diffusion;
6  const Real l_vert_implicit_fac = solverChoice.vert_implicit_fac[level][nrk];
8 
9  const bool l_use_turb = solverChoice.turbChoice[level].use_kturb;
10  const bool l_use_stretched_dz = (solverChoice.mesh_type == MeshType::StretchedDz);
11 
12  if ( (l_do_implicit_ke) &&
13  (solverChoice.turbChoice[level].use_tke)) {
14 
15  // BCs for q1
16  const BCRec* bc_ptr_h = domain_bcs_type.data();
17  GpuArray<Real, AMREX_SPACEDIM*2> l_bc_neumann_vals_d;
18  for (int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
19  l_bc_neumann_vals_d[ori] = m_bc_neumann_vals[RhoKE_comp][ori];
20  }
21  const bool l_use_SurfLayer = false;
22 
23  for ( MFIter mfi(S_new[IntVars::cons],TileNoZ()); mfi.isValid(); ++mfi)
24  {
25  Box bx = mfi.tilebox();
26 
27  // NOTE: We have updated the state, use that directly
28  const Array4< Real>& cell_data = S_new[IntVars::cons].array(mfi);
29 
30  const Array4<const Real>& z_nd_arr = z_phys_nd[level]->const_array(mfi);
31  const Array4<const Real>& detJ_arr = detJ_cc[level]->const_array(mfi);
32 
33  const Array4<const Real>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) :
34  Array4<const Real>{};
35 
36  if (l_use_stretched_dz) {
37  ImplicitDiffForStateLU_S(bx, fine_geom.Domain(), level, RhoKE_comp,
38  slow_dt, l_bc_neumann_vals_d, cell_data,
39  stretched_dz_d[level], Array4<const Real>{},
40  mu_turb, solverChoice,
41  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
42  } else if (l_use_terrain_fitted_coords) {
43  ImplicitDiffForStateLU_T(bx, fine_geom.Domain(), level, RhoKE_comp,
44  slow_dt, l_bc_neumann_vals_d, cell_data,
45  z_nd_arr, detJ_arr, dxInv, Array4<const Real>{},
46  mu_turb, solverChoice,
47  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
48  } else { // no terrain
49  ImplicitDiffForStateLU_N(bx, fine_geom.Domain(), level, RhoKE_comp,
50  slow_dt, l_bc_neumann_vals_d, cell_data,
51  dxInv, Array4<const Real>{}, mu_turb, solverChoice,
52  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
53  }
54  } // mfi
55  } // do implicit tke and evolve tke
56 
57  if ( (l_do_implicit_moist) &&
58  (solverChoice.moisture_type != MoistureType::None) ) {
59 
60  // BCs for q1
61  const BCRec* bc_ptr_h = domain_bcs_type.data();
62  GpuArray<Real, AMREX_SPACEDIM*2> l_bc_neumann_vals_d;
63  for (int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
64  l_bc_neumann_vals_d[ori] = m_bc_neumann_vals[RhoQ1_comp][ori];
65  }
66  const bool l_use_SurfLayer = (m_SurfaceLayer != nullptr);
67 
68  for ( MFIter mfi(S_new[IntVars::cons],TileNoZ()); mfi.isValid(); ++mfi)
69  {
70  Box bx = mfi.tilebox();
71 
72  // NOTE: We have updated the state, use that directly
73  const Array4< Real>& cell_data = S_new[IntVars::cons].array(mfi);
74 
75  const Array4<const Real>& z_nd_arr = z_phys_nd[level]->const_array(mfi);
76  const Array4<const Real>& detJ_arr = detJ_cc[level]->const_array(mfi);
77 
78  const Array4<const Real>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) :
79  Array4<const Real>{};
80  const Array4<const Real>& q1fx_z = Q1fx3->const_array(mfi);
81 
82  if (l_use_stretched_dz) {
83  ImplicitDiffForStateLU_S(bx, fine_geom.Domain(), level, RhoQ1_comp,
84  slow_dt, l_bc_neumann_vals_d, cell_data,
85  stretched_dz_d[level], q1fx_z,
86  mu_turb, solverChoice,
87  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
88  } else if (l_use_terrain_fitted_coords) {
89  ImplicitDiffForStateLU_T(bx, fine_geom.Domain(), level, RhoQ1_comp,
90  slow_dt, l_bc_neumann_vals_d, cell_data,
91  z_nd_arr, detJ_arr, dxInv, q1fx_z,
92  mu_turb, solverChoice,
93  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
94  } else { // no terrain
95  ImplicitDiffForStateLU_N(bx, fine_geom.Domain(), level, RhoQ1_comp,
96  slow_dt, l_bc_neumann_vals_d, cell_data,
97  dxInv, q1fx_z, mu_turb, solverChoice,
98  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
99  }
100  } // mfi
101  } // if moist model and do implicit diff
102  } // implicit vertical factor > 0
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
void ImplicitDiffForStateLU_T(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real 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)
void ImplicitDiffForStateLU_N(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real 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)
void ImplicitDiffForStateLU_S(const amrex::Box &bx, const amrex::Box &domain, const int level, const int n, const amrex::Real 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 l_do_implicit_ke
Definition: ERF_ImplicitPost.H:4
const bool l_do_implicit_moist
Definition: ERF_ImplicitPost.H:5
const Real l_vert_implicit_fac
Definition: ERF_ImplicitPost.H:6
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
#define RhoKE_comp
Definition: ERF_IndexDefines.H:38
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ cons
Definition: ERF_IndexDefines.H:192