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)
43 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
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 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));
58 interp_u_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
59 interp_u_h.InterpolateInX(i ,j,k,0,interp_lo,rho_u_avg_lo);
62 amrex::Real centFluxXXNext = rho_u_avg_hi * interp_hi * 0.5 * (ax(i,j,k) + ax(i+1,j,k));
63 amrex::Real centFluxXXPrev = rho_u_avg_lo * interp_lo * 0.5 * (ax(i,j,k) + ax(i-1,j,k));
69 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));
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));
72 interp_u_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
73 interp_u_h.InterpolateInY(i,j ,k,0,interp_lo,rho_v_avg_lo);
82 Omega_avg_hi = 0.5 * (Omega(i, j, k+1) + Omega(i-1, j, k+1));
83 Omega_avg_lo = 0.5 * (Omega(i, j, k ) + Omega(i-1, j, k ));
85 interp_u_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
86 interp_u_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
88 amrex::Real edgeFluxXZNext = Omega_avg_hi * interp_hi * 0.5 * (az(i, j, k+1) + az(i-1, j, k+1));
89 amrex::Real edgeFluxXZPrev = Omega_avg_lo * interp_lo * 0.5 * (az(i, j, k ) + az(i-1, j, k ));
93 amrex::Real mfsq = 1. / (mf_ux_inv(i,j,0) * mf_uy_inv(i,j,0));
95 advectionSrc = (centFluxXXNext - centFluxXXPrev) * dxInv * mfsq
96 + (edgeFluxXYNext - edgeFluxXYPrev) * dyInv * mfsq
97 + (edgeFluxXZNext - edgeFluxXZPrev) * dzInv;
98 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i-1,j,k));
120 template<
typename InterpType_H,
typename InterpType_V>
125 const amrex::Array4<const amrex::Real>& rho_u,
126 const amrex::Array4<const amrex::Real>& rho_v,
127 const amrex::Array4<const amrex::Real>& Omega,
128 const amrex::Array4<const amrex::Real>& z_nd,
129 const amrex::Array4<const amrex::Real>& ,
130 const amrex::Array4<const amrex::Real>& ay,
131 const amrex::Array4<const amrex::Real>& az,
132 const amrex::Array4<const amrex::Real>& detJ,
133 InterpType_H interp_v_h,
134 InterpType_V interp_v_v,
135 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
136 const amrex::Array4<const amrex::Real>& mf_uy_inv,
137 const amrex::Array4<const amrex::Real>& mf_vx_inv,
138 const amrex::Array4<const amrex::Real>& mf_vy_inv)
141 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
153 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));
154 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));
156 interp_v_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
157 interp_v_h.InterpolateInX(i ,j,k,0,interp_lo,rho_u_avg_lo);
166 rho_v_avg_hi = 0.5 * (rho_v(i, j+1, k) * mf_vx_inv(i, j+1, 0) + rho_v(i, j, k) * mf_vx_inv(i, j, 0));
167 rho_v_avg_lo = 0.5 * (rho_v(i, j-1, k) * mf_vx_inv(i, j-1, 0) + rho_v(i, j, k) * mf_vx_inv(i, j, 0));
169 interp_v_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
170 interp_v_h.InterpolateInY(i,j ,k,0,interp_lo,rho_v_avg_lo);
173 amrex::Real centFluxYYNext = rho_v_avg_hi * interp_hi * 0.5 * (ay(i,j,k) + ay(i,j+1,k));
174 amrex::Real centFluxYYPrev = rho_v_avg_lo * interp_lo * 0.5 * (ay(i,j,k) + ay(i,j-1,k));
180 Omega_avg_hi = 0.5 * (Omega(i, j, k+1) + Omega(i, j-1, k+1));
181 Omega_avg_lo = 0.5 * (Omega(i, j, k ) + Omega(i, j-1, k ));
183 interp_v_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
184 interp_v_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
186 amrex::Real edgeFluxYZNext = Omega_avg_hi * interp_hi * 0.5 * (az(i, j, k+1) + az(i, j-1, k+1));
187 amrex::Real edgeFluxYZPrev = Omega_avg_lo * interp_lo * 0.5 * (az(i, j, k ) + az(i, j-1, k ));
191 amrex::Real mfsq = 1. / (mf_vx_inv(i,j,0) * mf_vy_inv(i,j,0));
193 advectionSrc = (edgeFluxYXNext - edgeFluxYXPrev) * dxInv * mfsq
194 + (centFluxYYNext - centFluxYYPrev) * dyInv * mfsq
195 + (edgeFluxYZNext - edgeFluxYZPrev) * dzInv;
196 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i,j-1,k));
223 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
228 const amrex::Array4<const amrex::Real>& rho_u,
229 const amrex::Array4<const amrex::Real>& rho_v,
230 const amrex::Array4<const amrex::Real>& Omega,
231 const amrex::Array4<const amrex::Real>& w,
232 const amrex::Array4<const amrex::Real>& z_nd,
233 const amrex::Array4<const amrex::Real>& ,
234 const amrex::Array4<const amrex::Real>& ,
235 const amrex::Array4<const amrex::Real>& az,
236 const amrex::Array4<const amrex::Real>& detJ,
237 InterpType_H interp_omega_h,
238 InterpType_V interp_omega_v,
239 WallInterpType interp_omega_wall,
240 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
241 const amrex::Array4<const amrex::Real>& mf_mx,
242 const amrex::Array4<const amrex::Real>& mf_my,
243 const amrex::Array4<const amrex::Real>& mf_uy_inv,
244 const amrex::Array4<const amrex::Real>& mf_vx_inv,
246 const int lo_z_face,
const int hi_z_face)
249 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
261 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);
262 rho_u_avg_lo = 0.5 * (rho_u(i , j, k) + rho_u(i , j, k-1)) * mf_uy_inv(i ,j ,0);
264 interp_omega_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
265 interp_omega_h.InterpolateInX(i ,j,k,0,interp_lo,rho_u_avg_lo);
274 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);
275 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) + rho_v(i, j , k-1)) * mf_vx_inv(i ,j ,0);
277 interp_omega_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
278 interp_omega_h.InterpolateInY(i,j ,k,0,interp_lo,rho_v_avg_lo);
287 Omega_avg_hi = (k == hi_z_face) ? Omega(i,j,k) * az(i,j,k) :
288 0.25 * (Omega(i,j,k) + Omega(i,j,k+1)) * (az(i,j,k) + az(i,j,k+1));
295 if (k == hi_z_face) {
296 centFluxZZNext *= w(i,j,k);
298 if (k == hi_z_face-1)
301 }
else if (k == hi_z_face-2 || k == lo_z_face+1) {
305 interp_omega_wall.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi,vert_adv_type);
308 interp_omega_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
310 centFluxZZNext *= interp_hi;
315 Omega_avg_lo = (k == 0) ? Omega(i,j,k) * az(i,j,k) :
316 0.25 * (Omega(i,j,k) + Omega(i,j,k-1)) * (az(i,j,k) + az(i,j,k-1));
324 centFluxZZPrev *= w(i,j,k);
326 if (k == lo_z_face+1) {
328 }
else if (k == lo_z_face+2 || k == hi_z_face-1) {
332 interp_omega_wall.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo,vert_adv_type);
335 interp_omega_v.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo);
337 centFluxZZPrev *= interp_lo;
344 advectionSrc = (edgeFluxZXNext - edgeFluxZXPrev) * dxInv * mfsq
345 + (edgeFluxZYNext - edgeFluxZYPrev) * dyInv * mfsq
346 + (centFluxZZNext - centFluxZZPrev) * dzInv;
348 amrex::Real denom = 0.5*(detJ(i,j,k) + detJ(i,j,k-1));
349 advectionSrc /= denom;
357 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
360 const amrex::Array4<amrex::Real>& rho_u_rhs,
361 const amrex::Array4<amrex::Real>& rho_v_rhs,
362 const amrex::Array4<amrex::Real>& rho_w_rhs,
363 const amrex::Array4<const amrex::Real>& rho_u,
364 const amrex::Array4<const amrex::Real>& rho_v,
365 const amrex::Array4<const amrex::Real>& Omega,
366 const amrex::Array4<const amrex::Real>& u,
367 const amrex::Array4<const amrex::Real>& v,
368 const amrex::Array4<const amrex::Real>& w,
369 const amrex::Array4<const amrex::Real>& z_nd,
370 const amrex::Array4<const amrex::Real>& ax,
371 const amrex::Array4<const amrex::Real>& ay,
372 const amrex::Array4<const amrex::Real>& az,
373 const amrex::Array4<const amrex::Real>& detJ,
374 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
375 const amrex::Array4<const amrex::Real>& mf_mx,
376 const amrex::Array4<const amrex::Real>& mf_ux_inv,
377 const amrex::Array4<const amrex::Real>& mf_vx_inv,
378 const amrex::Array4<const amrex::Real>& mf_my,
379 const amrex::Array4<const amrex::Real>& mf_uy_inv,
380 const amrex::Array4<const amrex::Real>& mf_vy_inv,
384 const int lo_z_face,
const int hi_z_face)
387 InterpType_H interp_u_h(u, upw_frac_h); InterpType_V interp_u_v(u, upw_frac_v);
388 InterpType_H interp_v_h(v, upw_frac_h); InterpType_V interp_v_v(v, upw_frac_v);
389 InterpType_H interp_w_h(w, upw_frac_h); InterpType_V interp_w_v(w, upw_frac_v);
390 WallInterpType interp_w_wall(w, upw_frac_v);
392 amrex::ParallelFor(bxx,
393 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
395 rho_u_rhs(i, j, k) = -
AdvectionSrcForXMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
396 interp_u_h, interp_u_v,
397 cellSizeInv, mf_ux_inv, mf_uy_inv, mf_vx_inv);
400 amrex::ParallelFor(bxy,
401 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
403 rho_v_rhs(i, j, k) = -
AdvectionSrcForYMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
404 interp_v_h, interp_v_v,
405 cellSizeInv, mf_uy_inv, mf_vx_inv, mf_vy_inv);
408 amrex::ParallelFor(bxz,
409 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
411 rho_w_rhs(i, j, k) = -
AdvectionSrcForZMom(i, j, k, rho_u, rho_v, Omega, w, z_nd, ax, ay, az, detJ,
412 interp_w_h, interp_w_v, interp_w_wall,
413 cellSizeInv, mf_mx, mf_my, mf_uy_inv, mf_vx_inv,
414 vert_adv_type, lo_z_face, hi_z_face);
421 template<
typename InterpType_H>
424 const amrex::Array4<amrex::Real>& rho_u_rhs,
425 const amrex::Array4<amrex::Real>& rho_v_rhs,
426 const amrex::Array4<amrex::Real>& rho_w_rhs,
427 const amrex::Array4<const amrex::Real>& rho_u,
428 const amrex::Array4<const amrex::Real>& rho_v,
429 const amrex::Array4<const amrex::Real>& Omega,
430 const amrex::Array4<const amrex::Real>& u,
431 const amrex::Array4<const amrex::Real>& v,
432 const amrex::Array4<const amrex::Real>& w,
433 const amrex::Array4<const amrex::Real>& z_nd,
434 const amrex::Array4<const amrex::Real>& ax,
435 const amrex::Array4<const amrex::Real>& ay,
436 const amrex::Array4<const amrex::Real>& az,
437 const amrex::Array4<const amrex::Real>& detJ,
438 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
439 const amrex::Array4<const amrex::Real>& mf_mx,
440 const amrex::Array4<const amrex::Real>& mf_ux_inv,
441 const amrex::Array4<const amrex::Real>& mf_vx_inv,
442 const amrex::Array4<const amrex::Real>& mf_my,
443 const amrex::Array4<const amrex::Real>& mf_uy_inv,
444 const amrex::Array4<const amrex::Real>& mf_vy_inv,
448 const int lo_z_face,
const int hi_z_face)
451 AdvectionSrcForMomWrapper<InterpType_H,CENTERED2,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,UPWIND3,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,CENTERED4,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,UPWIND5,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 AdvectionSrcForMomWrapper<InterpType_H,CENTERED6,UPWINDALL>(bxx, bxy, bxz,
488 rho_u_rhs, rho_v_rhs, rho_w_rhs,
489 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
491 mf_mx, mf_ux_inv, mf_vx_inv,
492 mf_my, mf_uy_inv, mf_vy_inv,
493 upw_frac_h, upw_frac_v,
494 vert_adv_type, lo_z_face, hi_z_face);
497 AdvectionSrcForMomWrapper<InterpType_H,WENO3,UPWINDALL>(bxx, bxy, bxz,
498 rho_u_rhs, rho_v_rhs, rho_w_rhs,
499 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
501 mf_mx, mf_ux_inv, mf_vx_inv,
502 mf_my, mf_uy_inv, mf_vy_inv,
503 upw_frac_h, upw_frac_v,
504 vert_adv_type, lo_z_face, hi_z_face);
506 AdvectionSrcForMomWrapper<InterpType_H,WENO_Z3,UPWINDALL>(bxx, bxy, bxz,
507 rho_u_rhs, rho_v_rhs, rho_w_rhs,
508 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
510 mf_mx, mf_ux_inv, mf_vx_inv,
511 mf_my, mf_uy_inv, mf_vy_inv,
512 upw_frac_h, upw_frac_v,
513 vert_adv_type, lo_z_face, hi_z_face);
515 AdvectionSrcForMomWrapper<InterpType_H,WENO_MZQ3,UPWINDALL>(bxx, bxy, bxz,
516 rho_u_rhs, rho_v_rhs, rho_w_rhs,
517 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
519 mf_mx, mf_ux_inv, mf_vx_inv,
520 mf_my, mf_uy_inv, mf_vy_inv,
521 upw_frac_h, upw_frac_v,
522 vert_adv_type, lo_z_face, hi_z_face);
524 AdvectionSrcForMomWrapper<InterpType_H,WENO5,UPWINDALL>(bxx, bxy, bxz,
525 rho_u_rhs, rho_v_rhs, rho_w_rhs,
526 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
528 mf_mx, mf_ux_inv, mf_vx_inv,
529 mf_my, mf_uy_inv, mf_vy_inv,
530 upw_frac_h, upw_frac_v,
531 vert_adv_type, lo_z_face, hi_z_face);
533 AdvectionSrcForMomWrapper<InterpType_H,WENO_Z5,UPWINDALL>(bxx, bxy, bxz,
534 rho_u_rhs, rho_v_rhs, rho_w_rhs,
535 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
537 mf_mx, mf_ux_inv, mf_vx_inv,
538 mf_my, mf_uy_inv, mf_vy_inv,
539 upw_frac_h, upw_frac_v,
540 vert_adv_type, lo_z_face, hi_z_face);
542 AdvectionSrcForMomWrapper<InterpType_H,WENO7,UPWINDALL>(bxx, bxy, bxz,
543 rho_u_rhs, rho_v_rhs, rho_w_rhs,
544 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
546 mf_mx, mf_ux_inv, mf_vx_inv,
547 mf_my, mf_uy_inv, mf_vy_inv,
548 upw_frac_h, upw_frac_v,
549 vert_adv_type, lo_z_face, hi_z_face);
551 AdvectionSrcForMomWrapper<InterpType_H,WENO_Z7,UPWINDALL>(bxx, bxy, bxz,
552 rho_u_rhs, rho_v_rhs, rho_w_rhs,
553 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
555 mf_mx, mf_ux_inv, mf_vx_inv,
556 mf_my, mf_uy_inv, mf_vy_inv,
557 upw_frac_h, upw_frac_v,
558 vert_adv_type, lo_z_face, hi_z_face);
560 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:221
amrex::Real Real
Definition: ERF_ShocInterface.H:19
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:273
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:228
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:317