ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ImplicitPost.H File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

 if (l_vert_implicit_fac > zero)
 

Variables

const bool l_do_implicit_ke = solverChoice.implicit_ke_diffusion
 
const bool l_do_implicit_moist = solverChoice.implicit_moisture_diffusion
 
const Real l_vert_implicit_fac = solverChoice.vert_implicit_fac[level][nrk]
 

Function Documentation

◆ if()

if ( l_vert_implicit_fac  ,
zero   
)
7  {
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  const Array4<const Real> mf_mx = mapfac[level][MapFacType::m_x]->const_array(mfi);
33  const Array4<const Real> mf_my = mapfac[level][MapFacType::m_y]->const_array(mfi);
34  const bool l_implicit_metric = solverChoice.implicit_terrain_metric &&
35  l_use_terrain_fitted_coords;
36 
37  const Array4<const Real>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) :
38  Array4<const Real>{};
39 
40  if (l_use_stretched_dz) {
41  ImplicitDiffForStateLU_S(bx, fine_geom.Domain(), level, RhoKE_comp,
42  slow_dt, l_bc_neumann_vals_d, cell_data,
43  stretched_dz_d[level], Array4<const Real>{},
44  mu_turb, solverChoice,
45  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
46  } else if (l_use_terrain_fitted_coords) {
47  ImplicitDiffForStateLU_T(bx, fine_geom.Domain(), level, RhoKE_comp,
48  slow_dt, l_bc_neumann_vals_d, cell_data,
49  z_nd_arr, detJ_arr, dxInv, Array4<const Real>{},
50  mu_turb, solverChoice,
51  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac,
52  false, mf_mx, mf_my, l_implicit_metric);
53  } else { // no terrain
54  ImplicitDiffForStateLU_N(bx, fine_geom.Domain(), level, RhoKE_comp,
55  slow_dt, l_bc_neumann_vals_d, cell_data,
56  dxInv, Array4<const Real>{}, mu_turb, solverChoice,
57  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac);
58  }
59  } // mfi
60  } // do implicit tke and evolve tke
61 
62  if ( (l_do_implicit_moist) &&
63  (solverChoice.moisture_type != MoistureType::None) ) {
64 
65  // BCs for q1
66  const BCRec* bc_ptr_h = domain_bcs_type.data();
67  GpuArray<Real, AMREX_SPACEDIM*2> l_bc_neumann_vals_d;
68  for (int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
69  l_bc_neumann_vals_d[ori] = m_bc_neumann_vals[RhoQ1_comp][ori];
70  }
71  const bool l_use_SurfLayer = (m_SurfaceLayer[Orientation(Direction::z, Orientation::low)] != nullptr);
72 
73  for ( MFIter mfi(S_new[IntVars::cons],TileNoZ()); mfi.isValid(); ++mfi)
74  {
75  Box bx = mfi.tilebox();
76 
77  // NOTE: We have updated the state, use that directly
78  const Array4< Real>& cell_data = S_new[IntVars::cons].array(mfi);
79 
80  const Array4<const Real>& z_nd_arr = z_phys_nd[level]->const_array(mfi);
81  const Array4<const Real>& detJ_arr = detJ_cc[level]->const_array(mfi);
82  const Array4<const Real> mf_mx = mapfac[level][MapFacType::m_x]->const_array(mfi);
83  const Array4<const Real> mf_my = mapfac[level][MapFacType::m_y]->const_array(mfi);
84  const bool l_implicit_metric = solverChoice.implicit_terrain_metric &&
85  l_use_terrain_fitted_coords;
86 
87  const Array4<const Real>& mu_turb = l_use_turb ? eddyDiffs->const_array(mfi) :
88  Array4<const Real>{};
89  const Array4<const Real>& q1fx_z = Q1fx3->const_array(mfi);
90  const bool l_use_mrf_cg = solverChoice.turbChoice[level].enable_mrf_countergradient
91  && (solverChoice.turbChoice[level].pbl_type == PBLType::MRF);
92  if (l_use_stretched_dz) {
93  ImplicitDiffForStateLU_S(bx, fine_geom.Domain(), level, RhoQ1_comp,
94  slow_dt, l_bc_neumann_vals_d, cell_data,
95  stretched_dz_d[level], q1fx_z,
96  mu_turb, solverChoice,
97  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac,
98  l_use_mrf_cg);
99  } else if (l_use_terrain_fitted_coords) {
100  ImplicitDiffForStateLU_T(bx, fine_geom.Domain(), level, RhoQ1_comp,
101  slow_dt, l_bc_neumann_vals_d, cell_data,
102  z_nd_arr, detJ_arr, dxInv, q1fx_z,
103  mu_turb, solverChoice,
104  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac,
105  l_use_mrf_cg,
106  mf_mx, mf_my, l_implicit_metric);
107  } else { // no terrain
108  ImplicitDiffForStateLU_N(bx, fine_geom.Domain(), level, RhoQ1_comp,
109  slow_dt, l_bc_neumann_vals_d, cell_data,
110  dxInv, q1fx_z, mu_turb, solverChoice,
111  bc_ptr_h, l_use_SurfLayer, l_vert_implicit_fac,
112  l_use_mrf_cg);
113  }
114  } // mfi
115  } // if moist model and do implicit diff
116  } // implicit vertical factor > 0
@ m_y
Definition: ERF_DataStruct.H:38
@ m_x
Definition: ERF_DataStruct.H:37
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)
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 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:48
#define RhoKE_comp
Definition: ERF_IndexDefines.H:44
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:235
@ None
Definition: ERF_LSM_Types.H:6
Here is the call graph for this function:

Variable Documentation

◆ l_do_implicit_ke

const bool l_do_implicit_ke = solverChoice.implicit_ke_diffusion

Referenced by if().

◆ l_do_implicit_moist

const bool l_do_implicit_moist = solverChoice.implicit_moisture_diffusion

Referenced by if().

◆ l_vert_implicit_fac

const Real l_vert_implicit_fac = solverChoice.vert_implicit_fac[level][nrk]