Skip to content

changes in docstrings, gsmt output as dict, percentiles as string #90

changes in docstrings, gsmt output as dict, percentiles as string

changes in docstrings, gsmt output as dict, percentiles as string #90

GitHub Actions / Unit Test Results Python 3.9 failed Nov 6, 2023 in 0s

13 fail, 636 pass in 8m 33s

649 tests  ±0   636 ✔️  - 3   8m 33s ⏱️ -30s
    1 suites ±0       0 💤 ±0 
    1 files   ±0     13 +3 

Results for commit a5a1058. ± Comparison against earlier commit 2a4b05e.

Annotations

Check warning on line 0 in climada.hazard.test.test_tc_cc.TestKnutson

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_get_gmst_pass (climada.hazard.test.test_tc_cc.TestKnutson) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_tc_cc.TestKnutson testMethod=test_get_gmst_pass>

    def test_get_gmst_pass(self):
        """Test get_gmst_info function."""
>       gmst_data, gmst_start_year, gmst_end_year, rcps = tc_cc.get_gmst_info()

climada/hazard/test/test_tc_cc.py:46: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_tc_cc.TestKnutson

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_get_knutson_scaling_pass (climada.hazard.test.test_tc_cc.TestKnutson) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_tc_cc.TestKnutson testMethod=test_get_knutson_scaling_pass>

    def test_get_knutson_scaling_pass(self):
        """Test get_knutson_criterion function."""
>       criterion = tc_cc.get_knutson_scaling_factor()

climada/hazard/test/test_tc_cc.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/tc_clim_change.py:99: in get_knutson_scaling_factor
    gmst_info = get_gmst_info()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_memory_limit (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_memory_limit>

    def test_memory_limit(self):
        """Test from_tracks when memory is (very) limited"""
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK)
        tc_track.equal_timestep()
        tc_track.data = tc_track.data[:1]
        # A very low memory constraint forces the algorithm to split the track into chunks.
        # This should not affect the results. In practice, chunking is not applied due to limited
        # memory, but due to very high spatial/temporal resolution of the centroids/tracks. We
        # simulate this situation by artificially reducing the available memory.
>       tc_haz = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB, max_memory_gb=0.001)

climada/hazard/test/test_trop_cyclone.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 223)
Coordinates:
  * time                    (time) datetime64[ns...
    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,..., 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
       286, 287, 288, 289, 290, 291, 292, 293, 294, 295])
model = 'H08', store_windfields = False, metric = 'equirect'
intensity_thres = 17.5, max_dist_eye_km = 300, max_memory_gb = 0.001

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_set_one_file_pass (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_set_one_file_pass>

    def test_set_one_file_pass(self):
        """Test from_tracks with one input."""
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK_SHORT)
>       tc_haz = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB)

climada/hazard/test/test_trop_cyclone.py:201: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 9)
Coordinates:
  * time                    (time) datetime64[ns] ...    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 -1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([], dtype=int64), model = 'H08', store_windfields = False
metric = 'equirect', intensity_thres = 17.5, max_dist_eye_km = 300
max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_set_one_pass (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_set_one_pass>

    def test_set_one_pass(self):
        """Test _tc_from_track function."""
        intensity_idx = [0, 1, 2,  3,  80, 100, 120, 200, 220, 250, 260, 295]
        intensity_values = {
            "geosphere": [25.60794285, 26.90906280, 28.26649026, 25.54076797, 31.21986961,
                          36.17171808, 21.11408573, 28.01457948, 32.65349378, 31.34027741, 0,
                          40.27362679],
            "equirect": [25.60778909, 26.90887264, 28.26624642, 25.54092386, 31.21941738,
                         36.16596567, 21.11399856, 28.01452136, 32.65076804, 31.33884098, 0,
                         40.27002104]
        }
        # the values for the two metrics should agree up to first digit at least
        for i, val in enumerate(intensity_values["geosphere"]):
            self.assertAlmostEqual(intensity_values["equirect"][i], val, 1)
    
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK)
        tc_track.equal_timestep()
        tc_track.data = tc_track.data[:1]
    
        for metric in ["equirect", "geosphere"]:
