90 const bool l_use_terrain_fitted_coords = (solverChoice.
mesh_type != MeshType::ConstantDz);
92 const Box domain = geom.Domain();
93 const int domain_klo = domain.smallEnd(2);
94 const int domain_khi = domain.bigEnd(2);
96 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
101 for ( MFIter mfi(p); mfi.isValid(); ++mfi)
103 Box tbx = mfi.nodaltilebox(0);
104 Box tby = mfi.nodaltilebox(1);
105 Box tbz = mfi.nodaltilebox(2);
108 if (tbz.smallEnd(2) == domain_klo) {
111 if (tbz.bigEnd(2) == domain_khi+1) {
116 const Array4<const Real>& z_nd_arr = z_phys_nd.const_array(mfi);
117 const Array4<const Real>& z_cc_arr = z_phys_cc.const_array(mfi);
119 const Array4<const Real>& p_arr = p.const_array(mfi);
121 const Array4< Real>& gpx_arr = gradp[
GpVars::gpx].array(mfi);
122 const Array4< Real>& gpy_arr = gradp[
GpVars::gpy].array(mfi);
123 const Array4< Real>& gpz_arr = gradp[
GpVars::gpz].array(mfi);
125 const Array4<const Real>& mf_ux_arr = mapfac[
MapFacType::u_x]->const_array(mfi);
126 const Array4<const Real>& mf_vy_arr = mapfac[
MapFacType::v_y]->const_array(mfi);
130 ParallelFor(tbx, tby, tbz,
131 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
134 Real gpx = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
136 if (l_use_terrain_fitted_coords) {
137 Real met_h_xi = (z_cc_arr(i,j,k) - z_cc_arr(i-1,j,k)) * dxInv[0];
139 Real dz_phys_hi, dz_phys_lo;
142 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k );
143 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k );
144 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k )) / dz_phys_hi;
145 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k )) / dz_phys_lo;
146 }
else if (k==domain_khi) {
147 dz_phys_hi = z_cc_arr(i ,j,k ) - z_cc_arr(i ,j,k-1);
148 dz_phys_lo = z_cc_arr(i-1,j,k ) - z_cc_arr(i-1,j,k-1);
149 gpz_hi = (p_arr(i ,j,k ) - p_arr(i ,j,k-1)) / dz_phys_hi;
150 gpz_lo = (p_arr(i-1,j,k ) - p_arr(i-1,j,k-1)) / dz_phys_lo;
152 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k-1);
153 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k-1);
154 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k-1)) / dz_phys_hi;
155 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k-1)) / dz_phys_lo;
157 Real gpx_metric = met_h_xi * 0.5 * (gpz_hi + gpz_lo);
160 gpx_arr(i,j,k) =
gpx;
163 gpx_arr(i,j,k) *= mf_ux_arr(i,j,0);
165 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
168 Real gpy = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
170 if (l_use_terrain_fitted_coords) {
171 Real met_h_eta = (z_cc_arr(i,j,k) - z_cc_arr(i,j-1,k)) * dxInv[1];
173 Real dz_phys_hi, dz_phys_lo;
176 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k );
177 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k );
178 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k )) / dz_phys_hi;
179 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k )) / dz_phys_lo;
180 }
else if (k==domain_khi) {
181 dz_phys_hi = z_cc_arr(i,j ,k ) - z_cc_arr(i,j ,k-1);
182 dz_phys_lo = z_cc_arr(i,j-1,k ) - z_cc_arr(i,j-1,k-1);
183 gpz_hi = (p_arr(i,j ,k ) - p_arr(i,j ,k-1)) / dz_phys_hi;
184 gpz_lo = (p_arr(i,j-1,k ) - p_arr(i,j-1,k-1)) / dz_phys_lo;
186 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k-1);
187 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k-1);
188 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k-1)) / dz_phys_hi;
189 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k-1)) / dz_phys_lo;
191 Real gpy_metric = met_h_eta * 0.5 * (gpz_hi + gpz_lo);
194 gpy_arr(i,j,k) =
gpy;
197 gpy_arr(i,j,k) *= mf_vy_arr(i,j,0);
199 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
202 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) / met_h_zeta;
210 const bool l_fitting =
false;
212 const Real* dx_arr = geom.CellSize();
213 const Real dx = dx_arr[0];
214 const Real dy = dx_arr[1];
215 const Real dz = dx_arr[2];
218 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
221 Array4<const EBCellFlag> u_cellflg = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
222 Array4<const Real > u_volfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
223 Array4<const Real > u_volcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
226 Array4<const EBCellFlag> v_cellflg = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
227 Array4<const Real > v_volfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
228 Array4<const Real > v_volcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
231 Array4<const EBCellFlag> w_cellflg = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
232 Array4<const Real > w_volfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
233 Array4<const Real > w_volcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
237 ParallelFor(tbx, tby, tbz,
238 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
240 if (u_volfrac(i,j,k) > 0.0) {
242 if (u_cellflg(i,j,k).isSingleValued()) {
244 GpuArray<Real,AMREX_SPACEDIM> slopes;
245 slopes =
erf_calc_slopes_eb_staggered(
Vars::xvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, u_volcent, u_cellflg);
247 gpx_arr(i,j,k) = slopes[0];
250 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
254 gpx_arr(i,j,k) = 0.0;
257 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
259 if (v_volfrac(i,j,k) > 0.0) {
261 if (v_cellflg(i,j,k).isSingleValued()) {
263 GpuArray<Real,AMREX_SPACEDIM> slopes;
264 slopes =
erf_calc_slopes_eb_staggered(
Vars::yvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, v_volcent, v_cellflg);
266 gpy_arr(i,j,k) = slopes[1];
269 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
272 gpy_arr(i,j,k) = 0.0;
275 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
277 if (w_volfrac(i,j,k) > 0.0) {
279 if (w_cellflg(i,j,k).isSingleValued()) {
281 GpuArray<Real,AMREX_SPACEDIM> slopes;
282 slopes =
erf_calc_slopes_eb_staggered(
Vars::zvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, w_volcent, w_cellflg);
284 gpz_arr(i,j,k) = slopes[2];
287 gpz_arr(i,j,k) = dxInv[2] * (p_arr(i,j,k) - p_arr(i,j,k-1));
290 gpz_arr(i,j,k) = 0.0;
298 ParallelFor(tbx, tby, tbz,
299 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
301 if (u_volfrac(i,j,k) > 0.0) {
302 if (cellflg(i,j,k).isCovered()) {
303 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i-3,j,k) - 3.*p_arr(i-2,j,k) + 2.*p_arr(i-1,j,k));
304 }
else if (cellflg(i-1,j,k).isCovered()) {
305 gpx_arr(i,j,k) = dxInv[0] * (3.*p_arr(i+1,j,k) - p_arr(i+2,j,k) - 2.*p_arr(i,j,k));
307 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
310 gpx_arr(i,j,k) = 0.0;
313 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
315 if (v_volfrac(i,j,k) > 0.0) {
316 if (cellflg(i,j,k).isCovered()) {
317 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j-3,k) - 3.*p_arr(i,j-2,k) + 2.*p_arr(i,j-1,k));
318 }
else if (cellflg(i,j-1,k).isCovered()) {
319 gpy_arr(i,j,k) = dxInv[1] * (3.*p_arr(i,j+1,k) - p_arr(i,j+2,k) - 2.*p_arr(i,j,k));
321 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
324 gpy_arr(i,j,k) = 0.0;
327 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
329 if (w_volfrac(i,j,k) > 0.0) {
330 if (cellflg(i,j,k).isCovered()) {
331 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k-3) - 3.*p_arr(i,j,k-2) + 2.*p_arr(i,j,k-1) );
332 }
else if (cellflg(i,j,k-1).isCovered()) {
333 gpz_arr(i,j,k) = dxInv[2] * ( 3.*p_arr(i,j,k+1) - p_arr(i,j,k+2) - 2.*p_arr(i,j,k) );
335 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) );
338 gpz_arr(i,j,k) = 0.0;
@ v_y
Definition: ERF_DataStruct.H:23
@ u_x
Definition: ERF_DataStruct.H:22
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > erf_calc_slopes_eb_staggered(int igrid_query, int igrid_data, amrex::Real dx, amrex::Real dy, amrex::Real dz, int i, int j, int k, amrex::Array4< amrex::Real const > const &state, amrex::Array4< amrex::Real const > const &ccent, amrex::Array4< amrex::EBCellFlag const > const &flag)
Definition: ERF_EBSlopes.H:300
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface(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:182
eb_aux_ const * get_w_const_factory() const noexcept
Definition: ERF_EB.H:58
const std::unique_ptr< amrex::EBFArrayBoxFactory > & get_const_factory() const noexcept
Definition: ERF_EB.H:46
eb_aux_ const * get_v_const_factory() const noexcept
Definition: ERF_EB.H:57
eb_aux_ const * get_u_const_factory() const noexcept
Definition: ERF_EB.H:56
@ gpz
Definition: ERF_IndexDefines.H:152
@ gpy
Definition: ERF_IndexDefines.H:151
@ gpx
Definition: ERF_IndexDefines.H:150
@ xvel
Definition: ERF_IndexDefines.H:141
@ cons
Definition: ERF_IndexDefines.H:140
@ zvel
Definition: ERF_IndexDefines.H:143
@ yvel
Definition: ERF_IndexDefines.H:142
static MeshType mesh_type
Definition: ERF_DataStruct.H:894
static TerrainType terrain_type
Definition: ERF_DataStruct.H:885