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_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_global_today(self): o = Leeway(loglevel=0) o.add_readers_from_file(o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') o.seed_elements(lon=50, lat=29, number=100, radius=1000, time=datetime.now()) o.run(steps=15) print (o) self.assertEqual(o.steps_calculation, 15)
def test_leewayprop(): """Check that Leeway properties are properly read.""" object_type = 85 # MED-WASTE-7 lee = Leeway(loglevel=20) object_type = object_type assert lee.leewayprop[object_type]['Description'] == '>>Medical waste, syringes, small' assert lee.leewayprop[object_type]['DWSLOPE'] == 1.79
def set_model(self, model): if model == 'OpenOil': self.categoryLabel['text'] = 'Oil type' self.oljetype.set('') self.categorydrop['menu'].delete(0, 'end') self.o = OpenOil() for cat in self.o.oiltypes: self.categorydrop['menu'].add_command(label=cat, command=tk._setit( self.oljetype, cat)) self.oljetype.set(self.o.oiltypes[0]) if model == 'Leeway': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.categorydrop['menu'].delete(0, 'end') self.o = Leeway() self.leewaycategories = [ self.o.leewayprop[c]['Description'].strip().replace('>', '') for c in self.o.leewayprop ] for cat in self.leewaycategories: self.categorydrop['menu'].add_command(label=cat, command=tk._setit( self.oljetype, cat)) self.oljetype.set(self.leewaycategories[0])
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 set_model(self, model): if model == 'OpenOil': self.categoryLabel['text'] = 'Oil type' self.oljetype.set('') self.o = OpenOil3D(weathering_model='noaa', location='NORWAY') self.categorydrop['values'] = self.o.oiltypes self.oljetype.set(self.o.oiltypes[0]) if model == 'Leeway': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.o = Leeway() self.leewaycategories = [ self.o.leewayprop[c]['Description'].strip().replace('>', '') for c in self.o.leewayprop ] self.categorydrop['values'] = self.leewaycategories self.oljetype.set(self.leewaycategories[0])
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 set_model(self, model): if model == 'OpenOil': self.o = OpenOil3D(weathering_model='noaa', location='NORWAY') elif model == 'Leeway': self.o = Leeway() elif model == 'ShipDrift': self.o = ShipDrift() for con in self.config.winfo_children(): con.destroy() self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) try: self.results.destroy() except: pass print('Setting model: ' + model) print(self.o.list_configspec()) sc = self.o.get_seed_config() print(sc) self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=6, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): if i in ['ocean_only', 'jibeProbability']: continue # workaround, should be avoided in future self.seed_input_label[i] = tk.Label(self.seed_frame, text=i + '\t') self.seed_input_label[i].grid(row=num, column=0) self.seed_input_var[i] = tk.StringVar() if type(sc[i]['options']) is list: self.seed_input[i] = ttk.Combobox( self.seed_frame, width=50, textvariable=self.seed_input_var[i], values=sc[i]['options']) self.seed_input_var[i].set(sc[i]['default']) else: self.seed_input[i] = tk.Entry( self.seed_frame, textvariable=self.seed_input_var[i], width=6, justify=tk.RIGHT) self.seed_input[i].insert(0, sc[i]['default']) self.seed_input[i].grid(row=num, column=1)
def check_seeding(self): print('#' * 50) print('Hang on, plot is comming in a few seconds...') print('#' * 50) 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())) 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 so = Leeway(loglevel=50) so.seed_elements(lon=lon, lat=lat, radius=radius, time=start_time) so.plot(buffer=.5, fast=True) del so
def test_leeway_config_object(): """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 assert l.leewayprop[objType]['Description'] == 'Surf board with person' assert l.leewayprop[objType]['OBJKEY'] == 'PERSON-POWERED-VESSEL-2'
def test_simulation_back_extent(): # backward leeb = Leeway() objectType = 50 # FISHING-VESSEL-1 leeb.seed_elements(lon=4, lat=60, number=100, objectType=objectType, time=datetime(2015, 1, 1)) leeb.fallback_values['x_wind'] = 1.5 leeb.fallback_values['y_wind'] = 10 leeb.fallback_values[ 'x_sea_water_velocity'] = 1.5 # maximum speed in automatic landmask leeb.fallback_values['y_sea_water_velocity'] = 0 with pytest.raises(ValueError) as ex: leeb.run(duration=timedelta(days=-1), time_step=3600, time_step_output=10 * 3600) assert 'Time step must be negative if duration is negative.' in str( ex.value)
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 check_seeding(self): print('#' * 50) print('Hang on, plot is comming in a few seconds...') mapres = self.mapresvar.get()[0] if mapres == 'f': print( '...actually more like 30 seconds for full resolution coastline....' ) if self.has_diana is True: print('Du far ta deg ein liten trall mens du ventar.') print('#' * 50) 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())) 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 so = Leeway(loglevel=50) so.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time) so.set_config('general:basemap_resolution', mapres) so.plot(buffer=.5) del so
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
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 check_seeding(self): print('#'*50) print('Hang on, plot is comming in a few seconds...') print('#'*50) month = int(self.months.index(self.monthvar.get()) + 1) start_time = datetime(int(self.yearvar.get()), month, int(self.datevar.get()), int(self.hourvar.get()), int(self.minutevar.get())) emonth = int(self.months.index(self.emonthvar.get()) + 1) end_time = datetime(int(self.eyearvar.get()), emonth, int(self.edatevar.get()), int(self.ehourvar.get()), int(self.eminutevar.get())) sys.stdout.flush() lon = float(self.lon.get()) lat = float(self.lat.get()) radius = float(self.radius.get()) elon = float(self.elon.get()) elat = float(self.elat.get()) eradius = 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 so = Leeway(loglevel=50) for k,v in self.GUI_config.items(): try: so.set_config(k, v) except: pass so.seed_cone(lon=lon, lat=lat, radius=radius, time=start_time) so.plot(buffer=.5, fast=True) del so
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 check_seeding(self): print '#'*50 print 'Hang on, plot is comming in a few seconds...' mapres = self.mapresvar.get()[0] if mapres == 'f': print '...actually more like 30 seconds for full resolution coastline....' if self.has_diana is True: print 'Du far ta deg ein liten trall mens du ventar.' print '#'*50 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())) 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 so = Leeway(loglevel=50) so.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time) so.set_config('general:basemap_resolution', mapres) so.plot(buffer=.5) del so
#!/usr/bin/env python from datetime import timedelta from opendrift.readers import reader_basemap_landmask from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.leeway import Leeway o = Leeway(loglevel=0) # 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(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=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
#!/usr/bin/env python """ Vietnam ================================== """ from datetime import datetime, timedelta from opendrift.models.leeway import Leeway o = Leeway(loglevel=20) # Set loglevel to 0 for debug information # Adding readers for global Thredds datasets: # - Ocean forecast from global Hycom # - Weather forecast from NOAA/NCEP o.add_readers_from_list([ 'https://tds.hycom.org/thredds/dodsC/GLBy0.08/latest', 'https://pae-paha.pacioos.hawaii.edu/thredds/dodsC/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd']) # Seed some particles objType = 26 # 26 = Life-raft, no ballast o.seed_elements(lon=107.8, lat=10.0, radius=1000, number=1000, objectType=objType, time=datetime.now()) # Run model o.run(duration=timedelta(days=3), time_step=timedelta(hours=1), time_step_output=timedelta(hours=3)) # Print and plot results print(o) o.plot(fast=True)
#!/usr/bin/env python from datetime import timedelta from opendrift.readers import reader_basemap_landmask from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.leeway import Leeway 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 (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
def set_model(self, model): if model == 'OpenOil': self.o = OpenOil(weathering_model='noaa', location='NORWAY') elif model == 'Leeway': self.o = Leeway() elif model == 'ShipDrift': self.o = ShipDrift() elif model == 'OpenBerg': self.o = OpenBerg() for con in self.config.winfo_children(): con.destroy() self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) try: self.results.destroy() except: pass try: # Removing depth input boxes self.depthlabel.destroy() self.depth.destroy() self.seafloor.destroy() self.amount.destroy() self.amountlabel.destroy() except: pass print('Setting model: ' + model) print(self.o.list_configspec()) sc = self.o.get_seed_config() print(sc) self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=60, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): if i in ['ocean_only', 'jibeProbability']: continue # workaround, should be avoided in future self.seed_input_label[i] = tk.Label(self.seed_frame, text=i + '\t') self.seed_input_label[i].grid(row=num, column=0) self.seed_input_var[i] = tk.StringVar() if type(sc[i]['options']) is list: self.seed_input[i] = ttk.Combobox( self.seed_frame, width=50, textvariable=self.seed_input_var[i], values=sc[i]['options']) self.seed_input_var[i].set(sc[i]['default']) else: self.seed_input[i] = tk.Entry( self.seed_frame, textvariable=self.seed_input_var[i], width=6, justify=tk.RIGHT) self.seed_input[i].insert(0, sc[i]['default']) self.seed_input[i].grid(row=num, column=1) if model == 'OpenOil': # User may be able to chose release depth self.depthlabel = tk.Label(self.duration, text='Spill depth [m]') self.depthlabel.grid(row=60, column=0) self.depthvar = tk.StringVar() self.depth = tk.Entry(self.duration, textvariable=self.depthvar, width=6, justify=tk.RIGHT) self.depth.grid(row=60, column=2) self.depth.insert(0, '0') self.seafloorvar = tk.IntVar() self.seafloor = tk.Checkbutton(self.duration, variable=self.seafloorvar, text='seafloor', command=self.seafloorbutton) self.seafloor.grid(row=60, column=3) self.amountvar = tk.StringVar() self.amount = tk.Entry(self.duration, textvariable=self.amountvar, width=6, justify=tk.RIGHT) self.amount.grid(row=60, column=4) self.amount.insert(0, '100') self.amountlabel = tk.Label(self.duration, text='m3 (per hour)') self.amountlabel.grid(row=60, column=5)
def test_leeway_today(self): o = Leeway(loglevel=0) o.add_readers_from_file(o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') o.set_config('general:basemap_resolution', 'i') o.seed_elements(lon=14, lat=67.85, number=100, radius=1000, time=datetime.now()) o.run(steps=15) print o self.assertEqual(o.steps_calculation, 15)
#!/usr/bin/env python from opendrift.readers import reader_basemap_landmask 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('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=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,
def run_opendrift(self): sys.stdout.write('running OpenDrift') try: self.budgetbutton.destroy() except Exception as e: print e pass 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())) 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_readers_from_file(o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') 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 if self.has_diana is True: extra_args = {'outfile': self.outputdir + '/opendrift_' + self.model.get() + o.start_time.strftime( '_%Y%m%d_%H%M.nc')} else: extra_args = {} mapres = self.mapresvar.get()[0] o.set_config('general:basemap_resolution', mapres) o.run(steps=duration, time_step=time_step, time_step_output=time_step, **extra_args) 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') o.write_netcdf_density_map(diana_filename) tk.Button(self.master, text='Show in Diana', command=lambda: os.system('diana &') ).grid(row=8, column=2, sticky=tk.W, pady=4) tk.Button(self.master, text='Animation', command=o.animation).grid(row=8, column=3, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': self.budgetbutton = tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget) self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
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()
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()
def run_opendrift(self): sys.stdout.write('running OpenDrift') try: self.budgetbutton.destroy() except Exception as e: print e pass 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())) 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()) readers = [ # Note that order (priority) is important! '/lustre/storeA/project/copernicus/sea/romsnorkyst/zdepths1h/*fc*.nc', 'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be', '/lustre/storeA/project/copernicus/sea/romsnordic/zdepths1h/roms_nordic4_ZDEPTHS_hr.fc.*.nc', 'http://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be', '/lustre/storeA/project/metproduction/products/meps/symlinks/thredds/meps_det_pp_2_5km_latest.nc', 'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_pp_2_5km_latest.nc', '/lustre/storeA/project/metproduction/products/arome2_5_arctic/thredds/arome_arctic_pp_2_5km_latest.nc', 'http://thredds.met.no/thredds/dodsC/aromearcticlatest/arome_arctic_pp_2_5km_latest.nc', '/lustre/storeA/project/copernicus/sea/mywavewam4/*fc*.nc', 'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be', 'http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_91.2/uv3z', 'http://oos.soest.hawaii.edu/thredds/dodsC/hioos/model/atm/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd'] o.add_readers_from_list(readers) 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 if self.has_diana is True: extra_args = {'outfile': self.outputdir + '/opendrift_' + self.model.get() + o.start_time.strftime( '_%Y%m%d_%H%M.nc')} else: extra_args = {} mapres = self.mapresvar.get()[0] o.set_config('general:basemap_resolution', mapres) o.run(steps=duration, time_step=time_step, time_step_output=time_step, **extra_args) 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') o.write_netcdf_density_map(diana_filename) tk.Button(self.master, text='Show in Diana', command=lambda: os.system('diana &') ).grid(row=8, column=2, sticky=tk.W, pady=4) tk.Button(self.master, text='Animation', command=o.animation).grid(row=8, column=3, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': self.budgetbutton = tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget) self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
#!/usr/bin/env python from datetime import timedelta from opendrift.readers import reader_basemap_landmask 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('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
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')
#!/usr/bin/env python """ Leeway ================================== """ from datetime import timedelta import cmocean from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.leeway import Leeway 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)
# 'http://thredds.met.no/example_of_nonexisting_url.nc', # 'example_of_nonexisting_file', # ] for case in ['oil', 'leeway']: # test two models for timestep in [900, -900]: # forwards and backwards for z in [0, -200]: # seeding at sea surface and at 200 m depth if case == 'oil': o = OpenOil3D(weathering_model='noaa') args = {'oiltype': 'HEIDRUN, STATOIL', #args = {'oiltype': 'WISTING', 'z': z} else: if z < 0: continue # Only surface seeding for Leeway o = Leeway() args = {'objectType': 32} #o.add_readers_from_list(readers, timeout=5) o.add_halo_readers() print o #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms lons=[3.8, 3.82]; lats=[59.6, 59.61] # North Sea o.seed_elements(lon=lons, lat=lats, time=[datetime.now() - timedelta(hours=3), datetime.now()],
def test_lazy_reader_leeway_compare(self): o1 = Leeway(loglevel=0) #o1.set_config('environment:fallback:land_binary_mask', 0) o1.required_variables = [r for r in o1.required_variables if r != 'land_binary_mask'] o1.add_readers_from_list(reader_list, lazy=False) time = o1.readers['roms native'].start_time o1.seed_elements(lat=67.85, lon=14, time=time) o1.run(steps=5) o2 = Leeway(loglevel=20) #o2.set_config('environment:fallback:land_binary_mask', 0) o2.required_variables = [r for r in o1.required_variables if r != 'land_binary_mask'] o2.add_readers_from_list(reader_list, lazy=True) o2.seed_elements(lat=67.85, lon=14, time=time) o2.run(steps=5) # Some differences in wind and current components # due to different coordinate system for var in o1.history.dtype.names: if var in ['x_wind', 'y_wind', 'x_sea_water_velocity', 'y_sea_water_velocity']: tolerance = 1 else: tolerance = 5 self.assertIsNone(np.testing.assert_array_almost_equal( o1.history[var], o2.history[var], tolerance))
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.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 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() == 92 assert lee.num_elements_deactivated() == 8 # stranded lee.export_ascii(tmpdir + '/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)
def test_leeway_global_one_month_ago(self): o = Leeway(loglevel=0) o.add_readers_from_file(o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') o.set_config('general:basemap_resolution', 'i') o.seed_elements(lon=50, lat=29, number=100, radius=1000, time=datetime.now() - timedelta(days=30)) o.run(steps=15) o.export_ascii('leeway_ascii.txt') os.remove('leeway_ascii.txt') print o self.assertEqual(o.steps_calculation, 15)
def run_opendrift(self): sys.stdout.write('running OpenDrift') try: self.budgetbutton.destroy() except Exception as e: print(e) pass 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())) 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_readers_from_file(o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') 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 if self.has_diana is True: extra_args = { 'outfile': self.outputdir + '/opendrift_' + self.model.get() + o.start_time.strftime('_%Y%m%d_%H%M.nc') } else: extra_args = {} mapres = self.mapresvar.get()[0] o.set_config('general:basemap_resolution', mapres) o.run(steps=duration, time_step=time_step, time_step_output=time_step, **extra_args) 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') o.write_netcdf_density_map(diana_filename) tk.Button(self.master, text='Show in Diana', command=lambda: os.system('diana &')).grid(row=8, column=2, sticky=tk.W, pady=4) tk.Button(self.master, text='Animation', command=o.animation).grid(row=8, column=3, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': self.budgetbutton = tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget) self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
def run_opendrift(self): sys.stdout.write('running OpenDrift') try: self.budgetbutton.destroy() except Exception as e: print(e) pass 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())) 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': self.o = Leeway(loglevel=0) #for ln, lc in enumerate(self.leewaycategories): # if self.oljetype.get() == lc.strip().replace('>', ''): # print('Leeway object category: ' + lc) # break #extra_seed_args = {'objectType': ln + 1} elif self.model.get() == 'OpenOil': self.o = OpenOil(weathering_model='noaa', loglevel=0) #extra_seed_args = {'oiltype': self.oljetype.get()} elif self.model.get() == 'ShipDrift': self.o = ShipDrift(loglevel=0) extra_seed_args = {} for se in self.seed_input: if se == 'ocean_only': continue # To be fixed/removed val = self.seed_input[se].get() try: extra_seed_args[se] = np.float(val) except: extra_seed_args[se] = val self.o.set_config('seed:' + se, val) if 'object_type' in extra_seed_args: extra_seed_args['objectType'] = extra_seed_args['object_type'] del extra_seed_args['object_type'] self.o.add_readers_from_file(self.o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') extra_seed_args = {} if self.model.get() == 'OpenOil': if self.seafloorvar.get() == 1: z = 'seafloor' else: z = -np.abs(np.float(self.depthvar.get())) # ensure negative z extra_seed_args['z'] = z extra_seed_args['m3_per_hour'] = np.float(self.amountvar.get()) self.o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, cone=cone, **extra_seed_args) #time_step = o.get_config('general:time_step_minutes')*60 time_step = 900 # 15 minutes time_step_output = timedelta(minutes=30) duration = int(self.durationhours.get())*3600/time_step if self.directionvar.get() == 'backwards': time_step = -time_step if self.has_diana is True: extra_args = {'outfile': self.outputdir + '/opendrift_' + self.model.get() + self.o.start_time.strftime('_%Y%m%d_%H%M.nc')} else: extra_args = {} #mapres = self.mapresvar.get()[0] self.simulationname = 'opendrift_' + self.model.get() + \ self.o.start_time.strftime('_%Y%m%d_%H%M') # Starting simulation run self.o.run(steps=duration, time_step=time_step, time_step_output=time_step_output, **extra_args) print(self.o) self.results.destroy() self.results = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.results.grid(row=70, column=3, columnspan=1, sticky='ew') tk.Button(self.results, text='Show animation', command=lambda: self.handle_result( 'showanimation')).grid(row=10, column=1) tk.Button(self.results, text='Save animation', command=lambda: self.handle_result( 'saveanimation')).grid(row=20, column=1) tk.Button(self.results, text='Show plot', command=lambda: self.handle_result( 'showplot')).grid(row=30, column=1) tk.Button(self.results, text='Save plot', command=lambda: self.handle_result( 'saveplot')).grid(row=40, column=1) if self.model.get() == 'OpenOil': tk.Button(self.results, text='Save oil budget', command=lambda: self.handle_result( 'saveoilbudget')).grid(row=50, column=1) tk.Button(self.results, text='Show oil budget', command=lambda: self.handle_result( 'showoilbudget')).grid(row=60, column=1) if self.has_diana is True: diana_filename = self.dianadir + self.simulationname + '.nc' self.o.write_netcdf_density_map(diana_filename) tk.Button(self.results, text='Show in Diana', command=lambda: os.system('diana &') ).grid(row=80, column=1)
] for case in ['oil', 'leeway']: # test two models for timestep in [900, -900]: # forwards and backwards for z in [0, -200]: # seeding at sea surface and at 200 m depth if case == 'oil': o = OpenOil(weathering_model='noaa') args = { 'oiltype': 'IVAR AASEN 2012', #args = {'oiltype': 'WISTING', 'z': z } else: if z < 0: continue # Only surface seeding for Leeway o = Leeway() args = {'object_type': 32} o.add_readers_from_list(readers, timeout=5) print(o) #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms lons = [3.8, 3.82] lats = [59.6, 59.61] # North Sea o.seed_elements( lon=lons, lat=lats,
def test_config_suggestion(self): o = Leeway(loglevel=20) try: o.set_config('seed:object_type', 'person') except Exception as e: self.assertTrue('Did you mean' in str(e))
#!/usr/bin/env python 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]) 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
#!/usr/bin/env python from opendrift.readers import reader_basemap_landmask 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('http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_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=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,
'https://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be', 'https://thredds.met.no/example_of_nonexisting_url.nc', 'example_of_nonexisting_file'] for case in ['oil', 'leeway']: # test two models for timestep in [900, -900]: # forwards and backwards for z in [0, -200]: # seeding at sea surface and at 200 m depth if case == 'oil': o = OpenOil3D(weathering_model='noaa') args = {'oiltype': 'IVAR AASEN 2012', #args = {'oiltype': 'WISTING', 'z': z} else: if z < 0: continue # Only surface seeding for Leeway o = Leeway() args = {'objectType': 32} o.add_readers_from_list(readers, timeout=5) print(o) #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms lons=[3.8, 3.82]; lats=[59.6, 59.61] # North Sea o.seed_elements(lon=lons, lat=lats, time=[datetime.now() - timedelta(hours=3), datetime.now()], number=1000, radius = [0, 1000],