Fill averages for the point or region policy.
Function to compute average over local region.
2093 const auto & geom =
m_geom[lev];
2104 const int dir =
m_face.coordDir();
2109 const bool fitted_terrain =
2112 const bool use_spatial_indices =
2114 if (!use_spatial_indices) {
2117 "Region averaging requires a reference-index field.");
2119 const int wall_normal_ref = use_spatial_indices ? 0 :
m_k_indx[lev]->min(0);
2122 Real d_fact_new, d_fact_old;
2150 for (
int imf(0); imf < 5; ++imf) {
2154 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2156 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2157 if (imf < 3 && imf == dir) {
2162 const int normal_face_offset =
2163 (!
m_face.isLow() && imf < 3 && imf == dir) ? 1 : 0;
2166 if (!fields[imf])
continue;
2169 #pragma omp parallel if (Gpu::notInLaunchRegion())
2171 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
2172 Box pbx = mfi.growntilebox(ng_fill);
2175 if (mfi.validbox().smallEnd(dir) != sm_index ||
2176 pbx.smallEnd(dir) != sm_index) {
2180 if (mfi.validbox().bigEnd(dir) != sm_index ||
2181 pbx.bigEnd(dir) != sm_index) {
2186 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2188 auto mf_arr = (
m_rotate && imf != 2) ? rot_fields[imf]->const_array(mfi) :
2189 fields[imf]->const_array(mfi);
2190 auto ma_arr = averages[imf]->array(mfi);
2193 const auto plo = geom.ProbLoArray();
2194 const auto dx = geom.CellSizeArray();
2195 const auto dxInv = geom.InvCellSizeArray();
2196 const auto z_phys_arr = z_phys->const_array(mfi);
2197 auto x_pos_arr = x_pos->array(mfi);
2198 auto y_pos_arr = y_pos->array(mfi);
2199 auto z_pos_arr = z_pos->array(mfi);
2200 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2202 ma_arr(i,j,k) *= d_fact_old;
2205 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2206 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2207 for (
int li(-d_radius); li <= (d_radius); ++li) {
2209 Real xp = x_pos_arr(i+li,j+lj,k);
2210 Real yp = y_pos_arr(i+li,j+lj,k);
2211 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2213 Real val = denom * interp * d_fact_new;
2214 ma_arr(i,j,k) += val;
2220 auto k_arr = use_spatial_indices
2221 ? k_indx->const_array(mfi) : Array4<const int>{};
2222 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2223 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2224 const Box k_box = use_spatial_indices
2225 ? k_indx->fabbox(mfi.index()) : Box{};
2226 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2228 const int ki = use_spatial_indices
2229 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2230 const int kj = use_spatial_indices
2231 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2232 const int kk = use_spatial_indices
2233 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2234 const int ref = (use_spatial_indices
2235 ? k_arr(ki,kj,kk) : wall_normal_ref) + normal_face_offset;
2236 int mi = i_arr ? i_arr(ki,kj,k) : i;
2237 int mj = j_arr ? j_arr(ki,kj,k) : j;
2241 }
else if (dir == 1) {
2247 ma_arr(i,j,k) *= d_fact_old;
2248 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2249 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2250 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2251 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
2252 ma_arr(i,j,k) += val;
2278 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2280 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2286 #pragma omp parallel if (Gpu::notInLaunchRegion())
2288 for (MFIter mfi(*fields[4],
TileNoZ()); mfi.isValid(); ++mfi) {
2289 Box pbx = mfi.growntilebox(ng_fill);
2292 if (mfi.validbox().smallEnd(dir) != sm_index ||
2293 pbx.smallEnd(dir) != sm_index) {
2297 if (mfi.validbox().bigEnd(dir) != sm_index ||
2298 pbx.bigEnd(dir) != sm_index) {
2303 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2305 const Array4<Real const>& T_mf_arr = fields[3]->const_array(mfi);
2306 const Array4<Real const>& qv_mf_arr = (fields[4])? fields[4]->const_array(mfi) : Array4<const Real>{};
2307 const Array4<Real const>& qr_mf_arr = (fields[5])? fields[5]->const_array(mfi) : Array4<const Real>{};
2308 auto ma_arr = averages[iavg]->array(mfi);
2311 const auto plo = geom.ProbLoArray();
2312 const auto dx = geom.CellSizeArray();
2313 const auto dxInv = geom.InvCellSizeArray();
2314 const auto z_phys_arr = z_phys->const_array(mfi);
2315 auto x_pos_arr = x_pos->array(mfi);
2316 auto y_pos_arr = y_pos->array(mfi);
2317 auto z_pos_arr = z_pos->array(mfi);
2318 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2320 ma_arr(i,j,k) *= d_fact_old;
2323 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2324 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2325 for (
int li(-d_radius); li <= (d_radius); ++li) {
2328 Real xp = x_pos_arr(i+li,j+lj,k);
2329 Real yp = y_pos_arr(i+li,j+lj,k);
2330 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2338 &qr_interp, qr_mf_arr, z_phys_arr, plo,
dxInv, 1);
2344 const Real val = denom * mag * d_fact_new;
2345 ma_arr(i,j,k) += val;
2351 auto k_arr = use_spatial_indices
2352 ? k_indx->const_array(mfi) : Array4<const int>{};
2353 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2354 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2355 const Box k_box = use_spatial_indices
2356 ? k_indx->fabbox(mfi.index()) : Box{};
2357 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2359 const int ki = use_spatial_indices
2360 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2361 const int kj = use_spatial_indices
2362 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2363 const int kk = use_spatial_indices
2364 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2365 const int ref = use_spatial_indices
2366 ? k_arr(ki,kj,kk) : wall_normal_ref;
2367 int mi = i_arr ? i_arr(ki,kj,k) : i;
2368 int mj = j_arr ? j_arr(ki,kj,k) : j;
2372 }
else if (dir == 1) {
2378 ma_arr(i,j,k) *= d_fact_old;
2379 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2380 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2381 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2385 vfac =
one +
epsv*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
2389 const Real mag = T_mf_arr(li,lj,lk) *
vfac;
2390 const Real val = denom * mag * d_fact_new;
2391 ma_arr(i,j,k) += val;
2411 IntVect
ng = averages[iavg]->nGrowVect();
2412 MultiFab::Copy(*(averages[iavg]),*(averages[3]),0,0,1,
ng);
2423 sm_index =
m_geom[lev].Domain().smallEnd(dir);
2425 sm_index =
m_geom[lev].Domain().bigEnd(dir);
2428 const int imf_cc = 3;
2430 const int iavg =
m_navg - 3;
2431 const int iavg_xz =
m_navg - 2;
2432 const int iavg_yz =
m_navg - 1;
2437 #pragma omp parallel if (Gpu::notInLaunchRegion())
2439 for (MFIter mfi(*fields[imf_cc],
TileNoZ()); mfi.isValid(); ++mfi) {
2440 Box pbx = mfi.growntilebox(ng_fill);
2443 if (mfi.validbox().smallEnd(dir) != sm_index ||
2444 pbx.smallEnd(dir) != sm_index) {
2448 if (mfi.validbox().bigEnd(dir) != sm_index ||
2449 pbx.bigEnd(dir) != sm_index) {
2454 pbx.setSmall(dir, sm_index); pbx.setBig(dir, sm_index);
2456 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
2457 fields[imf ]->const_array(mfi);
2458 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
2459 fields[imf+1]->const_array(mfi);
2460 auto w_mf_arr = fields[imf+2]->const_array(mfi);
2461 auto ma_arr = averages[iavg]->array(mfi);
2462 auto ma_xz_arr = averages[iavg_xz]->array(mfi);
2463 auto ma_yz_arr = averages[iavg_yz]->array(mfi);
2467 const auto plo = geom.ProbLoArray();
2468 const auto dx = geom.CellSizeArray();
2469 const auto dxInv = geom.InvCellSizeArray();
2470 const auto z_phys_arr = z_phys->const_array(mfi);
2471 auto x_pos_arr = x_pos->array(mfi);
2472 auto y_pos_arr = y_pos->array(mfi);
2473 auto z_pos_arr = z_pos->array(mfi);
2474 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2476 ma_arr(i,j,k) *= d_fact_old;
2479 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
2480 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
2481 for (
int li(-d_radius); li <= (d_radius); ++li) {
2484 Real xp = x_pos_arr(i+li,j+lj,k);
2485 Real yp = y_pos_arr(i+li,j+lj,k);
2486 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*
dx[2];
2489 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
2490 Real val = denom * mag * d_fact_new;
2491 ma_arr(i,j,k) += val;
2497 auto k_arr = use_spatial_indices
2498 ? k_indx->const_array(mfi) : Array4<const int>{};
2499 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
2500 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
2501 const Box k_box = use_spatial_indices
2502 ? k_indx->fabbox(mfi.index()) : Box{};
2503 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2505 const int ki = use_spatial_indices
2506 ? max(k_box.smallEnd(0), min(k_box.bigEnd(0), i)) : i;
2507 const int kj = use_spatial_indices
2508 ? max(k_box.smallEnd(1), min(k_box.bigEnd(1), j)) : j;
2509 const int kk = use_spatial_indices
2510 ? max(k_box.smallEnd(2), min(k_box.bigEnd(2), k)) : k;
2511 const int ref = use_spatial_indices
2512 ? k_arr(ki,kj,kk) : wall_normal_ref;
2513 int mi = i_arr ? i_arr(ki,kj,k) : i;
2514 int mj = j_arr ? j_arr(ki,kj,k) : j;
2518 }
else if (dir == 1) {
2524 ma_arr(i,j,k) *= d_fact_old;
2527 ma_xz_arr(i,j,k) *= d_fact_old;
2528 ma_yz_arr(i,j,k) *= d_fact_old;
2530 ma_xz_arr(i,j,k) = 0.0;
2531 ma_yz_arr(i,j,k) = 0.0;
2533 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
2534 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
2535 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
2536 const Real u_val =
myhalf * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
2537 const Real v_val =
myhalf * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
2538 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
2539 Real val = denom * mag * d_fact_new;
2540 ma_arr(i,j,k) += val;
2544 const Real w_val =
myhalf * (w_mf_arr(li,lj,lk) + w_mf_arr(li,lj,lk+1));
2545 const Real val_xz = std::sqrt(u_val*u_val + w_val*w_val + Vsg*Vsg);
2546 const Real val_yz = std::sqrt(v_val*v_val + w_val*w_val + Vsg*Vsg);
2548 ma_xz_arr(i,j,k) += denom * val_xz * d_fact_new;
2549 ma_yz_arr(i,j,k) += denom * val_yz * d_fact_new;
2577 bool not_per_x = !(geom.periodicity().isPeriodic(0));
2578 bool not_per_y = !(geom.periodicity().isPeriodic(1));
2579 const bool per_x = geom.periodicity().isPeriodic(0);
2580 const bool per_y = geom.periodicity().isPeriodic(1);
2581 const bool per_z = geom.periodicity().isPeriodic(2);
2582 Box cc_bnd_bx = (
m_fields[lev][3]->boxArray()).minimalBox();
2583 Box domain = geom.Domain();
2585 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
2586 for (
int iavg(0); iavg <
m_navg; ++iavg) {
2587 IntVect
ng = averages[iavg]->nGrowVect();
2598 int imf = min(iavg,3);
2603 Box bnd_bx =
m_fields[lev][imf]->boxArray().minimalBox();
2608 Box dom_bx = convert(domain, fields[imf]->boxArray().ixType());
2612 sm_index = dom_bx.smallEnd(dir);
2614 sm_index = dom_bx.bigEnd(dir);
2617 #pragma omp parallel if (Gpu::notInLaunchRegion())
2619 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
2620 Box vbx = mfi.validbox();
2621 Box pbx = mfi.tilebox();
2622 Box gpbx = mfi.growntilebox(
ng);
2624 if (dom_bx.contains(gpbx)) {
2629 if (vbx.smallEnd(dir) != sm_index ||
2630 pbx.smallEnd(dir) != sm_index) {
2633 gpbx.setBig(dir, sm_index);
2635 if (vbx.bigEnd(dir) != sm_index ||
2636 pbx.bigEnd(dir) != sm_index) {
2639 gpbx.setSmall(dir, sm_index);
2642 auto ma_arr = averages[iavg]->array(mfi);
2645 int j_lo = dom_bx.smallEnd(1);
int j_hi = dom_bx.bigEnd(1);
2646 int k_lo = dom_bx.smallEnd(2);
int k_hi = dom_bx.bigEnd(2);
2648 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2653 if ((per_y && (j < j_lo || j > j_hi)) ||
2654 (per_z && (k < k_lo || k > k_hi))) {
2659 lj = j < j_lo ? j_lo : j;
2660 lj = lj > j_hi ? j_hi : lj;
2661 lk = k < k_lo ? k_lo : k;
2662 lk = lk > k_hi ? k_hi : lk;
2664 ma_arr(i,j,k) = ma_arr(sm_index,lj,lk);
2666 }
else if (dir == 1) {
2667 int i_lo = dom_bx.smallEnd(0);
int i_hi = dom_bx.bigEnd(0);
2668 int k_lo = dom_bx.smallEnd(2);
int k_hi = dom_bx.bigEnd(2);
2669 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2674 if ((per_x && (i < i_lo || i > i_hi)) ||
2675 (per_z && (k < k_lo || k > k_hi))) {
2680 li = i < i_lo ? i_lo : i;
2681 li = li > i_hi ? i_hi : li;
2682 lk = k < k_lo ? k_lo : k;
2683 lk = lk > k_hi ? k_hi : lk;
2685 ma_arr(i,j,k) = ma_arr(li,sm_index,lk);
2688 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
2689 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
2690 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
2695 if ((per_x && (i < i_lo || i > i_hi)) ||
2696 (per_y && (j < j_lo || j > j_hi))) {
2701 li = i < i_lo ? i_lo : i;
2702 li = li > i_hi ? i_hi : li;
2703 lj = j < j_lo ? j_lo : j;
2704 lj = lj > j_hi ? j_hi : lj;
2706 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:201
int m_radius
Definition: ERF_MOSTAverage.H:588
void fill_planar_boundary(const int &lev, amrex::MultiFab &mf)
Definition: ERF_MOSTAverage.cpp:2069
int m_ncell_region
Definition: ERF_MOSTAverage.H:589
void extrap_ghost_cells(const int &lev, const int &iavg, const amrex::IntVect &ng_fill)
Definition: ERF_MOSTAverage.cpp:1996
amrex::IntVect get_ng_fill(const int &lev) const
Definition: ERF_MOSTAverage.cpp:473
@ ng
Definition: ERF_Morrison.H:51