27 const auto&
dom_lo = lbound(domain);
28 const auto&
dom_hi = ubound(domain);
33 Vector<BCRec> bcrs_w(1);
36 bool l_use_terrain_fitted_coords = ( (terrain_type == TerrainType::StaticFittedMesh) ||
37 (terrain_type == TerrainType::MovingFittedMesh) );
46 Gpu::DeviceVector<BCRec> bcrs_w_d(1);
47 Gpu::copyAsync(Gpu::hostToDevice, bcrs_w.begin(), bcrs_w.end(), bcrs_w_d.begin());
48 const BCRec* bc_ptr_w = bcrs_w_d.data();
50 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>,1> l_bc_extdir_vals_d;
52 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
56 GeometryData
const& geomdata =
m_geom.data();
57 bool is_periodic_in_x = geomdata.isPeriodic(0);
58 bool is_periodic_in_y = geomdata.isPeriodic(1);
63 if (!is_periodic_in_x)
66 Box bx_xlo(bx); bx_xlo.setBig (0,
dom_lo.x-1);
67 Box bx_xhi(bx); bx_xhi.setSmall(0,
dom_hi.x+1);
68 ParallelFor(bx_xlo, bx_xhi,
69 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
70 int iflip =
dom_lo.x - 1 - i;
74 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
75 if (l_use_terrain_fitted_coords) {
76 dest_arr(i,j,k) = WFromOmega(i,j,k,dest_arr(i,j,k),
78 mf_u,mf_v,z_phys_nd,dxInv);
81 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
83 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
85 dest_arr(i,j,k) = dest_arr(iflip,j,k);
87 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
90 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
91 int iflip = 2*
dom_hi.x + 1 - i;
95 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
96 if (l_use_terrain_fitted_coords) {
97 dest_arr(i,j,k) =
WFromOmega(i,j,k,dest_arr(i,j,k),
99 mf_u,mf_v,z_phys_nd,dxInv);
102 dest_arr(i,j,k) = dest_arr(
dom_hi.x,j,k);
104 dest_arr(i,j,k) = dest_arr(
dom_hi.x,j,k);
106 dest_arr(i,j,k) = dest_arr(iflip,j,k);
108 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
115 if (!is_periodic_in_y)
118 Box bx_ylo(bx); bx_ylo.setBig (1,
dom_lo.y-1);
119 Box bx_yhi(bx); bx_yhi.setSmall(1,
dom_hi.y+1);
120 ParallelFor(bx_ylo, bx_yhi,
121 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
122 int jflip =
dom_lo.y - 1 - j;
126 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][1];
127 if (l_use_terrain_fitted_coords) {
128 dest_arr(i,j,k) = WFromOmega(i,j,k,dest_arr(i,j,k),
130 mf_u,mf_v,z_phys_nd,dxInv);
133 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
135 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
137 dest_arr(i,j,k) = dest_arr(i,jflip,k);
139 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
142 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
143 int jflip = 2*
dom_hi.y + 1 - j;
147 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][4];
148 if (l_use_terrain_fitted_coords) {
149 dest_arr(i,j,k) =
WFromOmega(i,j,k,dest_arr(i,j,k),
151 mf_u,mf_v,z_phys_nd,dxInv);
154 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
156 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
158 dest_arr(i,j,k) = dest_arr(i,jflip,k);
160 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
164 Gpu::streamSynchronize();
const auto & dom_hi
Definition: ERF_DiffSetup.H:10
const auto & dom_lo
Definition: ERF_DiffSetup.H:9
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:465
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)
Definition: ERF_BoundaryConditionsZvel.cpp:16
@ open
Definition: ERF_IndexDefines.H:215
@ reflect_odd
Definition: ERF_IndexDefines.H:205
@ foextrap
Definition: ERF_IndexDefines.H:208
@ ext_dir
Definition: ERF_IndexDefines.H:209
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:217
@ reflect_even
Definition: ERF_IndexDefines.H:207