>           tc_haz = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB, model='H08',
                                             store_windfields=True, metric=metric)

climada/hazard/test/test_trop_cyclone.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 223)
Coordinates:
  * time                    (time) datetime64[ns...
    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,..., 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
       286, 287, 288, 289, 290, 291, 292, 293, 294, 295])
model = 'H08', store_windfields = True, metric = 'equirect'
intensity_thres = 17.5, max_dist_eye_km = 300, max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_two_files_pass (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_two_files_pass>

    def test_two_files_pass(self):
        """Test from_tracks with two ibtracs."""
        tc_track = TCTracks.from_processed_ibtracs_csv([TEST_TRACK_SHORT, TEST_TRACK_SHORT])
>       tc_haz = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB)

climada/hazard/test/test_trop_cyclone.py:226: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 9)
Coordinates:
  * time                    (time) datetime64[ns] ...    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 -1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([], dtype=int64), model = 'H08', store_windfields = False
metric = 'equirect', intensity_thres = 17.5, max_dist_eye_km = 300
max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_windfield_models (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_windfield_models>

    def test_windfield_models(self):
        """Test _tc_from_track function with different wind field models."""
        intensity_idx = [0, 1, 2,  3,  80, 100, 120, 200, 220, 250, 260, 295]
        intensity_values = {
            "H08": [25.60778909, 26.90887264, 28.26624642, 25.54092386, 31.21941738, 36.16596567,
                    21.11399856, 28.01452136, 32.65076804, 31.33884098, 0, 40.27002104],
            "H10": [27.604317, 28.720708, 29.894993, 27.52234 , 32.512395, 37.114355,
                    23.848917, 29.614752, 33.775593, 32.545347, 19.957627, 41.014578],
            # Holland 1980 and Emanuel & Rotunno 2011 use recorded wind speeds, while the above use
            # pressure values only. That's why the results are so different:
            "H1980": [21.376807, 21.957217, 22.569568, 21.284351, 24.254226, 26.971303,
                      19.220149, 21.984516, 24.196388, 23.449116,  0, 31.550207],
            "ER11": [23.565332, 24.931413, 26.360758, 23.490333, 29.601171, 34.522795,
                     18.996389, 26.102109, 30.780737, 29.498453,  0, 38.368805],
        }
    
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK)
        tc_track.equal_timestep()
        tc_track.data = tc_track.data[:1]
    
        for model in ["H08", "H10", "H1980", "ER11"]:
>           tc_haz = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB, model=model)

climada/hazard/test/test_trop_cyclone.py:147: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 223)
Coordinates:
  * time                    (time) datetime64[ns...
    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,..., 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
       286, 287, 288, 289, 290, 291, 292, 293, 294, 295])
model = 'H08', store_windfields = False, metric = 'equirect'
intensity_thres = 17.5, max_dist_eye_km = 300, max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestReader

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_windfield_models_different_windunits (climada.hazard.test.test_trop_cyclone.TestReader) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestReader testMethod=test_windfield_models_different_windunits>

    def test_windfield_models_different_windunits(self):
        """
        Test _tc_from_track function should calculate the same results or raise ValueError
         with different windspeed units.
         """
        intensity_idx = [0, 1, 2,  3,  80, 100, 120, 200, 220, 250, 260, 295]
        intensity_values = {
            # Holland 1980 and Emanuel & Rotunno 2011 use recorded wind speeds, that is why checking them for different
            # windspeed units is so important:
            "H1980": [21.376807, 21.957217, 22.569568, 21.284351, 24.254226, 26.971303,
                      19.220149, 21.984516, 24.196388, 23.449116,  0, 31.550207],
            "ER11": [23.565332, 24.931413, 26.360758, 23.490333, 29.601171, 34.522795,
                     18.996389, 26.102109, 30.780737, 29.498453,  0, 38.368805],
        }
    
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK)
        tc_track.equal_timestep()
        tc_track.data = tc_track.data[:1]
    
        tc_track_kmph = TCTracks(data=[ds.copy(deep=True) for ds in tc_track.data])
        tc_track_kmph.data[0]['max_sustained_wind'] *= (
            (1.0 * ureg.knot).to(ureg.km / ureg.hour).magnitude
        )
        tc_track_kmph.data[0].attrs['max_sustained_wind_unit'] = 'km/h'
    
        tc_track_mps = TCTracks(data=[ds.copy(deep=True) for ds in tc_track.data])
        tc_track_mps.data[0]['max_sustained_wind'] *= (
            (1.0 * ureg.knot).to(ureg.meter / ureg.second).magnitude
        )
        tc_track_mps.data[0].attrs['max_sustained_wind_unit'] = 'm/s'
    
        for model in ["H1980", "ER11"]:
            for tc_track_i in [tc_track_kmph, tc_track_mps]:
