ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Implicit.H
Go to the documentation of this file.
1  // *****************************************************************************
2  // Do semi-implicit solve for theta
3  // *****************************************************************************
4  {
5  const Real l_vert_implicit_fac = solverChoice.vert_implicit_fac[nrk];
6 
7  GpuArray<Real, AMREX_SPACEDIM*2> l_bc_neumann_vals_d;
8  const int bc_comp = RhoTheta_comp;
9  for (int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
10  l_bc_neumann_vals_d[ori] = m_bc_neumann_vals[bc_comp][ori];
11  }
12 
13  if (l_vert_implicit_fac > 0.) {
14 
15  const bool l_use_stretched_dz = (solverChoice.mesh_type == MeshType::StretchedDz);
16  const bool l_use_SurfLayer = (m_SurfaceLayer != nullptr);
17  const BCRec* bc_ptr_h = domain_bcs_type.data();
18 
19  const bool l_use_turb = solverChoice.turbChoice[level].use_kturb;
20 
21  std::unique_ptr<MultiFab> dflux_z;
22  dflux_z = std::make_unique<MultiFab>(convert(ba,IntVect(0,0,1)), dm, 1, 0);
23 
24  for ( MFIter mfi(S_old[IntVars::cons],TileNoZ()); mfi.isValid(); ++mfi)
25  {
26  Box bx = mfi.tilebox();
27 
28  const Array4< Real> & cell_data = scratch.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<Real const>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) : Array4<const Real>{};
34 
35  const Array4<Real>& hfx_z = Hfx3->array(mfi);
36 
37  if (l_use_stretched_dz) {
38  ImplicitDiffForState_S(bx, fine_geom.Domain(), level, slow_dt,
40  cell_data,
41  stretched_dz_d[level], hfx_z,
42  mu_turb, solverChoice,
43  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
44  } else if (l_use_terrain_fitted_coords) {
45  ImplicitDiffForState_T(bx, fine_geom.Domain(), level, slow_dt,
47  cell_data,
48  z_nd_arr, detJ_arr, dxInv, hfx_z,
49  mu_turb, solverChoice,
50  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
51  } else {
52  ImplicitDiffForState_N(bx, fine_geom.Domain(), level, slow_dt,
54  cell_data,
55  dxInv, hfx_z,
56  mu_turb, solverChoice,
57  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
58  }
59  } // mfi
60 
61  } // if do implicit solve for diffusive contribution to (rho theta) update
62  } // wrapper
void ImplicitDiffForState_S(const amrex::Box &bx, const amrex::Box &domain, const int level, 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< 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 ImplicitDiffForState_N(const amrex::Box &bx, const amrex::Box &domain, const int level, 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< 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 ImplicitDiffForState_T(const amrex::Box &bx, const amrex::Box &domain, const int level, 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< 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 int bc_comp
Definition: ERF_Implicit.H:8
GpuArray< Real, AMREX_SPACEDIM *2 > l_bc_neumann_vals_d
Definition: ERF_Implicit.H:4
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ cons
Definition: ERF_IndexDefines.H:158