Exemplo n.º 1
0
    def test_load_already_open_netcdf_error(self, patched, tmp_path):
        """
        Test that a checkpoint can be loaded when the load expects there to be
        a netcdf file. This will create a new netcdf file and raise a
        warning.
        """
        # define a yaml with an output, and checkpoint
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {
            'save_checkpoint': True,
            'save_eta_grids': True
        })
        _delta = DeltaModel(input_file=p)

        # make mocks
        _delta.log_info = mock.MagicMock()
        _delta.logger = mock.MagicMock()
        _delta.init_output_file = mock.MagicMock()

        # close the file so can be safely opened in load
        _delta.output_netcdf.close()

        # check that files exist, and then open the nc back up
        assert os.path.isfile(
            os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))
        assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz'))
        _ = Dataset(os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))

        # now try to resume a model and should throw error
        with pytest.raises(RuntimeError):
            _delta.load_checkpoint()
Exemplo n.º 2
0
    def test_run_one_timestep_deprecated(self, tmp_path):
        # create a delta with default settings
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml')
        _delta = DeltaModel(input_file=p)

        # mock top-level methods
        _delta.logger = mock.MagicMock()
        _delta.solve_water_and_sediment_timestep = mock.MagicMock()

        # check warning raised
        with pytest.warns(UserWarning):
            _delta.run_one_timestep()

        # and logged
        assert (_delta.logger.warning.called is True)
Exemplo n.º 3
0
    def test_load_wo_netcdf_expected(self, patched, tmp_path):
        """
        Test that a checkpoint can be loaded when the load expects there to be
        a netcdf file. This will create a new netcdf file and raise a
        warning.
        """
        # define a yaml with NO outputs, but checkpoint
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {
            'save_checkpoint': True,
            'save_eta_grids': True
        })
        _delta = DeltaModel(input_file=p)

        # make mocks
        _delta.log_info = mock.MagicMock()
        _delta.logger = mock.MagicMock()
        _delta.init_output_file = mock.MagicMock()

        # close the file so can be safely opened in load
        _delta.output_netcdf.close()

        # check that files exist, and then delete nc
        assert os.path.isfile(
            os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))
        assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz'))
        os.remove(os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))

        # now mess up a field
        _eta0 = np.copy(_delta.eta)
        _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape)
        _delta.eta = _rand_field
        assert np.all(_delta.eta == _rand_field)

        # now resume from the checkpoint to restore the field
        with pytest.warns(UserWarning, match=r'NetCDF4 output *.'):
            _delta.load_checkpoint()

        # check that fields match
        assert np.all(_delta.eta == _eta0)
        assert _delta._save_iter == 0

        # assertions on function calls
        _delta.log_info.assert_called()
        _delta.logger.warning.assert_called()
        _delta.init_output_file.assert_called()
        patched.assert_called()
Exemplo n.º 4
0
    def test_load_standard_grid(self, patched, tmp_path):
        """Test that a run can be resumed when there are outputs.
        """
        # create one delta, just to have a checkpoint file
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {
            'save_checkpoint': True,
            'save_eta_grids': True
        })
        _delta = DeltaModel(input_file=p)

        # make mocks
        _delta.log_info = mock.MagicMock()
        _delta.logger = mock.MagicMock()
        _delta.init_output_file = mock.MagicMock()

        # close the file so can be safely opened in load
        _delta.output_netcdf.close()

        # check checkpoint exists
        assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz'))
        assert os.path.isfile(
            os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))

        # now mess up a field
        _eta0 = np.copy(_delta.eta)
        _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape)
        _delta.eta = _rand_field
        assert np.all(_delta.eta == _rand_field)

        # now resume from the checkpoint to restore the field
        _delta.load_checkpoint()

        # check that fields match
        assert np.all(_delta.eta == _eta0)

        # assertions on function calls
        _call = [mock.call('Renaming old NetCDF4 output file', verbosity=2)]
        _delta.log_info.assert_has_calls(_call, any_order=True)
        _delta.logger.assert_not_called()
        _delta.init_output_file.assert_not_called()
        patched.assert_called()
Exemplo n.º 5
0
    def test_records_arbitrary_time_values(self, tmp_path, capsys):
        """
        This test should create the log, and then print nothing at all.
        """
        file_name = 'user_parameters.yaml'
        p, f = utilities.create_temporary_file(tmp_path, file_name)
        utilities.write_parameter_to_file(f, 'out_dir', tmp_path / 'out_dir')
        f.close()
        _delta = DeltaModel(input_file=p)

        _delta.logger = mock.MagicMock()

        # change values
        _delta._time = 3.14159
        _delta._time_iter = 42

        _delta.log_model_time()

        # will record whatever value is in _delta
        _calls = [mock.call('Time: 3.1; timestep: 42')]
        _delta.logger.info.assert_has_calls(_calls)
Exemplo n.º 6
0
    def test_verbose_printing_2(self, tmp_path, capsys):
        """
        This test should create the log, and then print nothing at all.
        """
        file_name = 'user_parameters.yaml'
        p, f = utilities.create_temporary_file(tmp_path, file_name)
        utilities.write_parameter_to_file(f, 'out_dir', tmp_path / 'out_dir')
        utilities.write_parameter_to_file(f, 'verbose', 2)
        f.close()
        _delta = DeltaModel(input_file=p)

        _delta.logger = mock.MagicMock()

        _delta.log_model_time()

        # time is logged regardless of verbosity
        _calls = [mock.call('Time: 0.0; timestep: 0')]
        _delta.logger.info.assert_has_calls(_calls)

        # stdout is empty because verbose 2
        captd = capsys.readouterr()
        assert 'Time: 0.0' in captd.out  # if verbose >= 1
Exemplo n.º 7
0
    def test_save_a_checkpoint_checkpoint_true_timewarning(self, tmp_path):
        # create a delta with subsidence parameters
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {
            'save_checkpoint': True,
            'checkpoint_dt': 864000000
        })
        _delta = DeltaModel(input_file=p)

        # force the time to be greater than the checkpoint interval
        _delta._save_time_since_checkpoint = 2 * _delta._checkpoint_dt

        # mock the actual save checkpoint function to see if it was called
        _delta.save_the_checkpoint = mock.MagicMock()

        # this warning is only written to log, so mock the logger
        _delta.logger = mock.MagicMock()

        # run the output checkpoint func
        _delta.output_checkpoint()

        # assertions
        assert (_delta.save_the_checkpoint.call_count == 1)
        assert (_delta.logger.warning.call_count == 1)
Exemplo n.º 8
0
    def test_load_wo_netcdf_not_expected(self, patched, tmp_path):
        """
        Test that a checkpoint can be loaded when the load does not expect
        there to be any netcdf file.
        """
        # create one delta, just to have a checkpoint file
        p = utilities.yaml_from_dict(tmp_path, 'input.yaml',
                                     {'save_checkpoint': True})
        _delta = DeltaModel(input_file=p)

        # make mocks
        _delta.log_info = mock.MagicMock()
        _delta.logger = mock.MagicMock()
        _delta.init_output_file = mock.MagicMock()

        assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz'))
        assert not os.path.isfile(
            os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc'))

        # now mess up a field
        _eta0 = np.copy(_delta.eta)
        _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape)
        _delta.eta = _rand_field
        assert np.all(_delta.eta == _rand_field)

        # now resume from the checkpoint to restore the field
        _delta.load_checkpoint()

        # check that fields match
        assert np.all(_delta.eta == _eta0)

        # assertions on function calls
        _delta.log_info.assert_called()
        _delta.logger.assert_not_called()
        _delta.init_output_file.assert_not_called()
        patched.assert_called()