Impose lateral boundary conditions on z velocity.
69 const auto& dom_lo = lbound(domain);
70 const auto& dom_hi = ubound(domain);
83 const auto& xvel_lo = lbound(xvel_arr);
84 const auto& xvel_hi = ubound(xvel_arr);
85 const auto& yvel_lo = lbound(yvel_arr);
86 const auto& yvel_hi = ubound(yvel_arr);
87 const WFromOmegaRange wr = wfromomega_range(xvel_arr, yvel_arr, mf_u, mf_v, z_phys_nd);
92 Vector<BCRec> bcrs_w(1);
95 bool l_use_terrain_fitted_coords = ( (terrain_type == TerrainType::StaticFittedMesh) ||
96 (terrain_type == TerrainType::MovingFittedMesh) );
105 Gpu::DeviceVector<BCRec> bcrs_w_d(1);
106 Gpu::copyAsync(Gpu::hostToDevice, bcrs_w.begin(), bcrs_w.end(), bcrs_w_d.begin());
107 const BCRec* bc_ptr_w = bcrs_w_d.data();
109 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>,1> l_bc_extdir_vals_d;
111 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
115 GeometryData
const& geomdata =
m_geom.data();
116 bool is_periodic_in_x = geomdata.isPeriodic(0);
117 bool is_periodic_in_y = geomdata.isPeriodic(1);
122 if (!is_periodic_in_x)
125 Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1);
126 Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1);
128 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
129 int iflip = 2*dom_lo.x - 1 - i;
133 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
134 if (l_use_terrain_fitted_coords) {
135 int wi = Clamp(i,wr.ilo,wr.ihi), wj = Clamp(j,wr.jlo,wr.jhi), wk = Clamp(k,wr.klo,wr.khi);
136 dest_arr(i,j,k) = WFromOmega(wi,wj,wk,dest_arr(i,j,k),
138 mf_u,mf_v,z_phys_nd,dxInv);
141 dest_arr(i,j,k) = dest_arr(dom_lo.x,j,k);
143 dest_arr(i,j,k) = dest_arr(dom_lo.x,j,k);
145 dest_arr(i,j,k) = dest_arr(iflip,j,k);
147 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
150 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
151 int iflip = 2*dom_hi.x + 1 - i;
155 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
156 if (l_use_terrain_fitted_coords) {
157 int wi = Clamp(i,wr.ilo,wr.ihi), wj = Clamp(j,wr.jlo,wr.jhi), wk = Clamp(k,wr.klo,wr.khi);
160 mf_u,mf_v,z_phys_nd,
dxInv);
163 dest_arr(i,j,k) = dest_arr(dom_hi.x,j,k);
165 dest_arr(i,j,k) = dest_arr(dom_hi.x,j,k);
167 dest_arr(i,j,k) = dest_arr(iflip,j,k);
169 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
176 if (!is_periodic_in_y)
179 Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1);
180 Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1);
182 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
183 int jflip = 2*dom_lo.y - 1 - j;
187 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][1];
188 if (l_use_terrain_fitted_coords) {
189 int wi = Clamp(i,wr.ilo,wr.ihi), wj = Clamp(j,wr.jlo,wr.jhi), wk = Clamp(k,wr.klo,wr.khi);
190 dest_arr(i,j,k) = WFromOmega(wi,wj,wk,dest_arr(i,j,k),
192 mf_u,mf_v,z_phys_nd,dxInv);
195 dest_arr(i,j,k) = dest_arr(i,dom_lo.y,k);
197 dest_arr(i,j,k) = dest_arr(i,dom_lo.y,k);
199 dest_arr(i,j,k) = dest_arr(i,jflip,k);
201 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
204 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
205 int jflip = 2*dom_hi.y + 1 - j;
209 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][4];
210 if (l_use_terrain_fitted_coords) {
211 int wi = Clamp(i,wr.ilo,wr.ihi), wj = Clamp(j,wr.jlo,wr.jhi), wk = Clamp(k,wr.klo,wr.khi);
214 mf_u,mf_v,z_phys_nd,
dxInv);
217 dest_arr(i,j,k) = dest_arr(i,dom_hi.y,k);
219 dest_arr(i,j,k) = dest_arr(i,dom_hi.y,k);
221 dest_arr(i,j,k) = dest_arr(i,jflip,k);
223 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
227 Gpu::streamSynchronize();
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real WFromOmega(int &i, int &j, int &k, amrex::Real omega, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
Definition: ERF_TerrainMetrics.H:867
void impose_lateral_zvel_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, const amrex::Array4< amrex::Real const > &mf_u, const amrex::Array4< amrex::Real const > &mf_v, const amrex::Array4< amrex::Real const > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > dxInv, TerrainType terrain_type, int bccomp, const double time)
Definition: ERF_BoundaryConditionsZvel.cpp:57
@ open
Definition: ERF_IndexDefines.H:347
@ reflect_odd
Definition: ERF_IndexDefines.H:336
@ foextrap
Definition: ERF_IndexDefines.H:339
@ ext_dir
Definition: ERF_IndexDefines.H:340
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:348
@ reflect_even
Definition: ERF_IndexDefines.H:338
@ wi
Definition: ERF_AdvanceWDM6.cpp:277