|
| 1 | +import pytest |
| 2 | + |
| 3 | + |
| 4 | +def get_controller(step_size_limier_params): |
| 5 | + """ |
| 6 | + Runs a single advection problem with certain parameters |
| 7 | +
|
| 8 | + Args: |
| 9 | + step_size_limier_params (dict): Parameters for convergence controller |
| 10 | +
|
| 11 | + Returns: |
| 12 | + (pySDC.Controller.controller): Controller used in the run |
| 13 | + """ |
| 14 | + from pySDC.implementations.problem_classes.polynomial_test_problem import polynomial_testequation |
| 15 | + from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI |
| 16 | + from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit |
| 17 | + from pySDC.implementations.convergence_controller_classes.step_size_limiter import StepSizeLimiter |
| 18 | + |
| 19 | + level_params = {} |
| 20 | + level_params['dt'] = 1.0 |
| 21 | + level_params['restol'] = 1.0 |
| 22 | + |
| 23 | + sweeper_params = {} |
| 24 | + sweeper_params['quad_type'] = 'GAUSS' |
| 25 | + sweeper_params['num_nodes'] = 1 |
| 26 | + sweeper_params['do_coll_update'] = True |
| 27 | + |
| 28 | + problem_params = {'degree': 10} |
| 29 | + |
| 30 | + step_params = {} |
| 31 | + step_params['maxiter'] = 0 |
| 32 | + |
| 33 | + controller_params = {} |
| 34 | + controller_params['logger_level'] = 30 |
| 35 | + |
| 36 | + description = {} |
| 37 | + description['problem_class'] = polynomial_testequation |
| 38 | + description['problem_params'] = problem_params |
| 39 | + description['sweeper_class'] = generic_implicit |
| 40 | + description['sweeper_params'] = sweeper_params |
| 41 | + description['level_params'] = level_params |
| 42 | + description['step_params'] = step_params |
| 43 | + description['convergence_controllers'] = {StepSizeLimiter: step_size_limier_params} |
| 44 | + |
| 45 | + controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description) |
| 46 | + |
| 47 | + controller.add_convergence_controller(StepSizeLimiter, description, step_size_limier_params) |
| 48 | + |
| 49 | + return controller |
| 50 | + |
| 51 | + |
| 52 | +@pytest.mark.base |
| 53 | +def test_step_size_slope_limiter(): |
| 54 | + from pySDC.implementations.convergence_controller_classes.step_size_limiter import StepSizeSlopeLimiter |
| 55 | + |
| 56 | + params = {'dt_slope_max': 2, 'dt_slope_min': 1e-3, 'dt_rel_min_slope': 1e-1} |
| 57 | + controller = get_controller(params) |
| 58 | + |
| 59 | + limiter = controller.convergence_controllers[ |
| 60 | + [type(me) for me in controller.convergence_controllers].index(StepSizeSlopeLimiter) |
| 61 | + ] |
| 62 | + |
| 63 | + S = controller.MS[0] |
| 64 | + S.status.slot = 0 |
| 65 | + L = S.levels[0] |
| 66 | + L.status.time = 0 |
| 67 | + |
| 68 | + L.params.dt = 1 |
| 69 | + L.status.dt_new = 3 |
| 70 | + limiter.get_new_step_size(controller, S) |
| 71 | + assert L.status.dt_new == 2 |
| 72 | + |
| 73 | + L.params.dt = 1 |
| 74 | + L.status.dt_new = 0 |
| 75 | + limiter.get_new_step_size(controller, S) |
| 76 | + assert L.status.dt_new == 1e-3 |
| 77 | + |
| 78 | + L.params.dt = 1 |
| 79 | + L.status.dt_new = 1 + 1e-3 |
| 80 | + limiter.get_new_step_size(controller, S) |
| 81 | + assert L.status.dt_new == 1 |
| 82 | + |
| 83 | + |
| 84 | +@pytest.mark.base |
| 85 | +def test_step_size_limiter(): |
| 86 | + from pySDC.implementations.convergence_controller_classes.step_size_limiter import StepSizeLimiter |
| 87 | + |
| 88 | + params = {'dt_max': 2, 'dt_min': 0.5} |
| 89 | + controller = get_controller(params) |
| 90 | + |
| 91 | + limiter = controller.convergence_controllers[ |
| 92 | + [type(me) for me in controller.convergence_controllers].index(StepSizeLimiter) |
| 93 | + ] |
| 94 | + |
| 95 | + S = controller.MS[0] |
| 96 | + S.status.slot = 0 |
| 97 | + L = S.levels[0] |
| 98 | + L.status.time = 0 |
| 99 | + |
| 100 | + L.params.dt = 1 |
| 101 | + L.status.dt_new = 3 |
| 102 | + limiter.get_new_step_size(controller, S) |
| 103 | + assert L.status.dt_new == 2 |
| 104 | + |
| 105 | + L.params.dt = 1 |
| 106 | + L.status.dt_new = 0 |
| 107 | + limiter.get_new_step_size(controller, S) |
| 108 | + assert L.status.dt_new == 0.5 |
| 109 | + |
| 110 | + |
| 111 | +if __name__ == '__main__': |
| 112 | + test_step_size_slope_limiter() |
0 commit comments