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_u_inv,
28 const amrex::Array4<const amrex::Real>& mf_v_inv,
29 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
31 amrex::Real advectionSrc;
33 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
34 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
35 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
37 amrex::Real xflux_hi; amrex::Real xflux_lo;
38 amrex::Real yflux_hi; amrex::Real yflux_lo;
39 amrex::Real zflux_hi; amrex::Real zflux_lo;
41 amrex::Real interp_hi(0.), interp_lo(0.);
43 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));
44 interp_u_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
45 xflux_hi = rho_u_avg_hi * interp_hi;
47 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));
48 interp_u_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
49 xflux_lo = rho_u_avg_lo * interp_lo;
51 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));
52 interp_u_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
53 yflux_hi = rho_v_avg_hi * interp_hi;
55 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));
56 interp_u_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
57 yflux_lo = rho_v_avg_lo * interp_lo;
59 rho_w_avg_hi = 0.5 * (rho_w(i, j, k+1) + rho_w(i-1, j, k+1));
60 interp_u_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
61 zflux_hi = rho_w_avg_hi * interp_hi;
63 rho_w_avg_lo = 0.5 * (rho_w(i, j, k ) + rho_w(i-1, j, k ));
64 interp_u_v.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo);
65 zflux_lo = rho_w_avg_lo * interp_lo;
67 amrex::Real mfsq = 1 / (mf_u_inv(i,j,0) * mf_u_inv(i,j,0));
69 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
70 + (yflux_hi - yflux_lo) * dyInv * mfsq
71 + (zflux_hi - zflux_lo) * dzInv;
89 template<
typename InterpType_H,
typename InterpType_V>
94 const amrex::Array4<const amrex::Real>& rho_u,
95 const amrex::Array4<const amrex::Real>& rho_v,
96 const amrex::Array4<const amrex::Real>& rho_w,
97 InterpType_H interp_v_h,
98 InterpType_V interp_v_v,
99 const amrex::Array4<const amrex::Real>& mf_u_inv,
100 const amrex::Array4<const amrex::Real>& mf_v_inv,
101 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
103 amrex::Real advectionSrc;
105 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
106 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
107 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
109 amrex::Real xflux_hi; amrex::Real xflux_lo;
110 amrex::Real yflux_hi; amrex::Real yflux_lo;
111 amrex::Real zflux_hi; amrex::Real zflux_lo;
113 amrex::Real interp_hi(0.), interp_lo(0.);
115 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));
116 interp_v_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
117 xflux_hi = rho_u_avg_hi * interp_hi;
119 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));
120 interp_v_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
121 xflux_lo = rho_u_avg_lo * interp_lo;
123 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));
124 interp_v_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
125 yflux_hi = rho_v_avg_hi * interp_hi;
127 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));
128 interp_v_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
129 yflux_lo = rho_v_avg_lo * interp_lo;
131 rho_w_avg_hi = 0.5 * (rho_w(i, j, k+1) + rho_w(i, j-1, k+1));
132 interp_v_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
133 zflux_hi = rho_w_avg_hi * interp_hi;
135 rho_w_avg_lo = 0.5 * (rho_w(i, j, k ) + rho_w(i, j-1, k ));
136 interp_v_v.InterpolateInZ(i,j,k ,0,interp_lo,rho_w_avg_lo);
137 zflux_lo = rho_w_avg_lo * interp_lo;
139 amrex::Real mfsq = 1 / (mf_v_inv(i,j,0) * mf_v_inv(i,j,0));
141 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
142 + (yflux_hi - yflux_lo) * dyInv * mfsq
143 + (zflux_hi - zflux_lo) * dzInv;
163 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
168 const amrex::Array4<const amrex::Real>& rho_u,
169 const amrex::Array4<const amrex::Real>& rho_v,
170 const amrex::Array4<const amrex::Real>& rho_w,
171 const amrex::Array4<const amrex::Real>& w,
172 InterpType_H interp_w_h,
173 InterpType_V interp_w_v,
174 WallInterpType interp_w_wall,
175 const amrex::Array4<const amrex::Real>& mf_m,
176 const amrex::Array4<const amrex::Real>& mf_u_inv,
177 const amrex::Array4<const amrex::Real>& mf_v_inv,
179 const int lo_z_face,
const int hi_z_face,
180 const amrex::Real dxInv,
const amrex::Real dyInv,
const amrex::Real dzInv)
183 amrex::Real advectionSrc;
185 amrex::Real rho_u_avg_lo, rho_u_avg_hi;
186 amrex::Real rho_v_avg_lo, rho_v_avg_hi;
187 amrex::Real rho_w_avg_lo, rho_w_avg_hi;
189 amrex::Real xflux_hi; amrex::Real xflux_lo;
190 amrex::Real yflux_hi; amrex::Real yflux_lo;
191 amrex::Real zflux_hi; amrex::Real zflux_lo;
193 amrex::Real interp_hi(0.), interp_lo(0.);
195 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);
196 interp_w_h.InterpolateInX(i+1,j,k,0,interp_hi,rho_u_avg_hi);
197 xflux_hi = rho_u_avg_hi * interp_hi;
199 rho_u_avg_lo = 0.5 * (rho_u(i , j, k) + rho_u(i , j, k-1)) * mf_u_inv(i ,j ,0);
200 interp_w_h.InterpolateInX(i,j,k,0,interp_lo,rho_u_avg_lo);
201 xflux_lo = rho_u_avg_lo * interp_lo;
203 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);
204 interp_w_h.InterpolateInY(i,j+1,k,0,interp_hi,rho_v_avg_hi);
205 yflux_hi = rho_v_avg_hi * interp_hi;
207 rho_v_avg_lo = 0.5 * (rho_v(i, j , k) + rho_v(i, j , k-1)) * mf_v_inv(i ,j ,0);
208 interp_w_h.InterpolateInY(i,j,k,0,interp_lo,rho_v_avg_lo);
209 yflux_lo = rho_v_avg_lo * interp_lo;
216 if (k == hi_z_face) {
217 zflux_hi = rho_w(i,j,k) * w(i,j,k);
219 rho_w_avg_hi = 0.5 * (rho_w(i,j,k) + rho_w(i,j,k+1));
220 if (k == hi_z_face-1)
223 }
else if (k == hi_z_face-2 || k == lo_z_face+1) {
227 interp_w_wall.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi,vert_adv_type);
230 interp_w_v.InterpolateInZ(i,j,k+1,0,interp_hi,rho_w_avg_hi);
232 zflux_hi = rho_w_avg_hi * interp_hi;
240 if (k == lo_z_face) {
241 zflux_lo = rho_w(i,j,k) * w(i,j,k);
243 rho_w_avg_lo = 0.5 * (rho_w(i,j,k) + rho_w(i,j,k-1));
244 if (k == lo_z_face+1) {
246 }
else if (k == lo_z_face+2 || k == hi_z_face-1) {
250 interp_w_wall.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo,vert_adv_type);
253 interp_w_v.InterpolateInZ(i,j,k,0,interp_lo,rho_w_avg_lo);
255 zflux_lo = rho_w_avg_lo * interp_lo;
258 amrex::Real mfsq = mf_m(i,j,0) * mf_m(i,j,0);
260 advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
261 + (yflux_hi - yflux_lo) * dyInv * mfsq
262 + (zflux_hi - zflux_lo) * dzInv;
270 template<
typename InterpType_H,
typename InterpType_V,
typename WallInterpType>
273 const amrex::Array4<amrex::Real>& rho_u_rhs,
274 const amrex::Array4<amrex::Real>& rho_v_rhs,
275 const amrex::Array4<amrex::Real>& rho_w_rhs,
276 const amrex::Array4<const amrex::Real>& rho_u,
277 const amrex::Array4<const amrex::Real>& rho_v,
278 const amrex::Array4<const amrex::Real>& rho_w,
279 const amrex::Array4<const amrex::Real>& u,
280 const amrex::Array4<const amrex::Real>& v,
281 const amrex::Array4<const amrex::Real>& w,
282 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
283 const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
284 const amrex::Array4<const amrex::Real>& mf_m,
285 const amrex::Array4<const amrex::Real>& mf_u_inv,
286 const amrex::Array4<const amrex::Real>& mf_v_inv,
287 const amrex::Real upw_frac_h,
288 const amrex::Real upw_frac_v,
290 const int lo_z_face,
const int hi_z_face)
293 InterpType_H interp_u_h(u, upw_frac_h); InterpType_V interp_u_v(u, upw_frac_v);
294 InterpType_H interp_v_h(v, upw_frac_h); InterpType_V interp_v_v(v, upw_frac_v);
295 InterpType_H interp_w_h(w, upw_frac_h); InterpType_V interp_w_v(w, upw_frac_v);
296 WallInterpType interp_w_wall(w, upw_frac_v);
298 auto dxInv = cellSizeInv[0];
299 auto dyInv = cellSizeInv[1];
301 auto dz_ptr = stretched_dz_d.data();
303 amrex::ParallelFor(bxx,
304 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
306 auto dzInv = 1.0/dz_ptr[k];
308 interp_u_h, interp_u_v,
310 dxInv, dyInv, dzInv);
313 amrex::ParallelFor(bxy,
314 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
316 auto dzInv = 1.0/dz_ptr[k];
318 interp_v_h, interp_v_v,
320 dxInv, dyInv, dzInv);
323 amrex::ParallelFor(bxz,
324 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
326 auto dzInv = 2.0/(dz_ptr[k] + dz_ptr[k-1]);
328 interp_w_h, interp_w_v, interp_w_wall,
329 mf_m, mf_u_inv, mf_v_inv,
330 vert_adv_type, lo_z_face, hi_z_face,
331 dxInv, dyInv, dzInv);
338 template<
typename InterpType_H>
341 const amrex::Array4<amrex::Real>& rho_u_rhs,
342 const amrex::Array4<amrex::Real>& rho_v_rhs,
343 const amrex::Array4<amrex::Real>& rho_w_rhs,
344 const amrex::Array4<const amrex::Real>& rho_u,
345 const amrex::Array4<const amrex::Real>& rho_v,
346 const amrex::Array4<const amrex::Real>& rho_w,
347 const amrex::Array4<const amrex::Real>& u,
348 const amrex::Array4<const amrex::Real>& v,
349 const amrex::Array4<const amrex::Real>& w,
350 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& cellSizeInv,
351 const amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
352 const amrex::Array4<const amrex::Real>& mf_m,
353 const amrex::Array4<const amrex::Real>& mf_u_inv,
354 const amrex::Array4<const amrex::Real>& mf_v_inv,
355 const amrex::Real upw_frac_h,
356 const amrex::Real upw_frac_v,
358 const int lo_z_face,
const int hi_z_face)
361 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED2,UPWINDALL>(bxx, bxy, bxz,
362 rho_u_rhs, rho_v_rhs, rho_w_rhs,
363 rho_u, rho_v, rho_w, u, v, w,
364 cellSizeInv, stretched_dz_d, mf_m,
366 upw_frac_h, upw_frac_v,
368 lo_z_face, hi_z_face);
370 AdvectionSrcForMomWrapper_N<InterpType_H,UPWIND3,UPWINDALL>(bxx, bxy, bxz,
371 rho_u_rhs, rho_v_rhs, rho_w_rhs,
372 rho_u, rho_v, rho_w, u, v, w,
373 cellSizeInv, stretched_dz_d, mf_m,
375 upw_frac_h, upw_frac_v,
377 lo_z_face, hi_z_face);
379 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED4,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, mf_m,
384 upw_frac_h, upw_frac_v,
386 lo_z_face, hi_z_face);
388 AdvectionSrcForMomWrapper_N<InterpType_H,UPWIND5,UPWINDALL>(bxx, bxy, bxz,
389 rho_u_rhs, rho_v_rhs, rho_w_rhs,
390 rho_u, rho_v, rho_w, u, v, w,
391 cellSizeInv, stretched_dz_d, mf_m,
393 upw_frac_h, upw_frac_v,
395 lo_z_face, hi_z_face);
397 AdvectionSrcForMomWrapper_N<InterpType_H,CENTERED6,UPWINDALL>(bxx, bxy, bxz,
398 rho_u_rhs, rho_v_rhs, rho_w_rhs,
399 rho_u, rho_v, rho_w, u, v, w,
400 cellSizeInv, stretched_dz_d, mf_m,
402 upw_frac_h, upw_frac_v,
404 lo_z_face, hi_z_face);
406 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AdvType
Definition: ERF_IndexDefines.H:203