88 const bool l_use_terrain_fitted_coords = (solverChoice.
mesh_type != MeshType::ConstantDz);
90 const Box domain = geom.Domain();
91 const int domain_klo = domain.smallEnd(2);
92 const int domain_khi = domain.bigEnd(2);
94 const GpuArray<Real, AMREX_SPACEDIM> dxInv = geom.InvCellSizeArray();
99 for ( MFIter mfi(p); mfi.isValid(); ++mfi)
101 Box tbx = mfi.nodaltilebox(0);
102 Box tby = mfi.nodaltilebox(1);
103 Box tbz = mfi.nodaltilebox(2);
106 if (tbz.smallEnd(2) == domain_klo) {
109 if (tbz.bigEnd(2) == domain_khi+1) {
114 const Array4<const Real>& z_nd_arr = z_phys_nd.const_array(mfi);
115 const Array4<const Real>& z_cc_arr = z_phys_cc.const_array(mfi);
117 const Array4<const Real>& p_arr = p.const_array(mfi);
119 const Array4< Real>& gpx_arr = gradp[
GpVars::gpx].array(mfi);
120 const Array4< Real>& gpy_arr = gradp[
GpVars::gpy].array(mfi);
121 const Array4< Real>& gpz_arr = gradp[
GpVars::gpz].array(mfi);
125 ParallelFor(tbx, tby, tbz,
126 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
129 Real gpx = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
131 if (l_use_terrain_fitted_coords) {
132 Real met_h_xi = (z_cc_arr(i,j,k) - z_cc_arr(i-1,j,k)) * dxInv[0];
134 Real dz_phys_hi, dz_phys_lo;
137 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k );
138 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k );
139 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k )) / dz_phys_hi;
140 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k )) / dz_phys_lo;
141 }
else if (k==domain_khi) {
142 dz_phys_hi = z_cc_arr(i ,j,k ) - z_cc_arr(i ,j,k-1);
143 dz_phys_lo = z_cc_arr(i-1,j,k ) - z_cc_arr(i-1,j,k-1);
144 gpz_hi = (p_arr(i ,j,k ) - p_arr(i ,j,k-1)) / dz_phys_hi;
145 gpz_lo = (p_arr(i-1,j,k ) - p_arr(i-1,j,k-1)) / dz_phys_lo;
147 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k-1);
148 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k-1);
149 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k-1)) / dz_phys_hi;
150 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k-1)) / dz_phys_lo;
152 Real gpx_metric = met_h_xi * 0.5 * (gpz_hi + gpz_lo);
155 gpx_arr(i,j,k) =
gpx;
157 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
160 Real gpy = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
162 if (l_use_terrain_fitted_coords) {
163 Real met_h_eta = (z_cc_arr(i,j,k) - z_cc_arr(i,j-1,k)) * dxInv[1];
165 Real dz_phys_hi, dz_phys_lo;
168 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k );
169 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k );
170 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k )) / dz_phys_hi;
171 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k )) / dz_phys_lo;
172 }
else if (k==domain_khi) {
173 dz_phys_hi = z_cc_arr(i,j ,k ) - z_cc_arr(i,j ,k-1);
174 dz_phys_lo = z_cc_arr(i,j-1,k ) - z_cc_arr(i,j-1,k-1);
175 gpz_hi = (p_arr(i,j ,k ) - p_arr(i,j ,k-1)) / dz_phys_hi;
176 gpz_lo = (p_arr(i,j-1,k ) - p_arr(i,j-1,k-1)) / dz_phys_lo;
178 dz_phys_hi = z_cc_arr(i,j ,k+1) - z_cc_arr(i,j ,k-1);
179 dz_phys_lo = z_cc_arr(i,j-1,k+1) - z_cc_arr(i,j-1,k-1);
180 gpz_hi = (p_arr(i,j ,k+1) - p_arr(i,j ,k-1)) / dz_phys_hi;
181 gpz_lo = (p_arr(i,j-1,k+1) - p_arr(i,j-1,k-1)) / dz_phys_lo;
183 Real gpy_metric = met_h_eta * 0.5 * (gpz_hi + gpz_lo);
186 gpy_arr(i,j,k) =
gpy;
188 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
191 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) / met_h_zeta;
199 const bool l_fitting =
false;
201 const Real* dx_arr = geom.CellSize();
202 const Real dx = dx_arr[0];
203 const Real dy = dx_arr[1];
204 const Real dz = dx_arr[2];
207 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
210 Array4<const EBCellFlag> u_cellflg = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
211 Array4<const Real > u_volfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
212 Array4<const Real > u_volcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
215 Array4<const EBCellFlag> v_cellflg = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
216 Array4<const Real > v_volfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
217 Array4<const Real > v_volcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
220 Array4<const EBCellFlag> w_cellflg = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
221 Array4<const Real > w_volfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
222 Array4<const Real > w_volcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
226 ParallelFor(tbx, tby, tbz,
227 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
229 if (u_volfrac(i,j,k) > 0.0) {
231 if (u_cellflg(i,j,k).isSingleValued()) {
233 GpuArray<Real,AMREX_SPACEDIM> slopes;
234 slopes =
erf_calc_slopes_eb_staggered(
Vars::xvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, u_volcent, u_cellflg);
236 gpx_arr(i,j,k) = slopes[0];
239 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
243 gpx_arr(i,j,k) = 0.0;
246 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
248 if (v_volfrac(i,j,k) > 0.0) {
250 if (v_cellflg(i,j,k).isSingleValued()) {
252 GpuArray<Real,AMREX_SPACEDIM> slopes;
253 slopes =
erf_calc_slopes_eb_staggered(
Vars::yvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, v_volcent, v_cellflg);
255 gpy_arr(i,j,k) = slopes[1];
258 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
261 gpy_arr(i,j,k) = 0.0;
264 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
266 if (w_volfrac(i,j,k) > 0.0) {
268 if (w_cellflg(i,j,k).isSingleValued()) {
270 GpuArray<Real,AMREX_SPACEDIM> slopes;
271 slopes =
erf_calc_slopes_eb_staggered(
Vars::zvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, w_volcent, w_cellflg);
273 gpz_arr(i,j,k) = slopes[2];
276 gpz_arr(i,j,k) = dxInv[2] * (p_arr(i,j,k) - p_arr(i,j,k-1));
279 gpz_arr(i,j,k) = 0.0;
287 ParallelFor(tbx, tby, tbz,
288 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
290 if (u_volfrac(i,j,k) > 0.0) {
291 if (!cellflg(i-1,j,k).isCovered()) {
292 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
294 if (!cellflg(i+1,j,k).isCovered()) {
295 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i+1,j,k) - p_arr(i,j,k));
297 Abort(
"MakeGradP: both neighbors in x-direction are covered");
301 gpx_arr(i,j,k) = 0.0;
304 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
306 if (v_volfrac(i,j,k) > 0.0) {
307 if (!cellflg(i,j-1,k).isCovered()) {
308 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
310 if (!cellflg(i,j+1,k).isCovered()) {
311 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j+1,k) - p_arr(i,j,k));
313 Abort(
"MakeGradP: both neighbors in y-direction are covered");
317 gpy_arr(i,j,k) = 0.0;
320 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
322 if (w_volfrac(i,j,k) > 0.0) {
323 if (!cellflg(i,j,k-1).isCovered()) {
324 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) );
326 if (!cellflg(i,j,k+1).isCovered()) {
327 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k+1)-p_arr(i,j,k) );
329 Abort(
"MakeGradP: both neighbors in z-direction are covered");
333 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::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:176
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:852
static TerrainType terrain_type
Definition: ERF_DataStruct.H:843