@@ -380,16 +380,27 @@ ERF::fill_from_realbdy_upwind (const Vector<MultiFab*>& mfs,
380380 const Array4<Real>& u_arr = mf_u.array (mfi);
381381 const Array4<Real>& v_arr = mf_v.array (mfi);
382382
383+ auto lb_u = lbound (u_arr); lb_u.x += ngvect_vels[0 ]; lb_u.y += ngvect_vels[1 ];
384+ auto ub_u = ubound (u_arr); ub_u.x -= ngvect_vels[0 ]; ub_u.y -= ngvect_vels[1 ];
385+ auto lb_v = lbound (v_arr); lb_v.x += ngvect_vels[0 ]; lb_v.y += ngvect_vels[1 ];
386+ auto ub_v = ubound (v_arr); ub_v.x -= ngvect_vels[0 ]; ub_v.y -= ngvect_vels[1 ];
387+
383388 // NOTE: Xlo/hi boxes own corner cells (Ylo/hi)
384389 ParallelFor (bx_xlo, bx_xhi,
385390 [=] AMREX_GPU_DEVICE (int i, int j, int k)
386391 {
392+ // Limit for BDY FAB data
387393 int ii = std::max (i , dom_lo.x );
388394 int jj = std::max (j , dom_lo.y );
389395 jj = std::min (jj, dom_hi.y );
390- if ( (u_arr (dom_lo.x ,jj,k) >= 0.0 ) ||
391- ((jj == dom_lo.y ) && (v_arr (ii,dom_lo.y ,k) >= 0.0 )) ||
392- ((jj == dom_hi.y ) && (v_arr (ii,dom_hi.y +1 ,k) <= 0.0 )) ) {
396+
397+ // Limit for u_arr and v_arr
398+ int ju = std::min (std::max (j, lb_u.y ), ub_u.y );
399+ int iv = std::min (std::max (i, lb_v.x ), ub_v.x );
400+
401+ if ( (u_arr (dom_lo.x ,ju,k) >= 0.0 ) ||
402+ ((jj == dom_lo.y ) && (v_arr (iv,dom_lo.y ,k) >= 0.0 )) ||
403+ ((jj == dom_hi.y ) && (v_arr (iv,dom_hi.y +1 ,k) <= 0.0 )) ) {
393404 dest_arr (i,j,k,comp_idx) = oma * bdatxlo_n (ii,jj,k,0 )
394405 + alpha * bdatxlo_np1 (ii,jj,k,0 );
395406 if (var_idx == Vars::cons) {
@@ -401,12 +412,18 @@ ERF::fill_from_realbdy_upwind (const Vector<MultiFab*>& mfs,
401412 },
402413 [=] AMREX_GPU_DEVICE (int i, int j, int k)
403414 {
415+ // Limit for BDY FAB data
404416 int ii = std::min (i , dom_hi.x );
405417 int jj = std::max (j , dom_lo.y );
406418 jj = std::min (jj, dom_hi.y );
407- if ( (u_arr (dom_hi.x +1 ,jj,k) <= 0.0 ) ||
408- ((jj == dom_lo.y ) && (v_arr (ii,dom_lo.y ,k) >= 0.0 )) ||
409- ((jj == dom_hi.y ) && (v_arr (ii,dom_hi.y +1 ,k) <= 0.0 )) ) {
419+
420+ // Limit for u_arr and v_arr
421+ int ju = std::min (std::max (j, lb_u.y ), ub_u.y );
422+ int iv = std::min (std::max (i, lb_v.x ), ub_v.x );
423+
424+ if ( (u_arr (dom_hi.x +1 ,ju,k) <= 0.0 ) ||
425+ ((jj == dom_lo.y ) && (v_arr (iv,dom_lo.y ,k) >= 0.0 )) ||
426+ ((jj == dom_hi.y ) && (v_arr (iv,dom_hi.y +1 ,k) <= 0.0 )) ) {
410427 dest_arr (i,j,k,comp_idx) = oma * bdatxhi_n (ii,jj,k,0 )
411428 + alpha * bdatxhi_np1 (ii,jj,k,0 );
412429 if (var_idx == Vars::cons) {
@@ -423,8 +440,13 @@ ERF::fill_from_realbdy_upwind (const Vector<MultiFab*>& mfs,
423440 ParallelFor (bx_ylo, bx_yhi,
424441 [=] AMREX_GPU_DEVICE (int i, int j, int k)
425442 {
443+ // Limit for BDY FAB data
426444 int jj = std::max (j, dom_lo.y );
427- if (v_arr (i,dom_lo.y ,k) >= 0.0 ) {
445+
446+ // Limit for v_arr
447+ int iv = std::min (std::max (i, lb_v.x ), ub_v.x );
448+
449+ if (v_arr (iv,dom_lo.y ,k) >= 0.0 ) {
428450 dest_arr (i,j,k,comp_idx) = oma * bdatylo_n (i,jj,k,0 )
429451 + alpha * bdatylo_np1 (i,jj,k,0 );
430452 if (var_idx == Vars::cons) {
@@ -436,8 +458,13 @@ ERF::fill_from_realbdy_upwind (const Vector<MultiFab*>& mfs,
436458 },
437459 [=] AMREX_GPU_DEVICE (int i, int j, int k)
438460 {
461+ // Limit for BDY FAB data
439462 int jj = std::min (j, dom_hi.y );
440- if (v_arr (i,dom_hi.y +1 ,k) <= 0.0 ) {
463+
464+ // Limit for v_arr
465+ int iv = std::min (std::max (i, lb_v.x ), ub_v.x );
466+
467+ if (v_arr (iv,dom_hi.y +1 ,k) <= 0.0 ) {
441468 dest_arr (i,j,k,comp_idx) = oma * bdatyhi_n (i,jj,k,0 )
442469 + alpha * bdatyhi_np1 (i,jj,k,0 );
443470 if (var_idx == Vars::cons) {
0 commit comments