17 const GpuArray<Real,AMREX_SPACEDIM> ,
const Array4<const Real>& msku,
18 const Array4<const Real>& calc_arr,
22 const auto& dom_lo = amrex::lbound(domain);
23 const auto& dom_hi = amrex::ubound(domain);
29 Vector<BCRec> bcrs(ncomp);
39 amrex::Gpu::DeviceVector<BCRec> bcrs_d(ncomp);
41 Gpu::htod_memcpy_async(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
43 std::memcpy(bcrs_d.data(), bcrs.data(),
sizeof(BCRec)*ncomp);
45 const amrex::BCRec* bc_ptr = bcrs_d.data();
48 GeometryData
const& geomdata =
m_geom.data();
49 bool is_periodic_in_x = geomdata.isPeriodic(0);
50 bool is_periodic_in_y = geomdata.isPeriodic(1);
51 const Real eps= 1.0e-20_rt;
54 Box dest_arr_box = growHi(convert(Box(dest_arr),IntVect(1,0,0)),0,-1);
58 Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1);
59 Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+2);
60 Box bx_xlo_face(bx); bx_xlo_face.setSmall(0,dom_lo.x ); bx_xlo_face.setBig(0,dom_lo.x );
61 Box bx_xhi_face(bx); bx_xhi_face.setSmall(0,dom_hi.x+1); bx_xhi_face.setBig(0,dom_hi.x+1);
64 grow(bx_xlo_face,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
66 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][0]*msku(i,j,0);
68 dest_arr(i,j,k) = dest_arr(dom_lo.x+1,j,k)*msku(i,j,0);
70 Real grad_lo_ip1 = calc_arr(dom_lo.x+1,j ,k) - calc_arr(dom_lo.x+1,j-1,k);
71 Real grad_lo_ijp1 = calc_arr(dom_lo.x+1,j+1,k) - calc_arr(dom_lo.x+1,j ,k);
72 Real dUdt = calc_arr(dom_lo.x+1,j,k) - dest_arr(dom_lo.x+1,j,k);
73 Real dUdx = dest_arr(dom_lo.x+1,j,k) - dest_arr(dom_lo.x+2,j,k);
74 if (dUdt * dUdx < 0.0_rt) dUdt = 0.0_rt;
75 Real dUde = (dUdt * (grad_lo_ip1 + grad_lo_ijp1) > 0.0_rt) ? grad_lo_ip1 : grad_lo_ijp1;
76 Real cff = std::max(dUdx*dUdx+dUde*dUde,eps);
78 dest_arr(i,j,k) = (cff * calc_arr(i,j,k) + Cx * dest_arr(dom_lo.x+1,j,k)) * msku(i,j,0) / (cff+Cx);
82 grow(bx_xlo,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
84 int iflip = dom_lo.x - i;
86 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][0]*msku(i,j,0);
89 dest_arr(i,j,k) = dest_arr(dom_lo.x+inner,j,k)*msku(i,j,0);
91 dest_arr(i,j,k) = dest_arr(iflip,j,k)*msku(i,j,0);
93 dest_arr(i,j,k) = -dest_arr(iflip,j,k)*msku(i,j,0);
98 grow(bx_xhi_face,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
100 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][3]*msku(i,j,0);
102 dest_arr(i,j,k) = dest_arr(dom_hi.x,j,k)*msku(i,j,0);
104 Real grad_hi = calc_arr(dom_hi.x ,j ,k) - calc_arr(dom_hi.x ,j-1,k);
105 Real grad_hi_jp1 = calc_arr(dom_hi.x ,j+1,k) - calc_arr(dom_hi.x ,j ,k);
106 Real dUdt = calc_arr(dom_hi.x,j,k) - dest_arr(dom_hi.x ,j,k);
107 Real dUdx = dest_arr(dom_hi.x,j,k) - dest_arr(dom_hi.x-1,j,k);
108 if (dUdt * dUdx < 0.0_rt) dUdt = 0.0_rt;
109 Real dUde = (dUdt * (grad_hi + grad_hi_jp1) > 0.0_rt) ? grad_hi : grad_hi_jp1;
110 Real cff = std::max(dUdx*dUdx+dUde*dUde,eps);
111 Real Cx = dUdt * dUdx;
112 dest_arr(i,j,k) = (cff * calc_arr(dom_hi.x+1,j,k) + Cx * dest_arr(dom_hi.x,j,k)) * msku(i,j,0) / (cff + Cx);
116 grow(bx_xhi,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
117 int iflip = 2*(dom_hi.x + 1) - i;
120 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][3]*msku(i,j,0);
123 dest_arr(i,j,k) = dest_arr(dom_hi.x+1-inner,j,k)*msku(i,j,0);
125 dest_arr(i,j,k) = dest_arr(iflip,j,k)*msku(i,j,0);
127 dest_arr(i,j,k) = -dest_arr(iflip,j,k)*msku(i,j,0);
135 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
136 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1);
138 grow(bx_ylo,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
139 int jflip = dom_lo.y - 1 - j;
141 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][1]*msku(i,j,0);
143 dest_arr(i,j,k) = dest_arr(i,dom_lo.y,k)*msku(i,j,0);
145 Real grad_lo = calc_arr(i+1,dom_lo.y ,k) - calc_arr(i ,dom_lo.y ,k);
146 Real grad_lo_im1 = calc_arr(i ,dom_lo.y ,k) - calc_arr(i-1,dom_lo.y ,k);
147 Real dUdt = calc_arr(i,dom_lo.y,k) - dest_arr(i,dom_lo.y ,k);
148 Real dUde = dest_arr(i,dom_lo.y,k) - dest_arr(i,dom_lo.y+1,k);
149 if (dUdt * dUde < 0.0_rt) dUdt = 0.0_rt;
150 Real dUdx = (dUdt * (grad_lo_im1 + grad_lo) > 0.0_rt) ? grad_lo_im1 : grad_lo;
151 Real cff = std::max(dUdx * dUdx + dUde * dUde, eps);
152 Real Ce = dUdt * dUde;
153 dest_arr(i,j,k) = (cff * calc_arr(i,dom_lo.y-1,k) + Ce * dest_arr(i,dom_lo.y,k)) * msku(i,j,0) / (cff + Ce);
155 dest_arr(i,j,k) = dest_arr(i,jflip,k)*msku(i,j,0);
157 dest_arr(i,j,k) = -dest_arr(i,jflip,k)*msku(i,j,0);
160 grow(bx_yhi,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
161 int jflip = 2*dom_hi.y + 1 - j;
163 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][4]*msku(i,j,0);
165 dest_arr(i,j,k) = dest_arr(i,dom_hi.y,k)*msku(i,j,0);
167 Real grad_hi = calc_arr(i+1,dom_hi.y ,k) - calc_arr(i ,dom_hi.y ,k);
168 Real grad_hi_im1 = calc_arr(i ,dom_hi.y ,k) - calc_arr(i-1,dom_hi.y ,k);
169 Real dUdt = calc_arr(i,dom_hi.y,k) - dest_arr(i,dom_hi.y ,k);
170 Real dUde = dest_arr(i,dom_hi.y,k) - dest_arr(i,dom_hi.y-1,k);
171 if (dUdt * dUde < 0.0_rt) dUdt = 0.0_rt;
172 Real dUdx = (dUdt * (grad_hi_im1 + grad_hi) > 0.0_rt) ? grad_hi_im1 : grad_hi;
173 Real cff = std::max(dUdx*dUdx+dUde*dUde,eps);
174 Real Ce = dUdt * dUde;
175 dest_arr(i,j,k) = (cff * calc_arr(i,dom_hi.y+1,k) + Ce * dest_arr(i,dom_hi.y,k)) * msku(i,j,0) / (cff+Ce);
177 dest_arr(i,j,k) = dest_arr(i,jflip,k)*msku(i,j,0);
179 dest_arr(i,j,k) = -dest_arr(i,jflip,k)*msku(i,j,0);
187 Box bx_zlo(bx); bx_zlo.setBig (2,dom_lo.z-1);
188 Box bx_zhi(bx); bx_zhi.setSmall(2,dom_hi.z+1);
190 bx_zlo & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
191 int kflip = dom_lo.z - 1 - k;
193 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][2]*msku(i,j,0);
195 dest_arr(i,j,k) = dest_arr(i,j,dom_lo.z)*msku(i,j,0);
197 dest_arr(i,j,k) = dest_arr(i,j,kflip)*msku(i,j,0);
199 dest_arr(i,j,k) = -dest_arr(i,j,kflip)*msku(i,j,0);
202 bx_zhi & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
203 int kflip = 2*dom_hi.z + 1 - k;
205 dest_arr(i,j,k) = bc_extdir_vals_ptr[bccomp+n][5]*msku(i,j,0);
207 dest_arr(i,j,k) = dest_arr(i,j,dom_hi.z)*msku(i,j,0);
209 dest_arr(i,j,k) = dest_arr(i,j,kflip)*msku(i,j,0);
211 dest_arr(i,j,k) = -dest_arr(i,j,kflip)*msku(i,j,0);
219 Box xlo(bx); xlo.setBig (0,dom_lo.x );
220 Box xhi(bx); xhi.setSmall(0,dom_hi.x+1);
221 Box ylo(bx); ylo.setBig (1,dom_lo.y-1);
222 Box yhi(bx); yhi.setSmall(1,dom_hi.y+1);
223 Box xlo_ylo = xlo & ylo;
224 Box xlo_yhi = xlo & yhi;
225 Box xhi_ylo = xhi & ylo;
226 Box xhi_yhi = xhi & yhi;
233 if (!clamp_west && !clamp_south) {
234 ParallelFor(xlo_ylo & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
236 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_lo.y,k) + dest_arr(dom_lo.x+1,j,k));
239 if (!clamp_west && !clamp_north) {
240 ParallelFor(xlo_yhi & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
242 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_hi.y,k) + dest_arr(dom_lo.x+1,j,k));
245 if (!clamp_east && !clamp_south) {
246 ParallelFor(xhi_ylo & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
248 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_lo.y,k) + dest_arr(dom_hi.x,j,k));
251 if (!clamp_east && !clamp_north) {
252 ParallelFor(xhi_yhi & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
254 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_hi.y,k) + dest_arr(dom_hi.x,j,k));
260 Gpu::streamSynchronize();