ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_DiffusionSrcForState_N.cpp File Reference
#include "ERF_Diffusion.H"
#include "ERF_EddyViscosity.H"
#include "ERF_PBLModels.H"
#include "ERF_SetupDiff.H"
#include "ERF_AddTKESources.H"
#include "ERF_AddQKESources.H"
Include dependency graph for ERF_DiffusionSrcForState_N.cpp:

Functions

void DiffusionSrcForState_N (const Box &bx, const Box &domain, int start_comp, int num_comp, const Array4< const Real > &u, const Array4< const Real > &v, 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 GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &SmnSmn_a, 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, Array4< Real > &diss, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const Array4< const Real > &tm_arr, const GpuArray< Real, AMREX_SPACEDIM > grav_gpu, const BCRec *bc_ptr, const bool use_SurfLayer, const Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac)
 

Function Documentation

◆ DiffusionSrcForState_N()

void DiffusionSrcForState_N ( const Box &  bx,
const Box &  domain,
int  start_comp,
int  num_comp,
const Array4< const Real > &  u,
const Array4< const Real > &  v,
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 GpuArray< Real, AMREX_SPACEDIM > &  cellSizeInv,
const Array4< const Real > &  SmnSmn_a,
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,
Array4< Real > &  diss,
const Array4< const Real > &  mu_turb,
const SolverChoice solverChoice,
const int  level,
const Array4< const Real > &  tm_arr,
const GpuArray< Real, AMREX_SPACEDIM >  grav_gpu,
const BCRec *  bc_ptr,
const bool  use_SurfLayer,
const Vector< std::unique_ptr< SurfaceLayer >> &  SurfLayer,
const Real  implicit_fac 
)

