ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_DiffusionSrcForState_T.cpp File Reference
Include dependency graph for ERF_DiffusionSrcForState_T.cpp:

Functions

void DiffusionSrcForState_T (const Box &bx, const Box &domain, int start_comp, int num_comp, const bool &rotate, const Array4< const Real > &cell_data, const Array4< const Real > &cell_prim, const Array4< Real > &cell_rhs, const Array4< Real > &xflux, const Array4< Real > &yflux, const Array4< Real > &zflux, const Array4< const Real > &z_nd, const Array4< const Real > &z_cc, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, Array4< Real > &hfx_x, Array4< Real > &hfx_y, Array4< Real > &hfx_z, Array4< Real > &qfx1_x, Array4< Real > &qfx1_y, Array4< Real > &qfx1_z, Array4< Real > &qfx2_z, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const BCRec *bc_ptr, const BCRec *bc_ptr_h, const bool use_SurfLayer, const Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac, const ScalarDiffusionRefluxViews *reflux_flx)
 

Function Documentation

◆ DiffusionSrcForState_T()

void DiffusionSrcForState_T ( const Box &  bx,
const Box &  domain,
int  start_comp,
int  num_comp,
const bool &  rotate,
const Array4< const Real > &  cell_data,
const Array4< const Real > &  cell_prim,
const Array4< Real > &  cell_rhs,
const Array4< Real > &  xflux,
const Array4< Real > &  yflux,
const Array4< Real > &  zflux,
const Array4< const Real > &  z_nd,
const Array4< const Real > &  z_cc,
const Array4< const Real > &  ax,
const Array4< const Real > &  ay,
const Array4< const Real > &  ,
const Array4< const Real > &  detJ,
const GpuArray< Real, AMREX_SPACEDIM > &  cellSizeInv,
const Array4< const Real > &  mf_mx,
const Array4< const Real > &  mf_ux,
const Array4< const Real > &  mf_vx,
const Array4< const Real > &  mf_my,
const Array4< const Real > &  mf_uy,
const Array4< const Real > &  mf_vy,
Array4< Real > &  hfx_x,
Array4< Real > &  hfx_y,
Array4< Real > &  hfx_z,
Array4< Real > &  qfx1_x,
Array4< Real > &  qfx1_y,
Array4< Real > &  qfx1_z,
Array4< Real > &  qfx2_z,
const Array4< const Real > &  mu_turb,
const SolverChoice &  solverChoice,
const int  level,
const BCRec *  bc_ptr,
const BCRec *  bc_ptr_h,
const bool  use_SurfLayer,
const Vector< std::unique_ptr< SurfaceLayer >> &  SurfLayer,
const Real  implicit_fac,
const ScalarDiffusionRefluxViews *  reflux_flx 
)

Function for computing the scalar RHS for diffusion operator with terrain-fitted coordinates.

