From 467dd681af11043304757f11d761cf0661c97e56 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Mon, 23 Sep 2024 16:10:26 -0700 Subject: [PATCH] allow hidden dimension when calling FFlux routines (#4162) The FFlux routines in AMReX_MLPoisson.H and AMReX_MLALaplacian.H previously had assertions that there were no hidden directions. We have replaced that by if tests that only compute the fluxes if the direction is not hidden and otherwise fill the flux array with 0. --- Src/LinearSolvers/MLMG/AMReX_MLALaplacian.H | 184 ++++++++++++-------- Src/LinearSolvers/MLMG/AMReX_MLPoisson.H | 184 ++++++++++++-------- 2 files changed, 222 insertions(+), 146 deletions(-) diff --git a/Src/LinearSolvers/MLMG/AMReX_MLALaplacian.H b/Src/LinearSolvers/MLMG/AMReX_MLALaplacian.H index dc95e39d9cd..9df9088e77d 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLALaplacian.H +++ b/Src/LinearSolvers/MLMG/AMReX_MLALaplacian.H @@ -588,8 +588,6 @@ MLALaplacianT::FFlux (int amrlev, const MFIter& mfi, const Array& flux, const FAB& sol, Location, int face_only) const { - AMREX_ASSERT(!this->hasHiddenDimension()); - BL_PROFILE("MLALaplacian::FFlux()"); const int ncomp = this->getNComp(); @@ -609,103 +607,143 @@ MLALaplacianT::FFlux (int amrlev, const MFIter& mfi, #if (AMREX_SPACEDIM == 3) if (face_only) { - RT fac = m_b_scalar * RT(dxinv[0]); - Box blo = amrex::bdryLo(box, 0); - int blen = box.length(0); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp); - }); - fac = m_b_scalar * RT(dxinv[1]); - blo = amrex::bdryLo(box, 1); - blen = box.length(1); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp); - }); - fac = m_b_scalar * RT(dxinv[2]); - blo = amrex::bdryLo(box, 2); - blen = box.length(2); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlalap_flux_zface(tbox, fzarr, solarr, fac, blen, ncomp); - }); - } else { - RT fac = m_b_scalar * RT(dxinv[0]); - Box bflux = amrex::surroundingNodes(box, 0); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp); - }); - fac = m_b_scalar * RT(dxinv[1]); - bflux = amrex::surroundingNodes(box, 1); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp); - }); - fac = m_b_scalar * RT(dxinv[2]); - bflux = amrex::surroundingNodes(box, 2); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlalap_flux_z(tbox, fzarr, solarr, fac, ncomp); - }); - } -#elif (AMREX_SPACEDIM == 2) - if (face_only) { - RT fac = m_b_scalar * RT(dxinv[0]); - Box blo = amrex::bdryLo(box, 0); - int blen = box.length(0); - if (this->m_has_metric_term) { - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlalap_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo, ncomp); - }); - } else { + if (this->hiddenDirection() != 0) { + RT fac = m_b_scalar * RT(dxinv[0]); + Box blo = amrex::bdryLo(box, 0); + int blen = box.length(0); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp); }); + } else { + flux[0]->template setVal(RT(0.0)); } - fac = m_b_scalar * RT(dxinv[1]); - blo = amrex::bdryLo(box, 1); - blen = box.length(1); - if (this->m_has_metric_term) { + if (this->hiddenDirection() != 1) { + RT fac = m_b_scalar * RT(dxinv[1]); + Box blo = amrex::bdryLo(box, 1); + int blen = box.length(1); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { - mlalap_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo, ncomp); + mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp); }); } else { + flux[1]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 2) { + RT fac = m_b_scalar * RT(dxinv[2]); + Box blo = amrex::bdryLo(box, 2); + int blen = box.length(2); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { - mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp); + mlalap_flux_zface(tbox, fzarr, solarr, fac, blen, ncomp); }); + } else { + flux[2]->template setVal(RT(0.0)); } } else { - RT fac = m_b_scalar * RT(dxinv[0]); - Box bflux = amrex::surroundingNodes(box, 0); - if (this->m_has_metric_term) { - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlalap_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo, ncomp); - }); - } else { + if (this->hiddenDirection() != 0) { + RT fac = m_b_scalar * RT(dxinv[0]); + Box bflux = amrex::surroundingNodes(box, 0); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp); }); + } else { + flux[0]->template setVal(RT(0.0)); } - fac = m_b_scalar * RT(dxinv[1]); - bflux = amrex::surroundingNodes(box, 1); - if (this->m_has_metric_term) { + if (this->hiddenDirection() != 1) { + RT fac = m_b_scalar * RT(dxinv[1]); + Box bflux = amrex::surroundingNodes(box, 1); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { - mlalap_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo, ncomp); + mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp); }); } else { + flux[1]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 2) { + RT fac = m_b_scalar * RT(dxinv[2]); + Box bflux = amrex::surroundingNodes(box, 2); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { - mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp); + mlalap_flux_z(tbox, fzarr, solarr, fac, ncomp); }); + } else { + flux[2]->template setVal(RT(0.0)); + } + } +#elif (AMREX_SPACEDIM == 2) + if (face_only) { + if (this->hiddenDirection() != 0) { + RT fac = m_b_scalar * RT(dxinv[0]); + Box blo = amrex::bdryLo(box, 0); + int blen = box.length(0); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlalap_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo, ncomp); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlalap_flux_xface(tbox, fxarr, solarr, fac, blen, ncomp); + }); + } + } else { + flux[0]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 1) { + RT fac = m_b_scalar * RT(dxinv[1]); + Box blo = amrex::bdryLo(box, 1); + int blen = box.length(1); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlalap_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo, ncomp); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlalap_flux_yface(tbox, fyarr, solarr, fac, blen, ncomp); + }); + } + } else { + flux[1]->template setVal(RT(0.0)); + } + } else { + if (this->hiddenDirection() != 0) { + RT fac = m_b_scalar * RT(dxinv[0]); + Box bflux = amrex::surroundingNodes(box, 0); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlalap_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo, ncomp); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlalap_flux_x(tbox, fxarr, solarr, fac, ncomp); + }); + } + } else { + flux[0]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 1) { + RT fac = m_b_scalar * RT(dxinv[1]); + Box bflux = amrex::surroundingNodes(box, 1); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlalap_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo, ncomp); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlalap_flux_y(tbox, fyarr, solarr, fac, ncomp); + }); + } + } else { + flux[1]->template setVal(RT(0.0)); } } #else diff --git a/Src/LinearSolvers/MLMG/AMReX_MLPoisson.H b/Src/LinearSolvers/MLMG/AMReX_MLPoisson.H index 6fecf13eafb..4a529dff9d7 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLPoisson.H +++ b/Src/LinearSolvers/MLMG/AMReX_MLPoisson.H @@ -858,8 +858,6 @@ MLPoissonT::FFlux (int amrlev, const MFIter& mfi, const Array& flux, const FAB& sol, Location, const int face_only) const { - AMREX_ASSERT(!this->hasHiddenDimension()); - BL_PROFILE("MLPoisson::FFlux()"); const int mglev = 0; @@ -878,103 +876,143 @@ MLPoissonT::FFlux (int amrlev, const MFIter& mfi, #if (AMREX_SPACEDIM == 3) if (face_only) { - RT fac = RT(dxinv[0]); - Box blo = amrex::bdryLo(box, 0); - int blen = box.length(0); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen); - }); - fac = RT(dxinv[1]); - blo = amrex::bdryLo(box, 1); - blen = box.length(1); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen); - }); - fac = RT(dxinv[2]); - blo = amrex::bdryLo(box, 2); - blen = box.length(2); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlpoisson_flux_zface(tbox, fzarr, solarr, fac, blen); - }); - } else { - RT fac = RT(dxinv[0]); - Box bflux = amrex::surroundingNodes(box, 0); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlpoisson_flux_x(tbox, fxarr, solarr, fac); - }); - fac = RT(dxinv[1]); - bflux = amrex::surroundingNodes(box, 1); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlpoisson_flux_y(tbox, fyarr, solarr, fac); - }); - fac = RT(dxinv[2]); - bflux = amrex::surroundingNodes(box, 2); - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlpoisson_flux_z(tbox, fzarr, solarr, fac); - }); - } -#elif (AMREX_SPACEDIM == 2) - if (face_only) { - RT fac = RT(dxinv[0]); - Box blo = amrex::bdryLo(box, 0); - int blen = box.length(0); - if (this->m_has_metric_term) { - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, - { - mlpoisson_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo); - }); - } else { + if (this->hiddenDirection() != 0) { + RT fac = RT(dxinv[0]); + Box blo = amrex::bdryLo(box, 0); + int blen = box.length(0); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen); }); + } else { + flux[0]->template setVal(RT(0.0)); } - fac = RT(dxinv[1]); - blo = amrex::bdryLo(box, 1); - blen = box.length(1); - if (this->m_has_metric_term) { + if (this->hiddenDirection() != 1) { + RT fac = RT(dxinv[1]); + Box blo = amrex::bdryLo(box, 1); + int blen = box.length(1); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { - mlpoisson_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo); + mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen); }); } else { + flux[1]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 2) { + RT fac = RT(dxinv[2]); + Box blo = amrex::bdryLo(box, 2); + int blen = box.length(2); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, { - mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen); + mlpoisson_flux_zface(tbox, fzarr, solarr, fac, blen); }); + } else { + flux[2]->template setVal(RT(0.0)); } } else { - RT fac = RT(dxinv[0]); - Box bflux = amrex::surroundingNodes(box, 0); - if (this->m_has_metric_term) { - AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, - { - mlpoisson_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo); - }); - } else { + if (this->hiddenDirection() != 0) { + RT fac = RT(dxinv[0]); + Box bflux = amrex::surroundingNodes(box, 0); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { mlpoisson_flux_x(tbox, fxarr, solarr, fac); }); + } else { + flux[0]->template setVal(RT(0.0)); } - fac = RT(dxinv[1]); - bflux = amrex::surroundingNodes(box, 1); - if (this->m_has_metric_term) { + if (this->hiddenDirection() != 1) { + RT fac = RT(dxinv[1]); + Box bflux = amrex::surroundingNodes(box, 1); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { - mlpoisson_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo); + mlpoisson_flux_y(tbox, fyarr, solarr, fac); }); } else { + flux[1]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 2) { + RT fac = RT(dxinv[2]); + Box bflux = amrex::surroundingNodes(box, 2); AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, { - mlpoisson_flux_y(tbox, fyarr, solarr, fac); + mlpoisson_flux_z(tbox, fzarr, solarr, fac); }); + } else { + flux[2]->template setVal(RT(0.0)); + } + } +#elif (AMREX_SPACEDIM == 2) + if (face_only) { + if (this->hiddenDirection() != 0) { + RT fac = RT(dxinv[0]); + Box blo = amrex::bdryLo(box, 0); + int blen = box.length(0); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlpoisson_flux_xface_m(tbox, fxarr, solarr, fac, blen, dx, probxlo); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlpoisson_flux_xface(tbox, fxarr, solarr, fac, blen); + }); + } + } else { + flux[0]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 1) { + RT fac = RT(dxinv[1]); + Box blo = amrex::bdryLo(box, 1); + int blen = box.length(1); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlpoisson_flux_yface_m(tbox, fyarr, solarr, fac, blen, dx, probxlo); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( blo, tbox, + { + mlpoisson_flux_yface(tbox, fyarr, solarr, fac, blen); + }); + } + } else { + flux[1]->template setVal(RT(0.0)); + } + } else { + if (this->hiddenDirection() != 0) { + RT fac = RT(dxinv[0]); + Box bflux = amrex::surroundingNodes(box, 0); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlpoisson_flux_x_m(tbox, fxarr, solarr, fac, dx, probxlo); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlpoisson_flux_x(tbox, fxarr, solarr, fac); + }); + } + } else { + flux[0]->template setVal(RT(0.0)); + } + if (this->hiddenDirection() != 1) { + RT fac = RT(dxinv[1]); + Box bflux = amrex::surroundingNodes(box, 1); + if (this->m_has_metric_term) { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlpoisson_flux_y_m(tbox, fyarr, solarr, fac, dx, probxlo); + }); + } else { + AMREX_LAUNCH_HOST_DEVICE_LAMBDA ( bflux, tbox, + { + mlpoisson_flux_y(tbox, fyarr, solarr, fac); + }); + } + } else { + flux[1]->template setVal(RT(0.0)); } } #else