179 BL_PROFILE_REGION(
"realbdy_compute_interior_ghost_RHS()");
181 Real delta_t =
static_cast<Real>(delta_t_d);
190 Array4<Real> bdatxlo, bdatxhi, bdatylo, bdatyhi;
191 Array4<Real> btenxlo, btenxhi, btenylo, btenyhi;
194 Vector<std::unique_ptr<PlaneVector>>& bndry_data = m_r2d->interp_in_time(time);
195 bdatxlo = (*bndry_data[0])[0].array();
196 bdatylo = (*bndry_data[1])[0].array();
197 bdatxhi = (*bndry_data[3])[0].array();
198 bdatyhi = (*bndry_data[4])[0].array();
200 Vector<std::unique_ptr<PlaneVector>>& bndry_tend = m_r2d->get_tendency(time);
201 btenxlo = (*bndry_tend[0])[0].array();
202 btenylo = (*bndry_tend[1])[0].array();
203 btenxhi = (*bndry_tend[3])[0].array();
204 btenyhi = (*bndry_tend[4])[0].array();
208 Real F1 =
one/(nudge_factor*delta_t);
211 double dT_d = bdy_time_interval;
213 int n_time =
static_cast<int>( (time-start_bdy_time) / dT_d);
214 int n_time_p1 = n_time + 1;
215 Real alpha =
static_cast<Real>(((time-start_bdy_time) - n_time * dT_d) / dT_d);
218 if (time >= final_bdy_time) {
219 n_time =
static_cast<int>( (final_bdy_time - start_bdy_time)/ dT_d);
228 FArrayBox U_xlo, U_xhi, U_ylo, U_yhi;
229 FArrayBox V_xlo, V_xhi, V_ylo, V_yhi;
230 FArrayBox T_xlo, T_xhi, T_ylo, T_yhi;
251 for (
int ivar(ivarU); ivar < BdyEnd; ivar++) {
252 int ivar_idx = var_map[ivar];
253 Box domain = geom.Domain();
254 auto ixtype = S_cur_data[ivar_idx].boxArray().ixType();
255 domain.convert(ixtype);
260 Box gdom(domain); gdom.grow(ng_vect);
261 Box bx_xlo, bx_xhi, bx_ylo, bx_yhi;
269 U_xlo.resize(bx_xlo,1,The_Async_Arena()); U_xhi.resize(bx_xhi,1,The_Async_Arena());
270 U_ylo.resize(bx_ylo,1,The_Async_Arena()); U_yhi.resize(bx_yhi,1,The_Async_Arena());
271 }
else if (ivar == ivarV) {
272 V_xlo.resize(bx_xlo,1,The_Async_Arena()); V_xhi.resize(bx_xhi,1,The_Async_Arena());
273 V_ylo.resize(bx_ylo,1,The_Async_Arena()); V_yhi.resize(bx_yhi,1,The_Async_Arena());
274 }
else if (ivar == ivarT){
275 T_xlo.resize(bx_xlo,1,The_Async_Arena()); T_xhi.resize(bx_xhi,1,The_Async_Arena());
276 T_ylo.resize(bx_ylo,1,The_Async_Arena()); T_yhi.resize(bx_yhi,1,The_Async_Arena());
291 for (
int ivar(ivarU); ivar < BdyEnd; ivar++) {
292 int ivar_idx = var_map[ivar];
293 Box domain = geom.Domain();
294 auto ixtype = S_cur_data[ivar_idx].boxArray().ixType();
295 domain.convert(ixtype);
296 const auto&
dom_lo = lbound(domain);
297 const auto&
dom_hi = ubound(domain);
300 int bdy_comp = bnd_map[ivar];
301 const auto& dom_cc_lo = lbound(geom.Domain());
302 const auto& dom_cc_hi = ubound(geom.Domain());
305 #pragma omp parallel if (Gpu::notInLaunchRegion())
307 for (MFIter mfi(S_cur_data[ivar_idx],TilingIfNotGPU()); mfi.isValid(); ++mfi) {
311 Box gtbx = grow(mfi.tilebox(ixtype.toIntVect()),ng_vect);
312 Box tbx_xlo, tbx_xhi, tbx_ylo, tbx_yhi;
318 Array4<Real> arr_xlo; Array4<Real> arr_xhi;
319 Array4<Real> arr_ylo; Array4<Real> arr_yhi;
321 arr_xlo = U_xlo.array(); arr_xhi = U_xhi.array();
322 arr_ylo = U_ylo.array(); arr_yhi = U_yhi.array();
323 }
else if (ivar == ivarV) {
324 arr_xlo = V_xlo.array(); arr_xhi = V_xhi.array();
325 arr_ylo = V_ylo.array(); arr_yhi = V_yhi.array();
326 }
else if (ivar == ivarT){
327 arr_xlo = T_xlo.array(); arr_xhi = T_xhi.array();
328 arr_ylo = T_ylo.array(); arr_yhi = T_yhi.array();
334 const auto& bdatxlo_n = bdy_data_xlo[n_time ][ivar].const_array();
335 const auto& bdatxlo_np1 = bdy_data_xlo[n_time_p1][ivar].const_array();
336 const auto& bdatxhi_n = bdy_data_xhi[n_time ][ivar].const_array();
337 const auto& bdatxhi_np1 = bdy_data_xhi[n_time_p1][ivar].const_array();
338 const auto& bdatylo_n = bdy_data_ylo[n_time ][ivar].const_array();
339 const auto& bdatylo_np1 = bdy_data_ylo[n_time_p1][ivar].const_array();
340 const auto& bdatyhi_n = bdy_data_yhi[n_time ][ivar].const_array();
341 const auto& bdatyhi_np1 = bdy_data_yhi[n_time_p1][ivar].const_array();
351 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
354 int jj = std::max(j ,
dom_lo.y); jj = std::min(jj,
dom_hi.y);
358 rho_interp =
myhalf * ( r_arr(i-1,j ,k) + r_arr(i,j,k) );
359 }
else if (ivar==ivarV) {
360 rho_interp =
myhalf * ( r_arr(i ,j-1,k) + r_arr(i,j,k) );
362 rho_interp = r_arr(i,j,k);
366 int ii2 = std::min(std::max(i , dom_cc_lo.x), dom_cc_hi.x);
367 int jj2 = std::min(std::max(j , dom_cc_lo.y), dom_cc_hi.y);
368 arr_xlo(i,j,k) = rho_interp * bdatxlo(ii2,jj2,k,bdy_comp);
370 arr_xlo(i,j,k) = rho_interp * ( oma * bdatxlo_n (ii,jj,k,0)
371 +
alpha * bdatxlo_np1(ii,jj,k,0) );
374 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
377 int jj = std::max(j ,
dom_lo.y); jj = std::min(jj,
dom_hi.y);
381 rho_interp =
myhalf * ( r_arr(i-1,j ,k) + r_arr(i,j,k) );
382 }
else if (ivar==ivarV) {
383 rho_interp =
myhalf * ( r_arr(i ,j-1,k) + r_arr(i,j,k) );
385 rho_interp = r_arr(i,j,k);
389 int ii2 = std::min(std::max(i , dom_cc_lo.x), dom_cc_hi.x);
390 int jj2 = std::min(std::max(j , dom_cc_lo.y), dom_cc_hi.y);
391 arr_xhi(i,j,k) = rho_interp * bdatxhi(ii2,jj2,k,bdy_comp);
393 arr_xhi(i,j,k) = rho_interp * ( oma * bdatxhi_n (ii,jj,k,0)
394 +
alpha * bdatxhi_np1(ii,jj,k,0) );
399 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
401 int ii = std::max(i ,
dom_lo.x); ii = std::min(ii,
dom_hi.x);
406 rho_interp =
myhalf * ( r_arr(i-1,j ,k) + r_arr(i,j,k) );
407 }
else if (ivar==ivarV) {
408 rho_interp =
myhalf * ( r_arr(i ,j-1,k) + r_arr(i,j,k) );
410 rho_interp = r_arr(i,j,k);
414 int ii2 = std::min(std::max(i , dom_cc_lo.x), dom_cc_hi.x);
415 int jj2 = std::min(std::max(j , dom_cc_lo.y), dom_cc_hi.y);
416 arr_ylo(i,j,k) = rho_interp * bdatylo(ii2,jj2,k,bdy_comp);
418 arr_ylo(i,j,k) = rho_interp * ( oma * bdatylo_n (ii,jj,k,0)
419 +
alpha * bdatylo_np1(ii,jj,k,0) );
422 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
424 int ii = std::max(i ,
dom_lo.x); ii = std::min(ii,
dom_hi.x);
429 rho_interp =
myhalf * ( r_arr(i-1,j ,k) + r_arr(i,j,k) );
430 }
else if (ivar==ivarV) {
431 rho_interp =
myhalf * ( r_arr(i ,j-1,k) + r_arr(i,j,k) );
433 rho_interp = r_arr(i,j,k);
437 int ii2 = std::min(std::max(i , dom_cc_lo.x), dom_cc_hi.x);
438 int jj2 = std::min(std::max(j , dom_cc_lo.y), dom_cc_hi.y);
439 arr_yhi(i,j,k) = rho_interp * bdatyhi(ii2,jj2,k,bdy_comp);
441 arr_yhi(i,j,k) = rho_interp * ( oma * bdatyhi_n (ii,jj,k,0)
442 +
alpha * bdatyhi_np1(ii,jj,k,0) );
451 auto dx = geom.CellSizeArray();
452 auto ProbLo = geom.ProbLoArray();
453 auto ProbHi = geom.ProbHiArray();
455 for (
int ivar(ivarU); ivar < BdyEnd; ivar++) {
456 int ivar_idx = ivar_map[ivar];
457 int icomp = comp_map[ivar];
459 Box domain = geom.Domain();
460 domain.convert(S_cur_data[ivar_idx].boxArray().ixType());
464 #pragma omp parallel if (Gpu::notInLaunchRegion())
466 for (MFIter mfi(S_cur_data[ivar_idx],TilingIfNotGPU()); mfi.isValid(); ++mfi)
468 Box tbx = mfi.tilebox();
469 Box tbx_xlo, tbx_xhi, tbx_ylo, tbx_yhi;
475 Array4<Real> rhs_arr; Array4<Real> data_arr;
476 Array4<Real> arr_xlo; Array4<Real> arr_xhi;
477 Array4<Real> arr_ylo; Array4<Real> arr_yhi;
479 arr_xlo = U_xlo.array(); arr_xhi = U_xhi.array();
480 arr_ylo = U_ylo.array(); arr_yhi = U_yhi.array();
483 }
else if (ivar == ivarV) {
484 arr_xlo = V_xlo.array(); arr_xhi = V_xhi.array();
485 arr_ylo = V_ylo.array(); arr_yhi = V_yhi.array();
488 }
else if (ivar == ivarT){
489 arr_xlo = T_xlo.array(); arr_xhi = T_xhi.array();
490 arr_ylo = T_ylo.array(); arr_yhi = T_yhi.array();
498 width,
dx, ProbLo, ProbHi, F1,
499 tbx_xlo , tbx_xhi , tbx_ylo , tbx_yhi ,
500 arr_xlo , arr_xhi , arr_ylo , arr_yhi ,
501 data_arr, rhs_arr , c_p,
rdOcp);
507 Box domain = geom.Domain();
508 Box domainx = convert(domain, IntVect(1,0,0));
509 Box domainy = convert(domain, IntVect(0,1,0));
511 int ilo = domainx.smallEnd(0);
512 int ihi = domainx.bigEnd(0);
513 int jlo = domainy.smallEnd(1);
514 int jhi = domainy.bigEnd(1);
517 #pragma omp parallel if (Gpu::notInLaunchRegion())
519 for (MFIter mfi(S_cur_data[
IntVars::cons],TilingIfNotGPU()); mfi.isValid(); ++mfi)
521 Box tbx = mfi.nodaltilebox(0);
523 if (tbx.smallEnd(0) == ilo) {
524 tbx_lo = makeSlab(tbx,0,ilo);
526 if (tbx.bigEnd(0) == ihi) {
527 tbx_hi = makeSlab(tbx,0,ihi);
530 Box tby = mfi.nodaltilebox(1);
532 if (tby.smallEnd(1) == jlo) {
533 tby_lo = makeSlab(tby,1,jlo);
535 if (tby.bigEnd(1) == jhi) {
536 tby_hi = makeSlab(tby,1,jhi);
542 Array4<const Real> rhs_cons = S_rhs[
IntVars::cons].const_array(mfi);
543 Array4<const Real> cons_arr = S_cur_data[
IntVars::cons].const_array(mfi);
545 const auto& bdatxlo_n = bdy_data_xlo[n_time ][ivarU].const_array();
546 const auto& bdatxlo_np1 = bdy_data_xlo[n_time_p1][ivarU].const_array();
547 const auto& bdatxhi_n = bdy_data_xhi[n_time ][ivarU].const_array();
548 const auto& bdatxhi_np1 = bdy_data_xhi[n_time_p1][ivarU].const_array();
550 const auto& bdatylo_n = bdy_data_ylo[n_time ][ivarV].const_array();
551 const auto& bdatylo_np1 = bdy_data_ylo[n_time_p1][ivarV].const_array();
552 const auto& bdatyhi_n = bdy_data_yhi[n_time ][ivarV].const_array();
553 const auto& bdatyhi_np1 = bdy_data_yhi[n_time_p1][ivarV].const_array();
555 Real dT =
static_cast<Real>(bdy_time_interval);
558 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
560 Real rho_tend = rhs_cons(i,j,k);
561 Real rho_val =
Real(0.5) * (cons_arr(i,j,k) + cons_arr(i-1,j,k));
567 u_tend = (bdatxlo_np1(i,j,k) - bdatxlo_n(i,j,k)) / dT;
568 u_val = oma * bdatxlo_n(i,j,k) +
alpha * bdatxlo_np1(i,j,k);
570 rhs_xmom(i,j,k) = rho_val * u_tend + u_val * rho_tend;
572 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
574 Real rho_tend = rhs_cons(i,j,k);
575 Real rho_val =
Real(0.5) * (cons_arr(i,j,k) + cons_arr(i-1,j,k));
581 u_tend = (bdatxhi_np1(i,j,k) - bdatxhi_n(i,j,k)) / dT;
582 u_val = oma * bdatxhi_n(i,j,k) +
alpha * bdatxhi_np1(i,j,k);
584 rhs_xmom(i,j,k) = rho_val * u_tend + u_val * rho_tend;
588 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
590 Real rho_tend = rhs_cons(i,j,k);
591 Real rho_val =
Real(0.5) * (cons_arr(i,j,k) + cons_arr(i,j-1,k));
597 v_tend = (bdatylo_np1(i,j,k) - bdatylo_n(i,j,k)) / dT;
598 v_val = oma * bdatylo_n(i,j,k) +
alpha * bdatylo_np1(i,j,k);
600 rhs_ymom(i,j,k) = rho_val * v_tend + v_val * rho_tend;
602 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
604 Real rho_tend = rhs_cons(i,j,k);
605 Real rho_val =
Real(0.5) * (cons_arr(i,j,k) + cons_arr(i,j-1,k));
611 v_tend = (bdatyhi_np1(i,j,k) - bdatyhi_n(i,j,k)) / dT;
612 v_val = oma * bdatyhi_n(i,j,k) +
alpha * bdatyhi_np1(i,j,k);
614 rhs_ymom(i,j,k) = rho_val * v_tend + v_val * rho_tend;
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
const Real rdOcp
Definition: ERF_InitCustomPert_Bomex.H:16
void realbdy_interior_bxs_xy(const Box &bx, const Box &domain, const int &width, Box &bx_xlo, Box &bx_xhi, Box &bx_ylo, Box &bx_yhi, const IntVect &ng_vect, const bool get_int_ng)
Definition: ERF_InteriorGhostCells.cpp:23
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:28
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_relaxation(const int &icomp, const int &num_var, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr, const amrex::Real &c_p, const amrex::Real &rdOcp, const int bdy_moist_nudge_type=0)
Definition: ERF_Utils.H:240
@ RhoTheta_bc_comp
Definition: ERF_IndexDefines.H:88
@ yvel_bc
Definition: ERF_IndexDefines.H:103
@ xvel_bc
Definition: ERF_IndexDefines.H:102
@ U
Definition: ERF_IndexDefines.H:123
@ NumTypes
Definition: ERF_IndexDefines.H:127
@ T
Definition: ERF_IndexDefines.H:125
@ V
Definition: ERF_IndexDefines.H:124
@ xvel
Definition: ERF_IndexDefines.H:176
@ cons
Definition: ERF_IndexDefines.H:175
@ yvel
Definition: ERF_IndexDefines.H:177
real(kind=kind_phys), parameter, public alpha
Definition: ERF_module_mp_wsm6.F90:44