22 template<
typename InterpType_H,
typename InterpType_V>
27 const amrex::Array4<const amrex::Real>& rho_u,
28 const amrex::Array4<const amrex::Real>& rho_v,
29 const amrex::Array4<const amrex::Real>& Omega,
30 const amrex::Array4<const amrex::Real>& z_nd,
31 const amrex::Array4<const amrex::Real>& ax,
32 const amrex::Array4<const amrex::Real>& ,
33 const amrex::Array4<const amrex::Real>& az,
34 const amrex::Array4<const amrex::Real>& detJ,
35 InterpType_H interp_u_h,
36 InterpType_V interp_u_v,
37 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
38 const amrex::Array4<const amrex::Real>& mf_ux_inv,
39 const amrex::Array4<const amrex::Real>& mf_uy_inv,
40 const amrex::Array4<const amrex::Real>& mf_vx_inv)
42 amrex::Real advectionSrc;
43 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
45 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
46 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
47 amrex::Real Omega_avg_lo, Omega_avg_hi;
49 amrex::Real interp_hi(0.), interp_lo(0.);
55 rho_u_avg_hi = 0.5 * (rho_u(i+1, j, k) * mf_uy_inv(i+1,j ,0) + rho_u(i, j, k) * mf_uy_inv(i ,j ,0));
56 interp_u_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
58 rho_u_avg_lo = 0.5 * (rho_u(i-1, j, k) * mf_uy_inv(i-1,j ,0) + rho_u(i, j, k) * mf_uy_inv(i ,j ,0));
59 interp_u_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
61 amrex::Real centFluxXXNext = rho_u_avg_hi * interp_hi * 0.5 * (ax(i,j,k) + ax(i+1,j,k));
62 amrex::Real centFluxXXPrev = rho_u_avg_lo * interp_lo * 0.5 * (ax(i,j,k) + ax(i-1,j,k));
67 rho_v_avg_hi = 0.5 * (rho_v(i, j+1, k) * mf_vx_inv(i ,j+1,0) + rho_v(i-1, j+1, k) * mf_vx_inv(i-1,j+1,0));
68 interp_u_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
70 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) * mf_vx_inv(i ,j ,0) + rho_v(i-1, j , k) * mf_vx_inv(i-1,j ,0));
71 interp_u_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
79 Omega_avg_hi = 0.5 * (Omega(i, j, k+1) + Omega(i-1, j, k+1)) * 0.5 * (az(i,j,k+1) + az(i-1,j,k+1));
80 Omega_avg_lo = 0.5 * (Omega(i, j, k ) + Omega(i-1, j, k )) * 0.5 * (az(i,j,k ) + az(i-1,j,k ));
82 interp_u_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
83 interp_u_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
85 amrex::Real edgeFluxXZNext = Omega_avg_hi * interp_hi;
86 amrex::Real edgeFluxXZPrev = Omega_avg_lo * interp_lo;
90 amrex::Real mfsq = 1. / (mf_ux_inv(i,j,0) * mf_uy_inv(i,j,0));
92 advectionSrc = (centFluxXXNext - centFluxXXPrev) * dxInv * mfsq
93 + (edgeFluxXYNext - edgeFluxXYPrev) * dyInv * mfsq
94 + (edgeFluxXZNext - edgeFluxXZPrev) * dzInv;
95 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i-1,j,k));
117 template<
typename InterpType_H,
typename InterpType_V>
122 const amrex::Array4<const amrex::Real>& rho_u,
123 const amrex::Array4<const amrex::Real>& rho_v,
124 const amrex::Array4<const amrex::Real>& Omega,
125 const amrex::Array4<const amrex::Real>& z_nd,
126 const amrex::Array4<const amrex::Real>& ,
127 const amrex::Array4<const amrex::Real>& ay,
128 const amrex::Array4<const amrex::Real>& az,
129 const amrex::Array4<const amrex::Real>& detJ,
130 InterpType_H interp_v_h,
131 InterpType_V interp_v_v,
132 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
133 const amrex::Array4<const amrex::Real>& mf_uy_inv,
134 const amrex::Array4<const amrex::Real>& mf_vx_inv,
135 const amrex::Array4<const amrex::Real>& mf_vy_inv)
137 amrex::Real advectionSrc;
138 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
140 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
141 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
142 amrex::Real Omega_avg_lo, Omega_avg_hi;
144 amrex::Real interp_hi(0.), interp_lo(0.);
149 rho_u_avg_hi = 0.5 * (rho_u(i+1,j,k) * mf_uy_inv(i+1,j,0) + rho_u(i+1,j-1,k) * mf_uy_inv(i+1,j-1,0));
150 rho_u_avg_lo = 0.5 * (rho_u(i ,j,k) * mf_uy_inv(i ,j,0) + rho_u(i ,j-1,k) * mf_uy_inv(i ,j-1,0));
152 interp_v_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
153 interp_v_h.InterpolateInX(i ,j,k,0,interp_lo,rho_u_avg_lo);
161 rho_v_avg_hi = 0.5 * (rho_v(i,j,k) * mf_vx_inv(i,j,0) + rho_v(i,j+1,k) * mf_vx_inv(i,j+1,0));
162 rho_v_avg_lo = 0.5 * (rho_v(i,j,k) * mf_vx_inv(i,j,0) + rho_v(i,j-1,k) * mf_vx_inv(i,j-1,0));
164 interp_v_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
165 interp_v_h.InterpolateInY(i,j ,k,0,interp_lo,rho_v_avg_lo);
167 amrex::Real centFluxYYNext = rho_v_avg_hi * 0.5 * (ay(i,j,k) + ay(i,j+1,k)) * interp_hi;
168 amrex::Real centFluxYYPrev = rho_v_avg_lo * 0.5 * (ay(i,j,k) + ay(i,j-1,k)) * interp_lo;
173 Omega_avg_hi = 0.5 * (Omega(i, j, k+1) + Omega(i, j-1, k+1)) * 0.5 * (az(i,j,k+1) + az(i,j-1,k+1));
174 Omega_avg_lo = 0.5 * (Omega(i, j, k ) + Omega(i, j-1, k )) * 0.5 * (az(i,j,k ) + az(i,j-1,k ));
176 interp_v_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
177 interp_v_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
179 amrex::Real edgeFluxYZNext = Omega_avg_hi * interp_hi;
180 amrex::Real edgeFluxYZPrev = Omega_avg_lo * interp_lo;
184 amrex::Real mfsq = 1 / (mf_vx_inv(i,j,0) * mf_vy_inv(i,j,0));
186 advectionSrc = (edgeFluxYXNext - edgeFluxYXPrev) * dxInv * mfsq
187 + (centFluxYYNext - centFluxYYPrev) * dyInv * mfsq
188 + (edgeFluxYZNext - edgeFluxYZPrev) * dzInv;
189 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i,j-1,k));
216 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
221 const amrex::Array4<const amrex::Real>& rho_u,
222 const amrex::Array4<const amrex::Real>& rho_v,
223 const amrex::Array4<const amrex::Real>& Omega,
224 const amrex::Array4<const amrex::Real>& w,
225 const amrex::Array4<const amrex::Real>& z_nd,
226 const amrex::Array4<const amrex::Real>& ,
227 const amrex::Array4<const amrex::Real>& ,
228 const amrex::Array4<const amrex::Real>& az,
229 const amrex::Array4<const amrex::Real>& detJ,
230 InterpType_H interp_omega_h,
231 InterpType_V interp_omega_v,
232 WallInterpType interp_omega_wall,
233 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
234 const amrex::Array4<const amrex::Real>& mf_mx,
235 const amrex::Array4<const amrex::Real>& mf_my,
236 const amrex::Array4<const amrex::Real>& mf_uy_inv,
237 const amrex::Array4<const amrex::Real>& mf_vx_inv,
239 const int lo_z_face,
const int hi_z_face)
241 amrex::Real advectionSrc;
242 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
244 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
245 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
246 amrex::Real Omega_avg_lo, Omega_avg_hi;
248 amrex::Real interp_hi(0.), interp_lo(0.);
253 rho_u_avg_hi = 0.5 * (rho_u(i+1, j, k) + rho_u(i+1, j, k-1)) * mf_uy_inv(i+1,j ,0);
254 rho_u_avg_lo = 0.5 * (rho_u(i , j, k) + rho_u(i , j, k-1)) * mf_uy_inv(i ,j ,0);
256 interp_omega_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
257 interp_omega_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
265 rho_v_avg_hi = 0.5 * (rho_v(i, j+1, k) + rho_v(i, j+1, k-1)) * mf_vx_inv(i ,j+1,0);
266 interp_omega_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
268 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) + rho_v(i, j , k-1)) * mf_vx_inv(i ,j ,0);
269 interp_omega_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
278 Omega_avg_hi = (k == hi_z_face) ? Omega(i,j,k) * az(i,j,k) :
279 0.25 * (Omega(i,j,k) + Omega(i,j,k+1)) * (az(i,j,k) + az(i,j,k+1));
280 amrex::Real centFluxZZNext = Omega_avg_hi;
286 if (k == hi_z_face) {
287 centFluxZZNext *= w(i,j,k);
289 if (k == hi_z_face-1)
292 }
else if (k == hi_z_face-2 || k == lo_z_face+1) {
296 interp_omega_wall.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi,vert_adv_type);
299 interp_omega_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
301 centFluxZZNext *= interp_hi;
306 Omega_avg_lo = (k == 0) ? Omega(i,j,k) * az(i,j,k) :
307 0.25 * (Omega(i,j,k) + Omega(i,j,k-1)) * (az(i,j,k) + az(i,j,k-1));
308 amrex::Real centFluxZZPrev = Omega_avg_lo;
315 centFluxZZPrev *= w(i,j,k);
317 if (k == lo_z_face+1) {
319 }
else if (k == lo_z_face+2 || k == hi_z_face-1) {
323 interp_omega_wall.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo,vert_adv_type);
326 interp_omega_v.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo);
328 centFluxZZPrev *= interp_lo;
333 amrex::Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
335 advectionSrc = (edgeFluxZXNext - edgeFluxZXPrev) * dxInv * mfsq
336 + (edgeFluxZYNext - edgeFluxZYPrev) * dyInv * mfsq
337 + (centFluxZZNext - centFluxZZPrev) * dzInv;
339 amrex::Real denom = 0.5*(detJ(i,j,k) + detJ(i,j,k-1));
340 advectionSrc /= denom;
348 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
351 const amrex::Array4<amrex::Real>& rho_u_rhs,
352 const amrex::Array4<amrex::Real>& rho_v_rhs,
353 const amrex::Array4<amrex::Real>& rho_w_rhs,
354 const amrex::Array4<const amrex::Real>& rho_u,
355 const amrex::Array4<const amrex::Real>& rho_v,
356 const amrex::Array4<const amrex::Real>& Omega,
357 const amrex::Array4<const amrex::Real>& u,
358 const amrex::Array4<const amrex::Real>& v,
359 const amrex::Array4<const amrex::Real>& w,
360 const amrex::Array4<const amrex::Real>& z_nd,
361 const amrex::Array4<const amrex::Real>& ax,
362 const amrex::Array4<const amrex::Real>& ay,
363 const amrex::Array4<const amrex::Real>& az,
364 const amrex::Array4<const amrex::Real>& detJ,
365 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
366 const amrex::Array4<const amrex::Real>& mf_mx,
367 const amrex::Array4<const amrex::Real>& mf_ux_inv,
368 const amrex::Array4<const amrex::Real>& mf_vx_inv,
369 const amrex::Array4<const amrex::Real>& mf_my,
370 const amrex::Array4<const amrex::Real>& mf_uy_inv,
371 const amrex::Array4<const amrex::Real>& mf_vy_inv,
372 const amrex::Real upw_frac_h,
373 const amrex::Real upw_frac_v,
375 const int lo_z_face,
const int hi_z_face)
378 InterpType_H interp_u_h(u, upw_frac_h); InterpType_V interp_u_v(u, upw_frac_v);
379 InterpType_H interp_v_h(v, upw_frac_h); InterpType_V interp_v_v(v, upw_frac_v);
380 InterpType_H interp_w_h(w, upw_frac_h); InterpType_V interp_w_v(w, upw_frac_v);
381 WallInterpType interp_w_wall(w, upw_frac_v);
383 amrex::ParallelFor(bxx,
384 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
386 rho_u_rhs(i, j, k) = -
AdvectionSrcForXMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
387 interp_u_h, interp_u_v,
388 cellSizeInv, mf_ux_inv, mf_uy_inv, mf_vx_inv);
391 amrex::ParallelFor(bxy,
392 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
394 rho_v_rhs(i, j, k) = -
AdvectionSrcForYMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
395 interp_v_h, interp_v_v,
396 cellSizeInv, mf_uy_inv, mf_vx_inv, mf_vy_inv);
399 amrex::ParallelFor(bxz,
400 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
402 rho_w_rhs(i, j, k) = -
AdvectionSrcForZMom(i, j, k, rho_u, rho_v, Omega, w, z_nd, ax, ay, az, detJ,
403 interp_w_h, interp_w_v, interp_w_wall,
404 cellSizeInv, mf_mx, mf_my, mf_uy_inv, mf_vx_inv,
405 vert_adv_type, lo_z_face, hi_z_face);
412 template<
typename InterpType_H>
415 const amrex::Array4<amrex::Real>& rho_u_rhs,
416 const amrex::Array4<amrex::Real>& rho_v_rhs,
417 const amrex::Array4<amrex::Real>& rho_w_rhs,
418 const amrex::Array4<const amrex::Real>& rho_u,
419 const amrex::Array4<const amrex::Real>& rho_v,
420 const amrex::Array4<const amrex::Real>& Omega,
421 const amrex::Array4<const amrex::Real>& u,
422 const amrex::Array4<const amrex::Real>& v,
423 const amrex::Array4<const amrex::Real>& w,
424 const amrex::Array4<const amrex::Real>& z_nd,
425 const amrex::Array4<const amrex::Real>& ax,
426 const amrex::Array4<const amrex::Real>& ay,
427 const amrex::Array4<const amrex::Real>& az,
428 const amrex::Array4<const amrex::Real>& detJ,
429 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
430 const amrex::Array4<const amrex::Real>& mf_mx,
431 const amrex::Array4<const amrex::Real>& mf_ux_inv,
432 const amrex::Array4<const amrex::Real>& mf_vx_inv,
433 const amrex::Array4<const amrex::Real>& mf_my,
434 const amrex::Array4<const amrex::Real>& mf_uy_inv,
435 const amrex::Array4<const amrex::Real>& mf_vy_inv,
436 const amrex::Real upw_frac_h,
437 const amrex::Real upw_frac_v,
439 const int lo_z_face,
const int hi_z_face)
442 AdvectionSrcForMomWrapper<InterpType_H,CENTERED2,UPWINDALL>(bxx, bxy, bxz,
443 rho_u_rhs, rho_v_rhs, rho_w_rhs,
444 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
446 mf_mx, mf_ux_inv, mf_vx_inv,
447 mf_my, mf_uy_inv, mf_vy_inv,
448 upw_frac_h, upw_frac_v,
449 vert_adv_type, lo_z_face, hi_z_face);
451 AdvectionSrcForMomWrapper<InterpType_H,UPWIND3,UPWINDALL>(bxx, bxy, bxz,
452 rho_u_rhs, rho_v_rhs, rho_w_rhs,
453 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
455 mf_mx, mf_ux_inv, mf_vx_inv,
456 mf_my, mf_uy_inv, mf_vy_inv,
457 upw_frac_h, upw_frac_v,
458 vert_adv_type, lo_z_face, hi_z_face);
460 AdvectionSrcForMomWrapper<InterpType_H,CENTERED4,UPWINDALL>(bxx, bxy, bxz,
461 rho_u_rhs, rho_v_rhs, rho_w_rhs,
462 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
464 mf_mx, mf_ux_inv, mf_vx_inv,
465 mf_my, mf_uy_inv, mf_vy_inv,
466 upw_frac_h, upw_frac_v,
467 vert_adv_type, lo_z_face, hi_z_face);
469 AdvectionSrcForMomWrapper<InterpType_H,UPWIND5,UPWINDALL>(bxx, bxy, bxz,
470 rho_u_rhs, rho_v_rhs, rho_w_rhs,
471 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
473 mf_mx, mf_ux_inv, mf_vx_inv,
474 mf_my, mf_uy_inv, mf_vy_inv,
475 upw_frac_h, upw_frac_v,
476 vert_adv_type, lo_z_face, hi_z_face);
478 AdvectionSrcForMomWrapper<InterpType_H,CENTERED6,UPWINDALL>(bxx, bxy, bxz,
479 rho_u_rhs, rho_v_rhs, rho_w_rhs,
480 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
482 mf_mx, mf_ux_inv, mf_vx_inv,
483 mf_my, mf_uy_inv, mf_vy_inv,
484 upw_frac_h, upw_frac_v,
485 vert_adv_type, lo_z_face, hi_z_face);
487 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:221
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ(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:276
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK(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:231
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI(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:320