>               tc_haz = TropCyclone.from_tracks(tc_track_i, centroids=CENTR_TEST_BRB, model=model)

climada/hazard/test/test_trop_cyclone.py:187: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 223)
Coordinates:
  * time                    (time) datetime64[ns...
    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,
        13,  14,  15,  16,  17,  18,  19,  20,..., 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
       286, 287, 288, 289, 290, 291, 292, 293, 294, 295])
model = 'H1980', store_windfields = False, metric = 'equirect'
intensity_thres = 17.5, max_dist_eye_km = 300, max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestClimateSce

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_apply_climate_scenario_track (climada.hazard.test.test_trop_cyclone.TestClimateSce) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_trop_cyclone.TestClimateSce testMethod=test_apply_climate_scenario_track>

    def test_apply_climate_scenario_track(self):
        """Test _apply_criterion function."""
        intensity = np.zeros((4, 10))
        intensity[0, :] = np.arange(10)
        intensity[1, 5] = 10
        intensity[2, :] = np.arange(10, 20)
        intensity[3, 3] = 3
        tc = TropCyclone(
            intensity=sparse.csr_matrix(intensity),
            basin=['NA', 'NA', 'NA', 'NO'],
            category=np.array([2, 0, 4, 1]),
            event_id=np.arange(4),
            frequency=np.ones(4) * 0.5,
        )
    
>       tc_cc = tc.apply_climate_scenario_knu(ref_year=2050, rcp_scenario=45)

