def test_seed_below_seafloor(self): o = OpenOil3D(loglevel=20) reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.add_reader([reader_norkyst]) o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = 0 lon = 4.5; lat = 62.0 o.seed_elements(lon, lat, z=-5000, time=reader_norkyst.start_time, density=1000) o.set_config('processes:turbulentmixing', True) o.set_config('turbulentmixing:verticalresolution', 1) # m o.set_config('turbulentmixing:timestep', 1) # s o.set_config('input:spill:droplet_diameter_min_subsea', 0.005) o.set_config('input:spill:droplet_diameter_max_subsea', 0.005) o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertAlmostEqual(z[0,0], -151.7, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1,0], -91.3, 1) # After some rising
def test_droplet_distribution(self): for droplet_distribution in ['Johansen et al. (2015)', 'Exponential']: o = OpenOil3D(loglevel=50, weathering_model='noaa') o.set_config('wave_entrainment:droplet_size_distribution', droplet_distribution) o.seed_elements(lon=4.8, lat=60, number=100, time=datetime.now(), oiltype='SKRUGARD') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 8 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = .3 o.run(duration=timedelta(hours=1), time_step=1800) d = o.elements.diameter # Suspicious, Sintef-param should give larer droplets if droplet_distribution == 'Exponential': self.assertAlmostEqual(d.mean(), 0.000849, 2) elif droplet_distribution == 'Johansen et al. (2015)': #self.assertAlmostEqual(d.mean(), 0.000072158) self.assertAlmostEqual(d.mean(), 0.000653, 2)
def test_seed_outside_coverage(self): """Test seeding""" o = OpenOil3D(loglevel=0) norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') basemap = reader_basemap_landmask.Reader(llcrnrlon=4, llcrnrlat=60, urcrnrlon=6, urcrnrlat=64, resolution='c', projection='merc') o.add_reader([basemap, norkyst]) o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.seed_elements(5, 63, number=5, time=norkyst.start_time - 24 * timedelta(hours=24)) with self.assertRaises(ValueError): o.run(steps=3, time_step=timedelta(minutes=15))
def test_seed_above_seafloor(self): o = OpenOil3D(loglevel=20) reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = 0 o.add_reader([reader_norkyst]) lon = 4.5; lat = 62.0 # Seed elements 50 meters above seafloor: o.seed_elements(lon, lat, z='seafloor+50', time=reader_norkyst.start_time, density=1000) o.set_config('processes:turbulentmixing', True) o.set_config('turbulentmixing:timestep', 1) # s o.run(steps=3, time_step=300, time_step_output=300) #o.plot_property('z') z, status = o.get_property('z') self.assertAlmostEqual(z[0,0], -101.7, 1) # Seeded at seafloor depth self.assertAlmostEqual(z[-1,0], -44.3, 1) # After some rising
def test_seed_below_reader_coverage(self): o = OpenOil3D(loglevel=0) reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') o.fallback_values['land_binary_mask'] = 0 o.add_reader([reader_norkyst]) lon = 5.0 lat = 64.0 o.seed_elements(lon, lat, z=-350, time=reader_norkyst.start_time, density=1000) #o.set_config('turbulentmixing:TSprofiles', True) o.set_config('processes:turbulentmixing', True) o.set_config('turbulentmixing:verticalresolution', 1) # m o.set_config('turbulentmixing:timestep', 1) # s o.set_config('input:spill:droplet_diameter_min_subsea', 0.005) o.set_config('input:spill:droplet_diameter_max_subsea', 0.005) o.run(steps=3, time_step=300, time_step_output=300) z, status = o.get_property('z') self.assertAlmostEqual(z[-1, 0], -307.0, 2) # After some rising
def test_vertical_mixing_plantoil(self): ####################################################### # 2.5m Hs, 10 mum radius (PlantOil) # Benchmark test from Jones et al. (2016) # NB: Entrainment length scale is not varied as in paper o = OpenOil3D(loglevel=30, weathering_model='default') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['sea_surface_wave_period_at_variance_spectral_density_maximum'] = 5.8 o.fallback_values['sea_surface_wave_significant_height'] = 2.5 o.fallback_values['x_wind'] = 10 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = 0 o.fallback_values['y_sea_water_velocity'] = 0 o.seed_elements(4, 60, number=1000, diameter=0.00002, # r = 10 micron density=865, time=datetime.now(), entrainment_length_scale=0.01) o.set_config('turbulentmixing:timestep', 4) o.run(duration=timedelta(hours=2), time_step_output=900, time_step=900) #o.plot_property('z') #o.plot_vertical_distribution() #o.animation_profile() # Check minimum depth self.assertAlmostEqual(o.elements.z.min(), -46.4, 1)
def test_seed_outside_coverage(self): """Test seeding""" o = OpenOil3D(loglevel=0) norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') landmask = reader_global_landmask.Reader(llcrnrlon=4, llcrnrlat=60, urcrnrlon=6, urcrnrlat=64) o.add_reader([landmask, norkyst]) o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 o.set_config('seed:oil_type', 'SNORRE B') o.seed_elements(5, 63, number=5, time=norkyst.start_time - 24 * timedelta(hours=24)) # Check that the oiltype is taken from config self.assertEqual(o.oil_name, o.get_config('seed:oil_type')) self.assertEqual(o.oil_name, 'SNORRE B') with self.assertRaises(ValueError): o.run(steps=3, time_step=timedelta(minutes=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)
import matplotlib.pyplot as plt import numpy as np from opendrift.models.openoil3D import OpenOil3D number = 10000 timestep = timedelta(minutes=10) timestep_output = timedelta(minutes=60) duration = timedelta(hours=20) mass_oil = 2000 # mass oil per particle oiltype = '*GENERIC DIESEL' #oiltype = '*GENERIC BUNKER C' #################################################### # First run, where surface oil thickness is updated #################################################### o1 = OpenOil3D(loglevel=30, weathering_model='noaa') # Northwards wind, eastwards current o1.fallback_values['land_binary_mask'] = 0 o1.fallback_values['x_wind'] = 0 o1.fallback_values['y_wind'] = 7 o1.fallback_values['sea_surface_wave_stokes_drift_x_velocity'] = 0 o1.fallback_values['sea_surface_wave_stokes_drift_y_velocity'] = .3 o1.fallback_values['x_sea_water_velocity'] = .1 o1.fallback_values['y_sea_water_velocity'] = 0 # Using Johansen droplet spectrum, which depends on oil film thickness o1.set_config('wave_entrainment:droplet_size_distribution', 'Johansen et al. (2015)') o1.set_config('drift:wind_uncertainty', 2) o1.set_config('drift:current_uncertainty', .1) o1.set_config('processes:dispersion', False) o1.set_config('processes:update_oilfilm_thickness', True)
print('\n') print('Test 1: generation of landmask instance at full resolution') print(' 54.0 seconds on reference machine.') start_time = datetime.now() reader_landmask = reader_global_landmask.Reader(llcrnrlon=5, llcrnrlat=59.8, urcrnrlon=5.5, urcrnrlat=60.3) time_spent = datetime.now() - start_time print('%6.1f seconds on this machine' % time_spent.total_seconds()) print('------------------------------------------------') print('Test 2: Reading from netCDF file') print(' 0.05 seconds on reference machine.') o = OpenOil3D(loglevel=50) # Quiet reader_arctic = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc') x = reader_arctic.x[10:12] y = reader_arctic.y[10:12] z = np.array([-20, -10]) variables = [ 'sea_surface_elevation', 'sea_ice_area_fraction', 'barotropic_sea_water_x_velocity', 'y_sea_water_velocity', 'sea_floor_depth_below_sea_level', 'sea_water_salinity', 'x_sea_water_velocity', 'barotropic_sea_water_y_velocity', 'sea_water_temperature', 'sea_ice_thickness' ] reader_arctic.buffer = 1000 # read all reader_arctic.verticalbuffer = 1000 # read all start_time = datetime.now()
#!/usr/bin/env python """ Oil budget (NOAA) ================================== """ from datetime import datetime from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil3D import OpenOil3D o = OpenOil3D(loglevel=20, weathering_model='noaa') # Using constand wind and current #o.fallback_values['x_wind'] = 7 #o.fallback_values['x_sea_water_velocity'] = .7 #o.fallback_values['y_sea_water_velocity'] = .3 #o.fallback_values['land_binary_mask'] = 0 # Arome atmospheric model reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') # Norkyst ocean model reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') o.add_reader([reader_arome, reader_norkyst]) #%% # Seeding some particles #oiltype='GULLFAKS, EXXON' #oiltype='ALGERIAN CONDENSATE' oiltype='MARTIN LINGE CRUDE 2016' o.seed_elements(lon=4.88, lat=60.1, z=0, radius=3000, number=500,
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 = OpenOil3D(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'] extra_seed_args = {} self.o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, cone=cone, **extra_seed_args) self.o.add_readers_from_file( self.o.test_data_folder() + '../../opendrift/scripts/data_sources.txt') #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.o.set_config('general:basemap_resolution', mapres) 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=7, column=3, columnspan=1, sticky='ew') tk.Button(self.results, text='Show animation', command=lambda: self.handle_result('showanimation')).grid( row=1, column=1) tk.Button(self.results, text='Save animation', command=lambda: self.handle_result('saveanimation')).grid( row=2, column=1) tk.Button(self.results, text='Show plot', command=lambda: self.handle_result('showplot')).grid( row=3, column=1) tk.Button(self.results, text='Save plot', command=lambda: self.handle_result('saveplot')).grid( row=4, column=1) if self.model.get() == 'OpenOil': tk.Button( self.results, text='Save oil budget', command=lambda: self.handle_result('saveoilbudget')).grid( row=5, column=1) tk.Button( self.results, text='Show oil budget', command=lambda: self.handle_result('showoilbudget')).grid( row=6, 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=8, column=1)
def test_vertical_mixing(self): """Testing vertical mixing scheme The OpenOil3D model is run with various wind speeds, oil droplet diameters and time steps. The maximum depth of the particles is checked for sanity.""" ######################################################## # No wind/waves (i.e. no mixing) o = OpenOil3D(loglevel=20, weathering_model='default') o.fallback_values['land_binary_mask'] = 0 o.seed_elements(4, 60, number=100, time=datetime.now()) o.set_config('turbulentmixing:timestep', 5) o.run(steps=4 * 2, time_step_output=3600, time_step=900) self.assertEqual(o.elements.z.min(), 0) # No entrainment ######################################################## ######################################################## ## 2.5m Hs, 50 mum droplet radius (Oil Emulsion) ## Benchmark test from Jones et al. (2016) ## NB: Entrainment length scale is not varied as in paper ## entrainment_length_scale (L) ## L = 0.01 for Plant oil, and L = 0.1 for Emulsion #o = OpenOil3D(loglevel=0, weathering_model='default') #o.fallback_values['land_binary_mask'] = 0 #o.fallback_values['sea_surface_wave_period_at_variance_spectral_density_maximum'] = 5.8 #o.fallback_values['sea_surface_wave_significant_height'] = 2.5 #o.seed_elements(4, 60, number=1000, diameter=0.0001, # r = 50 micron # density=865, time=datetime.now()) #o.set_config('turbulentmixing:verticalresolution', 2) #o.set_config('turbulentmixing:timestep', 4) #o.run(duration=timedelta(hours=2), time_step_output=900, time_step=900) ##o.plot_property('z') ##o.plot_vertical_distribution() ##o.animation_profile() ## Check minimum depth #self.assertAlmostEqual(o.elements.z.min(), -46.0, 1) ######################################################## ####################################################### # 2.5m Hs, 10 mum radius (PlantOil) # Benchmark test from Jones et al. (2016) # NB: Entrainment length scale is not varied as in paper o = OpenOil3D(loglevel=20, weathering_model='default') o.fallback_values['land_binary_mask'] = 0 o.fallback_values[ 'sea_surface_wave_period_at_variance_spectral_density_maximum'] = 5.8 o.fallback_values['sea_surface_wave_significant_height'] = 2.5 o.seed_elements( 4, 60, number=1000, diameter=0.00002, # r = 10 micron density=865, time=datetime.now(), entrainment_length_scale=0.01) o.set_config('turbulentmixing:verticalresolution', 2) o.set_config('turbulentmixing:timestep', 4) o.run(duration=timedelta(hours=2), time_step_output=900, time_step=900) #o.plot_property('z') #o.plot_vertical_distribution() #o.animation_profile() # Check minimum depth self.assertAlmostEqual(o.elements.z.min(), -58, 1) ####################################################### ####################################################### # Same as above, but parameterising waves from wind o = OpenOil3D(loglevel=20, weathering_model='default') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 10 o.seed_elements( 4, 60, number=1000, diameter=0.00002, # r = 10 micron density=865, time=datetime.now(), entrainment_length_scale=0.01) o.set_config('turbulentmixing:verticalresolution', 2) o.set_config('turbulentmixing:timestep', 4) o.run(duration=timedelta(hours=2), time_step_output=900, time_step=900) #o.plot_vertical_distribution() self.assertAlmostEqual(o.elements.z.min(), -52.0, 1) ####################################################### ######################################################## ## Repeating last run, but with larger major (outer) time step ## Max mixing depth is expected to be same, but is slightly different ## This test is made to pass, but results should be checked o = OpenOil3D(loglevel=20, weathering_model='default') o.fallback_values['land_binary_mask'] = 0 o.fallback_values['x_wind'] = 10 o.seed_elements( 4, 60, number=1000, diameter=0.00002, # r = 10 micron density=865, time=datetime.now(), entrainment_length_scale=0.01) o.set_config('turbulentmixing:verticalresolution', 2) o.set_config('turbulentmixing:timestep', 4) o.run(duration=timedelta(hours=2), time_step_output=1800, time_step=1800) #o.plot_vertical_distribution() self.assertAlmostEqual(o.elements.z.min(), -60.0, 1)
from datetime import datetime, timedelta from opendrift.models.openoil3D import OpenOil3D from opendrift.readers import reader_netCDF_CF_generic if __name__ == '__main__': if len(sys.argv) == 1: mode = 'fast' if len(sys.argv) == 2: mode = sys.argv[1] if mode not in ['fast', 'slow']: sys.exit('Usage: %s [fast|slow]' % sys.argv[0]) if len(sys.argv) > 2: sys.exit('Usage: %s [fast|slow]' % sys.argv[0]) o = OpenOil3D(weathering_model='default') readers_thredds = [ # Note that order (priority) is important! 'https://thredds.met.no/thredds/dodsC/metusers/knutfd/thredds/case_1_mar_2017/NorKyst-800m_ZDEPTHS_his_00_1March2017.nc', 'https://thredds.met.no/thredds/dodsC/metusers/knutfd/thredds/case_1_mar_2017/Nordic-4km_ZDEPTHS_avg_00.nc', 'https://thredds.met.no/thredds/dodsC/metusers/knutfd/thredds/case_1_mar_2017/meps_mbr0_pp_2_5km_20170301T00Z.nc', 'https://thredds.met.no//thredds/dodsC/metusers/knutfd/thredds/case_1_mar_2017/MyWave_wam4_WAVE_20170301T00Z.nc', 'https://thredds.met.no//thredds/dodsC/metusers/knutfd/thredds/case_1_mar_2017/MyWave_wam4_RAD_20170301T00Z.nc', ] readers_local = [ # Note that order (priority) is important! o.test_data_folder() + '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc', o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc'] if mode == 'slow':
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 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)
'/lustre/storeB/project/copernicus/sea/romsnordic/zdepths1h/roms_nordic4_ZDEPTHS_hr.fc.*.nc', 'https://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be', '/lustre/storeB/project/metproduction/products/meps/symlinks/thredds/meps_lagged_6_h_latest_2_5km_latest.nc', 'https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc', '/lustre/storeB/project/metproduction/products/arome2_5_arctic/thredds/arome_arctic_pp_2_5km_latest.nc', 'https://thredds.met.no/thredds/dodsC/aromearcticlatest/arome_arctic_pp_2_5km_latest.nc', '/lustre/storeA/project/copernicus/sea/mywavewam4/*fc*.nc', '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
#!/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.openoil3D import OpenOil3D o = OpenOil3D(loglevel=0) # Arome reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') #reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc') # Norkyst #reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + # '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') #reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') # Landmask (Basemap) reader_basemap = reader_basemap_landmask.Reader( llcrnrlon=4, llcrnrlat=59.7, urcrnrlon=7, urcrnrlat=61.5, resolution='h', projection='merc') #o.add_reader([reader_basemap, reader_norkyst, reader_arome]) o.fallback_values['x_wind'] = 7 o.fallback_values['x_sea_water_velocity'] = .7 o.fallback_values['y_sea_water_velocity'] = .3 #o.fallback_values['land_binary_mask'] = 0
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.output = tk.Frame(self.seed, bd=2, relief=tk.FLAT, padx=5, pady=0) self.output.grid(row=7, 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=6, column=7, columnspan=1, sticky='ew') ########################## self.title('OpenDrift') self.o = OpenOil3D(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=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.utcnow() 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.utcnow() 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=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=6, 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 = OpenOil3D() self.set_model(self.available_models[0]) ########## # RUN ########## tk.Button(self.seed, text=startbutton, bg='green', command=self.run_opendrift).grid(row=8, column=1, 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=0) for ln, lc in enumerate(self.leewaycategories): if self.oljetype.get() == lc.strip().replace('>', ''): print 'Leeway object category: ' + lc break o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, objectType=ln + 1) if self.model.get() == 'OpenOil': o = OpenOil3D(weathering_model='noaa', loglevel=0) o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius, time=start_time, cone=cone, oiltype=self.oljetype.get()) o.add_reader([self.current, self.wind, self.waves]) o.set_config('general:basemap_resolution', 'h') time_step = 1800 # Half hour duration = int(self.durationhours.get()) * 3600 / time_step if self.directionvar.get() == 'backwards': time_step = -time_step o.run(steps=duration, time_step=time_step) print o if self.has_diana is True: diana_filename = self.dianadir + '/opendrift_' + \ self.model.get() + o.start_time.strftime( '_%Y%m%d_%H%M.nc') tk.Button(self.master, text='Save to Diana', command=o.write_netcdf_density_map(diana_filename)).grid( row=7, column=2, sticky=tk.W, pady=4) tk.Button(self.master, text='Animation', command=o.animation).grid(row=7, column=3, sticky=tk.W, pady=4) if self.model.get() == 'OpenOil': tk.Button(self.master, text='Oil Budget', command=o.plot_oil_budget).grid(row=7, column=4, sticky=tk.W, pady=4)
#!/usr/bin/env python """ Oil spill (seafloor) ================================== """ from datetime import timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil3D import OpenOil3D o = OpenOil3D(loglevel=0) # Set loglevel to 0 for debug information # Norkyst reader_norkyst = reader_netCDF_CF_generic.Reader( o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc') #reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') o.add_reader([reader_norkyst]) o.fallback_values['x_wind'] = 0 o.fallback_values['y_wind'] = 0 #%% # Seeding some particles lon = 4.5 lat = 62.0 time = [ reader_norkyst.start_time, reader_norkyst.start_time + timedelta(hours=1) ] #%% # Seed oil elements at defined position and time
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 try: # Removeing 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 """ Oil budget ================================== """ from datetime import timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil3D import OpenOil3D o = OpenOil3D(loglevel=20) # Arome reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') #reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.nc') # Norkyst #reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + # '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') #reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be') #o.add_reader([reader_norkyst, reader_arome]) o.fallback_values['x_wind'] = 7 o.fallback_values['y_wind'] = 0 o.fallback_values['x_sea_water_velocity'] = .7 o.fallback_values['y_sea_water_velocity'] = .3 #o.fallback_values['land_binary_mask'] = 0 #o.add_reader([reader_landmask, reader_norkyst]) #%%
def __init__(self): tk.Tk.__init__(self) 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.master, image=img) panel.image = img panel.grid(row=0, column=0) except: pass # Could not display logo self.top = tk.Frame(self.master, relief=tk.FLAT, pady=25, padx=25) self.top.grid(row=0, column=1, rowspan=1) tk.Label(self.top, text='Simulation type').grid(row=0, column=0) self.model = tk.StringVar() models = ['OpenOil', 'Leeway'] 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) self.categoryLabel = tk.Label(self.master, 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.master, textvariable=self.oljetype, values=oljetyper) self.categorydrop.grid(row=1, column=1) ########## # Release ########## self.start_t = tk.Frame(self.master, relief=tk.FLAT) self.start_t.grid(row=2, column=0, rowspan=1) startlabel = tk.Label(self.start_t, text="\n\nStart release\n\n") startlabel.grid(row=0, column=0) self.start = tk.Frame(self.master, bg='lightgray', bd=2, relief=tk.SUNKEN, pady=5, padx=5) self.start.grid(row=2, column=1, rowspan=1) tk.Label(self.start, text='Longitude').grid(row=0, column=0) tk.Label(self.start, text='Latitude').grid(row=0, column=1) tk.Label(self.start, text='Radius [m]').grid(row=0, column=2) self.lon = tk.Entry(self.start, width=6, justify=tk.RIGHT) self.lat = tk.Entry(self.start, width=6, justify=tk.RIGHT) self.radius = tk.Entry(self.start, width=6, justify=tk.RIGHT) self.lon.grid(row=1, column=0) self.lon.insert(0, '4.5') self.lat.grid(row=1, column=1) self.lat.insert(0, '60.0') self.radius.grid(row=1, column=2) self.radius.insert(0, '1000') ########## # 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, 2017) 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) ############### # Release End ############### self.end_t = tk.Frame(self.master, relief=tk.FLAT) endlabel = tk.Label(self.end_t, text="\n\nEnd release\n\n") endlabel.grid(row=0, column=0) self.end_t.grid(row=3, column=0, rowspan=1) self.end = tk.Frame(self.master, bg='gray', bd=2, relief=tk.SUNKEN, padx=5, pady=5) self.end.grid(row=3, column=1) tk.Label(self.end, text='Longitude').grid(row=0, column=0) tk.Label(self.end, text='Latitude').grid(row=0, column=1) tk.Label(self.end, text='Radius [m]').grid(row=0, column=2) self.elon = tk.Entry(self.end, width=6, justify=tk.RIGHT) self.elat = 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=0) self.elon.insert(0, '4.5') self.elat.grid(row=1, column=1) self.elat.insert(0, '60.0') self.eradius.grid(row=1, column=2) self.eradius.insert(0, '0') ########## # Time ########## now = datetime.now() tk.Label(self.end, text='Day').grid(row=2, column=0) tk.Label(self.end, text='Month').grid(row=2, column=1) tk.Label(self.end, text='Year').grid(row=2, column=2) tk.Label(self.end, text='Hour').grid(row=2, column=3) tk.Label(self.end, text='Minutes [UTC]').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, 2017) 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) ####################### # Simulation duration ####################### self.duration = tk.Frame(self.master, bd=2, relief=tk.FLAT, padx=5, pady=15) self.duration.grid(row=4, column=1) tk.Label(self.duration, text='Run simulation ').grid(row=4, column=0) self.durationhours = tk.Entry(self.duration, width=3, justify=tk.RIGHT) self.durationhours.grid(row=4, column=1) self.durationhours.insert(0, 12) tk.Label(self.duration, text=' hours ').grid(row=4, column=2) self.directionvar = tk.StringVar() self.directionvar.set('forwards') self.direction = tk.OptionMenu(self.duration, self.directionvar, 'forwards', 'backwards') self.direction.grid(row=4, column=3) tk.Label(self.duration, text=' in time ').grid(row=4, column=4) ############## # Output box ############## self.text = tk.Text(self, wrap="word", height=18) self.text.grid(row=5, columnspan=5, 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=5, column=5, 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!' else: self.has_diana = False ############## # Driver data ############## o = OpenOil3D() self.current = reader_netCDF_CF_generic.Reader( 'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be' ) # o.test_data_folder() + # '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc') self.wind = reader_netCDF_CF_generic.Reader( 'http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc' ) #self.wind = reader_netCDF_CF_generic.Reader(o.test_data_folder() + # '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc') self.waves = reader_netCDF_CF_generic.Reader( 'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be') print '#' * 41 print 'Current data coverage:' print str(self.current.start_time) + ' - ' + \ str(self.current.end_time) print '#' * 41 print 'Wind data coverage:' print str(self.wind.start_time) + ' - ' + \ str(self.wind.end_time) print '#' * 41 self.start_time = self.current.start_time ########## # RUN ########## tk.Button(self.master, text='PEIS PAO', bg='green', command=self.run_opendrift).grid(row=7, column=1, sticky=tk.W, pady=4)