def test_seed_below_reader_coverage(self): o = OpenOil(loglevel=20) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 0) o.set_config('environment:fallback:y_wind', 0) o.add_reader([reader_norkyst]) lon = 5.0 lat = 64.0 o.set_config('seed:droplet_diameter_min_subsea', 0.0005) o.set_config('seed:droplet_diameter_max_subsea', 0.005) o.seed_elements(lon, lat, z=-350, time=reader_norkyst.start_time, density=1000, oil_type='AASGARD A 2003') #o.set_config('vertical_mixing:TSprofiles', True) o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:timestep', 1) # s o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertAlmostEqual(z[-1, 0], -134.0, 1) # After some rising
def test_seed_above_seafloor(self): o = OpenOil(loglevel=30) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = 0 o.add_reader([reader_norkyst]) lon = 4.5 lat = 62.0 o.set_config('seed:droplet_diameter_min_subsea', 0.0010) # s o.set_config('seed:droplet_diameter_max_subsea', 0.0010) # s # Seed elements 50 meters above seafloor: o.seed_elements(lon, lat, z='seafloor+50', time=reader_norkyst.start_time, density=1000) o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:timestep', 1) # s o.run(steps=3, time_step=300, time_step_output=300) #o.plot_property('z') z, status = o.get_property('z') self.assertAlmostEqual(z[0, 0], -101.7, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1, 0], -76.9, 1) # After some rising
def test_seed_below_seafloor(self): o = OpenOil(loglevel=20) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.add_reader([reader_norkyst]) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 0) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:x_sea_water_velocity', 0) o.set_config('environment:fallback:y_sea_water_velocity', 0) lon = 4.5 lat = 62.0 o.set_config('seed:droplet_diameter_min_subsea', 0.0005) o.set_config('seed:droplet_diameter_max_subsea', 0.001) o.seed_elements(lon, lat, z=-5000, time=reader_norkyst.start_time, density=1000, oil_type='GENERIC BUNKER C') o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:timestep', 1) # s o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertAlmostEqual(z[0, 0], -147.3, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1, 0], -132.45, 1) # After some rising
def test_seed_below_seafloor_deactivating(self): o = OpenOil(loglevel=50) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.add_reader([reader_norkyst]) o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = 0 lon = 4.5 lat = 62.0 o.seed_elements(lon, lat, z=[-5000, -100], time=reader_norkyst.start_time, density=1000, number=2) o.set_config('drift:lift_to_seafloor', False) # This time we deactivate o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:timestep', 1) # s o.set_config('input:spill:droplet_diameter_min_subsea', 0.005) o.set_config('input:spill:droplet_diameter_max_subsea', 0.005) o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertEqual(o.num_elements_total(), 2) self.assertEqual(o.num_elements_active(), 1) self.assertEqual(o.num_elements_deactivated(), 1) self.assertAlmostEqual(z[0, 1], -100, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1, 1], -35.7, 1) # After some rising
def test_seed_below_seafloor_deactivating(self): o = OpenOil(loglevel=50) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.add_reader([reader_norkyst]) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 0) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:x_sea_water_velocity', 0) o.set_config('environment:fallback:y_sea_water_velocity', 0) lon = 4.5 lat = 62.0 o.set_config('seed:droplet_diameter_min_subsea', 0.0005) o.set_config('seed:droplet_diameter_max_subsea', 0.001) o.seed_elements(lon, lat, z=[-5000, -100], time=reader_norkyst.start_time, density=1000, number=2, oil_type='AASGARD A 2003') o.set_config('general:seafloor_action', 'deactivate') # This time we deactivate o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:timestep', 1) # s o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertEqual(o.num_elements_total(), 2) self.assertEqual(o.num_elements_active(), 1) self.assertEqual(o.num_elements_deactivated(), 1) self.assertAlmostEqual(z[0, 1], -100, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1, 1], -81.4, 1) # After some rising
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=0) reader_arome = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251 lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=48 * 4, time_step=900) self.assertAlmostEqual(o.elements.lon.max(), 17.54, 2)
def test_oil_mixed_to_seafloor(self): o = OpenOil(loglevel=30) 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.set_config('processes:evaporation', False) o.set_config('environment:fallback:x_wind', 25) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:ocean_vertical_diffusivity', 0.9) o.seed_elements(lon=5.38, lat=62.77, time=norkyst.start_time, number=100, radius=5000) o.run(end_time=norkyst.end_time) self.assertEqual(o.num_elements_active(), 100)
def test_constant_reader(self): o = OpenOil(loglevel=0) cw = reader_constant.Reader({'x_wind':5, 'y_wind': 6}) cc = reader_constant.Reader({'x_sea_water_velocity':0, 'y_sea_water_velocity': .2}) cs = reader_constant.Reader({'sea_water_temperature': 278}) r = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') o.add_reader([cw, cc, r]) # TODO: should check why adding constant reader with # sea_water_temperature gives Deprecated warning #o.add_reader([cw, cc, cs, r]) o.seed_elements(lon=4, lat=60, time=r.start_time, number=5) o.run(steps=3)
def test_lazy_reader_oildrift(self): o = OpenOil(loglevel=0) reader_constant_wind = \ reader_constant.Reader({'x_wind':5, 'y_wind': 6, 'sea_ice_area_fraction': 0}) # Added ice area to prevent problems with masking # with older versions of netCDF library o.add_reader(reader_constant_wind) o.add_readers_from_list(reader_list, lazy=True) self.assertEqual(len(o._lazy_readers()), 4) o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12)) o.run(steps=5) print(o) # Debug, this fails for old libraries self.assertEqual(len(o._lazy_readers()), 2) self.assertEqual(len(o.discarded_readers), 1)
def test_seed_outside_coverage(self): """Test seeding""" o = OpenOil(loglevel=0) norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') landmask = reader_global_landmask.Reader( extent=[4, 6, 60, 64]) o.add_reader([landmask, norkyst]) o.set_config('environment:fallback:x_wind', 0) o.set_config('environment:fallback:y_wind', 0) o.set_config('seed:oil_type', 'SNORRE B 2004') o.seed_elements(5, 63, number=5, time=norkyst.start_time - 24*timedelta(hours=24)) # Check that the oiltype is taken from config self.assertEqual(o.oil_name, o.get_config('seed:oil_type')) self.assertEqual(o.oil_name, 'SNORRE B 2004') with self.assertRaises(ValueError): o.run(steps=3, time_step=timedelta(minutes=15))
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=0) reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251; lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=48*4, time_step=900) self.assertAlmostEqual(o.elements.lon.max(), 17.54, 2)
#reader_hycom = reader_netCDF_CF_generic.Reader('http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_19.1/2010/3hrly') #print(reader_hycom0) reader_globcurrent = reader_netCDF_CF_generic.Reader('http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_HS-ALT_SUM-V02.0_FULL_TIME_SERIE') # Total reader_oceanwind = reader_netCDF_CF_generic.Reader('http://tds0.ifremer.fr/thredds/dodsC/CERSAT-GLO-CLIM_WIND_L4-OBS_FULL_TIME_SERIE') #print(reader_oceanwind) # XXX: not-relevant # For longer simulations, it is better to pre-generate a landmask: # Landmask reader_landmask = reader_global_landmask.Reader( llcrnrlon=-94, llcrnrlat=20, urcrnrlon=-80, urcrnrlat=32) # Add readers o.add_reader([reader_landmask, reader_globcurrent, reader_oceanwind]) # Seed some particles lon = -88.387161; lat = 28.736669 # Macondo location starttime = datetime(2010, 4, 21, 6, 0, 0) # 4 hours after explosion time = [starttime, starttime + timedelta(hours=24*40)] o.seed_elements(lon, lat, radius=0, number=5000, time=time) # Run model print(o) o.run(duration=timedelta(days=40), time_step=timedelta(hours=3), time_step_output=timedelta(days=1)) # Print and plot results print(o)
'16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=3.0, llcrnrlat=60.4, urcrnrlon=6, urcrnrlat=61.8, resolution='h', projection='merc') o.add_reader([reader_basemap, reader_norkyst, reader_arome]) ############################################################ # Seed oil particles within contour detected from satellite ############################################################ o.seed_from_gml( o.test_data_folder() + 'radarsat_oil_satellite_observation/RS2_20151116_002619_0127_SCNB_HH_SGF_433012_9730_12182143_Oil.gml', num_elements=2000) ############################################################ # Additional continous point release, lasting 24 hours ############################################################ o.seed_elements(3.8, 60.9, radius=0, number=1000,
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=30) reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251; lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=24, time_step=3600) self.assertAlmostEqual(o.elements.lon.max(), 16.167, 2) def test_shipdrift(self): """Sintef case study""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249}) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2, lat=60, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=600, duration=timedelta(hours=4)) self.assertAlmostEqual(s.elements.lon, 2.25267706) self.assertAlmostEqual(s.elements.lat, 59.87694775) def test_shipdrift_backwards(self): """Case above, reversed""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249}) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2.25267706, lat=59.87694775, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=-600, duration=timedelta(hours=4)) self.assertAlmostEqual(s.elements.lon, 2.0, 3) self.assertAlmostEqual(s.elements.lat, 60, 3)
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=30) reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251; lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=24, time_step=3600) self.assertAlmostEqual(o.elements.lon.max(), 16.167, 2) def test_shipdrift(self): """Sintef case study""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249}) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2, lat=60, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=600, duration=timedelta(hours=4)) self.assertIsNone(np.testing.assert_array_almost_equal( s.elements.lon, 2.25267706)) self.assertIsNone(np.testing.assert_array_almost_equal( s.elements.lat, 59.87694775)) def test_shipdrift_backwards(self): """Case above, reversed""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249}) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2.25267706, lat=59.87694775, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=-600, duration=timedelta(hours=4)) self.assertIsNone(np.testing.assert_array_almost_equal( s.elements.lon, 2.0, 3)) self.assertIsNone(np.testing.assert_array_almost_equal( s.elements.lat, 60, 3)) def test_wind_drift_shear(self): """Testing PlastDrift model, with wind-induced current shear""" o = PlastDrift(loglevel=30) o.fallback_values['x_wind'] = 10 o.fallback_values['y_wind'] = 0 o.fallback_values['land_binary_mask'] = 0 o.seed_elements(lat=60, lon=5, time=datetime.now(), number=3, z = np.array([0, -0.05, -.1])) o.run(duration=timedelta(hours=10)) self.assertIsNone(np.testing.assert_array_almost_equal( o.elements.lon, [5.013484,5.03395595,5.01149002])) self.assertAlmostEqual(o.elements.lat[0], o.elements.lat[2])
reader_oceanwind = reader_netCDF_CF_generic.Reader( 'http://tds0.ifremer.fr/thredds/dodsC/CERSAT-GLO-CLIM_WIND_L4-OBS_FULL_TIME_SERIE' ) #print(reader_oceanwind) # For longer simulations, it is better to pre-generate a basemap: # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=-94, llcrnrlat=20, urcrnrlon=-80, urcrnrlat=32, resolution='i') # Add readers #o.add_reader([reader_basemap, reader_hycom, reader_oceanwind]) o.add_reader([reader_basemap, reader_globcurrent, reader_oceanwind]) # Seed some particles lon = -88.387161 lat = 28.736669 # Macondo location starttime = datetime(2010, 4, 21, 6, 0, 0) # 4 hours after explosion time = [starttime, starttime + timedelta(hours=24 * 40)] o.seed_elements(lon, lat, radius=0, number=5000, time=time) # Run model print(o) o.run(duration=timedelta(days=40), time_step=timedelta(hours=3), time_step_output=timedelta(days=1)) # Print and plot results
from datetime import datetime, timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=0) o.max_speed = 1 # Nordc4 reader_arctic = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc') reader_arctic.interpolation = 'linearND' #o.add_reader([reader_basemap, reader_arctic]) #o.add_reader([reader_arctic, reader_basemap]) o.add_reader([reader_arctic]) # Seeding some particles lon = 26.4 lat = 77.3 # Spitzbergen #time = datetime(2015, 9, 22, 6, 0, 0) #time = [reader_nordic4.start_time, # reader_nordic4.start_time + timedelta(hours=30)] time = reader_arctic.start_time # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=7000, number=3000, time=time) o.fallback_values['y_wind'] = 4 # Adding some northwards wind
o = OpenOil(loglevel=0) # Set loglevel to 0 for debug information # Gulf of Mexico 1/12 degree reader_nemo = reader_NEMO_native.Reader(o.test_data_folder() + '01Jan2006_GulfofMexico_z_3d/NATL3-JREF2.3_y2006m01_gridTuv.nc') # Landmask (Basemap) #reader_basemap = reader_basemap_landmask.Reader( # llcrnrlon=-98.19, llcrnrlat=17.51, # urcrnrlon=-78.86, urcrnrlat=30.50, resolution='i') # Add readers #o.add_reader([reader_basemap, reader_nemo]) o.add_reader([reader_nemo]) # Particles perdido area lon = -95.64; lat = 24.67 simulation_days=30 starttime = datetime(2006, 1, 1) time = [starttime, starttime + timedelta(hours=24*simulation_days)] o.seed_elements(lon, lat, radius=10, number=400, time=time, z=-1.50) # Run model o.run(duration=timedelta(days=simulation_days), time_step=timedelta(hours=6), time_step_output=timedelta(hours=12)) # Plot results
from datetime import datetime from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=0) # Set loglevel to 0 for debug information # Arome reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') o.add_reader([reader_norkyst, reader_arome]) o.set_config('processes:evaporation', False) ############################################################ # Seed oil particles within contour detected from satellite ############################################################ o.seed_from_gml(o.test_data_folder() + 'radarsat_oil_satellite_observation/RS2_20151116_002619_0127_SCNB_HH_SGF_433012_9730_12182143_Oil.gml', num_elements=2000) ############################################################ # Additional continous point release, lasting 24 hours ############################################################ o.seed_elements(3.8, 60.9, radius=0, number=1000, time=[datetime(2015,11,16,8), datetime(2015,11,17,8)]) ############################################################ # Additional cone release (e.g. from moving ship) ############################################################ o.seed_elements([3.6, 4.4], [61.5, 61.2], radius=[1000, 10000],
env, prof = b.interpolate(x, y, z, variables, profiles=['sea_water_temperature'], profiles_depth=[-30, 0]) time_spent = datetime.now() - start_time print('%6.1f seconds on this machine' % time_spent.total_seconds()) print('--------------------------------------------------------') print('Test 4: Vertical mixing with 50 elements and 7200 cycles (CPU-heavy)') print(' 10.0 seconds on reference machine.') reader_arctic.buffer = 10 reader_arctic.verticalbuffer = 1 o = OpenOil(loglevel=50) # Quiet o.add_reader(reader_arctic) o.set_config('environment:fallback:x_wind', 10) o.set_config('environment:fallback:y_wind', 0) o.set_config('vertical_mixing:timestep', 1) o.seed_elements(lon=15, lat=72, number=50, radius=10000, time=reader_arctic.start_time) start_time = datetime.now() o.run(steps=2) time_spent = datetime.now() - start_time print('%6.1f seconds on this machine' % time_spent.total_seconds()) print('--------------------------------------------------------') print(
from datetime import datetime, timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=0) o.max_speed = 1 # Nordc4 reader_arctic = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc') reader_arctic.interpolation = 'linearND' #o.add_reader([reader_basemap, reader_arctic]) #o.add_reader([reader_arctic, reader_basemap]) o.add_reader([reader_arctic]) # Seeding some particles lon = 26.4; lat = 77.3; # Spitzbergen #time = datetime(2015, 9, 22, 6, 0, 0) #time = [reader_nordic4.start_time, # reader_nordic4.start_time + timedelta(hours=30)] time = reader_arctic.start_time # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=7000, number=3000, time=time) o.fallback_values['y_wind'] = 4 # Adding some northwards wind print o
'16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') #reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.nc') # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') #reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') # Landmask reader_landmask = reader_global_landmask.Reader(llcrnrlon=3, llcrnrlat=59.5, urcrnrlon=7, urcrnrlat=62) o.add_reader([reader_landmask, reader_norkyst, reader_arome]) # Seeding some particles lon = 4.2 lat = 60.0 # Outside Bergen time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=50, number=5000, time=time) # Adjusting some configuration o.set_config('processes:dispersion', False) o.set_config('processes:evaporation', False) o.set_config('processes:emulsification', False) o.set_config('drift:current_uncertainty', .1)
# Using constand wind and current #o.set_config('environment:fallback:x_wind', 7) #o.set_config('environment:fallback:x_sea_water_velocity', .7) #o.set_config('environment:fallback:y_sea_water_velocity', .3) #o.set_config('environment:fallback:land_binary_mask', 0) # Arome atmospheric model reader_arome = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst ocean model reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') o.add_reader([reader_arome, reader_norkyst]) #%% # Seeding some oil particles oil_type = 'MARTIN LINGE CRUDE 2016' o.seed_elements(lon=4.88, lat=60.1, z=0, radius=3000, number=500, time=reader_norkyst.start_time, oil_type=oil_type) #%% # Adjusting some configuration o.set_config('processes:dispersion', False)
# Arome #reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc') reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst #reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=4, llcrnrlat=59.8, urcrnrlon=6, urcrnrlat=61, resolution='h', projection='merc') o.add_reader([reader_basemap, reader_norkyst, reader_arome]) # Seeding some particles lon = 4.6; lat = 60.0; # Outside Bergen #lon = 6.73; lat = 62.78; # Outside Trondheim time = None #time = datetime(2015, 9, 22, 6, 0, 0) time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] #time = reader_arome.start_time # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=50, number=3000, time=time, wind_drift_factor=.02)
#print reader_hycom0 #reader_globcurrent = reader_netCDF_CF_generic.Reader('http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_HS-ALT_SUM-V01.0_FULL_TIME_SERIE') # Total reader_oceanwind = reader_netCDF_CF_generic.Reader( 'http://www.ncdc.noaa.gov/thredds/dodsC/oceanwinds6hr') #print reader_oceanwind # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=-94, llcrnrlat=20, urcrnrlon=-80, urcrnrlat=32, resolution='i') # Add readers o.add_reader([reader_basemap, reader_hycom, reader_oceanwind]) #o.add_reader([reader_basemap, reader_globcurrent, reader_oceanwind]) # Seed some particles lon = -88.387161 lat = 28.736669 # Macondo location starttime = datetime(2010, 4, 21, 6, 0, 0) # 4 hours after explosion time = [starttime, starttime + timedelta(hours=24 * 40)] o.seed_elements(lon, lat, radius=0, number=5000, time=time) # Run model print o o.run(duration=timedelta(days=40), time_step=timedelta(hours=3), time_step_output=timedelta(days=1))
o = OpenOil(loglevel=0) # Set loglevel to 0 for debug information reader_hycom = reader_netCDF_CF_generic.Reader('http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_19.1/2010/3hrly') #print reader_hycom0 #reader_globcurrent = reader_netCDF_CF_generic.Reader('http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_HS-ALT_SUM-V01.0_FULL_TIME_SERIE') # Total reader_oceanwind = reader_netCDF_CF_generic.Reader('http://www.ncdc.noaa.gov/thredds/dodsC/oceanwinds6hr') #print reader_oceanwind # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=-94, llcrnrlat=20, urcrnrlon=-80, urcrnrlat=32, resolution='i') # Add readers o.add_reader([reader_basemap, reader_hycom, reader_oceanwind]) #o.add_reader([reader_basemap, reader_globcurrent, reader_oceanwind]) # Seed some particles lon = -88.387161; lat = 28.736669 # Macondo location starttime = datetime(2010, 4, 21, 6, 0, 0) # 4 hours after explosion time = [starttime, starttime + timedelta(hours=24*40)] o.seed_elements(lon, lat, radius=0, number=5000, time=time) # Run model print o o.run(duration=timedelta(days=40), time_step=timedelta(hours=3), time_step_output=timedelta(days=1)) # Print and plot results
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=0) reader_arome = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251 lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=24, time_step=3600) self.assertAlmostEqual(o.elements.lon.max(), 16.167, 2) def test_shipdrift(self): """Sintef case study""" s = ShipDrift(loglevel=50) s.set_config('drift:current_uncertainty', 0) s.set_config('drift:wind_uncertainty', 0) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249 }) s.set_config('environment:fallback:land_binary_mask', 0) s.add_reader(c) s.list_configspec('seed') s.set_config('seed:orientation', 'left') s.seed_elements(lon=2, lat=60, time=datetime.now(), number=3, length=80, beam=14, height=25, draft=5) s.run(time_step=600, duration=timedelta(hours=4)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lon, 2.252, 3)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lat, 59.876, 3)) def test_shipdrift_defaults(self): s = ShipDrift(loglevel=0) #s.list_configspec() s.set_config('environment:fallback:land_binary_mask', 0) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249 }) s.add_reader(c) s.set_config('seed:height', 14) s.seed_elements(lon=2, lat=60, time=datetime.now(), number=1) s.run(duration=timedelta(hours=4)) #self.assertAlmostEqual(s.elements.lon.max(), 2.1273, 3) # Without setting config self.assertAlmostEqual(s.elements.lon.max(), 2.1990, 3) def test_shipdrift_backwards(self): """Case above, reversed""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249 }) s.set_config('environment:fallback:land_binary_mask', 0) s.add_reader(c) s.seed_elements(lon=2.25267706, lat=59.87694775, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=-600, duration=timedelta(hours=4)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lon, 2.0, 3)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lat, 60, 3)) def test_wind_drift_shear(self): """Testing PlastDrift model, with wind-induced current shear""" o = PlastDrift(loglevel=30) o.set_config('environment:fallback:x_wind', 10) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:land_binary_mask', 0) o.seed_elements(lat=60, lon=5, time=datetime.now(), number=3, z=np.array([0, -0.05, -.1])) o.run(duration=timedelta(hours=10)) self.assertIsNone( np.testing.assert_array_almost_equal( o.elements.lon, [5.011935, 5.01738, 5.011235])) #[5.013484,5.03395595,5.01149002])) # With old seed_elements self.assertAlmostEqual(o.elements.lat[0], o.elements.lat[2], 3) def test_openberg(self): """Check if weighting array is set correctly and if model returns expected positions""" o = OpenBerg() o.set_config('drift:current_uncertainty', 0) o.set_config('drift:wind_uncertainty', 0) reader_current = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') reader_landmask = reader_global_landmask.Reader() o.add_reader([reader_current, reader_landmask]) o.seed_elements(4., 62., time=reader_current.start_time) o.run(steps=1) arr = [ 0.16072658, 0.16466097, 0.17384121, 0.17325179, 0.1715925, 0.15592695 ] for indx in range(len(arr)): self.assertAlmostEqual(o.uw_weighting[indx], arr[indx], 8) self.assertAlmostEqual(o.history['lon'].data[0][1], 3.9921231, 3) self.assertAlmostEqual(o.history['lat'].data[0][1], 62.0108299, 3) def test_oil_in_ice(self): """ Testing ice-in-oil transport with different values of sea ice concentration as defined by Nordam et al. 2019""" c = [0.2, 0.5, 0.8] lon = 24 lat = 81 # Distances calculated with fallback_values and Nordam's equation distances = {'0.2': 21.2914, '0.5': 15.1405, '0.8': 7.2} geod = pyproj.Geod(ellps='WGS84') for i in c: o = OpenOil(loglevel=50) o.set_config('environment:fallback:x_wind', 0) # zonal wind o.set_config('environment:fallback:y_wind', 4) # meridional wind o.set_config('environment:fallback:x_sea_water_velocity', 0) # eastward current o.set_config('environment:fallback:y_sea_water_velocity', .4) # meridional current o.set_config('environment:fallback:sea_ice_x_velocity', 0) # zonal ice velocity o.set_config('environment:fallback:sea_ice_y_velocity', .2) # meridional ice velocity o.set_config( 'environment:fallback:sea_surface_wave_stokes_drift_y_velocity', 0.1) # meridional Stokes drif o.set_config('processes:dispersion', False) o.set_config('processes:evaporation', False) o.set_config('processes:emulsification', False) o.set_config('drift:stokes_drift', True) o.set_config('processes:update_oilfilm_thickness', False) o.set_config('drift:current_uncertainty', 0) o.set_config('drift:wind_uncertainty', 0) o.set_config('environment:fallback:sea_ice_area_fraction', i) o.seed_elements(lon, lat, radius=1, number=10, time=datetime.now(), wind_drift_factor=0.03) o.run(duration=timedelta(hours=10)) latf = o.history['lat'][0][-1] lonf = o.history['lon'][0][-1] azimuth1, azimuth2, dist = geod.inv(lon, lat, lonf, latf) self.assertAlmostEqual(distances[str(i)], dist / 1000, 2) def test_larvalfish(self): o = LarvalFish()
class TestModels(unittest.TestCase): """Tests for OpenDrift models""" def test_seed(self): """Test seeding""" self.o = OpenOil() self.fake_eddy = reader_ArtificialOceanEddy.Reader(2, 62) self.fake_eddy.start_time = datetime(2015, 1, 1) self.o.add_reader([self.fake_eddy]) self.o.seed_elements(lon=4, lat=60, number=100, time=self.fake_eddy.start_time) self.assertEqual(len(self.o.elements), 0) self.assertEqual(len(self.o.elements_deactivated), 0) self.assertEqual(len(self.o.elements_scheduled), 100) def test_windblow(self): o = WindBlow(loglevel=0) reader_arome = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset') o.add_reader([reader_arome]) lat = 67.711251 lon = 13.556971 # Lofoten o.seed_elements(lon, lat, radius=5000, number=1000, time=reader_arome.start_time) o.run(steps=24, time_step=3600) self.assertAlmostEqual(o.elements.lon.max(), 16.167, 2) def test_shipdrift(self): """Sintef case study""" s = ShipDrift(loglevel=50) s.set_config('drift:current_uncertainty', 0) s.set_config('drift:wind_uncertainty', 0) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249 }) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2, lat=60, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=600, duration=timedelta(hours=4)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lon, 2.25267706)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lat, 59.87694775)) def test_shipdrift_backwards(self): """Case above, reversed""" s = ShipDrift(loglevel=50) c = reader_constant.Reader({ 'sea_surface_wave_significant_height': 5, 'sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment': 11, 'x_wind': 14.14213562, 'y_wind': -14.14213562, 'x_sea_water_velocity': 0.05656854249, 'y_sea_water_velocity': -0.05656854249 }) s.fallback_values['land_binary_mask'] = 0 s.add_reader(c) s.seed_elements(lon=2.25267706, lat=59.87694775, time=datetime.now(), number=1, length=80, beam=14, height=25, draft=5) s.run(time_step=-600, duration=timedelta(hours=4)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lon, 2.0, 3)) self.assertIsNone( np.testing.assert_array_almost_equal(s.elements.lat, 60, 3)) def test_wind_drift_shear(self): """Testing PlastDrift model, with wind-induced current shear""" o = PlastDrift(loglevel=30) o.fallback_values['x_wind'] = 10 o.fallback_values['y_wind'] = 0 o.fallback_values['land_binary_mask'] = 0 o.seed_elements(lat=60, lon=5, time=datetime.now(), number=3, z=np.array([0, -0.05, -.1])) o.run(duration=timedelta(hours=10)) self.assertIsNone( np.testing.assert_array_almost_equal( o.elements.lon, [5.013484, 5.03395595, 5.01149002])) self.assertAlmostEqual(o.elements.lat[0], o.elements.lat[2]) def test_openberg(self): """Check if weighting array is set correctly and if model returns expected positions""" o = OpenBerg(loglevel=50) reader_current = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=3., llcrnrlat=60., urcrnrlon=5., urcrnrlat=63.5, resolution='c', projection='gall') # reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=-1.5, llcrnrlat=59, urcrnrlon=7, urcrnrlat=64, resolution='c') o.add_reader([reader_current, reader_basemap]) o.seed_elements(4., 62., time=reader_current.start_time) o.run(steps=1) arr = [ 0.16072658, 0.16466097, 0.17384121, 0.17325179, 0.1715925, 0.15592695 ] for indx in range(len(arr)): self.assertAlmostEqual(o.uw_weighting[indx], arr[indx], 8) self.assertAlmostEqual(o.history['lon'].data[0][1], 3.9921231, 3) self.assertAlmostEqual(o.history['lat'].data[0][1], 62.0108299, 3)
# HYCOM #reader_hycom = reader_netCDF_CF_generic.Reader('http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_19.1/2010/3hrly') #print reader_hycom reader_globcurrent = reader_netCDF_CF_generic.Reader('http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_HS-ALT_SUM-V02.0_FULL_TIME_SERIE') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=100, llcrnrlat=5, urcrnrlon=120, urcrnrlat=15, resolution='h') # OceanWind try: reader_oceanwind = reader_netCDF_CF_generic.Reader( 'http://www.ncdc.noaa.gov/thredds/dodsC/oceanwinds6hr') print reader_oceanwind o.add_reader([reader_globcurrent, reader_oceanwind, reader_basemap]) except: o.add_reader([reader_globcurrent, reader_basemap]) # Seed some particles lat=10.228248; lon=106.973337 lat=10.0; lon=107.8 time = datetime(2010, 3, 23, 6, 0, 0) o.seed_elements(lon, lat, radius=1000, number=1000, time=time) # Run model print o o.run(duration=timedelta(days=10), time_step=timedelta(minutes=15), time_step_output=timedelta(hours=3))
from datetime import datetime, timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=20, weathering_model='noaa') print(o.oiltypes) # Print available oil types #%% Add forcing date # Arome atmospheric model reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst ocean model reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') o.add_reader([reader_norkyst, reader_arome]) #%% # Seeding some particles time = reader_arome.start_time oil_type = 'GULLFAKS, EXXON' oil_type = 'ARABIAN MEDIUM, API' oil_type = 'ALGERIAN CONDENSATE' o.seed_elements(lon=4.9, lat=60.1, radius=3000, number=2000, time=time, z=0, oil_type=oil_type) #%% # Adjusting some configuration o.set_config('processes:evaporation', True) o.set_config('processes:emulsification', True) o.set_config('drift:vertical_mixing', True)
=================== """ from datetime import timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=20) # Set loglevel to 0 for debug information # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') #reader_norkyst = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') o.add_reader([reader_norkyst]) o.set_config('environment:fallback:x_wind', 3) o.set_config('environment:fallback:y_wind', 7) o.set_config('drift:vertical_mixing', True) #%% # Seeding some particles time = [ reader_norkyst.start_time, reader_norkyst.start_time + timedelta(hours=1) ] o.seed_elements(lon=4.5, lat=62.0, z='seafloor', radius=0, number=3000, time=time,