13 BL_PROFILE(
"REMORA::sum_integrated_quantities()");
24 Real max_vel = 0.0_rt;
26 for (
int lev = 0; lev <= finest_level; lev++)
28 MultiFab kineng_mf(grids[lev], dmap[lev], 1, 0);
29 MultiFab ones_mf(grids[lev], dmap[lev], 1, 0);
30 ones_mf.setVal(1.0_rt);
33#pragma omp parallel if (Gpu::notInLaunchRegion())
35 for (MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) {
36 const Box& bx = mfi.tilebox();
37 const Array4< Real> kineng_arr = kineng_mf.array(mfi);
38 const Array4<const Real> xvel_u_arr =
xvel_new[lev]->const_array(mfi);
39 const Array4<const Real> yvel_v_arr =
yvel_new[lev]->const_array(mfi);
40 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
noexcept
43 kineng_arr(i,j,k) = 0.25_rt * ( xvel_u_arr(i,j,k)*xvel_u_arr(i,j,k) + xvel_u_arr(i+1,j,k)*xvel_u_arr(i+1,j,k) +
44 yvel_v_arr(i,j,k)*yvel_v_arr(i,j,k) + yvel_v_arr(i ,j+1,k)*yvel_v_arr(i,j+1,k));
49 Real max_vel_local = std::sqrt(2.0_rt * kineng_mf.max(icomp));
52 kineng +=
volWgtSumMF(lev,kineng_mf , 0,
false,
true);
54 max_vel = std::max(max_vel, max_vel_local);
58 const int n_sum_vars = 3;
59 Real sum_vars[n_sum_vars] = {scalar,kineng,volume};
61 const int n_max_vars = 1;
62 Real max_vars[n_max_vars] = {max_vel};
64 Lazy::QueueReduction([=]()
mutable {
66 ParallelDescriptor::ReduceRealSum(
67 sum_vars, n_sum_vars, ParallelDescriptor::IOProcessorNumber());
68 ParallelDescriptor::ReduceRealMax(
69 max_vars, n_max_vars, ParallelDescriptor::IOProcessorNumber());
71 if (ParallelDescriptor::IOProcessor()) {
73 scalar = sum_vars[i++];
74 kineng = sum_vars[i++];
75 volume = sum_vars[i++];
77 max_vel = max_vars[j++];
79 amrex::Print() <<
'\n';
80 amrex::Print() <<
"TIME= " << time <<
" SCALAR = " << scalar <<
'\n';
81 amrex::Print() <<
"TIME= " << time <<
" KIN. ENG. = " << kineng <<
'\n';
82 amrex::Print() <<
"TIME= " << time <<
" VOLUME = " << volume <<
'\n';
83 amrex::Print() <<
"TIME= " << time <<
" MAX. VEL. = " << max_vel <<
'\n';
86 std::ostream& data_log1 =
DataLog(0);
87 if (data_log1.good()) {
89 data_log1 << std::setw(datwidth) <<
" time";
90 data_log1 << std::setw(datwidth) <<
" scalar";
91 data_log1 << std::setw(datwidth) <<
" kineng";
92 data_log1 << std::setw(datwidth) <<
" volume";
93 data_log1 << std::setw(datwidth) <<
" max_vel";
94 data_log1 << std::endl;
98 data_log1 << std::setw(datwidth) << time;
99 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
101 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
103 data_log1 << std::endl;
123 BL_PROFILE(
"REMORA::volWgtSumMF()");
126 MultiFab tmp(grids[lev], dmap[lev], 1, 0);
127 MultiFab::Copy(tmp, mf, comp, 0, 1, 0);
129 if (lev < finest_level && finemask) {
131 MultiFab::Multiply(tmp, mask, 0, 0, 1, 0);
134 MultiFab volume(grids[lev], dmap[lev], 1, 0);
136#pragma omp parallel if (Gpu::notInLaunchRegion())
138 for (MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) {
139 const Box& bx = mfi.tilebox();
140 const Array4< Real> vol_arr = volume.array(mfi);
141 const Array4<const Real> Hz =
vec_Hz[lev]->const_array(mfi);
142 const Array4<const Real> pm =
vec_pm[lev]->const_array(mfi);
143 const Array4<const Real> pn =
vec_pn[lev]->const_array(mfi);
144 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
noexcept
146 vol_arr(i,j,k) = Hz(i,j,k) / (pm(i,j,0) * pn(i,j,0));
150 sum = MultiFab::Dot(tmp, 0, volume, 0, 1, 0, local);
153 ParallelDescriptor::ReduceRealSum(sum);
165 AMREX_ASSERT(level > 0);
167 const BoxArray& cba = grids[level-1];
168 const DistributionMapping& cdm = dmap[level-1];
171 fine_mask.define(cba, cdm, 1, 0, MFInfo());
174 BoxArray fba = grids[level];
175 iMultiFab ifine_mask = makeFineMask(cba, cdm, fba, ref_ratio[level-1], 1, 0);
178 const auto ifma = ifine_mask.arrays();
179 ParallelFor(
fine_mask, [=] AMREX_GPU_DEVICE(
int bno,
int i,
int j,
int k)
noexcept
181 fma[bno](i,j,k) = ifma[bno](i,j,k);
199 bool int_test = (action_interval > 0 && nstep % action_interval == 0);
201 bool per_test =
false;
202 if (action_per > 0.0_rt) {
203 const int num_per_old =
static_cast<int>(amrex::Math::floor((time - dtlev) / action_per));
204 const int num_per_new =
static_cast<int>(amrex::Math::floor((time) / action_per));
206 if (num_per_old != num_per_new) {
211 return int_test || per_test;
amrex::Real volWgtSumMF(int lev, const amrex::MultiFab &mf, int comp, bool local, bool finemask)
Perform the volume-weighted sum.
bool is_it_time_for_action(int nstep, amrex::Real time, amrex::Real dt, int action_interval, amrex::Real action_per)
Decide if it is time to take an action.