def test_droplet_diameters(self): o = OpenOil(loglevel=20) o.set_config('environment:fallback:land_binary_mask', 0) o.set_config('environment:fallback:x_wind', 0) 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', 0) o.set_config( 'environment:fallback:sea_surface_wave_period_at_variance_spectral_density_maximum', 5.8) o.set_config( 'environment:fallback:sea_surface_wave_significant_height', 3) o.set_config('vertical_mixing:timestep', 4) # Setting droplet size range for subsea blowout o.set_config('seed:droplet_diameter_min_subsea', 0.0005) o.set_config('seed:droplet_diameter_max_subsea', 0.005) # Setting droplet size range for wave breaking o.seed_elements(4, 60, number=100, time=datetime.now(), z=-100) o.run(duration=timedelta(hours=3), time_step=900) d_start = o.history['diameter'][:, 0] d_end = o.history['diameter'][:, -1] # Check initial droplet sizes (expect range 0.0005 to 0.005) self.assertTrue( d_start.min() > o.get_config('seed:droplet_diameter_min_subsea')) self.assertTrue( d_start.max() < o.get_config('seed:droplet_diameter_max_subsea'))
def test_seed_outside_coverage(self): """Test seeding""" o = OpenOil(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( extent=[4, 6, 60, 64]) o.add_reader([landmask, norkyst]) o.set_config('environment:fallback:x_wind', 0) o.set_config('environment:fallback:y_wind', 0) o.set_config('seed:oil_type', 'SNORRE B 2004') 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 2004') with self.assertRaises(ValueError): o.run(steps=3, time_step=timedelta(minutes=15))
def test_seed_metadata_output(self): 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) self.assertAlmostEqual(np.float(a[var]), np.float(f.attrs[s]), 3) self.assertEqual(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) self.assertAlmostEqual( np.atleast_1d(a[var]).mean(), np.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() self.assertEqual(avar, geojsonvar) self.assertEqual(fe[0]['properties']['z'], 'seafloor') self.assertEqual(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)