8 const amrex::Box &a_box,
12 const auto DX =
m_geom.CellSizeArray();
13 const auto prob_lo =
m_geom.ProbLoArray();
17 amrex::Box box = a_box;
19 const amrex::Dim3 lo= amrex::lbound(
m_geom.Domain()), hi = amrex::ubound(
m_geom.Domain());
21 amrex::Array4<amrex::Real>
const& in = a_in.array();
23 amrex::IndexType type = amrex::IndexType::TheCellType();
25 for (
int n = 0; n < a_in.nComp(); n++)
27 const auto bc_type_xlo =
m_bc_type[Face::XLO][n];
28 const auto bc_type_xhi =
m_bc_type[Face::XHI][n];
29 const auto bc_type_ylo =
m_bc_type[Face::YLO][n];
30 const auto bc_type_yhi =
m_bc_type[Face::YHI][n];
31 const auto bc_func_xlo =
m_bc_func[Face::XLO][n];
32 const auto bc_func_xhi =
m_bc_func[Face::XHI][n];
33 const auto bc_func_ylo =
m_bc_func[Face::YLO][n];
34 const auto bc_func_yhi =
m_bc_func[Face::YHI][n];
36 const auto bc_type_zlo =
m_bc_type[Face::ZLO][n];
37 const auto bc_type_zhi =
m_bc_type[Face::ZHI][n];
38 const auto bc_func_zlo =
m_bc_func[Face::ZLO][n];
39 const auto bc_func_zhi =
m_bc_func[Face::ZHI][n];
41 amrex::ParallelFor (box,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
46 #if AMREX_SPACEDIM > 1
48 #if AMREX_SPACEDIM > 2
54 amrex::IntVect glevel;
55 AMREX_D_TERM(glevel[0] = std::max(std::min(0,i-lo.x),i-hi.x); ,
56 glevel[1] = std::max(std::min(0,j-lo.y),j-hi.y); ,
57 glevel[2] = std::max(std::min(0,k-lo.z),k-hi.z); );
62 in(i,j,k,n) = bc_func_xlo(x,y,z,
t);
64 in(i,j,k,n) = in(i-glevel[0],j,k,n) - bc_func_xlo(x,y,z,
t)*DX[0];
66 in(i,j,k,n) = in(1-glevel[0],j,k,n);
68 in(i,j,k,n) = -in(1-glevel[0],j,k,n);
73 else if (glevel[0]>0 && (face == Orientation::xhi || face ==
Orientation::All))
76 in(i,j,k,n) = bc_func_xhi(x,y,z,
t);
78 in(i,j,k,n) = in(i-glevel[0],j,k,n) - bc_func_xhi(x,y,z,
t)*DX[0];
80 in(i,j,k,n) = in(hi.x-glevel[0],j,k,n);
82 in(i,j,k,n) = -in(hi.x-glevel[0],j,k,n);
87 else if (glevel[1]<0 && (face == Orientation::ylo || face ==
Orientation::All))
90 in(i,j,k,n) = bc_func_ylo(x,y,z,
t);
92 in(i,j,k,n) = in(i,j-glevel[1],k,n) - bc_func_ylo(x,y,z,
t)*DX[1];
94 in(i,j,k,n) = in(i,j-glevel[1],k,n);
96 in(i,j,k,n) = -in(i,j-glevel[1],k,n);
101 else if (glevel[1]>0 && (face == Orientation::yhi || face ==
Orientation::All))
104 in(i,j,k,n) = bc_func_yhi(x,y,z,
t);
106 in(i,j,k,n) = in(i,j-glevel[1],k,n) - bc_func_yhi(x,y,z,
t)*DX[1];
108 in(i,j,k,n) = in(i,hi.y-glevel[1],k,n);
110 in(i,j,k,n) = -in(i,hi.y-glevel[1],k,n);
116 else if (glevel[2]<0 && (face == Orientation::zlo || face ==
Orientation::All))
119 in(i,j,k,n) = bc_func_zlo(x,y,z,
t);
121 in(i,j,k,n) = in(i,j,k-glevel[2],n) - bc_func_zlo(x,y,z,
t)*DX[2];
123 in(i,j,k,n) = in(i,j,1-glevel[2],n);
125 in(i,j,k,n) = -in(i,j,1-glevel[2],n);
129 else if (glevel[2]>0 && (face == Orientation::zhi || face ==
Orientation::All))
132 in(i,j,k,n) = bc_func_zhi(x,y,z,
t);
134 in(i,j,k,n) = in(i,j,k-glevel[2],n) - bc_func_zhi(x,y,z,
t)*DX[2];
136 in(i,j,k,n) = in(i,j,hi.z-glevel[2],n);
138 in(i,j,k,n) = -in(i,j,hi.z-glevel[2],n);
148 amrex::ParallelFor (box,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
150 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) );
151 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) );
152 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) );
153 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) );