1212
1313import porepy as pp
1414from porepy .models .solution_strategy import SolutionStrategy
15- from porepy .time .time_step_status import TimeStepperStatusFailure
15+ from porepy .time .time_step_status import (
16+ TimeStepperStatusFailure ,
17+ TimeStepperStatusSuccess ,
18+ )
1619from porepy .time .time_stepper import TimeStepper
1720from porepy .utils .ui_and_logging import DummyProgressBar
1821from porepy .utils .ui_and_logging import (
@@ -219,6 +222,7 @@ def init_time_progressbar(self) -> None:
219222 use_progress_bar = (
220223 self .params .get ("progressbars" , False ) and self ._is_time_dependent
221224 )
225+ use_progress_bar = True
222226 if use_progress_bar and progressbar_class is DummyProgressBar :
223227 logger .warning (
224228 "Progress bars are requested, but `tqdm` is not installed. The time"
@@ -232,26 +236,22 @@ def init_time_progressbar(self) -> None:
232236 self .params .update ({"_nl_progress_bar_position" : 1 })
233237
234238 if use_progress_bar :
235- # Create a time bar of length of expected number of time steps, estimated
236- # from the initial time step size.
237- # NOTE: Adaptive time stepping updates the bar proportionally if step sizes
238- # change from initial time step size.
239- expected_time_steps : int = int (
240- np .round (
241- (
242- self .model .time_manager .schedule [- 1 ]
243- - self .model .time_manager .schedule [0 ]
244- )
245- / self .model .time_manager .dt
246- )
247- )
239+ # Create a time bar of length of expected simulation time.
240+
241+ # Creating a custom format string. Difference from the default: it converts
242+ # the simulation time (done/total) to the a scientific format with :.1e.
243+ l_bar = "{desc}: {percentage:3.0f}%|"
244+ r_bar = "| {n:.1e}/{total:.1e} [{elapsed}<{remaining}, {rate_fmt}{postfix}]"
245+ bar_format = l_bar + "{bar}" + r_bar
248246
249247 # NOTE: If tqdm is not installed, this returns a DummyProgressBar instance.
250248 self .time_progressbar = progressbar_class (
251- range ( expected_time_steps ) ,
249+ total = self . model . time_manager . schedule [ - 1 ] ,
252250 desc = "Time loop" ,
253251 position = 0 ,
254252 dynamic_ncols = True ,
253+ bar_format = bar_format ,
254+ postfix = self ._progressbar_postfix (),
255255 )
256256 else :
257257 self .time_progressbar = DummyProgressBar ()
@@ -295,13 +295,17 @@ def _run_time_dependent(self) -> ModelRunnerStatus:
295295
296296 with logging_redirect_tqdm ([logging .root ]):
297297 while not self .model .time_manager .final_time_reached ():
298+ # Update the progressbar before the time step.
299+ self .time_progressbar .set_postfix_str (self ._progressbar_postfix ())
300+
298301 # Perform the time step.
299302 time_step_status = self .time_stepper .perform_time_step (
300303 self .model , self .solver
301304 )
302305
303- # Progressbar update.
304- self .update_time_progressbar ()
306+ # Update the progressbar after the time step.
307+ if isinstance (time_step_status , TimeStepperStatusSuccess ):
308+ self .time_progressbar .update (n = time_step_status .dt )
305309
306310 # Abort simulation if time step was stopped.
307311 match time_step_status :
@@ -314,15 +318,6 @@ def _run_time_dependent(self) -> ModelRunnerStatus:
314318 return ModelRunnerStatusSuccess ()
315319 return ModelRunnerStatusFailure ("Final time was not reached." )
316320
317- def update_time_progressbar (self ) -> None :
318- """Update the time progressbar with the current time and time step size."""
319- self .time_progressbar .set_postfix_str (
320- f"Time step size { self .model .time_manager .dt :.2e} "
321- )
322- self .time_progressbar .update (
323- n = np .round (
324- self .model .time_manager .time
325- / self .model .time_manager .time_final
326- * self .time_progressbar .total
327- )
328- )
321+ def _progressbar_postfix (self ) -> str :
322+ """Formats a progressbar postfix string with dt."""
323+ return f"Δt={ self .model .time_manager .dt :.1e} "
0 commit comments