#!/usr/bin/env python """ Cone seeding (Tromso) ============= """ from datetime import timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil o = OpenOil(loglevel=0) # Set loglevel to 0 for debug information #%% # Using live data from Thredds reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.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]) #%% # Seed elements along cone, e.g. ship track with # increasing uncertainty in position latstart = 68.988911 lonstart = 16.040701 latend = 69.991446 lonend = 17.760061 time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)] o.seed_elements(lon=[lonstart, lonend], lat=[latstart, latend], radius=[100, 500], number=10000, time=time, cone=True)
from datetime import datetime, timedelta import matplotlib.pyplot as plt import numpy as np from opendrift.models.openoil import OpenOil 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 = OpenOil(loglevel=20, 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)
#!/usr/bin/env python """ Oil in ice ================================== """ from datetime import datetime, timedelta from opendrift.readers import reader_netCDF_CF_generic from opendrift.models.openoil import OpenOil import cmocean o = OpenOil(loglevel=20) #%% # Using live data from Barents 2.5 km ocean model o.add_readers_from_list( ['https://thredds.met.no/thredds/dodsC/barents25km_agg']) #%% # Imaginary oil spill in Hinlopen strait o.seed_elements(lon=19.1909, lat=79.5986, radius=50, number=3000, time=datetime.utcnow() - timedelta(days=7)) #%% # Adjusting some configuration o.set_config('processes:dispersion', False) o.set_config('processes:evaporation', False) o.set_config('processes:emulsification', False)
#!/usr/bin/env python """ Seeding from GeoJSON string =========================== """ from datetime import datetime, timedelta from opendrift.models.leeway import Leeway from opendrift.models.openoil import OpenOil #%% # Polygon #-------- o = OpenOil(loglevel=50) o.seed_from_geojson("""{ "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [4.0, 60.0], [4.5, 60.0], [4.7, 60.1], [4.2, 60.1], [4.0, 60.0] ] ] }, "properties": { "time": "2020-11-06T12:30:00Z", "number": 1000, "oiltype": "DVALIN 2020", "m3_per_hour": 50
def test_seed_metadata_output(): import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) outfile = 'openoil.nc' a = { 'lon': 4.8, 'lat': 60, 'z': -10, 'number': 10, 'radius': 100, 'time': datetime(2021, 1, 22) } o = OpenOil(loglevel=50) o.seed_elements(lon=a['lon'], lat=a['lat'], z=a['z'], radius=a['radius'], number=a['number'], time=a['time']) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 1) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:x_sea_water_velocity', 0) o.set_config('environment:fallback:y_sea_water_velocity', .3) o.run(duration=timedelta(hours=1), time_step=1800, outfile=outfile) f = xr.open_dataset(outfile) for var in ['lon', 'lat', 'number', 'radius', 'z', 'm3_per_hour']: s = 'seed_' + var if var not in a: a[var] = o.get_config('seed:' + var) np.testing.assert_almost_equal(float(a[var]), float(f.attrs[s]), 3) assert str(a['time']) == f.attrs['seed_time'] for var in [ 'seed_m3_per_hour', 'time_coverage_start', 'time_coverage_end', 'seed_oiltype', 'simulation_time' ]: assert var in f.attrs f.close() os.remove(outfile) # Same for cone-seeding a = { 'lon': [4.7, 4.8], 'lat': [60, 60.1], 'number': 10, 'radius': [0, 100], 'time': [datetime(2021, 1, 22, 0), datetime(2021, 1, 22, 6)] } a_config = {'seafloor': True, 'm3_per_hour': 55} o = OpenOil(loglevel=0) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 1) o.set_config('environment:fallback:y_wind', 0) o.set_config('environment:fallback:x_sea_water_velocity', 0) o.set_config('environment:fallback:y_sea_water_velocity', .3) o.set_config('environment:fallback:y_sea_water_velocity', .3) for ac in a_config: o.set_config('seed:' + ac, a_config[ac]) o.seed_cone(lon=a['lon'], lat=a['lat'], radius=a['radius'], number=a['number'], time=a['time']) o.seed_cone(lon=a['lon'], lat=a['lat'], radius=a['radius'], number=a['number'] + 4, time=a['time']) o.run(duration=timedelta(hours=1), time_step=1800, outfile=outfile) f = xr.open_dataset(outfile) import geojson gj = geojson.loads(f.attrs['seed_geojson']) print(gj) fe = gj['features'] for var in ['lon', 'lat', 'number', 'radius', 'm3_per_hour']: s = 'seed_' + var if var not in a: a[var] = o.get_config('seed:' + var) np.testing.assert_almost_equal( np.atleast_1d(a[var]).mean(), float(f.attrs[s]), 3) if var not in ['lon', 'lat']: # Check also versus GeoJSON attribute geojsonvar = np.atleast_1d(fe[0]['properties'][var]).mean() avar = np.atleast_1d(a[var]).mean() assert avar == geojsonvar assert fe[0]['properties']['z'] == 'seafloor' assert str(a['time'][0]) == f.attrs['seed_time'] for var in [ 'seed_m3_per_hour', 'time_coverage_start', 'time_coverage_end', 'seed_oiltype', 'simulation_time' ]: assert var in f.attrs os.remove(outfile)
except: print(' unknown') print('------------------------------------------------') 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(extent=[5, 5.5, 59.8, 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 = OpenOil(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()