60 const amrex::Box &a_box,
61 int ngrow,
int ,
int , amrex::Real time,
64 const auto DX =
m_geom.CellSizeArray();
68 amrex::Box box = a_box;
70 const amrex::Dim3 lo= amrex::lbound(
m_geom.Domain()), hi = amrex::ubound(
m_geom.Domain());
72 amrex::Array4<amrex::Real>
const& in = a_in.array();
74 for (
int n = 0; n < a_in.nComp(); n++)
76 const auto bc_type_xlo =
m_bc_type[Face::XLO][n];
77 const auto bc_type_xhi =
m_bc_type[Face::XHI][n];
78 const auto bc_type_ylo =
m_bc_type[Face::YLO][n];
79 const auto bc_type_yhi =
m_bc_type[Face::YHI][n];
89 const auto bc_type_zlo =
m_bc_type[Face::ZLO][n];
90 const auto bc_type_zhi =
m_bc_type[Face::ZHI][n];
96 amrex::ParallelFor (box,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
98 amrex::IntVect glevel;
99 AMREX_D_TERM( glevel[0] = std::max(std::min(0,i-lo.x),i-hi.x); ,
100 glevel[1] = std::max(std::min(0,j-lo.y),j-hi.y); ,
101 glevel[2] = std::max(std::min(0,k-lo.z),k-hi.z); );
106 in(i,j,k,n) = bc_val_xlo;
108 in(i,j,k,n) = in(i-glevel[0],j,k,n) - bc_val_xlo*DX[0];
110 in(i,j,k,n) = in(1-glevel[0],j,k,n);
112 in(i,j,k,n) = -in(1-glevel[0],j,k,n);
117 else if (glevel[0]>0 && (face == Orientation::xhi || face ==
Orientation::All))
120 in(i,j,k,n) = bc_val_xhi;
122 in(i,j,k,n) = in(i-glevel[0],j,k,n) - bc_val_xhi*DX[0];
124 in(i,j,k,n) = in(hi.x-glevel[0],j,k,n);
126 in(i,j,k,n) = -in(hi.x-glevel[0],j,k,n);
132 else if (glevel[1]<0 && (face == Orientation::ylo || face ==
Orientation::All))
135 in(i,j,k,n) = bc_val_ylo;
137 in(i,j,k,n) = in(i,j-glevel[1],k,n) - bc_val_ylo*DX[1];
139 in(i,j,k,n) = in(i,j-glevel[1],k,n);
141 in(i,j,k,n) = -in(i,j-glevel[1],k,n);
146 else if (glevel[1]>0 && (face == Orientation::yhi || face ==
Orientation::All))
149 in(i,j,k,n) = bc_val_yhi;
151 in(i,j,k,n) = in(i,j-glevel[1],k,n) - bc_val_yhi*DX[1];
153 in(i,j,k,n) = in(i,hi.y-glevel[1],k,n);
155 in(i,j,k,n) = -in(i,hi.y-glevel[1],k,n);
162 else if (glevel[2]<0 && (face == Orientation::zlo || face ==
Orientation::All))
165 in(i,j,k,n) = bc_val_zlo;
167 in(i,j,k,n) = in(i,j,k-glevel[2],n) - bc_val_zlo*DX[2];
169 in(i,j,k,n) = in(i,j,1-glevel[2],n);
171 in(i,j,k,n) = -in(i,j,1-glevel[2],n);
175 else if (glevel[2]>0 && (face == Orientation::zhi || face ==
Orientation::All))
178 in(i,j,k,n) = bc_val_zhi;
180 in(i,j,k,n) = in(i,j,k-glevel[2],n) - bc_val_zhi*DX[2];
182 in(i,j,k,n) = in(i,j,hi.z-glevel[2],n);
184 in(i,j,k,n) = -in(i,j,hi.z-glevel[2],n);
196 amrex::ParallelFor (box,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
198 if (i < lo.x && j < lo.y) in(i,j,k,n) = 0.5*( in(i+1,j,k,n) + in(i,j+1,k,n) );
199 if (i < lo.x && j > hi.y) in(i,j,k,n) = 0.5*( in(i+1,j,k,n) + in(i,j-1,k,n) );
200 if (i > hi.x && j < lo.y) in(i,j,k,n) = 0.5*( in(i-1,j,k,n) + in(i,j+1,k,n) );
201 if (i > hi.x && j > hi.y) in(i,j,k,n) = 0.5*( in(i-1,j,k,n) + in(i,j-1,k,n) );