Fill averages for the point or region policy.
Function to compute average over local region.
1304 const auto & geom =
m_geom[lev];
1315 int klo =
m_geom[lev].Domain().smallEnd(2);
1318 Real d_fact_new, d_fact_old;
1338 for (
int imf(0); imf < 4; ++imf) {
1341 if (!fields[imf])
continue;
1344 #pragma omp parallel if (Gpu::notInLaunchRegion())
1346 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1347 Box pbx = mfi.tilebox();
1349 if (pbx.smallEnd(2) != klo) {
continue; }
1352 pbx.makeSlab(2,klo);
1354 auto mf_arr = (
m_rotate) ? rot_fields[imf]->const_array(mfi) :
1355 fields[imf]->const_array(mfi);
1356 auto ma_arr = averages[imf]->array(mfi);
1359 const auto plo = geom.ProbLoArray();
1360 const auto dx = geom.CellSizeArray();
1361 const auto dxInv = geom.InvCellSizeArray();
1362 const auto z_phys_arr = z_phys->const_array(mfi);
1363 auto x_pos_arr = x_pos->array(mfi);
1364 auto y_pos_arr = y_pos->array(mfi);
1365 auto z_pos_arr = z_pos->array(mfi);
1366 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1368 ma_arr(i,j,0) *= d_fact_old;
1371 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1372 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1373 for (
int li(-d_radius); li <= (d_radius); ++li) {
1375 Real xp = x_pos_arr(i+li,j+lj,0);
1376 Real yp = y_pos_arr(i+li,j+lj,0);
1377 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1379 Real val = denom * interp * d_fact_new;
1380 ma_arr(i,j,0) += val;
1386 auto k_arr = k_indx->const_array(mfi);
1387 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1388 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1389 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1391 ma_arr(i,j,0) *= d_fact_old;
1393 int mk = k_arr(i,j,0);
1394 int mj = j_arr ? j_arr(i,j,0) : j;
1395 int mi = i_arr ? i_arr(i,j,0) : i;
1396 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1397 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1398 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1399 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
1400 ma_arr(i,j,0) += val;
1410 averages[imf]->FillBoundary(geom.periodicity());
1424 #pragma omp parallel if (Gpu::notInLaunchRegion())
1426 for (MFIter mfi(*fields[3],
TileNoZ()); mfi.isValid(); ++mfi) {
1427 Box pbx = mfi.tilebox();
1429 if (pbx.smallEnd(2) != klo) {
continue; }
1431 pbx.makeSlab(2,klo);
1433 const Array4<Real const>& T_mf_arr = fields[2]->const_array(mfi);
1434 const Array4<Real const>& qv_mf_arr = fields[3]->const_array(mfi);
1435 const Array4<Real const>& qr_mf_arr = (fields[4]) ? fields[4]->const_array(mfi) :
1436 Array4<const Real> {};
1437 auto ma_arr = averages[iavg]->array(mfi);
1440 const auto plo = geom.ProbLoArray();
1441 const auto dx = geom.CellSizeArray();
1442 const auto dxInv = geom.InvCellSizeArray();
1443 const auto z_phys_arr = z_phys->const_array(mfi);
1444 auto x_pos_arr = x_pos->array(mfi);
1445 auto y_pos_arr = y_pos->array(mfi);
1446 auto z_pos_arr = z_pos->array(mfi);
1447 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1449 ma_arr(i,j,0) *= d_fact_old;
1452 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1453 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1454 for (
int li(-d_radius); li <= (d_radius); ++li) {
1457 Real xp = x_pos_arr(i+li,j+lj,0);
1458 Real yp = y_pos_arr(i+li,j+lj,0);
1459 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1467 &qr_interp, qr_mf_arr, z_phys_arr, plo,
dxInv, 1);
1473 const Real val = denom * mag * d_fact_new;
1474 ma_arr(i,j,0) += val;
1480 auto k_arr = k_indx->const_array(mfi);
1481 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1482 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1483 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1485 ma_arr(i,j,0) *= d_fact_old;
1487 int mk = k_arr(i,j,0);
1488 int mj = j_arr ? j_arr(i,j,0) : j;
1489 int mi = i_arr ? i_arr(i,j,0) : i;
1490 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1491 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1492 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1496 vfac =
one +
epsv*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
1500 const Real mag = T_mf_arr(li,lj,lk) *
vfac;
1501 const Real val = denom * mag * d_fact_new;
1502 ma_arr(i,j,0) += val;
1512 averages[iavg]->FillBoundary(geom.periodicity());
1518 IntVect
ng = averages[iavg]->nGrowVect();
1519 MultiFab::Copy(*(averages[iavg]),*(averages[2]),0,0,1,
ng);
1535 #pragma omp parallel if (Gpu::notInLaunchRegion())
1537 for (MFIter mfi(*fields[imf_cc],
TileNoZ()); mfi.isValid(); ++mfi) {
1538 Box pbx = mfi.tilebox();
1540 if (pbx.smallEnd(2) != klo) {
continue; }
1542 pbx.makeSlab(2,klo);
1544 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
1545 fields[imf ]->const_array(mfi);
1546 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
1547 fields[imf+1]->const_array(mfi);
1548 auto ma_arr = averages[iavg]->array(mfi);
1551 const auto plo = geom.ProbLoArray();
1552 const auto dx = geom.CellSizeArray();
1553 const auto dxInv = geom.InvCellSizeArray();
1554 const auto z_phys_arr = z_phys->const_array(mfi);
1555 auto x_pos_arr = x_pos->array(mfi);
1556 auto y_pos_arr = y_pos->array(mfi);
1557 auto z_pos_arr = z_pos->array(mfi);
1558 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1560 ma_arr(i,j,0) *= d_fact_old;
1563 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1564 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1565 for (
int li(-d_radius); li <= (d_radius); ++li) {
1568 Real xp = x_pos_arr(i+li,j+lj,0);
1569 Real yp = y_pos_arr(i+li,j+lj,0);
1570 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1573 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
1574 Real val = denom * mag * d_fact_new;
1575 ma_arr(i,j,0) += val;
1581 auto k_arr = k_indx->const_array(mfi);
1582 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1583 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1584 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1586 ma_arr(i,j,0) *= d_fact_old;
1588 int mk = k_arr(i,j,0);
1589 int mj = j_arr ? j_arr(i,j,0) : j;
1590 int mi = i_arr ? i_arr(i,j,0) : i;
1591 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1592 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1593 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1594 const Real u_val =
myhalf * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
1595 const Real v_val =
myhalf * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
1596 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
1597 Real val = denom * mag * d_fact_new;
1598 ma_arr(i,j,0) += val;
1608 averages[iavg]->FillBoundary(geom.periodicity());
1618 bool not_per_x = !(geom.periodicity().isPeriodic(0));
1619 bool not_per_y = !(geom.periodicity().isPeriodic(1));
1620 Box cc_bnd_bx = (
m_fields[lev][2]->boxArray()).minimalBox();
1621 Box domain = geom.Domain();
1622 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
1623 for (
int iavg(0); iavg <
m_navg; ++iavg) {
1624 IntVect
ng = averages[iavg]->nGrowVect();
ng[2]=0;
1636 int imf = min(iavg,2);
1637 Box bnd_bx = (fields[imf]->boxArray()).minimalBox();
1639 #pragma omp parallel if (Gpu::notInLaunchRegion())
1641 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1642 Box gpbx = mfi.growntilebox(
ng);
1644 if (gpbx.smallEnd(2) != klo) {
continue; }
1646 gpbx.makeSlab(2,klo);
1648 if (bnd_bx.contains(gpbx))
continue;
1650 auto ma_arr = averages[iavg]->array(mfi);
1652 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
1653 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
1654 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1657 li = i < i_lo ? i_lo : i;
1658 li = li > i_hi ? i_hi : li;
1659 lj = j < j_lo ? j_lo : j;
1660 lj = lj > j_hi ? j_hi : lj;
1662 ma_arr(i,j,0) = ma_arr(li,lj,0);
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:179
int m_radius
Definition: ERF_MOSTAverage.H:436
int m_ncell_region
Definition: ERF_MOSTAverage.H:437
@ ng
Definition: ERF_Morrison.H:49