22 const auto&
dom_lo = lbound(domain);
23 const auto&
dom_hi = ubound(domain);
35 Vector<BCRec> bcrs(1);
38 Gpu::DeviceVector<BCRec> bcrs_d(1);
39 Gpu::copyAsync(Gpu::hostToDevice, bcrs.begin(), bcrs.end(), bcrs_d.begin());
40 const BCRec* bc_ptr = bcrs_d.data();
42 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>,1> l_bc_extdir_vals_d;
44 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
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);
53 if (!is_periodic_in_x)
56 Box bx_xlo(bx); bx_xlo.setBig (0,
dom_lo.x-1);
57 Box bx_xhi(bx); bx_xhi.setSmall(0,
dom_hi.x+2);
58 Box bx_xlo_face(bx); bx_xlo_face.setSmall(0,
dom_lo.x ); bx_xlo_face.setBig(0,
dom_lo.x );
59 Box bx_xhi_face(bx); bx_xhi_face.setSmall(0,
dom_hi.x+1); bx_xhi_face.setBig(0,
dom_hi.x+1);
61 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
65 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
67 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
69 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
71 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
73 dest_arr(i,j,k) = dest_arr(iflip,j,k);
75 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
77 dest_arr(i,j,k) = (4.0*dest_arr(
dom_lo.x+1,j,k) - dest_arr(
dom_lo.x+2,j,k))/3.0;
80 dest_arr(i,j,k) = (1.0 + delta_i)*dest_arr(
dom_lo.x,j,k) - delta_i*dest_arr(
dom_lo.x+1,j,k);
84 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
87 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
89 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
91 dest_arr(i,j,k) = (4.0*dest_arr(
dom_lo.x+1,j,k) - dest_arr(
dom_lo.x+2,j,k))/3.0;
96 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
98 int iflip = 2*(
dom_hi.x + 1) - i;
100 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
102 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
104 dest_arr(i,j,k) = dest_arr(
dom_hi.x+1,j,k);
106 dest_arr(i,j,k) = dest_arr(
dom_hi.x+1,j,k);
108 dest_arr(i,j,k) = dest_arr(iflip,j,k);
110 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
112 dest_arr(i,j,k) = (4.0*dest_arr(
dom_hi.x,j,k) - dest_arr(
dom_hi.x-1,j,k))/3.0;
115 dest_arr(i,j,k) = (1.0 + delta_i)*dest_arr(
dom_hi.x+1,j,k) - delta_i*dest_arr(
dom_hi.x,j,k);
119 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
122 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
124 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
126 dest_arr(i,j,k) = (4.0*dest_arr(
dom_hi.x,j,k) - dest_arr(
dom_hi.x-1,j,k))/3.0;
132 if (!is_periodic_in_y)
136 Box bx_ylo(bx); bx_ylo.setBig (1,
dom_lo.y-1);
137 Box bx_yhi(bx); bx_yhi.setSmall(1,
dom_hi.y+1);
139 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
140 int jflip =
dom_lo.y - 1 - j;
142 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][1];
144 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][1];
146 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
148 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
150 dest_arr(i,j,k) = dest_arr(i,jflip,k);
152 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
155 dest_arr(i,j,k) = (1.0 + delta_j)*dest_arr(i,
dom_lo.y,k) - delta_j*dest_arr(i,
dom_lo.y+1,k);
158 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
159 int jflip = 2*
dom_hi.y + 1 - j;
161 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][4];
163 dest_arr(i,j,k) = (xvel_bc_ptr) ? xvel_bc_ptr[k] : l_bc_extdir_vals_d[0][4];
165 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
167 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
169 dest_arr(i,j,k) = dest_arr(i,jflip,k);
171 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
174 dest_arr(i,j,k) = (1.0 + delta_j)*dest_arr(i,
dom_hi.y,k) - delta_j*dest_arr(i,
dom_hi.y-1,k);
180 Gpu::streamSynchronize();
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const auto prob_lo=geomdata.ProbLo();const auto dx=geomdata.CellSize();const Real x=(prob_lo[0]+(i+0.5) *dx[0])/mf_m(i, j, 0);const Real z=z_cc(i, j, k);Real L=std::sqrt(std::pow((x - x_c)/x_r, 2)+std::pow((z - z_c)/z_r, 2));if(L<=1.0) { Real dT=T_pert *(std::cos(PI *L)+1.0)/2.0;Real Tbar_hse=p_hse(i, j, k)/(R_d *r_hse(i, j, k));Real theta_perturbed=(Tbar_hse+dT) *std::pow(p_0/p_hse(i, j, k), rdOcp);Real theta_0=(Tbar_hse) *std::pow(p_0/p_hse(i, j, k), rdOcp);if(const_rho) { state_pert(i, j, k, RhoTheta_comp)=r_hse(i, j, k) *(theta_perturbed - theta_0);} else { state_pert(i, j, k, Rho_comp)=getRhoThetagivenP(p_hse(i, j, k))/theta_perturbed - r_hse(i, j, k);} } })
const auto & dom_hi
Definition: ERF_SetupVertDiff.H:2
const auto & dom_lo
Definition: ERF_SetupVertDiff.H:1
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void impose_lateral_xvel_bcs(const amrex::Array4< amrex::Real > &dest_arr, const amrex::Array4< amrex::Real const > &xvel_arr, const amrex::Array4< amrex::Real const > &yvel_arr, const amrex::Box &bx, const amrex::Box &domain, int bccomp, const amrex::Real time)
Definition: ERF_BoundaryConditionsXvel.cpp:15
@ open
Definition: ERF_IndexDefines.H:215
@ reflect_odd
Definition: ERF_IndexDefines.H:205
@ hoextrap
Definition: ERF_IndexDefines.H:216
@ foextrap
Definition: ERF_IndexDefines.H:208
@ ext_dir
Definition: ERF_IndexDefines.H:209
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:217
@ neumann_int
Definition: ERF_IndexDefines.H:214
@ reflect_even
Definition: ERF_IndexDefines.H:207