class TestLeeway(unittest.TestCase): """Tests for Leeway module.""" def test_leewayprop(self): """Check that Leeway properties are properly read.""" self.objectType = 85 # MED-WASTE-7 self.lee = Leeway(loglevel=20) objectType = self.objectType self.assertEqual(self.lee.leewayprop[objectType] ['Description'], '>>Medical waste, syringes, small') self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 1.79) def test_leewayrun(self): """Test the expected Leeway left/right split.""" self.lee = Leeway(loglevel=30) self.objectType = 50 # FISHING-VESSEL-1 self.reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=3, llcrnrlat=59.8, projection='merc', urcrnrlon=6, urcrnrlat=60.5, resolution='i') self.lee.add_reader([self.reader_basemap]) self.lee.seed_elements(lon=4.5, lat=60, number=100, objectType=self.objectType, time=datetime(2015, 1, 1)) self.lee.fallback_values['x_wind'] = 0 self.lee.fallback_values['y_wind'] = 10 self.lee.fallback_values['x_sea_water_velocity'] = 0 self.lee.fallback_values['y_sea_water_velocity'] = 0 # Check that 7 out of 100 elements strand towards coast self.lee.run(steps=24, time_step=3600) self.assertEqual(self.lee.num_elements_scheduled(), 0) self.assertEqual(self.lee.num_elements_active(), 97) self.assertEqual(self.lee.num_elements_deactivated(), 3) # stranded self.lee.export_ascii('leeway_ascii.txt') os.remove('leeway_ascii.txt')
def test_constant_and_lazy_reader_leeway(self): cw = reader_constant.Reader({'x_wind':5, 'y_wind': 6}) cc = reader_constant.Reader({'x_sea_water_velocity':0, 'y_sea_water_velocity': .2}) o = Leeway(loglevel=20) o.add_reader([cw, cc]) o.add_readers_from_list(reader_list) o.set_config('environment:fallback:x_sea_water_velocity', 0.0) o.set_config('environment:fallback:y_sea_water_velocity', 0.1) time = datetime(2016,2,2,12) o.seed_elements(lat=67.85, lon=14, time=time) o.run(steps=2) self.assertAlmostEqual(o.elements.lat[0], 67.8548, 3)
class TestLeeway(unittest.TestCase): """Tests for Leeway module.""" def test_leewayprop(self): """Check that Leeway properties are properly read.""" self.objectType = 85 # MED-WASTE-7 self.lee = Leeway(loglevel=20) objectType = self.objectType self.assertEqual(self.lee.leewayprop[objectType]['Description'], '>>Medical waste, syringes, small') self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 1.79) def test_leeway_config_object(self): """Check that correct object type is fetched from config""" l = Leeway(loglevel=20) l.set_config('seed:object_type', 'Surf board with person') l.seed_elements(lon=4.5, lat=60, number=100, time=datetime(2015, 1, 1)) objType = l.elements_scheduled.objectType self.assertEqual(l.leewayprop[objType]['Description'], 'Surf board with person') self.assertEqual(l.leewayprop[objType]['OBJKEY'], 'PERSON-POWERED-VESSEL-2') def test_leewayrun(self): """Test the expected Leeway left/right split.""" self.lee = Leeway(loglevel=30) self.objectType = 50 # FISHING-VESSEL-1 self.reader_landmask = reader_global_landmask.Reader(llcrnrlon=3, llcrnrlat=59.8, urcrnrlon=6, urcrnrlat=60.5) self.lee.add_reader([self.reader_landmask]) self.lee.seed_elements(lon=4.5, lat=60, number=100, objectType=self.objectType, time=datetime(2015, 1, 1)) self.lee.fallback_values['x_wind'] = 0 self.lee.fallback_values['y_wind'] = 10 self.lee.fallback_values['x_sea_water_velocity'] = 0 self.lee.fallback_values['y_sea_water_velocity'] = 0 # Check that 7 out of 100 elements strand towards coast self.lee.run(steps=24, time_step=3600) self.assertEqual(self.lee.num_elements_scheduled(), 0) self.assertEqual(self.lee.num_elements_active(), 96) self.assertEqual(self.lee.num_elements_deactivated(), 4) # stranded self.lee.export_ascii('leeway_ascii.txt') os.remove('leeway_ascii.txt')
def test_constant_and_lazy_reader_leeway(self): cw = reader_constant.Reader({'x_wind': 5, 'y_wind': 6}) cc = reader_constant.Reader({ 'x_sea_water_velocity': 0, 'y_sea_water_velocity': .2 }) o = Leeway(loglevel=20) o.set_config('general:basemap_resolution', 'c') o.add_reader([cw, cc]) o.add_readers_from_list(reader_list) o.fallback_values['x_sea_water_velocity'] = 0.0 o.fallback_values['y_sea_water_velocity'] = 0.1 time = datetime(2016, 2, 2, 12) o.seed_elements(lat=67.85, lon=14, time=time) o.run(steps=2) self.assertAlmostEqual(o.elements.lat[0], 67.8548, 3)
def test_leewayrun(tmpdir): """Test the expected Leeway left/right split.""" lee = Leeway(loglevel=30) objectType = 50 # FISHING-VESSEL-1 reader_landmask = reader_global_landmask.Reader(extent=[ 3, 59.8, 6, 60.5 ]) lee.add_reader([reader_landmask]) lee.seed_elements(lon=4.5, lat=60, number=100, objectType=objectType, time=datetime(2015, 1, 1)) lee.fallback_values['x_wind'] = 0 lee.fallback_values['y_wind'] = 10 lee.fallback_values['x_sea_water_velocity'] = 0 lee.fallback_values['y_sea_water_velocity'] = 0 # Check that 7 out of 100 elements strand towards coast lee.run(steps=24, time_step=3600) assert lee.num_elements_scheduled() == 0 assert lee.num_elements_active() == 96 assert lee.num_elements_deactivated() == 4 # stranded lee.export_ascii(tmpdir + '/leeway_ascii.txt')
def get(self): parser = reqparse.RequestParser() parser.add_argument('latitude', type=float, help='Latitude of the object') parser.add_argument('longitude', type=float, help='Longitude of object') args = parser.parse_args(strict=True) if args['latitude'] is not None and args['longitude'] is not None: if abs(args['latitude']) > 90 : abort(404, message="latitude is out of range of -90 <= latitude <= 90") if abs(args['longitude']) > 180: abort(404, message='longitude is out of range of -180 <= longitude <= 180') latitude = args['latitude'] longitude = args['longitude'] lw = Leeway() # Set loglevel to 0 for debug information # 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(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') reader_norkyst = reader_netCDF_CF_generic.Reader('http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_91.2/uv3z') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=longitude-2, llcrnrlat=latitude-2, urcrnrlon=longitude+2, urcrnrlat=latitude+2, resolution='h', projection='merc') #lw.add_reader([reader_norkyst, reader_arome, reader_basemap]) # Adding readers succesively, and specifying which variables they # shall provide. This way, order of adding readers does not matter, # except for small rounding differences due to different projection lw.add_reader(reader_norkyst, variables=['x_sea_water_velocity', 'y_sea_water_velocity']) lw.add_reader(reader_arome, variables=['x_wind', 'y_wind']) lw.add_reader(reader_basemap, variables=['land_binary_mask']) # Seed leeway elements at defined position and time objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(longitude, latitude, radius=100, number=30, time=reader_arome.start_time, objectType=objType) lw.set_projection('+proj=merc') lw.run(steps=60*4, time_step=900) lp = lw.plot(show=False) img = StringIO.StringIO() lp[1].savefig(img,format='png') img.seek(0) response=make_response(img.buf) response.headers['Content-Type'] = 'image/png' return response else: abort(404, message="Requires latitude and longitude but none were given.")
class TestArray(unittest.TestCase): """Tests for Leeway module.""" def setUp(self): self.objectType = 50 # FISHING-VESSEL-1 self.lee = Leeway(loglevel=20) #print self.lee.leewayprop.values()[0] #self.lee = WindBlow(loglevel=0) self.reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=3, llcrnrlat=59, projection='merc', urcrnrlon=6, urcrnrlat=61, resolution='i') self.lee.add_reader([self.reader_basemap]) self.lee.fallback_values['x_wind'] = 0 self.lee.fallback_values['y_wind'] = 10 self.lee.fallback_values['x_sea_water_velocity'] = 0 self.lee.fallback_values['y_sea_water_velocity'] = 0 def test_leewayprop(self): """Check that Leeway properties are properly read.""" objectType = self.objectType self.assertEqual(self.lee.leewayprop[objectType]['Description'], ' Fishing vessel, general (mean values)\n') self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 2.47) def test_leewayrun(self): """Test the expected Leeway left/right split.""" self.lee.seed_elements(lon=4.5, lat=60, number=100, objectType=self.objectType, time=datetime(2015, 1, 1)) # Check that 7 out of 100 elements strand towards coast self.lee.run(steps=24, time_step=3600) self.assertEqual(self.lee.num_elements_scheduled(), 0) self.assertEqual(self.lee.num_elements_active(), 97) self.assertEqual(self.lee.num_elements_deactivated(), 3) # stranded
def test_leewayrun(tmpdir, test_data): """Test the expected Leeway left/right split.""" lee = Leeway(loglevel=20) object_type = 50 # FISHING-VESSEL-1 reader_landmask = reader_global_landmask.Reader(extent=[ 3, 59.8, 6, 60.5 ]) lee.add_reader([reader_landmask]) lee.seed_cone(lon=[4.5, 4.7], lat=[60.1, 60], number=100, object_type=object_type, time=[datetime(2015, 1, 1, 0), datetime(2015, 1, 1, 6)]) lee.set_config('environment:fallback:x_wind', 0) lee.set_config('environment:fallback:y_wind', 10) lee.set_config('environment:fallback:x_sea_water_velocity', 0) lee.set_config('environment:fallback:y_sea_water_velocity', 0) # Check that 10 out of 100 elements strand towards coast lee.run(steps=24, time_step=3600) assert lee.num_elements_scheduled() == 0 assert lee.num_elements_active() == 88 assert lee.num_elements_deactivated() == 12 # stranded asciif = tmpdir + '/leeway_ascii.txt' lee.export_ascii(asciif) asciitarget = test_data + "/generated/test_leewayrun_export_ascii.txt" import filecmp assert filecmp.cmp(asciif, asciitarget)
class TestArray(unittest.TestCase): """Tests for Leeway module.""" def setUp(self): self.objectType = 50 # FISHING-VESSEL-1 self.lee = Leeway(loglevel=20) #print self.lee.leewayprop.values()[0] #self.lee = WindBlow(loglevel=0) self.reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=3, llcrnrlat=59, projection='merc', urcrnrlon=6, urcrnrlat=61, resolution='i') self.lee.add_reader([self.reader_basemap]) self.lee.fallback_values['x_wind'] = 0 self.lee.fallback_values['y_wind'] = 10 self.lee.fallback_values['x_sea_water_velocity'] = 0 self.lee.fallback_values['y_sea_water_velocity'] = 0 def test_leewayprop(self): """Check that Leeway properties are properly read.""" objectType = self.objectType self.assertEqual(self.lee.leewayprop[objectType] ['Description'], ' Fishing vessel, general (mean values)\n') self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 2.47) def test_leewayrun(self): """Test the expected Leeway left/right split.""" self.lee.seed_elements(lon=4.5, lat=60, number=100, objectType=self.objectType, time=datetime(2015, 1, 1)) # Check that 7 out of 100 elements strand towards coast self.lee.run(steps=24, time_step=3600) self.assertEqual(self.lee.num_elements_scheduled(), 0) self.assertEqual(self.lee.num_elements_active(), 97) self.assertEqual(self.lee.num_elements_deactivated(), 3) # stranded
# 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(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=3.3, llcrnrlat=59.5, urcrnrlon=5.5, urcrnrlat=62.5, resolution='h', projection='merc') #lw.add_reader([reader_norkyst, reader_arome, reader_basemap]) # Adding readers succesively, and specifying which variables they # shall provide. This way, order of adding readers does not matter, # except for small rounding differences due to different projection lw.add_reader(reader_norkyst, variables=['x_sea_water_velocity', 'y_sea_water_velocity']) lw.add_reader(reader_arome, variables=['x_wind', 'y_wind']) lw.add_reader(reader_basemap, variables=['land_binary_mask']) lw.fallback_values['x_sea_water_velocity'] = 0 lw.fallback_values['y_sea_water_velocity'] = 0 # Seeding some particles lon = 4.5; lat = 60.0; # Outside Bergen # Seed leeway elements at defined position and time objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon, lat, radius=1000, number=3000, time=reader_arome.start_time, objectType=objType)
'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') # Making customised, full resolution landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=5.5, llcrnrlat=61.05, urcrnrlon=6.65, urcrnrlat=61.21, resolution='f', projection='merc') o.add_reader([reader_basemap, reader_norkyst, reader_arome]) # Seed elements lat = 61.117594 lon = 6.55 #time = [reader_arome.start_time, # reader_arome.start_time + timedelta(hours=5)] time = reader_arome.start_time objType = 1 # 1: Person-in-water (PIW), unknown state (mean values) o.seed_elements(lon, lat, radius=50, number=5000, time=time, objectType=objType)
from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.leeway import Leeway lw = Leeway(loglevel=0) # Set loglevel to 0 for debug information # Arome reader_arome = reader_netCDF_CF_generic.Reader( lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader( lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') lw.add_reader([reader_norkyst, reader_arome]) lw.fallback_values['x_sea_water_velocity'] = 0 lw.fallback_values['y_sea_water_velocity'] = 0 lw.fallback_values['x_wind'] = 0 lw.fallback_values['y_wind'] = 0 # Seed elements along cone, e.g. ship track with # increasing uncertainty in position lon = [3.6, 5.1] lat = [61., 59.6] time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon, lat, radius=[1000, 10000],
lw = Leeway(loglevel=20) # Set loglevel to 0 for debug information # Atmospheric model for wind #reader_arome = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc') reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Ocean model for current #reader_norkyst = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc') reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') #%% # Adding readers successively, and specifying which variables they # shall provide. This way, order of adding readers does not matter lw.add_reader(reader_norkyst, variables=['x_sea_water_velocity', 'y_sea_water_velocity']) lw.add_reader(reader_arome, variables=['x_wind', 'y_wind']) lw.set_config('environment:fallback:x_sea_water_velocity', 0) lw.set_config('environment:fallback:y_sea_water_velocity', 0) #%% # Seed leeway elements at defined position and time object_type = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon=4.5, lat=59.6, radius=100, number=1000, time=reader_arome.start_time, object_type=object_type) #%% # Running model lw.run(duration=timedelta(hours=48), time_step=900, time_step_output=3600) #%%
def run_opendrift(self): sys.stdout.write('running OpenDrift') month = np.int(self.months.index(self.monthvar.get()) + 1) start_time = datetime(np.int(self.yearvar.get()), month, np.int(self.datevar.get()), np.int(self.hourvar.get()), np.int(self.minutevar.get())) if start_time > self.current.end_time: sys.stdout.write('Start time after end of current data!') start_time = self.current.start_time emonth = np.int(self.months.index(self.emonthvar.get()) + 1) end_time = datetime(np.int(self.eyearvar.get()), emonth, np.int(self.edatevar.get()), np.int(self.ehourvar.get()), np.int(self.eminutevar.get())) sys.stdout.flush() lon = np.float(self.lon.get()) lat = np.float(self.lat.get()) radius = np.float(self.radius.get()) elon = np.float(self.elon.get()) elat = np.float(self.elat.get()) eradius = np.float(self.eradius.get()) if lon != elon or lat != elat or start_time != end_time: lon = [lon, elon] lat = [lat, elat] radius = [radius, eradius] start_time = [start_time, end_time] cone = True else: cone = False if self.model.get() == 'Leeway': o = Leeway(loglevel=20) for ln, lc in enumerate(self.leewaycategories): if self.oljetype.get() == lc.strip().replace('>', ''): print 'Leeway object category: ' + lc break o.seed_elements(lon=lon, lat=lat, number=2000, radius=radius, time=start_time, objectType=ln + 1) if self.model.get() == 'OpenOil': o = OpenOil(loglevel=20) o.seed_elements(lon=lon, lat=lat, number=2000, radius=radius, time=start_time, cone=cone, oiltype=self.oljetype.get()) print 'Making Basemap...' lons = o.elements_scheduled.lon lats = o.elements_scheduled.lat bufferlat = 2 basemap = reader_basemap_landmask.Reader( llcrnrlon=lons.min() - bufferlat, llcrnrlat=lats.min() - bufferlat, urcrnrlon=lons.max() + bufferlat, urcrnrlat=lats.max() + bufferlat, resolution='h', projection='merc', minimise_whitespace=True) o.add_reader([basemap, self.current, self.wind]) time_step = 1800 # Half hour duration = int(self.durationhours.get()) * 3600 / time_step if self.directionvar.get() == 'backwards': time_step = -time_step o.run(steps=duration, time_step=time_step) print o tk.Button(self.master, text='Animation', command=o.animation).grid(row=7, column=2, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget).grid(row=7, column=3, sticky=tk.W, pady=4) o.plot()
o = Leeway(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') # Making customised, full resolution landmask reader_landmask = reader_global_landmask.Reader( llcrnrlon=5.5, llcrnrlat=61.05, urcrnrlon=6.65, urcrnrlat=61.21) o.add_reader([reader_landmask, reader_norkyst, reader_arome]) # Seed elements lat = 61.117594; lon = 6.55 #time = [reader_arome.start_time, # reader_arome.start_time + timedelta(hours=5)] time = reader_arome.start_time objType = 1 # 1: Person-in-water (PIW), unknown state (mean values) o.seed_elements(lon, lat, radius=50, number=5000, time=time, objectType=objType) # Running model for 66 hours o.run(steps=66*12, time_step=300) # Print and plot results print(o) o.plot()
# 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(lw.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(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=2.5, llcrnrlat=59.3, urcrnrlon=5.8, urcrnrlat=62.5, resolution='i') lw.add_reader([reader_norkyst, reader_arome, reader_basemap]) # Seed elements along cone, e.g. ship track with # increasing uncertainty in position lon = [3.6, 5.1]; lat = [61., 59.6]; time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] #time = reader_arome.start_time objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon, lat, radius=[1000, 10000], number=5000, time=time, objectType=objType) # Running model (until end of driver data) lw.run(steps=66*4, time_step=900) # Print and plot results
'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=5.5, llcrnrlat=61.05, urcrnrlon=6.65, urcrnrlat=61.21, resolution='f', projection='merc') reader_norkyst.interpolation = 'linearND' # Slower, but extrapolates to coast reader_arome.interpolation = 'linearND' o.add_reader([reader_basemap, reader_norkyst, reader_arome]) # Seed elements at defined position and time lat = 61.117594; lon = 6.55 time = None #time = [reader_arome.start_time, # reader_arome.start_time + timedelta(hours=5)] time = reader_arome.start_time objType = 1 # 1: Person-in-water (PIW), unknown state (mean values) o.seed_elements(lon, lat, radius=50, number=5000, time=time, objectType=objType) print o # Running model (until end of driver data) o.run(steps=66*12, time_step=300) #stop
def run_opendrift(self): sys.stdout.write('running OpenDrift') month = np.int(self.months.index(self.monthvar.get()) + 1) start_time = datetime(np.int(self.yearvar.get()), month, np.int(self.datevar.get()), np.int(self.hourvar.get()), np.int(self.minutevar.get())) if start_time > self.current.end_time: sys.stdout.write('Start time after end of current data!') start_time = self.current.start_time emonth = np.int(self.months.index(self.emonthvar.get()) + 1) end_time = datetime(np.int(self.eyearvar.get()), emonth, np.int(self.edatevar.get()), np.int(self.ehourvar.get()), np.int(self.eminutevar.get())) sys.stdout.flush() lon = np.float(self.lon.get()) lat = np.float(self.lat.get()) radius = np.float(self.radius.get()) elon = np.float(self.elon.get()) elat = np.float(self.elat.get()) eradius = np.float(self.eradius.get()) if lon != elon or lat != elat or start_time != end_time: lon = [lon, elon] lat = [lat, elat] radius = [radius, eradius] start_time = [start_time, end_time] cone = True else: cone = False if self.model.get() == 'Leeway': o = Leeway(loglevel=0) for ln, lc in enumerate(self.leewaycategories): if self.oljetype.get() == lc.strip().replace('>', ''): print 'Leeway object category: ' + lc break o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, objectType=ln + 1) if self.model.get() == 'OpenOil': o = OpenOil3D(weathering_model='noaa', loglevel=0) o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, cone=cone, oiltype=self.oljetype.get()) o.add_reader([self.current, self.wind, self.waves]) o.set_config('general:basemap_resolution', 'h') time_step = 1800 # Half hour duration = int(self.durationhours.get()) * 3600 / time_step if self.directionvar.get() == 'backwards': time_step = -time_step o.run(steps=duration, time_step=time_step) print o if self.has_diana is True: diana_filename = self.dianadir + '/opendrift_' + \ self.model.get() + o.start_time.strftime( '_%Y%m%d_%H%M.nc') tk.Button(self.master, text='Save to Diana', command=o.write_netcdf_density_map(diana_filename)).grid( row=7, column=2, sticky=tk.W, pady=4) tk.Button(self.master, text='Animation', command=o.animation).grid(row=7, column=3, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget).grid(row=7, column=4, sticky=tk.W, pady=4)
# 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(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=3.3, llcrnrlat=59.5, urcrnrlon=5.5, urcrnrlat=62.5, resolution='h', projection='merc') #lw.add_reader([reader_norkyst, reader_arome, reader_basemap]) # Adding readers succesively, and specifying which variables they # shall provide. This way, order of adding readers does not matter, # except for small rounding differences due to different projection lw.add_reader(reader_norkyst, variables=['x_sea_water_velocity', 'y_sea_water_velocity']) lw.add_reader(reader_arome, variables=['x_wind', 'y_wind']) lw.add_reader(reader_basemap, variables=['land_binary_mask']) # Seeding some particles lon = 4.5; lat = 60.0; # Outside Bergen # Seed leeway elements at defined position and time objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon, lat, radius=1000, number=3000, time=reader_arome.start_time, objectType=objType) lw.set_projection('+proj=merc')
time = datetime.now() duration = timedelta(days=3) bufferlat = duration.total_seconds()/111000 bufferlon = bufferlat*np.cos(lat*np.pi/180) # Fetching current data from CMEMS cmems_file = 'opendrift_cmems_download.nc' if os.path.exists(cmems_file): # Reuising downloaded file, if existing. Delete it to force update. cmems = reader_netCDF_CF_generic.Reader(cmems_file) else: cmems = reader_cmems.Reader(username=username, password=password, motu=motu_client, lon_min = lon - bufferlon, lon_max = lon + bufferlon, lat_min = lat - bufferlat, lat_max = lat + bufferlat, time_start = time, time_end = time + duration) # Fetching wind data from NCEP reader_ncep = reader_netCDF_CF_generic.Reader('http://oos.soest.hawaii.edu/thredds/dodsC/hioos/model/atm/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd') o = Leeway() o.add_reader([cmems, reader_ncep]) o.seed_elements(lon=lon, lat=lat, number=5000, time=time) o.run(duration=duration, outfile='cmems.nc', time_step=600, time_step_output=3600) o.animation()
from datetime import timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.leeway import Leeway lw = Leeway(loglevel=0) # Set loglevel to 0 for debug information # Arome reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') lw.add_reader([reader_norkyst, reader_arome]) # Intermediate map resolution is sufficient for large scale lw.set_config('general:basemap_resolution', 'i') # Seed elements along cone, e.g. ship track with # increasing uncertainty in position lon = [3.6, 5.1]; lat = [61., 59.6]; time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] objType = 26 # 26 = Life-raft, no ballast lw.seed_elements(lon, lat, radius=[1000, 10000], number=5000, time=time, objectType=objType) # Running model
def run_opendrift(self): sys.stdout.write('running OpenDrift') month = np.int(self.months.index(self.monthvar.get()) + 1) start_time = datetime(np.int(self.yearvar.get()), month, np.int(self.datevar.get()), np.int(self.hourvar.get()), np.int(self.minutevar.get())) if start_time > self.current.end_time: sys.stdout.write('Start time after end of current data!') start_time = self.current.start_time emonth = np.int(self.months.index(self.emonthvar.get()) + 1) end_time = datetime(np.int(self.eyearvar.get()), emonth, np.int(self.edatevar.get()), np.int(self.ehourvar.get()), np.int(self.eminutevar.get())) sys.stdout.flush() lon = np.float(self.lon.get()) lat = np.float(self.lat.get()) radius = np.float(self.radius.get()) elon = np.float(self.elon.get()) elat = np.float(self.elat.get()) eradius = np.float(self.eradius.get()) if lon != elon or lat != elat or start_time != end_time: lon = [lon, elon] lat = [lat, elat] radius = [radius, eradius] start_time = [start_time, end_time] cone = True else: cone = False if self.model.get() == 'Leeway': o = Leeway(loglevel=20) for ln, lc in enumerate(self.leewaycategories): if self.oljetype.get() == lc.strip().replace('>', ''): print 'Leeway object category: ' + lc break o.seed_elements(lon=lon, lat=lat, number=2000, radius=radius, time=start_time, objectType=ln + 1) if self.model.get() == 'OpenOil': o = OpenOil(loglevel=20) o.seed_elements(lon=lon, lat=lat, number=2000, radius=radius, time=start_time, cone=cone, oiltype=self.oljetype.get()) print 'Making Basemap...' lons = o.elements_scheduled.lon lats = o.elements_scheduled.lat bufferlat = 2 basemap = reader_basemap_landmask.Reader( llcrnrlon=lons.min() - bufferlat, llcrnrlat=lats.min() - bufferlat, urcrnrlon=lons.max() + bufferlat, urcrnrlat=lats.max() + bufferlat, resolution='h', projection='merc', minimise_whitespace=True) o.add_reader([basemap, self.current, self.wind]) time_step = 1800 # Half hour duration = int(self.durationhours.get())*3600/time_step if self.directionvar.get() == 'backwards': time_step = -time_step o.run(steps=duration, time_step=time_step) print o tk.Button(self.master, text='Animation', command=o.animation).grid(row=7, column=2, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget).grid(row=7, column=3, sticky=tk.W, pady=4) o.plot()