diff --git a/climada/engine/test/test_forecast.py b/climada/engine/test/test_forecast.py index 8e80cb4fe..4180ec1f7 100644 --- a/climada/engine/test/test_forecast.py +++ b/climada/engine/test/test_forecast.py @@ -23,7 +23,6 @@ import unittest from pathlib import Path -import fiona import geopandas as gpd import matplotlib.pyplot as plt import numpy as np @@ -147,12 +146,7 @@ def test_Forecast_plot(self): adm1_shape_file = shapereader.natural_earth( resolution="10m", category="cultural", name="admin_1_states_provinces" ) - if not cantons_file.exists(): - with fiona.open(adm1_shape_file, "r") as source: - with fiona.open(cantons_file, "w", **source.meta) as sink: - for f in source: - if f["properties"]["adm0_a3"] == "CHE": - sink.write(f) + ## test plotting functions # should save plot without failing forecast.plot_imp_map( diff --git a/climada/engine/test/test_impact_calc.py b/climada/engine/test/test_impact_calc.py index 8a004cf67..9acf96511 100644 --- a/climada/engine/test/test_impact_calc.py +++ b/climada/engine/test/test_impact_calc.py @@ -244,40 +244,80 @@ def test_calc_impact_RF_pass(self): 0.00000000e00, ] ) - # fmt: off imp_mat_array = np.array( [ [ - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 0.00000000e00, 6.41965663e04, 0.00000000e00, 2.02249434e02, - 3.41245461e04, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 6.41965663e04, + 0.00000000e00, + 2.02249434e02, + 3.41245461e04, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 3.41245461e04, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 3.41245461e04, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 7.73566566e07, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 7.73566566e07, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], [ - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, - 0.00000000e00, 0.00000000e00, 0.00000000e00, 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, ], ] ) - # fmt: on check_impact(self, impact, haz, exp, aai_agg, eai_exp, at_event, imp_mat_array) def test_empty_impact(self): diff --git a/climada/entity/impact_funcs/trop_cyclone.py b/climada/entity/impact_funcs/trop_cyclone.py index 692e0ef92..18492bbb1 100644 --- a/climada/entity/impact_funcs/trop_cyclone.py +++ b/climada/entity/impact_funcs/trop_cyclone.py @@ -311,26 +311,123 @@ def get_countries_per_region(region=None): """ if not region: region = "all" - # fmt: off iso3n = { "NA1": [ - 660, 28, 32, 533, 44, 52, 84, 60, 68, 132, - 136, 152, 170, 188, 192, 212, 214, 218, 222, 238, - 254, 308, 312, 320, 328, 332, 340, 388, 474, 484, - 500, 558, 591, 600, 604, 630, 654, 659, 662, 670, - 534, 740, 780, 796, 858, 862, 92, 850, + 660, + 28, + 32, + 533, + 44, + 52, + 84, + 60, + 68, + 132, + 136, + 152, + 170, + 188, + 192, + 212, + 214, + 218, + 222, + 238, + 254, + 308, + 312, + 320, + 328, + 332, + 340, + 388, + 474, + 484, + 500, + 558, + 591, + 600, + 604, + 630, + 654, + 659, + 662, + 670, + 534, + 740, + 780, + 796, + 858, + 862, + 92, + 850, ], "NA2": [124, 840], "NI": [ - 4, 51, 31, 48, 50, 64, 262, 232, 231, 268, - 356, 364, 368, 376, 400, 398, 414, 417, 422, 462, - 496, 104, 524, 512, 586, 634, 682, 706, 144, 760, - 762, 795, 800, 784, 860, 887, + 4, + 51, + 31, + 48, + 50, + 64, + 262, + 232, + 231, + 268, + 356, + 364, + 368, + 376, + 400, + 398, + 414, + 417, + 422, + 462, + 496, + 104, + 524, + 512, + 586, + 634, + 682, + 706, + 144, + 760, + 762, + 795, + 800, + 784, + 860, + 887, ], "OC": [ - 16, 36, 184, 242, 258, 316, 296, 584, 583, 520, - 540, 554, 570, 574, 580, 585, 598, 612, 882, 90, - 626, 772, 776, 798, 548, 876, + 16, + 36, + 184, + 242, + 258, + 316, + 296, + 584, + 583, + 520, + 540, + 554, + 570, + 574, + 580, + 585, + 598, + 612, + 882, + 90, + 626, + 772, + 776, + 798, + 548, + 876, ], "SI": [174, 180, 748, 450, 454, 466, 480, 508, 710, 834, 716], "WP1": [116, 360, 418, 458, 764, 704], @@ -338,42 +435,251 @@ def get_countries_per_region(region=None): "WP3": [156], "WP4": [344, 392, 410, 446, 158], "ROW": [ - 8, 12, 20, 24, 10, 40, 112, 56, 204, 535, - 70, 72, 74, 76, 86, 96, 100, 854, 108, 120, - 140, 148, 162, 166, 178, 191, 531, 196, 203, 384, - 208, 818, 226, 233, 234, 246, 250, 260, 266, 270, - 276, 288, 292, 300, 304, 831, 324, 624, 334, 336, - 348, 352, 372, 833, 380, 832, 404, 408, 983, 428, - 426, 430, 434, 438, 440, 442, 470, 478, 175, 498, - 492, 499, 504, 516, 528, 562, 566, 807, 578, 275, - 616, 620, 642, 643, 646, 638, 652, 663, 666, 674, - 678, 686, 688, 690, 694, 702, 703, 705, 239, 728, - 724, 729, 744, 752, 756, 768, 788, 792, 804, 826, - 581, 732, 894, 248, + 8, + 12, + 20, + 24, + 10, + 40, + 112, + 56, + 204, + 535, + 70, + 72, + 74, + 76, + 86, + 96, + 100, + 854, + 108, + 120, + 140, + 148, + 162, + 166, + 178, + 191, + 531, + 196, + 203, + 384, + 208, + 818, + 226, + 233, + 234, + 246, + 250, + 260, + 266, + 270, + 276, + 288, + 292, + 300, + 304, + 831, + 324, + 624, + 334, + 336, + 348, + 352, + 372, + 833, + 380, + 832, + 404, + 408, + 983, + 428, + 426, + 430, + 434, + 438, + 440, + 442, + 470, + 478, + 175, + 498, + 492, + 499, + 504, + 516, + 528, + 562, + 566, + 807, + 578, + 275, + 616, + 620, + 642, + 643, + 646, + 638, + 652, + 663, + 666, + 674, + 678, + 686, + 688, + 690, + 694, + 702, + 703, + 705, + 239, + 728, + 724, + 729, + 744, + 752, + 756, + 768, + 788, + 792, + 804, + 826, + 581, + 732, + 894, + 248, ], } iso3a = { "NA1": [ - "AIA", "ATG", "ARG", "ABW", "BHS", "BRB", "BLZ", "BMU", "BOL", "CPV", - "CYM", "CHL", "COL", "CRI", "CUB", "DMA", "DOM", "ECU", "SLV", "FLK", - "GUF", "GRD", "GLP", "GTM", "GUY", "HTI", "HND", "JAM", "MTQ", "MEX", - "MSR", "NIC", "PAN", "PRY", "PER", "PRI", "SHN", "KNA", "LCA", "VCT", - "SXM", "SUR", "TTO", "TCA", "URY", "VEN", "VGB", "VIR", + "AIA", + "ATG", + "ARG", + "ABW", + "BHS", + "BRB", + "BLZ", + "BMU", + "BOL", + "CPV", + "CYM", + "CHL", + "COL", + "CRI", + "CUB", + "DMA", + "DOM", + "ECU", + "SLV", + "FLK", + "GUF", + "GRD", + "GLP", + "GTM", + "GUY", + "HTI", + "HND", + "JAM", + "MTQ", + "MEX", + "MSR", + "NIC", + "PAN", + "PRY", + "PER", + "PRI", + "SHN", + "KNA", + "LCA", + "VCT", + "SXM", + "SUR", + "TTO", + "TCA", + "URY", + "VEN", + "VGB", + "VIR", ], "NA2": ["CAN", "USA"], "NI": [ - "AFG", "ARM", "AZE", "BHR", "BGD", "BTN", "DJI", "ERI", "ETH", "GEO", - "IND", "IRN", "IRQ", "ISR", "JOR", "KAZ", "KWT", "KGZ", "LBN", "MDV", - "MNG", "MMR", "NPL", "OMN", "PAK", "QAT", "SAU", "SOM", "LKA", "SYR", - "TJK", "TKM", "UGA", "ARE", "UZB", "YEM", + "AFG", + "ARM", + "AZE", + "BHR", + "BGD", + "BTN", + "DJI", + "ERI", + "ETH", + "GEO", + "IND", + "IRN", + "IRQ", + "ISR", + "JOR", + "KAZ", + "KWT", + "KGZ", + "LBN", + "MDV", + "MNG", + "MMR", + "NPL", + "OMN", + "PAK", + "QAT", + "SAU", + "SOM", + "LKA", + "SYR", + "TJK", + "TKM", + "UGA", + "ARE", + "UZB", + "YEM", ], "OC": [ - "ASM", "AUS", "COK", "FJI", "PYF", "GUM", "KIR", "MHL", "FSM", "NRU", - "NCL", "NZL", "NIU", "NFK", "MNP", "PLW", "PNG", "PCN", "WSM", "SLB", - "TLS", "TKL", "TON", "TUV", "VUT", "WLF", + "ASM", + "AUS", + "COK", + "FJI", + "PYF", + "GUM", + "KIR", + "MHL", + "FSM", + "NRU", + "NCL", + "NZL", + "NIU", + "NFK", + "MNP", + "PLW", + "PNG", + "PCN", + "WSM", + "SLB", + "TLS", + "TKL", + "TON", + "TUV", + "VUT", + "WLF", ], "SI": [ - "COM", "COD", "SWZ", "MDG", "MWI", "MLI", "MUS", "MOZ", "ZAF", "TZA", + "COM", + "COD", + "SWZ", + "MDG", + "MWI", + "MLI", + "MUS", + "MOZ", + "ZAF", + "TZA", "ZWE", ], "WP1": ["KHM", "IDN", "LAO", "MYS", "THA", "VNM"], @@ -381,21 +687,122 @@ def get_countries_per_region(region=None): "WP3": ["CHN"], "WP4": ["HKG", "JPN", "KOR", "MAC", "TWN"], "ROW": [ - "ALB", "DZA", "AND", "AGO", "ATA", "AUT", "BLR", "BEL", "BEN", "BES", - "BIH", "BWA", "BVT", "BRA", "IOT", "BRN", "BGR", "BFA", "BDI", "CMR", - "CAF", "TCD", "CXR", "CCK", "COG", "HRV", "CUW", "CYP", "CZE", "CIV", - "DNK", "EGY", "GNQ", "EST", "FRO", "FIN", "FRA", "ATF", "GAB", "GMB", - "DEU", "GHA", "GIB", "GRC", "GRL", "GGY", "GIN", "GNB", "HMD", "VAT", - "HUN", "ISL", "IRL", "IMN", "ITA", "JEY", "KEN", "PRK", "XKX", "LVA", - "LSO", "LBR", "LBY", "LIE", "LTU", "LUX", "MLT", "MRT", "MYT", "MDA", - "MCO", "MNE", "MAR", "NAM", "NLD", "NER", "NGA", "MKD", "NOR", "PSE", - "POL", "PRT", "ROU", "RUS", "RWA", "REU", "BLM", "MAF", "SPM", "SMR", - "STP", "SEN", "SRB", "SYC", "SLE", "SGP", "SVK", "SVN", "SGS", "SSD", - "ESP", "SDN", "SJM", "SWE", "CHE", "TGO", "TUN", "TUR", "UKR", "GBR", - "UMI", "ESH", "ZMB", "ALA", + "ALB", + "DZA", + "AND", + "AGO", + "ATA", + "AUT", + "BLR", + "BEL", + "BEN", + "BES", + "BIH", + "BWA", + "BVT", + "BRA", + "IOT", + "BRN", + "BGR", + "BFA", + "BDI", + "CMR", + "CAF", + "TCD", + "CXR", + "CCK", + "COG", + "HRV", + "CUW", + "CYP", + "CZE", + "CIV", + "DNK", + "EGY", + "GNQ", + "EST", + "FRO", + "FIN", + "FRA", + "ATF", + "GAB", + "GMB", + "DEU", + "GHA", + "GIB", + "GRC", + "GRL", + "GGY", + "GIN", + "GNB", + "HMD", + "VAT", + "HUN", + "ISL", + "IRL", + "IMN", + "ITA", + "JEY", + "KEN", + "PRK", + "XKX", + "LVA", + "LSO", + "LBR", + "LBY", + "LIE", + "LTU", + "LUX", + "MLT", + "MRT", + "MYT", + "MDA", + "MCO", + "MNE", + "MAR", + "NAM", + "NLD", + "NER", + "NGA", + "MKD", + "NOR", + "PSE", + "POL", + "PRT", + "ROU", + "RUS", + "RWA", + "REU", + "BLM", + "MAF", + "SPM", + "SMR", + "STP", + "SEN", + "SRB", + "SYC", + "SLE", + "SGP", + "SVK", + "SVN", + "SGS", + "SSD", + "ESP", + "SDN", + "SJM", + "SWE", + "CHE", + "TGO", + "TUN", + "TUR", + "UKR", + "GBR", + "UMI", + "ESH", + "ZMB", + "ALA", ], } - # fmt: on impf_id = { "NA1": 1, "NA2": 2, diff --git a/climada/entity/measures/test/test_base.py b/climada/entity/measures/test/test_base.py index d8688e4bf..3cb5155c8 100644 --- a/climada/entity/measures/test/test_base.py +++ b/climada/entity/measures/test/test_base.py @@ -151,20 +151,84 @@ def test_cutoff_hazard_pass(self): new_haz = act_1._cutoff_hazard_damage(exp, imp_set, haz) self.assertFalse(id(new_haz) == id(haz)) - # fmt: off + pos_no_null = np.array( [ - 6249, 7697, 9134, 13500, 13199, 5944, 9052, 9050, 2429, 5139, - 9053, 7102, 4096, 1070, 5948, 1076, 5947, 7432, 5949, 11694, - 5484, 6246, 12147, 778, 3326, 7199, 12498, 11698, 6245, 5327, - 4819, 8677, 5970, 7101, 779, 3894, 9051, 5976, 3329, 5978, - 4282, 11697, 7193, 5351, 7310, 7478, 5489, 5526, 7194, 4283, - 7191, 5328, 4812, 5528, 5527, 5488, 7475, 5529, 776, 5758, - 4811, 6223, 7479, 7470, 5480, 5325, 7477, 7318, 7317, 11696, - 7313, 13165, 6221, + 6249, + 7697, + 9134, + 13500, + 13199, + 5944, + 9052, + 9050, + 2429, + 5139, + 9053, + 7102, + 4096, + 1070, + 5948, + 1076, + 5947, + 7432, + 5949, + 11694, + 5484, + 6246, + 12147, + 778, + 3326, + 7199, + 12498, + 11698, + 6245, + 5327, + 4819, + 8677, + 5970, + 7101, + 779, + 3894, + 9051, + 5976, + 3329, + 5978, + 4282, + 11697, + 7193, + 5351, + 7310, + 7478, + 5489, + 5526, + 7194, + 4283, + 7191, + 5328, + 4812, + 5528, + 5527, + 5488, + 7475, + 5529, + 776, + 5758, + 4811, + 6223, + 7479, + 7470, + 5480, + 5325, + 7477, + 7318, + 7317, + 11696, + 7313, + 13165, + 6221, ] ) - # fmt: on all_haz = np.arange(haz.intensity.shape[0]) all_haz[pos_no_null] = -1 pos_null = np.argwhere(all_haz > 0).reshape(-1) @@ -190,20 +254,83 @@ def test_cutoff_hazard_region_pass(self): self.assertFalse(id(new_haz) == id(haz)) - # fmt: off pos_no_null = np.array( [ - 6249, 7697, 9134, 13500, 13199, 5944, 9052, 9050, 2429, 5139, - 9053, 7102, 4096, 1070, 5948, 1076, 5947, 7432, 5949, 11694, - 5484, 6246, 12147, 778, 3326, 7199, 12498, 11698, 6245, 5327, - 4819, 8677, 5970, 7101, 779, 3894, 9051, 5976, 3329, 5978, - 4282, 11697, 7193, 5351, 7310, 7478, 5489, 5526, 7194, 4283, - 7191, 5328, 4812, 5528, 5527, 5488, 7475, 5529, 776, 5758, - 4811, 6223, 7479, 7470, 5480, 5325, 7477, 7318, 7317, 11696, - 7313, 13165, 6221, + 6249, + 7697, + 9134, + 13500, + 13199, + 5944, + 9052, + 9050, + 2429, + 5139, + 9053, + 7102, + 4096, + 1070, + 5948, + 1076, + 5947, + 7432, + 5949, + 11694, + 5484, + 6246, + 12147, + 778, + 3326, + 7199, + 12498, + 11698, + 6245, + 5327, + 4819, + 8677, + 5970, + 7101, + 779, + 3894, + 9051, + 5976, + 3329, + 5978, + 4282, + 11697, + 7193, + 5351, + 7310, + 7478, + 5489, + 5526, + 7194, + 4283, + 7191, + 5328, + 4812, + 5528, + 5527, + 5488, + 7475, + 5529, + 776, + 5758, + 4811, + 6223, + 7479, + 7470, + 5480, + 5325, + 7477, + 7318, + 7317, + 11696, + 7313, + 13165, + 6221, ] ) - # fmt: on all_haz = np.arange(haz.intensity.shape[0]) all_haz[pos_no_null] = -1 pos_null = np.argwhere(all_haz > 0).reshape(-1) diff --git a/climada/hazard/test/test_tc_tracks.py b/climada/hazard/test/test_tc_tracks.py index c42d5a7a1..df60bc83e 100644 --- a/climada/hazard/test/test_tc_tracks.py +++ b/climada/hazard/test/test_tc_tracks.py @@ -815,32 +815,90 @@ def test_interp_track_redundancy_pass(self): def test_interp_origin_pass(self): """Interpolate track to min_time_step crossing lat origin""" tc_track = tc.TCTracks.from_processed_ibtracs_csv(TEST_TRACK) - # fmt: off tc_track.data[0]["lon"].values = np.array( [ - 167.207761, 168.1, 168.936535, 169.728947, 170.5, - 171.257176, 171.946822, 172.5, 172.871797, 173.113396, - 173.3, 173.496375, 173.725522, 174.0, 174.331591, - 174.728961, 175.2, 175.747632, 176.354929, 177.0, - 177.66677, 178.362433, 179.1, 179.885288, -179.304661, - -178.5, -177.726442, -176.991938, -176.3, -175.653595, - -175.053513, -174.5, -173.992511, -173.527342, -173.1, - -172.705991, -172.340823, -172.0, + 167.207761, + 168.1, + 168.936535, + 169.728947, + 170.5, + 171.257176, + 171.946822, + 172.5, + 172.871797, + 173.113396, + 173.3, + 173.496375, + 173.725522, + 174.0, + 174.331591, + 174.728961, + 175.2, + 175.747632, + 176.354929, + 177.0, + 177.66677, + 178.362433, + 179.1, + 179.885288, + -179.304661, + -178.5, + -177.726442, + -176.991938, + -176.3, + -175.653595, + -175.053513, + -174.5, + -173.992511, + -173.527342, + -173.1, + -172.705991, + -172.340823, + -172.0, ] ) tc_track.data[0]["lat"].values = np.array( [ - 40.196053, 40.6, 40.930215, 41.215674, 41.5, - 41.816354, 42.156065, 42.5, 42.833998, 43.16377, - 43.5, 43.847656, 44.188854, 44.5, 44.764269, - 44.991925, 45.2, 45.402675, 45.602707, 45.8, - 45.995402, 46.193543, 46.4, 46.615718, 46.82312, - 47.0, 47.130616, 47.225088, 47.3, 47.369224, - 47.435786, 47.5, 47.562858, 47.628064, 47.7, - 47.783047, 47.881586, 48.0, + 40.196053, + 40.6, + 40.930215, + 41.215674, + 41.5, + 41.816354, + 42.156065, + 42.5, + 42.833998, + 43.16377, + 43.5, + 43.847656, + 44.188854, + 44.5, + 44.764269, + 44.991925, + 45.2, + 45.402675, + 45.602707, + 45.8, + 45.995402, + 46.193543, + 46.4, + 46.615718, + 46.82312, + 47.0, + 47.130616, + 47.225088, + 47.3, + 47.369224, + 47.435786, + 47.5, + 47.562858, + 47.628064, + 47.7, + 47.783047, + 47.881586, + 48.0, ] ) - # fmt: on tc_track.equal_timestep(time_step_h=1) self.assertEqual(tc_track.data[0]["time"].size, 223) @@ -876,33 +934,91 @@ def test_interp_origin_pass(self): def test_interp_origin_inv_pass(self): """Interpolate track to min_time_step crossing lat origin""" tc_track = tc.TCTracks.from_processed_ibtracs_csv(TEST_TRACK) - # fmt: off tc_track.data[0]["lon"].values = np.array( [ - 167.207761, 168.1, 168.936535, 169.728947, 170.5, - 171.257176, 171.946822, 172.5, 172.871797, 173.113396, - 173.3, 173.496375, 173.725522, 174.0, 174.331591, - 174.728961, 175.2, 175.747632, 176.354929, 177.0, - 177.66677, 178.362433, 179.1, 179.885288, -179.304661, - -178.5, -177.726442, -176.991938, -176.3, -175.653595, - -175.053513, -174.5, -173.992511, -173.527342, -173.1, - -172.705991, -172.340823, -172.0, + 167.207761, + 168.1, + 168.936535, + 169.728947, + 170.5, + 171.257176, + 171.946822, + 172.5, + 172.871797, + 173.113396, + 173.3, + 173.496375, + 173.725522, + 174.0, + 174.331591, + 174.728961, + 175.2, + 175.747632, + 176.354929, + 177.0, + 177.66677, + 178.362433, + 179.1, + 179.885288, + -179.304661, + -178.5, + -177.726442, + -176.991938, + -176.3, + -175.653595, + -175.053513, + -174.5, + -173.992511, + -173.527342, + -173.1, + -172.705991, + -172.340823, + -172.0, ] ) tc_track.data[0]["lon"].values = -tc_track.data[0]["lon"].values tc_track.data[0]["lat"].values = np.array( [ - 40.196053, 40.6, 40.930215, 41.215674, 41.5, - 41.816354, 42.156065, 42.5, 42.833998, 43.16377, - 43.5, 43.847656, 44.188854, 44.5, 44.764269, - 44.991925, 45.2, 45.402675, 45.602707, 45.8, - 45.995402, 46.193543, 46.4, 46.615718, 46.82312, - 47.0, 47.130616, 47.225088, 47.3, 47.369224, - 47.435786, 47.5, 47.562858, 47.628064, 47.7, - 47.783047, 47.881586, 48.0, + 40.196053, + 40.6, + 40.930215, + 41.215674, + 41.5, + 41.816354, + 42.156065, + 42.5, + 42.833998, + 43.16377, + 43.5, + 43.847656, + 44.188854, + 44.5, + 44.764269, + 44.991925, + 45.2, + 45.402675, + 45.602707, + 45.8, + 45.995402, + 46.193543, + 46.4, + 46.615718, + 46.82312, + 47.0, + 47.130616, + 47.225088, + 47.3, + 47.369224, + 47.435786, + 47.5, + 47.562858, + 47.628064, + 47.7, + 47.783047, + 47.881586, + 48.0, ] ) - # fmt: on tc_track.equal_timestep(time_step_h=1) self.assertEqual(tc_track.data[0]["time"].size, 223) diff --git a/climada/hazard/test/test_tc_tracks_synth.py b/climada/hazard/test/test_tc_tracks_synth.py index 4f35b05b3..f0b5c0b44 100644 --- a/climada/hazard/test/test_tc_tracks_synth.py +++ b/climada/hazard/test/test_tc_tracks_synth.py @@ -111,53 +111,119 @@ def test_apply_decay_pass(self): tc_synth._apply_land_decay( tc_track.data, v_rel, p_rel, land_geom, s_rel=True, check_plot=False ) - # fmt: off + p_ref = ( - np.array([ - 1.010000000000000, 1.009000000000000, 1.008000000000000, - 1.006000000000000, 1.003000000000000, 1.002000000000000, - 1.001000000000000, 1.000000000000000, 1.000000000000000, - 1.001000000000000, 1.002000000000000, 1.005000000000000, - 1.007000000000000, 1.010000000000000, 1.010000000000000, - 1.010000000000000, 1.010000000000000, 1.010000000000000, - 1.010000000000000, 1.007000000000000, 1.004000000000000, - 1.000000000000000, 0.994000000000000, 0.981000000000000, - 0.969000000000000, 0.961000000000000, 0.947000000000000, - 0.933000000000000, 0.922000000000000, 0.930000000000000, - 0.937000000000000, 0.951000000000000, 0.947000000000000, - 0.943000000000000, 0.948000000000000, 0.946000000000000, - 0.941000000000000, 0.937000000000000, 0.955000000000000, - 0.974145711700000, 0.992440689170000, 1.000867294920000, - 1.005458533550000, 1.008183546090000, 1.009418500230000, - 1.009861920530000, 1.009984005650000, - ]) + np.array( + [ + 1.010000000000000, + 1.009000000000000, + 1.008000000000000, + 1.006000000000000, + 1.003000000000000, + 1.002000000000000, + 1.001000000000000, + 1.000000000000000, + 1.000000000000000, + 1.001000000000000, + 1.002000000000000, + 1.005000000000000, + 1.007000000000000, + 1.010000000000000, + 1.010000000000000, + 1.010000000000000, + 1.010000000000000, + 1.010000000000000, + 1.010000000000000, + 1.007000000000000, + 1.004000000000000, + 1.000000000000000, + 0.994000000000000, + 0.981000000000000, + 0.969000000000000, + 0.961000000000000, + 0.947000000000000, + 0.933000000000000, + 0.922000000000000, + 0.930000000000000, + 0.937000000000000, + 0.951000000000000, + 0.947000000000000, + 0.943000000000000, + 0.948000000000000, + 0.946000000000000, + 0.941000000000000, + 0.937000000000000, + 0.955000000000000, + 0.9741457117, + 0.99244068917, + 1.00086729492, + 1.00545853355, + 1.00818354609, + 1.00941850023, + 1.00986192053, + 1.00998400565, + ] + ) * 1e3 ) self.assertTrue(np.allclose(p_ref, tc_track.data[0]["central_pressure"].values)) v_ref = ( - np.array([ - 0.250000000000000, 0.300000000000000, 0.300000000000000, - 0.350000000000000, 0.350000000000000, 0.400000000000000, - 0.450000000000000, 0.450000000000000, 0.450000000000000, - 0.450000000000000, 0.450000000000000, 0.450000000000000, - 0.450000000000000, 0.400000000000000, 0.400000000000000, - 0.400000000000000, 0.400000000000000, 0.450000000000000, - 0.450000000000000, 0.500000000000000, 0.500000000000000, - 0.550000000000000, 0.650000000000000, 0.800000000000000, - 0.950000000000000, 1.100000000000000, 1.300000000000000, - 1.450000000000000, 1.500000000000000, 1.250000000000000, - 1.300000000000000, 1.150000000000000, 1.150000000000000, - 1.150000000000000, 1.150000000000000, 1.200000000000000, - 1.250000000000000, 1.250000000000000, 1.200000000000000, - 0.973796735300000, 0.687255951000000, 0.499485055600000, - 0.355148046200000, 0.227054803600000, 0.130209955700000, - 0.064538591800000, 0.022532585100000, - ]) + np.array( + [ + 0.250000000000000, + 0.300000000000000, + 0.300000000000000, + 0.350000000000000, + 0.350000000000000, + 0.400000000000000, + 0.450000000000000, + 0.450000000000000, + 0.450000000000000, + 0.450000000000000, + 0.450000000000000, + 0.450000000000000, + 0.450000000000000, + 0.400000000000000, + 0.400000000000000, + 0.400000000000000, + 0.400000000000000, + 0.450000000000000, + 0.450000000000000, + 0.500000000000000, + 0.500000000000000, + 0.550000000000000, + 0.650000000000000, + 0.800000000000000, + 0.950000000000000, + 1.100000000000000, + 1.300000000000000, + 1.450000000000000, + 1.500000000000000, + 1.250000000000000, + 1.300000000000000, + 1.150000000000000, + 1.150000000000000, + 1.150000000000000, + 1.150000000000000, + 1.200000000000000, + 1.250000000000000, + 1.250000000000000, + 1.200000000000000, + 0.9737967353, + 0.687255951, + 0.4994850556, + 0.3551480462, + 0.2270548036, + 0.1302099557, + 0.0645385918, + 0.0225325851, + ] + ) * 1e2 ) - # fmt: on + self.assertTrue( np.allclose(v_ref, tc_track.data[0]["max_sustained_wind"].values) ) @@ -379,42 +445,137 @@ def test_wrong_decay_pass(self): ) track_gen = track.data[0] - # fmt: off track_gen["lat"] = np.array( [ - 28.20340431, 28.7915261, 29.38642458, 29.97836984, 30.56844404, - 31.16265292, 31.74820301, 32.34449825, 32.92261894, 33.47430891, - 34.01492525, 34.56789399, 35.08810845, 35.55965893, 35.94835174, - 36.29355848, 36.45379561, 36.32473812, 36.07552209, 35.92224784, - 35.84144186, 35.78298537, 35.86090718, 36.02440372, 36.37555559, - 37.06207765, 37.73197352, 37.97524273, 38.05560287, 38.21901208, - 38.31486156, 38.30813367, 38.28481808, 38.28410366, 38.25894812, - 38.20583372, 38.22741099, 38.39970022, 38.68367797, 39.08329904, - 39.41434629, 39.424984, 39.31327716, 39.30336335, 39.31714429, - 39.27031932, 39.30848775, 39.48759833, 39.73326595, 39.96187967, - 40.26954226, 40.76882202, 41.40398607, 41.93809726, 42.60395785, - 43.57074792, 44.63816143, 45.61450458, 46.68528511, 47.89209365, + 28.20340431, + 28.7915261, + 29.38642458, + 29.97836984, + 30.56844404, + 31.16265292, + 31.74820301, + 32.34449825, + 32.92261894, + 33.47430891, + 34.01492525, + 34.56789399, + 35.08810845, + 35.55965893, + 35.94835174, + 36.29355848, + 36.45379561, + 36.32473812, + 36.07552209, + 35.92224784, + 35.84144186, + 35.78298537, + 35.86090718, + 36.02440372, + 36.37555559, + 37.06207765, + 37.73197352, + 37.97524273, + 38.05560287, + 38.21901208, + 38.31486156, + 38.30813367, + 38.28481808, + 38.28410366, + 38.25894812, + 38.20583372, + 38.22741099, + 38.39970022, + 38.68367797, + 39.08329904, + 39.41434629, + 39.424984, + 39.31327716, + 39.30336335, + 39.31714429, + 39.27031932, + 39.30848775, + 39.48759833, + 39.73326595, + 39.96187967, + 40.26954226, + 40.76882202, + 41.40398607, + 41.93809726, + 42.60395785, + 43.57074792, + 44.63816143, + 45.61450458, + 46.68528511, + 47.89209365, 49.15580502, ] ) track_gen["lon"] = np.array( [ - -79.20514075, -79.25243311, -79.28393082, -79.32324646, -79.36668585, - -79.41495519, -79.45198688, -79.40580325, -79.34965443, -79.36938122, - -79.30294825, -79.06809546, -78.70281969, -78.29418936, -77.82170609, - -77.30034709, -76.79004969, -76.37038827, -75.98641014, -75.58383356, - -75.18310414, -74.7974524, -74.3797645, -73.86393572, -73.37910948, - -73.01059003, -72.77051313, -72.68011328, -72.66864779, -72.62579773, - -72.56307717, -72.46607618, -72.35871353, -72.31120649, -72.15537583, - -71.75577051, -71.25287498, -70.75527907, -70.34788946, -70.17518421, - -70.04446577, -69.76582749, -69.44372386, -69.15881376, -68.84351922, - -68.47890287, -68.04184565, -67.53541437, -66.94008642, -66.25596075, - -65.53496635, -64.83491802, -64.12962685, -63.54118808, -62.72934383, - -61.34915091, -59.72580755, -58.24404252, -56.71972992, -55.0809336, + -79.20514075, + -79.25243311, + -79.28393082, + -79.32324646, + -79.36668585, + -79.41495519, + -79.45198688, + -79.40580325, + -79.34965443, + -79.36938122, + -79.30294825, + -79.06809546, + -78.70281969, + -78.29418936, + -77.82170609, + -77.30034709, + -76.79004969, + -76.37038827, + -75.98641014, + -75.58383356, + -75.18310414, + -74.7974524, + -74.3797645, + -73.86393572, + -73.37910948, + -73.01059003, + -72.77051313, + -72.68011328, + -72.66864779, + -72.62579773, + -72.56307717, + -72.46607618, + -72.35871353, + -72.31120649, + -72.15537583, + -71.75577051, + -71.25287498, + -70.75527907, + -70.34788946, + -70.17518421, + -70.04446577, + -69.76582749, + -69.44372386, + -69.15881376, + -68.84351922, + -68.47890287, + -68.04184565, + -67.53541437, + -66.94008642, + -66.25596075, + -65.53496635, + -64.83491802, + -64.12962685, + -63.54118808, + -62.72934383, + -61.34915091, + -59.72580755, + -58.24404252, + -56.71972992, + -55.0809336, -53.31524758, ] ) - # fmt: on + v_rel = { 1: 0.002249541544102336, -1: 0.00046889526284203036, diff --git a/climada/hazard/test/test_trop_cyclone.py b/climada/hazard/test/test_trop_cyclone.py index b04ae3420..9996becc3 100644 --- a/climada/hazard/test/test_trop_cyclone.py +++ b/climada/hazard/test/test_trop_cyclone.py @@ -192,24 +192,41 @@ def test_cross_antimeridian(self): 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] - # fmt: off intensity_values = [ ( "H08", None, [ - 22.74903, 23.784691, 24.82255, 22.67403, 27.218706, - 30.593959, 18.980878, 24.540069, 27.826407, 26.846293, - 0.0, 34.568898, + 22.74903, + 23.784691, + 24.82255, + 22.67403, + 27.218706, + 30.593959, + 18.980878, + 24.540069, + 27.826407, + 26.846293, + 0.0, + 34.568898, ], ), ( "H10", None, [ - 24.745521, 25.596484, 26.475329, 24.690914, 28.650107, - 31.584395, 21.723546, 26.140293, 28.94964, 28.051915, - 18.49378, 35.312152, + 24.745521, + 25.596484, + 26.475329, + 24.690914, + 28.650107, + 31.584395, + 21.723546, + 26.140293, + 28.94964, + 28.051915, + 18.49378, + 35.312152, ], ), # The following model configurations use recorded wind speeds, while the above use @@ -218,49 +235,94 @@ def test_windfield_models(self): "H10", dict(vmax_from_cen=False, rho_air_const=1.2), [ - 23.702232, 24.327615, 24.947161, 23.589233, 26.616085, - 29.389295, 21.338178, 24.257067, 26.472543, 25.662313, - 18.535842, 31.886041, + 23.702232, + 24.327615, + 24.947161, + 23.589233, + 26.616085, + 29.389295, + 21.338178, + 24.257067, + 26.472543, + 25.662313, + 18.535842, + 31.886041, ], ), ( "H10", dict(vmax_from_cen=False, rho_air_const=None), [ - 24.244162, 24.835561, 25.432454, 24.139294, 27.127457, - 29.719196, 21.910658, 24.692637, 26.783575, 25.971516, - 19.005555, 31.904048, + 24.244162, + 24.835561, + 25.432454, + 24.139294, + 27.127457, + 29.719196, + 21.910658, + 24.692637, + 26.783575, + 25.971516, + 19.005555, + 31.904048, ], ), ( "H10", dict(vmax_from_cen=False, rho_air_const=None, vmax_in_brackets=True), [ - 23.592924, 24.208169, 24.817104, 23.483053, 26.468975, - 29.221715, 21.260867, 24.150879, 26.34288, 25.543635, - 18.487385, 31.904048, + 23.592924, + 24.208169, + 24.817104, + 23.483053, + 26.468975, + 29.221715, + 21.260867, + 24.150879, + 26.34288, + 25.543635, + 18.487385, + 31.904048, ], ), ( "H1980", None, [ - 21.376807, 21.957217, 22.569568, 21.284351, 24.254226, - 26.971303, 19.220149, 21.984516, 24.196388, 23.449116, - 0, 31.550207, + 21.376807, + 21.957217, + 22.569568, + 21.284351, + 24.254226, + 26.971303, + 19.220149, + 21.984516, + 24.196388, + 23.449116, + 0, + 31.550207, ], ), ( "ER11", None, [ - 23.565332, 24.931413, 26.360758, 23.490333, 29.601171, - 34.522795, 18.996389, 26.102109, 30.780737, 29.498453, - 0, 38.368805, + 23.565332, + 24.931413, + 26.360758, + 23.490333, + 29.601171, + 34.522795, + 18.996389, + 26.102109, + 30.780737, + 29.498453, + 0, + 38.368805, ], ), ] - # fmt: on + tc_track = TCTracks.from_processed_ibtracs_csv(TEST_TRACK) tc_track.equal_timestep() tc_track.data = tc_track.data[:1] diff --git a/climada/util/constants.py b/climada/util/constants.py index 90f352218..c5638c6f1 100644 --- a/climada/util/constants.py +++ b/climada/util/constants.py @@ -43,12 +43,9 @@ "TEST_UNC_OUTPUT_COSTBEN", ] -import matplotlib as mpl - # pylint: disable=unused-import # without importing numpy ahead of fiona the debugger may run into an error -import numpy -from fiona.crs import from_epsg +import matplotlib as mpl from .config import CONFIG @@ -139,31 +136,239 @@ TEST_UNC_OUTPUT_COSTBEN = "test_unc_output_costben" """Demo uncertainty costben output""" -# fmt: off ISIMIP_NATID_TO_ISO = [ - "", "ABW", "AFG", "AGO", "AIA", "ALB", "AND", "ANT", "ARE", "ARG", "ARM", - "ASM", "ATG", "AUS", "AUT", "AZE", "BDI", "BEL", "BEN", "BFA", "BGD", "BGR", - "BHR", "BHS", "BIH", "BLR", "BLZ", "BMU", "BOL", "BRA", "BRB", "BRN", "BTN", - "BWA", "CAF", "CAN", "CHE", "CHL", "CHN", "CIV", "CMR", "COD", "COG", "COK", - "COL", "COM", "CPV", "CRI", "CUB", "CYM", "CYP", "CZE", "DEU", "DJI", "DMA", - "DNK", "DOM", "DZA", "ECU", "EGY", "ERI", "ESP", "EST", "ETH", "FIN", "FJI", - "FLK", "FRA", "FRO", "FSM", "GAB", "GBR", "GEO", "GGY", "GHA", "GIB", "GIN", - "GLP", "GMB", "GNB", "GNQ", "GRC", "GRD", "GTM", "GUF", "GUM", "GUY", "HKG", - "HND", "HRV", "HTI", "HUN", "IDN", "IMN", "IND", "IRL", "IRN", "IRQ", "ISL", - "ISR", "ITA", "JAM", "JEY", "JOR", "JPN", "KAZ", "KEN", "KGZ", "KHM", "KIR", - "KNA", "KOR", "KWT", "LAO", "LBN", "LBR", "LBY", "LCA", "LIE", "LKA", "LSO", - "LTU", "LUX", "LVA", "MAC", "MAR", "MCO", "MDA", "MDG", "MDV", "MEX", "MHL", - "MKD", "MLI", "MLT", "MMR", "MNG", "MNP", "MOZ", "MRT", "MSR", "MTQ", "MUS", - "MWI", "MYS", "MYT", "NAM", "NCL", "NER", "NFK", "NGA", "NIC", "NIU", "NLD", - "NOR", "NPL", "NRU", "NZL", "OMN", "PAK", "PAN", "PCN", "PER", "PHL", "PLW", - "PNG", "POL", "PRI", "PRK", "PRT", "PRY", "PSE", "PYF", "QAT", "REU", "ROU", - "RUS", "RWA", "SAU", "SCG", "SDN", "SEN", "SGP", "SHN", "SJM", "SLB", "SLE", - "SLV", "SMR", "SOM", "SPM", "STP", "SUR", "SVK", "SVN", "SWE", "SWZ", "SYC", - "SYR", "TCA", "TCD", "TGO", "THA", "TJK", "TKL", "TKM", "TLS", "TON", "TTO", - "TUN", "TUR", "TUV", "TWN", "TZA", "UGA", "UKR", "URY", "USA", "UZB", "VCT", - "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", "WSM", "YEM", "ZAF", "ZMB", "ZWE", + "", + "ABW", + "AFG", + "AGO", + "AIA", + "ALB", + "AND", + "ANT", + "ARE", + "ARG", + "ARM", + "ASM", + "ATG", + "AUS", + "AUT", + "AZE", + "BDI", + "BEL", + "BEN", + "BFA", + "BGD", + "BGR", + "BHR", + "BHS", + "BIH", + "BLR", + "BLZ", + "BMU", + "BOL", + "BRA", + "BRB", + "BRN", + "BTN", + "BWA", + "CAF", + "CAN", + "CHE", + "CHL", + "CHN", + "CIV", + "CMR", + "COD", + "COG", + "COK", + "COL", + "COM", + "CPV", + "CRI", + "CUB", + "CYM", + "CYP", + "CZE", + "DEU", + "DJI", + "DMA", + "DNK", + "DOM", + "DZA", + "ECU", + "EGY", + "ERI", + "ESP", + "EST", + "ETH", + "FIN", + "FJI", + "FLK", + "FRA", + "FRO", + "FSM", + "GAB", + "GBR", + "GEO", + "GGY", + "GHA", + "GIB", + "GIN", + "GLP", + "GMB", + "GNB", + "GNQ", + "GRC", + "GRD", + "GTM", + "GUF", + "GUM", + "GUY", + "HKG", + "HND", + "HRV", + "HTI", + "HUN", + "IDN", + "IMN", + "IND", + "IRL", + "IRN", + "IRQ", + "ISL", + "ISR", + "ITA", + "JAM", + "JEY", + "JOR", + "JPN", + "KAZ", + "KEN", + "KGZ", + "KHM", + "KIR", + "KNA", + "KOR", + "KWT", + "LAO", + "LBN", + "LBR", + "LBY", + "LCA", + "LIE", + "LKA", + "LSO", + "LTU", + "LUX", + "LVA", + "MAC", + "MAR", + "MCO", + "MDA", + "MDG", + "MDV", + "MEX", + "MHL", + "MKD", + "MLI", + "MLT", + "MMR", + "MNG", + "MNP", + "MOZ", + "MRT", + "MSR", + "MTQ", + "MUS", + "MWI", + "MYS", + "MYT", + "NAM", + "NCL", + "NER", + "NFK", + "NGA", + "NIC", + "NIU", + "NLD", + "NOR", + "NPL", + "NRU", + "NZL", + "OMN", + "PAK", + "PAN", + "PCN", + "PER", + "PHL", + "PLW", + "PNG", + "POL", + "PRI", + "PRK", + "PRT", + "PRY", + "PSE", + "PYF", + "QAT", + "REU", + "ROU", + "RUS", + "RWA", + "SAU", + "SCG", + "SDN", + "SEN", + "SGP", + "SHN", + "SJM", + "SLB", + "SLE", + "SLV", + "SMR", + "SOM", + "SPM", + "STP", + "SUR", + "SVK", + "SVN", + "SWE", + "SWZ", + "SYC", + "SYR", + "TCA", + "TCD", + "TGO", + "THA", + "TJK", + "TKL", + "TKM", + "TLS", + "TON", + "TTO", + "TUN", + "TUR", + "TUV", + "TWN", + "TZA", + "UGA", + "UKR", + "URY", + "USA", + "UZB", + "VCT", + "VEN", + "VGB", + "VIR", + "VNM", + "VUT", + "WLF", + "WSM", + "YEM", + "ZAF", + "ZMB", + "ZWE", ] -# fmt: on """ISO 3166 alpha-3 codes of countries used in ISIMIP_GPWV3_NATID_150AS""" NONISO_REGIONS = [ @@ -212,9 +417,6 @@ DEF_CRS = f"EPSG:{DEF_EPSG}" """Default coordinate reference system WGS 84, str, for pyproj and rasterio CRS.from_string()""" -DEF_CRS_FIONA = from_epsg(DEF_EPSG) -"""Default coordinate reference system WGS 84, dict, for fiona interface""" - cm_data1 = [ [0.00000000, 0.00000000, 0.00000000], [0.00032031, 0.00020876, 0.00015576],