def test_config_constant_fallback(self): o = OceanDrift(loglevel=0) reader_arome = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') print(reader_norkyst, reader_arome) o.add_reader([reader_norkyst, reader_arome]) o.seed_elements(lon=4, lat=60, time=reader_arome.end_time - timedelta(hours=3), number=1) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_sea_water_velocity', 1) o.set_config('environment:fallback:y_sea_water_velocity', 0) o.set_config('environment:constant:x_wind', 0) o.set_config('environment:constant:y_wind', 5) o.run(duration=timedelta(hours=6)) y_wind = np.array(o.get_property('y_wind')[0][:, 0]) x_current = np.array(o.get_property('x_sea_water_velocity')[0][:, 0]) # Check that constant wind is used for whole simulation self.assertAlmostEqual(y_wind[0], 5, 2) self.assertAlmostEqual(y_wind[-1], 5, 2) # Check that fallback current is used only after end of reader self.assertAlmostEqual(x_current[0], 0.155, 2) self.assertAlmostEqual(x_current[-1], 1, 2)
def test_lift_above_seafloor(self): # See an element at some depth, and progapate towards coast # (shallower water) and check that it is not penetrating seafloor o = OceanDrift(loglevel=50) o.max_speed = 100 reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') reader_norkyst.buffer = 200 o.add_reader([reader_norkyst], variables='sea_floor_depth_below_sea_level') o.set_config('environment:fallback:x_sea_water_velocity', 10) # Pure eastward motion o.set_config('environment:fallback:y_sea_water_velocity', 0) o.set_config('environment:fallback:land_binary_mask', 0) o.seed_elements(3.9, 62.0, z=-200, time=reader_norkyst.start_time) o.set_config('drift:vertical_mixing', False) o.run(steps=12, time_step=300) seafloor_depth, status = o.get_property( 'sea_floor_depth_below_sea_level') z, status = o.get_property('z') # Uncomment to plot #import matplotlib.pyplot as plt #plt.plot(-seafloor_depth, label='Seafloor depth') #plt.plot(z, label='Element depth') #plt.legend(loc='best') #plt.show() # Check that element has not penetrated seafloor self.assertFalse( o.elements.z < -o.environment.sea_floor_depth_below_sea_level) self.assertIsNone( np.testing.assert_array_almost_equal(o.elements.z, -134.5, 1))
def test_repeated_run(self): # NOTE: this test fails if outfile is not None #outfile = 'leeway_test.nc' outfile = None o = OceanDrift(loglevel=50) o.set_config('drift:vertical_mixing', False) o.add_readers_from_list(reader_list) o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12)) o.run(steps=5, outfile=outfile) lon1 = o.get_property('lon')[0] # Repeated run with same object o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12)) o.run(steps=5, outfile=outfile) lon2 = o.get_property('lon')[0] # Third run, with different config o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12), wind_drift_factor=.1) o.run(steps=5) lon3 = o.get_property('lon')[0] # Fourth run, with different time o.reset() # Reset is needed due to new start_time o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 13), wind_drift_factor=.1) o.run(steps=5, outfile=outfile) lon4 = o.get_property('lon')[0] # Check results self.assertEqual(lon1[-1][0], lon2[-1][0]) self.assertNotEqual(lon3[-1][0], lon2[-1][0])
def test_repeated_run(self): o = OceanDrift(loglevel=50) o.add_readers_from_list(reader_list) o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12)) o.run(steps=5) lon1 = o.get_property('lon')[0] # Repeated run with same object o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12)) o.run(steps=5) lon2 = o.get_property('lon')[0] # Third run, with different config o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12), wind_drift_factor=.1) o.run(steps=5) lon3 = o.get_property('lon')[0] # Fourth run, with different time o.reset() # Reset is needed due to new start_time o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 13), wind_drift_factor=.1) o.run(steps=5) lon4 = o.get_property('lon')[0] # Check results self.assertEqual(lon1[-1][0], lon2[-1][0]) self.assertNotEqual(lon3[-1][0], lon2[-1][0])
def test_clip_domain(self): o = OceanDrift(loglevel=50) r1 = reader_ROMS_native.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc' ) r1.clip_boundary_pixels(20) r2 = reader_ROMS_native.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc' ) self.assertEqual(r2.shape, (151, 81)) self.assertEqual(r1.shape, (111, 41)) self.assertEqual(r1.xmin, 20) o1 = OceanDrift(loglevel=50) del o1.fallback_values['x_sea_water_velocity'] o1.add_reader(r1) o1.seed_elements(lon=15, lat=70.1, time=r1.start_time) o1.fallback_values['land_binary_mask'] = 0 o1.run(time_step=3600 * 3, duration=timedelta(hours=48)) o2 = OceanDrift(loglevel=50) del o2.fallback_values['x_sea_water_velocity'] o2.add_reader(r2) o2.seed_elements(lon=15, lat=70.1, time=r1.start_time) o2.fallback_values['land_binary_mask'] = 0 o2.run(time_step=3600 * 3, duration=timedelta(hours=48)) # Compare lat1 = o1.get_property('lat')[0] lat2 = o2.get_property('lat')[0] self.assertEqual(len(lat1), 14) self.assertEqual(len(lat2), 17) self.assertIsNone(np.testing.assert_allclose(lat1[0:13], lat2[0:13])) # Test reader netCDF_CF_generic r = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') self.assertEqual(r.shape, (301, 201)) o3 = OceanDrift(loglevel=50) del o3.fallback_values['x_sea_water_velocity'] o3.fallback_values['land_binary_mask'] = 0 o3.add_reader(r) o3.seed_elements(lon=4.36, lat=61.7, time=r.start_time) o3.run(steps=24) r.clip_boundary_pixels(10) self.assertEqual(r.shape, (281, 181)) o4 = OceanDrift(loglevel=50) del o4.fallback_values['x_sea_water_velocity'] o4.fallback_values['land_binary_mask'] = 0 o4.add_reader(r) o4.seed_elements(lon=4.36, lat=61.7, time=r.start_time) o4.run(steps=24) # Compare lat3 = o3.get_property('lat')[0] lat4 = o4.get_property('lat')[0] self.assertEqual(len(lat3), 25) self.assertEqual(len(lat4), 13) self.assertIsNone(np.testing.assert_allclose(lat3[0:12], lat4[0:12]))
def test_seed_ocean_only(self): o = OceanDrift(loglevel=50) o.set_config('seed:ocean_only', True) o.seed_elements(lon=[4.8, 5.15], lat=[60, 60], time=datetime.now()) o.run(steps=1) lat, s = o.get_property('lat')[0] # Check that the second point over land has been moved to ocean self.assertAlmostEqual(lat[0], 60, 5) self.assertNotAlmostEqual(lat[1], 60, 5)
def test_valid_minmax_nanvalues(self): from opendrift.readers.basereader import variables # Reducing max current speed to test masking maxval = variables.standard_names['x_sea_water_velocity']['valid_max'] variables.standard_names['x_sea_water_velocity']['valid_max'] = .1 o = OceanDrift() o.set_config('environment:fallback:land_binary_mask', 0) norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.add_reader(norkyst) o.seed_elements(lon=4.95, lat=62, number=100, time=norkyst.start_time) o.run(steps=2) variables.standard_names['x_sea_water_velocity']['valid_max'] = maxval # reset u = o.get_property('x_sea_water_velocity')[0] self.assertAlmostEqual(u.max(), .1, 2) # Some numerical error allowed
def test_valid_minmax(self): """Check that invalid values are replaced with fallback.""" o = OceanDrift() from opendrift.readers.basereader import variables minval = variables.standard_names['x_wind']['valid_min'] # Setting valid_min to -5, to check that replacement works variables.standard_names['x_wind']['valid_min'] = -5 reader_wind = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') o.add_reader(reader_wind) o.set_config('environment:fallback:x_sea_water_velocity', 0) o.set_config('environment:fallback:x_wind', 2.0) o.set_config('environment:fallback:y_sea_water_velocity', 0) o.set_config('environment:fallback:land_binary_mask', 0) o.seed_elements(lon=4, lat=60, time=reader_wind.start_time) o.run(steps=1) variables.standard_names['x_wind']['valid_min'] = minval # reset w = o.get_property('x_wind')[0][0] self.assertAlmostEqual(w, 2.0, 1)