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, tby, tbz,
120 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
123 Real gpx = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
125 if (l_use_terrain_fitted_coords) {
126 Real met_h_xi = (z_cc_arr(i,j,k) - z_cc_arr(i-1,j,k)) * dxInv[0];
128 Real dz_phys_hi, dz_phys_lo;
131 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k );
132 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k );
133 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k )) / dz_phys_hi;
134 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k )) / dz_phys_lo;
135 }
else if (k==domain_khi) {
136 dz_phys_hi = z_cc_arr(i ,j,k ) - z_cc_arr(i ,j,k-1);
137 dz_phys_lo = z_cc_arr(i-1,j,k ) - z_cc_arr(i-1,j,k-1);
138 gpz_hi = (p_arr(i ,j,k ) - p_arr(i ,j,k-1)) / dz_phys_hi;
139 gpz_lo = (p_arr(i-1,j,k ) - p_arr(i-1,j,k-1)) / dz_phys_lo;
141 dz_phys_hi = z_cc_arr(i ,j,k+1) - z_cc_arr(i ,j,k-1);
142 dz_phys_lo = z_cc_arr(i-1,j,k+1) - z_cc_arr(i-1,j,k-1);
143 gpz_hi = (p_arr(i ,j,k+1) - p_arr(i ,j,k-1)) / dz_phys_hi;
144 gpz_lo = (p_arr(i-1,j,k+1) - p_arr(i-1,j,k-1)) / dz_phys_lo;
146 Real gpx_metric = met_h_xi * 0.5 * (gpz_hi + gpz_lo);
149 gpx_arr(i,j,k) =
gpx;
151 [=] 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;
182 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
185 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) ) / met_h_zeta;
193 const bool l_fitting =
false;
195 const Real* dx_arr = geom.CellSize();
196 const Real dx = dx_arr[0];
197 const Real dy = dx_arr[1];
198 const Real dz = dx_arr[2];
201 Array4<const EBCellFlag> cellflg = (ebfact.
get_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
204 Array4<const EBCellFlag> u_cellflg = (ebfact.
get_u_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
205 Array4<const Real > u_volfrac = (ebfact.
get_u_const_factory())->getVolFrac().const_array(mfi);
206 Array4<const Real > u_volcent = (ebfact.
get_u_const_factory())->getCentroid().const_array(mfi);
209 Array4<const EBCellFlag> v_cellflg = (ebfact.
get_v_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
210 Array4<const Real > v_volfrac = (ebfact.
get_v_const_factory())->getVolFrac().const_array(mfi);
211 Array4<const Real > v_volcent = (ebfact.
get_v_const_factory())->getCentroid().const_array(mfi);
214 Array4<const EBCellFlag> w_cellflg = (ebfact.
get_w_const_factory())->getMultiEBCellFlagFab()[mfi].const_array();
215 Array4<const Real > w_volfrac = (ebfact.
get_w_const_factory())->getVolFrac().const_array(mfi);
216 Array4<const Real > w_volcent = (ebfact.
get_w_const_factory())->getCentroid().const_array(mfi);
220 ParallelFor(tbx, tby, tbz,
221 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
223 if (u_volfrac(i,j,k) > 0.0) {
225 if (u_cellflg(i,j,k).isSingleValued()) {
227 GpuArray<Real,AMREX_SPACEDIM> slopes;
228 slopes =
erf_calc_slopes_eb_staggered(
Vars::xvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, u_volcent, u_cellflg);
230 gpx_arr(i,j,k) = slopes[0];
233 gpx_arr(i,j,k) = dxInv[0] * (p_arr(i,j,k) - p_arr(i-1,j,k));
237 gpx_arr(i,j,k) = 0.0;
240 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
242 if (v_volfrac(i,j,k) > 0.0) {
244 if (v_cellflg(i,j,k).isSingleValued()) {
246 GpuArray<Real,AMREX_SPACEDIM> slopes;
247 slopes =
erf_calc_slopes_eb_staggered(
Vars::yvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, v_volcent, v_cellflg);
249 gpy_arr(i,j,k) = slopes[1];
252 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
255 gpy_arr(i,j,k) = 0.0;
258 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k)
260 if (w_volfrac(i,j,k) > 0.0) {
262 if (w_cellflg(i,j,k).isSingleValued()) {
264 GpuArray<Real,AMREX_SPACEDIM> slopes;
265 slopes =
erf_calc_slopes_eb_staggered(
Vars::zvel,
Vars::cons, dx, dy, dz, i, j, k, p_arr, w_volcent, w_cellflg);
267 gpz_arr(i,j,k) = slopes[2];
270 gpz_arr(i,j,k) = dxInv[2] * (p_arr(i,j,k) - p_arr(i,j,k-1));
273 gpz_arr(i,j,k) = 0.0;
281 ParallelFor(tbx, tby, tbz,
282 [=] 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;
298 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
300 if (v_volfrac(i,j,k) > 0.0) {
301 if (!cellflg(i,j-1,k).isCovered()) {
302 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j,k) - p_arr(i,j-1,k));
304 if (!cellflg(i,j+1,k).isCovered()) {
305 gpy_arr(i,j,k) = dxInv[1] * (p_arr(i,j+1,k) - p_arr(i,j,k));
307 Abort(
"MakeGradP: both neighbors in y-direction are covered");
311 gpy_arr(i,j,k) = 0.0;
314 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
316 if (w_volfrac(i,j,k) > 0.0) {
317 if (!cellflg(i,j,k-1).isCovered()) {
318 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k)-p_arr(i,j,k-1) );
320 if (!cellflg(i,j,k+1).isCovered()) {
321 gpz_arr(i,j,k) = dxInv[2] * ( p_arr(i,j,k+1)-p_arr(i,j,k) );
323 Abort(
"MakeGradP: both neighbors in z-direction are covered");
327 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:16
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:777
static TerrainType terrain_type
Definition: ERF_DataStruct.H:768