@@ -191,6 +191,7 @@ def __init__(self,riemann_solver=None,claw_package=None):
191191 self .prev_dt_values = []
192192 self .prev_dtFE_values = []
193193 self .check_lmm_cond = False
194+ self .lmm_cond = True
194195
195196 # Call general initialization function
196197 super (SharpClawSolver ,self ).__init__ (riemann_solver ,claw_package )
@@ -290,7 +291,7 @@ def step(self,solution,take_one_step,tstart,tend):
290291 self .dq_dt = self .dq (state ) / self .dt
291292
292293 if 'LMM' in self .time_integrator :
293- self .update_saved_values (state ,step_index )
294+ step_index = self .update_saved_values (state ,step_index )
294295
295296 self .get_dt (solution .t ,tstart ,tend ,take_one_step )
296297
@@ -448,20 +449,21 @@ def update_saved_values(self,state,step_index):
448449 dtFE = self .dt / cfl * self .cfl_max / self .sspcoeff
449450
450451 if self .time_integrator == 'SSPLMMk3' and self .check_lmm_cond :
451- self .accept_step = self .check_3rd_ord_cond (state ,step_index ,dtFE )
452- if not self .accept_step :
452+ self .lmm_cond = self .check_3rd_ord_cond (state ,step_index ,dtFE )
453+ if not self .lmm_cond :
454+ self .accept_step = False
453455 state .q [:] = self ._registers [- 1 ].q
456+ self .dq_dt = self .prev_dq_dt_values [- 1 ]
454457 state .t = self ._registers [- 1 ].t
455458 self .status ['numsteps' ] -= 1
456- return
459+ return self . status [ 'numsteps' ] + 1
457460
458461 if step_index <= len (self ._registers ): # Startup
459462 if self .time_integrator == 'SSPLMMk3' :
460463 self .prev_dq_dt_values .append (self .dq_dt )
461464 self .prev_dt_values .append (self .dt_old )
462465 self .prev_dtFE_values .append (dtFE )
463466 else :
464- self .sspcoeff0 = self .sspcoeff
465467 if self .time_integrator == 'SSPLMMk3' :
466468 self .prev_dq_dt_values = self .prev_dq_dt_values [1 :] + self .prev_dq_dt_values [:1 ]
467469 self .prev_dq_dt_values [- 1 ] = self .dq_dt
@@ -483,6 +485,8 @@ def update_saved_values(self,state,step_index):
483485 self ._registers [- 1 ].q [:] = state .q
484486 self ._registers [- 1 ].t = state .t
485487
488+ return step_index
489+
486490
487491 def check_3rd_ord_cond (self ,state ,step_index ,dtFE ):
488492 r"""
@@ -493,19 +497,19 @@ def check_3rd_ord_cond(self,state,step_index,dtFE):
493497 If the conditions are violated we muct retrieve the previous solution and discard
494498 that step; otherwise the step is accepted.
495499 """
496- accept_step = True
500+ lmm_cond = True
497501
498502 if step_index <= len (self ._registers ):
499503 rho = 0.6 if len (self ._registers ) == 4 else 0.57
500504 if self .dt > rho * dtFE :
501- accept_step = False
505+ lmm_cond = False
502506
503507 rhoFE = 0.9 if len (self ._registers ) == 4 else 0.962
504508 dtFEm1 = self .prev_dtFE_values [- 1 ]
505509 if rhoFE * dtFEm1 > dtFE or dtFE > dtFEm1 / rhoFE :
506- accept_step = False
510+ lmm_cond = False
507511
508- return accept_step
512+ return lmm_cond
509513
510514
511515 def _set_mthlim (self ):
@@ -652,18 +656,20 @@ def get_dt_new(self):
652656 # Step-size update of starting methods
653657 sspcoeff_ratio = self .sspcoeff0 / self .sspcoeff
654658 self .dt = sspcoeff_ratio * self .dt * self .cfl_desired / cfl
655- if self .time_integrator == 'SSPLMMk3' and self .check_lmm_cond :
659+ if self .time_integrator == 'SSPLMMk3' and self .check_lmm_cond and not self . lmm_cond :
656660 rho = 0.6 if len (self ._registers )== 4 else 0.57
657661 self .dt = rho * self .dt
658662 else :
663+ # Step size selection guarantees CFL condition is satified.
664+ # Only need to check 3rd-order LMM's condition
659665 if self .accept_step :
660666 s = len (self ._registers )
661667 p = int (self .time_integrator [- 1 ])
662668 mu = min ([self .prev_dtFE_values [i ] for i in range (s )])
663669 H = sum (self .prev_dt_values [1 :])
664670 self .dt = H * mu / (H + (p - 1 )* mu )
665671 elif self .time_integrator == 'SSPLMMk3' and self .check_lmm_cond :
666- self .dt = 0.5 * self .dt
672+ self .dt = 0.5 * self .dt
667673
668674 # Step-size update for RK methods
669675 else :
0 commit comments