80 const bool l_use_terrain_fitted_coords = (solverChoice.
mesh_type != MeshType::ConstantDz);
82 const Box domain = geom.Domain();
83 const int domain_klo = domain.smallEnd(2);
84 const int domain_khi = domain.bigEnd(2);
86 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
91 for ( MFIter mfi(p); mfi.isValid(); ++mfi)
93 Box tbx = mfi.nodaltilebox(0);
94 Box tby = mfi.nodaltilebox(1);
95 Box tbz = mfi.nodaltilebox(2);
98 if (tbz.smallEnd(2) == domain_klo) {
101 if (tbz.bigEnd(2) == domain_khi+1) {
106 const Array4<const Real>& z_nd_arr = z_phys_nd.const_array(mfi);
107 const Array4<const Real>& z_cc_arr = z_phys_cc.const_array(mfi);
109 const Array4<const Real>& p_arr = p.const_array(mfi);
111 const Array4< Real>& gpx_arr = gradp[
GpVars::gpx].array(mfi);
112 const Array4< Real>& gpy_arr = gradp[
GpVars::gpy].array(mfi);
113 const Array4< Real>& gpz_arr = gradp[
GpVars::gpz].array(mfi);
117 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
120 Real
gpx = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
122 if (l_use_terrain_fitted_coords) {
123 Real met_h_xi = (z_cc_arr(i,j,k) - z_cc_arr(i-1,j,k)) * dxInv[0];
125 Real dz_phys_hi, dz_phys_lo;
128 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k );
129 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k );
130 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k )) / dz_phys_hi;
131 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k )) / dz_phys_lo;
132 }
else if (k==domain_khi) {
133 dz_phys_hi = z_cc_arr(i ,j,k ) - z_cc_arr(i ,j,k-1);
134 dz_phys_lo = z_cc_arr(i-1,j,k ) - z_cc_arr(i-1,j,k-1);
135 gpz_hi = (p_arr(i ,j,k ) - p_arr(i ,j,k-1)) / dz_phys_hi;
136 gpz_lo = (p_arr(i-1,j,k ) - p_arr(i-1,j,k-1)) / dz_phys_lo;
138 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k-1);
139 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k-1);
140 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k-1)) / dz_phys_hi;
141 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k-1)) / dz_phys_lo;
143 Real gpx_metric = met_h_xi * 0.5 * (gpz_hi + gpz_lo);
146 gpx_arr(i,j,k) =
gpx;
149 ParallelFor(tby, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
152 Real
gpy = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
154 if (l_use_terrain_fitted_coords) {
155 Real met_h_eta = (z_cc_arr(i,j,k) - z_cc_arr(i,j-1,k)) * dxInv[1];
157 Real dz_phys_hi, dz_phys_lo;
160 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k );
161 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k );
162 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k )) / dz_phys_hi;
163 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k )) / dz_phys_lo;
164 }
else if (k==domain_khi) {
165 dz_phys_hi = z_cc_arr(i,j ,k ) - z_cc_arr(i,j ,k-1);
166 dz_phys_lo = z_cc_arr(i,j-1,k ) - z_cc_arr(i,j-1,k-1);
167 gpz_hi = (p_arr(i,j ,k ) - p_arr(i,j ,k-1)) / dz_phys_hi;
168 gpz_lo = (p_arr(i,j-1,k ) - p_arr(i,j-1,k-1)) / dz_phys_lo;
170 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k-1);
171 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k-1);
172 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k-1)) / dz_phys_hi;
173 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k-1)) / dz_phys_lo;
175 Real gpy_metric = met_h_eta * 0.5 * (gpz_hi + gpz_lo);
178 gpy_arr(i,j,k) =
gpy;
181 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
184 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) / met_h_zeta;
192 const bool l_fitting =
false;
194 const int domain_ilo = domain.smallEnd(0);
195 const int domain_ihi = domain.bigEnd(0);
196 const int domain_jlo = domain.smallEnd(1);
197 const int domain_jhi = domain.bigEnd(1);
215 const Array4<Real>& u_p_arr = u_p.array(mfi);
216 const Array4<Real>& v_p_arr = v_p.array(mfi);
217 const Array4<Real>& w_p_arr = w_p.array(mfi);
220 Array4<const EBCellFlag> u_cflag = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
221 Array4<const Real > u_vfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
222 Array4<const Real > u_vcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
223 Array4<const Real > u_fcx = (ebfact.
get_u_const_factory())->getFaceCent()[0]->const_array(mfi);
224 Array4<const Real > u_fcy = (ebfact.
get_u_const_factory())->getFaceCent()[1]->const_array(mfi);
225 Array4<const Real > u_fcz = (ebfact.
get_u_const_factory())->getFaceCent()[2]->const_array(mfi);
228 Array4<const EBCellFlag> v_cflag = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
229 Array4<const Real > v_vfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
230 Array4<const Real > v_vcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
231 Array4<const Real > v_fcx = (ebfact.
get_v_const_factory())->getFaceCent()[0]->const_array(mfi);
232 Array4<const Real > v_fcy = (ebfact.
get_v_const_factory())->getFaceCent()[1]->const_array(mfi);
233 Array4<const Real > v_fcz = (ebfact.
get_v_const_factory())->getFaceCent()[2]->const_array(mfi);
236 Array4<const EBCellFlag> w_cflag = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
237 Array4<const Real > w_vfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
238 Array4<const Real > w_vcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
239 Array4<const Real > w_fcx = (ebfact.
get_w_const_factory())->getFaceCent()[0]->const_array(mfi);
240 Array4<const Real > w_fcy = (ebfact.
get_w_const_factory())->getFaceCent()[1]->const_array(mfi);
241 Array4<const Real > w_fcz = (ebfact.
get_w_const_factory())->getFaceCent()[2]->const_array(mfi);
247 const Box tbx_g1 = amrex::grow(tbx,1);
248 const Box tby_g1 = amrex::grow(tby,1);
249 const Box tbz_g1 = amrex::grow(tbz,1);
251 int tbx_g1_ilo = tbx_g1.smallEnd(0);
252 int tby_g1_jlo = tby_g1.smallEnd(1);
253 int tbz_g1_klo = tbz_g1.smallEnd(2);
254 int tbx_g1_ihi = tbx_g1.bigEnd(0);
255 int tby_g1_jhi = tby_g1.bigEnd(1);
256 int tbz_g1_khi = tbz_g1.bigEnd(2);
261 ParallelFor(tbx_g1, tby_g1, tbz_g1,
262 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
264 if (u_vfrac(i,j,k) > 0.0) {
266 if (i == tbx_g1_ilo) {
267 u_p_arr(i,j,k) = p_arr(i,j,k);
268 }
else if (i == tbx_g1_ihi) {
269 u_p_arr(i,j,k) = p_arr(i-1,j,k);
271 u_p_arr(i,j,k) = 0.5 * ( p_arr(i-1,j,k) + p_arr(i,j,k) );
274 u_p_arr(i,j,k) = 0.0;
277 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
279 if (u_vfrac(i,j,k) > 0.0) {
281 if (j == tby_g1_jlo) {
282 v_p_arr(i,j,k) = p_arr(i,j,k);
283 }
else if (j == tby_g1_jhi) {
284 v_p_arr(i,j,k) = p_arr(i,j-1,k);
286 v_p_arr(i,j,k) = 0.5 * ( p_arr(i,j-1,k) + p_arr(i,j,k) );
290 v_p_arr(i,j,k) = 0.0;
293 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
295 if (w_vfrac(i,j,k) > 0.0) {
296 if (k == tbz_g1_klo) {
297 w_p_arr(i,j,k) = p_arr(i,j,k);
298 }
else if (k == tbz_g1_khi) {
299 w_p_arr(i,j,k) = p_arr(i,j,k-1);
301 w_p_arr(i,j,k) = 0.5 * ( p_arr(i,j,k-1) + p_arr(i,j,k) );
304 w_p_arr(i,j,k) = 0.0;
310 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
312 if (u_vfrac(i,j,k) > 0.0) {
313 GpuArray<Real,AMREX_SPACEDIM> slopes_eb;
315 slopes_eb = amrex_calc_slopes_extdir_eb(
316 i, j, k, n, u_p_arr, u_vcent, u_vfrac,
317 AMREX_D_DECL(u_fcx,u_fcy,u_fcz),u_cflag,
318 AMREX_D_DECL(extdir_ilo, extdir_jlo, extdir_klo),
319 AMREX_D_DECL(extdir_ihi, extdir_jhi, extdir_khi),
320 AMREX_D_DECL(domain_ilo, domain_jlo, domain_klo),
321 AMREX_D_DECL(domain_ihi, domain_jhi, domain_khi),
324 gpx_arr(i,j,k) = slopes_eb[0];
326 gpx_arr(i,j,k) = 0.0;
330 ParallelFor(tby, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
334 if (v_vfrac(i,j,k) > 0.0) {
335 GpuArray<Real,AMREX_SPACEDIM> slopes_eb;
337 slopes_eb = amrex_calc_slopes_extdir_eb(
338 i, j, k, n, v_p_arr, v_vcent, v_vfrac,
339 AMREX_D_DECL(v_fcx,v_fcy,v_fcz),v_cflag,
340 AMREX_D_DECL(extdir_ilo, extdir_jlo, extdir_klo),
341 AMREX_D_DECL(extdir_ihi, extdir_jhi, extdir_khi),
342 AMREX_D_DECL(domain_ilo, domain_jlo, domain_klo),
343 AMREX_D_DECL(domain_ihi, domain_jhi, domain_khi),
346 gpy_arr(i,j,k) = slopes_eb[1];
348 gpy_arr(i,j,k) = 0.0;
352 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
356 if (w_vfrac(i,j,k) > 0.0) {
357 GpuArray<Real,AMREX_SPACEDIM> slopes_eb;
359 slopes_eb = amrex_calc_slopes_extdir_eb(
360 i, j, k, n, w_p_arr, w_vcent, w_vfrac,
361 AMREX_D_DECL(w_fcx,w_fcy,w_fcz),w_cflag,
362 AMREX_D_DECL(extdir_ilo, extdir_jlo, extdir_klo),
363 AMREX_D_DECL(extdir_ihi, extdir_jhi, extdir_khi),
364 AMREX_D_DECL(domain_ilo, domain_jlo, domain_klo),
365 AMREX_D_DECL(domain_ihi, domain_jhi, domain_khi),
368 gpz_arr(i,j,k) = slopes_eb[2];
370 gpz_arr(i,j,k) = 0.0;
378 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
380 if (u_vfrac(i,j,k) > 0.0) {
381 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
383 gpx_arr(i,j,k) = 0.0;
387 ParallelFor(tby, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
389 if (v_vfrac(i,j,k) > 0.0) {
390 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
392 gpy_arr(i,j,k) = 0.0;
396 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
398 if (w_vfrac(i,j,k) > 0.0) {
399 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) ;
401 gpz_arr(i,j,k) = 0.0;
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:182
eb_aux_ const * get_w_const_factory() const noexcept
Definition: ERF_EB.H:56
eb_aux_ const * get_v_const_factory() const noexcept
Definition: ERF_EB.H:55
eb_aux_ const * get_u_const_factory() const noexcept
Definition: ERF_EB.H:54
@ hoextrap
Definition: ERF_IndexDefines.H:216
@ ext_dir
Definition: ERF_IndexDefines.H:209
@ gpz
Definition: ERF_IndexDefines.H:152
@ gpy
Definition: ERF_IndexDefines.H:151
@ gpx
Definition: ERF_IndexDefines.H:150
static MeshType mesh_type
Definition: ERF_DataStruct.H:708
static TerrainType terrain_type
Definition: ERF_DataStruct.H:702