Fill averages for the point or region policy.
Function to compute average over local region.
1259 const auto & geom =
m_geom[lev];
1270 int klo =
m_geom[lev].Domain().smallEnd(2);
1273 Real d_fact_new, d_fact_old;
1293 for (
int imf(0); imf < 4; ++imf) {
1296 if (!fields[imf])
continue;
1299 #pragma omp parallel if (Gpu::notInLaunchRegion())
1301 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1302 Box pbx = mfi.tilebox();
1304 if (pbx.smallEnd(2) != klo) {
continue; }
1307 pbx.makeSlab(2,klo);
1309 auto mf_arr = (
m_rotate) ? rot_fields[imf]->const_array(mfi) :
1310 fields[imf]->const_array(mfi);
1311 auto ma_arr = averages[imf]->array(mfi);
1314 const auto plo = geom.ProbLoArray();
1315 const auto dx = geom.CellSizeArray();
1316 const auto dxInv = geom.InvCellSizeArray();
1317 const auto z_phys_arr = z_phys->const_array(mfi);
1318 auto x_pos_arr = x_pos->array(mfi);
1319 auto y_pos_arr = y_pos->array(mfi);
1320 auto z_pos_arr = z_pos->array(mfi);
1321 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1323 ma_arr(i,j,0) *= d_fact_old;
1326 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1327 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1328 for (
int li(-d_radius); li <= (d_radius); ++li) {
1330 Real xp = x_pos_arr(i+li,j+lj,0);
1331 Real yp = y_pos_arr(i+li,j+lj,0);
1332 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1334 Real val = denom * interp * d_fact_new;
1335 ma_arr(i,j,0) += val;
1341 auto k_arr = k_indx->const_array(mfi);
1342 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1343 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1344 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1346 ma_arr(i,j,0) *= d_fact_old;
1348 int mk = k_arr(i,j,0);
1349 int mj = j_arr ? j_arr(i,j,0) : j;
1350 int mi = i_arr ? i_arr(i,j,0) : i;
1351 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1352 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1353 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1354 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
1355 ma_arr(i,j,0) += val;
1365 averages[imf]->FillBoundary(geom.periodicity());
1379 #pragma omp parallel if (Gpu::notInLaunchRegion())
1381 for (MFIter mfi(*fields[3],
TileNoZ()); mfi.isValid(); ++mfi) {
1382 Box pbx = mfi.tilebox();
1384 if (pbx.smallEnd(2) != klo) {
continue; }
1386 pbx.makeSlab(2,klo);
1388 const Array4<Real const>& T_mf_arr = fields[2]->const_array(mfi);
1389 const Array4<Real const>& qv_mf_arr = fields[3]->const_array(mfi);
1390 const Array4<Real const>& qr_mf_arr = (fields[4]) ? fields[4]->const_array(mfi) :
1391 Array4<const Real> {};
1392 auto ma_arr = averages[iavg]->array(mfi);
1395 const auto plo = geom.ProbLoArray();
1396 const auto dx = geom.CellSizeArray();
1397 const auto dxInv = geom.InvCellSizeArray();
1398 const auto z_phys_arr = z_phys->const_array(mfi);
1399 auto x_pos_arr = x_pos->array(mfi);
1400 auto y_pos_arr = y_pos->array(mfi);
1401 auto z_pos_arr = z_pos->array(mfi);
1402 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1404 ma_arr(i,j,0) *= d_fact_old;
1407 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1408 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1409 for (
int li(-d_radius); li <= (d_radius); ++li) {
1412 Real xp = x_pos_arr(i+li,j+lj,0);
1413 Real yp = y_pos_arr(i+li,j+lj,0);
1414 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1422 &qr_interp, qr_mf_arr, z_phys_arr, plo,
dxInv, 1);
1428 const Real val = denom * mag * d_fact_new;
1429 ma_arr(i,j,0) += val;
1435 auto k_arr = k_indx->const_array(mfi);
1436 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1437 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1438 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1440 ma_arr(i,j,0) *= d_fact_old;
1442 int mk = k_arr(i,j,0);
1443 int mj = j_arr ? j_arr(i,j,0) : j;
1444 int mi = i_arr ? i_arr(i,j,0) : i;
1445 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1446 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1447 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1451 vfac =
one +
epsv*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
1455 const Real mag = T_mf_arr(li,lj,lk) *
vfac;
1456 const Real val = denom * mag * d_fact_new;
1457 ma_arr(i,j,0) += val;
1467 averages[iavg]->FillBoundary(geom.periodicity());
1473 IntVect
ng = averages[iavg]->nGrowVect();
1474 MultiFab::Copy(*(averages[iavg]),*(averages[2]),0,0,1,
ng);
1490 #pragma omp parallel if (Gpu::notInLaunchRegion())
1492 for (MFIter mfi(*fields[imf_cc],
TileNoZ()); mfi.isValid(); ++mfi) {
1493 Box pbx = mfi.tilebox();
1495 if (pbx.smallEnd(2) != klo) {
continue; }
1497 pbx.makeSlab(2,klo);
1499 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
1500 fields[imf ]->const_array(mfi);
1501 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
1502 fields[imf+1]->const_array(mfi);
1503 auto ma_arr = averages[iavg]->array(mfi);
1506 const auto plo = geom.ProbLoArray();
1507 const auto dx = geom.CellSizeArray();
1508 const auto dxInv = geom.InvCellSizeArray();
1509 const auto z_phys_arr = z_phys->const_array(mfi);
1510 auto x_pos_arr = x_pos->array(mfi);
1511 auto y_pos_arr = y_pos->array(mfi);
1512 auto z_pos_arr = z_pos->array(mfi);
1513 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1515 ma_arr(i,j,0) *= d_fact_old;
1518 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1519 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1520 for (
int li(-d_radius); li <= (d_radius); ++li) {
1523 Real xp = x_pos_arr(i+li,j+lj,0);
1524 Real yp = y_pos_arr(i+li,j+lj,0);
1525 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1528 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
1529 Real val = denom * mag * d_fact_new;
1530 ma_arr(i,j,0) += val;
1536 auto k_arr = k_indx->const_array(mfi);
1537 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1538 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1539 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1541 ma_arr(i,j,0) *= d_fact_old;
1543 int mk = k_arr(i,j,0);
1544 int mj = j_arr ? j_arr(i,j,0) : j;
1545 int mi = i_arr ? i_arr(i,j,0) : i;
1546 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1547 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1548 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1549 const Real u_val =
myhalf * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
1550 const Real v_val =
myhalf * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
1551 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
1552 Real val = denom * mag * d_fact_new;
1553 ma_arr(i,j,0) += val;
1563 averages[iavg]->FillBoundary(geom.periodicity());
1573 bool not_per_x = !(geom.periodicity().isPeriodic(0));
1574 bool not_per_y = !(geom.periodicity().isPeriodic(1));
1575 Box cc_bnd_bx = (
m_fields[lev][2]->boxArray()).minimalBox();
1576 Box domain = geom.Domain();
1577 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
1578 for (
int iavg(0); iavg <
m_navg; ++iavg) {
1579 IntVect
ng = averages[iavg]->nGrowVect();
ng[2]=0;
1591 int imf = min(iavg,2);
1592 Box bnd_bx = (fields[imf]->boxArray()).minimalBox();
1594 #pragma omp parallel if (Gpu::notInLaunchRegion())
1596 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1597 Box gpbx = mfi.growntilebox(
ng);
1599 if (gpbx.smallEnd(2) != klo) {
continue; }
1601 gpbx.makeSlab(2,klo);
1603 if (bnd_bx.contains(gpbx))
continue;
1605 auto ma_arr = averages[iavg]->array(mfi);
1607 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
1608 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
1609 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1612 li = i < i_lo ? i_lo : i;
1613 li = li > i_hi ? i_hi : li;
1614 lj = j < j_lo ? j_lo : j;
1615 lj = lj > j_hi ? j_hi : lj;
1617 ma_arr(i,j,0) = ma_arr(li,lj,0);
AMREX_FORCE_INLINE AMREX_GPU_DEVICE 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:55
int m_radius
Definition: ERF_MOSTAverage.H:365
int m_ncell_region
Definition: ERF_MOSTAverage.H:366
@ ng
Definition: ERF_Morrison.H:49