def test_finalize_updated(self, tmp_path): p = utilities.yaml_from_dict(tmp_path, 'input.yaml') _delta = DeltaModel(input_file=p) # mock the top-level _delta.log_info = mock.MagicMock() _delta.output_data = mock.MagicMock() _delta.output_checkpoint = mock.MagicMock() # modify the save interval _t = 5 _delta._save_dt = _t * _delta._dt _delta._checkpoint_dt = _t * _delta._dt # run a mock update / save _delta._time = _t * _delta._dt _delta._save_iter += int(1) _delta._save_time_since_data = 0 _delta._save_time_since_checkpoint = 0 # run finalize _delta.finalize() # assert calls # should only hit top-levels assert _delta.log_info.call_count == 2 assert _delta.output_data.call_count == 0 assert _delta.output_checkpoint.call_count == 0 assert _delta._is_finalized is True
def test_update_saving_intervals_offset_long_over_double(self, tmp_path): """dt == 300; save_dt == 1000""" # create a delta with default settings p = utilities.yaml_from_dict(tmp_path, 'input.yaml') _delta = DeltaModel(input_file=p) # modify the timestep and save interval to be twice dt _delta._dt = 300 _delta._save_dt = 1000 _delta._save_any_grids = True # override from settings # mock top-level methods, verify call was made to each _delta.solve_water_and_sediment_timestep = mock.MagicMock() _delta.apply_subsidence = mock.MagicMock() _delta.finalize_timestep = mock.MagicMock() _delta.log_model_time = mock.MagicMock() _delta.output_checkpoint = mock.MagicMock() # DO NOT mock output_data # mock the calls inside output_data _delta.save_grids_and_figs = mock.MagicMock() _delta.update() assert _delta.time_iter == int(1) assert _delta.time == _delta.dt _delta.update() assert _delta.time_iter == int(2) assert _delta.time == 2 * _delta.dt assert _delta.save_grids_and_figs.call_count == 0 _delta.update() assert _delta.time_iter == int(3) assert _delta.time == 3 * _delta.dt assert _delta.save_grids_and_figs.call_count == 0 _delta.update() assert _delta.time == 4 * _delta.dt assert _delta.save_grids_and_figs.call_count == 1 _delta.update() assert _delta.time == 5 * _delta.dt assert _delta.save_grids_and_figs.call_count == 1 for _ in range(33): _delta.update() assert _delta.time == 38 * _delta.dt assert _delta.save_grids_and_figs.call_count == 9 assert _delta._is_finalized is False
def test_update_saving_intervals_on_cycle(self, tmp_path): """dt == 300; save_dt == 600""" # create a delta with default settings p = utilities.yaml_from_dict(tmp_path, 'input.yaml') _delta = DeltaModel(input_file=p) # modify the timestep and save interval to be twice dt _delta._dt = 300 _delta._save_dt = 2 * _delta._dt _delta._save_any_grids = True # override from settings # mock top-level methods, verify call was made to each _delta.solve_water_and_sediment_timestep = mock.MagicMock() _delta.apply_subsidence = mock.MagicMock() _delta.finalize_timestep = mock.MagicMock() _delta.log_model_time = mock.MagicMock() _delta.output_checkpoint = mock.MagicMock() # DO NOT mock output_data # mock the calls inside output_data _delta.save_grids_and_figs = mock.MagicMock() _delta.update() # no new saves, after init assert _delta.time_iter == int(1) assert _delta.time == _delta.dt assert _delta.save_iter == 1 assert _delta.save_time_since_data == _delta.dt _delta.update() # saves now assert _delta.time_iter == int(2) assert _delta.time == 2 * _delta.dt assert _delta.save_iter == 2 assert _delta.save_time_since_data == 0 _delta.update() # no saves assert _delta.time_iter == int(3) assert _delta.save_iter == 2 assert _delta.save_time_since_data == _delta.dt # run for a few to bring iters to 10 for _ in range(7): _delta.update() assert _delta.time_iter == int(10) assert _delta.save_iter == 6 assert _delta.time == 3000 assert _delta._is_finalized is False
def test_update_saving_intervals_short(self, tmp_path): """dt == 300; save_dt == 100""" # create a delta with default settings p = utilities.yaml_from_dict(tmp_path, 'input.yaml') _delta = DeltaModel(input_file=p) # modify the timestep and save interval to be twice dt _delta._dt = 300 _delta._save_dt = 100 _delta._save_any_grids = True # override from settings # mock top-level methods, verify call was made to each _delta.solve_water_and_sediment_timestep = mock.MagicMock() _delta.apply_subsidence = mock.MagicMock() _delta.finalize_timestep = mock.MagicMock() _delta.log_model_time = mock.MagicMock() _delta.output_checkpoint = mock.MagicMock() # DO NOT mock output_data # mock the calls inside output_data _delta.save_grids_and_figs = mock.MagicMock() _delta.update() # save on first iteration assert _delta.time_iter == int(1) assert _delta.time == _delta.dt assert _delta.save_grids_and_figs.call_count == 1 _delta.update() # save again assert _delta.save_time_since_data == 0 assert _delta.time_iter == int(2) assert _delta.time == 2 * _delta.dt assert _delta.save_grids_and_figs.call_count == 2 _delta.update() # save again assert _delta.save_time_since_data == 0 assert _delta.time_iter == int(3) assert _delta.save_grids_and_figs.call_count == 3 assert _delta.save_iter == 4 # once during init assert _delta.time == 900
def test_update_make_record(self, tmp_path): # create a delta with default settings p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {'save_checkpoint': True}) _delta = DeltaModel(input_file=p) # modify the save interval to be twice dt _delta._save_dt = 2 * _delta._dt _delta._checkpoint_dt = 2 * _delta._dt # mock top-level methods, verify call was made to each _delta.solve_water_and_sediment_timestep = mock.MagicMock() _delta.apply_subsidence = mock.MagicMock() _delta.finalize_timestep = mock.MagicMock() _delta.log_info = mock.MagicMock() _delta.log_model_time = mock.MagicMock() _delta.save_the_checkpoint = mock.MagicMock() # DO NOT mock output_data our output_checkpoint # mock the calls inside output_data _delta.save_stratigraphy = mock.MagicMock() _delta.save_grids_and_figs = mock.MagicMock() # run the timestep: t=0 # * should call core, but nothing else after init _delta.update() # assert calls assert _delta.solve_water_and_sediment_timestep.call_count == 1 assert _delta.apply_subsidence.call_count == 1 assert _delta.finalize_timestep.call_count == 1 assert _delta.log_model_time.call_count == 1 # assert times / counters assert _delta.time_iter == int(1) assert _delta.time == _delta.dt assert _delta.save_time_since_data == _delta._dt assert _delta.save_iter == int(1) assert _delta._save_time_since_checkpoint == _delta._dt # run another step # * should call core steps and outputs _delta.update() # assert calls assert _delta.solve_water_and_sediment_timestep.call_count == 2 assert _delta.apply_subsidence.call_count == 2 assert _delta.finalize_timestep.call_count == 2 assert _delta.log_model_time.call_count == 2 # assert times / counters assert _delta.time_iter == int(2) assert _delta.time == 2 * _delta.dt assert _delta.save_time_since_data == 0 assert _delta.save_iter == int(2) assert _delta._save_time_since_checkpoint == 0 # run another step # should call core, but nothing else _delta.update() # assert calls assert _delta.solve_water_and_sediment_timestep.call_count == 3 assert _delta.apply_subsidence.call_count == 3 assert _delta.finalize_timestep.call_count == 3 assert _delta.log_model_time.call_count == 3 # assert times / counters assert _delta.time_iter == int(3) assert _delta.time == 3 * _delta.dt assert _delta.save_time_since_data == _delta._dt assert _delta.save_iter == int(2) assert _delta._save_time_since_checkpoint == _delta._dt