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() tc_track.read_processed_ibtracs_csv(TEST_TRACK) tc_track.equal_timestep() tc_track.data = tc_track.data[:1] for metric in ["equirect", "geosphere"]: tc_haz = TropCyclone() tc_haz.set_from_tracks(tc_track, centroids=CENTR_TEST_BRB, model='H08', store_windfields=True, metric=metric) self.assertEqual(tc_haz.tag.haz_type, 'TC') self.assertEqual(tc_haz.tag.description, '') self.assertEqual(tc_haz.tag.file_name, 'Name: 1951239N12334') self.assertEqual(tc_haz.units, 'm/s') self.assertEqual(tc_haz.centroids.size, 296) self.assertEqual(tc_haz.event_id.size, 1) self.assertEqual(tc_haz.date.size, 1) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).year, 1951) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).month, 8) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).day, 27) self.assertEqual(tc_haz.event_id[0], 1) self.assertEqual(tc_haz.event_name, ['1951239N12334']) self.assertTrue(np.array_equal(tc_haz.frequency, np.array([1]))) self.assertTrue(isinstance(tc_haz.fraction, sparse.csr.csr_matrix)) self.assertEqual(tc_haz.fraction.shape, (1, 296)) self.assertEqual(tc_haz.fraction[0, 100], 1) self.assertEqual(tc_haz.fraction[0, 260], 0) self.assertEqual(tc_haz.fraction.nonzero()[0].size, 280) self.assertTrue(isinstance(tc_haz.intensity, sparse.csr.csr_matrix)) self.assertEqual(tc_haz.intensity.shape, (1, 296)) self.assertEqual(np.nonzero(tc_haz.intensity)[0].size, 280) for idx, val in zip(intensity_idx, intensity_values[metric]): if val == 0: self.assertEqual(tc_haz.intensity[0, idx], 0) else: self.assertAlmostEqual(tc_haz.intensity[0, idx], val) windfields = tc_haz.windfields[0].toarray() windfields = windfields.reshape(windfields.shape[0], -1, 2) windfield_norms = np.linalg.norm(windfields, axis=-1).max(axis=0) intensity = tc_haz.intensity.toarray()[0, :] msk = (intensity > 0) np.testing.assert_array_equal(windfield_norms[msk], intensity[msk])
def test_set_one_pass(self): """Test _tc_from_track function.""" tc_track = TCTracks() tc_track.read_processed_ibtracs_csv(TEST_TRACK) tc_track.equal_timestep() tc_track.data = tc_track.data[:1] tc_haz = TropCyclone() tc_haz.set_from_tracks(tc_track, centroids=CENTR_TEST_BRB, model='H08', store_windfields=True) self.assertEqual(tc_haz.tag.haz_type, 'TC') self.assertEqual(tc_haz.tag.description, '') self.assertEqual(tc_haz.tag.file_name, 'Name: 1951239N12334') self.assertEqual(tc_haz.units, 'm/s') self.assertEqual(tc_haz.centroids.size, 296) self.assertEqual(tc_haz.event_id.size, 1) self.assertEqual(tc_haz.date.size, 1) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).year, 1951) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).month, 8) self.assertEqual(dt.datetime.fromordinal(tc_haz.date[0]).day, 27) self.assertEqual(tc_haz.event_id[0], 1) self.assertEqual(tc_haz.event_name, ['1951239N12334']) self.assertTrue(np.array_equal(tc_haz.frequency, np.array([1]))) self.assertTrue(isinstance(tc_haz.fraction, sparse.csr.csr_matrix)) self.assertEqual(tc_haz.fraction.shape, (1, 296)) self.assertEqual(tc_haz.fraction[0, 100], 1) self.assertEqual(tc_haz.fraction[0, 260], 0) self.assertEqual(tc_haz.fraction.nonzero()[0].size, 280) self.assertTrue(isinstance(tc_haz.intensity, sparse.csr.csr_matrix)) self.assertEqual(tc_haz.intensity.shape, (1, 296)) self.assertEqual(np.nonzero(tc_haz.intensity)[0].size, 280) self.assertEqual(tc_haz.intensity[0, 260], 0) self.assertAlmostEqual(tc_haz.intensity[0, 1], 27.08333002) self.assertAlmostEqual(tc_haz.intensity[0, 2], 28.46008202) self.assertAlmostEqual(tc_haz.intensity[0, 3], 25.70445069) self.assertAlmostEqual(tc_haz.intensity[0, 100], 36.45564037) self.assertAlmostEqual(tc_haz.intensity[0, 250], 31.60115745) self.assertAlmostEqual(tc_haz.intensity[0, 295], 40.62433745) to_kn = (1.0 * ureg.meter / ureg.second).to(ureg.knot).magnitude wind = tc_haz.intensity.toarray()[0, :] self.assertAlmostEqual(wind[0] * to_kn, 50.08492156) self.assertAlmostEqual(wind[80] * to_kn, 61.13812028) self.assertAlmostEqual(wind[120] * to_kn, 41.26159439) self.assertAlmostEqual(wind[200] * to_kn, 54.85572160) self.assertAlmostEqual(wind[220] * to_kn, 63.99749424) windfields = tc_haz.windfields[0].toarray() windfields = windfields.reshape(windfields.shape[0], -1, 2) windfield_norms = np.linalg.norm(windfields, axis=-1).max(axis=0) intensity = tc_haz.intensity.toarray()[0, :] msk = (intensity > 0) self.assertTrue(np.allclose(windfield_norms[msk], intensity[msk]))
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.477252, 28.626236, 29.829914, 27.393616, 32.495186, 37.113324, 23.573216, 29.552127, 33.767067, 32.530964, 19.656737, 41.014578 ], # Holland 1980 is the only model that uses recorded wind speeds, while the above use # pressure values only. That's why the results for Holland 1980 are so different: "H1980": [ 20.291397, 22.678914, 25.428598, 20.44718, 31.868592, 41.920317, 0, 25.715983, 38.351686, 35.591153, 0, 46.873912 ], } tc_track = TCTracks() tc_track.read_processed_ibtracs_csv(TEST_TRACK) tc_track.equal_timestep() tc_track.data = tc_track.data[:1] for model in ["H08", "H10", "H1980"]: tc_haz = TropCyclone() tc_haz.set_from_tracks(tc_track, centroids=CENTR_TEST_BRB, model=model) np.testing.assert_array_almost_equal( tc_haz.intensity[0, intensity_idx].toarray()[0], intensity_values[model]) for idx, val in zip(intensity_idx, intensity_values[model]): if val == 0: self.assertEqual(tc_haz.intensity[0, idx], 0)