Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 106 additions & 103 deletions Src/LinearSolvers/MLMG/AMReX_MLEBABecLap_2D_K.H
Original file line number Diff line number Diff line change
Expand Up @@ -163,17 +163,14 @@ void mlebabeclap_adotx_centroid (Box const& box, Array4<Real> const& y,
}

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
void mlebabeclap_adotx (Box const& box, Array4<Real> const& y,
void mlebabeclap_adotx (int i, int j, int k, int n, Array4<Real> const& y,
Array4<Real const> const& x, Array4<Real const> const& a,
Array4<Real const> const& bX, Array4<Real const> const& bY,
Array4<const int> const& ccm, Array4<EBCellFlag const> const& flag,
Array4<Real const> const& vfrc, Array4<Real const> const& apx,
Array4<Real const> const& apy, Array4<Real const> const& fcx,
Array4<Real const> const& fcy, Array4<Real const> const& ba,
Array4<Real const> const& bc, Array4<Real const> const& beb,
Array4<const int> const& ccm, EBData const& ebdata,
Array4<Real const> const& beb,
bool is_dirichlet, Array4<Real const> const& phieb,
bool is_inhomog, GpuArray<Real,AMREX_SPACEDIM> const& dxinv,
Real alpha, Real beta, int ncomp,
Real alpha, Real beta,
bool beta_on_centroid, bool phi_on_centroid) noexcept
{
Real dhx = beta*dxinv[0]*dxinv[0];
Expand All @@ -184,120 +181,126 @@ void mlebabeclap_adotx (Box const& box, Array4<Real> const& y,
bool beta_on_center = !(beta_on_centroid);
bool phi_on_center = !( phi_on_centroid);

amrex::Loop(box, ncomp, [=] (int i, int j, int k, int n) noexcept
auto const& flag = ebdata.get<EBData_t::cellflag>();
auto const& vfrc = ebdata.get<EBData_t::volfrac>();
auto const& apx = ebdata.get<EBData_t::apx>();
auto const& apy = ebdata.get<EBData_t::apy>();
auto const& fcx = ebdata.get<EBData_t::fcx>();
auto const& fcy = ebdata.get<EBData_t::fcy>();
auto const& ba = ebdata.get<EBData_t::bndryarea>();
auto const& bc = ebdata.get<EBData_t::bndrycent>();

if (flag(i,j,k).isCovered())
{
if (flag(i,j,k).isCovered())
{
y(i,j,k,n) = Real(0.0);
}
else if (flag(i,j,k).isRegular())
{
y(i,j,k,n) = alpha*a(i,j,k)*x(i,j,k,n)
- dhx * (bX(i+1,j,k,n)*(x(i+1,j,k,n) - x(i ,j,k,n))
- bX(i ,j,k,n)*(x(i ,j,k,n) - x(i-1,j,k,n)))
- dhy * (bY(i,j+1,k,n)*(x(i,j+1,k,n) - x(i,j ,k,n))
- bY(i,j ,k,n)*(x(i,j ,k,n) - x(i,j-1,k,n)));
}
else
{
Real kappa = vfrc(i,j,k);
Real apxm = apx(i,j,k);
Real apxp = apx(i+1,j,k);
Real apym = apy(i,j,k);
Real apyp = apy(i,j+1,k);
y(i,j,k,n) = Real(0.0);
}
else if (flag(i,j,k).isRegular())
{
y(i,j,k,n) = alpha*a(i,j,k)*x(i,j,k,n)
- dhx * (bX(i+1,j,k,n)*(x(i+1,j,k,n) - x(i ,j,k,n))
- bX(i ,j,k,n)*(x(i ,j,k,n) - x(i-1,j,k,n)))
- dhy * (bY(i,j+1,k,n)*(x(i,j+1,k,n) - x(i,j ,k,n))
- bY(i,j ,k,n)*(x(i,j ,k,n) - x(i,j-1,k,n)));
}
else
{
Real kappa = vfrc(i,j,k);
Real apxm = apx(i,j,k);
Real apxp = apx(i+1,j,k);
Real apym = apy(i,j,k);
Real apyp = apy(i,j+1,k);

Real fxm = bX(i,j,k,n) * (x(i,j,k,n)-x(i-1,j,k,n));
if (apxm != Real(0.0) && apxm != Real(1.0)) {
int jj = j + static_cast<int>(std::copysign(Real(1.0),fcx(i,j,k)));
Real fracy = (ccm(i-1,jj,k) || ccm(i,jj,k)) ? std::abs(fcx(i,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fxm = (Real(1.0)-fracy)*fxm + fracy*bX(i,jj,k,n)*(x(i,jj,k,n)-x(i-1,jj,k,n));
} else if (beta_on_centroid && phi_on_center) {
fxm = bX(i,j,k,n) * ( (Real(1.0)-fracy)*(x(i, j,k,n)-x(i-1, j,k,n))
+ fracy *(x(i,jj,k,n)-x(i-1,jj,k,n)) );
}
Real fxm = bX(i,j,k,n) * (x(i,j,k,n)-x(i-1,j,k,n));
if (apxm != Real(0.0) && apxm != Real(1.0)) {
int jj = j + static_cast<int>(std::copysign(Real(1.0),fcx(i,j,k)));
Real fracy = (ccm(i-1,jj,k) || ccm(i,jj,k)) ? std::abs(fcx(i,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fxm = (Real(1.0)-fracy)*fxm + fracy*bX(i,jj,k,n)*(x(i,jj,k,n)-x(i-1,jj,k,n));
} else if (beta_on_centroid && phi_on_center) {
fxm = bX(i,j,k,n) * ( (Real(1.0)-fracy)*(x(i, j,k,n)-x(i-1, j,k,n))
+ fracy *(x(i,jj,k,n)-x(i-1,jj,k,n)) );
}
}

Real fxp = bX(i+1,j,k,n)*(x(i+1,j,k,n)-x(i,j,k,n));
if (apxp != Real(0.0) && apxp != Real(1.0)) {
int jj = j + static_cast<int>(std::copysign(Real(1.0),fcx(i+1,j,k)));
Real fracy = (ccm(i,jj,k) || ccm(i+1,jj,k)) ? std::abs(fcx(i+1,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fxp = (Real(1.0)-fracy)*fxp + fracy*bX(i+1,jj,k,n)*(x(i+1,jj,k,n)-x(i,jj,k,n));
} else if (beta_on_centroid && phi_on_center) {
fxp = bX(i+1,j,k,n) * ( (Real(1.0)-fracy)*(x(i+1, j,k,n)-x(i, j,k,n))
+ fracy *(x(i+1,jj,k,n)-x(i,jj,k,n)) );
}
Real fxp = bX(i+1,j,k,n)*(x(i+1,j,k,n)-x(i,j,k,n));
if (apxp != Real(0.0) && apxp != Real(1.0)) {
int jj = j + static_cast<int>(std::copysign(Real(1.0),fcx(i+1,j,k)));
Real fracy = (ccm(i,jj,k) || ccm(i+1,jj,k)) ? std::abs(fcx(i+1,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fxp = (Real(1.0)-fracy)*fxp + fracy*bX(i+1,jj,k,n)*(x(i+1,jj,k,n)-x(i,jj,k,n));
} else if (beta_on_centroid && phi_on_center) {
fxp = bX(i+1,j,k,n) * ( (Real(1.0)-fracy)*(x(i+1, j,k,n)-x(i, j,k,n))
+ fracy *(x(i+1,jj,k,n)-x(i,jj,k,n)) );
}
}

Real fym = bY(i,j,k,n)*(x(i,j,k,n)-x(i,j-1,k,n));
if (apym != Real(0.0) && apym != Real(1.0)) {
int ii = i + static_cast<int>(std::copysign(Real(1.0),fcy(i,j,k)));
Real fracx = (ccm(ii,j-1,k) || ccm(ii,j,k)) ? std::abs(fcy(i,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fym = (Real(1.0)-fracx)*fym + fracx*bY(ii,j,k,n)*(x(ii,j,k,n)-x(ii,j-1,k,n));
} else if (beta_on_centroid && phi_on_center) {
fym = bY(i,j,k,n) * ( (Real(1.0)-fracx)*(x( i,j,k,n)-x( i,j-1,k,n))
+ fracx *(x(ii,j,k,n)-x(ii,j-1,k,n)) );
}
Real fym = bY(i,j,k,n)*(x(i,j,k,n)-x(i,j-1,k,n));
if (apym != Real(0.0) && apym != Real(1.0)) {
int ii = i + static_cast<int>(std::copysign(Real(1.0),fcy(i,j,k)));
Real fracx = (ccm(ii,j-1,k) || ccm(ii,j,k)) ? std::abs(fcy(i,j,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fym = (Real(1.0)-fracx)*fym + fracx*bY(ii,j,k,n)*(x(ii,j,k,n)-x(ii,j-1,k,n));
} else if (beta_on_centroid && phi_on_center) {
fym = bY(i,j,k,n) * ( (Real(1.0)-fracx)*(x( i,j,k,n)-x( i,j-1,k,n))
+ fracx *(x(ii,j,k,n)-x(ii,j-1,k,n)) );
}
}

Real fyp = bY(i,j+1,k,n)*(x(i,j+1,k,n)-x(i,j,k,n));
if (apyp != Real(0.0) && apyp != Real(1.0)) {
int ii = i + static_cast<int>(std::copysign(Real(1.0),fcy(i,j+1,k)));
Real fracx = (ccm(ii,j,k) || ccm(ii,j+1,k)) ? std::abs(fcy(i,j+1,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fyp = (Real(1.0)-fracx)*fyp + fracx*bY(ii,j+1,k,n)*(x(ii,j+1,k,n)-x(ii,j,k,n));
} else if (beta_on_centroid && phi_on_center) {
fyp = bY(i,j+1,k,n) * ( (Real(1.0)-fracx)*(x( i,j+1,k,n)-x( i,j,k,n))
+ fracx *(x(ii,j+1,k,n)-x(ii,j,k,n)) );
}
Real fyp = bY(i,j+1,k,n)*(x(i,j+1,k,n)-x(i,j,k,n));
if (apyp != Real(0.0) && apyp != Real(1.0)) {
int ii = i + static_cast<int>(std::copysign(Real(1.0),fcy(i,j+1,k)));
Real fracx = (ccm(ii,j,k) || ccm(ii,j+1,k)) ? std::abs(fcy(i,j+1,k)) : Real(0.0);
if (beta_on_center && phi_on_center) {
fyp = (Real(1.0)-fracx)*fyp + fracx*bY(ii,j+1,k,n)*(x(ii,j+1,k,n)-x(ii,j,k,n));
} else if (beta_on_centroid && phi_on_center) {
fyp = bY(i,j+1,k,n) * ( (Real(1.0)-fracx)*(x( i,j+1,k,n)-x( i,j,k,n))
+ fracx *(x(ii,j+1,k,n)-x(ii,j,k,n)) );
}
}

Real feb = Real(0.0);
if (is_dirichlet) {
Real dapx = (apxm-apxp)/dxinv[1];
Real dapy = (apym-apyp)/dxinv[0];
Real anorm = std::hypot(dapx,dapy);
Real anorminv = Real(1.0)/anorm;
Real anrmx = dapx * anorminv;
Real anrmy = dapy * anorminv;

Real phib = is_inhomog ? phieb(i,j,k,n) : Real(0.0);
Real feb = Real(0.0);
if (is_dirichlet) {
Real dapx = (apxm-apxp)/dxinv[1];
Real dapy = (apym-apyp)/dxinv[0];
Real anorm = std::hypot(dapx,dapy);
Real anorminv = Real(1.0)/anorm;
Real anrmx = dapx * anorminv;
Real anrmy = dapy * anorminv;

Real bctx = bc(i,j,k,0);
Real bcty = bc(i,j,k,1);
Real dx_eb = get_dx_eb(kappa);
Real phib = is_inhomog ? phieb(i,j,k,n) : Real(0.0);

Real dg, gx, gy, sx, sy;
if (std::abs(anrmx) > std::abs(anrmy)) {
dg = dx_eb / std::abs(anrmx);
} else {
dg = dx_eb / std::abs(anrmy);
}
gx = (bctx - dg*anrmx);
gy = (bcty - dg*anrmy);
sx = std::copysign(Real(1.0),anrmx);
sy = std::copysign(Real(1.0),anrmy);
Real bctx = bc(i,j,k,0);
Real bcty = bc(i,j,k,1);
Real dx_eb = get_dx_eb(kappa);

int ii = i - static_cast<int>(sx);
int jj = j - static_cast<int>(sy);
Real dg, gx, gy, sx, sy;
if (std::abs(anrmx) > std::abs(anrmy)) {
dg = dx_eb / std::abs(anrmx);
} else {
dg = dx_eb / std::abs(anrmy);
}
gx = (bctx - dg*anrmx);
gy = (bcty - dg*anrmy);
sx = std::copysign(Real(1.0),anrmx);
sy = std::copysign(Real(1.0),anrmy);

Real phig = (Real(1.0) + gx*sx + gy*sy + gx*gy*sx*sy) * x(i ,j ,k,n)
+ ( - gx*sx - gx*gy*sx*sy) * x(ii,j ,k,n)
+ ( - gy*sy - gx*gy*sx*sy) * x(i ,jj,k,n)
+ ( + gx*gy*sx*sy) * x(ii,jj,k,n) ;
int ii = i - static_cast<int>(sx);
int jj = j - static_cast<int>(sy);

Real dphidn = (phib-phig) / dg;
Real phig = (Real(1.0) + gx*sx + gy*sy + gx*gy*sx*sy) * x(i ,j ,k,n)
+ ( - gx*sx - gx*gy*sx*sy) * x(ii,j ,k,n)
+ ( - gy*sy - gx*gy*sx*sy) * x(i ,jj,k,n)
+ ( + gx*gy*sx*sy) * x(ii,jj,k,n) ;

feb = dphidn * ba(i,j,k) * beb(i,j,k,n);
}
Real dphidn = (phib-phig) / dg;

y(i,j,k,n) = alpha*a(i,j,k)*x(i,j,k,n) + (Real(1.0)/kappa) *
(dhx*(apxm*fxm-apxp*fxp) +
dhy*(apym*fym-apyp*fyp) - dh*feb);
feb = dphidn * ba(i,j,k) * beb(i,j,k,n);
}
});

y(i,j,k,n) = alpha*a(i,j,k)*x(i,j,k,n) + (Real(1.0)/kappa) *
(dhx*(apxm*fxm-apxp*fxp) +
dhy*(apym*fym-apyp*fyp) - dh*feb);
}
}

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
Expand Down
Loading
Loading