19REMORA::fill_from_bdyfiles (MultiFab& mf_to_fill,
const MultiFab& mf_mask,
const Real time,
const int bccomp,
const int bdy_var_type,
const int icomp_to_fill,
const int icomp_calc,
const MultiFab& mf_calc,
const Real dt_calc)
31 int n_time =
static_cast<int>( time_since_start / dT);
33 amrex::Real alpha = (time_since_start - n_time * dT) / dT;
34 AMREX_ALWAYS_ASSERT( alpha >= 0. && alpha <= 1.0_rt);
35 amrex::Real oma = 1.0_rt - alpha;
38 int ivar = bdy_var_type;
43 Box domain = geom[lev].Domain();
45 const auto& mf_index_type = mf_to_fill.boxArray().ixType();
46 domain.convert(mf_index_type);
48 const auto& dom_lo = amrex::lbound(domain);
49 const auto& dom_hi = amrex::ubound(domain);
67 const Real eps= 1.0e-20_rt;
68 const bool null_mf_calc = (!mf_calc.ok());
70 for (
int icomp = 0; icomp < ncomp; icomp++)
76 const auto& bdatxlo_n =
bdy_data_xlo[n_time ][ivar+icomp].const_array();
77 const auto& bdatxlo_np1 =
bdy_data_xlo[n_time+1][ivar+icomp].const_array();
78 const auto& bdatxhi_n =
bdy_data_xhi[n_time ][ivar+icomp].const_array();
79 const auto& bdatxhi_np1 =
bdy_data_xhi[n_time+1][ivar+icomp].const_array();
80 const auto& bdatylo_n =
bdy_data_ylo[n_time ][ivar+icomp].const_array();
81 const auto& bdatylo_np1 =
bdy_data_ylo[n_time+1][ivar+icomp].const_array();
82 const auto& bdatyhi_n =
bdy_data_yhi[n_time ][ivar+icomp].const_array();
83 const auto& bdatyhi_np1 =
bdy_data_yhi[n_time+1][ivar+icomp].const_array();
111 const bool cell_centered = (mf_index_type[0] == 0 and mf_index_type[1] == 0);
116#pragma omp parallel if (Gpu::notInLaunchRegion())
119 for (MFIter mfi(mf_to_fill,
false); mfi.isValid(); ++mfi)
121 Box mf_box(mf_to_fill[mfi.index()].box());
125 Box xlo = xlo_tmp & mf_box;
126 Box xhi_tmp(
bdy_data_xhi[n_time][ivar].box()); Box xhi = xhi_tmp & mf_box;
127 Box ylo_tmp(
bdy_data_ylo[n_time][ivar].box()); Box ylo = ylo_tmp & mf_box;
128 Box yhi_tmp(
bdy_data_yhi[n_time][ivar].box()); Box yhi = yhi_tmp & mf_box;
130 xlo.setSmall(0,lbound(mf_box).
x);
131 xhi.setBig (0,ubound(mf_box).
x);
132 ylo.setSmall(1,lbound(mf_box).
y);
133 yhi.setBig (1,ubound(mf_box).
y);
135 Box xlo_ylo = xlo & ylo;
136 Box xlo_yhi = xlo & yhi;
137 Box xhi_ylo = xhi & ylo;
138 Box xhi_yhi = xhi & yhi;
144 Box xlo_edge = xlo; xlo_edge.setSmall(0,ubound(xlo).
x); xlo_edge.setBig(0,ubound(xlo).
x);
145 Box xhi_edge = xhi; xhi_edge.setSmall(0,lbound(xhi).
x); xhi_edge.setBig(0,lbound(xhi).
x);
146 Box ylo_edge = ylo; ylo_edge.setSmall(1,ubound(ylo).
y); ylo_edge.setBig(1,ubound(ylo).
y);
147 Box yhi_edge = yhi; yhi_edge.setSmall(1,lbound(yhi).
y); yhi_edge.setBig(1,lbound(yhi).
y);
149 Box xlo_ghost = xlo; xlo_ghost.setBig(0,ubound(xlo).
x-1);
150 Box xhi_ghost = xhi; xhi_ghost.setSmall(0,lbound(xhi).
x+1);
151 Box ylo_ghost = ylo; ylo_ghost.setBig(1,ubound(ylo).
y-1);
152 Box yhi_ghost = yhi; yhi_ghost.setSmall(1,lbound(yhi).
y+1);
154 const Array4<Real>& dest_arr = mf_to_fill.array(mfi);
155 const Array4<const Real>& mask_arr = mf_mask.array(mfi);
156 const Array4<const Real>& calc_arr = (!null_mf_calc) ? mf_calc.array(mfi) : Array4<amrex::Real>();
158 const Array4<const Real>& zeta_arr =
vec_zeta[lev]->const_array(mfi);
159 const Array4<const Real>& pm =
vec_pm[lev]->const_array(mfi);
160 const Array4<const Real>& pn =
vec_pn[lev]->const_array(mfi);
162 const Array4<const Real>& msku =
vec_msku[lev]->const_array(mfi);
163 const Array4<const Real>& mskv =
vec_mskv[lev]->const_array(mfi);
165 const Array4<const Real> nudg_coeff_out =
vec_nudg_coeff[bdy_var_type][lev]->const_array(mfi);
170 Vector<BCRec> bcrs(1);
171 amrex::setBC(mf_box, domain, bccomp+icomp, 0, 1,
domain_bcs_type, bcrs);
184 if (!xlo.isEmpty() && apply_west) {
185 ParallelFor(grow(xlo_edge,IntVect(0,-1,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
187 Real bry_val = (oma * bdatxlo_n (ubound(xlo).
x,j,k,0)
188 + alpha * bdatxlo_np1(ubound(xlo).
x,j,k,0));
190 dest_arr(i,j,k,icomp+icomp_to_fill) = bry_val * mask_arr(i,j,0);
192 Real bry_val_zeta = (oma * bdatzetaxlo_n(ubound(xlo).
x-1,j,k,0) + alpha * bdatzetaxlo_np1(ubound(xlo).
x-1,j,k,0));
193 Real cff = 1.0_rt / (0.5_rt * (h_arr(dom_lo.x-1,j,0) + zeta_arr(dom_lo.x-1,j,0,icomp_calc)
194 + h_arr(dom_lo.x,j,0) + zeta_arr(dom_lo.x,j,0,icomp_calc)));
195 Real Cx = std::sqrt(
g * cff);
196 dest_arr(i,j,k,icomp+icomp_to_fill) = (bry_val
197 - Cx * (0.5_rt * (zeta_arr(dom_lo.x-1,j,0,icomp_calc) + zeta_arr(dom_lo.x,j,0,icomp_calc))
198 - bry_val_zeta)) * mask_arr(i,j,0);
200 Real cff = dt_calc * 0.5_rt * (pm(dom_lo.x,j-mf_index_type[1],0) + pm(dom_lo.x,j,0));
201 Real cff1 = std::sqrt(
g * 0.5_rt * (h_arr(dom_lo.x,j-mf_index_type[1],0)
202 + zeta_arr(dom_lo.x,j-mf_index_type[1],0,icomp_calc) + h_arr(dom_lo.x,j,0)
203 + zeta_arr(dom_lo.x,j,0,icomp_calc)));
204 Real Cx = cff * cff1;
205 Real cff2 = 1.0_rt / (1.0_rt + Cx);
206 dest_arr(i,j,k,icomp+icomp_to_fill) = cff2 * (dest_arr(dom_lo.x-1,j,k,icomp_calc)
207 + Cx * dest_arr(dom_lo.x,j,k,icomp+icomp_to_fill)) * mask_arr(i,j,0);
209 Real grad_lo_im1 = (calc_arr(dom_lo.x+mf_index_type[0]-1,j ,k,icomp+icomp_to_fill) - calc_arr(dom_lo.x-1+mf_index_type[0],j-1,k,icomp+icomp_to_fill));
210 Real grad_lo = (calc_arr(dom_lo.x+mf_index_type[0] ,j ,k,icomp+icomp_to_fill) - calc_arr(dom_lo.x +mf_index_type[0],j-1,k,icomp+icomp_to_fill));
211 Real grad_lo_imjp1 = (calc_arr(dom_lo.x+mf_index_type[0]-1,j+1,k,icomp+icomp_to_fill) - calc_arr(dom_lo.x-1+mf_index_type[0],j ,k,icomp+icomp_to_fill));
212 Real grad_lo_jp1 = (calc_arr(dom_lo.x+mf_index_type[0] ,j+1,k,icomp+icomp_to_fill) - calc_arr(dom_lo.x +mf_index_type[0],j ,k,icomp+icomp_to_fill));
214 grad_lo_im1 *= mskv(i,j,0);
215 grad_lo *= mskv(i,j,0);
216 grad_lo_imjp1 *= mskv(i,j,0);
217 grad_lo_jp1 *= mskv(i,j,0);
219 Real dTdt = calc_arr(dom_lo.x+mf_index_type[0],j,k,icomp+icomp_to_fill) - dest_arr(dom_lo.x+mf_index_type[0] ,j,k,icomp+icomp_to_fill);
220 Real dTdx = dest_arr(dom_lo.x+mf_index_type[0],j,k,icomp+icomp_to_fill) - dest_arr(dom_lo.x+mf_index_type[0]+1,j,k,icomp+icomp_to_fill);
222 Real nudg_coeff_out_local = (nudg_coeff_out(i-mf_index_type[0],j-mf_index_type[1],k) +
223 nudg_coeff_out(i,j,k)) * 0.5_rt;
224 if (dTdt*dTdx < 0.0_rt) {
225 tau = nudg_coeff_out_local * obcfac * dt_calc;
228 tau = nudg_coeff_out_local * dt_calc;
230 Real dTde = (dTdt * (grad_lo+grad_lo_jp1) > 0.0_rt) ? grad_lo : grad_lo_jp1;
231 Real cff = std::max(dTdx*dTdx+dTde*dTde,eps);
232 Real Cx = dTdt * dTdx;
233 dest_arr(i,j,k,icomp+icomp_to_fill) = (cff * calc_arr(dom_lo.x-1+mf_index_type[0],j,k,icomp+icomp_to_fill) + Cx * dest_arr(dom_lo.x+mf_index_type[0],j,k,icomp+icomp_to_fill)) / (cff+Cx);
234 dest_arr(i,j,k,icomp+icomp_to_fill) = mask_arr(i,j,0) * (dest_arr(dom_lo.x-1+mf_index_type[0],j,k,icomp+icomp_to_fill) + tau * (bry_val - calc_arr(dom_lo.x-1+mf_index_type[0],j,k,icomp+icomp_to_fill)));
237 ParallelFor(grow(xlo_ghost,IntVect(0,-1,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
239 dest_arr(i,j,k,icomp+icomp_to_fill) = dest_arr(ubound(xlo).
x,j,k,icomp+icomp_to_fill);
244 if (!xhi.isEmpty() && apply_east) {
245 ParallelFor(grow(xhi_edge,IntVect(0,-1,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
247 Real bry_val = (oma * bdatxhi_n (lbound(xhi).
x,j,k,0)
248 + alpha * bdatxhi_np1(lbound(xhi).
x,j,k,0));
250 dest_arr(i,j,k,icomp+icomp_to_fill) = bry_val * mask_arr(i,j,0);
252 Real bry_val_zeta = (oma * bdatzetaxhi_n(lbound(xhi).
x,j,k,0) + alpha * bdatzetaxhi_np1(lbound(xhi).
x,j,k,0));
253 Real cff = 1.0_rt / (0.5_rt * (h_arr(dom_hi.x-1,j,0) + zeta_arr(dom_hi.x-1,j,0,icomp_calc)
254 + h_arr(dom_hi.x,j,0) + zeta_arr(dom_hi.x,j,0,icomp_calc)));
255 Real Cx = std::sqrt(
g * cff);
256 dest_arr(i,j,k,icomp+icomp_to_fill) = (bry_val
257 + Cx * (0.5_rt * (zeta_arr(dom_hi.x-1,j,0,icomp_calc) + zeta_arr(dom_hi.x,j,0,icomp_calc))
258 - bry_val_zeta)) * mask_arr(i,j,0);
260 Real cff = dt_calc * 0.5_rt * (pm(dom_hi.x,j-mf_index_type[1],0) + pm(dom_hi.x,j,0));
261 Real cff1 = std::sqrt(
g * 0.5_rt * (h_arr(dom_hi.x,j-mf_index_type[1],0)
262 + zeta_arr(dom_hi.x,j-mf_index_type[1],0,icomp_calc) + h_arr(dom_hi.x,j,0)
263 + zeta_arr(dom_hi.x,j,0,icomp_calc)));
264 Real Cx = cff * cff1;
265 Real cff2 = 1.0_rt / (1.0_rt + Cx);
266 dest_arr(i,j,k,icomp+icomp_to_fill) = cff2 * (dest_arr(dom_hi.x+1,j,k,icomp_calc)
267 + Cx * dest_arr(dom_hi.x,j,k,icomp+icomp_to_fill)) * mask_arr(i,j,0);
269 Real grad_hi = (calc_arr(dom_hi.x-mf_index_type[0] ,j ,k,icomp+icomp_to_fill) - calc_arr(dom_hi.x-mf_index_type[0] ,j-1,k,icomp+icomp_to_fill));
270 Real grad_hi_ip1 = (calc_arr(dom_hi.x-mf_index_type[0]+1,j ,k,icomp+icomp_to_fill) - calc_arr(dom_hi.x-mf_index_type[0]+1,j-1,k,icomp+icomp_to_fill));
271 Real grad_hi_jp1 = (calc_arr(dom_hi.x-mf_index_type[0] ,j+1,k,icomp+icomp_to_fill) - calc_arr(dom_hi.x-mf_index_type[0] ,j ,k,icomp+icomp_to_fill));
272 Real grad_hi_ijp1 = (calc_arr(dom_hi.x-mf_index_type[0]+1,j+1,k,icomp+icomp_to_fill) - calc_arr(dom_hi.x-mf_index_type[0]+1,j ,k,icomp+icomp_to_fill));
274 grad_hi *= mskv(i,j,0);
275 grad_hi_ip1 *= mskv(i,j,0);
276 grad_hi_jp1 *= mskv(i,j,0);
277 grad_hi_ijp1 *= mskv(i,j,0);
279 Real dTdt = calc_arr(dom_hi.x-mf_index_type[0],j,k,icomp+icomp_to_fill) - dest_arr(dom_hi.x-mf_index_type[0] ,j,k,icomp+icomp_to_fill);
280 Real dTdx = dest_arr(dom_hi.x-mf_index_type[0],j,k,icomp+icomp_to_fill) - dest_arr(dom_hi.x-mf_index_type[0]-1,j,k,icomp+icomp_to_fill);
282 Real nudg_coeff_out_local = (nudg_coeff_out(i-mf_index_type[0],j-mf_index_type[1],k) +
283 nudg_coeff_out(i,j,k)) * 0.5_rt;
284 if (dTdt*dTdx < 0.0_rt) {
285 tau = nudg_coeff_out_local * obcfac * dt_calc;
288 tau = nudg_coeff_out_local * dt_calc;
290 if (dTdt * dTdx < 0.0_rt) dTdt = 0.0_rt;
291 Real dTde = (dTdt * (grad_hi + grad_hi_jp1) > 0.0_rt) ? grad_hi : grad_hi_jp1;
292 Real cff = std::max(dTdx*dTdx + dTde*dTde,eps);
293 Real Cx = dTdt * dTdx;
294 dest_arr(i,j,k,icomp+icomp_to_fill) = (cff * calc_arr(dom_hi.x+1-mf_index_type[0],j,k,icomp+icomp_to_fill) + Cx * dest_arr(dom_hi.x-mf_index_type[0],j,k,icomp+icomp_to_fill)) * mask_arr(i,j,0) / (cff+Cx);
295 dest_arr(i,j,k,icomp+icomp_to_fill) = mask_arr(i,j,0) * (dest_arr(dom_hi.x+1-mf_index_type[0],j,k,icomp+icomp_to_fill) + tau * (bry_val - calc_arr(dom_hi.x+1-mf_index_type[0],j,k,icomp+icomp_to_fill)));
298 ParallelFor(grow(xhi_ghost,IntVect(0,-1,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
300 dest_arr(i,j,k,icomp+icomp_to_fill) = dest_arr(lbound(xhi).
x,j,k,icomp+icomp_to_fill);
305 if (!ylo.isEmpty() && apply_south) {
306 ParallelFor(grow(ylo_edge,IntVect(-1,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
308 Real bry_val = (oma * bdatylo_n (i,ubound(ylo).
y,k,0)
309 + alpha * bdatylo_np1(i,ubound(ylo).
y,k,0));
311 dest_arr(i,j,k,icomp+icomp_to_fill) = bry_val * mask_arr(i,j,0);
313 Real bry_val_zeta = (oma * bdatzetaylo_n (i,ubound(ylo).
y-1,k,0)
314 + alpha * bdatzetaylo_np1(i,ubound(ylo).
y-1,k,0));
315 Real cff = 1.0_rt / (0.5_rt * (h_arr(i,dom_lo.y-1,0) + zeta_arr(i,dom_lo.y-1,0,icomp_calc)
316 + h_arr(i,dom_lo.y,0) + zeta_arr(i,dom_lo.y,0,icomp_calc)));
317 Real Ce = std::sqrt(
g * cff);
318 dest_arr(i,j,k,icomp+icomp_to_fill) = (bry_val
319 - Ce * (0.5_rt * (zeta_arr(i,dom_lo.y-1,0,icomp_calc) + zeta_arr(i,dom_lo.y,0,icomp_calc))
320 - bry_val_zeta)) * mask_arr(i,j,0);
322 Real cff = dt_calc * 0.5_rt * (pn(i-mf_index_type[0],dom_lo.y,0) + pn(i,dom_lo.y,0));
323 Real cff1 = std::sqrt(
g * 0.5_rt * (h_arr(i-mf_index_type[0],dom_lo.y,0) +
324 zeta_arr(i-mf_index_type[0],dom_lo.y,0,icomp_calc) + h_arr(i,dom_lo.y,0)
325 + zeta_arr(i,dom_lo.y,0,icomp_calc)));
326 Real Ce = cff * cff1;
327 Real cff2 = 1.0_rt / (1.0_rt + Ce);
328 dest_arr(i,j,k,icomp+icomp_to_fill) = cff2 * (dest_arr(i,dom_lo.y-1,k,icomp_calc)
329 + Ce * dest_arr(i,dom_lo.y,k,icomp+icomp_to_fill)) * mask_arr(i,j,0);
331 Real grad_lo = (calc_arr(i ,dom_lo.y+mf_index_type[1], k,icomp+icomp_to_fill) - calc_arr(i-1,dom_lo.y+mf_index_type[1] ,k,icomp+icomp_to_fill));
332 Real grad_lo_jm1 = (calc_arr(i ,dom_lo.y+mf_index_type[1]-1,k,icomp+icomp_to_fill) - calc_arr(i-1,dom_lo.y+mf_index_type[1]-1,k,icomp+icomp_to_fill));
333 Real grad_lo_ip1 = (calc_arr(i+1,dom_lo.y+mf_index_type[1] ,k,icomp+icomp_to_fill) - calc_arr(i ,dom_lo.y+mf_index_type[1] ,k,icomp+icomp_to_fill));
334 Real grad_lo_ipjm1 = (calc_arr(i+1,dom_lo.y+mf_index_type[1]-1,k,icomp+icomp_to_fill) - calc_arr(i ,dom_lo.y+mf_index_type[1]-1,k,icomp+icomp_to_fill));
336 grad_lo *= msku(i,j,0);
337 grad_lo_jm1 *= msku(i,j,0);
338 grad_lo_ip1 *= msku(i,j,0);
339 grad_lo_ipjm1 *= msku(i,j,0);
341 Real dTdt = calc_arr(i,dom_lo.y+mf_index_type[1],k,icomp+icomp_to_fill) - dest_arr(i,dom_lo.y +mf_index_type[1],k,icomp+icomp_to_fill);
342 Real dTde = dest_arr(i,dom_lo.y+mf_index_type[1],k,icomp+icomp_to_fill) - dest_arr(i,dom_lo.y+1+mf_index_type[1],k,icomp+icomp_to_fill);
344 Real nudg_coeff_out_local = (nudg_coeff_out(i-mf_index_type[0],j-mf_index_type[1],k) +
345 nudg_coeff_out(i,j,k)) * 0.5_rt;
346 if (dTdt*dTde < 0.0_rt) {
347 tau = nudg_coeff_out_local * obcfac * dt_calc;
350 tau = nudg_coeff_out_local * dt_calc;
352 if (dTdt * dTde < 0.0_rt) dTdt = 0.0_rt;
353 Real dTdx = (dTdt * (grad_lo + grad_lo_ip1) > 0.0_rt) ? grad_lo : grad_lo_ip1;
354 Real cff = std::max(dTdx*dTdx + dTde*dTde, eps);
356 dest_arr(i,j,k,icomp+icomp_to_fill) = (cff * calc_arr(i,dom_lo.y-1+mf_index_type[1],k,icomp+icomp_to_fill) + Ce * dest_arr(i,dom_lo.y+mf_index_type[1],k,icomp+icomp_to_fill)) / (cff+Ce);
357 dest_arr(i,j,k,icomp+icomp_to_fill) = mask_arr(i,j,0) * (dest_arr(i,dom_lo.y-1+mf_index_type[1],k,icomp+icomp_to_fill) + tau * (bry_val - calc_arr(i,dom_lo.y-1+mf_index_type[1],k,icomp+icomp_to_fill)));
360 ParallelFor(grow(ylo_ghost,IntVect(-1,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
362 dest_arr(i,j,k,icomp+icomp_to_fill) = dest_arr(i,ubound(ylo).
y,k,icomp+icomp_to_fill);
367 if (!yhi.isEmpty() && apply_north) {
368 ParallelFor(grow(yhi_edge,IntVect(-1,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
370 Real bry_val = (oma * bdatyhi_n (i,lbound(yhi).
y,k,0)
371 + alpha * bdatyhi_np1(i,lbound(yhi).
y,k,0)) * mask_arr(i,j,0);
373 dest_arr(i,j,k,icomp+icomp_to_fill) = bry_val * mask_arr(i,j,0);
375 Real bry_val_zeta = (oma * bdatzetayhi_n (i,lbound(yhi).
y,k,0)
376 + alpha * bdatzetayhi_np1(i,lbound(yhi).
y,k,0));
377 Real cff = 1.0_rt / (0.5_rt * (h_arr(i,dom_hi.y-1,0) + zeta_arr(i,dom_hi.y-1,0,icomp_calc)
378 + h_arr(i,dom_hi.y,0) + zeta_arr(i,dom_hi.y,0,icomp_calc)));
379 Real Ce = std::sqrt(
g * cff);
380 dest_arr(i,j,k,icomp+icomp_to_fill) = (bry_val
381 + Ce * (0.5_rt * (zeta_arr(i,dom_hi.y-1,0,icomp_calc) + zeta_arr(i,dom_hi.y,0,icomp_calc))
382 - bry_val_zeta)) * mask_arr(i,j,0);
384 Real cff = dt_calc * 0.5_rt * (pn(i-mf_index_type[0],dom_hi.y,0) + pn(i,dom_hi.y,0));
385 Real cff1 = std::sqrt(
g * 0.5_rt * (h_arr(i-mf_index_type[0],dom_hi.y,0)
386 + zeta_arr(i-mf_index_type[0],dom_hi.y,0,icomp_calc) +
387 h_arr(i,dom_hi.y,0) + zeta_arr(i,dom_hi.y,0,icomp_calc)));
388 Real Ce = cff * cff1;
389 Real cff2 = 1.0_rt / (1.0_rt + Ce);
390 dest_arr(i,j,k,icomp+icomp_to_fill) = cff2 * (dest_arr(i,dom_hi.y+1,k,icomp_calc)
391 + Ce * dest_arr(i,dom_hi.y,k,icomp+icomp_to_fill)) * mask_arr(i,j,0);
393 Real grad_hi = calc_arr(i ,dom_hi.y-mf_index_type[1] ,k,icomp+icomp_to_fill) - calc_arr(i-1,dom_hi.y-mf_index_type[1] ,k,icomp+icomp_to_fill);
394 Real grad_hi_jp1 = calc_arr(i ,dom_hi.y-mf_index_type[1]+1,k,icomp+icomp_to_fill) - calc_arr(i-1,dom_hi.y-mf_index_type[1]+1,k,icomp+icomp_to_fill);
395 Real grad_hi_ip1 = calc_arr(i+1,dom_hi.y-mf_index_type[1] ,k,icomp+icomp_to_fill) - calc_arr(i ,dom_hi.y-mf_index_type[1] ,k,icomp+icomp_to_fill);
396 Real grad_hi_ijp1 = calc_arr(i+1,dom_hi.y-mf_index_type[1]+1,k,icomp+icomp_to_fill) - calc_arr(i ,dom_hi.y-mf_index_type[1]+1,k,icomp+icomp_to_fill);
398 grad_hi *= msku(i,j,0);
399 grad_hi_jp1 *= msku(i,j,0);
400 grad_hi_ip1 *= msku(i,j,0);
401 grad_hi_ijp1 *= msku(i,j,0);
403 Real dTdt = calc_arr(i,dom_hi.y-mf_index_type[1],k,icomp+icomp_to_fill) - dest_arr(i,dom_hi.y -mf_index_type[1],k,icomp+icomp_to_fill);
404 Real dTde = dest_arr(i,dom_hi.y-mf_index_type[1],k,icomp+icomp_to_fill) - dest_arr(i,dom_hi.y-1-mf_index_type[1],k,icomp+icomp_to_fill);
406 Real nudg_coeff_out_local = (nudg_coeff_out(i-mf_index_type[0],j-mf_index_type[1],k) +
407 nudg_coeff_out(i,j,k)) * 0.5_rt;
408 if (dTdt*dTde < 0.0_rt) {
409 tau = nudg_coeff_out_local * obcfac * dt_calc;
412 tau = nudg_coeff_out_local * dt_calc;
414 if (dTdt * dTde < 0.0_rt) dTdt = 0.0_rt;
415 Real dTdx = (dTdt * (grad_hi + grad_hi_ip1) > 0.0_rt) ? grad_hi : grad_hi_ip1;
416 Real cff = std::max(dTdx*dTdx + dTde*dTde, eps);
418 dest_arr(i,j,k,icomp+icomp_to_fill) = (cff*calc_arr(i,dom_hi.y+1-mf_index_type[1],k,icomp+icomp_to_fill) + Ce*dest_arr(i,dom_hi.y-mf_index_type[1],k,icomp+icomp_to_fill)) * mask_arr(i,j,0) / (cff+Ce);
419 dest_arr(i,j,k,icomp+icomp_to_fill) = mask_arr(i,j,0) * (dest_arr(i,dom_hi.y+1-mf_index_type[1],k,icomp+icomp_to_fill) + tau * (bry_val - calc_arr(i,dom_hi.y+1-mf_index_type[1],k,icomp+icomp_to_fill)));
422 ParallelFor(grow(yhi_ghost,IntVect(-1,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
424 dest_arr(i,j,k,icomp+icomp_to_fill) = dest_arr(i,lbound(yhi).
y,k,icomp+icomp_to_fill);
429 if (!xlo_ylo.isEmpty() && (apply_west || apply_south)) {
430 ParallelFor(xlo_ylo, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
432 dest_arr(i,j,k,icomp+icomp_to_fill) = 0.5 * (dest_arr(i,dom_lo.y+mf_index_type[1],k,icomp+icomp_to_fill)
433 + dest_arr(dom_lo.x+mf_index_type[0],j,k,icomp+icomp_to_fill));
436 if (!xlo_yhi.isEmpty() && (apply_west || apply_north)) {
437 ParallelFor(xlo_yhi, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
439 dest_arr(i,j,k,icomp+icomp_to_fill) = 0.5 * (dest_arr(i,dom_hi.y-mf_index_type[1],k,icomp+icomp_to_fill)
440 + dest_arr(dom_lo.x+mf_index_type[0],j,k,icomp+icomp_to_fill));
443 if (!xhi_ylo.isEmpty() && (apply_east || apply_south)) {
444 ParallelFor(xhi_ylo, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
446 dest_arr(i,j,k,icomp+icomp_to_fill) = 0.5 * (dest_arr(i,dom_lo.y+mf_index_type[1],k,icomp+icomp_to_fill)
447 + dest_arr(dom_hi.x-mf_index_type[0],j,k,icomp+icomp_to_fill));
450 if (!xhi_yhi.isEmpty() && (apply_east || apply_north)) {
451 ParallelFor(xhi_yhi, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
453 dest_arr(i,j,k,icomp+icomp_to_fill) = 0.5 * (dest_arr(i,dom_hi.y-mf_index_type[1],k,icomp+icomp_to_fill)
454 + dest_arr(dom_hi.x-mf_index_type[0],j,k,icomp+icomp_to_fill));