17 template<
typename InterpType_H,
typename InterpType_V>
22 const amrex::Array4<const amrex::Real>& rho_u,
23 const amrex::Array4<const amrex::Real>& rho_v,
24 const amrex::Array4<const amrex::Real>& rho_w,
25 InterpType_H interp_u_h,
26 InterpType_V interp_u_v,
27 const amrex::Array4<const amrex::Real>& mf_ux_inv,
28 const amrex::Array4<const amrex::Real>& mf_uy_inv,
29 const amrex::Array4<const amrex::Real>& mf_vx_inv,
30 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
32 amrex::Real advectionSrc;
34 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
35 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
36 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
38 amrex::Real xflux_hi; amrex::Real xflux_lo;
39 amrex::Real yflux_hi; amrex::Real yflux_lo;
40 amrex::Real zflux_hi; amrex::Real zflux_lo;
42 amrex::Real interp_hi(0.), interp_lo(0.);
44 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));
45 interp_u_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
46 xflux_hi = rho_u_avg_hi * interp_hi;
48 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));
49 interp_u_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
50 xflux_lo = rho_u_avg_lo * interp_lo;
52 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));
53 interp_u_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
54 yflux_hi = rho_v_avg_hi * interp_hi;
56 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));
57 interp_u_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
58 yflux_lo = rho_v_avg_lo * interp_lo;
60 rho_w_avg_hi = 0.5 * (rho_w(i, j, k+1) + rho_w(i-1, j, k+1));
61 interp_u_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
62 zflux_hi = rho_w_avg_hi * interp_hi;
64 rho_w_avg_lo = 0.5 * (rho_w(i, j, k ) + rho_w(i-1, j, k ));
65 interp_u_v.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo);
66 zflux_lo = rho_w_avg_lo * interp_lo;
68 amrex::Real mfsq = 1 / (mf_ux_inv(i,j,0) * mf_uy_inv(i,j,0));
70 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
71 + (yflux_hi - yflux_lo) * dyInv * mfsq
72 + (zflux_hi - zflux_lo) * dzInv;
90 template<
typename InterpType_H,
typename InterpType_V>
95 const amrex::Array4<const amrex::Real>& rho_u,
96 const amrex::Array4<const amrex::Real>& rho_v,
97 const amrex::Array4<const amrex::Real>& rho_w,
98 InterpType_H interp_v_h,
99 InterpType_V interp_v_v,
100 const amrex::Array4<const amrex::Real>& mf_uy_inv,
101 const amrex::Array4<const amrex::Real>& mf_vx_inv,
102 const amrex::Array4<const amrex::Real>& mf_vy_inv,
103 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
105 amrex::Real advectionSrc;
107 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
108 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
109 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
111 amrex::Real xflux_hi; amrex::Real xflux_lo;
112 amrex::Real yflux_hi; amrex::Real yflux_lo;
113 amrex::Real zflux_hi; amrex::Real zflux_lo;
115 amrex::Real interp_hi(0.), interp_lo(0.);
117 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));
118 interp_v_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
119 xflux_hi = rho_u_avg_hi * interp_hi;
121 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));
122 interp_v_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
123 xflux_lo = rho_u_avg_lo * interp_lo;
125 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));
126 interp_v_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
127 yflux_hi = rho_v_avg_hi * interp_hi;
129 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));
130 interp_v_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
131 yflux_lo = rho_v_avg_lo * interp_lo;
133 rho_w_avg_hi = 0.5 * (rho_w(i, j, k+1) + rho_w(i, j-1, k+1));
134 interp_v_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
135 zflux_hi = rho_w_avg_hi * interp_hi;
137 rho_w_avg_lo = 0.5 * (rho_w(i, j, k ) + rho_w(i, j-1, k ));
138 interp_v_v.InterpolateInZ(i,j,k ,0,interp_lo,rho_w_avg_lo);
139 zflux_lo = rho_w_avg_lo * interp_lo;
141 amrex::Real mfsq = 1 / (mf_vx_inv(i,j,0) * mf_vy_inv(i,j,0));
143 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
144 + (yflux_hi - yflux_lo) * dyInv * mfsq
145 + (zflux_hi - zflux_lo) * dzInv;
165 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
170 const amrex::Array4<const amrex::Real>& rho_u,
171 const amrex::Array4<const amrex::Real>& rho_v,
172 const amrex::Array4<const amrex::Real>& rho_w,
173 const amrex::Array4<const amrex::Real>& w,
174 InterpType_H interp_w_h,
175 InterpType_V interp_w_v,
176 WallInterpType interp_w_wall,
177 const amrex::Array4<const amrex::Real>& mf_mx,
178 const amrex::Array4<const amrex::Real>& mf_my,
179 const amrex::Array4<const amrex::Real>& mf_uy_inv,
180 const amrex::Array4<const amrex::Real>& mf_vx_inv,
182 const int lo_z_face,
const int hi_z_face,
183 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
186 amrex::Real advectionSrc;
188 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
189 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
190 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
192 amrex::Real xflux_hi; amrex::Real xflux_lo;
193 amrex::Real yflux_hi; amrex::Real yflux_lo;
194 amrex::Real zflux_hi; amrex::Real zflux_lo;
196 amrex::Real interp_hi(0.), interp_lo(0.);
198 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);
199 interp_w_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
200 xflux_hi = rho_u_avg_hi * interp_hi;
202 rho_u_avg_lo = 0.5 * (rho_u(i , j, k) + rho_u(i , j, k-1)) * mf_uy_inv(i ,j ,0);
203 interp_w_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
204 xflux_lo = rho_u_avg_lo * interp_lo;
206 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);
207 interp_w_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
208 yflux_hi = rho_v_avg_hi * interp_hi;
210 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) + rho_v(i, j , k-1)) * mf_vx_inv(i ,j ,0);
211 interp_w_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
212 yflux_lo = rho_v_avg_lo * interp_lo;
219 if (k == hi_z_face) {
220 zflux_hi = rho_w(i,j,k) * w(i,j,k);
222 rho_w_avg_hi = 0.5 * (rho_w(i,j,k) + rho_w(i,j,k+1));
223 if (k == hi_z_face-1) {
225 }
else if (k == hi_z_face-2 || k == lo_z_face+1) {
229 interp_w_wall.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi,vert_adv_type);
232 interp_w_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
234 zflux_hi = rho_w_avg_hi * interp_hi;
242 if (k == lo_z_face) {
243 zflux_lo = rho_w(i,j,k) * w(i,j,k);
245 rho_w_avg_lo = 0.5 * (rho_w(i,j,k) + rho_w(i,j,k-1));
246 if (k == lo_z_face+1) {
248 }
else if (k == lo_z_face+2 || k == hi_z_face-1) {
252 interp_w_wall.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo,vert_adv_type);
255 interp_w_v.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo);
257 zflux_lo = rho_w_avg_lo * interp_lo;
260 amrex::Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
262 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
263 + (yflux_hi - yflux_lo) * dyInv * mfsq
264 + (zflux_hi - zflux_lo) * dzInv;
272 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
275 const amrex::Array4<amrex::Real>& rho_u_rhs,
276 const amrex::Array4<amrex::Real>& rho_v_rhs,
277 const amrex::Array4<amrex::Real>& rho_w_rhs,
278 const amrex::Array4<const amrex::Real>& rho_u,
279 const amrex::Array4<const amrex::Real>& rho_v,
280 const amrex::Array4<const amrex::Real>& rho_w,
281 const amrex::Array4<const amrex::Real>& u,
282 const amrex::Array4<const amrex::Real>& v,
283 const amrex::Array4<const amrex::Real>& w,
284 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
285 const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
286 const amrex::Array4<const amrex::Real>& mf_mx,
287 const amrex::Array4<const amrex::Real>& mf_ux_inv,
288 const amrex::Array4<const amrex::Real>& mf_vx_inv,
289 const amrex::Array4<const amrex::Real>& mf_my,
290 const amrex::Array4<const amrex::Real>& mf_uy_inv,
291 const amrex::Array4<const amrex::Real>& mf_vy_inv,
292 const amrex::Real upw_frac_h,
293 const amrex::Real upw_frac_v,
295 const int lo_z_face,
const int hi_z_face)
298 InterpType_H interp_u_h(u, upw_frac_h); InterpType_V interp_u_v(u, upw_frac_v);
299 InterpType_H interp_v_h(v, upw_frac_h); InterpType_V interp_v_v(v, upw_frac_v);
300 InterpType_H interp_w_h(w, upw_frac_h); InterpType_V interp_w_v(w, upw_frac_v);
301 WallInterpType interp_w_wall(w, upw_frac_v);
303 auto dxInv = cellSizeInv[0];
304 auto dyInv = cellSizeInv[1];
306 auto dz_ptr = stretched_dz_d.data();
308 amrex::ParallelFor(bxx,
309 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
311 auto dzInv = 1.0/dz_ptr[k];
313 interp_u_h, interp_u_v,
314 mf_ux_inv, mf_uy_inv, mf_vx_inv,
315 dxInv, dyInv, dzInv);
318 amrex::ParallelFor(bxy,
319 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
321 auto dzInv = 1.0/dz_ptr[k];
323 interp_v_h, interp_v_v,
324 mf_uy_inv, mf_vx_inv, mf_vy_inv,
325 dxInv, dyInv, dzInv);
328 amrex::ParallelFor(bxz,
329 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
331 auto dzInv = 2.0/(dz_ptr[k] + dz_ptr[k-1]);
333 interp_w_h, interp_w_v, interp_w_wall,
334 mf_mx, mf_my, mf_uy_inv, mf_vx_inv,
335 vert_adv_type, lo_z_face, hi_z_face,
336 dxInv, dyInv, dzInv);
343 template<
typename InterpType_H>
346 const amrex::Array4<amrex::Real>& rho_u_rhs,
347 const amrex::Array4<amrex::Real>& rho_v_rhs,
348 const amrex::Array4<amrex::Real>& rho_w_rhs,
349 const amrex::Array4<const amrex::Real>& rho_u,
350 const amrex::Array4<const amrex::Real>& rho_v,
351 const amrex::Array4<const amrex::Real>& rho_w,
352 const amrex::Array4<const amrex::Real>& u,
353 const amrex::Array4<const amrex::Real>& v,
354 const amrex::Array4<const amrex::Real>& w,
355 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
356 const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
357 const amrex::Array4<const amrex::Real>& mf_mx,
358 const amrex::Array4<const amrex::Real>& mf_ux_inv,
359 const amrex::Array4<const amrex::Real>& mf_vx_inv,
360 const amrex::Array4<const amrex::Real>& mf_my,
361 const amrex::Array4<const amrex::Real>& mf_uy_inv,
362 const amrex::Array4<const amrex::Real>& mf_vy_inv,
363 const amrex::Real upw_frac_h,
364 const amrex::Real upw_frac_v,
366 const int lo_z_face,
const int hi_z_face)
369 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED2,UPWINDALL>(bxx, bxy, bxz,
370 rho_u_rhs, rho_v_rhs, rho_w_rhs,
371 rho_u, rho_v, rho_w, u, v, w,
372 cellSizeInv, stretched_dz_d,
373 mf_mx, mf_ux_inv, mf_vx_inv,
374 mf_my, mf_uy_inv, mf_vy_inv,
375 upw_frac_h, upw_frac_v,
377 lo_z_face, hi_z_face);
379 AdvectionSrcForMomWrapper_N<InterpType_H,UPWIND3,UPWINDALL>(bxx, bxy, bxz,
380 rho_u_rhs, rho_v_rhs, rho_w_rhs,
381 rho_u, rho_v, rho_w, u, v, w,
382 cellSizeInv, stretched_dz_d,
383 mf_mx, mf_ux_inv, mf_vx_inv,
384 mf_my, mf_uy_inv, mf_vy_inv,
385 upw_frac_h, upw_frac_v,
387 lo_z_face, hi_z_face);
389 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED4,UPWINDALL>(bxx, bxy, bxz,
390 rho_u_rhs, rho_v_rhs, rho_w_rhs,
391 rho_u, rho_v, rho_w, u, v, w,
392 cellSizeInv, stretched_dz_d,
393 mf_mx, mf_ux_inv, mf_vx_inv,
394 mf_my, mf_uy_inv, mf_vy_inv,
395 upw_frac_h, upw_frac_v,
397 lo_z_face, hi_z_face);
399 AdvectionSrcForMomWrapper_N<InterpType_H,UPWIND5,UPWINDALL>(bxx, bxy, bxz,
400 rho_u_rhs, rho_v_rhs, rho_w_rhs,
401 rho_u, rho_v, rho_w, u, v, w,
402 cellSizeInv, stretched_dz_d,
403 mf_mx, mf_ux_inv, mf_vx_inv,
404 mf_my, mf_uy_inv, mf_vy_inv,
405 upw_frac_h, upw_frac_v,
407 lo_z_face, hi_z_face);
409 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED6,UPWINDALL>(bxx, bxy, bxz,
410 rho_u_rhs, rho_v_rhs, rho_w_rhs,
411 rho_u, rho_v, rho_w, u, v, w,
412 cellSizeInv, stretched_dz_d,
413 mf_mx, mf_ux_inv, mf_vx_inv,
414 mf_my, mf_uy_inv, mf_vy_inv,
415 upw_frac_h, upw_frac_v,
417 lo_z_face, hi_z_face);
419 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:221