Function to compute average over local region.
1234 const auto & geom =
m_geom[lev];
1245 int klo =
m_geom[lev].Domain().smallEnd(2);
1248 Real d_fact_new, d_fact_old;
1268 for (
int imf(0); imf < 4; ++imf) {
1271 if (!fields[imf])
continue;
1274 #pragma omp parallel if (Gpu::notInLaunchRegion())
1276 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1277 Box pbx = mfi.tilebox();
1279 if (pbx.smallEnd(2) != klo) {
continue; }
1282 pbx.makeSlab(2,klo);
1284 auto mf_arr = (
m_rotate) ? rot_fields[imf]->const_array(mfi) :
1285 fields[imf]->const_array(mfi);
1286 auto ma_arr = averages[imf]->array(mfi);
1289 const auto plo = geom.ProbLoArray();
1290 const auto dx = geom.CellSizeArray();
1291 const auto dxInv = geom.InvCellSizeArray();
1292 const auto z_phys_arr = z_phys->const_array(mfi);
1293 auto x_pos_arr = x_pos->array(mfi);
1294 auto y_pos_arr = y_pos->array(mfi);
1295 auto z_pos_arr = z_pos->array(mfi);
1296 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1298 ma_arr(i,j,0) *= d_fact_old;
1301 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1302 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1303 for (
int li(-d_radius); li <= (d_radius); ++li) {
1305 Real xp = x_pos_arr(i+li,j+lj,0);
1306 Real yp = y_pos_arr(i+li,j+lj,0);
1307 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1309 Real val = denom * interp * d_fact_new;
1310 ma_arr(i,j,0) += val;
1316 auto k_arr = k_indx->const_array(mfi);
1317 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1318 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1319 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1321 ma_arr(i,j,0) *= d_fact_old;
1323 int mk = k_arr(i,j,0);
1324 int mj = j_arr ? j_arr(i,j,0) : j;
1325 int mi = i_arr ? i_arr(i,j,0) : i;
1326 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1327 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1328 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1329 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
1330 ma_arr(i,j,0) += val;
1340 averages[imf]->FillBoundary(geom.periodicity());
1354 #pragma omp parallel if (Gpu::notInLaunchRegion())
1356 for (MFIter mfi(*fields[3],
TileNoZ()); mfi.isValid(); ++mfi) {
1357 Box pbx = mfi.tilebox();
1359 if (pbx.smallEnd(2) != klo) {
continue; }
1361 pbx.makeSlab(2,klo);
1363 const Array4<Real const>& T_mf_arr = fields[2]->const_array(mfi);
1364 const Array4<Real const>& qv_mf_arr = fields[3]->const_array(mfi);
1365 const Array4<Real const>& qr_mf_arr = (fields[4]) ? fields[4]->const_array(mfi) :
1366 Array4<const Real> {};
1367 auto ma_arr = averages[iavg]->array(mfi);
1370 const auto plo = geom.ProbLoArray();
1371 const auto dx = geom.CellSizeArray();
1372 const auto dxInv = geom.InvCellSizeArray();
1373 const auto z_phys_arr = z_phys->const_array(mfi);
1374 auto x_pos_arr = x_pos->array(mfi);
1375 auto y_pos_arr = y_pos->array(mfi);
1376 auto z_pos_arr = z_pos->array(mfi);
1377 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1379 ma_arr(i,j,0) *= d_fact_old;
1382 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1383 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1384 for (
int li(-d_radius); li <= (d_radius); ++li) {
1387 Real xp = x_pos_arr(i+li,j+lj,0);
1388 Real yp = y_pos_arr(i+li,j+lj,0);
1389 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1397 &qr_interp, qr_mf_arr, z_phys_arr, plo,
dxInv, 1);
1403 const Real val = denom * mag * d_fact_new;
1404 ma_arr(i,j,0) += val;
1410 auto k_arr = k_indx->const_array(mfi);
1411 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1412 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1413 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1415 ma_arr(i,j,0) *= d_fact_old;
1417 int mk = k_arr(i,j,0);
1418 int mj = j_arr ? j_arr(i,j,0) : j;
1419 int mi = i_arr ? i_arr(i,j,0) : i;
1420 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1421 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1422 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1426 vfac =
one +
Real(0.61)*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
1430 const Real mag = T_mf_arr(li,lj,lk) *
vfac;
1431 const Real val = denom * mag * d_fact_new;
1432 ma_arr(i,j,0) += val;
1442 averages[iavg]->FillBoundary(geom.periodicity());
1448 IntVect
ng = averages[iavg]->nGrowVect();
1449 MultiFab::Copy(*(averages[iavg]),*(averages[2]),0,0,1,
ng);
1465 #pragma omp parallel if (Gpu::notInLaunchRegion())
1467 for (MFIter mfi(*fields[imf_cc],
TileNoZ()); mfi.isValid(); ++mfi) {
1468 Box pbx = mfi.tilebox();
1470 if (pbx.smallEnd(2) != klo) {
continue; }
1472 pbx.makeSlab(2,klo);
1474 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
1475 fields[imf ]->const_array(mfi);
1476 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
1477 fields[imf+1]->const_array(mfi);
1478 auto ma_arr = averages[iavg]->array(mfi);
1481 const auto plo = geom.ProbLoArray();
1482 const auto dx = geom.CellSizeArray();
1483 const auto dxInv = geom.InvCellSizeArray();
1484 const auto z_phys_arr = z_phys->const_array(mfi);
1485 auto x_pos_arr = x_pos->array(mfi);
1486 auto y_pos_arr = y_pos->array(mfi);
1487 auto z_pos_arr = z_pos->array(mfi);
1488 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1490 ma_arr(i,j,0) *= d_fact_old;
1493 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1494 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1495 for (
int li(-d_radius); li <= (d_radius); ++li) {
1498 Real xp = x_pos_arr(i+li,j+lj,0);
1499 Real yp = y_pos_arr(i+li,j+lj,0);
1500 Real zp = z_pos_arr(i+li,j+lj,0) + met_h_zeta*lk*
dx[2];
1503 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
1504 Real val = denom * mag * d_fact_new;
1505 ma_arr(i,j,0) += val;
1511 auto k_arr = k_indx->const_array(mfi);
1512 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1513 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1514 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1516 ma_arr(i,j,0) *= d_fact_old;
1518 int mk = k_arr(i,j,0);
1519 int mj = j_arr ? j_arr(i,j,0) : j;
1520 int mi = i_arr ? i_arr(i,j,0) : i;
1521 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1522 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1523 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1524 const Real u_val =
myhalf * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
1525 const Real v_val =
myhalf * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
1526 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
1527 Real val = denom * mag * d_fact_new;
1528 ma_arr(i,j,0) += val;
1538 averages[iavg]->FillBoundary(geom.periodicity());
1548 bool not_per_x = !(geom.periodicity().isPeriodic(0));
1549 bool not_per_y = !(geom.periodicity().isPeriodic(1));
1550 Box cc_bnd_bx = (
m_fields[lev][2]->boxArray()).minimalBox();
1551 Box domain = geom.Domain();
1552 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
1553 for (
int iavg(0); iavg <
m_navg; ++iavg) {
1554 IntVect
ng = averages[iavg]->nGrowVect();
ng[2]=0;
1566 int imf = min(iavg,2);
1567 Box bnd_bx = (fields[imf]->boxArray()).minimalBox();
1569 #pragma omp parallel if (Gpu::notInLaunchRegion())
1571 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1572 Box gpbx = mfi.growntilebox(
ng);
1574 if (gpbx.smallEnd(2) != klo) {
continue; }
1576 gpbx.makeSlab(2,klo);
1578 if (bnd_bx.contains(gpbx))
continue;
1580 auto ma_arr = averages[iavg]->array(mfi);
1582 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
1583 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
1584 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int ) noexcept
1587 li = i < i_lo ? i_lo : i;
1588 li = li > i_hi ? i_hi : li;
1589 lj = j < j_lo ? j_lo : j;
1590 lj = lj > j_hi ? j_hi : lj;
1592 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:234
int m_ncell_region
Definition: ERF_MOSTAverage.H:235
@ ng
Definition: ERF_Morrison.H:48