28 const auto&
dom_lo = lbound(domain);
29 const auto&
dom_hi = ubound(domain);
34 Vector<BCRec> bcrs_w(1);
37 bool l_use_terrain_fitted_coords = ( (terrain_type == TerrainType::StaticFittedMesh) ||
38 (terrain_type == TerrainType::MovingFittedMesh) );
47 Gpu::DeviceVector<BCRec> bcrs_w_d(1);
48 Gpu::copyAsync(Gpu::hostToDevice, bcrs_w.begin(), bcrs_w.end(), bcrs_w_d.begin());
49 const BCRec* bc_ptr_w = bcrs_w_d.data();
51 GpuArray<GpuArray<Real, AMREX_SPACEDIM*2>,1> l_bc_extdir_vals_d;
53 for (
int ori = 0; ori < 2*AMREX_SPACEDIM; ori++) {
57 GeometryData
const& geomdata =
m_geom.data();
58 bool is_periodic_in_x = geomdata.isPeriodic(0);
59 bool is_periodic_in_y = geomdata.isPeriodic(1);
64 if (!is_periodic_in_x)
67 Box bx_xlo(bx); bx_xlo.setBig (0,
dom_lo.x-1);
68 Box bx_xhi(bx); bx_xhi.setSmall(0,
dom_hi.x+1);
70 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
71 int iflip =
dom_lo.x - 1 - i;
75 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][0];
76 if (l_use_terrain_fitted_coords) {
77 dest_arr(i,j,k) = WFromOmega(i,j,k,dest_arr(i,j,k),
79 mf_u,mf_v,z_phys_nd,dxInv);
82 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
84 dest_arr(i,j,k) = dest_arr(
dom_lo.x,j,k);
86 dest_arr(i,j,k) = dest_arr(iflip,j,k);
88 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
91 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
92 int iflip = 2*
dom_hi.x + 1 - i;
96 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][3];
97 if (l_use_terrain_fitted_coords) {
98 dest_arr(i,j,k) =
WFromOmega(i,j,k,dest_arr(i,j,k),
100 mf_u,mf_v,z_phys_nd,
dxInv);
103 dest_arr(i,j,k) = dest_arr(
dom_hi.x,j,k);
105 dest_arr(i,j,k) = dest_arr(
dom_hi.x,j,k);
107 dest_arr(i,j,k) = dest_arr(iflip,j,k);
109 dest_arr(i,j,k) = -dest_arr(iflip,j,k);
116 if (!is_periodic_in_y)
119 Box bx_ylo(bx); bx_ylo.setBig (1,
dom_lo.y-1);
120 Box bx_yhi(bx); bx_yhi.setSmall(1,
dom_hi.y+1);
122 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
123 int jflip =
dom_lo.y - 1 - j;
127 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][1];
128 if (l_use_terrain_fitted_coords) {
129 dest_arr(i,j,k) = WFromOmega(i,j,k,dest_arr(i,j,k),
131 mf_u,mf_v,z_phys_nd,dxInv);
134 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
136 dest_arr(i,j,k) = dest_arr(i,
dom_lo.y,k);
138 dest_arr(i,j,k) = dest_arr(i,jflip,k);
140 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
143 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
144 int jflip = 2*
dom_hi.y + 1 - j;
148 dest_arr(i,j,k) = (zvel_bc_ptr) ? zvel_bc_ptr[k] : l_bc_extdir_vals_d[0][4];
149 if (l_use_terrain_fitted_coords) {
150 dest_arr(i,j,k) =
WFromOmega(i,j,k,dest_arr(i,j,k),
152 mf_u,mf_v,z_phys_nd,
dxInv);
155 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
157 dest_arr(i,j,k) = dest_arr(i,
dom_hi.y,k);
159 dest_arr(i,j,k) = dest_arr(i,jflip,k);
161 dest_arr(i,j,k) = -dest_arr(i,jflip,k);
165 Gpu::streamSynchronize();
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const Real *dx=geomdata.CellSize();const Real x=(i+0.5) *dx[0];const Real y=(j+0.5) *dx[1];const Real Omg=erf_vortex_Gaussian(x, y, xc, yc, R, beta, sigma);const Real deltaT=-(gamma - 1.0)/(2.0 *sigma *sigma) *Omg *Omg;const Real rho_norm=std::pow(1.0+deltaT, inv_gm1);const Real T=(1.0+deltaT) *T_inf;const Real p=std::pow(rho_norm, Gamma)/Gamma *rho_0 *a_inf *a_inf;const Real rho_theta=rho_0 *rho_norm *(T *std::pow(p_0/p, rdOcp));state_pert(i, j, k, RhoTheta_comp)=rho_theta - getRhoThetagivenP(p_hse(i, j, k));const Real r2d_xy=std::sqrt((x-xc) *(x-xc)+(y-yc) *(y-yc));state_pert(i, j, k, RhoScalar_comp)=0.25 *(1.0+std::cos(PI *std::min(r2d_xy, R)/R));})
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
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:464
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 amrex::Real time)
Definition: ERF_BoundaryConditionsZvel.cpp:16
@ open
Definition: ERF_IndexDefines.H:233
@ reflect_odd
Definition: ERF_IndexDefines.H:223
@ foextrap
Definition: ERF_IndexDefines.H:226
@ ext_dir
Definition: ERF_IndexDefines.H:227
@ ext_dir_upwind
Definition: ERF_IndexDefines.H:235
@ reflect_even
Definition: ERF_IndexDefines.H:225