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_u_inv,
39 const amrex::Array4<const amrex::Real>& mf_v_inv)
41 amrex::Real advectionSrc;
42 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
44 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
45 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
46 amrex::Real Omega_avg_lo, Omega_avg_hi;
48 amrex::Real interp_hi(0.), interp_lo(0.);
54 rho_u_avg_hi = 0.5 * (rho_u(i+1, j, k) * mf_u_inv(i+1,j ,0) + rho_u(i, j, k) * mf_u_inv(i ,j ,0));
55 interp_u_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
57 rho_u_avg_lo = 0.5 * (rho_u(i-1, j, k) * mf_u_inv(i-1,j ,0) + rho_u(i, j, k) * mf_u_inv(i ,j ,0));
58 interp_u_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
60 amrex::Real centFluxXXNext = rho_u_avg_hi * interp_hi * 0.5 * (ax(i,j,k) + ax(i+1,j,k));
61 amrex::Real centFluxXXPrev = rho_u_avg_lo * interp_lo * 0.5 * (ax(i,j,k) + ax(i-1,j,k));
66 rho_v_avg_hi = 0.5 * (rho_v(i, j+1, k) * mf_v_inv(i ,j+1,0) + rho_v(i-1, j+1, k) * mf_v_inv(i-1,j+1,0));
67 interp_u_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
69 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) * mf_v_inv(i ,j ,0) + rho_v(i-1, j , k) * mf_v_inv(i-1,j ,0));
70 interp_u_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
78 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));
79 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 ));
81 interp_u_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
82 interp_u_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
84 amrex::Real edgeFluxXZNext = Omega_avg_hi * interp_hi;
85 amrex::Real edgeFluxXZPrev = Omega_avg_lo * interp_lo;
89 amrex::Real mfsq = 1 / (mf_u_inv(i,j,0) * mf_u_inv(i,j,0));
91 advectionSrc = (centFluxXXNext - centFluxXXPrev) * dxInv * mfsq
92 + (edgeFluxXYNext - edgeFluxXYPrev) * dyInv * mfsq
93 + (edgeFluxXZNext - edgeFluxXZPrev) * dzInv;
94 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i-1,j,k));
116 template<
typename InterpType_H,
typename InterpType_V>
121 const amrex::Array4<const amrex::Real>& rho_u,
122 const amrex::Array4<const amrex::Real>& rho_v,
123 const amrex::Array4<const amrex::Real>& Omega,
124 const amrex::Array4<const amrex::Real>& z_nd,
125 const amrex::Array4<const amrex::Real>& ,
126 const amrex::Array4<const amrex::Real>& ay,
127 const amrex::Array4<const amrex::Real>& az,
128 const amrex::Array4<const amrex::Real>& detJ,
129 InterpType_H interp_v_h,
130 InterpType_V interp_v_v,
131 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
132 const amrex::Array4<const amrex::Real>& mf_u_inv,
133 const amrex::Array4<const amrex::Real>& mf_v_inv)
135 amrex::Real advectionSrc;
136 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
138 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
139 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
140 amrex::Real Omega_avg_lo, Omega_avg_hi;
142 amrex::Real interp_hi(0.), interp_lo(0.);
147 rho_u_avg_hi = 0.5 * (rho_u(i+1,j,k) * mf_u_inv(i+1,j,0) + rho_u(i+1,j-1,k) * mf_u_inv(i+1,j-1,0));
148 rho_u_avg_lo = 0.5 * (rho_u(i ,j,k) * mf_u_inv(i ,j,0) + rho_u(i ,j-1,k) * mf_u_inv(i ,j-1,0));
150 interp_v_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
151 interp_v_h.InterpolateInX(i ,j,k,0,interp_lo,rho_u_avg_lo);
159 rho_v_avg_hi = 0.5 * (rho_v(i,j,k) * mf_v_inv(i,j,0) + rho_v(i,j+1,k) * mf_v_inv(i,j+1,0));
160 rho_v_avg_lo = 0.5 * (rho_v(i,j,k) * mf_v_inv(i,j,0) + rho_v(i,j-1,k) * mf_v_inv(i,j-1,0));
162 interp_v_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
163 interp_v_h.InterpolateInY(i,j ,k,0,interp_lo,rho_v_avg_lo);
165 amrex::Real centFluxYYNext = rho_v_avg_hi * 0.5 * (ay(i,j,k) + ay(i,j+1,k)) * interp_hi;
166 amrex::Real centFluxYYPrev = rho_v_avg_lo * 0.5 * (ay(i,j,k) + ay(i,j-1,k)) * interp_lo;
171 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));
172 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 ));
174 interp_v_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
175 interp_v_v.InterpolateInZ(i,j,k ,0,interp_lo,Omega_avg_lo);
177 amrex::Real edgeFluxYZNext = Omega_avg_hi * interp_hi;
178 amrex::Real edgeFluxYZPrev = Omega_avg_lo * interp_lo;
182 amrex::Real mfsq = 1 / (mf_v_inv(i,j,0) * mf_v_inv(i,j,0));
184 advectionSrc = (edgeFluxYXNext - edgeFluxYXPrev) * dxInv * mfsq
185 + (centFluxYYNext - centFluxYYPrev) * dyInv * mfsq
186 + (edgeFluxYZNext - edgeFluxYZPrev) * dzInv;
187 advectionSrc /= 0.5*(detJ(i,j,k) + detJ(i,j-1,k));
214 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
219 const amrex::Array4<const amrex::Real>& rho_u,
220 const amrex::Array4<const amrex::Real>& rho_v,
221 const amrex::Array4<const amrex::Real>& Omega,
222 const amrex::Array4<const amrex::Real>& w,
223 const amrex::Array4<const amrex::Real>& z_nd,
224 const amrex::Array4<const amrex::Real>& ,
225 const amrex::Array4<const amrex::Real>& ,
226 const amrex::Array4<const amrex::Real>& az,
227 const amrex::Array4<const amrex::Real>& detJ,
228 InterpType_H interp_omega_h,
229 InterpType_V interp_omega_v,
230 WallInterpType interp_omega_wall,
231 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
232 const amrex::Array4<const amrex::Real>& mf_m,
233 const amrex::Array4<const amrex::Real>& mf_u_inv,
234 const amrex::Array4<const amrex::Real>& mf_v_inv,
236 const int lo_z_face,
const int hi_z_face)
238 amrex::Real advectionSrc;
239 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
241 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
242 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
243 amrex::Real Omega_avg_lo, Omega_avg_hi;
245 amrex::Real interp_hi(0.), interp_lo(0.);
250 rho_u_avg_hi = 0.5 * (rho_u(i+1, j, k) + rho_u(i+1, j, k-1)) * mf_u_inv(i+1,j ,0);
251 rho_u_avg_lo = 0.5 * (rho_u(i , j, k) + rho_u(i , j, k-1)) * mf_u_inv(i ,j ,0);
253 interp_omega_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
254 interp_omega_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
262 rho_v_avg_hi = 0.5 * (rho_v(i, j+1, k) + rho_v(i, j+1, k-1)) * mf_v_inv(i ,j+1,0);
263 interp_omega_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
265 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) + rho_v(i, j , k-1)) * mf_v_inv(i ,j ,0);
266 interp_omega_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
275 Omega_avg_hi = (k == hi_z_face) ? Omega(i,j,k) * az(i,j,k) :
276 0.25 * (Omega(i,j,k) + Omega(i,j,k+1)) * (az(i,j,k) + az(i,j,k+1));
277 amrex::Real centFluxZZNext = Omega_avg_hi;
283 if (k == hi_z_face) {
284 centFluxZZNext *= w(i,j,k);
286 if (k == hi_z_face-1)
289 }
else if (k == hi_z_face-2 || k == lo_z_face+1) {
293 interp_omega_wall.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi,vert_adv_type);
296 interp_omega_v.InterpolateInZ(i,j,k+1,0,interp_hi,Omega_avg_hi);
298 centFluxZZNext *= interp_hi;
303 Omega_avg_lo = (k == 0) ? Omega(i,j,k) * az(i,j,k) :
304 0.25 * (Omega(i,j,k) + Omega(i,j,k-1)) * (az(i,j,k) + az(i,j,k-1));
305 amrex::Real centFluxZZPrev = Omega_avg_lo;
312 centFluxZZPrev *= w(i,j,k);
314 if (k == lo_z_face+1) {
316 }
else if (k == lo_z_face+2 || k == hi_z_face-1) {
320 interp_omega_wall.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo,vert_adv_type);
323 interp_omega_v.InterpolateInZ(i,j,k,0,interp_lo,Omega_avg_lo);
325 centFluxZZPrev *= interp_lo;
330 amrex::Real mfsq = mf_m(i,j,0) * mf_m(i,j,0);
332 advectionSrc = (edgeFluxZXNext - edgeFluxZXPrev) * dxInv * mfsq
333 + (edgeFluxZYNext - edgeFluxZYPrev) * dyInv * mfsq
334 + (centFluxZZNext - centFluxZZPrev) * dzInv;
336 amrex::Real denom = 0.5*(detJ(i,j,k) + detJ(i,j,k-1));
337 advectionSrc /= denom;
345 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
348 const amrex::Array4<amrex::Real>& rho_u_rhs,
349 const amrex::Array4<amrex::Real>& rho_v_rhs,
350 const amrex::Array4<amrex::Real>& rho_w_rhs,
351 const amrex::Array4<const amrex::Real>& rho_u,
352 const amrex::Array4<const amrex::Real>& rho_v,
353 const amrex::Array4<const amrex::Real>& Omega,
354 const amrex::Array4<const amrex::Real>& u,
355 const amrex::Array4<const amrex::Real>& v,
356 const amrex::Array4<const amrex::Real>& w,
357 const amrex::Array4<const amrex::Real>& z_nd,
358 const amrex::Array4<const amrex::Real>& ax,
359 const amrex::Array4<const amrex::Real>& ay,
360 const amrex::Array4<const amrex::Real>& az,
361 const amrex::Array4<const amrex::Real>& detJ,
362 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
363 const amrex::Array4<const amrex::Real>& mf_m,
364 const amrex::Array4<const amrex::Real>& mf_u_inv,
365 const amrex::Array4<const amrex::Real>& mf_v_inv,
366 const amrex::Real upw_frac_h,
367 const amrex::Real upw_frac_v,
369 const int lo_z_face,
const int hi_z_face)
372 InterpType_H interp_u_h(u, upw_frac_h); InterpType_V interp_u_v(u, upw_frac_v);
373 InterpType_H interp_v_h(v, upw_frac_h); InterpType_V interp_v_v(v, upw_frac_v);
374 InterpType_H interp_w_h(w, upw_frac_h); InterpType_V interp_w_v(w, upw_frac_v);
375 WallInterpType interp_w_wall(w, upw_frac_v);
377 amrex::ParallelFor(bxx,
378 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
380 rho_u_rhs(i, j, k) = -
AdvectionSrcForXMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
381 interp_u_h, interp_u_v,
382 cellSizeInv, mf_u_inv, mf_v_inv);
385 amrex::ParallelFor(bxy,
386 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
388 rho_v_rhs(i, j, k) = -
AdvectionSrcForYMom(i, j, k, rho_u, rho_v, Omega, z_nd, ax, ay, az, detJ,
389 interp_v_h, interp_v_v,
390 cellSizeInv, mf_u_inv, mf_v_inv);
393 amrex::ParallelFor(bxz,
394 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
396 rho_w_rhs(i, j, k) = -
AdvectionSrcForZMom(i, j, k, rho_u, rho_v, Omega, w, z_nd, ax, ay, az, detJ,
397 interp_w_h, interp_w_v, interp_w_wall,
398 cellSizeInv, mf_m, mf_u_inv, mf_v_inv,
399 vert_adv_type, lo_z_face, hi_z_face);
406 template<
typename InterpType_H>
409 const amrex::Array4<amrex::Real>& rho_u_rhs,
410 const amrex::Array4<amrex::Real>& rho_v_rhs,
411 const amrex::Array4<amrex::Real>& rho_w_rhs,
412 const amrex::Array4<const amrex::Real>& rho_u,
413 const amrex::Array4<const amrex::Real>& rho_v,
414 const amrex::Array4<const amrex::Real>& Omega,
415 const amrex::Array4<const amrex::Real>& u,
416 const amrex::Array4<const amrex::Real>& v,
417 const amrex::Array4<const amrex::Real>& w,
418 const amrex::Array4<const amrex::Real>& z_nd,
419 const amrex::Array4<const amrex::Real>& ax,
420 const amrex::Array4<const amrex::Real>& ay,
421 const amrex::Array4<const amrex::Real>& az,
422 const amrex::Array4<const amrex::Real>& detJ,
423 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
424 const amrex::Array4<const amrex::Real>& mf_m,
425 const amrex::Array4<const amrex::Real>& mf_u_inv,
426 const amrex::Array4<const amrex::Real>& mf_v_inv,
427 const amrex::Real upw_frac_h,
428 const amrex::Real upw_frac_v,
430 const int lo_z_face,
const int hi_z_face)
433 AdvectionSrcForMomWrapper<InterpType_H,CENTERED2,UPWINDALL>(bxx, bxy, bxz,
434 rho_u_rhs, rho_v_rhs, rho_w_rhs,
435 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
438 upw_frac_h, upw_frac_v,
439 vert_adv_type, lo_z_face, hi_z_face);
441 AdvectionSrcForMomWrapper<InterpType_H,UPWIND3,UPWINDALL>(bxx, bxy, bxz,
442 rho_u_rhs, rho_v_rhs, rho_w_rhs,
443 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
446 upw_frac_h, upw_frac_v,
447 vert_adv_type, lo_z_face, hi_z_face);
449 AdvectionSrcForMomWrapper<InterpType_H,CENTERED4,UPWINDALL>(bxx, bxy, bxz,
450 rho_u_rhs, rho_v_rhs, rho_w_rhs,
451 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
454 upw_frac_h, upw_frac_v,
455 vert_adv_type, lo_z_face, hi_z_face);
457 AdvectionSrcForMomWrapper<InterpType_H,UPWIND5,UPWINDALL>(bxx, bxy, bxz,
458 rho_u_rhs, rho_v_rhs, rho_w_rhs,
459 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
462 upw_frac_h, upw_frac_v,
463 vert_adv_type, lo_z_face, hi_z_face);
465 AdvectionSrcForMomWrapper<InterpType_H,CENTERED6,UPWINDALL>(bxx, bxy, bxz,
466 rho_u_rhs, rho_v_rhs, rho_w_rhs,
467 rho_u, rho_v, Omega, u, v, w, z_nd, ax, ay, az, detJ,
470 upw_frac_h, upw_frac_v,
471 vert_adv_type, lo_z_face, hi_z_face);
473 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:203
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