def test_seed_cone(self): o = OceanDrift(loglevel=20) o.seed_cone(time=[datetime.now(), datetime.now() + timedelta(hours=3)], number=100, lat=[60.5, 60.6], lon=[4.4, 4.5]) self.assertAlmostEqual(o.elements_scheduled.lon[50], 4.450, 2)
def test_seed_cone(self): # Some cases with expected outcome lon0 = 3 lon1 = 4 lon2 = 5 lat0 = 60 lat1 = 60.2 lat2 = 60.4 lon_vec = np.array([lon0, lon1, lon2]) lat_vec = np.array([lat0, lat1, lat2]) t0 = datetime.now() t1 = t0 + timedelta(hours=6) t2 = t1 + timedelta(hours=6) t_vec = [t0, t1, t2] r0 = 1000 r1 = 2000 number_config = 222 cases = [ { 'lon': lon0, 'lat': lat0, 'time': t0, 'number': None, 'expected': number_config }, { 'lon': lon0, 'lat': lat0, 'time': t0, 'number': 12, 'expected': 12, 'maxlat': lat0 }, { 'lon': lon0, 'lat': lat0, 'time': t0, 'radius': 1000, 'number': 12, 'expected': 12, 'maxlat': lat0 + .013 }, { 'lon': lon0, 'lat': lat0, 'time': [t0, t1], 'maxtime': t1, 'number': 12, 'expected': 12 }, { 'lon': lon0, 'lat': lat0, 'time': t_vec, 'number': 12, 'expected': 'error' }, { 'lon': lon_vec, 'lat': lat_vec, 'time': t0, 'number': None, 'expected': 'error' }, { 'lon': lon0, 'lat': lat0, 'time': t0, 'wind_drift_factor': .05, 'number': None, 'expected': number_config }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'number': None, 'expected': number_config }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'number': 12, 'expected': 12 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'radius': 0, 'number': 200, 'expected': 200, 'maxlat': lat1 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'radius': 2000, 'number': 200, 'expected': 200, 'maxlat': lat1 + .024 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'radius': [1000, 2000], 'number': 200, 'expected': 200, 'maxlat': lat1 + .024 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': t0, 'radius': [1000, 2000, 3000], 'number': 200, 'expected': 'error' }, #'wind_drift_factor': [.01, .02, .03], { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': [t0, t1], 'number': None, 'expected': number_config, 'maxtime': t1 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': [t0, t1], 'radius': [r0, r1], 'number': None, 'expected': number_config, 'maxtime': t1 }, { 'lon': [lon0, lon1], 'lat': [lat0, lat1], 'time': [t0, t1], 'radius': [r0, r0], 'number': None, 'expected': number_config, 'maxtime': t1 }, ] for case in cases: o = OceanDrift(loglevel=50) o._set_config_default('seed:number', number_config) expected = case['expected'] del case['expected'] if 'maxlat' in case: maxlat = case['maxlat'] del case['maxlat'] else: maxlat = None if 'maxtime' in case: maxtime = case['maxtime'] del case['maxtime'] else: maxtime = None if expected == 'error': with self.assertRaises(ValueError): n = o.seed_cone(**case) else: o.seed_cone(**case) self.assertEqual(o.num_elements_total(), expected) if maxlat is not None: self.assertAlmostEqual(o.elements_scheduled.lat.max(), maxlat, 2) if maxtime is not None: self.assertEqual( o.elements_scheduled_time.max().replace(microsecond=0), maxtime.replace(microsecond=0)) if 'wind_drift_factor' in case: self.assertEqual( np.array(case['wind_drift_factor']).max().astype( np.float32), o.elements_scheduled.wind_drift_factor.max())
from datetime import datetime, timedelta from opendrift.models.oceandrift import OceanDrift from opendrift.readers.reader_constant import Reader as ConstantReader #%% # Mixed Layer Depth of 20m West of 3 deg E, and 50m to the east r1 = ConstantReader({'ocean_mixed_layer_thickness': 20}) r2 = ConstantReader({'ocean_mixed_layer_thickness': 50}) r1.xmax = 3 r2.xmin = 3 #%% # First with Sundby1983 parameterization of diffusivity, based on wind and MLD o = OceanDrift(loglevel=50) o.seed_cone(lon=[2, 4], lat=[60, 60], time=datetime.now(), number=5000) o.add_reader([r1, r2]) o.set_config('environment:constant:y_wind', 8) # Some wind for mixing o.set_config('drift:vertical_mixing', True) o.set_config('vertical_mixing:diffusivitymodel', 'windspeed_Sundby1983') # Increasing background diffusivity beyond default (1.2e-5) to avoid artefact due to sharp gradient at MLD o.set_config('vertical_mixing:background_diffusivity', 0.001) o.run(duration=timedelta(hours=48)) o.animation_profile() #%% # .. image:: /gallery/animations/example_mixed_layer_depth_0.gif #%% # Same, but with Large1994 parameterization of diffusivity o = OceanDrift(loglevel=50)
print('=' * 70) lats = np.linspace(60, 61, 100) lons = np.linspace(4, 4.8, 100) o.seed_elements(lon=lons, lat=lats, time=time) o.run(steps=1) o.plot(buffer=.2, fast=True) #%% # Seeding 100 elements between two points with seed_cone() (achieving the same as previous example) print('\n' + '=' * 70) print( 'Seeding 100 elements between two points with seed_cone() (achieving the same as previous example):' ) print('o.seed_cone(lon=[4, 4.8], lat=[60, 61], number=100, time=time)') print('=' * 70) o.seed_cone(lon=[4, 4.8], lat=[60, 61], number=100, time=time) o.run(steps=1) o.plot(buffer=.2, fast=True) #%% # Seeding 1000 elements along cone with radius/uncertainty increasing linearly from 0 to 5000 m print('\n' + '=' * 70) print( 'Seeding 1000 elements along cone with radius/uncertainty\n increasing linearly from 0 to 5000 m:' ) print( 'o.seed_cone(lon=[4, 4.8], lat=[60, 61], number=1000, radius=[0, 5000], time=time)' ) print('=' * 70) o.seed_cone(lon=[4, 4.8], lat=[60, 61],