Function for computing the scalar RHS for diffusion operator without terrain.

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]uvelocity in x-dir
[in]vvelocity in y-dir
[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]cellSizeInvinverse cell size array
[in]SmnSmn_astrain rate magnitude
[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_zheat flux in z-dir
[in,out]qfx1_zheat flux in z-dir
[out]qfx2_zheat flux in z-dir
[in]dissdissipation of TKE
[in]mu_turbturbulent viscosity
[in]solverChoicecontainer of solver and diffusion parameters
[in]levelAMR level
[in]tm_arrtheta mean array
[in]grav_gpugravity vector
[in]bc_ptrcontainer with boundary conditions
[in]use_SurfLayerwhether we have turned on subgrid diffusion
[in]implicit_fac– factor of implicitness for vertical differences only
79 {
80  BL_PROFILE_VAR("DiffusionSrcForState_N()",DiffusionSrcForState_N);
81 
82  const Real explicit_fac = one - implicit_fac;
83 
84 #include "ERF_SetupDiff.H"
85  Real l_abs_g = std::abs(grav_gpu[2]);
86 
87  const Real dz_inv = cellSizeInv[2];
88 
89  for (int n(0); n<num_comp; ++n) {
90  const int qty_index = start_comp + n;
91 
92  // Constant alpha & Turb model
93  if (l_consA && l_turb) {
94  ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
95  {
96  const int prim_index = qty_index - 1;
97  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
98 
99  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i-1, j, k, Rho_comp) );
100  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
101  rhoAlpha += myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_scal_index])
102  + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_scal_index]) );
103 
104  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
105  BCVars::RhoScalar_bc_comp : qty_index;
106  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
107 
108  bool ext_dir_on_xlo = ( (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir) ||
109  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_prim) ||
110  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_upwind && u(dom_lo.x,j,k) >= zero) );
111  ext_dir_on_xlo &= (i == dom_lo.x);
112 
113  bool ext_dir_on_xhi = ( (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir) ||
114  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_prim) ||
115  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_upwind && u(dom_hi.x+1,j,k) <= zero) );
116  ext_dir_on_xhi &= (i == dom_hi.x+1);
117  bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
118  bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
119 
120  if (ext_dir_on_xlo) {
121  xflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i-1, j, k, prim_index)
122  + three * cell_prim(i , j, k, prim_index)
123  - (one/three) * cell_prim(i+1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
124  } else if (ext_dir_on_xhi) {
125  xflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i , j, k, prim_index)
126  - three * cell_prim(i-1, j, k, prim_index)
127  + (one/three) * cell_prim(i-2, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
128  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoTheta_comp)) {
129  xflux(i,j,k) = hfx_x(i,j,k);
130  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoQ1_comp)) {
131  xflux(i,j,k) = qfx1_x(i,j,k);
132  } else {
133  xflux(i,j,k) = -rhoAlpha * ( cell_prim(i , j, k, prim_index)
134  - cell_prim(i-1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
135  }
136 
137  });
138  ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
139  {
140  const int prim_index = qty_index - 1;
141  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
142 
143  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j-1, k, Rho_comp) );
144  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
145  rhoAlpha += myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_scal_index])
146  + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_scal_index]) );
147 
148  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
149  BCVars::RhoScalar_bc_comp : qty_index;
150  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
151  bool ext_dir_on_ylo = ( (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir) ||
152  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_prim) ||
153  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_upwind && v(i,dom_lo.y,k) >= zero) );
154  ext_dir_on_ylo &= (j == dom_lo.y);
155  bool ext_dir_on_yhi = ( (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir) ||
156  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_prim) ||
157  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_upwind && v(i,dom_hi.y+1,k) <= zero) );
158  ext_dir_on_yhi &= (j == dom_hi.y+1);
159 
160  bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
161  bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
162  if (ext_dir_on_ylo) {
163  yflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j-1, k, prim_index)
164  + three * cell_prim(i, j , k, prim_index)
165  - (one/three) * cell_prim(i, j+1, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
166  } else if (ext_dir_on_yhi) {
167  yflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j , k, prim_index)
168  - three * cell_prim(i, j-1, k, prim_index)
169  + (one/three) * cell_prim(i, j-2, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
170  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoTheta_comp)) {
171  yflux(i,j,k) = hfx_y(i,j,k);
172  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoQ1_comp)) {
173  yflux(i,j,k) = qfx1_y(i,j,k);
174  } else {
175  yflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j-1, k, prim_index)) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
176  }
177 
178  });
179  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
180  {
181  const int prim_index = qty_index - 1;
182  const int prim_scal_index = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ? PrimScalar_comp : prim_index;
183 
184  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j, k-1, Rho_comp) );
185  Real rhoAlpha = rhoFace * d_alpha_eff[prim_scal_index];
186  rhoAlpha += myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_scal_index])
187  + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_scal_index]) );
188 
189  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
190  BCVars::RhoScalar_bc_comp : qty_index;
191  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
192 
193  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
194  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
195  && k == dom_lo.z);
196  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
197  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
198  && k == dom_hi.z+1);
199  bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
200  bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
201 
202  if (ext_dir_on_zlo) {
203  zflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j, k-1, prim_index)
204  + three * cell_prim(i, j, k , prim_index)
205  - (one/three) * cell_prim(i, j, k+1, prim_index) ) * dz_inv;
206  } else if (ext_dir_on_zhi) {
207  zflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j, k , prim_index)
208  - three * cell_prim(i, j, k-1, prim_index)
209  + (one/three) * cell_prim(i, j, k-2, prim_index) ) * dz_inv;
210  } else if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
211  if (qty_index == RhoTheta_comp) {
212  zflux(i,j,k) = hfx_z(i,j,k);
213  } else if (qty_index == RhoQ1_comp) {
214  zflux(i,j,k) = qfx1_z(i,j,k);
215  } else {
216  zflux(i,j,k) = zero;
217  }
218  } else {
219  zflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index)) * dz_inv;
220  }
221 
222  if (qty_index == RhoTheta_comp) {
223  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
224  hfx_z(i,j,k) = zflux(i,j,k);
225  }
226  } else if (qty_index == RhoQ1_comp) {
227  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
228  qfx1_z(i,j,k) = zflux(i,j,k);
229  }
230  } else if (qty_index == RhoQ2_comp) {
231  qfx2_z(i,j,k) = zflux(i,j,k);
232  }
233  });
234  // Constant rho*alpha & Turb model
235  } else if (l_turb) {
236  ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
237  {
238  const int prim_index = qty_index - 1;
239 
240  Real rhoAlpha = d_alpha_eff[prim_index];
241  rhoAlpha += myhalf * ( mu_turb(i , j, k, d_eddy_diff_idx[prim_index])
242  + mu_turb(i-1, j, k, d_eddy_diff_idx[prim_index]) );
243 
244  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
245  BCVars::RhoScalar_bc_comp : qty_index;
246  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
247 
248  bool ext_dir_on_xlo = ( (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir) ||
249  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_prim) ||
250  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_upwind && u(dom_lo.x,j,k) >= zero) );
251  ext_dir_on_xlo &= (i == dom_lo.x);
252 
253  bool ext_dir_on_xhi = ( (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir) ||
254  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_prim) ||
255  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_upwind && u(dom_hi.x+1,j,k) <= zero) );
256  ext_dir_on_xhi &= (i == dom_hi.x+1);
257 
258  bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
259  bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
260  if (ext_dir_on_xlo) {
261  xflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i-1, j, k, prim_index)
262  + three * cell_prim(i , j, k, prim_index)
263  - (one/three) * cell_prim(i+1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
264  } else if (ext_dir_on_xhi) {
265  xflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i , j, k, prim_index)
266  - three * cell_prim(i-1, j, k, prim_index)
267  + (one/three) * cell_prim(i-2, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
268  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoTheta_comp)) {
269  xflux(i,j,k) = hfx_x(i,j,k);
270  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoQ1_comp)) {
271  xflux(i,j,k) = qfx1_x(i,j,k);
272  } else {
273  xflux(i,j,k) = -rhoAlpha * ( cell_prim(i , j, k, prim_index)
274  - cell_prim(i-1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
275  }
276 
277  });
278  ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
279  {
280  const int prim_index = qty_index - 1;
281 
282  Real rhoAlpha = d_alpha_eff[prim_index];
283  rhoAlpha += myhalf * ( mu_turb(i, j , k, d_eddy_diff_idy[prim_index])
284  + mu_turb(i, j-1, k, d_eddy_diff_idy[prim_index]) );
285 
286  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
287  BCVars::RhoScalar_bc_comp : qty_index;
288  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
289 
290  bool ext_dir_on_ylo = ( (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir) ||
291  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_prim) ||
292  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_upwind && v(i,dom_lo.y,k) >= zero) );
293  ext_dir_on_ylo &= (j == dom_lo.y);
294 
295  bool ext_dir_on_yhi = ( (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir) ||
296  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_prim) ||
297  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_upwind && v(i,dom_hi.y+1,k) <= zero) );
298  ext_dir_on_yhi &= (j == dom_hi.y+1);
299 
300  bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
301  bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
302  if (ext_dir_on_ylo) {
303  yflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j-1, k, prim_index)
304  + three * cell_prim(i, j , k, prim_index)
305  - (one/three) * cell_prim(i, j+1, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
306  } else if (ext_dir_on_yhi) {
307  yflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j , k, prim_index)
308  - three * cell_prim(i, j-1, k, prim_index)
309  + (one/three) * cell_prim(i, j-2, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
310  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoTheta_comp)) {
311  yflux(i,j,k) = hfx_y(i,j,k);
312  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoQ1_comp)) {
313  yflux(i,j,k) = qfx1_y(i,j,k);
314  } else {
315  yflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j-1, k, prim_index)) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
316  }
317 
318  });
319  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
320  {
321  const int prim_index = qty_index - 1;
322 
323  Real rhoAlpha = d_alpha_eff[prim_index];
324  rhoAlpha += myhalf * ( mu_turb(i, j, k , d_eddy_diff_idz[prim_index])
325  + mu_turb(i, j, k-1, d_eddy_diff_idz[prim_index]) );
326 
327  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
328  BCVars::RhoScalar_bc_comp : qty_index;
329  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
330  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
331  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
332  && k == dom_lo.z);
333  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
334  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
335  && k == dom_hi.z+1);
336  bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
337  bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
338 
339  if (ext_dir_on_zlo) {
340  zflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j, k-1, prim_index)
341  + three * cell_prim(i, j, k , prim_index)
342  - (one/three) * cell_prim(i, j, k+1, prim_index) ) * dz_inv;
343  } else if (ext_dir_on_zhi) {
344  zflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j, k , prim_index)
345  - three * cell_prim(i, j, k-1, prim_index)
346  + (one/three) * cell_prim(i, j, k-2, prim_index) ) * dz_inv;
347  } else if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
348  if (qty_index == RhoTheta_comp) {
349  zflux(i,j,k) = hfx_z(i,j,k);
350  } else if (qty_index == RhoQ1_comp) {
351  zflux(i,j,k) = qfx1_z(i,j,k);
352  } else {
353  zflux(i,j,k) = zero;
354  }
355  } else {
356  zflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index)) * dz_inv;
357  }
358 
359  if (qty_index == RhoTheta_comp) {
360  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
361  hfx_z(i,j,k) = zflux(i,j,k);
362  }
363  } else if (qty_index == RhoQ1_comp) {
364  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
365  qfx1_z(i,j,k) = zflux(i,j,k);
366  }
367  } else if (qty_index == RhoQ2_comp) {
368  qfx2_z(i,j,k) = zflux(i,j,k);
369  }
370  });
371  // Constant alpha & no LES/PBL model
372  } else if(l_consA) {
373  ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
374  {
375  const int prim_index = qty_index - 1;
376 
377  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i-1, j, k, Rho_comp) );
378  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
379 
380  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
381  BCVars::RhoScalar_bc_comp : qty_index;
382  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
383 
384  bool ext_dir_on_xlo = ( (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir) ||
385  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_prim) ||
386  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_upwind && u(dom_lo.x,j,k) >= zero) );
387  ext_dir_on_xlo &= (i == dom_lo.x);
388 
389  bool ext_dir_on_xhi = ( (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir) ||
390  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_prim) ||
391  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_upwind && u(dom_hi.x+1,j,k) <= zero) );
392  ext_dir_on_xhi &= (i == dom_hi.x+1);
393  bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
394  bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
395 
396  if (ext_dir_on_xlo) {
397  xflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i-1, j, k, prim_index)
398  + three * cell_prim(i , j, k, prim_index)
399  - (one/three) * cell_prim(i+1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
400  } else if (ext_dir_on_xhi) {
401  xflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i , j, k, prim_index)
402  - three * cell_prim(i-1, j, k, prim_index)
403  + (one/three) * cell_prim(i-2, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
404  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoTheta_comp)) {
405  xflux(i,j,k) = hfx_x(i,j,k);
406  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoQ1_comp)) {
407  xflux(i,j,k) = qfx1_x(i,j,k);
408  } else {
409  xflux(i,j,k) = -rhoAlpha * ( cell_prim(i , j, k, prim_index)
410  - cell_prim(i-1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
411  }
412 
413  });
414  ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
415  {
416  const int prim_index = qty_index - 1;
417 
418  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j-1, k, Rho_comp) );
419  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
420 
421  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
422  BCVars::RhoScalar_bc_comp : qty_index;
423  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
424 
425  bool ext_dir_on_ylo = ( (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir) ||
426  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_prim) ||
427  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_upwind && v(i,dom_lo.y,k) >= zero) );
428  ext_dir_on_ylo &= (j == dom_lo.y);
429 
430  bool ext_dir_on_yhi = ( (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir) ||
431  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_prim) ||
432  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_upwind && v(i,dom_hi.y+1,k) <= zero) );
433  ext_dir_on_yhi &= (j == dom_hi.y+1);
434  bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
435  bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
436 
437  if (ext_dir_on_ylo) {
438  yflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j-1, k, prim_index)
439  + three * cell_prim(i, j , k, prim_index)
440  - (one/three) * cell_prim(i, j+1, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
441  } else if (ext_dir_on_yhi) {
442  yflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j , k, prim_index)
443  - three * cell_prim(i, j-1, k, prim_index)
444  + (one/three) * cell_prim(i, j-2, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
445  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoTheta_comp)) {
446  yflux(i,j,k) = hfx_y(i,j,k);
447  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoQ1_comp)) {
448  yflux(i,j,k) = qfx1_y(i,j,k);
449  } else {
450  yflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j-1, k, prim_index)) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
451  }
452 
453  });
454  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
455  {
456  const int prim_index = qty_index - 1;
457 
458  Real rhoFace = myhalf * ( cell_data(i, j, k, Rho_comp) + cell_data(i, j, k-1, Rho_comp) );
459  Real rhoAlpha = rhoFace * d_alpha_eff[prim_index];
460 
461  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
462  BCVars::RhoScalar_bc_comp : qty_index;
463  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
464  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
465  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
466  && k == dom_lo.z);
467  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
468  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
469  && k == dom_hi.z+1);
470  bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
471  bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
472 
473  if (ext_dir_on_zlo) {
474  zflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j, k-1, prim_index)
475  + three * cell_prim(i, j, k , prim_index)
476  - (one/three) * cell_prim(i, j, k+1, prim_index) ) * dz_inv;
477  } else if (ext_dir_on_zhi) {
478  zflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j, k , prim_index)
479  - three * cell_prim(i, j, k-1, prim_index)
480  + (one/three) * cell_prim(i, j, k-2, prim_index) ) * dz_inv;
481  } else if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
482  if (qty_index == RhoTheta_comp) {
483  zflux(i,j,k) = hfx_z(i,j,k);
484  } else if (qty_index == RhoQ1_comp) {
485  zflux(i,j,k) = qfx1_z(i,j,k);
486  } else {
487  zflux(i,j,k) = zero;
488  }
489  } else {
490  zflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index)) * dz_inv;
491  }
492 
493  if (qty_index == RhoTheta_comp) {
494  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
495  hfx_z(i,j,k) = zflux(i,j,k);
496  }
497  } else if (qty_index == RhoQ1_comp) {
498  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
499  qfx1_z(i,j,k) = zflux(i,j,k);
500  }
501  } else if (qty_index == RhoQ2_comp) {
502  qfx2_z(i,j,k) = zflux(i,j,k);
503  }
504  });
505  // Constant rho*alpha & no LES/PBL model
506  } else {
507  ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
508  {
509  const int prim_index = qty_index - 1;
510 
511  Real rhoAlpha = d_alpha_eff[prim_index];
512 
513  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
514  BCVars::RhoScalar_bc_comp : qty_index;
515  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
516 
517  bool ext_dir_on_xlo = ( (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir) ||
518  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_prim) ||
519  (bc_ptr[bc_comp].lo(0) == ERFBCType::ext_dir_upwind && u(dom_lo.x,j,k) >= zero) );
520  ext_dir_on_xlo &= (i == dom_lo.x);
521 
522  bool ext_dir_on_xhi = ( (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir) ||
523  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_prim) ||
524  (bc_ptr[bc_comp].hi(0) == ERFBCType::ext_dir_upwind && u(dom_hi.x+1,j,k) <= zero) );
525  ext_dir_on_xhi &= (i == dom_hi.x+1);
526  bool SurfLayer_on_xlo = ( SurfLayer_xlo && i == dom_lo.x);
527  bool SurfLayer_on_xhi = ( SurfLayer_xhi && i == dom_hi.x + 1);
528 
529  if (ext_dir_on_xlo) {
530  xflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i-1, j, k, prim_index)
531  + three * cell_prim(i , j, k, prim_index)
532  - (one/three) * cell_prim(i+1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
533  } else if (ext_dir_on_xhi) {
534  xflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i , j, k, prim_index)
535  - three * cell_prim(i-1, j, k, prim_index)
536  + (one/three) * cell_prim(i-2, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
537  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoTheta_comp)) {
538  xflux(i,j,k) = hfx_x(i,j,k);
539  } else if ((SurfLayer_on_xlo || SurfLayer_on_xhi) && (qty_index == RhoQ1_comp)) {
540  xflux(i,j,k) = qfx1_x(i,j,k);
541  } else {
542  xflux(i,j,k) = -rhoAlpha * ( cell_prim(i , j, k, prim_index)
543  - cell_prim(i-1, j, k, prim_index) ) * dx_inv * mf_ux(i,j,0)/mf_uy(i,j,0);
544  }
545 
546  });
547  ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
548  {
549  const int prim_index = qty_index - 1;
550 
551  Real rhoAlpha = d_alpha_eff[prim_index];
552 
553  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
554  BCVars::RhoScalar_bc_comp : qty_index;
555  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
556 
557  bool ext_dir_on_ylo = ( (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir) ||
558  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_prim) ||
559  (bc_ptr[bc_comp].lo(1) == ERFBCType::ext_dir_upwind && v(i,dom_lo.y,k) >= zero) );
560  ext_dir_on_ylo &= (j == dom_lo.y);
561 
562  bool ext_dir_on_yhi = ( (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir) ||
563  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_prim) ||
564  (bc_ptr[bc_comp].hi(1) == ERFBCType::ext_dir_upwind && v(i,dom_hi.y+1,k) <= zero) );
565  ext_dir_on_yhi &= (j == dom_hi.y+1);
566  bool SurfLayer_on_ylo = ( SurfLayer_ylo && j == dom_lo.y);
567  bool SurfLayer_on_yhi = ( SurfLayer_yhi && j == dom_hi.y + 1);
568 
569  if (ext_dir_on_ylo) {
570  yflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j-1, k, prim_index)
571  + three * cell_prim(i, j , k, prim_index)
572  - (one/three) * cell_prim(i, j+1, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
573  } else if (ext_dir_on_yhi) {
574  yflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j , k, prim_index)
575  - three * cell_prim(i, j-1, k, prim_index)
576  + (one/three) * cell_prim(i, j-2, k, prim_index) ) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
577  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoTheta_comp)) {
578  yflux(i,j,k) = hfx_y(i,j,k);
579  } else if ((SurfLayer_on_ylo || SurfLayer_on_yhi) && (qty_index == RhoQ1_comp)) {
580  yflux(i,j,k) = qfx1_y(i,j,k);
581  } else {
582  yflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j-1, k, prim_index)) * dy_inv * mf_vy(i,j,0)/mf_vx(i,j,0);
583  }
584 
585  });
586  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
587  {
588  const int prim_index = qty_index - 1;
589 
590  Real rhoAlpha = d_alpha_eff[prim_index];
591 
592  int bc_comp = (qty_index >= RhoScalar_comp && qty_index < RhoScalar_comp+NSCALARS) ?
593  BCVars::RhoScalar_bc_comp : qty_index;
594  if (bc_comp > BCVars::RhoScalar_bc_comp) bc_comp -= (NSCALARS-1);
595  bool ext_dir_on_zlo = ( ((bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir) ||
596  (bc_ptr[bc_comp].lo(2) == ERFBCType::ext_dir_prim))
597  && k == dom_lo.z);
598  bool ext_dir_on_zhi = ( ((bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir) ||
599  (bc_ptr[bc_comp].hi(2) == ERFBCType::ext_dir_prim))
600  && k == dom_hi.z+1);
601  bool SurfLayer_on_zlo = ( SurfLayer_zlo && k == dom_lo.z);
602  bool SurfLayer_on_zhi = ( SurfLayer_zhi && k == dom_hi.z + 1);
603 
604  if (ext_dir_on_zlo) {
605  zflux(i,j,k) = -rhoAlpha * ( -(Real(8.)/three) * cell_prim(i, j, k-1, prim_index)
606  + three * cell_prim(i, j, k , prim_index)
607  - (one/three) * cell_prim(i, j, k+1, prim_index) ) * dz_inv;
608  } else if (ext_dir_on_zhi) {
609  zflux(i,j,k) = -rhoAlpha * ( (Real(8.)/three) * cell_prim(i, j, k , prim_index)
610  - three * cell_prim(i, j, k-1, prim_index)
611  + (one/three) * cell_prim(i, j, k-2, prim_index) ) * dz_inv;
612  } else if (SurfLayer_on_zlo || SurfLayer_on_zhi) {
613  if (qty_index == RhoTheta_comp) {
614  zflux(i,j,k) = hfx_z(i,j,k);
615  } else if (qty_index == RhoQ1_comp) {
616  zflux(i,j,k) = qfx1_z(i,j,k);
617  } else {
618  zflux(i,j,k) = zero;
619  }
620  } else {
621  zflux(i,j,k) = -rhoAlpha * (cell_prim(i, j, k, prim_index) - cell_prim(i, j, k-1, prim_index)) * dz_inv;
622  }
623 
624  if (qty_index == RhoTheta_comp) {
625  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
626  hfx_z(i,j,k) = zflux(i,j,k);
627  }
628  } else if (qty_index == RhoQ1_comp) {
629  if (!(SurfLayer_on_zlo || SurfLayer_on_zhi)) {
630  qfx1_z(i,j,k) = zflux(i,j,k);
631  }
632  } else if (qty_index == RhoQ2_comp) {
633  qfx2_z(i,j,k) = zflux(i,j,k);
634  }
635  });
636  }
637 
638  // This allows us to do semi-implicit discretization of the vertical diffusive terms
639  if (qty_index == RhoTheta_comp ||
640  qty_index == RhoKE_comp ||
641  qty_index == RhoQ1_comp) {
642  ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
643  {
644  zflux(i,j,k) *= explicit_fac;
645  });
646  }
647 
648  // Use fluxes to compute RHS
649  ParallelFor(bx,[=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
650  {
651  Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
652  cell_rhs(i,j,k,qty_index) -= (xflux(i+1,j ,k ) - xflux(i, j, k)) * dx_inv * mfsq // Diffusive flux in x-dir
653  +(yflux(i ,j+1,k ) - yflux(i, j, k)) * dy_inv * mfsq // Diffusive flux in y-dir
654  +(zflux(i ,j ,k+1) - zflux(i, j, k)) * dz_inv; // Diffusive flux in z-dir
655  });
656  } // n
657 
658  const PBLDerivativeDzInv_N pbl_derivative_dz_inv{cellSizeInv[2]};
659 #include "ERF_AddTKESources.H"
660 #include "ERF_AddQKESources.H"
661 }
void DiffusionSrcForState_N(const Box &bx, const Box &domain, int start_comp, int num_comp, const Array4< const Real > &u, const Array4< const Real > &v, 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 GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &SmnSmn_a, 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, Array4< Real > &diss, const Array4< const Real > &mu_turb, const SolverChoice &solverChoice, const int level, const Array4< const Real > &tm_arr, const GpuArray< Real, AMREX_SPACEDIM > grav_gpu, const BCRec *bc_ptr, const bool use_SurfLayer, const Vector< std::unique_ptr< SurfaceLayer >> &SurfLayer, const Real implicit_fac)
Definition: ERF_DiffusionSrcForState_N.cpp:44
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:43
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:46
#define NSCALARS
Definition: ERF_IndexDefines.H:16
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
#define PrimScalar_comp
Definition: ERF_IndexDefines.H:60
#define RhoKE_comp
Definition: ERF_IndexDefines.H:41
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real three
Definition: ERF_NumericalConstants.H:32
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ RhoScalar_bc_comp
Definition: ERF_IndexDefines.H:93
@ ext_dir
Definition: ERF_IndexDefines.H:297
@ ext_dir_prim
Definition: ERF_IndexDefines.H:300
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:305
Functor for inverse vertical spacings with constant grid spacing.
Definition: ERF_PBLModels.H:417
Here is the call graph for this function: