Skip to content

Commit 5d83c33

Browse files
authored
Fix upwind real bcs. (#2705)
1 parent 0115dac commit 5d83c33

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

Source/BoundaryConditions/ERF_BoundaryConditionsRealbdy.cpp

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)