17 const GpuArray<Real,AMREX_SPACEDIM> ,
const Array4<const Real>& mskv,
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();
47 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>, AMREX_SPACEDIM+
NCONS+8> l_bc_extdir_vals_d;
49 for (
int i = 0; i < ncomp; i++)
50 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++)
53 GeometryData
const& geomdata =
m_geom.data();
54 bool is_periodic_in_x = geomdata.isPeriodic(0);
55 bool is_periodic_in_y = geomdata.isPeriodic(1);
56 const Real eps= 1.0e-20_rt;
58 Box dest_arr_box = growHi(convert(Box(dest_arr),IntVect(0,1,0)),1,-1);
63 Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1);
64 Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1);
66 grow(bx_xlo,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
67 int iflip = dom_lo.x - 1- i;
69 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][0]*mskv(i,j,0);
71 dest_arr(i,j,k) = dest_arr(dom_lo.x,j,k)*mskv(i,j,0);
73 Real grad_lo = calc_arr(dom_lo.x ,j+1,k) - calc_arr(dom_lo.x ,j ,k);
74 Real grad_lo_jm1 = calc_arr(dom_lo.x ,j ,k) - calc_arr(dom_lo.x ,j-1,k);
75 Real dVdt = calc_arr(dom_lo.x,j,k) - dest_arr(dom_lo.x ,j,k);
76 Real dVdx = dest_arr(dom_lo.x,j,k) - dest_arr(dom_lo.x+1,j,k);
77 if (dVdt * dVdx < 0.0_rt) dVdt = 0.0_rt;
78 Real dVde = (dVdt * (grad_lo_jm1 + grad_lo) > 0.0_rt) ? grad_lo_jm1 : grad_lo;
79 Real cff = std::max(dVdx*dVdx + dVde*dVde,eps);
80 Real Cx = dVdt * dVdx;
81 dest_arr(i,j,k) = (cff * calc_arr(dom_lo.x-1,j,k) + Cx * dest_arr(dom_lo.x,j,k)) * mskv(i,j,0) / (cff + Cx);
83 dest_arr(i,j,k) = dest_arr(iflip,j,k)*mskv(i,j,0);
85 dest_arr(i,j,k) = -dest_arr(iflip,j,k)*mskv(i,j,0);
88 grow(bx_xhi,IntVect(0,-1,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
89 int iflip = 2*dom_hi.x + 1 - i;
91 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][3]*mskv(i,j,0);
93 dest_arr(i,j,k) = dest_arr(dom_hi.x,j,k)*mskv(i,j,0);
95 Real grad_hi = calc_arr(dom_hi.x ,j+1,k) - calc_arr(dom_hi.x ,j ,k);
96 Real grad_hi_jm1 = calc_arr(dom_hi.x ,j ,k) - calc_arr(dom_hi.x ,j-1,k);
97 Real dVdt = calc_arr(dom_hi.x,j,k) - dest_arr(dom_hi.x ,j,k);
98 Real dVdx = dest_arr(dom_hi.x,j,k) - dest_arr(dom_hi.x-1,j,k);
99 if (dVdt*dVdx < 0.0_rt) dVdt = 0.0_rt;
100 Real dVde = (dVdt * (grad_hi_jm1 + grad_hi) > 0.0_rt) ? grad_hi_jm1 : grad_hi;
101 Real cff = std::max(dVdx*dVdx+dVde*dVde,eps);
102 Real Cx = dVdt * dVdx;
103 dest_arr(i,j,k) = (cff * calc_arr(dom_hi.x+1,j,k) + Cx * dest_arr(dom_hi.x,j,k)) * mskv(i,j,0) / (cff + Cx);
105 dest_arr(i,j,k) = dest_arr(iflip,j,k)*mskv(i,j,0);
107 dest_arr(i,j,k) = -dest_arr(iflip,j,k)*mskv(i,j,0);
116 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
117 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+2);
118 Box bx_ylo_face(bx); bx_ylo_face.setSmall(1,dom_lo.y ); bx_ylo_face.setBig(1,dom_lo.y );
119 Box bx_yhi_face(bx); bx_yhi_face.setSmall(1,dom_hi.y+1); bx_yhi_face.setBig(1,dom_hi.y+1);
123 grow(bx_ylo_face,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
125 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][1]*mskv(i,j,0);
127 dest_arr(i,j,k) = dest_arr(i,dom_lo.y+1,k)*mskv(i,j,0);
129 Real grad_lo_jp1 = calc_arr(i ,dom_lo.y+1,k) - calc_arr(i-1,dom_lo.y+1,k);
130 Real grad_lo_ijp1 = calc_arr(i+1,dom_lo.y+1,k) - calc_arr(i ,dom_lo.y+1,k);
131 Real dVdt = calc_arr(i,dom_lo.y+1,k) - dest_arr(i,dom_lo.y+1,k);
132 Real dVde = dest_arr(i,dom_lo.y+1,k) - dest_arr(i,dom_lo.y+2,k);
133 if (dVdt*dVde < 0.0_rt) dVdt = 0.0_rt;
134 Real dVdx = (dVdt * (grad_lo_jp1 + grad_lo_ijp1) > 0.0_rt) ? grad_lo_jp1 : grad_lo_ijp1;
135 Real cff = std::max(dVdx*dVdx + dVde*dVde, eps);
136 Real Ce = dVdt * dVde;
137 dest_arr(i,j,k) = (cff * calc_arr(i,dom_lo.y,k) + Ce * dest_arr(i,dom_lo.y+1,k)) * mskv(i,j,0) / (cff + Ce);
141 grow(bx_ylo,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
142 int jflip = dom_lo.y-j;
145 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][1]*mskv(i,j,0);
148 dest_arr(i,j,k) = dest_arr(i,dom_lo.y+inner,k)*mskv(i,j,0);
150 dest_arr(i,j,k) = dest_arr(i,jflip,k)*mskv(i,j,0);
152 dest_arr(i,j,k) = -dest_arr(i,jflip,k)*mskv(i,j,0);
157 grow(bx_yhi_face,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
159 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][4]*mskv(i,j,0);
161 dest_arr(i,j,k) = dest_arr(i,dom_hi.y,k)*mskv(i,j,0);
163 Real grad_hi = calc_arr(i ,dom_hi.y ,k) - calc_arr(i-1,dom_hi.y ,k);
164 Real grad_hi_ip1 = calc_arr(i+1,dom_hi.y ,k) - calc_arr(i ,dom_hi.y ,k);
165 Real dVdt = calc_arr(i,dom_hi.y,k) - dest_arr(i,dom_hi.y ,k);
166 Real dVde = dest_arr(i,dom_hi.y,k) - dest_arr(i,dom_hi.y-1,k);
167 if (dVdt*dVde < 0.0_rt) dVdt = 0.0_rt;
168 Real dVdx = (dVdt * (grad_hi + grad_hi_ip1) > 0.0_rt) ? grad_hi : grad_hi_ip1;
169 Real cff = std::max(dVdx*dVdx + dVde*dVde, eps);
170 Real Ce = dVdt * dVde;
171 dest_arr(i,j,k) = (cff * calc_arr(i,dom_hi.y+1,k) + Ce * dest_arr(i,dom_hi.y,k)) * mskv(i,j,0) / (cff + Ce);
175 grow(bx_yhi,IntVect(-1,0,0)) & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
176 int jflip = 2*(dom_hi.y + 1) - j;
179 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][4]*mskv(i,j,0);
182 dest_arr(i,j,k) = dest_arr(i,dom_hi.y+1-inner,k)*mskv(i,j,0);
184 dest_arr(i,j,k) = dest_arr(i,jflip,k)*mskv(i,j,0);
186 dest_arr(i,j,k) = -dest_arr(i,jflip,k)*mskv(i,j,0);
193 Box bx_zlo(bx); bx_zlo.setBig (2,dom_lo.z-1);
194 Box bx_zhi(bx); bx_zhi.setSmall(2,dom_hi.z+1);
196 bx_zlo & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
197 int kflip = dom_lo.z - 1 - k;
199 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][2]*mskv(i,j,0);
201 dest_arr(i,j,k) = dest_arr(i,j,dom_lo.z)*mskv(i,j,0);
203 dest_arr(i,j,k) = dest_arr(i,j,kflip)*mskv(i,j,0);
205 dest_arr(i,j,k) = -dest_arr(i,j,kflip)*mskv(i,j,0);
208 bx_zhi & dest_arr_box, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
209 int kflip = 2*dom_hi.z + 1 - k;
211 dest_arr(i,j,k) = l_bc_extdir_vals_d[n][5]*mskv(i,j,0);
213 dest_arr(i,j,k) = dest_arr(i,j,dom_hi.z)*mskv(i,j,0);
215 dest_arr(i,j,k) = dest_arr(i,j,kflip)*mskv(i,j,0);
217 dest_arr(i,j,k) = -dest_arr(i,j,kflip)*mskv(i,j,0);
225 Box xlo(bx); xlo.setBig (0,dom_lo.x-1);
226 Box xhi(bx); xhi.setSmall(0,dom_hi.x+1);
227 Box ylo(bx); ylo.setBig (1,dom_lo.y );
228 Box yhi(bx); yhi.setSmall(1,dom_hi.y+1);
229 Box xlo_ylo = xlo & ylo;
230 Box xlo_yhi = xlo & yhi;
231 Box xhi_ylo = xhi & ylo;
232 Box xhi_yhi = xhi & yhi;
238 if (!clamp_west && !clamp_south) {
239 ParallelFor(xlo_ylo & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
241 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_lo.y+1,k) + dest_arr(dom_lo.x,j,k));
244 if (!clamp_west && !clamp_north) {
245 ParallelFor(xlo_yhi & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
247 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_hi.y,k) + dest_arr(dom_lo.x,j,k));
250 if (!clamp_east && !clamp_south) {
251 ParallelFor(xhi_ylo & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
253 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_lo.y+1,k) + dest_arr(dom_hi.x,j,k));
256 if (!clamp_east && !clamp_north) {
257 ParallelFor(xhi_yhi & dest_arr_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
259 dest_arr(i,j,k) = 0.5 * (dest_arr(i,dom_hi.y,k) + dest_arr(dom_hi.x,j,k));
264 Gpu::streamSynchronize();