climada/hazard/test/test_trop_cyclone.py:422: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:396: in apply_climate_scenario_knu
    scale_year_rcp_05, scale_year_rcp_45 = [
climada/hazard/trop_cyclone.py:397: in <listcomp>
    get_knutson_scaling_factor(
climada/hazard/tc_clim_change.py:99: in get_knutson_scaling_factor
    gmst_info = get_gmst_info()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestClimateSce

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_apply_criterion_track (climada.hazard.test.test_trop_cyclone.TestClimateSce) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_trop_cyclone.TestClimateSce testMethod=test_apply_criterion_track>

    def test_apply_criterion_track(self):
        """Test _apply_criterion function."""
        criterion = [
                {'basin': 'NA', 'category': [1, 2, 3, 4, 5],
                 'year': 2100, 'change': 1.045}
                   ]
        scale = 0.75
    
        # artificially increase the size of
        # the hazard by repeating (tiling) the data:
        ntiles = 8
    
        intensity = np.zeros((4, 10))
        intensity[0, :] = np.arange(10)
        intensity[1, 5] = 10
        intensity[2, :] = np.arange(10, 20)
        intensity[3, 3] = 3
        intensity = np.tile(intensity, (ntiles, 1))
        tc = TropCyclone(
            intensity=sparse.csr_matrix(intensity),
            basin=ntiles * ['NA', 'NA', 'NA', 'WP'],
            frequency=np.repeat(1/(4*ntiles), 4*ntiles),
            category=np.array(ntiles * [2, 0, 4, 1]),
            event_id=np.arange(intensity.shape[0]),
        )
    
>       tc_cc = tc.apply_climate_scenario_knu()

climada/hazard/test/test_trop_cyclone.py:462: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:396: in apply_climate_scenario_knu
    scale_year_rcp_05, scale_year_rcp_45 = [
climada/hazard/trop_cyclone.py:397: in <listcomp>
    get_knutson_scaling_factor(
climada/hazard/tc_clim_change.py:99: in get_knutson_scaling_factor
    gmst_info = get_gmst_info()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestClimateSce

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_no_negative_freq (climada.hazard.test.test_trop_cyclone.TestClimateSce) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_trop_cyclone.TestClimateSce testMethod=test_no_negative_freq>

    def test_no_negative_freq(self):
        """Test apply_climate_scenario_knu with too high changes and check
        that no negative frequencies are returned."""
        criterion = [{'basin': 'SP', 'category': [0, 1],
                      'year': 2100, 'change': 0.5}
                     ]
    
        tc = TropCyclone(
            frequency=np.ones(2),
            basin=['SP', 'SP'],
            category=np.array([0, 1]),
        )
    
>       tc_cc = tc.apply_climate_scenario_knu(criterion, 3)

climada/hazard/test/test_trop_cyclone.py:533: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:396: in apply_climate_scenario_knu
    scale_year_rcp_05, scale_year_rcp_45 = [
climada/hazard/trop_cyclone.py:397: in <listcomp>
    get_knutson_scaling_factor(
climada/hazard/tc_clim_change.py:99: in get_knutson_scaling_factor
    gmst_info = get_gmst_info()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestClimateSce

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_two_criterion_track (climada.hazard.test.test_trop_cyclone.TestClimateSce) failed

tests_xml/tests.xml [took 0s]
Raw output
TypeError: 'dict' object is not callable
self = <climada.hazard.test.test_trop_cyclone.TestClimateSce testMethod=test_two_criterion_track>

    def test_two_criterion_track(self):
        """Test apply_climate_scenario_knu function with two criteria"""
        criterion = [
            {'basin': 'WP', 'category': [1, 2, 3, 4, 5],
             'year': 2100, 'change': 1.025},
            {'basin': 'NA', 'category': [0, 1, 2, 3, 4, 5],
             'year': 2100, 'change': 0.7},
            {'basin': 'NA', 'category': [1, 2, 3, 4, 5],
             'year': 2100, 'change': 1},
            {'basin': 'NA', 'category': [3, 4, 5],
             'year': 2100, 'change': 1},
            {'basin': 'NA', 'category': [4, 5],
             'year': 2100, 'change': 2}
            ]
        scale = 0.75
    
        intensity = np.zeros((4, 10))
        intensity[0, :] = np.arange(10)
        intensity[1, 5] = 10
        intensity[2, :] = np.arange(10, 20)
        intensity[3, 3] = 3
        tc = TropCyclone(
            intensity=sparse.csr_matrix(intensity),
            frequency=np.ones(4) * 0.5,
            basin=['NA', 'NA', 'NA', 'WP'],
            category=np.array([2, 0, 4, 1]),
            event_id=np.arange(4),
        )
    
>       tc_cc = tc.apply_climate_scenario_knu(criterion, scale)

climada/hazard/test/test_trop_cyclone.py:512: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:396: in apply_climate_scenario_knu
    scale_year_rcp_05, scale_year_rcp_45 = [
climada/hazard/trop_cyclone.py:397: in <listcomp>
    get_knutson_scaling_factor(
climada/hazard/tc_clim_change.py:99: in get_knutson_scaling_factor
    gmst_info = get_gmst_info()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def get_gmst_info():
        """
        Get Global Mean Surface Temperature (GMST) data from 1880 to 2100 for
        RCPs 2.6, 4.5, 6.0 and 8.5.
    
        Returns
        -------
        gmst_info : dict
            dictionary with keys:
            - rcps: list of strings referring to RCPs 2.6, 4.5, 6.0 and 8.5
            - gmst_start_year: integer with the GMST data starting year, 1880
            - gmst_start_year: integer with the GMST data ending year, 2100
            - gmst_data: array with GMST data across RCPs (first dim) and years (second dim)
        """
    
        gmst_info = {}
    
        gmst_info.update({'rcps' : ['2.6', '4.5', '6.0', '8.5']})
>       gmst_info({'gmst_start_year' : 1880})
E       TypeError: 'dict' object is not callable

climada/hazard/tc_clim_change.py:193: TypeError

Check warning on line 0 in climada.hazard.test.test_trop_cyclone.TestDumpReloadCycle

See this annotation in the file changed.

@github-actions github-actions / Unit Test Results Python 3.9

test_dump_reload_hdf5 (climada.hazard.test.test_trop_cyclone.TestDumpReloadCycle) failed

tests_xml/tests.xml [took 0s]
Raw output
NameError: name '_compute_windfields_sparse' is not defined
self = <climada.hazard.test.test_trop_cyclone.TestDumpReloadCycle testMethod=test_dump_reload_hdf5>

    def setUp(self):
        """Create a TropCyclone object and a temporary directory"""
        self.tempdir = TemporaryDirectory()
        tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK_SHORT)
>       self.tc_hazard = TropCyclone.from_tracks(tc_track, centroids=CENTR_TEST_BRB)

climada/hazard/test/test_trop_cyclone.py:541: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
climada/hazard/trop_cyclone.py:321: in from_tracks
    cls.from_single_track(track, centroids, coastal_idx,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'climada.hazard.trop_cyclone.TropCyclone'>
track = <xarray.Dataset>
Dimensions:                 (time: 9)
Coordinates:
  * time                    (time) datetime64[ns] ...    data_provider:            hurdat_atl
    id_no:                    1951239012334.0
    category:                 -1
centroids = <climada.hazard.centroids.centr.Centroids object at 0x7f498d527f40>
coastal_idx = array([], dtype=int64), model = 'H08', store_windfields = False
metric = 'equirect', intensity_thres = 17.5, max_dist_eye_km = 300
max_memory_gb = 8

    @classmethod
    def from_single_track(
        cls,
        track: xr.Dataset,
        centroids: Centroids,
        coastal_idx: np.ndarray,
        model: str = 'H08',
        store_windfields: bool = False,
        metric: str = "equirect",
        intensity_thres: float = DEF_INTENSITY_THRES,
        max_dist_eye_km: float = DEF_MAX_DIST_EYE_KM,
        max_memory_gb: float = DEF_MAX_MEMORY_GB,
    ):
        """
        Generate windfield hazard from a single track dataset
    
        Parameters
        ----------
        track : xr.Dataset
            Single tropical cyclone track.
        centroids : Centroids
            Centroids instance.
        coastal_idx : np.ndarray
            Indices of centroids close to coast.
        model : str, optional
            Parametric wind field model, one of "H1980" (the prominent Holland 1980 model),
            "H08" (Holland 1980 with b-value from Holland 2008), "H10" (Holland et al. 2010), or
            "ER11" (Emanuel and Rotunno 2011).
            Default: "H08".
        store_windfields : boolean, optional
            If True, store windfields. Default: False.
        metric : str, optional
            Specify an approximation method to use for earth distances: "equirect" (faster) or
            "geosphere" (more accurate). See `dist_approx` function in `climada.util.coordinates`.
            Default: "equirect".
        intensity_thres : float, optional
            Wind speeds (in m/s) below this threshold are stored as 0. Default: 17.5
        max_dist_eye_km : float, optional
            No wind speed calculation is done for centroids with a distance (in km) to the TC
            center ("eye") larger than this parameter. Default: 300
        max_memory_gb : float, optional
            To avoid memory issues, the computation is done for chunks of the track sequentially.
            The chunk size is determined depending on the available memory (in GB). Default: 8
    
        Raises
        ------
        ValueError, KeyError
    
        Returns
        -------
        haz : TropCyclone
        """
>       intensity_sparse, windfields_sparse = _compute_windfields_sparse(
            track=track,
            centroids=centroids,
            coastal_idx=coastal_idx,
            model=model,
            store_windfields=store_windfields,
            metric=metric,
            intensity_thres=intensity_thres,
            max_dist_eye_km=max_dist_eye_km,
            max_memory_gb=max_memory_gb,
        )
E       NameError: name '_compute_windfields_sparse' is not defined

climada/hazard/trop_cyclone.py:602: NameError