Fill averages for the point or region policy.
Function to compute average over local region.
2062 const auto & geom =
m_geom[lev];
2073 const int dir =
m_face.coordDir();
2078 const bool fitted_terrain =
2081 const bool use_spatial_indices =
2083 if (!use_spatial_indices) {
2086 "Region averaging requires a reference-index field.");
2088 const int wall_normal_ref = use_spatial_indices ? 0 :
m_k_indx[lev]->min(0);
2091 Real d_fact_new, d_fact_old;
2119 for (
int imf(0); imf < 5; ++imf) {
2123 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2125 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2126 if (imf < 3 && imf == dir) {
2131 const int normal_face_offset =
2132 (!
m_face.isLow() && imf < 3 && imf == dir) ? 1 : 0;
2135 if (!fields[imf])
continue;
2138 #pragma omp parallel if (Gpu::notInLaunchRegion())
2140 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
2141 Box pbx = mfi.growntilebox(ng_fill);
2144 if (mfi.validbox().smallEnd(dir) != sm_index ||
2145 pbx.smallEnd(dir) != sm_index) {
2149 if (mfi.validbox().bigEnd(dir) != sm_index ||
2150 pbx.bigEnd(dir) != sm_index) {
2155 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2157 auto mf_arr = (
m_rotate && imf != 2) ? rot_fields[imf]->const_array(mfi) :
2158 fields[imf]->const_array(mfi);
2159 auto ma_arr = averages[imf]->array(mfi);
2162 const auto plo = geom.ProbLoArray();
2163 const auto dx = geom.CellSizeArray();
2164 const auto dxInv = geom.InvCellSizeArray();
2165 const auto z_phys_arr = z_phys->const_array(mfi);
2166 auto x_pos_arr = x_pos->array(mfi);
2167 auto y_pos_arr = y_pos->array(mfi);
2168 auto z_pos_arr = z_pos->array(mfi);
2169 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2171 ma_arr(i,j,k) *= d_fact_old;
2174 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2175 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2176 for (
int li(-d_radius); li <= (d_radius); ++li) {
2178 Real xp = x_pos_arr(i+li,j+lj,k);
2179 Real yp = y_pos_arr(i+li,j+lj,k);
2180 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2182 Real val = denom * interp * d_fact_new;
2183 ma_arr(i,j,k) += val;
2189 auto k_arr = use_spatial_indices
2190 ? k_indx->const_array(mfi) : Array4<const int>{};
2191 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2192 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2193 const Box k_box = use_spatial_indices
2194 ? k_indx->fabbox(mfi.index()) : Box{};
2195 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2197 const int ki = use_spatial_indices
2198 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2199 const int kj = use_spatial_indices
2200 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2201 const int kk = use_spatial_indices
2202 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2203 const int ref = (use_spatial_indices
2204 ? k_arr(ki,kj,kk) : wall_normal_ref) + normal_face_offset;
2205 int mi = i_arr ? i_arr(ki,kj,k) : i;
2206 int mj = j_arr ? j_arr(ki,kj,k) : j;
2210 }
else if (dir == 1) {
2216 ma_arr(i,j,k) *= d_fact_old;
2217 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2218 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2219 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2220 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
2221 ma_arr(i,j,k) += val;
2247 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2249 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2255 #pragma omp parallel if (Gpu::notInLaunchRegion())
2257 for (MFIter mfi(*fields[4],
TileNoZ()); mfi.isValid(); ++mfi) {
2258 Box pbx = mfi.growntilebox(ng_fill);
2261 if (mfi.validbox().smallEnd(dir) != sm_index ||
2262 pbx.smallEnd(dir) != sm_index) {
2266 if (mfi.validbox().bigEnd(dir) != sm_index ||
2267 pbx.bigEnd(dir) != sm_index) {
2272 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2274 const Array4<Real const>& T_mf_arr = fields[3]->const_array(mfi);
2275 const Array4<Real const>& qv_mf_arr = (fields[4])? fields[4]->const_array(mfi) : Array4<const Real>{};
2276 const Array4<Real const>& qr_mf_arr = (fields[5])? fields[5]->const_array(mfi) : Array4<const Real>{};
2277 auto ma_arr = averages[iavg]->array(mfi);
2280 const auto plo = geom.ProbLoArray();
2281 const auto dx = geom.CellSizeArray();
2282 const auto dxInv = geom.InvCellSizeArray();
2283 const auto z_phys_arr = z_phys->const_array(mfi);
2284 auto x_pos_arr = x_pos->array(mfi);
2285 auto y_pos_arr = y_pos->array(mfi);
2286 auto z_pos_arr = z_pos->array(mfi);
2287 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2289 ma_arr(i,j,k) *= d_fact_old;
2292 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2293 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2294 for (
int li(-d_radius); li <= (d_radius); ++li) {
2297 Real xp = x_pos_arr(i+li,j+lj,k);
2298 Real yp = y_pos_arr(i+li,j+lj,k);
2299 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2307 &qr_interp, qr_mf_arr, z_phys_arr, plo,
dxInv, 1);
2313 const Real val = denom * mag * d_fact_new;
2314 ma_arr(i,j,k) += val;
2320 auto k_arr = use_spatial_indices
2321 ? k_indx->const_array(mfi) : Array4<const int>{};
2322 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2323 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2324 const Box k_box = use_spatial_indices
2325 ? k_indx->fabbox(mfi.index()) : Box{};
2326 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2328 const int ki = use_spatial_indices
2329 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2330 const int kj = use_spatial_indices
2331 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2332 const int kk = use_spatial_indices
2333 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2334 const int ref = use_spatial_indices
2335 ? k_arr(ki,kj,kk) : wall_normal_ref;
2336 int mi = i_arr ? i_arr(ki,kj,k) : i;
2337 int mj = j_arr ? j_arr(ki,kj,k) : j;
2341 }
else if (dir == 1) {
2347 ma_arr(i,j,k) *= d_fact_old;
2348 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2349 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2350 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2354 vfac =
one +
epsv*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
2358 const Real mag = T_mf_arr(li,lj,lk) *
vfac;
2359 const Real val = denom * mag * d_fact_new;
2360 ma_arr(i,j,k) += val;
2380 IntVect
ng = averages[iavg]->nGrowVect();
2381 MultiFab::Copy(*(averages[iavg]),*(averages[3]),0,0,1,
ng);
2392 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2394 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2397 const int imf_cc = 3;
2399 const int iavg =
m_navg - 3;
2400 const int iavg_xz =
m_navg - 2;
2401 const int iavg_yz =
m_navg - 1;
2406 #pragma omp parallel if (Gpu::notInLaunchRegion())
2408 for (MFIter mfi(*fields[imf_cc],
TileNoZ()); mfi.isValid(); ++mfi) {
2409 Box pbx = mfi.growntilebox(ng_fill);
2412 if (mfi.validbox().smallEnd(dir) != sm_index ||
2413 pbx.smallEnd(dir) != sm_index) {
2417 if (mfi.validbox().bigEnd(dir) != sm_index ||
2418 pbx.bigEnd(dir) != sm_index) {
2423 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2425 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
2426 fields[imf ]->const_array(mfi);
2427 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
2428 fields[imf+1]->const_array(mfi);
2429 auto w_mf_arr = fields[imf+2]->const_array(mfi);
2430 auto ma_arr = averages[iavg]->array(mfi);
2431 auto ma_xz_arr = averages[iavg_xz]->array(mfi);
2432 auto ma_yz_arr = averages[iavg_yz]->array(mfi);
2436 const auto plo = geom.ProbLoArray();
2437 const auto dx = geom.CellSizeArray();
2438 const auto dxInv = geom.InvCellSizeArray();
2439 const auto z_phys_arr = z_phys->const_array(mfi);
2440 auto x_pos_arr = x_pos->array(mfi);
2441 auto y_pos_arr = y_pos->array(mfi);
2442 auto z_pos_arr = z_pos->array(mfi);
2443 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2445 ma_arr(i,j,k) *= d_fact_old;
2448 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2449 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2450 for (
int li(-d_radius); li <= (d_radius); ++li) {
2453 Real xp = x_pos_arr(i+li,j+lj,k);
2454 Real yp = y_pos_arr(i+li,j+lj,k);
2455 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2458 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
2459 Real val = denom * mag * d_fact_new;
2460 ma_arr(i,j,k) += val;
2466 auto k_arr = use_spatial_indices
2467 ? k_indx->const_array(mfi) : Array4<const int>{};
2468 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2469 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2470 const Box k_box = use_spatial_indices
2471 ? k_indx->fabbox(mfi.index()) : Box{};
2472 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2474 const int ki = use_spatial_indices
2475 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2476 const int kj = use_spatial_indices
2477 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2478 const int kk = use_spatial_indices
2479 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2480 const int ref = use_spatial_indices
2481 ? k_arr(ki,kj,kk) : wall_normal_ref;
2482 int mi = i_arr ? i_arr(ki,kj,k) : i;
2483 int mj = j_arr ? j_arr(ki,kj,k) : j;
2487 }
else if (dir == 1) {
2493 ma_arr(i,j,k) *= d_fact_old;
2496 ma_xz_arr(i,j,k) *= d_fact_old;
2497 ma_yz_arr(i,j,k) *= d_fact_old;
2499 ma_xz_arr(i,j,k) = 0.0;
2500 ma_yz_arr(i,j,k) = 0.0;
2502 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2503 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2504 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2505 const Real u_val =
myhalf * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
2506 const Real v_val =
myhalf * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
2507 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
2508 Real val = denom * mag * d_fact_new;
2509 ma_arr(i,j,k) += val;
2513 const Real w_val =
myhalf * (w_mf_arr(li,lj,lk) + w_mf_arr(li,lj,lk+1));
2514 const Real val_xz = std::sqrt(u_val*u_val + w_val*w_val + Vsg*Vsg);
2515 const Real val_yz = std::sqrt(v_val*v_val + w_val*w_val + Vsg*Vsg);
2517 ma_xz_arr(i,j,k) += denom * val_xz * d_fact_new;
2518 ma_yz_arr(i,j,k) += denom * val_yz * d_fact_new;
2546 bool not_per_x = !(geom.periodicity().isPeriodic(0));
2547 bool not_per_y = !(geom.periodicity().isPeriodic(1));
2548 const bool per_x = geom.periodicity().isPeriodic(0);
2549 const bool per_y = geom.periodicity().isPeriodic(1);
2550 const bool per_z = geom.periodicity().isPeriodic(2);
2551 Box cc_bnd_bx = (
m_fields[lev][3]->boxArray()).minimalBox();
2552 Box domain = geom.Domain();
2554 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
2555 for (
int iavg(0); iavg <
m_navg; ++iavg) {
2556 IntVect
ng = averages[iavg]->nGrowVect();
2567 int imf = min(iavg,3);
2572 Box bnd_bx =
m_fields[lev][imf]->boxArray().minimalBox();
2577 Box dom_bx = convert(domain, fields[imf]->boxArray().ixType());
2581 sm_index = dom_bx.smallEnd(dir);
2583 sm_index = dom_bx.bigEnd(dir);
2586 #pragma omp parallel if (Gpu::notInLaunchRegion())
2588 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
2589 Box vbx = mfi.validbox();
2590 Box pbx = mfi.tilebox();
2591 Box gpbx = mfi.growntilebox(
ng);
2593 if (dom_bx.contains(gpbx)) {
2598 if (vbx.smallEnd(dir) != sm_index ||
2599 pbx.smallEnd(dir) != sm_index) {
2602 gpbx.setBig(dir, sm_index);
2604 if (vbx.bigEnd(dir) != sm_index ||
2605 pbx.bigEnd(dir) != sm_index) {
2608 gpbx.setSmall(dir, sm_index);
2611 auto ma_arr = averages[iavg]->array(mfi);
2614 int j_lo = dom_bx.smallEnd(1);
int j_hi = dom_bx.bigEnd(1);
2615 int k_lo = dom_bx.smallEnd(2);
int k_hi = dom_bx.bigEnd(2);
2617 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2622 if ((per_y && (j < j_lo || j > j_hi)) ||
2623 (per_z && (k < k_lo || k > k_hi))) {
2628 lj = j < j_lo ? j_lo : j;
2629 lj = lj > j_hi ? j_hi : lj;
2630 lk = k < k_lo ? k_lo : k;
2631 lk = lk > k_hi ? k_hi : lk;
2633 ma_arr(i,j,k) = ma_arr(sm_index,lj,lk);
2635 }
else if (dir == 1) {
2636 int i_lo = dom_bx.smallEnd(0);
int i_hi = dom_bx.bigEnd(0);
2637 int k_lo = dom_bx.smallEnd(2);
int k_hi = dom_bx.bigEnd(2);
2638 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2643 if ((per_x && (i < i_lo || i > i_hi)) ||
2644 (per_z && (k < k_lo || k > k_hi))) {
2649 li = i < i_lo ? i_lo : i;
2650 li = li > i_hi ? i_hi : li;
2651 lk = k < k_lo ? k_lo : k;
2652 lk = lk > k_hi ? k_hi : lk;
2654 ma_arr(i,j,k) = ma_arr(li,sm_index,lk);
2657 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
2658 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
2659 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2664 if ((per_x && (i < i_lo || i > i_hi)) ||
2665 (per_y && (j < j_lo || j > j_hi))) {
2670 li = i < i_lo ? i_lo : i;
2671 li = li > i_hi ? i_hi : li;
2672 lj = j < j_lo ? j_lo : j;
2673 lj = lj > j_hi ? j_hi : lj;
2675 ma_arr(i,j,k) = ma_arr(li,lj,sm_index);
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtCellCenter(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:190
int m_radius
Definition: ERF_MOSTAverage.H:577
void fill_planar_boundary(const int &lev, amrex::MultiFab &mf)
Definition: ERF_MOSTAverage.cpp:2038
int m_ncell_region
Definition: ERF_MOSTAverage.H:578
void extrap_ghost_cells(const int &lev, const int &iavg, const amrex::IntVect &ng_fill)
Definition: ERF_MOSTAverage.cpp:1965
amrex::IntVect get_ng_fill(const int &lev) const
Definition: ERF_MOSTAverage.cpp:472
@ ng
Definition: ERF_Morrison.H:50