13 BL_PROFILE(
"REMORA::sum_integrated_quantities()");
22 Real scalar_ml =
zero;
23 Real kineng_ml =
zero;
24 Real volume_ml =
zero;
25 Real max_vel_ml =
zero;
27 Real scalar_sl =
zero;
28 Real kineng_sl =
zero;
29 Real volume_sl =
zero;
30 Real max_vel_sl =
zero;
34 for (
int lev = 0; lev <= finest_level; lev++)
36 MultiFab kineng_mf(grids[lev], dmap[lev], 1, 0);
37 MultiFab ones_mf(grids[lev], dmap[lev], 1, 0);
41#pragma omp parallel if (Gpu::notInLaunchRegion())
43 for (MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) {
44 const Box& bx = mfi.tilebox();
45 const Array4< Real> kineng_arr = kineng_mf.array(mfi);
46 const Array4<const Real> xvel_u_arr =
xvel_new[lev]->const_array(mfi);
47 const Array4<const Real> yvel_v_arr =
yvel_new[lev]->const_array(mfi);
48 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
noexcept
51 kineng_arr(i,j,k) =
fourth * ( 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) +
52 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));
57 Real max_vel_local = std::sqrt(
two * kineng_mf.max(icomp));
60 kineng_sl =
volWgtSumMF(lev,kineng_mf,0,local,
false);
61 volume_sl =
volWgtSumMF(lev,ones_mf ,0,local,
false);
62 max_vel_sl = max_vel_local;
66 kineng_ml +=
volWgtSumMF(lev,kineng_mf , 0,local,
true);
67 volume_ml +=
volWgtSumMF(lev,ones_mf , 0,local,
true);
68 max_vel_ml = std::max(max_vel_ml, max_vel_local);
72 const int n_sum_vars = 6;
73 Real sum_vars[n_sum_vars] = {scalar_sl,kineng_sl,volume_sl,scalar_ml,kineng_ml,volume_ml};
75 const int n_max_vars = 2;
76 Real max_vars[n_max_vars] = {max_vel_sl, max_vel_ml};
78 Lazy::QueueReduction([=]()
mutable {
80 ParallelDescriptor::ReduceRealSum(
81 sum_vars, n_sum_vars, ParallelDescriptor::IOProcessorNumber());
82 ParallelDescriptor::ReduceRealMax(
83 max_vars, n_max_vars, ParallelDescriptor::IOProcessorNumber());
85 if (ParallelDescriptor::IOProcessor()) {
87 scalar_sl = sum_vars[i++];
88 kineng_sl = sum_vars[i++];
89 volume_sl = sum_vars[i++];
90 scalar_ml = sum_vars[i++];
91 kineng_ml = sum_vars[i++];
92 volume_ml = sum_vars[i++];
94 max_vel_sl = max_vars[j++];
95 max_vel_ml = max_vars[j++];
97 if (finest_level == 0) {
98 amrex::Print() <<
'\n';
99 amrex::Print() <<
"TIME = " << std::setw(datwidth) << std::setprecision(datprecision) <<
time <<
'\n';
100 amrex::Print() <<
"SCALAR = " << std::setw(datwidth) << std::setprecision(datprecision) << scalar_sl <<
'\n';
101 amrex::Print() <<
"KIN. ENG. = " << std::setw(datwidth) << std::setprecision(datprecision) << kineng_sl <<
'\n';
102 amrex::Print() <<
"VOLUME = " << std::setw(datwidth) << std::setprecision(datprecision) << volume_sl <<
'\n';
103 amrex::Print() <<
"MAX. VEL. = " << std::setw(datwidth) << std::setprecision(datprecision) << max_vel_sl <<
'\n';
105 amrex::Print() <<
'\n';
106 amrex::Print() <<
"TIME = " << std::setw(datwidth) << std::setprecision(datprecision) <<
time <<
'\n';
107 amrex::Print() <<
"SCALAR SL/ML = " << std::setw(datwidth) << std::setprecision(datprecision) << scalar_sl <<
' '
108 << std::setw(datwidth) << std::setprecision(datprecision) << scalar_ml <<
'\n';
109 amrex::Print() <<
"KIN. ENG. SL/ML = " << std::setw(datwidth) << std::setprecision(datprecision) << kineng_sl <<
' '
110 << std::setw(datwidth) << std::setprecision(datprecision) << kineng_ml <<
'\n';
111 amrex::Print() <<
"VOLUME SL/ML = " << std::setw(datwidth) << std::setprecision(datprecision) << volume_sl <<
' '
112 << std::setw(datwidth) << std::setprecision(datprecision) << volume_ml <<
'\n';
113 amrex::Print() <<
"MAX. VEL. SL/ML = " << std::setw(datwidth) << std::setprecision(datprecision) << max_vel_sl <<
' '
114 << std::setw(datwidth) << std::setprecision(datprecision) << max_vel_ml <<
'\n';
123 std::ostream& data_log1 =
DataLog(0);
124 if (data_log1.good()) {
126 data_log1 << std::setw(datwidth) <<
" time";
127 data_log1 << std::setw(datwidth) <<
" scalar";
128 data_log1 << std::setw(datwidth) <<
" kineng";
129 data_log1 << std::setw(datwidth) <<
" volume";
130 data_log1 << std::setw(datwidth) <<
" max_vel";
131 data_log1 << std::endl;
135 data_log1 << std::setw(datwidth) <<
time;
136 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
138 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
140 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
142 data_log1 << std::setw(datwidth) << std::setprecision(datprecision)
144 data_log1 << std::endl;
164 BL_PROFILE(
"REMORA::volWgtSumMF()");
167 MultiFab tmp(grids[lev], dmap[lev], 1, 0);
168 MultiFab::Copy(tmp, mf, comp, 0, 1, 0);
170 if (lev < finest_level && finemask) {
172 MultiFab::Multiply(tmp, mask, 0, 0, 1, 0);
175 MultiFab volume(grids[lev], dmap[lev], 1, 0);
177#pragma omp parallel if (Gpu::notInLaunchRegion())
179 for (MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) {
180 const Box& bx = mfi.tilebox();
181 const Array4< Real> vol_arr = volume.array(mfi);
182 const Array4<const Real> Hz =
vec_Hz[lev]->const_array(mfi);
183 const Array4<const Real> pm =
vec_pm[lev]->const_array(mfi);
184 const Array4<const Real> pn =
vec_pn[lev]->const_array(mfi);
185 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
noexcept
187 vol_arr(i,j,k) = Hz(i,j,k) / (pm(i,j,0) * pn(i,j,0));
191 sum = MultiFab::Dot(tmp, 0, volume, 0, 1, 0, local);
194 ParallelDescriptor::ReduceRealSum(sum);