Parameters
[in]bxcell center box to loop over
[in]domainbox of the whole domain
[in]start_compstarting component index
[in]num_compnumber of components
[in]rotateflag to rotate terrain-aligned fluxes
[in]cell_dataconserved cell center vars
[in]cell_primprimitive cell center vars
[out]cell_rhsRHS for cell center vars
[in]xfluxflux in x-dir
[in]yfluxflux in y-dir
[in]zfluxflux in z-dir
[in]z_ndphysical z height
[in]z_cccell-centered physical z height
[in]axarea fraction of x-faces
[in]ayarea fraction of y-faces
[in]detJJacobian determinant
[in]cellSizeInvinverse cell size array
[in]mf_mxx map factor at cell centers
[in]mf_uxx map factor at x-faces
[in]mf_vxx map factor at y-faces
[in]mf_myy map factor at cell centers
[in]mf_uyy map factor at x-faces
[in]mf_vyy map factor at y-faces
[in,out]hfx_xheat flux in x-dir
[in,out]hfx_yheat flux in y-dir
[in,out]hfx_zheat flux in z-dir
[in,out]qfx1_xheat flux in x-dir
[in,out]qfx1_yheat flux in y-dir
[in,out]qfx1_zheat flux in z-dir
[out]qfx2_zheat flux in z-dir
[in]mu_turbturbulent viscosity
[in]solverChoicecontainer of solver and diffusion parameters
[in]levelAMR level
[in]bc_ptrcontainer with boundary conditions (device, read in kernels)
[in]bc_ptr_hthe same boundary conditions on the host, read here to set up the kernels
[in]use_SurfLayerwhether we have turned on subgrid diffusion
[in]implicit_fac– factor of implicitness for vertical differences only
[in]reflux_flxif not null, face views (indexed by state component) to which the fluxes of each component are added for refluxing
91 {
92  BL_PROFILE_VAR("DiffusionSrcForState_T()",DiffusionSrcForState_T);
93 
94  const Real explicit_fac = one - implicit_fac;
95 
97 
98  for (int n(0); n<num_comp; ++n) {
99  const int qty_index = start_comp + n;
100  const NativeScalarDiffusionPolicy native_policy =
101  ResolveNativeScalarDiffusionPolicy(qty_index, diffChoice);
102 
104  field.scalar = cell_prim;
105  field.scalar_comp = native_policy.scalar_comp;
106  field.density = cell_data;
107  field.rho_comp = Rho_comp;
108  field.mu_turb = mu_turb;
109  field.xflux = xflux;
110  field.yflux = yflux;
111  field.zflux = zflux;
112  field.flux_comp = native_policy.flux_comp;
113  field.rhs = cell_rhs;
114  field.rhs_comp = native_policy.rhs_comp;
115 
116  ScalarDiffusionFluxPolicy flux_policy;
117  flux_policy.coefficients = native_policy.coefficients;
118  flux_policy.coefficient_mode = {l_consA, l_turb};
119  flux_policy.surface = {
120  SurfLayer_xlo, SurfLayer_xhi, SurfLayer_ylo, SurfLayer_yhi,
121  SurfLayer_zlo, SurfLayer_zhi
122  };
123  if (native_policy.is_theta) {
124  flux_policy.prescribed.use_x_on_side = true;
125  flux_policy.prescribed.use_y_on_side = true;
126  flux_policy.prescribed.use_z_on_side = true;
127  flux_policy.prescribed.use_x_on_bottom_z = SurfLayer_zlo && rotate;
128  flux_policy.prescribed.use_y_on_bottom_z = SurfLayer_zlo && rotate;
129  flux_policy.prescribed.x = Array4<const Real>(hfx_x);
130  flux_policy.prescribed.y = Array4<const Real>(hfx_y);
131  flux_policy.prescribed.z = Array4<const Real>(hfx_z);
132  flux_policy.diagnostic.enabled = true;
133  flux_policy.diagnostic.z = hfx_z;
134  } else if (native_policy.is_q1) {
135  flux_policy.prescribed.use_x_on_side = true;
136  flux_policy.prescribed.use_y_on_side = true;
137  flux_policy.prescribed.use_z_on_side = true;
138  flux_policy.prescribed.use_x_on_bottom_z = SurfLayer_zlo && rotate;
139  flux_policy.prescribed.use_y_on_bottom_z = SurfLayer_zlo && rotate;
140  flux_policy.prescribed.x = Array4<const Real>(qfx1_x);
141  flux_policy.prescribed.y = Array4<const Real>(qfx1_y);
142  flux_policy.prescribed.z = Array4<const Real>(qfx1_z);
143  flux_policy.diagnostic.enabled = true;
144  flux_policy.diagnostic.z = qfx1_z;
145  } else if (native_policy.is_q2) {
146  flux_policy.diagnostic.enabled = true;
147  flux_policy.diagnostic.write_on_surface = true;
148  flux_policy.diagnostic.z = qfx2_z;
149  }
150 
152  bx, domain, field, flux_policy, rotate, z_nd, z_cc, cellSizeInv,
153  mf_ux, mf_vy, bc_ptr, native_policy.bc_comp);
154  if (native_policy.scale_raw_vertical_flux) {
156  zbx, zflux, field.flux_comp, explicit_fac);
157  }
158  // erf.implicit_terrain_metric: the implicit solve of this quantity also takes the
159  // compact terrain-metric term, so remove that part of it from the explicit flux
160  if (native_policy.scale_raw_vertical_flux && solverChoice.implicit_terrain_metric &&
161  implicit_fac > zero) {
163  bx, domain, field, flux_policy, z_nd, cellSizeInv, mf_mx, mf_my, implicit_fac);
164  }
165 
166  // No diffusive transfer through a bottom or top domain face where the surface layer
167  // supplies the flux of this quantity separately, or where its boundary condition is
168  // zero gradient (foextrap, as at a slip or no-slip wall without a prescribed value).
169  // There the condition is no flux through the face along its normal, which is the whole
170  // of Gz; the terrain-adjusted ghost cells only approximate that, so on sloping terrain
171  // building Gz from them moved the scalar through the wall (erf-model/ERF#4330).
172  const bool suppress_lower_z_flux = SurfLayer_zlo
173  ? !(native_policy.is_theta || native_policy.is_q1)
174  : (bc_ptr_h[native_policy.bc_comp].lo(2) == ERFBCType::foextrap);
175  const bool suppress_upper_z_flux =
176  !SurfLayer_zhi && (bc_ptr_h[native_policy.bc_comp].hi(2) == ERFBCType::foextrap);
178  bx, domain, field, z_nd, ax, ay, detJ, cellSizeInv, mf_mx, mf_uy,
179  mf_my, mf_vx, suppress_lower_z_flux, suppress_upper_z_flux);
180  if (reflux_flx) {
182  bx, domain, xflux, yflux, zflux, field.flux_comp, *reflux_flx, field.rhs_comp,
183  z_nd, ax, ay, cellSizeInv, mf_mx, mf_my, mf_uy, mf_vx,
184  suppress_lower_z_flux, suppress_upper_z_flux);
185  }
186  } // n
187 }
void DiffusionSrcForState_T(const Box &bx, const Box &domain, int start_comp, int num_comp, const bool &rotate, const Array4< const Real > &cell_data, const Array4< const Real > &cell_prim, const Array4< Real > &cell_rhs, const Array4< Real > &xflux, const Array4< Real > &yflux, const Array4< Real > &zflux, const Array4< const Real > &z_nd, const Array4< const Real > &z_cc, const Array4< const Real > &ax, const Array4< const Real > &ay, const Array4< const Real > &, const Array4< const Real > &detJ, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, Array4< Real > &hfx_x, Array4< Real > &hfx_y, Array4< Real > &hfx_z, Array4< Real > &qfx1_x, Array4< Real > &qfx1_y, Array4< Real > &qfx1_z, Array4< Real > &qfx2_z, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const BCRec *bc_ptr, const BCRec *bc_ptr_h, const bool use_SurfLayer, const Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac, const ScalarDiffusionRefluxViews *reflux_flx)
Definition: ERF_DiffusionSrcForState_T.cpp:53
#define Rho_comp
Definition: ERF_IndexDefines.H:53
NativeScalarDiffusionPolicy ResolveNativeScalarDiffusionPolicy(const int qty_comp, const DiffChoice &choice)
Definition: ERF_NativeScalarDiffusion.H:26
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
void ScaleScalarDiffusionVerticalFlux(const amrex::Box &zbx, const amrex::Array4< amrex::Real > &raw_Fz, const int flux_comp, const amrex::Real explicit_fac)
Definition: ERF_ScalarDiffusion.H:1564
void ApplyScalarDiffusionMappedDivergence_T(const amrex::Box &bx, const amrex::Box &domain, const ScalarDiffusionFieldViews &field, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &ax, const amrex::Array4< const amrex::Real > &ay, const amrex::Array4< const amrex::Real > &detJ, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_vx, const bool suppress_lower_z_flux, const bool suppress_upper_z_flux)
Definition: ERF_ScalarDiffusion.H:1366
void SubtractTerrainMetricImplicitPart_T(const amrex::Box &bx, const amrex::Box &domain, const ScalarDiffusionFieldViews &field, const ScalarDiffusionFluxPolicy &policy, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Real implicit_fac)
Definition: ERF_ScalarDiffusion.H:1532
void AddScalarDiffusionRefluxFluxes_T(const amrex::Box &bx, const amrex::Box &domain, const amrex::Array4< const amrex::Real > &xflux, const amrex::Array4< const amrex::Real > &yflux, const amrex::Array4< const amrex::Real > &zflux, const int flux_comp, const ScalarDiffusionRefluxViews &reflux, const int state_comp, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &ax, const amrex::Array4< const amrex::Real > &ay, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_mx, const amrex::Array4< const amrex::Real > &mf_my, const amrex::Array4< const amrex::Real > &mf_uy, const amrex::Array4< const amrex::Real > &mf_vx, const bool suppress_lower_z_flux, const bool suppress_upper_z_flux)
Definition: ERF_ScalarDiffusion.H:1654
void BuildScalarDiffusionFluxes_T(const amrex::Box &bx, const amrex::Box &domain, const ScalarDiffusionFieldViews &field, const ScalarDiffusionFluxPolicy &policy, const bool rotate, const amrex::Array4< const amrex::Real > &z_nd, const amrex::Array4< const amrex::Real > &z_cc, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &mf_ux, const amrex::Array4< const amrex::Real > &mf_vy, const amrex::BCRec *bc_ptr, const int bc_comp)
Definition: ERF_ScalarDiffusion.H:1121
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ foextrap
Definition: ERF_IndexDefines.H:339
Definition: ERF_NativeScalarDiffusion.H:11
int bc_comp
Definition: ERF_NativeScalarDiffusion.H:16
bool scale_raw_vertical_flux
Definition: ERF_NativeScalarDiffusion.H:21
int rhs_comp
Definition: ERF_NativeScalarDiffusion.H:14
int scalar_comp
Definition: ERF_NativeScalarDiffusion.H:13
ScalarDiffusionCoefficients coefficients
Definition: ERF_NativeScalarDiffusion.H:12
bool is_q1
Definition: ERF_NativeScalarDiffusion.H:19
bool is_theta
Definition: ERF_NativeScalarDiffusion.H:17
int flux_comp
Definition: ERF_NativeScalarDiffusion.H:15
bool is_q2
Definition: ERF_NativeScalarDiffusion.H:20
Definition: ERF_ScalarDiffusion.H:33
int rho_comp
Definition: ERF_ScalarDiffusion.H:37
amrex::Array4< amrex::Real > xflux
Definition: ERF_ScalarDiffusion.H:39
amrex::Array4< amrex::Real > rhs
Definition: ERF_ScalarDiffusion.H:43
int rhs_comp
Definition: ERF_ScalarDiffusion.H:44
amrex::Array4< const amrex::Real > scalar
Definition: ERF_ScalarDiffusion.H:34
amrex::Array4< amrex::Real > yflux
Definition: ERF_ScalarDiffusion.H:40
int flux_comp
Definition: ERF_ScalarDiffusion.H:42
amrex::Array4< const amrex::Real > density
Definition: ERF_ScalarDiffusion.H:36
int scalar_comp
Definition: ERF_ScalarDiffusion.H:35
amrex::Array4< amrex::Real > zflux
Definition: ERF_ScalarDiffusion.H:41
amrex::Array4< const amrex::Real > mu_turb
Definition: ERF_ScalarDiffusion.H:38
Definition: ERF_ScalarDiffusion.H:92
ScalarDiffusionRawFluxDiagnostic diagnostic
Definition: ERF_ScalarDiffusion.H:96
ScalarDiffusionPrescribedFluxes prescribed
Definition: ERF_ScalarDiffusion.H:95
ScalarDiffusionCoefficientMode coefficient_mode
Definition: ERF_ScalarDiffusion.H:94
ScalarDiffusionSurfaceFaces surface
Definition: ERF_ScalarDiffusion.H:97
ScalarDiffusionCoefficients coefficients
Definition: ERF_ScalarDiffusion.H:93
bool use_z_on_side
Definition: ERF_ScalarDiffusion.H:59
bool use_y_on_bottom_z
Definition: ERF_ScalarDiffusion.H:61
amrex::Array4< const amrex::Real > x
Definition: ERF_ScalarDiffusion.H:62
amrex::Array4< const amrex::Real > z
Definition: ERF_ScalarDiffusion.H:64
bool use_x_on_side
Definition: ERF_ScalarDiffusion.H:57
bool use_x_on_bottom_z
Definition: ERF_ScalarDiffusion.H:60
amrex::Array4< const amrex::Real > y
Definition: ERF_ScalarDiffusion.H:63
bool use_y_on_side
Definition: ERF_ScalarDiffusion.H:58
amrex::Array4< amrex::Real > z
Definition: ERF_ScalarDiffusion.H:75
bool write_on_surface
Definition: ERF_ScalarDiffusion.H:74
bool enabled
Definition: ERF_ScalarDiffusion.H:73
bool implicit_terrain_metric
Whether the compact terrain-metric part of the vertical diffusion is solved implicitly.
Definition: ERF_DataStruct.H:2667
Here is the call graph for this function: