8 const amrex::Box &a_box,
12 const amrex::Real* DX =
m_geom.CellSize();
16 amrex::Box box = a_box;
18 const amrex::Dim3 lo= amrex::lbound(
m_geom.Domain()), hi = amrex::ubound(
m_geom.Domain());
20 amrex::Array4<amrex::Real>
const& in = a_in.array();
22 amrex::IndexType type = amrex::IndexType::TheCellType();
24 for (
int n = 0; n < a_in.nComp(); n++)
25 amrex::ParallelFor (box,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
30 #if AMREX_SPACEDIM > 1
32 #if AMREX_SPACEDIM > 2
38 amrex::IntVect glevel;
39 AMREX_D_TERM(glevel[0] = std::max(std::min(0,i-lo.x),i-hi.x); ,
40 glevel[1] = std::max(std::min(0,j-lo.y),j-hi.y); ,
41 glevel[2] = std::max(std::min(0,k-lo.z),k-hi.z); );
46 in(i,j,k,n) =
m_bc_func[Face::XLO][n](x,y,z,
t);
48 in(i,j,k,n) = in(i-glevel[0],j,k,n) - (
m_bc_func[Face::XLO].size() > 0 ?
m_bc_func[Face::XLO][n](x,y,z,
t)*DX[0] : 0);
50 in(i,j,k,n) = in(1-glevel[0],j,k,n);
52 in(i,j,k,n) = -in(1-glevel[0],j,k,n);
57 else if (glevel[0]>0 && (face == Orientation::xhi || face ==
Orientation::All))
60 in(i,j,k,n) =
m_bc_func[Face::XHI][n](x,y,z,
t);
62 in(i,j,k,n) = in(i-glevel[0],j,k,n) - (
m_bc_func[Face::XHI].size() > 0 ?
m_bc_func[Face::XHI][n](x,y,z,
t)*DX[0] : 0);
64 in(i,j,k,n) = in(hi.x-glevel[0],j,k,n);
66 in(i,j,k,n) = -in(hi.x-glevel[0],j,k,n);
72 else if (glevel[1]<0 && (face == Orientation::ylo || face ==
Orientation::All))
75 in(i,j,k,n) =
m_bc_func[Face::YLO][n](x,y,z,
t);
77 in(i,j,k,n) = in(i,j-glevel[1],k,n) - (
m_bc_func[Face::YLO].size() > 0 ?
m_bc_func[Face::YLO][n](x,y,z,
t)*DX[1] : 0);
79 in(i,j,k,n) = in(i,j-glevel[1],k,n);
81 in(i,j,k,n) = -in(i,j-glevel[1],k,n);
86 else if (glevel[1]>0 && (face == Orientation::yhi || face ==
Orientation::All))
89 in(i,j,k,n) =
m_bc_func[Face::YHI][n](x,y,z,
t);
91 in(i,j,k,n) = in(i,j-glevel[1],k,n) - (
m_bc_func[Face::YHI].size() > 0 ?
m_bc_func[Face::YHI][n](x,y,z,
t)*DX[1] : 0);
93 in(i,j,k,n) = in(i,hi.y-glevel[1],k,n);
95 in(i,j,k,n) = -in(i,hi.y-glevel[1],k,n);
102 else if (glevel[2]<0 && (face == Orientation::zlo || face ==
Orientation::All))
105 in(i,j,k,n) =
m_bc_func[Face::ZLO][n](x,y,z,
t);
107 in(i,j,k,n) = in(i,j,k-glevel[2],n) - (
m_bc_func[Face::ZLO].size() > 0 ?
m_bc_func[Face::ZLO][n](x,y,z,
t)*DX[2] : 0);
109 in(i,j,k,n) = in(i,j,1-glevel[2],n);
111 in(i,j,k,n) = -in(i,j,1-glevel[2],n);
115 else if (glevel[2]>0 && (face == Orientation::zhi || face ==
Orientation::All))
118 in(i,j,k,n) =
m_bc_func[Face::ZHI][n](x,y,z,
t);
120 in(i,j,k,n) = in(i,j,k-glevel[2],n) - (
m_bc_func[Face::ZHI].size() > 0 ?
m_bc_func[Face::ZHI][n](x,y,z,
t)*DX[2] : 0);
122 in(i,j,k,n) = in(i,j,hi.z-glevel[2],n);
124 in(i,j,k,n) = -in(i,j,hi.z-glevel[2],n);
140 return amrex::BCRec(bc_lo,bc_hi);
143 amrex::Array<int,AMREX_SPACEDIM>