예제 #1
0
 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)
예제 #2
0
    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())
예제 #3
0
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],