Function for computing the advective tendency for the momentum equations when using EB
80 AMREX_ALWAYS_ASSERT(bxz.smallEnd(2) > 0);
82 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
85 Box box2d_u(bxx); box2d_u.setRange(2,0); box2d_u.grow({3,3,0});
86 Box box2d_v(bxy); box2d_v.setRange(2,0); box2d_v.grow({3,3,0});
88 FArrayBox mf_ux_invFAB(box2d_u,1,The_Async_Arena());
89 FArrayBox mf_uy_invFAB(box2d_u,1,The_Async_Arena());
90 FArrayBox mf_vx_invFAB(box2d_v,1,The_Async_Arena());
91 FArrayBox mf_vy_invFAB(box2d_v,1,The_Async_Arena());
92 const Array4<Real>& mf_ux_inv = mf_ux_invFAB.array();
93 const Array4<Real>& mf_uy_inv = mf_uy_invFAB.array();
94 const Array4<Real>& mf_vx_inv = mf_vx_invFAB.array();
95 const Array4<Real>& mf_vy_inv = mf_vy_invFAB.array();
97 ParallelFor(box2d_u, box2d_v,
98 [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
100 mf_ux_inv(i,j,0) = 1. / mf_ux(i,j,0);
101 mf_uy_inv(i,j,0) = 1. / mf_uy(i,j,0);
103 [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
105 mf_vx_inv(i,j,0) = 1. / mf_vx(i,j,0);
106 mf_vy_inv(i,j,0) = 1. / mf_vy(i,j,0);
110 Array4<const EBCellFlag> u_cflag = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
111 Array4<const Real > u_vfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
112 Array4<const Real > u_afrac_x = (ebfact.
get_u_const_factory())->getAreaFrac()[0]->const_array(mfi);
113 Array4<const Real > u_afrac_y = (ebfact.
get_u_const_factory())->getAreaFrac()[1]->const_array(mfi);
114 Array4<const Real > u_afrac_z = (ebfact.
get_u_const_factory())->getAreaFrac()[2]->const_array(mfi);
115 Array4<const Real > u_fcx = (ebfact.
get_u_const_factory())->getFaceCent()[0]->const_array(mfi);
116 Array4<const Real > u_fcy = (ebfact.
get_u_const_factory())->getFaceCent()[1]->const_array(mfi);
117 Array4<const Real > u_fcz = (ebfact.
get_u_const_factory())->getFaceCent()[2]->const_array(mfi);
120 Array4<const EBCellFlag> v_cflag = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
121 Array4<const Real > v_vfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
122 Array4<const Real > v_afrac_x = (ebfact.
get_v_const_factory())->getAreaFrac()[0]->const_array(mfi);
123 Array4<const Real > v_afrac_y = (ebfact.
get_v_const_factory())->getAreaFrac()[1]->const_array(mfi);
124 Array4<const Real > v_afrac_z = (ebfact.
get_v_const_factory())->getAreaFrac()[2]->const_array(mfi);
125 Array4<const Real > v_fcx = (ebfact.
get_v_const_factory())->getFaceCent()[0]->const_array(mfi);
126 Array4<const Real > v_fcy = (ebfact.
get_v_const_factory())->getFaceCent()[1]->const_array(mfi);
127 Array4<const Real > v_fcz = (ebfact.
get_v_const_factory())->getFaceCent()[2]->const_array(mfi);
130 Array4<const EBCellFlag> w_cflag = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
131 Array4<const Real > w_vfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
132 Array4<const Real > w_afrac_x = (ebfact.
get_w_const_factory())->getAreaFrac()[0]->const_array(mfi);
133 Array4<const Real > w_afrac_y = (ebfact.
get_w_const_factory())->getAreaFrac()[1]->const_array(mfi);
134 Array4<const Real > w_afrac_z = (ebfact.
get_w_const_factory())->getAreaFrac()[2]->const_array(mfi);
135 Array4<const Real > w_fcx = (ebfact.
get_w_const_factory())->getFaceCent()[0]->const_array(mfi);
136 Array4<const Real > w_fcy = (ebfact.
get_w_const_factory())->getFaceCent()[1]->const_array(mfi);
137 Array4<const Real > w_fcz = (ebfact.
get_w_const_factory())->getFaceCent()[2]->const_array(mfi);
143 ParallelFor(bxx_grown[0], bxx_grown[1], bxx_grown[2],
144 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
146 if ( u_afrac_x(i,j,k)>0.){
147 flx_u_arr[0](i,j,k) = 0.25 * u_afrac_x(i,j,k)
148 * (rho_u(i,j,k) * mf_ux_inv(i,j,0) + rho_u(i-1,j,k) * mf_ux_inv(i-1,j,0))
149 * (u(i-1,j,k) + u(i,j,k));
151 flx_u_arr[0](i,j,k) = 0.;
154 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
156 if ( u_afrac_y(i,j,k)>0.){
157 flx_u_arr[1](i,j,k) = 0.25 * u_afrac_y(i,j,k)
158 * (rho_v(i,j,k) * mf_vy_inv(i,j,0) + rho_v(i-1,j,k) * mf_vy_inv(i-1,j,0))
159 * (u(i,j-1,k) + u(i,j,k));
161 flx_u_arr[1](i,j,k) = 0.;
164 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
166 if ( u_afrac_z(i,j,k)>0.){
167 flx_u_arr[2](i,j,k) = 0.25 * (
omega(i,j,k) +
omega(i-1,j,k)) * (u(i,j,k-1) + u(i,j,k));
169 flx_u_arr[2](i,j,k) = 0.;
173 ParallelFor(bxy_grown[0], bxy_grown[1], bxy_grown[2],
174 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
176 if ( v_afrac_x(i,j,k)>0.){
177 flx_v_arr[0](i,j,k) = 0.25 * v_afrac_x(i,j,k)
178 * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i,j-1,k) * mf_uy_inv(i,j-1,0))
179 * (v(i-1,j,k) + v(i,j,k));
181 flx_v_arr[0](i,j,k) = 0.;
184 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
186 if ( v_afrac_y(i,j,k)>0.){
187 flx_v_arr[1](i,j,k) = 0.25 * v_afrac_y(i,j,k)
188 * (rho_v(i,j,k) * mf_vy_inv(i,j,0) + rho_v(i,j-1,k) * mf_vy_inv(i,j-1,0))
189 * (v(i,j-1,k) + v(i,j,k));
191 flx_v_arr[1](i,j,k) = 0.;
194 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
196 if ( v_afrac_z(i,j,k)>0.){
197 flx_v_arr[2](i,j,k) = 0.25 * (
omega(i,j,k) +
omega(i,j-1,k)) * (v(i,j,k-1) + v(i,j,k));
199 flx_v_arr[2](i,j,k) = 0.;
203 ParallelFor(bxz_grown[0], bxz_grown[1], bxz_grown[2],
204 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
206 if ( w_afrac_x(i,j,k)>0.){
207 flx_w_arr[0](i,j,k) = 0.25 * w_afrac_x(i,j,k)
208 * (rho_u(i,j,k) + rho_u(i,j, k-1)) * mf_ux_inv(i,j,0)
209 * (w(i-1,j,k) + w(i,j,k));
211 flx_w_arr[0](i,j,k) = 0.;
214 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
216 if ( w_afrac_y(i,j,k)>0.){
217 flx_w_arr[1](i,j,k) = 0.25 * w_afrac_y(i,j,k)
218 * (rho_v(i,j,k) + rho_v(i,j,k-1)) * mf_vy_inv(i,j,0)
219 * (w(i,j-1,k) + w(i,j,k));
221 flx_w_arr[1](i,j,k) = 0.;
224 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
226 if ( w_afrac_z(i,j,k)>0.){
227 flx_w_arr[2](i,j,k) = (k==hi_z_face+1) ?
omega(i,j,k) * w(i,j,k) :
228 0.25 * (
omega(i,j,k) +
omega(i,j,k-1)) * (w(i,j,k) + w(i,j,k-1));
230 flx_w_arr[2](i,j,k) = 0.;
238 EBAdvectionSrcForMomVert<CENTERED2>(bxx_grown, bxy_grown, bxz_grown,
239 rho_u, rho_v,
omega, u, v, w,
240 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
241 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
242 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
243 mf_ux_inv, mf_vx_inv,
244 mf_uy_inv, mf_vy_inv,
245 horiz_upw_frac, vert_upw_frac, vert_adv_type,
246 flx_u_arr, flx_v_arr, flx_w_arr,
247 lo_z_face, hi_z_face);
249 EBAdvectionSrcForMomVert<UPWIND3>( bxx_grown, bxy_grown, bxz_grown,
250 rho_u, rho_v,
omega, u, v, w,
251 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
252 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
253 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
254 mf_ux_inv, mf_vx_inv,
255 mf_uy_inv, mf_vy_inv,
256 horiz_upw_frac, vert_upw_frac, vert_adv_type,
257 flx_u_arr, flx_v_arr, flx_w_arr,
258 lo_z_face, hi_z_face);
260 EBAdvectionSrcForMomVert<CENTERED4>(bxx_grown, bxy_grown, bxz_grown,
261 rho_u, rho_v,
omega, u, v, w,
262 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
263 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
264 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
265 mf_ux_inv, mf_vx_inv,
266 mf_uy_inv, mf_vy_inv,
267 horiz_upw_frac, vert_upw_frac, vert_adv_type,
268 flx_u_arr, flx_v_arr, flx_w_arr,
269 lo_z_face, hi_z_face);
271 EBAdvectionSrcForMomVert<UPWIND5>( bxx_grown, bxy_grown, bxz_grown,
272 rho_u, rho_v,
omega, u, v, w,
273 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
274 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
275 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
276 mf_ux_inv, mf_vx_inv,
277 mf_uy_inv, mf_vy_inv,
278 horiz_upw_frac, vert_upw_frac, vert_adv_type,
279 flx_u_arr, flx_v_arr, flx_w_arr,
280 lo_z_face, hi_z_face);
282 EBAdvectionSrcForMomVert<CENTERED6>(bxx_grown, bxy_grown, bxz_grown,
283 rho_u, rho_v,
omega, u, v, w,
284 u_cflag, u_afrac_x, u_afrac_y, u_afrac_z,
285 v_cflag, v_afrac_x, v_afrac_y, v_afrac_z,
286 w_cflag, w_afrac_x, w_afrac_y, w_afrac_z,
287 mf_ux_inv, mf_vx_inv,
288 mf_uy_inv, mf_vy_inv,
289 horiz_upw_frac, vert_upw_frac, vert_adv_type,
290 flx_u_arr, flx_v_arr, flx_w_arr,
291 lo_z_face, hi_z_face);
293 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
298 if (already_on_centroids) {
300 ParallelFor(bxx, bxy, bxz,
301 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
303 if (u_vfrac(i,j,k)>0.) {
304 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
306 Real advectionSrc = ( (flx_u_arr[0](i+1, j , k ) - flx_u_arr[0](i, j, k)) * dxInv * mfsq
307 + (flx_u_arr[1](i , j+1, k ) - flx_u_arr[1](i, j, k)) * dyInv * mfsq
308 + (flx_u_arr[2](i , j , k+1) - flx_u_arr[2](i, j, k)) * dzInv ) / u_vfrac(i,j,k);
309 rho_u_rhs(i, j, k) = -advectionSrc;
311 rho_u_rhs(i, j, k) = 0.;
314 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
316 if (v_vfrac(i,j,k)>0.) {
317 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
319 Real advectionSrc = ( (flx_v_arr[0](i+1, j , k ) - flx_v_arr[0](i, j, k)) * dxInv * mfsq
320 + (flx_v_arr[1](i , j+1, k ) - flx_v_arr[1](i, j, k)) * dyInv * mfsq
321 + (flx_v_arr[2](i , j , k+1) - flx_v_arr[2](i, j, k)) * dzInv ) / v_vfrac(i,j,k);
322 rho_v_rhs(i, j, k) = -advectionSrc;
324 rho_v_rhs(i, j, k) = 0.;
327 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
329 if (w_vfrac(i,j,k)>0.) {
330 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
332 rho_w_rhs(i, j, k) = - ( (w_afrac_x(i+1, j , k ) * flx_w_arr[0](i+1, j , k ) - w_afrac_x(i, j, k) * flx_w_arr[0](i, j, k)) * dxInv * mfsq
333 + (w_afrac_y(i , j+1, k ) * flx_w_arr[1](i , j+1, k ) - w_afrac_y(i, j, k) * flx_w_arr[1](i, j, k)) * dyInv * mfsq
334 + (w_afrac_z(i , j , k+1) * flx_w_arr[2](i , j , k+1) - w_afrac_z(i, j, k) * flx_w_arr[2](i, j, k)) * dzInv ) / w_vfrac(i,j,k);
336 rho_w_rhs(i, j, k) = 0;
343 Array4<const int> u_mask = physbnd_mask[
IntVars::xmom].const_array(mfi);
344 Array4<const int> v_mask = physbnd_mask[
IntVars::ymom].const_array(mfi);
345 Array4<const int> w_mask = physbnd_mask[
IntVars::zmom].const_array(mfi);
347 ParallelFor(bxx, bxy, bxz,
348 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
350 if (u_vfrac(i,j,k)>0.) {
351 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
353 if (u_cflag(i,j,k).isCovered())
355 rho_u_rhs(i, j, k) = 0.;
357 else if (u_cflag(i,j,k).isRegular())
359 rho_u_rhs(i, j, k) = - ( (u_afrac_x(i+1, j , k ) * flx_u_arr[0](i+1, j , k ) - u_afrac_x(i, j, k) * flx_u_arr[0](i, j, k)) * dxInv * mfsq
360 + (u_afrac_y(i , j+1, k ) * flx_u_arr[1](i , j+1, k ) - u_afrac_y(i, j, k) * flx_u_arr[1](i, j, k)) * dyInv * mfsq
361 + (u_afrac_z(i , j , k+1) * flx_u_arr[2](i , j , k+1) - u_afrac_z(i, j, k) * flx_u_arr[2](i, j, k)) * dzInv ) / u_vfrac(i,j,k);
366 Real fxm = flx_u_arr[0](i,j,k);
367 if (u_afrac_x(i,j,k) != Real(0.0) && u_afrac_x(i,j,k) != Real(1.0)) {
368 int jj = j +
static_cast<int>(std::copysign(Real(1.0), u_fcx(i,j,k,0)));
369 int kk = k +
static_cast<int>(std::copysign(Real(1.0), u_fcx(i,j,k,1)));
370 Real fracy = (u_mask(i-1,jj,k) || u_mask(i,jj,k)) ? std::abs(u_fcx(i,j,k,0)) : Real(0.0);
371 Real fracz = (u_mask(i-1,j,kk) || u_mask(i,j,kk)) ? std::abs(u_fcx(i,j,k,1)) : Real(0.0);
372 fxm = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxm
373 + fracy *(Real(1.0)-fracz)*flx_u_arr[0](i,jj,k )
374 + fracz *(Real(1.0)-fracy)*flx_u_arr[0](i,j ,kk)
375 + fracy * fracz *flx_u_arr[0](i,jj,kk);
378 Real fxp = flx_u_arr[0](i+1,j,k);
379 if (u_afrac_x(i+1,j,k) != Real(0.0) && u_afrac_x(i+1,j,k) != Real(1.0)) {
380 int jj = j +
static_cast<int>(std::copysign(Real(1.0),u_fcx(i+1,j,k,0)));
381 int kk = k +
static_cast<int>(std::copysign(Real(1.0),u_fcx(i+1,j,k,1)));
382 Real fracy = (u_mask(i,jj,k) || u_mask(i+1,jj,k)) ? std::abs(u_fcx(i+1,j,k,0)) : Real(0.0);
383 Real fracz = (u_mask(i,j,kk) || u_mask(i+1,j,kk)) ? std::abs(u_fcx(i+1,j,k,1)) : Real(0.0);
384 fxp = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxp
385 + fracy *(Real(1.0)-fracz)*flx_u_arr[0](i+1,jj,k )
386 + fracz *(Real(1.0)-fracy)*flx_u_arr[0](i+1,j ,kk)
387 + fracy * fracz *flx_u_arr[0](i+1,jj,kk);
390 Real fym = flx_u_arr[1](i,j,k);
391 if (u_afrac_y(i,j,k) != Real(0.0) && u_afrac_y(i,j,k) != Real(1.0)) {
392 int ii = i +
static_cast<int>(std::copysign(Real(1.0),u_fcy(i,j,k,0)));
393 int kk = k +
static_cast<int>(std::copysign(Real(1.0),u_fcy(i,j,k,1)));
394 Real fracx = (u_mask(ii,j-1,k) || u_mask(ii,j,k)) ? std::abs(u_fcy(i,j,k,0)) : Real(0.0);
395 Real fracz = (u_mask(i,j-1,kk) || u_mask(i,j,kk)) ? std::abs(u_fcy(i,j,k,1)) : Real(0.0);
396 fym = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fym
397 + fracx *(Real(1.0)-fracz)*flx_u_arr[1](ii,j,k )
398 + fracz *(Real(1.0)-fracx)*flx_u_arr[1](i ,j,kk)
399 + fracx * fracz *flx_u_arr[1](ii,j,kk);
402 Real fyp = flx_u_arr[1](i,j+1,k);
403 if (u_afrac_y(i,j+1,k) != Real(0.0) && u_afrac_y(i,j+1,k) != Real(1.0)) {
404 int ii = i +
static_cast<int>(std::copysign(Real(1.0),u_fcy(i,j+1,k,0)));
405 int kk = k +
static_cast<int>(std::copysign(Real(1.0),u_fcy(i,j+1,k,1)));
406 Real fracx = (u_mask(ii,j,k) || u_mask(ii,j+1,k)) ? std::abs(u_fcy(i,j+1,k,0)) : Real(0.0);
407 Real fracz = (u_mask(i,j,kk) || u_mask(i,j+1,kk)) ? std::abs(u_fcy(i,j+1,k,1)) : Real(0.0);
408 fyp = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fyp
409 + fracx *(Real(1.0)-fracz)*flx_u_arr[1](ii,j+1,k )
410 + fracz *(Real(1.0)-fracx)*flx_u_arr[1](i ,j+1,kk)
411 + fracx * fracz *flx_u_arr[1](ii,j+1,kk);
414 Real fzm = flx_u_arr[2](i,j,k);
415 if (u_afrac_z(i,j,k) != Real(0.0) && u_afrac_z(i,j,k) != Real(1.0)) {
416 int ii = i +
static_cast<int>(std::copysign(Real(1.0),u_fcz(i,j,k,0)));
417 int jj = j +
static_cast<int>(std::copysign(Real(1.0),u_fcz(i,j,k,1)));
418 Real fracx = (u_mask(ii,j,k-1) || u_mask(ii,j,k)) ? std::abs(u_fcz(i,j,k,0)) : Real(0.0);
419 Real fracy = (u_mask(i,jj,k-1) || u_mask(i,jj,k)) ? std::abs(u_fcz(i,j,k,1)) : Real(0.0);
420 fzm = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzm
421 + fracx *(Real(1.0)-fracy)*flx_u_arr[2](ii,j ,k)
422 + fracy *(Real(1.0)-fracx)*flx_u_arr[2](i ,jj,k)
423 + fracx * fracy *flx_u_arr[2](ii,jj,k);
426 Real fzp = flx_u_arr[2](i,j,k+1);
427 if (u_afrac_z(i,j,k+1) != Real(0.0) && u_afrac_z(i,j,k+1) != Real(1.0)) {
428 int ii = i +
static_cast<int>(std::copysign(Real(1.0),u_fcz(i,j,k+1,0)));
429 int jj = j +
static_cast<int>(std::copysign(Real(1.0),u_fcz(i,j,k+1,1)));
430 Real fracx = (u_mask(ii,j,k) || u_mask(ii,j,k+1)) ? std::abs(u_fcz(i,j,k+1,0)) : Real(0.0);
431 Real fracy = (u_mask(i,jj,k) || u_mask(i,jj,k+1)) ? std::abs(u_fcz(i,j,k+1,1)) : Real(0.0);
432 fzp = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzp
433 + fracx *(Real(1.0)-fracy)*flx_u_arr[2](ii,j ,k+1)
434 + fracy *(Real(1.0)-fracx)*flx_u_arr[2](i ,jj,k+1)
435 + fracx * fracy *flx_u_arr[2](ii,jj,k+1);
438 rho_u_rhs(i, j, k) = - ( (u_afrac_x(i+1, j , k ) * fxp - u_afrac_x(i, j, k) * fxm) * dxInv * mfsq
439 + (u_afrac_y(i , j+1, k ) * fyp - u_afrac_y(i, j, k) * fym) * dyInv * mfsq
440 + (u_afrac_z(i , j , k+1) * fzp - u_afrac_z(i, j, k) * fzm) * dzInv ) / u_vfrac(i,j,k);
444 rho_u_rhs(i, j, k) = 0.;
447 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
449 if (v_vfrac(i,j,k)>0.) {
450 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
452 if (v_cflag(i,j,k).isCovered())
454 rho_v_rhs(i, j, k) = 0.;
456 else if (v_cflag(i,j,k).isRegular())
458 rho_v_rhs(i, j, k) = - ( (v_afrac_x(i+1, j , k ) * flx_v_arr[0](i+1, j , k ) - v_afrac_x(i, j, k) * flx_v_arr[0](i, j, k)) * dxInv * mfsq
459 + (v_afrac_y(i , j+1, k ) * flx_v_arr[1](i , j+1, k ) - v_afrac_y(i, j, k) * flx_v_arr[1](i, j, k)) * dyInv * mfsq
460 + (v_afrac_z(i , j , k+1) * flx_v_arr[2](i , j , k+1) - v_afrac_z(i, j, k) * flx_v_arr[2](i, j, k)) * dzInv ) / v_vfrac(i,j,k);
465 Real fxm = flx_v_arr[0](i,j,k);
466 if (v_afrac_x(i,j,k) != Real(0.0) && v_afrac_x(i,j,k) != Real(1.0)) {
467 int jj = j +
static_cast<int>(std::copysign(Real(1.0), v_fcx(i,j,k,0)));
468 int kk = k +
static_cast<int>(std::copysign(Real(1.0), v_fcx(i,j,k,1)));
469 Real fracy = (v_mask(i-1,jj,k) || v_mask(i,jj,k)) ? std::abs(v_fcx(i,j,k,0)) : Real(0.0);
470 Real fracz = (v_mask(i-1,j,kk) || v_mask(i,j,kk)) ? std::abs(v_fcx(i,j,k,1)) : Real(0.0);
471 fxm = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxm
472 + fracy *(Real(1.0)-fracz)*flx_v_arr[0](i,jj,k )
473 + fracz *(Real(1.0)-fracy)*flx_v_arr[0](i,j ,kk)
474 + fracy * fracz *flx_v_arr[0](i,jj,kk);
477 Real fxp = flx_v_arr[0](i+1,j,k);
478 if (v_afrac_x(i+1,j,k) != Real(0.0) && v_afrac_x(i+1,j,k) != Real(1.0)) {
479 int jj = j +
static_cast<int>(std::copysign(Real(1.0),v_fcx(i+1,j,k,0)));
480 int kk = k +
static_cast<int>(std::copysign(Real(1.0),v_fcx(i+1,j,k,1)));
481 Real fracy = (v_mask(i,jj,k) || v_mask(i+1,jj,k)) ? std::abs(v_fcx(i+1,j,k,0)) : Real(0.0);
482 Real fracz = (v_mask(i,j,kk) || v_mask(i+1,j,kk)) ? std::abs(v_fcx(i+1,j,k,1)) : Real(0.0);
483 fxp = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxp
484 + fracy *(Real(1.0)-fracz)*flx_v_arr[0](i+1,jj,k )
485 + fracz *(Real(1.0)-fracy)*flx_v_arr[0](i+1,j ,kk)
486 + fracy * fracz *flx_v_arr[0](i+1,jj,kk);
489 Real fym = flx_v_arr[1](i,j,k);
490 if (v_afrac_y(i,j,k) != Real(0.0) && v_afrac_y(i,j,k) != Real(1.0)) {
491 int ii = i +
static_cast<int>(std::copysign(Real(1.0),v_fcy(i,j,k,0)));
492 int kk = k +
static_cast<int>(std::copysign(Real(1.0),v_fcy(i,j,k,1)));
493 Real fracx = (v_mask(ii,j-1,k) || v_mask(ii,j,k)) ? std::abs(v_fcy(i,j,k,0)) : Real(0.0);
494 Real fracz = (v_mask(i,j-1,kk) || v_mask(i,j,kk)) ? std::abs(v_fcy(i,j,k,1)) : Real(0.0);
495 fym = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fym
496 + fracx *(Real(1.0)-fracz)*flx_v_arr[1](ii,j,k )
497 + fracz *(Real(1.0)-fracx)*flx_v_arr[1](i ,j,kk)
498 + fracx * fracz *flx_v_arr[1](ii,j,kk);
501 Real fyp = flx_v_arr[1](i,j+1,k);
502 if (v_afrac_y(i,j+1,k) != Real(0.0) && v_afrac_y(i,j+1,k) != Real(1.0)) {
503 int ii = i +
static_cast<int>(std::copysign(Real(1.0),v_fcy(i,j+1,k,0)));
504 int kk = k +
static_cast<int>(std::copysign(Real(1.0),v_fcy(i,j+1,k,1)));
505 Real fracx = (v_mask(ii,j,k) || v_mask(ii,j+1,k)) ? std::abs(v_fcy(i,j+1,k,0)) : Real(0.0);
506 Real fracz = (v_mask(i,j,kk) || v_mask(i,j+1,kk)) ? std::abs(v_fcy(i,j+1,k,1)) : Real(0.0);
507 fyp = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fyp
508 + fracx *(Real(1.0)-fracz)*flx_v_arr[1](ii,j+1,k )
509 + fracz *(Real(1.0)-fracx)*flx_v_arr[1](i ,j+1,kk)
510 + fracx * fracz *flx_v_arr[1](ii,j+1,kk);
513 Real fzm = flx_v_arr[2](i,j,k);
514 if (v_afrac_z(i,j,k) != Real(0.0) && v_afrac_z(i,j,k) != Real(1.0)) {
515 int ii = i +
static_cast<int>(std::copysign(Real(1.0),v_fcz(i,j,k,0)));
516 int jj = j +
static_cast<int>(std::copysign(Real(1.0),v_fcz(i,j,k,1)));
517 Real fracx = (v_mask(ii,j,k-1) || v_mask(ii,j,k)) ? std::abs(v_fcz(i,j,k,0)) : Real(0.0);
518 Real fracy = (v_mask(i,jj,k-1) || v_mask(i,jj,k)) ? std::abs(v_fcz(i,j,k,1)) : Real(0.0);
519 fzm = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzm
520 + fracx *(Real(1.0)-fracy)*flx_v_arr[2](ii,j ,k)
521 + fracy *(Real(1.0)-fracx)*flx_v_arr[2](i ,jj,k)
522 + fracx * fracy *flx_v_arr[2](ii,jj,k);
525 Real fzp = flx_v_arr[2](i,j,k+1);
526 if (v_afrac_z(i,j,k+1) != Real(0.0) && v_afrac_z(i,j,k+1) != Real(1.0)) {
527 int ii = i +
static_cast<int>(std::copysign(Real(1.0),v_fcz(i,j,k+1,0)));
528 int jj = j +
static_cast<int>(std::copysign(Real(1.0),v_fcz(i,j,k+1,1)));
529 Real fracx = (v_mask(ii,j,k) || v_mask(ii,j,k+1)) ? std::abs(v_fcz(i,j,k+1,0)) : Real(0.0);
530 Real fracy = (v_mask(i,jj,k) || v_mask(i,jj,k+1)) ? std::abs(v_fcz(i,j,k+1,1)) : Real(0.0);
531 fzp = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzp
532 + fracx *(Real(1.0)-fracy)*flx_v_arr[2](ii,j ,k+1)
533 + fracy *(Real(1.0)-fracx)*flx_v_arr[2](i ,jj,k+1)
534 + fracx * fracy *flx_v_arr[2](ii,jj,k+1);
537 rho_v_rhs(i, j, k) = - ( (v_afrac_x(i+1, j , k ) * fxp - v_afrac_x(i, j, k) * fxm) * dxInv * mfsq
538 + (v_afrac_y(i , j+1, k ) * fyp - v_afrac_y(i, j, k) * fym) * dyInv * mfsq
539 + (v_afrac_z(i , j , k+1) * fzp - v_afrac_z(i, j, k) * fzm) * dzInv ) / v_vfrac(i,j,k);
543 rho_v_rhs(i, j, k) = 0.;
546 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
548 if (w_vfrac(i,j,k)>0.) {
549 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
551 if (w_cflag(i,j,k).isCovered())
553 rho_w_rhs(i, j, k) = 0.;
555 else if (w_cflag(i,j,k).isRegular())
557 rho_w_rhs(i, j, k) = - ( (w_afrac_x(i+1, j , k ) * flx_w_arr[0](i+1, j , k ) - w_afrac_x(i, j, k) * flx_w_arr[0](i, j, k)) * dxInv * mfsq
558 + (w_afrac_y(i , j+1, k ) * flx_w_arr[1](i , j+1, k ) - w_afrac_y(i, j, k) * flx_w_arr[1](i, j, k)) * dyInv * mfsq
559 + (w_afrac_z(i , j , k+1) * flx_w_arr[2](i , j , k+1) - w_afrac_z(i, j, k) * flx_w_arr[2](i, j, k)) * dzInv ) / w_vfrac(i,j,k);
564 Real fxm = flx_w_arr[0](i,j,k);
565 if (w_afrac_x(i,j,k) != Real(0.0) && w_afrac_x(i,j,k) != Real(1.0)) {
566 int jj = j +
static_cast<int>(std::copysign(Real(1.0), w_fcx(i,j,k,0)));
567 int kk = k +
static_cast<int>(std::copysign(Real(1.0), w_fcx(i,j,k,1)));
568 Real fracy = (w_mask(i-1,jj,k) || w_mask(i,jj,k)) ? std::abs(w_fcx(i,j,k,0)) : Real(0.0);
569 Real fracz = (w_mask(i-1,j,kk) || w_mask(i,j,kk)) ? std::abs(w_fcx(i,j,k,1)) : Real(0.0);
570 fxm = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxm
571 + fracy *(Real(1.0)-fracz)*flx_w_arr[0](i,jj,k )
572 + fracz *(Real(1.0)-fracy)*flx_w_arr[0](i,j ,kk)
573 + fracy * fracz *flx_w_arr[0](i,jj,kk);
576 Real fxp = flx_w_arr[0](i+1,j,k);
577 if (w_afrac_x(i+1,j,k) != Real(0.0) && w_afrac_x(i+1,j,k) != Real(1.0)) {
578 int jj = j +
static_cast<int>(std::copysign(Real(1.0),w_fcx(i+1,j,k,0)));
579 int kk = k +
static_cast<int>(std::copysign(Real(1.0),w_fcx(i+1,j,k,1)));
580 Real fracy = (w_mask(i,jj,k) || w_mask(i+1,jj,k)) ? std::abs(w_fcx(i+1,j,k,0)) : Real(0.0);
581 Real fracz = (w_mask(i,j,kk) || w_mask(i+1,j,kk)) ? std::abs(w_fcx(i+1,j,k,1)) : Real(0.0);
582 fxp = (Real(1.0)-fracy)*(Real(1.0)-fracz)*fxp
583 + fracy *(Real(1.0)-fracz)*flx_w_arr[0](i+1,jj,k )
584 + fracz *(Real(1.0)-fracy)*flx_w_arr[0](i+1,j ,kk)
585 + fracy * fracz *flx_w_arr[0](i+1,jj,kk);
588 Real fym = flx_w_arr[1](i,j,k);
589 if (w_afrac_y(i,j,k) != Real(0.0) && w_afrac_y(i,j,k) != Real(1.0)) {
590 int ii = i +
static_cast<int>(std::copysign(Real(1.0),w_fcy(i,j,k,0)));
591 int kk = k +
static_cast<int>(std::copysign(Real(1.0),w_fcy(i,j,k,1)));
592 Real fracx = (w_mask(ii,j-1,k) || w_mask(ii,j,k)) ? std::abs(w_fcy(i,j,k,0)) : Real(0.0);
593 Real fracz = (w_mask(i,j-1,kk) || w_mask(i,j,kk)) ? std::abs(w_fcy(i,j,k,1)) : Real(0.0);
594 fym = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fym
595 + fracx *(Real(1.0)-fracz)*flx_w_arr[1](ii,j,k )
596 + fracz *(Real(1.0)-fracx)*flx_w_arr[1](i ,j,kk)
597 + fracx * fracz *flx_w_arr[1](ii,j,kk);
600 Real fyp = flx_w_arr[1](i,j+1,k);
601 if (w_afrac_y(i,j+1,k) != Real(0.0) && w_afrac_y(i,j+1,k) != Real(1.0)) {
602 int ii = i +
static_cast<int>(std::copysign(Real(1.0),w_fcy(i,j+1,k,0)));
603 int kk = k +
static_cast<int>(std::copysign(Real(1.0),w_fcy(i,j+1,k,1)));
604 Real fracx = (w_mask(ii,j,k) || w_mask(ii,j+1,k)) ? std::abs(w_fcy(i,j+1,k,0)) : Real(0.0);
605 Real fracz = (w_mask(i,j,kk) || w_mask(i,j+1,kk)) ? std::abs(w_fcy(i,j+1,k,1)) : Real(0.0);
606 fyp = (Real(1.0)-fracx)*(Real(1.0)-fracz)*fyp
607 + fracx *(Real(1.0)-fracz)*flx_w_arr[1](ii,j+1,k )
608 + fracz *(Real(1.0)-fracx)*flx_w_arr[1](i ,j+1,kk)
609 + fracx * fracz *flx_w_arr[1](ii,j+1,kk);
612 Real fzm = flx_w_arr[2](i,j,k);
613 if (w_afrac_z(i,j,k) != Real(0.0) && w_afrac_z(i,j,k) != Real(1.0)) {
614 int ii = i +
static_cast<int>(std::copysign(Real(1.0),w_fcz(i,j,k,0)));
615 int jj = j +
static_cast<int>(std::copysign(Real(1.0),w_fcz(i,j,k,1)));
616 Real fracx = (w_mask(ii,j,k-1) || w_mask(ii,j,k)) ? std::abs(w_fcz(i,j,k,0)) : Real(0.0);
617 Real fracy = (w_mask(i,jj,k-1) || w_mask(i,jj,k)) ? std::abs(w_fcz(i,j,k,1)) : Real(0.0);
618 fzm = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzm
619 + fracx *(Real(1.0)-fracy)*flx_w_arr[2](ii,j ,k)
620 + fracy *(Real(1.0)-fracx)*flx_w_arr[2](i ,jj,k)
621 + fracx * fracy *flx_w_arr[2](ii,jj,k);
624 Real fzp = flx_w_arr[2](i,j,k+1);
625 if (w_afrac_z(i,j,k+1) != Real(0.0) && w_afrac_z(i,j,k+1) != Real(1.0)) {
626 int ii = i +
static_cast<int>(std::copysign(Real(1.0),w_fcz(i,j,k+1,0)));
627 int jj = j +
static_cast<int>(std::copysign(Real(1.0),w_fcz(i,j,k+1,1)));
628 Real fracx = (w_mask(ii,j,k) || w_mask(ii,j,k+1)) ? std::abs(w_fcz(i,j,k+1,0)) : Real(0.0);
629 Real fracy = (w_mask(i,jj,k) || w_mask(i,jj,k+1)) ? std::abs(w_fcz(i,j,k+1,1)) : Real(0.0);
630 fzp = (Real(1.0)-fracx)*(Real(1.0)-fracy)*fzp
631 + fracx *(Real(1.0)-fracy)*flx_w_arr[2](ii,j ,k+1)
632 + fracy *(Real(1.0)-fracx)*flx_w_arr[2](i ,jj,k+1)
633 + fracx * fracy *flx_w_arr[2](ii,jj,k+1);
636 rho_w_rhs(i, j, k) = - ( (w_afrac_x(i+1, j , k ) * fxp - w_afrac_x(i, j, k) * fxm) * dxInv * mfsq
637 + (w_afrac_y(i , j+1, k ) * fyp - w_afrac_y(i, j, k) * fym) * dyInv * mfsq
638 + (w_afrac_z(i , j , k+1) * fzp - w_afrac_z(i, j, k) * fzm) * dzInv ) / w_vfrac(i,j,k);
642 rho_w_rhs(i, j, k) = 0;
void AdvectionSrcForMom_EB(const MFIter &mfi, const Box &bxx, const Box &bxy, const Box &bxz, const Vector< Box > &bxx_grown, const Vector< Box > &bxy_grown, const Vector< Box > &bxz_grown, const Array4< Real > &rho_u_rhs, const Array4< Real > &rho_v_rhs, const Array4< Real > &rho_w_rhs, const Array4< const Real > &u, const Array4< const Real > &v, const Array4< const Real > &w, const Array4< const Real > &rho_u, const Array4< const Real > &rho_v, const Array4< const Real > &omega, const GpuArray< Real, AMREX_SPACEDIM > &cellSizeInv, const Array4< const Real > &mf_mx, const Array4< const Real > &mf_ux, const Array4< const Real > &mf_vx, const Array4< const Real > &mf_my, const Array4< const Real > &mf_uy, const Array4< const Real > &mf_vy, const AdvType horiz_adv_type, const AdvType vert_adv_type, const Real horiz_upw_frac, const Real vert_upw_frac, const eb_ &ebfact, GpuArray< Array4< Real >, AMREX_SPACEDIM > &flx_u_arr, GpuArray< Array4< Real >, AMREX_SPACEDIM > &flx_v_arr, GpuArray< Array4< Real >, AMREX_SPACEDIM > &flx_w_arr, const Vector< iMultiFab > &physbnd_mask, const bool already_on_centroids, const int lo_z_face, const int hi_z_face, const Box &)
Definition: ERF_AdvectionSrcForMom_EB.cpp:44
eb_aux_ const * get_w_const_factory() const noexcept
Definition: ERF_EB.H:50
eb_aux_ const * get_v_const_factory() const noexcept
Definition: ERF_EB.H:49
eb_aux_ const * get_u_const_factory() const noexcept
Definition: ERF_EB.H:48
@ ymom
Definition: ERF_IndexDefines.H:160
@ zmom
Definition: ERF_IndexDefines.H:161
@ xmom
Definition: ERF_IndexDefines.H:159
@ omega
Definition: ERF_Morrison.H:53