82 const bool l_use_terrain_fitted_coords = (solverChoice.
mesh_type != MeshType::ConstantDz);
84 const Box domain = geom.Domain();
85 const int domain_klo = domain.smallEnd(2);
86 const int domain_khi = domain.bigEnd(2);
88 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
93 for ( MFIter mfi(p); mfi.isValid(); ++mfi)
95 Box tbx = mfi.nodaltilebox(0);
96 Box tby = mfi.nodaltilebox(1);
97 Box tbz = mfi.nodaltilebox(2);
100 if (tbz.smallEnd(2) == domain_klo) {
103 if (tbz.bigEnd(2) == domain_khi+1) {
108 const Array4<const Real>& z_nd_arr = z_phys_nd.const_array(mfi);
109 const Array4<const Real>& z_cc_arr = z_phys_cc.const_array(mfi);
111 const Array4<const Real>& p_arr = p.const_array(mfi);
113 const Array4< Real>& gpx_arr = gradp[
GpVars::gpx].array(mfi);
114 const Array4< Real>& gpy_arr = gradp[
GpVars::gpy].array(mfi);
115 const Array4< Real>& gpz_arr = gradp[
GpVars::gpz].array(mfi);
119 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
122 Real
gpx = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
124 if (l_use_terrain_fitted_coords) {
125 Real met_h_xi = (z_cc_arr(i,j,k) - z_cc_arr(i-1,j,k)) * dxInv[0];
127 Real dz_phys_hi, dz_phys_lo;
130 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k );
131 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k );
132 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k )) / dz_phys_hi;
133 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k )) / dz_phys_lo;
134 }
else if (k==domain_khi) {
135 dz_phys_hi = z_cc_arr(i ,j,k ) - z_cc_arr(i ,j,k-1);
136 dz_phys_lo = z_cc_arr(i-1,j,k ) - z_cc_arr(i-1,j,k-1);
137 gpz_hi = (p_arr(i ,j,k ) - p_arr(i ,j,k-1)) / dz_phys_hi;
138 gpz_lo = (p_arr(i-1,j,k ) - p_arr(i-1,j,k-1)) / dz_phys_lo;
140 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k-1);
141 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k-1);
142 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k-1)) / dz_phys_hi;
143 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k-1)) / dz_phys_lo;
145 Real gpx_metric = met_h_xi * 0.5 * (gpz_hi + gpz_lo);
148 gpx_arr(i,j,k) =
gpx;
151 ParallelFor(tby, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
154 Real
gpy = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
156 if (l_use_terrain_fitted_coords) {
157 Real met_h_eta = (z_cc_arr(i,j,k) - z_cc_arr(i,j-1,k)) * dxInv[1];
159 Real dz_phys_hi, dz_phys_lo;
162 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k );
163 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k );
164 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k )) / dz_phys_hi;
165 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k )) / dz_phys_lo;
166 }
else if (k==domain_khi) {
167 dz_phys_hi = z_cc_arr(i,j ,k ) - z_cc_arr(i,j ,k-1);
168 dz_phys_lo = z_cc_arr(i,j-1,k ) - z_cc_arr(i,j-1,k-1);
169 gpz_hi = (p_arr(i,j ,k ) - p_arr(i,j ,k-1)) / dz_phys_hi;
170 gpz_lo = (p_arr(i,j-1,k ) - p_arr(i,j-1,k-1)) / dz_phys_lo;
172 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k-1);
173 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k-1);
174 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k-1)) / dz_phys_hi;
175 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k-1)) / dz_phys_lo;
177 Real gpy_metric = met_h_eta * 0.5 * (gpz_hi + gpz_lo);
180 gpy_arr(i,j,k) =
gpy;
183 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
186 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) / met_h_zeta;
194 const bool l_fitting =
false;
196 const Real* dx_arr = geom.CellSize();
197 const Real dx = dx_arr[0];
198 const Real dy = dx_arr[1];
199 const Real dz = dx_arr[2];
202 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
205 Array4<const EBCellFlag> u_cellflg = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
206 Array4<const Real > u_volfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
207 Array4<const Real > u_volcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
210 Array4<const EBCellFlag> v_cellflg = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
211 Array4<const Real > v_volfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
212 Array4<const Real > v_volcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
215 Array4<const EBCellFlag> w_cellflg = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
216 Array4<const Real > w_volfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
217 Array4<const Real > w_volcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
221 ParallelFor(tbx, tby, tbz,
222 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
224 if (u_volfrac(i,j,k) > 0.0) {
226 if (u_cellflg(i,j,k).isSingleValued()) {
228 GpuArray<Real,AMREX_SPACEDIM> slopes;
229 slopes =
erf_calc_slopes_eb_staggered(
Vars::xvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, u_volcent, u_cellflg);
231 gpx_arr(i,j,k) = slopes[0];
234 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
238 gpx_arr(i,j,k) = 0.0;
241 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
243 if (v_volfrac(i,j,k) > 0.0) {
245 if (v_cellflg(i,j,k).isSingleValued()) {
247 GpuArray<Real,AMREX_SPACEDIM> slopes;
248 slopes =
erf_calc_slopes_eb_staggered(
Vars::yvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, v_volcent, v_cellflg);
250 gpy_arr(i,j,k) = slopes[1];
253 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
256 gpy_arr(i,j,k) = 0.0;
259 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
261 if (w_volfrac(i,j,k) > 0.0) {
263 if (w_cellflg(i,j,k).isSingleValued()) {
265 GpuArray<Real,AMREX_SPACEDIM> slopes;
266 slopes =
erf_calc_slopes_eb_staggered(
Vars::zvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, w_volcent, w_cellflg);
268 gpz_arr(i,j,k) = slopes[2];
271 gpz_arr(i,j,k) = dxInv[2] * (p_arr(i,j,k) - p_arr(i,j,k-1));
274 gpz_arr(i,j,k) = 0.0;
282 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
284 if (u_volfrac(i,j,k) > 0.0) {
285 if (!cellflg(i-1,j,k).isCovered()) {
286 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
288 if (!cellflg(i+1,j,k).isCovered()) {
289 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i+1,j,k) - p_arr(i,j,k));
291 Abort(
"MakeGradP: both neighbors in x-direction are covered");
295 gpx_arr(i,j,k) = 0.0;
299 ParallelFor(tby, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
301 if (v_volfrac(i,j,k) > 0.0) {
302 if (!cellflg(i,j-1,k).isCovered()) {
303 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
305 if (!cellflg(i,j+1,k).isCovered()) {
306 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j+1,k) - p_arr(i,j,k));
308 Abort(
"MakeGradP: both neighbors in y-direction are covered");
312 gpy_arr(i,j,k) = 0.0;
316 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
318 if (w_volfrac(i,j,k) > 0.0) {
319 if (!cellflg(i,j,k-1).isCovered()) {
320 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) );
322 if (!cellflg(i,j,k+1).isCovered()) {
323 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k+1)-p_arr(i,j,k) );
325 Abort(
"MakeGradP: both neighbors in z-direction are covered");
329 gpz_arr(i,j,k) = 0.0;
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_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:56
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:55
eb_aux_ const * get_u_const_factory() const noexcept
Definition: ERF_EB.H:54
@ 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:755
static TerrainType terrain_type
Definition: ERF_DataStruct.H:749