22 const auto& dom_lo = amrex::lbound(domain);
23 const auto& dom_hi = amrex::ubound(domain);
28 Vector<BCRec> bcrs(ncomp);
38 amrex::Gpu::DeviceVector<BCRec> bcrs_d(ncomp);
40 Gpu::htod_memcpy_async(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
42 std::memcpy(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
44 const amrex::BCRec* bc_ptr = bcrs_d.data();
46 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>,AMREX_SPACEDIM+
NCONS> l_bc_extdir_vals_d;
48 for (
int i = 0; i < ncomp; i++)
49 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++)
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);
57 if (!is_periodic_in_x)
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) {
64 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][0];
67 bx_xhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
69 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][3];
75 if (!is_periodic_in_y)
77 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
78 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1);
80 bx_ylo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
82 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][1];
85 bx_yhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
87 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][4];
94 Box bx_zlo(bx); bx_zlo.setBig (2,dom_lo.z-1);
95 Box bx_zhi(bx); bx_zhi.setSmall(2,dom_hi.z+1);
97 bx_zlo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
99 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][2];
102 bx_zhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
104 dest_arr(i,j,k,icomp+n) = l_bc_extdir_vals_d[n][5];
112 if (!is_periodic_in_x)
115 Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1);
116 bx_xlo.setSmall(2,std::max(dom_lo.z,bx.smallEnd(2)));
117 bx_xlo.setBig (2,std::min(dom_hi.z,bx.bigEnd(2)));
118 Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1);
119 bx_xhi.setSmall(2,std::max(dom_lo.z,bx.smallEnd(2)));
120 bx_xhi.setBig (2,std::min(dom_hi.z,bx.bigEnd(2)));
121 ParallelFor(bx_xlo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
122 int iflip = dom_lo.x - 1 - i;
124 dest_arr(i,j,k,icomp+n) = dest_arr(dom_lo.x,j,k,icomp+n);
126 dest_arr(i,j,k,icomp+n) = dest_arr(iflip,j,k,icomp+n);
128 dest_arr(i,j,k,icomp+n) = -dest_arr(iflip,j,k,icomp+n);
131 bx_xhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
132 int iflip = 2*dom_hi.x + 1 - i;
134 dest_arr(i,j,k,icomp+n) = dest_arr(dom_hi.x,j,k,icomp+n);
136 dest_arr(i,j,k,icomp+n) = dest_arr(iflip,j,k,icomp+n);
138 dest_arr(i,j,k,icomp+n) = -dest_arr(iflip,j,k,icomp+n);
144 if (!is_periodic_in_y)
147 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
148 bx_ylo.setSmall(2,std::max(dom_lo.z,bx.smallEnd(2)));
149 bx_ylo.setBig (2,std::min(dom_hi.z,bx.bigEnd(2)));
150 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1);
151 bx_yhi.setSmall(2,std::max(dom_lo.z,bx.smallEnd(2)));
152 bx_yhi.setBig (2,std::min(dom_hi.z,bx.bigEnd(2)));
154 bx_ylo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
155 int jflip = dom_lo.y - 1 - j;
157 dest_arr(i,j,k,icomp+n) = dest_arr(i,dom_lo.y,k,icomp+n);
159 dest_arr(i,j,k,icomp+n) = dest_arr(i,jflip,k,icomp+n);
161 dest_arr(i,j,k,icomp+n) = -dest_arr(i,jflip,k,icomp+n);
164 bx_yhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
165 int jflip = 2*dom_hi.y + 1 - j;
167 dest_arr(i,j,k,icomp+n) = dest_arr(i,dom_hi.y,k,icomp+n);
169 dest_arr(i,j,k,icomp+n) = dest_arr(i,jflip,k,icomp+n);
171 dest_arr(i,j,k,icomp+n) = -dest_arr(i,jflip,k,icomp+n);
178 Box bx_zlo(bx); bx_zlo.setBig (2,std::max(dom_lo.z-1,bx.smallEnd(2)));
179 Box bx_zhi(bx); bx_zhi.setSmall(2,std::min(dom_hi.z+1,bx.bigEnd(2)));
183 ParallelFor(bx_zlo, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
185 int kflip = dom_lo.z - 1 - i;
187 dest_arr(i,j,k,icomp+n) = dest_arr(i,j,dom_lo.z,icomp+n);
189 dest_arr(i,j,k,icomp+n) = dest_arr(i,j,kflip,icomp+n);
191 dest_arr(i,j,k,icomp+n) = -dest_arr(i,j,kflip,icomp+n);
197 ParallelFor(bx_zhi, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
199 int kflip = 2*dom_hi.z + 1 - i;
201 dest_arr(i,j,k,icomp+n) = dest_arr(i,j,dom_hi.z,icomp+n);
203 dest_arr(i,j,k,icomp+n) = dest_arr(i,j,kflip,icomp+n);
205 dest_arr(i,j,k,icomp+n) = -dest_arr(i,j,kflip,icomp+n);
211 Gpu::streamSynchronize();
#define NCONS
Definition: IndexDefines.H:11
void impose_cons_bcs(const amrex::Array4< amrex::Real > &mf, const amrex::Box &bx, const amrex::Box &domain, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > dxInv, int icomp, int ncomp, amrex::Real time, int bccomp)
Definition: BoundaryConditions_cons.cpp:17
@ reflect_odd
Definition: IndexDefines.H:54
@ ext_dir
Definition: IndexDefines.H:58
@ reflect_even
Definition: IndexDefines.H:56
@ foextrap
Definition: IndexDefines.H:57