Function for computing the advective tendency for the momentum equations ONLY when using terrain-fitted coordinates
68 AMREX_ALWAYS_ASSERT(bxz.smallEnd(2) > 0);
70 auto dxInv = cellSizeInv[0], dyInv = cellSizeInv[1], dzInv = cellSizeInv[2];
73 Box box2d_u(bxx); box2d_u.setRange(2,0); box2d_u.grow({3,3,0});
74 Box box2d_v(bxy); box2d_v.setRange(2,0); box2d_v.grow({3,3,0});
76 FArrayBox mf_ux_invFAB(box2d_u,1,The_Async_Arena());
77 FArrayBox mf_uy_invFAB(box2d_u,1,The_Async_Arena());
78 const Array4<Real>& mf_ux_inv = mf_ux_invFAB.array();
79 const Array4<Real>& mf_uy_inv = mf_uy_invFAB.array();
81 FArrayBox mf_vx_invFAB(box2d_v,1,The_Async_Arena());
82 FArrayBox mf_vy_invFAB(box2d_v,1,The_Async_Arena());
83 const Array4<Real>& mf_vx_inv = mf_vx_invFAB.array();
84 const Array4<Real>& mf_vy_inv = mf_vy_invFAB.array();
86 ParallelFor(box2d_u, box2d_v,
87 [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
89 mf_ux_inv(i,j,0) = 1. / mf_ux(i,j,0);
90 mf_uy_inv(i,j,0) = 1. / mf_uy(i,j,0);
92 [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
94 mf_vx_inv(i,j,0) = 1. / mf_vx(i,j,0);
95 mf_vy_inv(i,j,0) = 1. / mf_vy(i,j,0);
101 ParallelFor(bxx, bxy, bxz,
102 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
104 Real xflux_hi = 0.25 * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i+1,j,k) * mf_uy_inv(i+1,j,0)) *
105 (u(i+1,j,k) + u(i,j,k)) * 0.5 * (ax(i,j,k) + ax(i+1,j,k));
107 Real xflux_lo = 0.25 * (rho_u(i,j,k) * mf_uy_inv(i,j,0) + rho_u(i-1,j,k) * mf_uy_inv(i-1,j,0)) *
108 (u(i-1,j,k) + u(i,j,k)) * 0.5 * (ax(i,j,k) + ax(i-1,j,k));
111 Real yflux_hi = 0.25 * (rho_v(i,j+1,k)*mf_vx_inv(i,j+1,0) + rho_v(i-1,j+1,k)*mf_vx_inv(i-1,j+1,0)) *
112 (u(i,j+1,k) + u(i,j,k)) * met_h_zeta_yhi;
115 Real yflux_lo = 0.25 * (rho_v(i,j ,k)*mf_vx_inv(i,j ,0) + rho_v(i-1,j ,k)*mf_vx_inv(i-1,j ,0)) *
116 (u(i,j-1,k) + u(i,j,k)) * met_h_zeta_ylo;
118 Real zflux_hi = 0.25 * (Omega(i,j,k+1) + Omega(i-1,j,k+1)) * (u(i,j,k+1) + u(i,j,k)) *
119 0.5 * (az(i,j,k+1) + az(i-1,j,k+1));
120 Real zflux_lo = 0.25 * (Omega(i,j,k ) + Omega(i-1,j,k )) * (u(i,j,k-1) + u(i,j,k)) *
121 0.5 * (az(i,j,k ) + az(i-1,j,k ));
123 Real mfsq = mf_ux(i,j,0) * mf_uy(i,j,0);
125 Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
126 + (yflux_hi - yflux_lo) * dyInv * mfsq
127 + (zflux_hi - zflux_lo) * dzInv;
128 rho_u_rhs(i, j, k) = -advectionSrc / (0.5 * (detJ(i,j,k) + detJ(i-1,j,k)));
130 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
134 Real xflux_hi = 0.25 * (rho_u(i+1,j,k)*mf_uy_inv(i+1,j,0) + rho_u(i+1,j-1,k)*mf_uy_inv(i+1,j-1,0)) *
135 (v(i+1,j,k) + v(i,j,k)) * met_h_zeta_xhi;
138 Real xflux_lo = 0.25 * (rho_u(i, j, k)*mf_uy_inv(i ,j,0) + rho_u(i ,j-1,k)*mf_uy_inv(i-1,j ,0)) *
139 (v(i-1,j,k) + v(i,j,k)) * met_h_zeta_xlo;
141 Real yflux_hi = 0.25 * (rho_v(i,j+1,k)*mf_vx_inv(i,j+1,0) + rho_v(i,j ,k) * mf_vx_inv(i,j ,0)) *
142 (v(i,j+1,k) + v(i,j,k)) * 0.5 * (ay(i,j,k) + ay(i,j+1,k));
144 Real yflux_lo = 0.25 * (rho_v(i,j ,k)*mf_vx_inv(i,j ,0) + rho_v(i,j-1,k) * mf_vx_inv(i,j-1,0)) *
145 (v(i,j-1,k) + v(i,j,k)) * 0.5 * (ay(i,j,k) + ay(i,j-1,k));
147 Real zflux_hi = 0.25 * (Omega(i,j,k+1) + Omega(i, j-1, k+1)) * (v(i,j,k+1) + v(i,j,k)) *
148 0.5 * (az(i,j,k+1) + az(i,j-1,k+1));
149 Real zflux_lo = 0.25 * (Omega(i,j,k ) + Omega(i, j-1, k )) * (v(i,j,k-1) + v(i,j,k)) *
150 0.5 * (az(i,j,k ) + az(i,j-1,k ));
152 Real mfsq = mf_vx(i,j,0) * mf_vy(i,j,0);
154 Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
155 + (yflux_hi - yflux_lo) * dyInv * mfsq
156 + (zflux_hi - zflux_lo) * dzInv;
157 rho_v_rhs(i, j, k) = -advectionSrc / (0.5 * (detJ(i,j,k) + detJ(i,j-1,k)));
159 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) noexcept
162 Real xflux_hi = 0.25*(rho_u(i+1,j ,k) + rho_u(i+1,j,k-1)) * mf_uy_inv(i+1,j,0) *
163 (w(i+1,j,k) + w(i,j,k)) * met_h_zeta_xhi;
166 Real xflux_lo = 0.25*(rho_u(i ,j ,k) + rho_u(i ,j,k-1)) * mf_uy_inv(i ,j,0) *
167 (w(i-1,j,k) + w(i,j,k)) * met_h_zeta_xlo;
170 Real yflux_hi = 0.25*(rho_v(i,j+1,k) + rho_v(i,j+1,k-1)) * mf_vx_inv(i,j+1,0) *
171 (w(i,j+1,k) + w(i,j,k)) * met_h_zeta_yhi;
174 Real yflux_lo = 0.25*(rho_v(i,j ,k) + rho_v(i,j ,k-1)) * mf_vx_inv(i,j ,0) *
175 (w(i,j-1,k) + w(i,j,k)) * met_h_zeta_ylo;
177 Real zflux_lo = 0.25 * (Omega(i,j,k) + Omega(i,j,k-1)) * (w(i,j,k) + w(i,j,k-1));
179 Real zflux_hi = (k == hi_z_face) ? Omega(i,j,k) * w(i,j,k) * az(i,j,k):
180 0.25 * (Omega(i,j,k) + Omega(i,j,k+1)) * (w(i,j,k) + w(i,j,k+1)) *
181 0.5 * (az(i,j,k) + az(i,j,k+1));
183 Real mfsq = mf_mx(i,j,0) * mf_my(i,j,0);
185 Real advectionSrc = (xflux_hi - xflux_lo) * dxInv * mfsq
186 + (yflux_hi - yflux_lo) * dyInv * mfsq
187 + (zflux_hi - zflux_lo) * dzInv;
188 rho_w_rhs(i, j, k) = -advectionSrc / (0.5*(detJ(i,j,k) + detJ(i,j,k-1)));
194 AdvectionSrcForMomVert<CENTERED2>(bxx, bxy, bxz,
195 rho_u_rhs, rho_v_rhs, rho_w_rhs,
196 rho_u, rho_v, Omega, u, v, w,
197 z_nd, ax, ay, az, detJ, cellSizeInv,
198 mf_mx, mf_ux_inv, mf_vx_inv,
199 mf_my, mf_uy_inv, mf_vy_inv,
200 horiz_upw_frac, vert_upw_frac,
201 vert_adv_type, lo_z_face, hi_z_face);
203 AdvectionSrcForMomVert<UPWIND3>(bxx, bxy, bxz,
204 rho_u_rhs, rho_v_rhs, rho_w_rhs,
205 rho_u, rho_v, Omega, u, v, w,
206 z_nd, ax, ay, az, detJ, cellSizeInv,
207 mf_mx, mf_ux_inv, mf_vx_inv,
208 mf_my, mf_uy_inv, mf_vy_inv,
209 horiz_upw_frac, vert_upw_frac,
210 vert_adv_type, lo_z_face, hi_z_face);
212 AdvectionSrcForMomVert<CENTERED4>(bxx, bxy, bxz,
213 rho_u_rhs, rho_v_rhs, rho_w_rhs,
214 rho_u, rho_v, Omega, u, v, w,
215 z_nd, ax, ay, az, detJ, cellSizeInv,
216 mf_mx, mf_ux_inv, mf_vx_inv,
217 mf_my, mf_uy_inv, mf_vy_inv,
218 horiz_upw_frac, vert_upw_frac,
219 vert_adv_type, lo_z_face, hi_z_face);
221 AdvectionSrcForMomVert<UPWIND5>(bxx, bxy, bxz,
222 rho_u_rhs, rho_v_rhs, rho_w_rhs,
223 rho_u, rho_v, Omega, u, v, w,
224 z_nd, ax, ay, az, detJ, cellSizeInv,
225 mf_mx, mf_ux_inv, mf_vx_inv,
226 mf_my, mf_uy_inv, mf_vy_inv,
227 horiz_upw_frac, vert_upw_frac,
228 vert_adv_type, lo_z_face, hi_z_face);
230 AdvectionSrcForMomVert<CENTERED6>(bxx, bxy, bxz,
231 rho_u_rhs, rho_v_rhs, rho_w_rhs,
232 rho_u, rho_v, Omega, u, v, w,
233 z_nd, ax, ay, az, detJ, cellSizeInv,
234 mf_mx, mf_ux_inv, mf_vx_inv,
235 mf_my, mf_uy_inv, mf_vy_inv,
236 horiz_upw_frac, vert_upw_frac,
237 vert_adv_type, lo_z_face, hi_z_face);
239 AMREX_ASSERT_WITH_MESSAGE(
false,
"Unknown advection scheme!");
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:276
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:231
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:320