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_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 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 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)
#!/usr/bin/env python from datetime import datetime, timedelta from opendrift.readers import reader_basemap_landmask from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=0) o.set_config("general:basemap_resolution", "h") o.add_readers_from_list( [ #'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be', "http://thredds.met.no/thredds/dodsC/fou-hi/nordic4km-1h/Nordic-4km_SURF_1h_avg_00.nc", #'http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc', "/lustre/storeB/project/metproduction/products/ecmwf/nc/ec_atmo_0_1deg_20161220T120000Z_1h.nc", "http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be", ] ) # Seeding some particles lon = 5.0 lat = 63.0 # Outside Bergen # time = reader_arome.start_time # time = datetime(2016, 12, 20, 17, 0) time = datetime.now() # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=1000, number=1000, time=time, length=80.0, beam=10.0, height=9.0, draft=4.0)
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(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))
#!/usr/bin/env python """ Ship drift ================================== """ from datetime import datetime from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=20) o.add_readers_from_list([ 'https://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be', 'https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc', 'https://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be' ]) #%% # Seed ship elements at defined position and time o.seed_elements(lon=5.0, lat=63.0, radius=1000, number=1000, time=datetime.utcnow(), length=80.0, beam=10.0, height=9.0, draft=4.0) #%% # Running model
class OpenDriftGUI(tk.Tk): def __init__(self): # Available models self.available_models = opendrift.get_model_names() tk.Tk.__init__(self) ################## # Layout frames ################## self.n = ttk.Notebook(self.master) self.n.grid() self.seed = ttk.Frame(self.n) self.config = ttk.Frame(self.n) self.n.add(self.seed, text='Seeding') self.n.add(self.config, text='Config') # Top self.top = tk.Frame(self.seed, relief=tk.FLAT, pady=25, padx=25) self.top.grid(row=0, column=1, rowspan=1) # Config self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) # Time start and end self.start_t = tk.Frame(self.seed, relief=tk.FLAT) self.start_t.grid(row=2, column=0, rowspan=1) self.end_t = tk.Frame(self.seed, relief=tk.FLAT) self.end_t.grid(row=3, column=0, rowspan=1) self.start = tk.Frame(self.seed, bg='lightgray', bd=2, relief=tk.SUNKEN, pady=5, padx=5) self.start.grid(row=2, column=1, rowspan=1) self.end = tk.Frame(self.seed, bg='gray', bd=2, relief=tk.SUNKEN, padx=5, pady=5) self.end.grid(row=3, column=1) self.coastline = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.coastline.grid(row=4, column=1) self.duration = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=5) self.duration.grid(row=5, column=1) self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') self.output = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.output.grid(row=7, column=2, columnspan=8, sticky='nsew') ########################## self.title('OpenDrift') o = OpenOil3D(weathering_model='noaa', location='NORWAY') try: img = ImageTk.PhotoImage(Image.open(o.test_data_folder() + '../../docs/opendrift_logo.png')) panel = tk.Label(self.seed, image=img) panel.image = img panel.grid(row=0, column=0) except: pass # Could not display logo ####################################################### tk.Label(self.top, text='Simulation type').grid(row=0, column=0) self.model = tk.StringVar() models = ['OpenOil', 'Leeway'] models = opendrift.get_model_names() self.model.set(models[0]) self.modeldrop = tk.OptionMenu(self.top, self.model, *(models), command=self.set_model) self.modeldrop.grid(row=0, column=1) help_button = tk.Button(self.top, text='Help', command=self.show_help) help_button.grid(row=0, column=2, padx=50) self.categoryLabel = tk.Label(self.seed, text='Oil type') self.categoryLabel.grid(row=1, column=0) oljetyper = o.oiltypes self.oljetype = tk.StringVar() self.oljetype.set(oljetyper[0]) self.categorydrop = ttk.Combobox(self.seed, width=50, textvariable=self.oljetype, values=oljetyper) self.categorydrop.grid(row=1, column=1) ########## # Release ########## startlabel = tk.Label(self.start_t, text="\n\nStart release\n\n") startlabel.grid(row=0, column=0) tk.Label(self.start, text='Longitude').grid(row=0, column=1) tk.Label(self.start, text='Latitude').grid(row=0, column=0) tk.Label(self.start, text='Radius [m]').grid(row=0, column=2) self.latvar = tk.StringVar() self.lonvar = tk.StringVar() self.radiusvar = tk.StringVar() self.lat = tk.Entry(self.start, textvariable=self.latvar, width=6, justify=tk.RIGHT) self.lon = tk.Entry(self.start, textvariable=self.lonvar, width=6, justify=tk.RIGHT) self.radius = tk.Entry(self.start, width=6, textvariable=self.radiusvar, justify=tk.RIGHT) self.lon.grid(row=1, column=1) self.lon.insert(0, '4.5') self.lat.grid(row=1, column=0) self.lat.insert(0, '60.0') self.radius.grid(row=1, column=2) self.radius.insert(0, '1000') self.lonvar.trace('w', self.copy_position) self.latvar.trace('w', self.copy_position) self.radiusvar.trace('w', self.copy_position) ########## # Time ########## now = datetime.now() tk.Label(self.start, text='Day').grid(row=2, column=0) tk.Label(self.start, text='Month').grid(row=2, column=1) tk.Label(self.start, text='Year').grid(row=2, column=2) tk.Label(self.start, text='Hour').grid(row=2, column=3) tk.Label(self.start, text='Minutes [UTC]').grid(row=2, column=4) self.datevar = tk.StringVar() self.dates = range(1, 32) self.datevar.set(now.day) self.date = tk.OptionMenu(self.start, self.datevar, *self.dates) self.date.grid(row=3, column=0) self.monthvar = tk.StringVar() self.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] self.monthvar.set(self.months[now.month-1]) self.month = tk.OptionMenu(self.start, self.monthvar, *self.months) self.month.grid(row=3, column=1) self.yearvar = tk.StringVar() self.years = range(2015, now.year+1) self.yearvar.set(now.year) self.year = tk.OptionMenu(self.start, self.yearvar, *self.years) self.year.grid(row=3, column=2) self.hourvar = tk.StringVar() self.hours = range(0, 24) self.hourvar.set(now.hour) self.hour = tk.OptionMenu(self.start, self.hourvar, *self.hours) self.hour.grid(row=3, column=3) self.minutevar = tk.StringVar() self.minutes = range(0, 60, 5) self.minutevar.set(now.minute) self.minute = tk.OptionMenu(self.start, self.minutevar, *self.minutes) self.minute.grid(row=3, column=4) self.datevar.trace('w', self.copy_position) self.monthvar.trace('w', self.copy_position) self.yearvar.trace('w', self.copy_position) self.hourvar.trace('w', self.copy_position) self.minutevar.trace('w', self.copy_position) ############### # Release End ############### endlabel = tk.Label(self.end_t, text="\n\nEnd release\n\n") endlabel.grid(row=0, column=0) tk.Label(self.end, text='Longitude', bg='gray').grid(row=0, column=1) tk.Label(self.end, text='Latitude', bg='gray').grid(row=0, column=0) tk.Label(self.end, text='Radius [m]', bg='gray').grid(row=0, column=2) self.elat = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.eradius = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon.grid(row=1, column=1) self.elon.insert(0, '4.5') self.elat.grid(row=1, column=0) self.elat.insert(0, '60.0') self.eradius.grid(row=1, column=2) self.eradius.insert(0, '1000') ########## # Time ########## now = datetime.now() tk.Label(self.end, text='Day', bg='gray').grid(row=2, column=0) tk.Label(self.end, text='Month', bg='gray').grid(row=2, column=1) tk.Label(self.end, text='Year', bg='gray').grid(row=2, column=2) tk.Label(self.end, text='Hour', bg='gray').grid(row=2, column=3) tk.Label(self.end, text='Minutes [UTC]', bg='gray').grid(row=2, column=4) self.edatevar = tk.StringVar() self.edates = range(1, 32) self.edatevar.set(now.day) self.edate = tk.OptionMenu(self.end, self.edatevar, *self.edates) self.edate.grid(row=3, column=0) self.emonthvar = tk.StringVar() self.emonthvar.set(self.months[now.month-1]) self.emonth = tk.OptionMenu(self.end, self.emonthvar, *self.months) self.emonth.grid(row=3, column=1) self.eyearvar = tk.StringVar() self.eyears = range(2015, now.year+1) self.eyearvar.set(now.year) self.eyear = tk.OptionMenu(self.end, self.eyearvar, *self.eyears) self.eyear.grid(row=3, column=2) self.ehourvar = tk.StringVar() self.ehours = range(0, 24) self.ehourvar.set(now.hour) self.ehour = tk.OptionMenu(self.end, self.ehourvar, *self.ehours) self.ehour.grid(row=3, column=3) self.eminutevar = tk.StringVar() self.eminutes = range(0, 60, 5) self.eminutevar.set(now.minute) self.eminute = tk.OptionMenu(self.end, self.eminutevar, *self.eminutes) self.eminute.grid(row=3, column=4) self.eyear.config(bg='gray') self.emonth.config(bg='gray') self.edate.config(bg='gray') self.ehour.config(bg='gray') self.eminute.config(bg='gray') # Check seeding check_seed = tk.Button(self.end_t, text='Check seeding', command=self.check_seeding) check_seed.grid(row=1, column=0, padx=0) ####################### # Simulation duration ####################### tk.Label(self.coastline, text='Coastline resolution ').grid( row=4, column=1) self.mapresvar = tk.StringVar() self.mapres = tk.OptionMenu(self.coastline, self.mapresvar, *['full', 'high']) self.mapres.grid(row=4, column=2) self.mapresvar.set('high') tk.Label(self.duration, text='Run simulation ').grid(row=5, column=0) self.durationhours = tk.Entry(self.duration, width=3, justify=tk.RIGHT) self.durationhours.grid(row=5, column=1) self.durationhours.insert(0, 12) tk.Label(self.duration, text=' hours ').grid(row=5, column=2) self.directionvar = tk.StringVar() self.directionvar.set('forwards') self.direction = tk.OptionMenu(self.duration, self.directionvar, 'forwards', 'backwards') self.direction.grid(row=5, column=3) tk.Label(self.duration, text=' in time ').grid(row=5, column=4) ############## # Output box ############## self.text = tk.Text(self.output, wrap="word", height=18) self.text.grid(row=6, columnspan=8, sticky='nsew') self.text.tag_configure("stderr", foreground="#b22222") sys.stdout = TextRedirector(self.text, "stdout") sys.stderr = TextRedirector(self.text, "stderr") s = tk.Scrollbar(self) s.grid(row=6, column=8, sticky='ns') s.config(command=self.text.yview) self.text.config(yscrollcommand=s.set) # Diana self.dianadir = '/vol/vvfelles/opendrift/output/' if os.path.exists(self.dianadir): self.has_diana = True print 'Diana is available!' self.outputdir = '/vol/vvfelles/opendrift/output_native/' else: self.has_diana = False ############## # Initialise ############## o = OpenOil3D() for m in self.available_models: print m print opendrift.get_model(m) print opendrift.get_model(m)() ########## # RUN ########## tk.Button(self.seed, text='PEIS PAO', bg='green', command=self.run_opendrift).grid(row=8, column=1, sticky=tk.W, pady=4) def copy_position(self, a, b, c): self.elat.delete(0, tk.END) self.elat.insert(0, self.lat.get()) self.elon.delete(0, tk.END) self.elon.insert(0, self.lon.get()) self.eradius.delete(0, tk.END) self.eradius.insert(0, self.radius.get()) self.edatevar.set(self.datevar.get()) self.emonthvar.set(self.monthvar.get()) self.eyearvar.set(self.yearvar.get()) self.ehourvar.set(self.hourvar.get()) self.eminutevar.set(self.minutevar.get()) 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]) elif 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]) elif model == 'ShipDrift': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.o = ShipDrift() print dir(self.config) 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) print dir(self.config) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) print 'Setting model: ' + model print self.o.list_configspec() #default, minimum, maximum, options = self.o.get_configspec_default_min_max('seed:oil_type') #print default sc = self.o.get_seed_config() print sc self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame.destroy() self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): 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 show_help(self): help_url = 'https://github.com/OpenDrift/opendrift/wiki/Graphical-User-Interface' print 'Opening help website:\n' + help_url import webbrowser webbrowser.open(help_url) 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 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.seed, text='Show in Diana', command=lambda: os.system('diana &') ).grid(row=8, column=2, sticky=tk.W, pady=4) tk.Button(self.seed, 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.seed, text='Oil Budget', command=o.plot_oil_budget) self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
def __init__(self): # Available models self.available_models = opendrift.get_model_names() tk.Tk.__init__(self) ################## # Layout frames ################## self.n = ttk.Notebook(self.master) self.n.grid() self.seed = ttk.Frame(self.n) self.config = ttk.Frame(self.n) self.n.add(self.seed, text='Seeding') self.n.add(self.config, text='Config') # Top self.top = tk.Frame(self.seed, relief=tk.FLAT, pady=25, padx=25) self.top.grid(row=0, column=1, rowspan=1) # Config self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) # Time start and end self.start_t = tk.Frame(self.seed, relief=tk.FLAT) self.start_t.grid(row=20, column=0, rowspan=1) self.end_t = tk.Frame(self.seed, relief=tk.FLAT) self.end_t.grid(row=30, column=0, rowspan=1) self.start = tk.Frame(self.seed, bg='lightgray', bd=2, relief=tk.SUNKEN, pady=5, padx=5) self.start.grid(row=20, column=1, rowspan=1) self.end = tk.Frame(self.seed, bg='gray', bd=2, relief=tk.SUNKEN, padx=5, pady=5) self.end.grid(row=30, column=1) self.coastline = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.coastline.grid(row=40, column=1) self.duration = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=5) self.duration.grid(row=50, column=1) self.output = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.output.grid(row=70, column=0, columnspan=7, sticky='nsew') self.results = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.results.grid(row=60, column=7, columnspan=1, sticky='ew') ########################## self.title('OpenDrift') self.o = OpenOil(weathering_model='noaa', location='NORWAY') try: img = ImageTk.PhotoImage(Image.open(self.o.test_data_folder() + '../../docs/opendrift_logo.png')) panel = tk.Label(self.seed, image=img) panel.image = img panel.grid(row=0, column=0) except: pass # Could not display logo ####################################################### tk.Label(self.top, text='Simulation type').grid(row=0, column=0) self.model = tk.StringVar() models = opendrift.get_model_names() self.model.set(models[0]) self.modeldrop = tk.OptionMenu(self.top, self.model, *(models), command=self.set_model) self.modeldrop.grid(row=0, column=1) help_button = tk.Button(self.top, text='Help', command=self.show_help) help_button.grid(row=0, column=2, padx=50) ########## # Release ########## startlabel = tk.Label(self.start_t, text="\n\nStart release\n\n") startlabel.grid(row=0, column=0) tk.Label(self.start, text='Longitude').grid(row=0, column=1) tk.Label(self.start, text='Latitude').grid(row=0, column=0) tk.Label(self.start, text='Radius [m]').grid(row=0, column=2) self.latvar = tk.StringVar() self.lonvar = tk.StringVar() self.radiusvar = tk.StringVar() self.lat = tk.Entry(self.start, textvariable=self.latvar, width=6, justify=tk.RIGHT) self.lon = tk.Entry(self.start, textvariable=self.lonvar, width=6, justify=tk.RIGHT) self.radius = tk.Entry(self.start, width=6, textvariable=self.radiusvar, justify=tk.RIGHT) self.lon.grid(row=10, column=1) self.lon.insert(0, '4.5') self.lat.grid(row=10, column=0) self.lat.insert(0, '60.0') self.radius.grid(row=10, column=2) self.radius.insert(0, '1000') self.lonvar.trace('w', self.copy_position) self.latvar.trace('w', self.copy_position) self.radiusvar.trace('w', self.copy_position) ########## # Time ########## now = datetime.utcnow() tk.Label(self.start, text='Day').grid(row=20, column=0) tk.Label(self.start, text='Month').grid(row=20, column=1) tk.Label(self.start, text='Year').grid(row=20, column=2) tk.Label(self.start, text='Hour').grid(row=20, column=3) tk.Label(self.start, text='Minutes [UTC]').grid(row=20, column=4) self.datevar = tk.StringVar() self.dates = range(1, 32) self.datevar.set(now.day) self.date = tk.OptionMenu(self.start, self.datevar, *self.dates) self.date.grid(row=30, column=0) self.monthvar = tk.StringVar() self.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] self.monthvar.set(self.months[now.month-1]) self.month = tk.OptionMenu(self.start, self.monthvar, *self.months) self.month.grid(row=30, column=1) self.yearvar = tk.StringVar() self.years = range(2015, now.year+2) self.yearvar.set(now.year) self.year = tk.OptionMenu(self.start, self.yearvar, *self.years) self.year.grid(row=30, column=2) self.hourvar = tk.StringVar() self.hours = range(0, 24) self.hourvar.set(now.hour) self.hour = tk.OptionMenu(self.start, self.hourvar, *self.hours) self.hour.grid(row=30, column=3) self.minutevar = tk.StringVar() self.minutes = range(0, 60, 5) self.minutevar.set(now.minute) self.minute = tk.OptionMenu(self.start, self.minutevar, *self.minutes) self.minute.grid(row=30, column=4) self.datevar.trace('w', self.copy_position) self.monthvar.trace('w', self.copy_position) self.yearvar.trace('w', self.copy_position) self.hourvar.trace('w', self.copy_position) self.minutevar.trace('w', self.copy_position) ############### # Release End ############### endlabel = tk.Label(self.end_t, text="\n\nEnd release\n\n") endlabel.grid(row=0, column=0) tk.Label(self.end, text='Longitude', bg='gray').grid(row=0, column=1) tk.Label(self.end, text='Latitude', bg='gray').grid(row=0, column=0) tk.Label(self.end, text='Radius [m]', bg='gray').grid(row=0, column=2) self.elat = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.eradius = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon.grid(row=10, column=1) self.elon.insert(0, '4.5') self.elat.grid(row=10, column=0) self.elat.insert(0, '60.0') self.eradius.grid(row=10, column=2) self.eradius.insert(0, '1000') ########## # Time ########## now = datetime.utcnow() tk.Label(self.end, text='Day', bg='gray').grid(row=20, column=0) tk.Label(self.end, text='Month', bg='gray').grid(row=20, column=1) tk.Label(self.end, text='Year', bg='gray').grid(row=20, column=2) tk.Label(self.end, text='Hour', bg='gray').grid(row=20, column=3) tk.Label(self.end, text='Minutes [UTC]', bg='gray').grid(row=20, column=4) self.edatevar = tk.StringVar() self.edates = range(1, 32) self.edatevar.set(now.day) self.edate = tk.OptionMenu(self.end, self.edatevar, *self.edates) self.edate.grid(row=30, column=0) self.emonthvar = tk.StringVar() self.emonthvar.set(self.months[now.month-1]) self.emonth = tk.OptionMenu(self.end, self.emonthvar, *self.months) self.emonth.grid(row=30, column=1) self.eyearvar = tk.StringVar() self.eyears = range(2015, now.year+2) self.eyearvar.set(now.year) self.eyear = tk.OptionMenu(self.end, self.eyearvar, *self.eyears) self.eyear.grid(row=30, column=2) self.ehourvar = tk.StringVar() self.ehours = range(0, 24) self.ehourvar.set(now.hour) self.ehour = tk.OptionMenu(self.end, self.ehourvar, *self.ehours) self.ehour.grid(row=30, column=3) self.eminutevar = tk.StringVar() self.eminutes = range(0, 60, 5) self.eminutevar.set(now.minute) self.eminute = tk.OptionMenu(self.end, self.eminutevar, *self.eminutes) self.eminute.grid(row=30, column=4) self.eyear.config(bg='gray') self.emonth.config(bg='gray') self.edate.config(bg='gray') self.ehour.config(bg='gray') self.eminute.config(bg='gray') # Check seeding check_seed = tk.Button(self.end_t, text='Check seeding', command=self.check_seeding) check_seed.grid(row=10, column=0, padx=0) ####################### # Simulation duration ####################### #tk.Label(self.coastline, text='Coastline resolution ').grid( # row=40, column=1) #self.mapresvar = tk.StringVar() #self.mapres = tk.OptionMenu(self.coastline, self.mapresvar, # *['full', 'high']) #self.mapres.grid(row=40, column=2) #self.mapresvar.set('high') tk.Label(self.duration, text='Run simulation ').grid(row=50, column=0) self.durationhours = tk.Entry(self.duration, width=3, justify=tk.RIGHT) self.durationhours.grid(row=50, column=1) self.durationhours.insert(0, 12) tk.Label(self.duration, text=' hours ').grid(row=50, column=2) self.directionvar = tk.StringVar() self.directionvar.set('forwards') self.direction = tk.OptionMenu(self.duration, self.directionvar, 'forwards', 'backwards') self.direction.grid(row=50, column=3) tk.Label(self.duration, text=' in time ').grid(row=50, column=4) ############## # Output box ############## self.text = tk.Text(self.output, wrap="word", height=18) self.text.grid(row=60, columnspan=6, sticky='nsw') self.text.tag_configure("stderr", foreground="#b22222") sys.stdout = TextRedirector(self.text, "stdout") sys.stderr = TextRedirector(self.text, "stderr") s = tk.Scrollbar(self) s.grid(row=60, column=6, sticky='ns') s.config(command=self.text.yview) self.text.config(yscrollcommand=s.set) # Diana self.dianadir = '/vol/vvfelles/opendrift/output/' if os.path.exists(self.dianadir): self.has_diana = True print('Diana is available!') self.outputdir = '/vol/vvfelles/opendrift/output_native/' startbutton = 'PEIS PAO' else: self.has_diana = False startbutton = 'START' ############## # Initialise ############## #o = OpenOil() self.set_model(self.available_models[0]) ########## # RUN ########## tk.Button(self.seed, text=startbutton, bg='green', command=self.run_opendrift).grid(row=80, column=1, sticky=tk.W, pady=4)
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]) elif 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]) elif model == 'ShipDrift': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.o = ShipDrift() print dir(self.config) 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) print dir(self.config) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) print 'Setting model: ' + model print self.o.list_configspec() #default, minimum, maximum, options = self.o.get_configspec_default_min_max('seed:oil_type') #print default sc = self.o.get_seed_config() print sc self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame.destroy() self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): 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)
class OpenDriftGUI(tk.Tk): def __init__(self): # Available models self.available_models = opendrift.get_model_names() tk.Tk.__init__(self) ################## # Layout frames ################## self.n = ttk.Notebook(self.master) self.n.grid() self.seed = ttk.Frame(self.n) self.config = ttk.Frame(self.n) self.n.add(self.seed, text='Seeding') self.n.add(self.config, text='Config') # Top self.top = tk.Frame(self.seed, relief=tk.FLAT, pady=25, padx=25) self.top.grid(row=0, column=1, rowspan=1) # Config self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) # Time start and end self.start_t = tk.Frame(self.seed, relief=tk.FLAT) self.start_t.grid(row=2, column=0, rowspan=1) self.end_t = tk.Frame(self.seed, relief=tk.FLAT) self.end_t.grid(row=3, column=0, rowspan=1) self.start = tk.Frame(self.seed, bg='lightgray', bd=2, relief=tk.SUNKEN, pady=5, padx=5) self.start.grid(row=2, column=1, rowspan=1) self.end = tk.Frame(self.seed, bg='gray', bd=2, relief=tk.SUNKEN, padx=5, pady=5) self.end.grid(row=3, column=1) self.coastline = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.coastline.grid(row=4, column=1) self.duration = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=5) self.duration.grid(row=5, column=1) self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') self.output = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.output.grid(row=7, column=2, columnspan=8, sticky='nsew') ########################## self.title('OpenDrift') o = OpenOil3D(weathering_model='noaa', location='NORWAY') try: img = ImageTk.PhotoImage( Image.open(o.test_data_folder() + '../../docs/opendrift_logo.png')) panel = tk.Label(self.seed, image=img) panel.image = img panel.grid(row=0, column=0) except: pass # Could not display logo ####################################################### tk.Label(self.top, text='Simulation type').grid(row=0, column=0) self.model = tk.StringVar() models = ['OpenOil', 'Leeway'] models = opendrift.get_model_names() self.model.set(models[0]) self.modeldrop = tk.OptionMenu(self.top, self.model, *(models), command=self.set_model) self.modeldrop.grid(row=0, column=1) help_button = tk.Button(self.top, text='Help', command=self.show_help) help_button.grid(row=0, column=2, padx=50) self.categoryLabel = tk.Label(self.seed, text='Oil type') self.categoryLabel.grid(row=1, column=0) oljetyper = o.oiltypes self.oljetype = tk.StringVar() self.oljetype.set(oljetyper[0]) self.categorydrop = ttk.Combobox(self.seed, width=50, textvariable=self.oljetype, values=oljetyper) self.categorydrop.grid(row=1, column=1) ########## # Release ########## startlabel = tk.Label(self.start_t, text="\n\nStart release\n\n") startlabel.grid(row=0, column=0) tk.Label(self.start, text='Longitude').grid(row=0, column=1) tk.Label(self.start, text='Latitude').grid(row=0, column=0) tk.Label(self.start, text='Radius [m]').grid(row=0, column=2) self.latvar = tk.StringVar() self.lonvar = tk.StringVar() self.radiusvar = tk.StringVar() self.lat = tk.Entry(self.start, textvariable=self.latvar, width=6, justify=tk.RIGHT) self.lon = tk.Entry(self.start, textvariable=self.lonvar, width=6, justify=tk.RIGHT) self.radius = tk.Entry(self.start, width=6, textvariable=self.radiusvar, justify=tk.RIGHT) self.lon.grid(row=1, column=1) self.lon.insert(0, '4.5') self.lat.grid(row=1, column=0) self.lat.insert(0, '60.0') self.radius.grid(row=1, column=2) self.radius.insert(0, '1000') self.lonvar.trace('w', self.copy_position) self.latvar.trace('w', self.copy_position) self.radiusvar.trace('w', self.copy_position) ########## # Time ########## now = datetime.now() tk.Label(self.start, text='Day').grid(row=2, column=0) tk.Label(self.start, text='Month').grid(row=2, column=1) tk.Label(self.start, text='Year').grid(row=2, column=2) tk.Label(self.start, text='Hour').grid(row=2, column=3) tk.Label(self.start, text='Minutes [UTC]').grid(row=2, column=4) self.datevar = tk.StringVar() self.dates = range(1, 32) self.datevar.set(now.day) self.date = tk.OptionMenu(self.start, self.datevar, *self.dates) self.date.grid(row=3, column=0) self.monthvar = tk.StringVar() self.months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] self.monthvar.set(self.months[now.month - 1]) self.month = tk.OptionMenu(self.start, self.monthvar, *self.months) self.month.grid(row=3, column=1) self.yearvar = tk.StringVar() self.years = range(2015, now.year + 1) self.yearvar.set(now.year) self.year = tk.OptionMenu(self.start, self.yearvar, *self.years) self.year.grid(row=3, column=2) self.hourvar = tk.StringVar() self.hours = range(0, 24) self.hourvar.set(now.hour) self.hour = tk.OptionMenu(self.start, self.hourvar, *self.hours) self.hour.grid(row=3, column=3) self.minutevar = tk.StringVar() self.minutes = range(0, 60, 5) self.minutevar.set(now.minute) self.minute = tk.OptionMenu(self.start, self.minutevar, *self.minutes) self.minute.grid(row=3, column=4) self.datevar.trace('w', self.copy_position) self.monthvar.trace('w', self.copy_position) self.yearvar.trace('w', self.copy_position) self.hourvar.trace('w', self.copy_position) self.minutevar.trace('w', self.copy_position) ############### # Release End ############### endlabel = tk.Label(self.end_t, text="\n\nEnd release\n\n") endlabel.grid(row=0, column=0) tk.Label(self.end, text='Longitude', bg='gray').grid(row=0, column=1) tk.Label(self.end, text='Latitude', bg='gray').grid(row=0, column=0) tk.Label(self.end, text='Radius [m]', bg='gray').grid(row=0, column=2) self.elat = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.eradius = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon.grid(row=1, column=1) self.elon.insert(0, '4.5') self.elat.grid(row=1, column=0) self.elat.insert(0, '60.0') self.eradius.grid(row=1, column=2) self.eradius.insert(0, '1000') ########## # Time ########## now = datetime.now() tk.Label(self.end, text='Day', bg='gray').grid(row=2, column=0) tk.Label(self.end, text='Month', bg='gray').grid(row=2, column=1) tk.Label(self.end, text='Year', bg='gray').grid(row=2, column=2) tk.Label(self.end, text='Hour', bg='gray').grid(row=2, column=3) tk.Label(self.end, text='Minutes [UTC]', bg='gray').grid(row=2, column=4) self.edatevar = tk.StringVar() self.edates = range(1, 32) self.edatevar.set(now.day) self.edate = tk.OptionMenu(self.end, self.edatevar, *self.edates) self.edate.grid(row=3, column=0) self.emonthvar = tk.StringVar() self.emonthvar.set(self.months[now.month - 1]) self.emonth = tk.OptionMenu(self.end, self.emonthvar, *self.months) self.emonth.grid(row=3, column=1) self.eyearvar = tk.StringVar() self.eyears = range(2015, now.year + 1) self.eyearvar.set(now.year) self.eyear = tk.OptionMenu(self.end, self.eyearvar, *self.eyears) self.eyear.grid(row=3, column=2) self.ehourvar = tk.StringVar() self.ehours = range(0, 24) self.ehourvar.set(now.hour) self.ehour = tk.OptionMenu(self.end, self.ehourvar, *self.ehours) self.ehour.grid(row=3, column=3) self.eminutevar = tk.StringVar() self.eminutes = range(0, 60, 5) self.eminutevar.set(now.minute) self.eminute = tk.OptionMenu(self.end, self.eminutevar, *self.eminutes) self.eminute.grid(row=3, column=4) self.eyear.config(bg='gray') self.emonth.config(bg='gray') self.edate.config(bg='gray') self.ehour.config(bg='gray') self.eminute.config(bg='gray') # Check seeding check_seed = tk.Button(self.end_t, text='Check seeding', command=self.check_seeding) check_seed.grid(row=1, column=0, padx=0) ####################### # Simulation duration ####################### tk.Label(self.coastline, text='Coastline resolution ').grid(row=4, column=1) self.mapresvar = tk.StringVar() self.mapres = tk.OptionMenu(self.coastline, self.mapresvar, *['full', 'high']) self.mapres.grid(row=4, column=2) self.mapresvar.set('high') tk.Label(self.duration, text='Run simulation ').grid(row=5, column=0) self.durationhours = tk.Entry(self.duration, width=3, justify=tk.RIGHT) self.durationhours.grid(row=5, column=1) self.durationhours.insert(0, 12) tk.Label(self.duration, text=' hours ').grid(row=5, column=2) self.directionvar = tk.StringVar() self.directionvar.set('forwards') self.direction = tk.OptionMenu(self.duration, self.directionvar, 'forwards', 'backwards') self.direction.grid(row=5, column=3) tk.Label(self.duration, text=' in time ').grid(row=5, column=4) ############## # Output box ############## self.text = tk.Text(self.output, wrap="word", height=18) self.text.grid(row=6, columnspan=8, sticky='nsew') self.text.tag_configure("stderr", foreground="#b22222") sys.stdout = TextRedirector(self.text, "stdout") sys.stderr = TextRedirector(self.text, "stderr") s = tk.Scrollbar(self) s.grid(row=6, column=8, sticky='ns') s.config(command=self.text.yview) self.text.config(yscrollcommand=s.set) # Diana self.dianadir = '/vol/vvfelles/opendrift/output/' if os.path.exists(self.dianadir): self.has_diana = True print 'Diana is available!' self.outputdir = '/vol/vvfelles/opendrift/output_native/' else: self.has_diana = False ############## # Initialise ############## o = OpenOil3D() for m in self.available_models: print m print opendrift.get_model(m) print opendrift.get_model(m)() ########## # RUN ########## tk.Button(self.seed, text='PEIS PAO', bg='green', command=self.run_opendrift).grid(row=8, column=1, sticky=tk.W, pady=4) def copy_position(self, a, b, c): self.elat.delete(0, tk.END) self.elat.insert(0, self.lat.get()) self.elon.delete(0, tk.END) self.elon.insert(0, self.lon.get()) self.eradius.delete(0, tk.END) self.eradius.insert(0, self.radius.get()) self.edatevar.set(self.datevar.get()) self.emonthvar.set(self.monthvar.get()) self.eyearvar.set(self.yearvar.get()) self.ehourvar.set(self.hourvar.get()) self.eminutevar.set(self.minutevar.get()) 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]) elif 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]) elif model == 'ShipDrift': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.o = ShipDrift() print dir(self.config) 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) print dir(self.config) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) print 'Setting model: ' + model print self.o.list_configspec() #default, minimum, maximum, options = self.o.get_configspec_default_min_max('seed:oil_type') #print default sc = self.o.get_seed_config() print sc self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame.destroy() self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): 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 show_help(self): help_url = 'https://github.com/OpenDrift/opendrift/wiki/Graphical-User-Interface' print 'Opening help website:\n' + help_url import webbrowser webbrowser.open(help_url) 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 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.seed, text='Show in Diana', command=lambda: os.system('diana &')).grid(row=8, column=2, sticky=tk.W, pady=4) tk.Button(self.seed, 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.seed, 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 datetime, timedelta from opendrift.readers import reader_basemap_landmask from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=0) o.set_config('general:basemap_resolution', 'h') o.add_readers_from_list([ #'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be', 'http://thredds.met.no/thredds/dodsC/fou-hi/nordic4km-1h/Nordic-4km_SURF_1h_avg_00.nc', #'http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc', '/lustre/storeB/project/metproduction/products/ecmwf/nc/ec_atmo_0_1deg_20161220T120000Z_1h.nc', 'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be' ]) # Seeding some particles lon = 5.0 lat = 63.0 # Outside Bergen #time = reader_arome.start_time #time = datetime(2016, 12, 20, 17, 0) time = datetime.now() # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=1000,
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]) elif 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]) elif model == 'ShipDrift': self.categoryLabel['text'] = 'Object type' self.oljetype.set('') self.o = ShipDrift() print dir(self.config) 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) print dir(self.config) for i, cs in enumerate(self.o._config_hashstrings()): tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1) print 'Setting model: ' + model print self.o.list_configspec() #default, minimum, maximum, options = self.o.get_configspec_default_min_max('seed:oil_type') #print default sc = self.o.get_seed_config() print sc self.seed_input = {} self.seed_input_var = {} self.seed_input_label = {} self.seed_frame.destroy() self.seed_frame = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.seed_frame.grid(row=4, columnspan=8, sticky='nsew') # FIND for num, i in enumerate(sc): 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 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)
#!/usr/bin/env python """ Ship drift ================================== """ from datetime import datetime, timedelta from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=0) o.add_readers_from_list([ 'http://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be', 'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.nc', 'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be' ]) # Seeding some particles lon = 5.0 lat = 63.0 # Outside Bergen #time = reader_arome.start_time #time = datetime(2016, 12, 20, 17, 0) time = datetime.now() # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=1000,
class OpenDriftGUI(tk.Tk): def __init__(self): # Available models self.available_models = opendrift.get_model_names() tk.Tk.__init__(self) ################## # Layout frames ################## self.n = ttk.Notebook(self.master) self.n.grid() self.seed = ttk.Frame(self.n) self.config = ttk.Frame(self.n) self.n.add(self.seed, text='Seeding') self.n.add(self.config, text='Config') # Top self.top = tk.Frame(self.seed, relief=tk.FLAT, pady=25, padx=25) self.top.grid(row=0, column=1, rowspan=1) # Config self.con = tk.Label(self.config, text="\n\nConfiguration\n\n") self.con.grid(row=0, column=1, rowspan=1) # Time start and end self.start_t = tk.Frame(self.seed, relief=tk.FLAT) self.start_t.grid(row=20, column=0, rowspan=1) self.end_t = tk.Frame(self.seed, relief=tk.FLAT) self.end_t.grid(row=30, column=0, rowspan=1) self.start = tk.Frame(self.seed, bg='lightgray', bd=2, relief=tk.SUNKEN, pady=5, padx=5) self.start.grid(row=20, column=1, rowspan=1) self.end = tk.Frame(self.seed, bg='gray', bd=2, relief=tk.SUNKEN, padx=5, pady=5) self.end.grid(row=30, column=1) self.coastline = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.coastline.grid(row=40, column=1) self.duration = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=5) self.duration.grid(row=50, column=1) self.output = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.output.grid(row=70, column=0, columnspan=7, sticky='nsew') self.results = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.results.grid(row=60, column=7, columnspan=1, sticky='ew') ########################## self.title('OpenDrift') self.o = OpenOil(weathering_model='noaa', location='NORWAY') try: img = ImageTk.PhotoImage(Image.open(self.o.test_data_folder() + '../../docs/opendrift_logo.png')) panel = tk.Label(self.seed, image=img) panel.image = img panel.grid(row=0, column=0) except: pass # Could not display logo ####################################################### tk.Label(self.top, text='Simulation type').grid(row=0, column=0) self.model = tk.StringVar() models = opendrift.get_model_names() self.model.set(models[0]) self.modeldrop = tk.OptionMenu(self.top, self.model, *(models), command=self.set_model) self.modeldrop.grid(row=0, column=1) help_button = tk.Button(self.top, text='Help', command=self.show_help) help_button.grid(row=0, column=2, padx=50) ########## # Release ########## startlabel = tk.Label(self.start_t, text="\n\nStart release\n\n") startlabel.grid(row=0, column=0) tk.Label(self.start, text='Longitude').grid(row=0, column=1) tk.Label(self.start, text='Latitude').grid(row=0, column=0) tk.Label(self.start, text='Radius [m]').grid(row=0, column=2) self.latvar = tk.StringVar() self.lonvar = tk.StringVar() self.radiusvar = tk.StringVar() self.lat = tk.Entry(self.start, textvariable=self.latvar, width=6, justify=tk.RIGHT) self.lon = tk.Entry(self.start, textvariable=self.lonvar, width=6, justify=tk.RIGHT) self.radius = tk.Entry(self.start, width=6, textvariable=self.radiusvar, justify=tk.RIGHT) self.lon.grid(row=10, column=1) self.lon.insert(0, '4.5') self.lat.grid(row=10, column=0) self.lat.insert(0, '60.0') self.radius.grid(row=10, column=2) self.radius.insert(0, '1000') self.lonvar.trace('w', self.copy_position) self.latvar.trace('w', self.copy_position) self.radiusvar.trace('w', self.copy_position) ########## # Time ########## now = datetime.utcnow() tk.Label(self.start, text='Day').grid(row=20, column=0) tk.Label(self.start, text='Month').grid(row=20, column=1) tk.Label(self.start, text='Year').grid(row=20, column=2) tk.Label(self.start, text='Hour').grid(row=20, column=3) tk.Label(self.start, text='Minutes [UTC]').grid(row=20, column=4) self.datevar = tk.StringVar() self.dates = range(1, 32) self.datevar.set(now.day) self.date = tk.OptionMenu(self.start, self.datevar, *self.dates) self.date.grid(row=30, column=0) self.monthvar = tk.StringVar() self.months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] self.monthvar.set(self.months[now.month-1]) self.month = tk.OptionMenu(self.start, self.monthvar, *self.months) self.month.grid(row=30, column=1) self.yearvar = tk.StringVar() self.years = range(2015, now.year+2) self.yearvar.set(now.year) self.year = tk.OptionMenu(self.start, self.yearvar, *self.years) self.year.grid(row=30, column=2) self.hourvar = tk.StringVar() self.hours = range(0, 24) self.hourvar.set(now.hour) self.hour = tk.OptionMenu(self.start, self.hourvar, *self.hours) self.hour.grid(row=30, column=3) self.minutevar = tk.StringVar() self.minutes = range(0, 60, 5) self.minutevar.set(now.minute) self.minute = tk.OptionMenu(self.start, self.minutevar, *self.minutes) self.minute.grid(row=30, column=4) self.datevar.trace('w', self.copy_position) self.monthvar.trace('w', self.copy_position) self.yearvar.trace('w', self.copy_position) self.hourvar.trace('w', self.copy_position) self.minutevar.trace('w', self.copy_position) ############### # Release End ############### endlabel = tk.Label(self.end_t, text="\n\nEnd release\n\n") endlabel.grid(row=0, column=0) tk.Label(self.end, text='Longitude', bg='gray').grid(row=0, column=1) tk.Label(self.end, text='Latitude', bg='gray').grid(row=0, column=0) tk.Label(self.end, text='Radius [m]', bg='gray').grid(row=0, column=2) self.elat = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.eradius = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elon.grid(row=10, column=1) self.elon.insert(0, '4.5') self.elat.grid(row=10, column=0) self.elat.insert(0, '60.0') self.eradius.grid(row=10, column=2) self.eradius.insert(0, '1000') ########## # Time ########## now = datetime.utcnow() tk.Label(self.end, text='Day', bg='gray').grid(row=20, column=0) tk.Label(self.end, text='Month', bg='gray').grid(row=20, column=1) tk.Label(self.end, text='Year', bg='gray').grid(row=20, column=2) tk.Label(self.end, text='Hour', bg='gray').grid(row=20, column=3) tk.Label(self.end, text='Minutes [UTC]', bg='gray').grid(row=20, column=4) self.edatevar = tk.StringVar() self.edates = range(1, 32) self.edatevar.set(now.day) self.edate = tk.OptionMenu(self.end, self.edatevar, *self.edates) self.edate.grid(row=30, column=0) self.emonthvar = tk.StringVar() self.emonthvar.set(self.months[now.month-1]) self.emonth = tk.OptionMenu(self.end, self.emonthvar, *self.months) self.emonth.grid(row=30, column=1) self.eyearvar = tk.StringVar() self.eyears = range(2015, now.year+2) self.eyearvar.set(now.year) self.eyear = tk.OptionMenu(self.end, self.eyearvar, *self.eyears) self.eyear.grid(row=30, column=2) self.ehourvar = tk.StringVar() self.ehours = range(0, 24) self.ehourvar.set(now.hour) self.ehour = tk.OptionMenu(self.end, self.ehourvar, *self.ehours) self.ehour.grid(row=30, column=3) self.eminutevar = tk.StringVar() self.eminutes = range(0, 60, 5) self.eminutevar.set(now.minute) self.eminute = tk.OptionMenu(self.end, self.eminutevar, *self.eminutes) self.eminute.grid(row=30, column=4) self.eyear.config(bg='gray') self.emonth.config(bg='gray') self.edate.config(bg='gray') self.ehour.config(bg='gray') self.eminute.config(bg='gray') # Check seeding check_seed = tk.Button(self.end_t, text='Check seeding', command=self.check_seeding) check_seed.grid(row=10, column=0, padx=0) ####################### # Simulation duration ####################### #tk.Label(self.coastline, text='Coastline resolution ').grid( # row=40, column=1) #self.mapresvar = tk.StringVar() #self.mapres = tk.OptionMenu(self.coastline, self.mapresvar, # *['full', 'high']) #self.mapres.grid(row=40, column=2) #self.mapresvar.set('high') tk.Label(self.duration, text='Run simulation ').grid(row=50, column=0) self.durationhours = tk.Entry(self.duration, width=3, justify=tk.RIGHT) self.durationhours.grid(row=50, column=1) self.durationhours.insert(0, 12) tk.Label(self.duration, text=' hours ').grid(row=50, column=2) self.directionvar = tk.StringVar() self.directionvar.set('forwards') self.direction = tk.OptionMenu(self.duration, self.directionvar, 'forwards', 'backwards') self.direction.grid(row=50, column=3) tk.Label(self.duration, text=' in time ').grid(row=50, column=4) ############## # Output box ############## self.text = tk.Text(self.output, wrap="word", height=18) self.text.grid(row=60, columnspan=6, sticky='nsw') self.text.tag_configure("stderr", foreground="#b22222") sys.stdout = TextRedirector(self.text, "stdout") sys.stderr = TextRedirector(self.text, "stderr") s = tk.Scrollbar(self) s.grid(row=60, column=6, sticky='ns') s.config(command=self.text.yview) self.text.config(yscrollcommand=s.set) # Diana self.dianadir = '/vol/vvfelles/opendrift/output/' if os.path.exists(self.dianadir): self.has_diana = True print('Diana is available!') self.outputdir = '/vol/vvfelles/opendrift/output_native/' startbutton = 'PEIS PAO' else: self.has_diana = False startbutton = 'START' ############## # Initialise ############## #o = OpenOil() self.set_model(self.available_models[0]) ########## # RUN ########## tk.Button(self.seed, text=startbutton, bg='green', command=self.run_opendrift).grid(row=80, column=1, sticky=tk.W, pady=4) def copy_position(self, a, b, c): self.elat.delete(0, tk.END) self.elat.insert(0, self.lat.get()) self.elon.delete(0, tk.END) self.elon.insert(0, self.lon.get()) self.eradius.delete(0, tk.END) self.eradius.insert(0, self.radius.get()) self.edatevar.set(self.datevar.get()) self.emonthvar.set(self.monthvar.get()) self.eyearvar.set(self.yearvar.get()) self.ehourvar.set(self.hourvar.get()) self.eminutevar.set(self.minutevar.get()) def handle_result(self, command): from os.path import expanduser homefolder = expanduser("~") filename = homefolder + '/' + self.simulationname if command[0:4] == 'save': plt.switch_backend('agg') elif command[0:4] == 'show': plt.switch_backend('TkAgg') if command == 'saveanimation': filename = filename + '.mp4' self.o.animation(filename=filename) print('='*30 + '\nAnimation saved to file:\n' + filename + '\n' + '='*30) elif command == 'showanimation': self.o.animation() elif command == 'saveplot': filename = filename + '.png' self.o.plot(filename=filename) print('='*30 + '\nPlot saved to file:\n' + filename + '\n' + '='*30) elif command == 'showplot': self.o.plot() elif command == 'showoilbudget': self.o.plot_oil_budget() elif command == 'saveoilbudget': filename = filename + '_oilbudget.png' self.o.plot_oil_budget(filename=filename) print('='*30 + '\nPlot saved to file: ' + filename + '\n' + '='*30) 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 seafloorbutton(self): if self.seafloorvar.get() == 1: self.depth.config(state='disabled') else: self.depth.config(state='normal') def show_help(self): help_url = 'https://opendrift.github.io/gui.html' print('Opening help website:\n' + help_url) import webbrowser webbrowser.open(help_url) 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.plot(buffer=.5, fast=True) del so 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)
#!/usr/bin/env python from datetime import datetime, timedelta from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=0) o.set_config('general:basemap_resolution', 'h') o.add_readers_from_list([ 'http://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be', 'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.nc', 'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be' ]) # Seeding some particles lon = 5.0; lat = 63.0; # Outside Bergen #time = reader_arome.start_time #time = datetime(2016, 12, 20, 17, 0) time = datetime.now() # Seed oil elements at defined position and time o.seed_elements(lon, lat, radius=1000, number=1000, time=time, length=80.0, beam=10.0, height=9.0, draft=4.0) print o.elements_scheduled print o #o.set_projection('+proj=merc')
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)
#!/usr/bin/env python """ Ship drift ================================== """ from datetime import datetime from opendrift.models.shipdrift import ShipDrift o = ShipDrift(loglevel=20) o.add_readers_from_list([ 'https://thredds.met.no/thredds/dodsC/cmems/topaz6/dataset-topaz6-arc-15min-3km-be.ncml', 'https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc', 'https://thredds.met.no/thredds/dodsC/cmems/mywavewam3km/dataset-wam-arctic-1hr3km-be.ncml' ]) #%% # Seed ship elements at defined position and time # Note: beam/length ratio is larger than allowed, but is then clipped internally o.seed_elements(lon=5.0, lat=63.0, radius=1000, number=1000, time=datetime.utcnow(), length=80.0, beam=20.0, height=9.0, draft=4.0) #%%