8 Vector<Real> dt_tmp(finest_level+1);
10 for (
int lev = 0; lev <= finest_level; ++lev)
15 ParallelDescriptor::ReduceRealMin(&dt_tmp[0], dt_tmp.size());
17 Real dt_0 = dt_tmp[0];
19 for (
int lev = 0; lev <= finest_level; ++lev) {
20 dt_tmp[lev] = amrex::min(dt_tmp[lev],
change_max*
dt[lev]);
22 dt_0 = amrex::min(dt_0, n_factor*dt_tmp[lev]);
26 const Real eps = 1.e-3_rt*dt_0;
32 for (
int lev = 1; lev <= finest_level; ++lev) {
43 BL_PROFILE(
"REMORA::estTimeStep()");
45 amrex::Real estdt_lowM = 1.e20_rt;
47 auto const dxinv = geom[level].InvCellSizeArray();
49 MultiFab ccvel(grids[level],dmap[level],3,0);
51 average_face_to_cellcenter(ccvel,0,
54 Real estdt_lowM_inv = amrex::ReduceMax(ccvel, 0,
55 [=] AMREX_GPU_HOST_DEVICE (Box
const& b,
56 Array4<Real const>
const& u) -> Real
58 Real new_lm_dt = -1.e100_rt;
59 amrex::Loop(b, [=,&new_lm_dt] (
int i,
int j,
int k)
noexcept
61 new_lm_dt = amrex::max(((amrex::Math::abs(u(i,j,k,0)))*dxinv[0]),
62 ((amrex::Math::abs(u(i,j,k,1)))*dxinv[1]),
63 ((amrex::Math::abs(u(i,j,k,2)))*dxinv[2]), new_lm_dt);
68 ParallelDescriptor::ReduceRealMax(estdt_lowM_inv);
69 if (estdt_lowM_inv > 0.0_rt)
70 estdt_lowM =
cfl / estdt_lowM_inv;;
74 amrex::Print() <<
"Using cfl = " <<
cfl << std::endl;
75 if (estdt_lowM_inv > 0.0_rt) {
76 amrex::Print() <<
"Slow dt at level " << level <<
": " << estdt_lowM << std::endl;
78 amrex::Print() <<
"Slow dt at level " << level <<
": undefined " << std::endl;
82 amrex::Print() <<
"Based on cfl of 1.0_rt " << std::endl;
83 if (estdt_lowM_inv > 0.0_rt) {
84 amrex::Print() <<
"Slow dt at level " << level <<
" would be: " << estdt_lowM/
cfl << std::endl;
86 amrex::Print() <<
"Slow dt at level " << level <<
" would be undefined " << std::endl;
88 amrex::Print() <<
"Fixed dt at level " << level <<
" is: " <<
fixed_dt << std::endl;