Function to compute average over local region.
996 const auto & geom =
m_geom[lev];
1008 Real d_fact_new, d_fact_old;
1028 for (
int imf(0); imf < 4; ++imf) {
1031 if (!fields[imf])
continue;
1034 #pragma omp parallel if (Gpu::notInLaunchRegion())
1036 for (MFIter mfi(*fields[imf],
TileNoZ()); mfi.isValid(); ++mfi) {
1037 Box pbx = mfi.tilebox(); pbx.setSmall(2,0); pbx.setBig(2,0);
1039 auto mf_arr = (
m_rotate) ? rot_fields[imf]->const_array(mfi) :
1040 fields[imf]->const_array(mfi);
1041 auto ma_arr = averages[imf]->array(mfi);
1044 const auto plo = geom.ProbLoArray();
1045 const auto dx = geom.CellSizeArray();
1046 const auto dxInv = geom.InvCellSizeArray();
1047 const auto z_phys_arr = z_phys->const_array(mfi);
1048 auto x_pos_arr = x_pos->array(mfi);
1049 auto y_pos_arr = y_pos->array(mfi);
1050 auto z_pos_arr = z_pos->array(mfi);
1051 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1053 ma_arr(i,j,k) *= d_fact_old;
1056 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1057 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1058 for (
int li(-d_radius); li <= (d_radius); ++li) {
1060 Real xp = x_pos_arr(i+li,j+lj,k);
1061 Real yp = y_pos_arr(i+li,j+lj,k);
1062 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*dx[2];
1064 Real val = denom * interp * d_fact_new;
1065 ma_arr(i,j,k) += val;
1071 auto k_arr = k_indx->const_array(mfi);
1072 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1073 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1074 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1076 ma_arr(i,j,k) *= d_fact_old;
1078 int mk = k_arr(i,j,k);
1079 int mj = j_arr ? j_arr(i,j,k) : j;
1080 int mi = i_arr ? i_arr(i,j,k) : i;
1081 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1082 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1083 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1084 Real val = denom * mf_arr(li, lj, lk) * d_fact_new;
1085 ma_arr(i,j,k) += val;
1095 averages[imf]->FillBoundary(geom.periodicity());
1109 #pragma omp parallel if (Gpu::notInLaunchRegion())
1111 for (MFIter mfi(*averages[iavg],
TileNoZ()); mfi.isValid(); ++mfi) {
1112 Box pbx = mfi.tilebox(); pbx.setSmall(2,0); pbx.setBig(2,0);
1114 const Array4<Real const>& T_mf_arr = fields[2]->const_array(mfi);
1115 const Array4<Real const>& qv_mf_arr = (fields[3])? fields[3]->const_array(mfi) : Array4<const Real>{};
1116 const Array4<Real const>& qr_mf_arr = (fields[4])? fields[4]->const_array(mfi) : Array4<const Real>{};
1117 auto ma_arr = averages[iavg]->array(mfi);
1120 const auto plo = geom.ProbLoArray();
1121 const auto dx = geom.CellSizeArray();
1122 const auto dxInv = geom.InvCellSizeArray();
1123 const auto z_phys_arr = z_phys->const_array(mfi);
1124 auto x_pos_arr = x_pos->array(mfi);
1125 auto y_pos_arr = y_pos->array(mfi);
1126 auto z_pos_arr = z_pos->array(mfi);
1127 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1129 ma_arr(i,j,k) *= d_fact_old;
1132 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1133 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1134 for (
int li(-d_radius); li <= (d_radius); ++li) {
1137 Real xp = x_pos_arr(i+li,j+lj,k);
1138 Real yp = y_pos_arr(i+li,j+lj,k);
1139 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*dx[2];
1147 &qr_interp, qr_mf_arr, z_phys_arr, plo, dxInv, 1);
1148 vfac = 1.0 + 0.61*qv_interp - qr_interp;
1150 vfac = 1.0 + 0.61*qv_interp;
1152 const Real mag = T_interp * vfac;
1153 const Real val = denom * mag * d_fact_new;
1154 ma_arr(i,j,k) += val;
1160 auto k_arr = k_indx->const_array(mfi);
1161 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1162 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1163 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1165 ma_arr(i,j,k) *= d_fact_old;
1167 int mk = k_arr(i,j,k);
1168 int mj = j_arr ? j_arr(i,j,k) : j;
1169 int mi = i_arr ? i_arr(i,j,k) : i;
1170 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1171 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1172 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1176 vfac = 1.0 + 0.61*qv_mf_arr(li,lj,lk) - qr_mf_arr(li,lj,lk);
1178 vfac = 1.0 + 0.61*qv_mf_arr(li,lj,lk);
1180 const Real mag = T_mf_arr(li,lj,lk) * vfac;
1181 const Real val = denom * mag * d_fact_new;
1182 ma_arr(i,j,k) += val;
1192 averages[iavg]->FillBoundary(geom.periodicity());
1198 IntVect
ng = averages[iavg]->nGrowVect();
1199 MultiFab::Copy(*(averages[iavg]),*(averages[2]),0,0,1,
ng);
1211 const Real Vsg =
m_Vsg[lev];
1214 #pragma omp parallel if (Gpu::notInLaunchRegion())
1216 for (MFIter mfi(*averages[iavg],
TileNoZ()); mfi.isValid(); ++mfi) {
1217 Box pbx = mfi.tilebox(); pbx.setSmall(2,0); pbx.setBig(2,0);
1219 auto u_mf_arr = (
m_rotate) ? rot_fields[imf ]->const_array(mfi) :
1220 fields[imf ]->const_array(mfi);
1221 auto v_mf_arr = (
m_rotate) ? rot_fields[imf+1]->const_array(mfi) :
1222 fields[imf+1]->const_array(mfi);
1223 auto ma_arr = averages[iavg]->array(mfi);
1226 const auto plo = geom.ProbLoArray();
1227 const auto dx = geom.CellSizeArray();
1228 const auto dxInv = geom.InvCellSizeArray();
1229 const auto z_phys_arr = z_phys->const_array(mfi);
1230 auto x_pos_arr = x_pos->array(mfi);
1231 auto y_pos_arr = y_pos->array(mfi);
1232 auto z_pos_arr = z_pos->array(mfi);
1233 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1235 ma_arr(i,j,k) *= d_fact_old;
1238 for (
int lk(-d_radius); lk <= (d_radius); ++lk) {
1239 for (
int lj(-d_radius); lj <= (d_radius); ++lj) {
1240 for (
int li(-d_radius); li <= (d_radius); ++li) {
1243 Real xp = x_pos_arr(i+li,j+lj,k);
1244 Real yp = y_pos_arr(i+li,j+lj,k);
1245 Real zp = z_pos_arr(i+li,j+lj,k) + met_h_zeta*lk*dx[2];
1248 const Real mag = std::sqrt(u_interp*u_interp + v_interp*v_interp + Vsg*Vsg);
1249 Real val = denom * mag * d_fact_new;
1250 ma_arr(i,j,k) += val;
1256 auto k_arr = k_indx->const_array(mfi);
1257 auto j_arr = j_indx ? j_indx->const_array(mfi) : Array4<const int> {};
1258 auto i_arr = i_indx ? i_indx->const_array(mfi) : Array4<const int> {};
1259 ParallelFor(pbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1261 ma_arr(i,j,k) *= d_fact_old;
1263 int mk = k_arr(i,j,k);
1264 int mj = j_arr ? j_arr(i,j,k) : j;
1265 int mi = i_arr ? i_arr(i,j,k) : i;
1266 for (
int lk(mk-d_radius); lk <= (mk+d_radius); ++lk) {
1267 for (
int lj(mj-d_radius); lj <= (mj+d_radius); ++lj) {
1268 for (
int li(mi-d_radius); li <= (mi+d_radius); ++li) {
1269 const Real u_val = 0.5 * (u_mf_arr(li,lj,lk) + u_mf_arr(li+1,lj ,lk));
1270 const Real v_val = 0.5 * (v_mf_arr(li,lj,lk) + v_mf_arr(li ,lj+1,lk));
1271 const Real mag = std::sqrt(u_val*u_val + v_val*v_val + Vsg*Vsg);
1272 Real val = denom * mag * d_fact_new;
1273 ma_arr(i,j,k) += val;
1283 averages[iavg]->FillBoundary(geom.periodicity());
1293 bool not_per_x = !(geom.periodicity().isPeriodic(0));
1294 bool not_per_y = !(geom.periodicity().isPeriodic(1));
1295 Box cc_bnd_bx = (
m_fields[lev][2]->boxArray()).minimalBox();
1296 Box domain = geom.Domain();
1297 if (domain.contains(cc_bnd_bx) || (not_per_x || not_per_y)) {
1298 for (
int iavg(0); iavg <
m_navg; ++iavg) {
1299 IntVect
ng = averages[iavg]->nGrowVect();
ng[2]=0;
1311 int imf = min(iavg,2);
1312 Box bnd_bx = (
m_fields[lev][imf]->boxArray()).minimalBox();
1314 #pragma omp parallel if (Gpu::notInLaunchRegion())
1316 for (MFIter mfi(*averages[iavg],
TileNoZ()); mfi.isValid(); ++mfi) {
1317 Box gpbx = mfi.growntilebox(
ng); gpbx.setSmall(2,0); gpbx.setBig(2,0);
1319 if (bnd_bx.contains(gpbx))
continue;
1321 auto ma_arr = averages[iavg]->array(mfi);
1323 int i_lo = bnd_bx.smallEnd(0);
int i_hi = bnd_bx.bigEnd(0);
1324 int j_lo = bnd_bx.smallEnd(1);
int j_hi = bnd_bx.bigEnd(1);
1325 ParallelFor(gpbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
1328 li = i < i_lo ? i_lo : i;
1329 li = li > i_hi ? i_hi : li;
1330 lj = j < j_lo ? j_lo : j;
1331 lj = lj > j_hi ? j_hi : lj;
1333 ma_arr(i,j,k) = ma_arr(li,lj,k);
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:47
int m_radius
Definition: ERF_MOSTAverage.H:218
int m_ncell_region
Definition: ERF_MOSTAverage.H:219
@ ng
Definition: ERF_Morrison.H:48