Skip to content

Commit 73a5b56

Browse files
committed
Merge pull request clawpack#532 from hadjimy/lmmvss_conditions
Revise 3rd-order LMM's step size condition for starting values.
2 parents 9a89c52 + 236df49 commit 73a5b56

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

src/pyclaw/sharpclaw/solver.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)