18 const GpuArray<Real,AMREX_SPACEDIM> ,
const Array4<const Real>& ,
21 const auto& dom_lo = amrex::lbound(domain);
22 const auto& dom_hi = amrex::ubound(domain);
28 Vector<BCRec> bcrs(ncomp);
43 amrex::Gpu::DeviceVector<BCRec> bcrs_d(ncomp);
45 Gpu::htod_memcpy_async(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
47 std::memcpy(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
49 const amrex::BCRec* bc_ptr = bcrs_d.data();
52 GeometryData
const& geomdata =
m_geom.data();
53 bool is_periodic_in_x = geomdata.isPeriodic(0);
54 bool is_periodic_in_y = geomdata.isPeriodic(1);
59 Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1);
60 Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1);
62 bx_xlo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
63 int iflip = dom_lo.x - 1 - i;
65 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][0];
67 dest_arr(i,j,k) = dest_arr(dom_lo.x,j,k);
69 dest_arr(i,j,k) = dest_arr(iflip,j,k);
71 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
74 bx_xhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
75 int iflip = 2*dom_hi.x + 1 - i;
77 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][3];
79 dest_arr(i,j,k) = dest_arr(dom_hi.x,j,k);
81 dest_arr(i,j,k) = dest_arr(iflip,j,k);
83 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
92 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
93 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1);
94 ParallelFor(bx_ylo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
95 int jflip = dom_lo.y - 1 - j;
97 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][1];
99 dest_arr(i,j,k) = dest_arr(i,dom_lo.y,k);
101 dest_arr(i,j,k) = dest_arr(i,jflip,k);
103 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
106 bx_yhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
107 int jflip = 2*dom_hi.y + 1 - j;
109 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][4];
111 dest_arr(i,j,k) = dest_arr(i,dom_hi.y,k);
113 dest_arr(i,j,k) = dest_arr(i,jflip,k);
115 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
122 Gpu::streamSynchronize();